@sheepit-ai/sdk-js 1.0.0
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/LICENSE +21 -0
- package/README.md +99 -0
- package/dist/boot-error.d.mts +39 -0
- package/dist/boot-error.d.ts +39 -0
- package/dist/boot-error.js +32 -0
- package/dist/boot-error.mjs +2 -0
- package/dist/chunk-35ZDSFHA.mjs +32 -0
- package/dist/chunk-6BNLBHZS.mjs +2 -0
- package/dist/chunk-X5MDWZGR.mjs +3 -0
- package/dist/experiments.d.mts +29 -0
- package/dist/experiments.d.ts +29 -0
- package/dist/experiments.js +2 -0
- package/dist/experiments.mjs +2 -0
- package/dist/flags.d.mts +34 -0
- package/dist/flags.d.ts +34 -0
- package/dist/flags.js +2 -0
- package/dist/flags.mjs +2 -0
- package/dist/index.d.mts +170 -0
- package/dist/index.d.ts +170 -0
- package/dist/index.js +32 -0
- package/dist/index.mjs +3 -0
- package/dist/types-CxAq_Cds.d.mts +371 -0
- package/dist/types-CxAq_Cds.d.ts +371 -0
- package/package.json +78 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import {a}from'./chunk-6BNLBHZS.mjs';import {h,b as b$1,a as a$1,g,c,d as d$1,f as f$1,e}from'./chunk-X5MDWZGR.mjs';export{a as getBootErrorScript}from'./chunk-35ZDSFHA.mjs';var y=class{constructor(e,t){this.prefix="[GoaTech]";this.debugEnabled=e,this.bus=t??null;}debug(e,...t){this.debugEnabled&&console.debug(this.prefix,e,...t),this.emitDiagnostic("debug","lifecycle",e,t);}warn(e,...t){console.warn(this.prefix,e,...t),this.emitDiagnostic("warn","lifecycle",e,t);}error(e,...t){console.error(this.prefix,e,...t),this.emitDiagnostic("error","lifecycle",e,t);}diagnostic(e,t,i,r,s,o){this.bus?.emit({timestamp:new Date().toISOString(),severity:e,category:t,code:i,message:r,data:s,requestId:o});}emitDiagnostic(e,t,i,r){if(!this.bus)return;let s=r.length>0?r.length===1&&typeof r[0]=="object"&&r[0]!==null?r[0]:{details:r}:void 0;this.bus.emit({timestamp:new Date().toISOString(),severity:e,category:t,code:`${t}.${e}`,message:i,data:s});}};var B={debug:0,info:1,warn:2,error:3},f=class{constructor(e=100){this.listeners=[];this.writeIndex=0;this.count=0;this.counts={debug:0,info:0,warn:0,error:0};this.maxSize=Math.min(1e4,Math.max(1,e)),this.buffer=new Array(this.maxSize);}emit(e){let t=B[e.severity];if(t!==void 0){this.buffer[this.writeIndex]=e,this.writeIndex=(this.writeIndex+1)%this.maxSize,this.count<this.maxSize&&this.count++,this.counts[e.severity]++;for(let i of this.listeners)if(!(t<i.minSeverity)&&!(i.categories!==null&&!i.categories.includes(e.category)))try{i.fn(e);}catch{}}}subscribe(e,t){if(this.listeners.length>=100)return ()=>{};let i={fn:e,minSeverity:B[t?.minSeverity??"debug"],categories:t?.categories??null};return this.listeners.push(i),()=>{let r=this.listeners.indexOf(i);r!==-1&&this.listeners.splice(r,1);}}getRecentDiagnostics(){return this.count===0?[]:this.count<this.maxSize?this.buffer.slice(0,this.count):[...this.buffer.slice(this.writeIndex),...this.buffer.slice(0,this.writeIndex)]}getCounts(){return {...this.counts}}};function D(){try{return localStorage.getItem(c.deviceId)}catch{return null}}function H(n){try{localStorage.setItem(c.deviceId,n);}catch{}}function d(){try{return crypto.randomUUID()}catch{return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{let e=Math.random()*16|0;return (n==="x"?e:e&3|8).toString(16)})}}function $(){return {platform:typeof navigator<"u"?navigator.platform||"web":"server",userAgent:typeof navigator<"u"?navigator.userAgent:"",language:typeof navigator<"u"?navigator.language:"en",screenWidth:typeof screen<"u"?screen.width:0,screenHeight:typeof screen<"u"?screen.height:0,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}async function q(n,e,t,i,r,s){let o={anonymous_id:i,...{},platform:"web",locale:s.language,timezone:s.timezone},c=await fetch(`${n}/v1/devices/register`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`,"X-Environment":t,"X-SDK-Version":a$1},body:JSON.stringify(o)});if(!c.ok)throw new Error(`Device registration failed: ${c.status}`);return (await c.json()).data.device_id}var G=["utm_source","utm_medium","utm_campaign","utm_content","utm_term","gclid","fbclid"];function w(){return typeof window<"u"&&typeof document<"u"}function te(n){if(n)try{return new URL(n).hostname}catch{return}}var ie=200,re=new RegExp("[\\x00-\\x1F\\x7F<>]","g");function S(n,e=ie){return n.replace(re,"").slice(0,e)}function ne(){if(!w())return;let n={};try{let t=new URLSearchParams(window.location.search);for(let i of G){let r=t.get(i);if(r){let s=S(r);s&&(n[i]=s);}}}catch{}let e=document.referrer||"";if(e){n.referrer=S(e,500);let t=te(e);t&&(n.referrer_host=S(t,256));}try{n.landing_page=S(window.location.pathname+window.location.search,500);}catch{}return n}function se(n){if(!n)return false;for(let e of G)if(n[e])return true;return !!n.referrer_host}function R(){if(!w())return;try{let e=sessionStorage.getItem(c.sessionAttribution);if(e){let t=JSON.parse(e);if(t&&typeof t=="object")return t}}catch{}let n=ne();if(n){try{sessionStorage.setItem(c.sessionAttribution,JSON.stringify(n));}catch{}return n}}function V(n){if(w()){try{let e=localStorage.getItem(c.firstTouchAttribution);if(e){let t=JSON.parse(e);if(t&&typeof t=="object")return t}}catch{}if(se(n)){try{localStorage.setItem(c.firstTouchAttribution,JSON.stringify(n));}catch{}return n}}}function O(){if(w())try{sessionStorage.removeItem(c.sessionAttribution);}catch{}}var b=class{constructor(){this.userId=null;this.userTraits={};this.deviceId=null;this.anonymousId=this.loadOrCreateAnonymousId();let{sessionId:e,isNew:t}=this.loadOrCreateSession();this.sessionId=e,this.isNewSession=t,this.sessionAttribution=R(),this.firstTouch=V(this.sessionAttribution),this.loadIdentity();}getContext(){return {device_id:this.deviceId??this.anonymousId,anonymous_id:this.anonymousId,session_id:this.sessionId,user_id:this.userId,platform:typeof navigator<"u"?"web":"server",locale:typeof navigator<"u"?navigator.language:"en",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,sdk_version:a$1,...this.sessionAttribution?{attribution:this.sessionAttribution}:{},...this.firstTouch?{first_touch:this.firstTouch}:{}}}getSessionAttribution(){return this.sessionAttribution}getFirstTouch(){return this.firstTouch}setDeviceId(e){this.deviceId=e;}getDeviceId(){return this.deviceId}setUserId(e){this.userId=e;}getUserId(){return this.userId}getAnonymousId(){return this.anonymousId}updateUserProperties(e){this.userTraits={...this.userTraits,...e};}getUserTraits(){return {...this.userTraits}}resetIdentity(){this.userId=null,this.userTraits={},this.anonymousId=d(),this.sessionId=d();try{localStorage.setItem(c.anonymousId,this.anonymousId),sessionStorage.setItem(c.sessionId,this.sessionId),localStorage.removeItem(c.identity);}catch{}O(),this.sessionAttribution=R();}touchSession(){try{sessionStorage.setItem(c.sessionLastSeen,Date.now().toString());}catch{}}loadOrCreateAnonymousId(){try{let e=localStorage.getItem(c.anonymousId);if(e)return e;let t=d();return localStorage.setItem(c.anonymousId,t),t}catch{return d()}}loadOrCreateSession(){try{let e=sessionStorage.getItem(c.sessionLastSeen),t=sessionStorage.getItem(c.sessionId),i=Date.now();if(t&&e&&i-parseInt(e,10)<d$1)return {sessionId:t,isNew:!1};let r=d();return sessionStorage.setItem(c.sessionId,r),sessionStorage.setItem(c.sessionLastSeen,i.toString()),O(),{sessionId:r,isNew:!0}}catch{return {sessionId:d(),isNew:true}}}loadIdentity(){try{let e=localStorage.getItem(c.identity);if(!e)return;let t=JSON.parse(e);this.userId=t.userId??null,this.userTraits=t.traits??{};}catch{}}};var E=class{constructor(e){this.items=[];this.maxSize=e;}add(e){this.items.length>=this.maxSize&&this.items.shift(),this.items.push(e);}drain(){let e=this.items.slice();return this.items=[],e}size(){return this.items.length}};var x=class{constructor(e){this.log=e;this.userId=null;this.traits={};this.loadFromStorage();}identify(e,t,i){let r=i.getCurrentUserId();if(r===e){t&&(this.traits={...this.traits,...t}),i.updateTraits(this.traits),this.persist(e,this.traits);return}let s=r;i.flush().catch(()=>{}),i.resetSession(),i.clearExperimentAssignments(),this.userId=e,this.traits=t??{},i.setUserId(e),i.updateTraits(this.traits),this.persist(e,this.traits),i.postIdentityResolve(e,s),this.log.debug("Identified",{userId:e,previousUserId:s});}reset(e){e.flush().catch(()=>{}),e.resetSession(),e.clearExperimentAssignments(),this.userId=null,this.traits={};try{localStorage.removeItem(c.identity);}catch{}this.log.debug("Reset identity.");}getUserId(){return this.userId}loadFromStorage(){try{let e=localStorage.getItem(c.identity);if(!e)return;let t=JSON.parse(e);this.userId=t.userId??null,this.traits=t.traits??{};}catch{}}persist(e,t){let i={userId:e,traits:t,identifiedAt:new Date().toISOString()};try{localStorage.setItem(c.identity,JSON.stringify(i));}catch{}}};var C=class{constructor(e,t,i,r,s,o){this.apiUrl=e;this.apiKey=t;this.environment=i;this.refreshInterval=r;this.log=s;this.onConfig=o;this.timer=null;this.etag=null;}start(e){let t=this.loadFromStorage();t&&this.onConfig(t.config),this.fetchConfig(e()).catch(i=>{this.log.warn("Config fetch failed",i);}),this.timer=setInterval(()=>{this.fetchConfig(e()).catch(i=>{this.log.warn("Config refresh failed",i);});},this.refreshInterval);}stop(){this.timer!==null&&(clearInterval(this.timer),this.timer=null);}async fetchConfig(e){if(!e){this.log.debug("Config fetch skipped \u2014 no device ID yet.");return}let t={Authorization:`Bearer ${this.apiKey}`,"X-Environment":this.environment,"X-Device-Id":e};this.etag&&(t["If-None-Match"]=this.etag);let i=await fetch(`${this.apiUrl}/v1/config`,{headers:t});if(i.status===304){this.log.debug("Config unchanged (304).");return}if(!i.ok)throw new Error(`Config fetch returned ${i.status}`);let r=i.headers.get("ETag");r&&(this.etag=r);let s=await i.json();this.onConfig(s.data),this.saveToStorage(s.data),this.log.debug("Config updated",{flags:Object.keys(s.data.flags).length,experiments:Object.keys(s.data.experiments).length});}loadFromStorage(){try{let e$1=localStorage.getItem(c.sdkConfig);if(!e$1)return null;let t=JSON.parse(e$1);return Date.now()-t.cachedAt>e?(this.log.debug("Cached config is stale (>24h), ignoring."),null):t}catch{return null}}saveToStorage(e){try{localStorage.setItem(c.sdkConfig,JSON.stringify({config:e,cachedAt:Date.now()}));}catch{}}};var oe={getSessionAttribution:()=>{},getFirstTouch:()=>{}},I=class{constructor(e,t,i,r,s,o,c,h,M=null,we=oe){this.apiUrl=e;this.apiKey=t;this.environment=i;this.retryAttempts=r;this.queue=s;this.offlineQueue=o;this.connectivity=c;this.log=h;this.appVersion=M;this.attribution=we;this.lastFlushAt=null;this.retryBackoff=b$1.retryBackoff;}getLastFlushAt(){return this.lastFlushAt}buildAttributionContext(){let e=this.attribution.getSessionAttribution(),t=this.attribution.getFirstTouch();return {...e?{attribution:e}:{},...t?{first_touch:t}:{}}}async flush(){let e=this.queue.drain();if(e.length===0)return;if(!this.connectivity.isOnline()){this.offlineQueue.enqueue(e);return}await this.sendWithRetry(e,0)&&(this.lastFlushAt=new Date);}flushWithBeacon(e){if(e.length===0||typeof navigator>"u"||!navigator.sendBeacon)return;let t=e[0],i={batch:e.map(c=>({type:"track",event:c.event_name,properties:c.event_properties??{},timestamp:c.timestamp})),context:t?{user:{id:t.user_id??void 0,anonymous_id:t.anonymous_id},device:{id:t.device_id,platform:t.platform,locale:t.locale},session:{id:t.session_id},...this.appVersion?{app:{version:this.appVersion}}:{},...this.buildAttributionContext()}:{},sent_at:new Date().toISOString()},r=JSON.stringify(i),s=`${this.apiUrl}/v1/ingest?api_key=${encodeURIComponent(this.apiKey)}&env=${encodeURIComponent(this.environment)}`;navigator.sendBeacon(s,new Blob([r],{type:"application/json"}))||this.log.warn("sendBeacon failed \u2014 events may be lost on page unload.");}async sendWithRetry(e,t){try{let{body:i,compressed:r}=await this.buildBody(e),s={Authorization:`Bearer ${this.apiKey}`,"X-Environment":this.environment,"Content-Type":"application/json"};r&&(s["Content-Encoding"]="gzip");let o=await fetch(`${this.apiUrl}/v1/ingest`,{method:"POST",headers:s,body:i});if(o.status===400)return this.log.error("Ingest 400: dropping batch.",await o.text()),!1;if(o.status===429){let c=parseInt(o.headers.get("Retry-After")??"5",10);this.log.warn(`Rate limited, retrying after ${c}s`);for(let h of e)this.queue.add(h);return !1}if(o.status>=500)throw new Error(`Ingest 5xx: ${o.status}`);return this.log.debug(`Flushed ${e.length} events.`),!0}catch(i){if(t<this.retryAttempts-1){let r=this.retryBackoff[t]??this.retryBackoff[this.retryBackoff.length-1]??15e3;return this.log.warn(`Flush attempt ${t+1} failed, retrying in ${r}ms`,i),await ae(r),this.sendWithRetry(e,t+1)}return this.log.error("Max retries exceeded, moving to offline queue.",i),this.offlineQueue.enqueue(e),false}}async buildBody(e){let t=e[0],i={batch:e.map(s=>({type:"track",event:s.event_name,properties:s.event_properties??{},timestamp:s.timestamp})),context:t?{user:{id:t.user_id??void 0,anonymous_id:t.anonymous_id},device:{id:t.device_id,platform:t.platform,locale:t.locale},session:{id:t.session_id},...this.appVersion?{app:{version:this.appVersion}}:{},...this.buildAttributionContext()}:{},sent_at:new Date().toISOString()},r=JSON.stringify(i);if(r.length<1024)return {body:r,compressed:false};try{let s=new CompressionStream("gzip"),o=s.writable.getWriter(),c=new TextEncoder;return o.write(c.encode(r)),o.close(),{body:await new Response(s.readable).blob(),compressed:!0}}catch{return {body:r,compressed:false}}}};function ae(n){return new Promise(e=>setTimeout(e,n))}var _=class{enqueue(e){let r=[...this.load(),...e].slice(-f$1);this.save(r);}drain(){let e=this.load();return this.clear(),e}size(){return this.load().length}clear(){try{localStorage.removeItem(c.offlineQueue);}catch{}}load(){try{let e=localStorage.getItem(c.offlineQueue);return e?JSON.parse(e):[]}catch{return []}}save(e){try{localStorage.setItem(c.offlineQueue,JSON.stringify(e));}catch(t){if(t instanceof DOMException&&t.name==="QuotaExceededError"){let i=e.slice(Math.floor(e.length/2));try{localStorage.setItem(c.offlineQueue,JSON.stringify(i));}catch{}}}}};var k=class{constructor(){this.onlineCallbacks=[];this.offlineCallbacks=[];this.onOnlineHandler=()=>{for(let e of this.onlineCallbacks)e();},this.onOfflineHandler=()=>{for(let e of this.offlineCallbacks)e();},typeof window<"u"&&(window.addEventListener("online",this.onOnlineHandler),window.addEventListener("offline",this.onOfflineHandler));}isOnline(){return typeof navigator>"u"?true:navigator.onLine}onOnline(e){this.onlineCallbacks.push(e);}onOffline(e){this.offlineCallbacks.push(e);}destroy(){typeof window<"u"&&(window.removeEventListener("online",this.onOnlineHandler),window.removeEventListener("offline",this.onOfflineHandler));}};var T=class{constructor(e,t,i,r){this.queue=e;this.transport=t;this.log=i;this.emitEvent=r;this.handlers=[];this.flushedOnExit=false;this.leaveEmitted=false;this.currentPath=null;this.entryTime=0;this.maxScrollPct=0;this.tabHiddenCount=0;this.hiddenSince=null;this.cumulativeHiddenMs=0;this.scrollThrottleTimer=null;}recordPageView(e){this.currentPath!==e&&(this.currentPath!==null&&!this.leaveEmitted&&this.emitPageLeave("spa_nav"),this.currentPath=e,this.entryTime=p(),this.maxScrollPct=0,this.tabHiddenCount=0,this.hiddenSince=null,this.cumulativeHiddenMs=0,this.leaveEmitted=false,this.flushedOnExit=false);}register(){if(typeof window>"u")return;let e=()=>{if(this.flushedOnExit)return;this.flushedOnExit=true,this.emitPageLeave("pagehide");let r=this.queue.drain();r.length>0&&this.transport.flushWithBeacon(r);},t=()=>{document.visibilityState==="hidden"&&(this.tabHiddenCount+=1,this.hiddenSince=p(),this.transport.flush().catch(()=>{})),document.visibilityState==="visible"&&(this.hiddenSince!==null&&(this.cumulativeHiddenMs+=p()-this.hiddenSince,this.hiddenSince=null),this.flushedOnExit=false);},i=()=>{this.scrollThrottleTimer===null&&(this.scrollThrottleTimer=setTimeout(()=>{this.scrollThrottleTimer=null;let r=ce();r>this.maxScrollPct&&(this.maxScrollPct=r);},250));};window.addEventListener("pagehide",e),window.addEventListener("beforeunload",e),document.addEventListener("visibilitychange",t),window.addEventListener("scroll",i,{passive:true}),this.handlers.push(()=>window.removeEventListener("pagehide",e),()=>window.removeEventListener("beforeunload",e),()=>document.removeEventListener("visibilitychange",t),()=>window.removeEventListener("scroll",i),()=>{this.scrollThrottleTimer!==null&&(clearTimeout(this.scrollThrottleTimer),this.scrollThrottleTimer=null);}),this.log.debug("Lifecycle listeners registered.");}destroy(){for(let e of this.handlers)e();this.handlers=[];}emitPageLeave(e){if(this.leaveEmitted||this.currentPath===null||!this.emitEvent)return;this.leaveEmitted=true;let t=this.cumulativeHiddenMs;this.hiddenSince!==null&&(t+=p()-this.hiddenSince),this.emitEvent("$page_leave",{path:this.currentPath,time_on_page_ms:Q(p()-this.entryTime),max_scroll_pct:this.maxScrollPct,tab_hidden_count:this.tabHiddenCount,cumulative_hidden_ms:Q(t),exit_kind:e});}};function p(){return Date.now()}function Q(n){return Math.max(0,Math.round(n/100)*100)}function ce(){if(typeof document>"u"||typeof window>"u")return 0;let n=window.scrollY??0,e=(document.documentElement?.scrollHeight??0)-(window.innerHeight??0);return e<=0?100:Math.min(100,Math.round(n/e*100))}var ue={errors:true,rejections:true,authEvents:true,stackLimit:4096,dedupeWindowMs:1e3},m=class{constructor(e,t,i){this.handlers=[];this.lastSignature=null;this.lastSignatureAt=0;this.track=e,this.log=t,this.cfg={...ue,...i??{}};}install(){if(typeof window>"u")return;let e=typeof navigator<"u"?navigator.userAgent:null,t=le(e);if(this.cfg.errors){let i=r=>{let s=r.error&&r.error.stack?String(r.error.stack).slice(0,this.cfg.stackLimit):null,o=`err:${r.message}:${r.filename}:${r.lineno}`;this.suppress(o)||this.safeTrack("$error",{message:r.message,source:r.filename??null,line:r.lineno??null,col:r.colno??null,stack:s,type:"uncaught_error",browser:t,user_agent:e});};window.addEventListener("error",i),this.handlers.push(()=>window.removeEventListener("error",i));}if(this.cfg.rejections){let i=r=>{let s=r.reason,o=s instanceof Error?s.message:typeof s=="string"?s:de(s),c=s instanceof Error&&s.stack?String(s.stack).slice(0,this.cfg.stackLimit):null,h=`rej:${o}`;this.suppress(h)||this.safeTrack("$error",{message:o,stack:c,type:"unhandled_rejection",browser:t,user_agent:e});};window.addEventListener("unhandledrejection",i),this.handlers.push(()=>window.removeEventListener("unhandledrejection",i));}if(this.cfg.authEvents){let i=r=>{let s=r.detail;s?.name&&this.safeTrack(s.name,{...s.properties??{},browser:t,user_agent:e});};window.addEventListener("goatech:auth-event",i),this.handlers.push(()=>window.removeEventListener("goatech:auth-event",i));}}uninstall(){for(let e of this.handlers)e();this.handlers.length=0;}suppress(e){let t=Date.now();return this.lastSignature===e&&t-this.lastSignatureAt<this.cfg.dedupeWindowMs?true:(this.lastSignature=e,this.lastSignatureAt=t,false)}safeTrack(e,t){try{this.track(e,t);}catch(i){this.log.warn("error capture track() threw",i);}}};function le(n){if(!n)return "unknown";let e=/Chrome\/\d/.test(n)&&!/Edg\//.test(n),t=/Firefox\/\d/.test(n),i=/Safari\//.test(n)&&!e&&!/CriOS|FxiOS|OPR\//.test(n);return e?"chrome":t?"firefox":i?"safari":"other"}function de(n){try{return JSON.stringify(n)??String(n)}catch{return String(n)}}var he=["x-request-id","vary","content-type","access-control-allow-origin"],v=class{constructor(e,t,i){this.originalFetch=null;this.installed=false;this.lastSig=null;this.lastSigAt=0;this.track=e,this.log=t,this.cfg={enabled:i?.enabled??true,shouldCapture:i?.shouldCapture??(r=>r>=400),excludeUrlPatterns:i?.excludeUrlPatterns??[/\/v1\/ingest\b/,/\/v1\/config\b/],captureResponseHeaders:i?.captureResponseHeaders??he,dedupeWindowMs:i?.dedupeWindowMs??1e3,onCapture:i?.onCapture??null};}install(){this.installed||!this.cfg.enabled||typeof window>"u"||typeof window.fetch!="function"||(this.originalFetch=window.fetch,window.fetch=async(e,t)=>{let i=Date.now(),r=ge(e),s=(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase();try{let o=await this.originalFetch.call(window,e,t);return this.shouldSkip(r)||!this.cfg.shouldCapture(o.status)||this.emit({kind:"http_error",url:r,method:s,status:o.status,latency_ms:Date.now()-i,request_id:o.headers.get("x-request-id"),response_headers:this.pluckHeaders(o.headers),cookie_names:this.readCookieNames()}),o}catch(o){if(!this.shouldSkip(r)){let c=o instanceof Error&&o.name==="AbortError",h=o instanceof Error?o.name:"UnknownError",M=o instanceof Error?o.message:String(o);this.emit({kind:"network_failure",url:r,method:s,status:0,latency_ms:Date.now()-i,request_id:null,response_headers:{},cookie_names:this.readCookieNames(),error_name:h,error_message:M,aborted:c});}throw o}},this.installed=true);}uninstall(){this.installed&&(typeof window<"u"&&this.originalFetch&&(window.fetch=this.originalFetch),this.originalFetch=null,this.installed=false);}shouldSkip(e){return this.cfg.excludeUrlPatterns.some(t=>t.test(e))}emit(e){let t=`${e.method}:${e.url}:${e.status}`,i=Date.now();if(!(this.lastSig===t&&i-this.lastSigAt<this.cfg.dedupeWindowMs)){this.lastSig=t,this.lastSigAt=i;try{this.track("$http_error",{url:e.url,method:e.method,status:e.status,latency_ms:e.latency_ms,request_id:e.request_id,response_headers:e.response_headers,cookie_names:e.cookie_names,kind:e.kind,...e.error_name!==void 0?{error_name:e.error_name}:{},...e.error_message!==void 0?{error_message:e.error_message}:{},...e.aborted!==void 0?{aborted:e.aborted}:{}});}catch(r){this.log.warn("http-error-capture track() threw",r);}if(this.cfg.onCapture)try{this.cfg.onCapture(e);}catch(r){this.log.warn("http-error-capture onCapture() threw",r);}}}pluckHeaders(e){let t={};for(let i of this.cfg.captureResponseHeaders){let r=e.get(i);r!==null&&(t[i]=r);}return t}readCookieNames(){return typeof document>"u"||typeof document.cookie!="string"?[]:document.cookie.length===0?[]:document.cookie.split(";").map(e=>e.trim().split("=")[0]??"").filter(e=>e.length>0)}};function ge(n){return typeof n=="string"?n:n instanceof URL?n.toString():n instanceof Request?n.url:String(n)}var fe={rage:true,dead:true,rageThreshold:3,rageWindowMs:1e3,rageRadiusPx:50,maxEmitsPerSec:5},pe=new Set(["A","BUTTON","INPUT","SELECT","TEXTAREA","LABEL","SUMMARY","OPTION","DETAILS"]),A=class{constructor(e,t,i){this.handlers=[];this.recent=[];this.rageCooldownUntil=0;this.emitsThisSecond=0;this.emitsSecondStartedAt=0;this.track=e,this.log=t,this.cfg={...fe,...i??{}};}install(){if(typeof window>"u")return;let e=t=>{let i=t.target;if(!(i instanceof Element))return;let r=Date.now();this.recent.push({t:r,x:t.clientX,y:t.clientY});let s=r-this.cfg.rageWindowMs;this.recent=this.recent.filter(o=>o.t>=s),this.cfg.rage&&this.maybeEmitRage(i,r),this.cfg.dead&&this.maybeEmitDead(t,i,r);};document.addEventListener("click",e,{passive:true}),this.handlers.push(()=>document.removeEventListener("click",e)),this.log.debug("Click-frustration listeners registered.");}uninstall(){for(let e of this.handlers)e();this.handlers.length=0,this.recent=[];}maybeEmitRage(e,t){if(t<this.rageCooldownUntil||this.recent.length<this.cfg.rageThreshold)return;let i=this.recent[this.recent.length-1],r=0;for(let s of this.recent){let o=s.x-i.x,c=s.y-i.y;o*o+c*c<=this.cfg.rageRadiusPx*this.cfg.rageRadiusPx&&(r+=1);}r<this.cfg.rageThreshold||this.tryEmit(t)&&(this.rageCooldownUntil=t+this.cfg.rageWindowMs,this.safeTrack("$rage_click",{target:W(e),cluster_size:r,x:i.x,y:i.y,path:typeof location<"u"?location.pathname:null}));}maybeEmitDead(e,t,i){e.defaultPrevented||me(t)||this.tryEmit(i)&&this.safeTrack("$dead_click",{target:W(t),x:e.clientX,y:e.clientY,path:typeof location<"u"?location.pathname:null});}tryEmit(e){return e-this.emitsSecondStartedAt>=1e3&&(this.emitsSecondStartedAt=e,this.emitsThisSecond=0),this.emitsThisSecond>=this.cfg.maxEmitsPerSec?false:(this.emitsThisSecond+=1,true)}safeTrack(e,t){try{this.track(e,t);}catch(i){this.log.warn("click-frustration track() threw",i);}}};function me(n){let e=n,t=0;for(;e&&t<8;){if(pe.has(e.tagName))return true;let i=e.getAttribute("role");if(i&&/^(button|link|tab|switch|checkbox|radio|menuitem|option)$/.test(i)||e.hasAttribute("tabindex")||e.hasAttribute("contenteditable")||e.hasAttribute("data-clickable"))return true;e=e.parentElement,t+=1;}return false}function W(n){let e=n.tagName.toLowerCase(),t=n.id?`#${n.id}`:"",i=n.classList.length>0?`.${Array.from(n.classList).slice(0,3).join(".")}`:"";return `${e}${t}${i}`.slice(0,120)}var J="gt_storage_migration_v1",X="done",ve=[{storage:"local",legacy:"lp_device_id",current:"gt_device_id"},{storage:"local",legacy:"lp_anonymous_id",current:"gt_anonymous_id"},{storage:"local",legacy:"lp_identity",current:"gt_identity"},{storage:"local",legacy:"lp_config",current:"gt_config"},{storage:"local",legacy:"lp_offline_queue",current:"gt_offline_queue"},{storage:"local",legacy:"lp_exp_assignments",current:"gt_exp_assignments"},{storage:"local",legacy:"lp_first_touch",current:"gt_first_touch"},{storage:"session",legacy:"lp_session_id",current:"gt_session_id"},{storage:"session",legacy:"lp_session_last_seen",current:"gt_session_last_seen"},{storage:"session",legacy:"lp_session_attribution",current:"gt_session_attribution"}];function U(n,e){try{return n.getItem(e)}catch{return null}}function Y(n,e,t){try{n.setItem(e,t);}catch{}}function ye(n,e){try{n.removeItem(e);}catch{}}function Z(){if(typeof window>"u")return;let n=window.localStorage,e=window.sessionStorage;if(!(!n||!e)&&U(n,J)!==X){for(let t of ve){let i=t.storage==="local"?n:e;if(U(i,t.current)!==null)continue;let s=U(i,t.legacy);s!==null&&(Y(i,t.current,s),ye(i,t.legacy));}Y(n,J,X);}}var u=class u{constructor(e,t,i){this.flushTimer=null;this.destroyed=false;if(this.cfg=e,this.log=t,this.bus=i,this.context=new b,this.queue=new E(e.maxQueueSize),this.flagManager=new a,this.flagManager.setDebugMode(this.cfg.debug),this.experimentManager=new h,this.identityManager=new x(t),this.offlineQueue=new _,this.connectivity=new k,this.transport=new I(e.apiUrl,e.apiKey,e.environment,e.retryAttempts,this.queue,this.offlineQueue,this.connectivity,t,e.appVersion,{getSessionAttribution:()=>this.context.getSessionAttribution(),getFirstTouch:()=>this.context.getFirstTouch()}),this.lifecycle=new T(this.queue,this.transport,t,(r,s)=>this.track(r,s)),typeof window<"u"&&this.cfg.autoCaptureErrors!==false){let r=typeof this.cfg.autoCaptureErrors=="object"?this.cfg.autoCaptureErrors:void 0;this.errorCapture=new m((s,o)=>this.track(s,o),t,r);}else this.errorCapture=null;if(typeof window<"u"&&this.cfg.autoCaptureHttpErrors!==false){let r=typeof this.cfg.autoCaptureHttpErrors=="object"?this.cfg.autoCaptureHttpErrors:void 0;this.httpErrorCapture=new v((s,o)=>this.track(s,o),t,r);}else this.httpErrorCapture=null;if(typeof window<"u"&&this.cfg.autoCaptureClickFrustration!==false){let r=typeof this.cfg.autoCaptureClickFrustration=="object"?this.cfg.autoCaptureClickFrustration:void 0;this.clickFrustrationCapture=new A((s,o)=>this.track(s,o),t,r);}else this.clickFrustrationCapture=null;this.configSync=new C(e.apiUrl,e.apiKey,e.environment,e.configRefreshInterval,t,r=>this.applyConfig(r));}static create(e){if(Z(),!/^lp_pub_[a-z0-9]{3}_[a-f0-9]{64}$/.test(e.apiKey))throw /^lp_sec_/.test(e.apiKey)?new Error("[GoaTech] Secret keys (lp_sec_*) cannot be used with @sheepit-ai/sdk-js. This SDK is for client-side / publishable-key use. Use @sheepit-ai/server for server-side code."):/^lp_dev_/.test(e.apiKey)?new Error("[GoaTech] Developer keys (lp_dev_*) cannot be used with @sheepit-ai/sdk-js. Dev keys are for CLI / codegen use only. Use @goatech/cli for developer tooling."):new Error("[GoaTech] Invalid API key format. Expected lp_pub_... (publishable key).");let t={apiKey:e.apiKey,apiUrl:e.apiUrl??b$1.apiUrl,environment:e.environment??b$1.environment,flushInterval:e.flushInterval??b$1.flushInterval,flushSize:e.flushSize??b$1.flushSize,debug:e.debug??b$1.debug,configRefreshInterval:e.configRefreshInterval??b$1.configRefreshInterval,maxQueueSize:e.maxQueueSize??b$1.maxQueueSize,retryAttempts:e.retryAttempts??b$1.retryAttempts,onEvent:e.onEvent,onDiagnostic:e.onDiagnostic,diagnosticBufferSize:e.diagnosticBufferSize??b$1.diagnosticBufferSize,autoCaptureErrors:e.autoCaptureErrors??true,autoCaptureHttpErrors:e.autoCaptureHttpErrors??false,autoCaptureClickFrustration:e.autoCaptureClickFrustration??true,appVersion:e.appVersion??null},i=new f(t.diagnosticBufferSize);t.onDiagnostic&&i.subscribe(t.onDiagnostic);let r=new y(t.debug,i),s=new u(t,r,i);return s.start(),r.diagnostic("info","lifecycle","lifecycle.init_ok","SDK initialized",{environment:t.environment,apiUrl:t.apiUrl}),r.debug("Initialized",{apiKey:e.apiKey.slice(0,10)+"...",environment:t.environment,apiUrl:t.apiUrl}),s}static init(e){if(u.instance!==null)return u.instance.log.warn("init() called after already initialized. Call destroy() first to re-initialize. Returning existing instance."),u.instance;let t=u.create(e);return u.instance=t,t}static getInstance(){if(u.instance===null)throw new Error("[GoaTech] Not initialized. Call GoaTech.init() first.");return u.instance}static isInitialized(){return u.instance!==null}track(e,t){if(this.destroyed){this.log.warn("track() called after destroy(). Ignoring.");return}let i=Se(e),r=this.context.getContext(),s={event_id:d(),event_name:i,event_properties:t,device_id:r.device_id,anonymous_id:r.anonymous_id,session_id:r.session_id,user_id:r.user_id,platform:r.platform,app_version:this.cfg.appVersion??void 0,sdk_version:r.sdk_version,locale:r.locale,timezone:r.timezone,timestamp:new Date().toISOString()};this.queue.add(s),this.context.touchSession();try{this.cfg.onEvent?.(i,t);}catch(o){this.log.warn("onEvent callback threw",o);}this.queue.size()>=this.cfg.flushSize&&this.flush().catch(()=>{}),this.log.debug(`Tracked: ${i}`);}flag(e,t=false){return this.destroyed?(this.log.warn("flag() called after destroy(). Returning default."),t):this.flagManager.evaluate(e,t,this.context.getUserId(),this.context.getUserTraits(),(i,r)=>{this.track("$flag_exposure",{flag_key:i,flag_value:r});})}overrideFlag(e,t){this.flagManager.overrideFlag(e,t);}clearOverrides(){this.flagManager.clearOverrides();}getOverrides(){return this.flagManager.getOverrides()}experiment(e){return this.destroyed?(this.log.warn("experiment() called after destroy(). Returning control."),{variant:"control"}):this.experimentManager.resolve(e,(t,i)=>{this.track("$experiment_exposure",{experiment_key:t,variant:i});})}identify(e,t){if(this.destroyed){this.log.warn("identify() called after destroy(). Ignoring.");return}this.identityManager.identify(e,t,{getCurrentUserId:()=>this.context.getUserId(),setUserId:i=>this.context.setUserId(i),updateTraits:i=>this.context.updateUserProperties(i),resetSession:()=>this.context.resetIdentity(),clearExperimentAssignments:()=>this.experimentManager.clearAssignments(),flush:()=>this.flush(),postIdentityResolve:(i,r)=>{this.postIdentityResolve(i,r).catch(s=>{this.log.error("Identity resolve failed",s);});}});}reset(){this.identityManager.reset({resetSession:()=>this.context.resetIdentity(),clearExperimentAssignments:()=>this.experimentManager.clearAssignments(),flush:()=>this.flush()});}async flush(){await this.transport.flush();}recordPageView(e){this.destroyed||this.lifecycle.recordPageView(e);}status(){return {initialized:!this.destroyed,online:this.connectivity.isOnline(),queueDepth:this.queue.size(),offlineQueueDepth:this.offlineQueue.size(),lastFlushAt:this.transport.getLastFlushAt(),deviceId:this.context.getDeviceId(),userId:this.context.getUserId(),flagCount:this.flagManager.count(),experimentCount:this.experimentManager.count(),sdkVersion:a$1}}diagnostics(){return this.bus}getRecentDiagnostics(){return this.bus.getRecentDiagnostics()}destroy(){this.destroyed||(this.destroyed=true,this.flush().catch(()=>{}),this.flushTimer!==null&&(clearInterval(this.flushTimer),this.flushTimer=null),this.configSync.stop(),this.connectivity.destroy(),this.lifecycle.destroy(),this.errorCapture?.uninstall(),this.httpErrorCapture?.uninstall(),this.clickFrustrationCapture?.uninstall(),u.instance===this&&(u.instance=null),this.log.diagnostic("info","lifecycle","lifecycle.destroyed","SDK instance destroyed"),this.log.debug("Destroyed."));}start(){let e=D();if(e&&this.context.setDeviceId(e),this.configSync.start(()=>this.context.getDeviceId()),!e){let t=this.context.getAnonymousId(),i=$();q(this.cfg.apiUrl,this.cfg.apiKey,this.cfg.environment,t,null,i).then(r=>{H(r),this.context.setDeviceId(r),this.log.debug("Device registered",{deviceId:r});}).catch(r=>{this.log.warn("Device registration failed, using anonymous ID",r);});}if(this.flushTimer=setInterval(()=>{this.flush().catch(()=>{});},this.cfg.flushInterval),this.lifecycle.register(),this.errorCapture?.install(),this.httpErrorCapture?.install(),this.clickFrustrationCapture?.install(),this.connectivity.onOnline(()=>{let t=this.offlineQueue.drain();if(t.length>0){this.log.debug(`Back online \u2014 flushing ${t.length} offline events.`);for(let i of t)this.queue.add(i);this.flush().catch(()=>{});}}),this.context.isNewSession){let t=this.context.getSessionAttribution();this.track("$session_start",t);}}applyConfig(e){this.flagManager.setEvaluatedFlags(e.flags),this.experimentManager.setAssignments(e.experiments),this.log.debug("Config applied",{flags:Object.keys(e.flags).length,experiments:Object.keys(e.experiments).length});}async postIdentityResolve(e,t){let i=D();if(!i)return;let r=await fetch(`${this.cfg.apiUrl}/v1/devices/${encodeURIComponent(i)}/identify`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.cfg.apiKey}`,"X-Environment":this.cfg.environment},body:JSON.stringify({user_id:e})});if(!r.ok)throw new Error(`Identity resolve failed: ${r.status}`)}};u.instance=null;var L=u;function Se(n){if(!n||n.trim().length===0)throw new Error("[GoaTech] Event name must not be empty.");return n.trim().slice(0,g).replace(/\s+/g,"_")}
|
|
2
|
+
export{m as BrowserErrorCapture,f as DiagnosticBus,L as GoaTech,v as HttpErrorCapture};//# sourceMappingURL=index.mjs.map
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvZGlhZ25vc3RpYy1idXMudHMiLCIuLi9zcmMvZGV2aWNlLnRzIiwiLi4vc3JjL2F0dHJpYnV0aW9uLnRzIiwiLi4vc3JjL2NvbnRleHQudHMiLCIuLi9zcmMvcXVldWUudHMiLCIuLi9zcmMvaWRlbnRpdHkudHMiLCIuLi9zcmMvY29uZmlnLXN5bmMudHMiLCIuLi9zcmMvdHJhbnNwb3J0LnRzIiwiLi4vc3JjL29mZmxpbmUudHMiLCIuLi9zcmMvY29ubmVjdGl2aXR5LnRzIiwiLi4vc3JjL2xpZmVjeWNsZS50cyIsIi4uL3NyYy9lcnJvci1jYXB0dXJlLnRzIiwiLi4vc3JjL2h0dHAtZXJyb3ItY2FwdHVyZS50cyIsIi4uL3NyYy9jbGljay1mcnVzdHJhdGlvbi50cyIsIi4uL3NyYy9zdG9yYWdlLW1pZ3JhdGlvbi50cyIsIi4uL3NyYy9jbGllbnQudHMiXSwibmFtZXMiOlsiTG9nZ2VyIiwiZGVidWciLCJidXMiLCJtZXNzYWdlIiwiYXJncyIsInNldmVyaXR5IiwiY2F0ZWdvcnkiLCJjb2RlIiwiZGF0YSIsInJlcXVlc3RJZCIsIlNFVkVSSVRZX09SREVSIiwiRGlhZ25vc3RpY0J1cyIsImJ1ZmZlclNpemUiLCJldmVudCIsInNldmVyaXR5TnVtIiwibGlzdGVuZXIiLCJmbiIsIm9wdGlvbnMiLCJlbnRyeSIsImlkeCIsImdldERldmljZUlkIiwiU1RPUkFHRV9LRVlTIiwic2V0RGV2aWNlSWQiLCJpZCIsImdlbmVyYXRlQW5vbnltb3VzSWQiLCJjIiwiciIsImdldERldmljZUluZm8iLCJyZWdpc3RlckRldmljZSIsImFwaVVybCIsImFwaUtleSIsImVudmlyb25tZW50IiwiYW5vbnltb3VzSWQiLCJleGlzdGluZ0RldmljZUlkIiwiaW5mbyIsImJvZHkiLCJyZXMiLCJTREtfVkVSU0lPTiIsIlVUTV9LRVlTIiwiaXNCcm93c2VyIiwicGFyc2VSZWZlcnJlckhvc3QiLCJyZWZlcnJlciIsIkFUVFJJQlVUSU9OX1ZBTFVFX01BWCIsIlNUUklQX0NPTlRST0xTIiwic2FuaXRpemVBdHRyaWJ1dGlvblZhbHVlIiwicmF3IiwibWF4TGVuIiwiY2FwdHVyZUZyb21XaW5kb3ciLCJvdXQiLCJwYXJhbXMiLCJrZXkiLCJ2YWx1ZSIsInNhbml0aXplZCIsImhvc3QiLCJoYXNBbnlBdHRyaWJ1dGlvbiIsImEiLCJnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbiIsImNhY2hlZCIsInBhcnNlZCIsImZyZXNoIiwiZ2V0T3JTZWVkRmlyc3RUb3VjaCIsImNsZWFyU2Vzc2lvbkF0dHJpYnV0aW9uIiwiQ29udGV4dE1hbmFnZXIiLCJzZXNzaW9uSWQiLCJpc05ldyIsInVzZXJJZCIsInRyYWl0cyIsInN0b3JlZCIsImxhc3RTZWVuIiwiZXhpc3RpbmciLCJub3ciLCJTRVNTSU9OX1RJTUVPVVRfTVMiLCJFdmVudFF1ZXVlIiwibWF4U2l6ZSIsImFsbCIsIklkZW50aXR5TWFuYWdlciIsImxvZyIsImNhbGxiYWNrcyIsImN1cnJlbnRVc2VySWQiLCJwcmV2aW91c1VzZXJJZCIsInBheWxvYWQiLCJDb25maWdTeW5jIiwicmVmcmVzaEludGVydmFsIiwib25Db25maWciLCJlcnIiLCJkZXZpY2VJZCIsImhlYWRlcnMiLCJuZXdFdGFnIiwianNvbiIsIkNPTkZJR19NQVhfQUdFX01TIiwiY29uZmlnIiwiTk9fQVRUUklCVVRJT04iLCJUcmFuc3BvcnQiLCJyZXRyeUF0dGVtcHRzIiwicXVldWUiLCJvZmZsaW5lUXVldWUiLCJjb25uZWN0aXZpdHkiLCJhcHBWZXJzaW9uIiwiYXR0cmlidXRpb24iLCJERUZBVUxUUyIsImZpcnN0X3RvdWNoIiwiZXZlbnRzIiwiZmlyc3QiLCJlIiwidXJsIiwiYXR0ZW1wdCIsImNvbXByZXNzZWQiLCJyZXRyeUFmdGVyIiwiZGVsYXkiLCJzbGVlcCIsInN0cmVhbSIsIndyaXRlciIsImVuY29kZXIiLCJtcyIsInJlc29sdmUiLCJPZmZsaW5lUXVldWUiLCJ0cmltbWVkIiwiT0ZGTElORV9RVUVVRV9NQVgiLCJoYWxmIiwiQ29ubmVjdGl2aXR5TW9uaXRvciIsImNiIiwiTGlmZWN5Y2xlTWFuYWdlciIsInRyYW5zcG9ydCIsImVtaXRFdmVudCIsInBhdGgiLCJub3dNcyIsIm9uRXhpdCIsIm9uVmlzaWJpbGl0eUNoYW5nZSIsIm9uU2Nyb2xsIiwicGN0IiwiY29tcHV0ZVNjcm9sbFBjdCIsInJlbW92ZSIsImV4aXRLaW5kIiwiY3VtdWxhdGl2ZUhpZGRlbiIsInJvdW5kVG8xMDAiLCJzY3JvbGxUb3AiLCJkb2NIZWlnaHQiLCJCcm93c2VyRXJyb3JDYXB0dXJlIiwidHJhY2siLCJ1c2VyQWdlbnQiLCJicm93c2VyIiwiZGV0ZWN0QnJvd3NlclRhZyIsIm9uRXJyb3IiLCJzdGFjayIsInNpZ25hdHVyZSIsIm9uUmVqZWN0aW9uIiwicmVhc29uIiwic2FmZVN0cmluZ2lmeSIsIm9uQXV0aEV2ZW50IiwiZGV0YWlsIiwibmFtZSIsInByb3BlcnRpZXMiLCJ1YSIsImlzQ2hyb21lIiwiaXNGaXJlZm94IiwiaXNTYWZhcmkiLCJERUZBVUxUX0hFQURFUlMiLCJIdHRwRXJyb3JDYXB0dXJlIiwicyIsImlucHV0IiwiaW5pdCIsInN0YXJ0ZWQiLCJleHRyYWN0VXJsIiwibWV0aG9kIiwiYWJvcnRlZCIsImVyck5hbWUiLCJlcnJNZXNzYWdlIiwicCIsInYiLCJwYWlyIiwiSU5URVJBQ1RJVkVfVEFHUyIsIkNsaWNrRnJ1c3RyYXRpb25DYXB0dXJlIiwib25DbGljayIsInRhcmdldCIsImN1dG9mZiIsImFuY2hvciIsImNsdXN0ZXIiLCJkeCIsImR5IiwidGFyZ2V0U2VsZWN0b3IiLCJpc0ludGVyYWN0aXZlIiwiZWwiLCJjdXIiLCJkZXB0aCIsInJvbGUiLCJ0YWciLCJjbGFzc2VzIiwiTUlHUkFUSU9OX01BUktFUl9LRVkiLCJNSUdSQVRJT05fTUFSS0VSX1ZBTFVFIiwiS0VZX01BUCIsInNhZmVHZXQiLCJzdG9yZSIsInNhZmVTZXQiLCJzYWZlUmVtb3ZlIiwibWlncmF0ZUxlZ2FjeVN0b3JhZ2VLZXlzIiwibG9jYWwiLCJzZXNzaW9uIiwibGVnYWN5IiwiX0dvYVRlY2giLCJGbGFnTWFuYWdlciIsIkV4cGVyaW1lbnRNYW5hZ2VyIiwicHJvcHMiLCJjYXB0dXJlQ2ZnIiwiaHR0cENmZyIsImNsaWNrQ2ZnIiwiY2ZnIiwibWVyZ2VkIiwiaW5zdGFuY2UiLCJldmVudE5hbWUiLCJ2YWxpZGF0ZUV2ZW50TmFtZSIsImN0eCIsImZsYWdLZXkiLCJkZWZhdWx0VmFsdWUiLCJleHBlcmltZW50S2V5IiwidmFyaWFudCIsInQiLCJ1aWQiLCJwcmV2SWQiLCJxdWV1ZWQiLCJhdHRyIiwiX3ByZXZpb3VzVXNlcklkIiwiR29hVGVjaCIsIkVWRU5UX05BTUVfTUFYX0xFTkdUSCJdLCJtYXBwaW5ncyI6IjhLQUdPLElBQU1BLEVBQU4sS0FBYSxDQUtsQixZQUFZQyxDQUFBQSxDQUFnQkMsQ0FBQUEsQ0FBcUIsQ0FIakQsSUFBQSxDQUFpQixNQUFBLENBQVMsWUFJeEIsSUFBQSxDQUFLLFlBQUEsQ0FBZUQsRUFDcEIsSUFBQSxDQUFLLEdBQUEsQ0FBTUMsR0FBTyxLQUNwQixDQUVBLE1BQU1DLENBQUFBLENBQUFBLEdBQW9CQyxDQUFBQSxDQUF1QixDQUMzQyxJQUFBLENBQUssWUFBQSxFQUNQLFFBQVEsS0FBQSxDQUFNLElBQUEsQ0FBSyxPQUFRRCxDQUFBQSxDQUFTLEdBQUdDLENBQUksQ0FBQSxDQUU3QyxJQUFBLENBQUssZUFBZSxPQUFBLENBQVMsV0FBQSxDQUFhRCxFQUFTQyxDQUFJLEVBQ3pELENBRUEsSUFBQSxDQUFLRCxDQUFBQSxDQUFBQSxHQUFvQkMsRUFBdUIsQ0FDOUMsT0FBQSxDQUFRLElBQUEsQ0FBSyxJQUFBLENBQUssT0FBUUQsQ0FBQUEsQ0FBUyxHQUFHQyxDQUFJLENBQUEsQ0FDMUMsSUFBQSxDQUFLLGVBQWUsTUFBQSxDQUFRLFdBQUEsQ0FBYUQsRUFBU0MsQ0FBSSxFQUN4RCxDQUVBLEtBQUEsQ0FBTUQsQ0FBQUEsQ0FBQUEsR0FBb0JDLEVBQXVCLENBQy9DLE9BQUEsQ0FBUSxNQUFN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SUFBQSxDQUFLLElBQUksV0FDNUIsQ0FBQSxDQUNBLEtBQU0sSUFBQSxDQUFLLFNBQUEsQ0FBVSxDQUFFLE9BQUEsQ0FBU3BCLENBQU8sQ0FBQyxDQUMxQyxDQUNGLEVBQ0EsR0FBSSxDQUFDN0IsRUFBSSxFQUFBLENBQ1AsTUFBTSxJQUFJLEtBQUEsQ0FBTSxDQUFBLHlCQUFBLEVBQTRCQSxFQUFJLE1BQU0sQ0FBQSxDQUFFLENBRTVELENBQ0YsQ0FBQSxDQTNpQmFrSyxFQUNJLFFBQUEsQ0FBMkIsSUFBQSxLQUQvQnVCLENBQUFBLENBQU52QixFQTZpQlAsU0FBU1csRUFBQUEsQ0FBa0IzRCxDQUFBQSxDQUFzQixDQUMvQyxHQUFJLENBQUNBLEdBQVFBLENBQUFBLENBQUssSUFBQSxHQUFPLE1BQUEsR0FBVyxDQUFBLENBQ2xDLE1BQU0sSUFBSSxLQUFBLENBQU0seUNBQXlDLENBQUEsQ0FHM0QsT0FEZ0JBLEVBQUssSUFBQSxFQUFLLENBQUUsTUFBTSxDQUFBLENBQUd3RSxDQUFxQixFQUMzQyxPQUFBLENBQVEsTUFBQSxDQUFRLEdBQUcsQ0FDcEMiLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljQnVzIH0gZnJvbSBcIi4vZGlhZ25vc3RpYy1idXMuanNcIjtcbmltcG9ydCB0eXBlIHsgRGlhZ25vc3RpY0NhdGVnb3J5LCBEaWFnbm9zdGljU2V2ZXJpdHkgfSBmcm9tIFwiLi9kaWFnbm9zdGljcy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z0VuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4ID0gXCJbR29hVGVjaF1cIjtcbiAgcHJpdmF0ZSByZWFkb25seSBidXM6IERpYWdub3N0aWNCdXMgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRlYnVnOiBib29sZWFuLCBidXM/OiBEaWFnbm9zdGljQnVzKSB7XG4gICAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSBkZWJ1ZztcbiAgICB0aGlzLmJ1cyA9IGJ1cyA/PyBudWxsO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZWJ1Z0VuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5wcmVmaXgsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICB0aGlzLmVtaXREaWFnbm9zdGljKFwiZGVidWdcIiwgXCJsaWZlY3ljbGVcIiwgbWVzc2FnZSwgYXJncyk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgY29uc29sZS53YXJuKHRoaXMucHJlZml4LCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICB0aGlzLmVtaXREaWFnbm9zdGljKFwid2FyblwiLCBcImxpZmVjeWNsZVwiLCBtZXNzYWdlLCBhcmdzKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcih0aGlzLnByZWZpeCwgbWVzc2FnZSwgLi4uYXJncyk7XG4gICAgdGhpcy5lbWl0RGlhZ25vc3RpYyhcImVycm9yXCIsIFwibGlmZWN5Y2xlXCIsIG1lc3NhZ2UsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYSBkaWFnbm9zdGljIGV2ZW50IHdpdGggZXhwbGljaXQgY2F0ZWdvcnkgYW5kIGNvZGUuXG4gICAqIFVzZSB0aGlzIGluc3RlYWQgb2YgZGVidWcvd2Fybi9lcnJvciB3aGVuIHlvdSB3YW50IGZpbmUtZ3JhaW5lZCBjb250cm9sLlxuICAgKi9cbiAgZGlhZ25vc3RpYyhcbiAgICBzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5LFxuICAgIGNhdGVnb3J5OiBEaWFnbm9zdGljQ2F0ZWdvcnksXG4gICAgY29kZTogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcmVxdWVzdElkPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmJ1cz8uZW1pdCh7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHNldmVyaXR5LFxuICAgICAgY2F0ZWdvcnksXG4gICAgICBjb2RlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRhdGEsXG4gICAgICByZXF1ZXN0SWQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREaWFnbm9zdGljKFxuICAgIHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHksXG4gICAgY2F0ZWdvcnk6IERpYWdub3N0aWNDYXRlZ29yeSxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYXJnczogdW5rbm93bltdLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYnVzKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9XG4gICAgICBhcmdzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIiAmJiBhcmdzWzBdICE9PSBudWxsXG4gICAgICAgICAgPyAoYXJnc1swXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICA6IHsgZGV0YWlsczogYXJncyB9XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYnVzLmVtaXQoe1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBzZXZlcml0eSxcbiAgICAgIGNhdGVnb3J5LFxuICAgICAgY29kZTogYCR7Y2F0ZWdvcnl9LiR7c2V2ZXJpdHl9YCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBkYXRhLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIERpYWdub3N0aWNFdmVudCxcbiAgRGlhZ25vc3RpY0NhdGVnb3J5LFxuICBEaWFnbm9zdGljU2V2ZXJpdHksXG4gIERpYWdub3N0aWNMaXN0ZW5lcixcbn0gZnJvbSBcIi4vZGlhZ25vc3RpY3MuanNcIjtcblxuY29uc3QgREVGQVVMVF9CVUZGRVJfU0laRSA9IDEwMDtcbmNvbnN0IE1BWF9CVUZGRVJfU0laRSA9IDEwXzAwMDtcbmNvbnN0IE1BWF9TVUJTQ1JJQkVSUyA9IDEwMDtcblxuY29uc3QgU0VWRVJJVFlfT1JERVI6IFJlY29yZDxEaWFnbm9zdGljU2V2ZXJpdHksIG51bWJlcj4gPSB7XG4gIGRlYnVnOiAwLFxuICBpbmZvOiAxLFxuICB3YXJuOiAyLFxuICBlcnJvcjogMyxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaWJlT3B0aW9ucyB7XG4gIC8qKiBPbmx5IHJlY2VpdmUgZXZlbnRzIGF0IG9yIGFib3ZlIHRoaXMgc2V2ZXJpdHkuIERlZmF1bHQ6IFwiZGVidWdcIiAoYWxsKS4gKi9cbiAgbWluU2V2ZXJpdHk/OiBEaWFnbm9zdGljU2V2ZXJpdHk7XG4gIC8qKiBPbmx5IHJlY2VpdmUgZXZlbnRzIGluIHRoZXNlIGNhdGVnb3JpZXMuIERlZmF1bHQ6IGFsbC4gKi9cbiAgY2F0ZWdvcmllcz86IERpYWdub3N0aWNDYXRlZ29yeVtdO1xufVxuXG5leHBvcnQgY2xhc3MgRGlhZ25vc3RpY0J1cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiBBcnJheTx7XG4gICAgZm46IERpYWdub3N0aWNMaXN0ZW5lcjtcbiAgICBtaW5TZXZlcml0eTogbnVtYmVyO1xuICAgIGNhdGVnb3JpZXM6IERpYWdub3N0aWNDYXRlZ29yeVtdIHwgbnVsbDtcbiAgfT4gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBidWZmZXI6IERpYWdub3N0aWNFdmVudFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSB3cml0ZUluZGV4ID0gMDtcbiAgcHJpdmF0ZSBjb3VudCA9IDA7XG4gIHByaXZhdGUgY291bnRzOiBSZWNvcmQ8RGlhZ25vc3RpY1NldmVyaXR5LCBudW1iZXI+ID0ge1xuICAgIGRlYnVnOiAwLFxuICAgIGluZm86IDAsXG4gICAgd2FybjogMCxcbiAgICBlcnJvcjogMCxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihidWZmZXJTaXplOiBudW1iZXIgPSBERUZBVUxUX0JVRkZFUl9TSVpFKSB7XG4gICAgdGhpcy5tYXhTaXplID0gTWF0aC5taW4oTUFYX0JVRkZFUl9TSVpFLCBNYXRoLm1heCgxLCBidWZmZXJTaXplKSk7XG4gICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXk8RGlhZ25vc3RpY0V2ZW50Pih0aGlzLm1heFNpemUpO1xuICB9XG5cbiAgZW1pdChldmVudDogRGlhZ25vc3RpY0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2V2ZXJpdHlOdW0gPSBTRVZFUklUWV9PUkRFUltldmVudC5zZXZlcml0eV07XG4gICAgaWYgKHNldmVyaXR5TnVtID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gaWdub3JlIGludmFsaWQgc2V2ZXJpdHlcblxuICAgIHRoaXMuYnVmZmVyW3RoaXMud3JpdGVJbmRleF0gPSBldmVudDtcbiAgICB0aGlzLndyaXRlSW5kZXggPSAodGhpcy53cml0ZUluZGV4ICsgMSkgJSB0aGlzLm1heFNpemU7XG4gICAgaWYgKHRoaXMuY291bnQgPCB0aGlzLm1heFNpemUpIHRoaXMuY291bnQrKztcbiAgICB0aGlzLmNvdW50c1tldmVudC5zZXZlcml0eV0rKztcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICBpZiAoc2V2ZXJpdHlOdW0gPCBsaXN0ZW5lci5taW5TZXZlcml0eSkgY29udGludWU7XG4gICAgICBpZiAobGlzdGVuZXIuY2F0ZWdvcmllcyAhPT0gbnVsbCAmJiAhbGlzdGVuZXIuY2F0ZWdvcmllcy5pbmNsdWRlcyhldmVudC5jYXRlZ29yeSkpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGlzdGVuZXIuZm4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIG5ldmVyIGxldCBhIHN1YnNjcmliZXIgYnJlYWsgdGhlIGJ1c1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZShmbjogRGlhZ25vc3RpY0xpc3RlbmVyLCBvcHRpb25zPzogU3Vic2NyaWJlT3B0aW9ucyk6ICgpID0+IHZvaWQge1xuICAgIGlmICh0aGlzLmxpc3RlbmVycy5sZW5ndGggPj0gTUFYX1NVQlNDUklCRVJTKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgfVxuICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgZm4sXG4gICAgICBtaW5TZXZlcml0eTogU0VWRVJJVFlfT1JERVJbb3B0aW9ucz8ubWluU2V2ZXJpdHkgPz8gXCJkZWJ1Z1wiXSxcbiAgICAgIGNhdGVnb3JpZXM6IG9wdGlvbnM/LmNhdGVnb3JpZXMgPz8gbnVsbCxcbiAgICB9O1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2goZW50cnkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBpZHggPSB0aGlzLmxpc3RlbmVycy5pbmRleE9mKGVudHJ5KTtcbiAgICAgIGlmIChpZHggIT09IC0xKSB0aGlzLmxpc3RlbmVycy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9O1xuICB9XG5cbiAgZ2V0UmVjZW50RGlhZ25vc3RpY3MoKTogRGlhZ25vc3RpY0V2ZW50W10ge1xuICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSByZXR1cm4gW107XG4gICAgaWYgKHRoaXMuY291bnQgPCB0aGlzLm1heFNpemUpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZSgwLCB0aGlzLmNvdW50KTtcbiAgICB9XG4gICAgLy8gUmluZyBidWZmZXIgaXMgZnVsbCDigJQgcmV0dXJuIGluIGNocm9ub2xvZ2ljYWwgb3JkZXJcbiAgICByZXR1cm4gWy4uLnRoaXMuYnVmZmVyLnNsaWNlKHRoaXMud3JpdGVJbmRleCksIC4uLnRoaXMuYnVmZmVyLnNsaWNlKDAsIHRoaXMud3JpdGVJbmRleCldO1xuICB9XG5cbiAgZ2V0Q291bnRzKCk6IFJlY29yZDxEaWFnbm9zdGljU2V2ZXJpdHksIG51bWJlcj4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuY291bnRzIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IFNUT1JBR0VfS0VZUywgU0RLX1ZFUlNJT04gfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUlkKCk6IHN0cmluZyB8IG51bGwge1xuICB0cnkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuZGV2aWNlSWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGV2aWNlSWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5kZXZpY2VJZCwgaWQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBsb2NhbFN0b3JhZ2UgdW5hdmFpbGFibGUgKHByaXZhdGUgYnJvd3NpbmcgcXVvdGEsIGV0Yy4pIOKAlCBjb250aW51ZSB3aXRob3V0IHBlcnNpc3RlbmNlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQW5vbnltb3VzSWQoKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGNyeXB0by5yYW5kb21VVUlEXG4gICAgcmV0dXJuIFwieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4XCIucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICAgIGNvbnN0IHYgPSBjID09PSBcInhcIiA/IHIgOiAociAmIDB4MykgfCAweDg7XG4gICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUluZm8oKTogRGV2aWNlSW5mbyB7XG4gIHJldHVybiB7XG4gICAgcGxhdGZvcm06IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IucGxhdGZvcm0gfHwgXCJ3ZWJcIiA6IFwic2VydmVyXCIsXG4gICAgdXNlckFnZW50OiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6IFwiXCIsXG4gICAgbGFuZ3VhZ2U6IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IubGFuZ3VhZ2UgOiBcImVuXCIsXG4gICAgc2NyZWVuV2lkdGg6IHR5cGVvZiBzY3JlZW4gIT09IFwidW5kZWZpbmVkXCIgPyBzY3JlZW4ud2lkdGggOiAwLFxuICAgIHNjcmVlbkhlaWdodDogdHlwZW9mIHNjcmVlbiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNjcmVlbi5oZWlnaHQgOiAwLFxuICAgIHRpbWV6b25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckRldmljZShcbiAgYXBpVXJsOiBzdHJpbmcsXG4gIGFwaUtleTogc3RyaW5nLFxuICBlbnZpcm9ubWVudDogc3RyaW5nLFxuICBhbm9ueW1vdXNJZDogc3RyaW5nLFxuICBleGlzdGluZ0RldmljZUlkOiBzdHJpbmcgfCBudWxsLFxuICBpbmZvOiBEZXZpY2VJbmZvLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYm9keSA9IHtcbiAgICBhbm9ueW1vdXNfaWQ6IGFub255bW91c0lkLFxuICAgIC4uLihleGlzdGluZ0RldmljZUlkID8geyBkZXZpY2VfaWQ6IGV4aXN0aW5nRGV2aWNlSWQgfSA6IHt9KSxcbiAgICBwbGF0Zm9ybTogXCJ3ZWJcIiBhcyBjb25zdCxcbiAgICBsb2NhbGU6IGluZm8ubGFuZ3VhZ2UsXG4gICAgdGltZXpvbmU6IGluZm8udGltZXpvbmUsXG4gIH07XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vdjEvZGV2aWNlcy9yZWdpc3RlcmAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgXCJYLUVudmlyb25tZW50XCI6IGVudmlyb25tZW50LFxuICAgICAgXCJYLVNESy1WZXJzaW9uXCI6IFNES19WRVJTSU9OLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gIH0pO1xuICBpZiAoIXJlcy5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgfVxuICBjb25zdCBqc29uID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHsgZGF0YTogeyBkZXZpY2VfaWQ6IHN0cmluZyB9IH07XG4gIHJldHVybiBqc29uLmRhdGEuZGV2aWNlX2lkO1xufVxuIiwiLyoqXG4gKiBGaXJzdC10b3VjaCBhdHRyaWJ1dGlvbiBjYXB0dXJlIGZvciB0aGUgYnJvd3NlciBTREsuXG4gKlxuICogUGFyc2VzIFVUTSBwYXJhbXMsIGFkLWNsaWNrIElEcywgcmVmZXJyZXIsIGFuZCBsYW5kaW5nIHBhZ2UgZnJvbSB0aGVcbiAqIGN1cnJlbnQgYnJvd3NlciBjb250ZXh0LiBDYWxsZWQgb25jZSBwZXIgc2Vzc2lvbiBhdCBjcmVhdGlvbiB0aW1lOyB0aGVcbiAqIHJlc3VsdGluZyBzbmFwc2hvdCBpcyBzdGFzaGVkIGluIHNlc3Npb25TdG9yYWdlIGFuZCBhdHRhY2hlZCB0byBldmVyeVxuICogZXZlbnQncyBjb250ZXh0IHVudGlsIHRoZSBzZXNzaW9uIHJvbGxzIG92ZXIgKDMwLW1pbiBpbmFjdGl2aXR5KS5cbiAqXG4gKiBBbHNvIG1haW50YWlucyBhIGxvbmdlci1saXZlZCBcImZpcnN0X3RvdWNoXCIgc25hcHNob3QgaW4gbG9jYWxTdG9yYWdlIOKAlFxuICogd3JpdHRlbiBvbmNlIG9uIHRoZSBmaXJzdCBzZXNzaW9uIHRoYXQgaGFzIEFOWSBhdHRyaWJ1dGlvbiBzaWduYWwsXG4gKiBuZXZlciBvdmVyd3JpdHRlbi4gUG93ZXJzIFwiaG93IGRpZCB0aGlzIHVzZXIgZmlyc3QgYXJyaXZlXCIgc2VnbWVudHNcbiAqIGV2ZW4gbW9udGhzIGxhdGVyLlxuICpcbiAqIERlZmVuc2l2ZTpcbiAqIC0gTm8tb3BzICsgcmV0dXJucyBgdW5kZWZpbmVkYCBvdXRzaWRlIGJyb3dzZXJzIChzZXJ2ZXIgU0RLIHNoYXJlc1xuICogICB0aGlzIGZpbGUgdmlhIHRoZSBjb21tb24gQ29udGV4dE1hbmFnZXIpLlxuICogLSBTdG9yYWdlIGFjY2VzcyB3cmFwcGVkIGluIHRyeS9jYXRjaCAocHJpdmF0ZSBtb2RlIC8gU2FmYXJpIHF1b3RhKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEF0dHJpYnV0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBTVE9SQUdFX0tFWVMgfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuXG5jb25zdCBVVE1fS0VZUyA9IFtcbiAgXCJ1dG1fc291cmNlXCIsXG4gIFwidXRtX21lZGl1bVwiLFxuICBcInV0bV9jYW1wYWlnblwiLFxuICBcInV0bV9jb250ZW50XCIsXG4gIFwidXRtX3Rlcm1cIixcbiAgXCJnY2xpZFwiLFxuICBcImZiY2xpZFwiLFxuXSBhcyBjb25zdDtcbnR5cGUgVXRtS2V5ID0gKHR5cGVvZiBVVE1fS0VZUylbbnVtYmVyXTtcblxuZnVuY3Rpb24gaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVmZXJyZXJIb3N0KHJlZmVycmVyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXJlZmVycmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHJlZmVycmVyKS5ob3N0bmFtZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vLyBTdHJpcCBDMCBjb250cm9scyAoVSswMDAwLVUrMDAxRikgKyBERUwgKFUrMDA3RikgYmVmb3JlIHBlcnNpc3RpbmcgYW5cbi8vIGF0dHJpYnV0aW9uIHZhbHVlLiBVVE0gdmFsdWVzIGJ1YmJsZSBhbGwgdGhlIHdheSB1cCB0aHJvdWdoIGV2ZW50c19yYXdcbi8vIOKGkiBNQ1AgaW5zaWdodHNfcXVlcnkg4oaSIExMTSBjb250ZXh0ICh2ZWN0b3IgQiBpbiB0aGUgTUNQIGF1ZGl0IFBSIDMvNSksXG4vLyBzbyBhIGNhbXBhaWduIFVSTCBjcmFmdGVkIHdpdGggZW1iZWRkZWQgbmV3bGluZXMgLyBjb250cm9sIHNlcXVlbmNlc1xuLy8gY291bGQgb3RoZXJ3aXNlIHBsYW50IHByb21wdC1pbmplY3Rpb24gdGV4dCBpbiBhbnkgYWdlbnQgcmVhZGluZyB0aGVcbi8vIGRhc2hib2FyZCBzdW1tYXJ5LiBMZW5ndGggY2FwIGlzIHRoZSBzZWNvbmQgbGluZSBvZiBkZWZlbmNlLlxuLy9cbi8vIFdlIGRvIE5PVCBzdHJpcCBvcmRpbmFyeSBwcmludGFibGUgY2hhcnMgKGVtb2ppcywgcHVuY3R1YXRpb24sXG4vLyBub24tQVNDSUkgbGV0dGVycykg4oCUIGxlZ2l0aW1hdGUgbG9jYWxpc2VkIGNhbXBhaWducyByZWx5IG9uIHRoZW0sIGFuZFxuLy8gdGhlIHNlcnZlci1zaWRlIGB3cmFwVW50cnVzdGVkYCBpbiBNQ1AgdG9vbHMgYWxyZWFkeSBoYW5kbGVzIHRoZVxuLy8gYWdlbnQtY29udGV4dCBjb25jZXJuIHZpYSBkZWxpbWl0ZXJzLlxuLy8gTGVuZ3RoIGNhcCBtaXJyb3JzIHRoZSBwcmUtUFIgc2xpY2UgKDIwMCBjaGFycykgc28gYWZmaWxpYXRlLW5ldHdvcmtcbi8vIGB1dG1fY29udGVudGAgaGFzaGVzIChJbXBhY3QgLyBBd2luIC8gQ0ogLyBGYWNlYm9vayBhZHMgZW1pdCAxNTAtMjAwK1xuLy8gY2hhciB0cmFja2luZyBzdHJpbmdzKSBrZWVwIHRoZWlyIGNhcmRpbmFsaXR5IHRocm91Z2ggdGhlIFNESy4gVGhlXG4vLyBzZWN1cml0eSBoYWxmIG9mIHRoZSBQUiAoY29udHJvbC1jaGFyIHN0cmlwKSBpcyB0aGUgb25seSBiZWhhdmlvclxuLy8gY2hhbmdlOyBsZW5ndGgtY2FwIGNoYW5nZSB3YXMgdW5pbnRlbnRpb25hbCBkcmlmdCBjYXVnaHQgYnlcbi8vIHNkay1hdWRpdG9yIE0tMi5cbmNvbnN0IEFUVFJJQlVUSU9OX1ZBTFVFX01BWCA9IDIwMDtcbi8vIFJlZ0V4cCBjb25zdHJ1Y3RvciAobm90IGxpdGVyYWwpIHNvIHRoZSBXcml0ZSB0b29sIGNhbid0IHRydW5jYXRlXG4vLyB0aGUgY2hhci1jbGFzcyBhdCB0aGUgY29udHJvbC1jaGFyIHJhbmdlLlxuLy8gU3RyaXAgQzAgY29udHJvbHMgKFUrMDAwMC1VKzAwMUYpLCBERUwgKFUrMDA3RiksIGFuZCBhbmdsZSBicmFja2V0c1xuLy8gKFUrMDAzQyAvIFUrMDAzRSkuIFRoZSBhbmdsZS1icmFja2V0IHN0cmlwIG1pcnJvcnMgdGhlIE1DUC1zaWRlXG4vLyBgdW50cnVzdC50c2Agc28gYSBmdXR1cmUgZXZlbnRzX3JhdyBjb25zdW1lciB0aGF0IHN1cmZhY2VzIFVUTSByYXdcbi8vICh3aXRob3V0IHRoZSBNQ1Agd3JhcCBsYXllcikgaW5oZXJpdHMgdGhlIGRlZmVuc2UgYnkgZGVmYXVsdC4gUFJcbi8vICMzNDYgcmV2aWV3ZXIgU0YtNi4gTGVnaXRpbWF0ZSBVVE0gdmFsdWVzIG5ldmVyIGNhcnJ5IGA8YCAvIGA+YC5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG5jb25zdCBTVFJJUF9DT05UUk9MUyA9IG5ldyBSZWdFeHAoXCJbXFxcXHgwMC1cXFxceDFGXFxcXHg3Rjw+XVwiLCBcImdcIik7XG5cbmZ1bmN0aW9uIHNhbml0aXplQXR0cmlidXRpb25WYWx1ZShyYXc6IHN0cmluZywgbWF4TGVuID0gQVRUUklCVVRJT05fVkFMVUVfTUFYKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJhdy5yZXBsYWNlKFNUUklQX0NPTlRST0xTLCBcIlwiKS5zbGljZSgwLCBtYXhMZW4pO1xufVxuXG4vKiogQ2FwdHVyZSBmcm9tIHRoZSBjdXJyZW50IHBhZ2UuIFJldHVybnMgYHVuZGVmaW5lZGAgaW4gbm9uLWJyb3dzZXIgZW52cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlRnJvbVdpbmRvdygpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzQnJvd3NlcigpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG91dDogQXR0cmlidXRpb25Db250ZXh0ID0ge307XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBVVE1fS0VZUykge1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbXMuZ2V0KGtleSk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVBdHRyaWJ1dGlvblZhbHVlKHZhbHVlKTtcbiAgICAgICAgaWYgKHNhbml0aXplZCkgb3V0W2tleSBhcyBVdG1LZXldID0gc2FuaXRpemVkO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTWFsZm9ybWVkIFVSTCDigJQgcmFyZSwgYnV0IG5ldmVyIGxldCBpdCB0aHJvdy5cbiAgfVxuXG4gIGNvbnN0IHJlZmVycmVyID0gZG9jdW1lbnQucmVmZXJyZXIgfHwgXCJcIjtcbiAgaWYgKHJlZmVycmVyKSB7XG4gICAgb3V0LnJlZmVycmVyID0gc2FuaXRpemVBdHRyaWJ1dGlvblZhbHVlKHJlZmVycmVyLCA1MDApO1xuICAgIGNvbnN0IGhvc3QgPSBwYXJzZVJlZmVycmVySG9zdChyZWZlcnJlcik7XG4gICAgaWYgKGhvc3QpIG91dC5yZWZlcnJlcl9ob3N0ID0gc2FuaXRpemVBdHRyaWJ1dGlvblZhbHVlKGhvc3QsIDI1Nik7XG4gIH1cblxuICB0cnkge1xuICAgIG91dC5sYW5kaW5nX3BhZ2UgPSBzYW5pdGl6ZUF0dHJpYnV0aW9uVmFsdWUoXG4gICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoLFxuICAgICAgNTAwLFxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFVucmVhY2hhYmxlIGluIG5vcm1hbCBicm93c2Vycy5cbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUcnVlIGlmIHRoZSBzbmFwc2hvdCBoYXMgYXQgbGVhc3Qgb25lIG1lYW5pbmdmdWwgc2lnbmFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0FueUF0dHJpYnV0aW9uKGE6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIWEpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgVVRNX0tFWVMpIHtcbiAgICBpZiAoYVtrZXkgYXMgVXRtS2V5XSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGEucmVmZXJyZXJfaG9zdCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBMb2FkIHRoZSBzZXNzaW9uLXNjb3BlZCBzbmFwc2hvdCBmcm9tIHNlc3Npb25TdG9yYWdlIGlmIGl0IGV4aXN0cyxcbiAqIG90aGVyd2lzZSBjYXB0dXJlIGEgZnJlc2ggb25lIGZyb20gYHdpbmRvd2AgYW5kIHBlcnNpc3QgaXQuIFNhbWUgY2FsbFxuICogdHdpY2UgaW4gdGhlIHNhbWUgc2Vzc2lvbiByZXR1cm5zIHRoZSBzYW1lIG9iamVjdCDigJQgZmlyc3QtdG91Y2ggb2ZcbiAqIFRISVMgc2Vzc2lvbiBuZXZlciBzaGlmdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbigpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzQnJvd3NlcigpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY2FjaGVkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbkF0dHJpYnV0aW9uKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlZCkgYXMgQXR0cmlidXRpb25Db250ZXh0O1xuICAgICAgaWYgKHBhcnNlZCAmJiB0eXBlb2YgcGFyc2VkID09PSBcIm9iamVjdFwiKSByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gQ29ycnVwdCBzdG9yYWdlIOKAlCByZS1jYXB0dXJlIGJlbG93LlxuICB9XG5cbiAgY29uc3QgZnJlc2ggPSBjYXB0dXJlRnJvbVdpbmRvdygpO1xuICBpZiAoIWZyZXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25BdHRyaWJ1dGlvbiwgSlNPTi5zdHJpbmdpZnkoZnJlc2gpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gUXVvdGEgLyBkaXNhYmxlZCDigJQgc3RpbGwgcmV0dXJuIHRoZSBpbi1tZW1vcnkgdmFsdWUuXG4gIH1cbiAgcmV0dXJuIGZyZXNoO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIGRldmljZSdzIGZpcnN0LXRvdWNoIHNuYXBzaG90IChsb2NhbFN0b3JhZ2UpLiBXcml0ZXMgYGZyZXNoYFxuICogb25seSBpZiBubyBmaXJzdC10b3VjaCBoYXMgYmVlbiByZWNvcmRlZCBBTkQgYGZyZXNoYCBoYXMgYXQgbGVhc3Qgb25lXG4gKiBtZWFuaW5nZnVsIHNpZ25hbCDigJQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgYSByZWFsIGZpcnN0LXRvdWNoXG4gKiBtb250aHMgbGF0ZXIsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGJ1cm4gYSBmaXJzdC10b3VjaCBzbG90IG9uIGFuIGVtcHR5XG4gKiBkaXJlY3QtdHJhZmZpYyBzZXNzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JTZWVkRmlyc3RUb3VjaChcbiAgZnJlc2g6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCxcbik6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNCcm93c2VyKCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuZmlyc3RUb3VjaEF0dHJpYnV0aW9uKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlZCkgYXMgQXR0cmlidXRpb25Db250ZXh0O1xuICAgICAgaWYgKHBhcnNlZCAmJiB0eXBlb2YgcGFyc2VkID09PSBcIm9iamVjdFwiKSByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gQ29ycnVwdCBzdG9yYWdlIOKAlCBmYWxsIHRocm91Z2ggdG8gc2VlZC5cbiAgfVxuXG4gIGlmICghaGFzQW55QXR0cmlidXRpb24oZnJlc2gpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5maXJzdFRvdWNoQXR0cmlidXRpb24sIEpTT04uc3RyaW5naWZ5KGZyZXNoKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFF1b3RhIC8gZGlzYWJsZWQuXG4gIH1cbiAgcmV0dXJuIGZyZXNoO1xufVxuXG4vKiogQ2xlYXIgdGhlIHNlc3Npb24gc25hcHNob3QuIENhbGxlZCB3aGVuIGEgbmV3IHNlc3Npb24gcm9sbHMgb3ZlciBzb1xuICogIHRoZSBuZXh0IHBhZ2V2aWV3IHJlY2FwdHVyZXMgZnJlc2ggVVRNICsgcmVmZXJyZXIuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJTZXNzaW9uQXR0cmlidXRpb24oKTogdm9pZCB7XG4gIGlmICghaXNCcm93c2VyKCkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uQXR0cmlidXRpb24pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZ25vcmUuXG4gIH1cbn1cbiIsImltcG9ydCB7IFNUT1JBR0VfS0VZUywgU0VTU0lPTl9USU1FT1VUX01TLCBTREtfVkVSU0lPTiB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFub255bW91c0lkIH0gZnJvbSBcIi4vZGV2aWNlLmpzXCI7XG5pbXBvcnQge1xuICBjbGVhclNlc3Npb25BdHRyaWJ1dGlvbixcbiAgZ2V0T3JDcmVhdGVTZXNzaW9uQXR0cmlidXRpb24sXG4gIGdldE9yU2VlZEZpcnN0VG91Y2gsXG59IGZyb20gXCIuL2F0dHJpYnV0aW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF0dHJpYnV0aW9uQ29udGV4dCwgRXZlbnRDb250ZXh0IH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGNsYXNzIENvbnRleHRNYW5hZ2VyIHtcbiAgcHJpdmF0ZSB1c2VySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVzZXJUcmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIHByaXZhdGUgZGV2aWNlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFub255bW91c0lkOiBzdHJpbmc7XG4gIHByaXZhdGUgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBGaXJzdC10b3VjaCBhdHRyaWJ1dGlvbiBmb3IgdGhlIENVUlJFTlQgc2Vzc2lvbi4gQ2FwdHVyZWQgb24gc2Vzc2lvblxuICAgKiAgY3JlYXRlLCByb2xsZWQgb3ZlciB3aGVuIHRoZSAzMC1taW4gd2luZG93IGV4cGlyZXMuICovXG4gIHByaXZhdGUgc2Vzc2lvbkF0dHJpYnV0aW9uOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQ7XG4gIC8qKiBFdmVyLWZpcnN0LXRvdWNoIGF0dHJpYnV0aW9uIGFjcm9zcyB0aGUgZGV2aWNlLiBQZXJzaXN0cyBpblxuICAgKiAgbG9jYWxTdG9yYWdlOyB3cml0dGVuIG9uY2UuICovXG4gIHByaXZhdGUgZmlyc3RUb3VjaDogQXR0cmlidXRpb25Db250ZXh0IHwgdW5kZWZpbmVkO1xuICAvKiogVHJ1ZSB3aGVuIGBsb2FkT3JDcmVhdGVTZXNzaW9uYCBtaW50ZWQgYSBicmFuZC1uZXcgc2Vzc2lvbiBpZCBvblxuICAgKiAgdGhpcyBpbnN0YW5jZSAodnMuIHJlc3VtaW5nIGFuIGV4aXN0aW5nIG9uZSkuIENvbnN1bWVycyB1c2UgdGhpcyB0b1xuICAgKiAgZGVjaWRlIHdoZXRoZXIgdG8gZmlyZSBhIGAkc2Vzc2lvbl9zdGFydGAgZXZlbnQuICovXG4gIHB1YmxpYyByZWFkb25seSBpc05ld1Nlc3Npb246IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hbm9ueW1vdXNJZCA9IHRoaXMubG9hZE9yQ3JlYXRlQW5vbnltb3VzSWQoKTtcbiAgICBjb25zdCB7IHNlc3Npb25JZCwgaXNOZXcgfSA9IHRoaXMubG9hZE9yQ3JlYXRlU2Vzc2lvbigpO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIHRoaXMuaXNOZXdTZXNzaW9uID0gaXNOZXc7XG4gICAgdGhpcy5zZXNzaW9uQXR0cmlidXRpb24gPSBnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbigpO1xuICAgIHRoaXMuZmlyc3RUb3VjaCA9IGdldE9yU2VlZEZpcnN0VG91Y2godGhpcy5zZXNzaW9uQXR0cmlidXRpb24pO1xuICAgIHRoaXMubG9hZElkZW50aXR5KCk7XG4gIH1cblxuICBnZXRDb250ZXh0KCk6IEV2ZW50Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZV9pZDogdGhpcy5kZXZpY2VJZCA/PyB0aGlzLmFub255bW91c0lkLFxuICAgICAgYW5vbnltb3VzX2lkOiB0aGlzLmFub255bW91c0lkLFxuICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICB1c2VyX2lkOiB0aGlzLnVzZXJJZCxcbiAgICAgIHBsYXRmb3JtOiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gXCJ3ZWJcIiA6IFwic2VydmVyXCIsXG4gICAgICBsb2NhbGU6IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IubGFuZ3VhZ2UgOiBcImVuXCIsXG4gICAgICB0aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICAgICAgc2RrX3ZlcnNpb246IFNES19WRVJTSU9OLFxuICAgICAgLi4uKHRoaXMuc2Vzc2lvbkF0dHJpYnV0aW9uID8geyBhdHRyaWJ1dGlvbjogdGhpcy5zZXNzaW9uQXR0cmlidXRpb24gfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLmZpcnN0VG91Y2ggPyB7IGZpcnN0X3RvdWNoOiB0aGlzLmZpcnN0VG91Y2ggfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHNlc3Npb24ncyBhdHRyaWJ1dGlvbi4gRW1pdCBhcyBwcm9wcyBvbiB0aGVcbiAgICogIGAkc2Vzc2lvbl9zdGFydGAgZXZlbnQg4oCUIHRoZXNlIGZpZWxkcyBBUkUgYWxyZWFkeSBvbiBjb250ZXh0IG9mXG4gICAqICBldmVyeSBldmVudCwgYnV0IGhhdmluZyB0aGVtIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIHN0YXJ0IGV2ZW50XG4gICAqICBtYWtlcyBmdW5uZWxzICsgZGFzaGJvYXJkcyBlYXNpZXIgdG8gYnVpbGQuICovXG4gIGdldFNlc3Npb25BdHRyaWJ1dGlvbigpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25BdHRyaWJ1dGlvbjtcbiAgfVxuXG4gIC8qKiBFdmVyLWZpcnN0LXRvdWNoIHNuYXBzaG90IGFjcm9zcyB0aGUgZGV2aWNlIGxpZmV0aW1lLiBTYW1lIHNoYXBlIGFzXG4gICAqICBzZXNzaW9uIGF0dHJpYnV0aW9uOyBwZXJzaXN0cyBpbiBsb2NhbFN0b3JhZ2Ugc28gcmV0dXJuaW5nIHZpc2l0b3JzXG4gICAqICBjYW4gYmUgc2VnbWVudGVkIGJ5IHRoZWlyIG9yaWdpbmFsIGFjcXVpc2l0aW9uIHNvdXJjZS4gKi9cbiAgZ2V0Rmlyc3RUb3VjaCgpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpcnN0VG91Y2g7XG4gIH1cblxuICBzZXREZXZpY2VJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXZpY2VJZCA9IGlkO1xuICB9XG5cbiAgZ2V0RGV2aWNlSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlSWQ7XG4gIH1cblxuICBzZXRVc2VySWQodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgfVxuXG4gIGdldFVzZXJJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy51c2VySWQ7XG4gIH1cblxuICBnZXRBbm9ueW1vdXNJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFub255bW91c0lkO1xuICB9XG5cbiAgdXBkYXRlVXNlclByb3BlcnRpZXModHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMudXNlclRyYWl0cyA9IHsgLi4udGhpcy51c2VyVHJhaXRzLCAuLi50cmFpdHMgfTtcbiAgfVxuXG4gIGdldFVzZXJUcmFpdHMoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMudXNlclRyYWl0cyB9O1xuICB9XG5cbiAgcmVzZXRJZGVudGl0eSgpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJJZCA9IG51bGw7XG4gICAgdGhpcy51c2VyVHJhaXRzID0ge307XG4gICAgdGhpcy5hbm9ueW1vdXNJZCA9IGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgICB0aGlzLnNlc3Npb25JZCA9IGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLmFub255bW91c0lkLCB0aGlzLmFub255bW91c0lkKTtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25JZCwgdGhpcy5zZXNzaW9uSWQpO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVlTLmlkZW50aXR5KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgfVxuICAgIC8vIFRyZWF0IGlkZW50aXR5IHJlc2V0IGxpa2UgYSBuZXcgc2Vzc2lvbiBmb3IgYXR0cmlidXRpb24gcHVycG9zZXMg4oCUXG4gICAgLy8gdGhlIG5leHQgcGFnZXZpZXcgcmUtY2FwdHVyZXMgVVRNICsgcmVmZXJyZXIuIEZpcnN0LXRvdWNoIGlzIGxlZnRcbiAgICAvLyBhbG9uZTsgdGhhdCBiZWxvbmdzIHRvIHRoZSBkZXZpY2UsIG5vdCB0aGUgbG9nZ2VkLWluIHVzZXIuXG4gICAgY2xlYXJTZXNzaW9uQXR0cmlidXRpb24oKTtcbiAgICB0aGlzLnNlc3Npb25BdHRyaWJ1dGlvbiA9IGdldE9yQ3JlYXRlU2Vzc2lvbkF0dHJpYnV0aW9uKCk7XG4gIH1cblxuICB0b3VjaFNlc3Npb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25MYXN0U2VlbiwgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkT3JDcmVhdGVBbm9ueW1vdXNJZCgpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuYW5vbnltb3VzSWQpO1xuICAgICAgaWYgKHN0b3JlZCkgcmV0dXJuIHN0b3JlZDtcbiAgICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLmFub255bW91c0lkLCBpZCk7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZE9yQ3JlYXRlU2Vzc2lvbigpOiB7IHNlc3Npb25JZDogc3RyaW5nOyBpc05ldzogYm9vbGVhbiB9IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFzdFNlZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uTGFzdFNlZW4pO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uSWQpO1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmIChleGlzdGluZyAmJiBsYXN0U2VlbiAmJiBub3cgLSBwYXJzZUludChsYXN0U2VlbiwgMTApIDwgU0VTU0lPTl9USU1FT1VUX01TKSB7XG4gICAgICAgIHJldHVybiB7IHNlc3Npb25JZDogZXhpc3RpbmcsIGlzTmV3OiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgY29uc3QgaWQgPSBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uSWQsIGlkKTtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25MYXN0U2Vlbiwgbm93LnRvU3RyaW5nKCkpO1xuICAgICAgLy8gU2Vzc2lvbiByb2xsZWQgb3ZlciAob3IgZmlyc3QgdmlzaXQpLiBDbGVhciBhbnkgc3RhbGUgc2Vzc2lvbi1cbiAgICAgIC8vIGF0dHJpYnV0aW9uIHNuYXBzaG90IHNvIHRoZSBuZXh0IGNhcHR1cmUgcmVhZHMgZnJlc2ggVVRNK3JlZmVycmVyXG4gICAgICAvLyBmcm9tIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICBjbGVhclNlc3Npb25BdHRyaWJ1dGlvbigpO1xuICAgICAgcmV0dXJuIHsgc2Vzc2lvbklkOiBpZCwgaXNOZXc6IHRydWUgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHNlc3Npb25JZDogZ2VuZXJhdGVBbm9ueW1vdXNJZCgpLCBpc05ldzogdHJ1ZSB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZElkZW50aXR5KCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuaWRlbnRpdHkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybjtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7XG4gICAgICAgIHVzZXJJZDogc3RyaW5nO1xuICAgICAgICB0cmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfTtcbiAgICAgIHRoaXMudXNlcklkID0gcGFyc2VkLnVzZXJJZCA/PyBudWxsO1xuICAgICAgdGhpcy51c2VyVHJhaXRzID0gcGFyc2VkLnRyYWl0cyA/PyB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvcnJ1cHQgc3RvcmFnZSDigJQgaWdub3JlXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEVucmljaGVkRXZlbnQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRRdWV1ZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4U2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIGl0ZW1zOiBFbnJpY2hlZEV2ZW50W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLm1heFNpemUgPSBtYXhTaXplO1xuICB9XG5cbiAgYWRkKGV2ZW50OiBFbnJpY2hlZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoID49IHRoaXMubWF4U2l6ZSkge1xuICAgICAgLy8gRHJvcCB0aGUgb2xkZXN0IGV2ZW50IChGSUZPIG92ZXJmbG93KVxuICAgICAgdGhpcy5pdGVtcy5zaGlmdCgpO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zLnB1c2goZXZlbnQpO1xuICB9XG5cbiAgZHJhaW4oKTogRW5yaWNoZWRFdmVudFtdIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLml0ZW1zLnNsaWNlKCk7XG4gICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgIHJldHVybiBhbGw7XG4gIH1cblxuICBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTVE9SQUdFX0tFWVMgfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tIFwiLi9sb2dnZXIuanNcIjtcblxuaW50ZXJmYWNlIFN0b3JlZElkZW50aXR5IHtcbiAgdXNlcklkOiBzdHJpbmc7XG4gIHRyYWl0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlkZW50aWZpZWRBdDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlNYW5hZ2VyIHtcbiAgcHJpdmF0ZSB1c2VySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRyYWl0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyKSB7XG4gICAgdGhpcy5sb2FkRnJvbVN0b3JhZ2UoKTtcbiAgfVxuXG4gIGlkZW50aWZ5KFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIHRyYWl0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgY2FsbGJhY2tzOiB7XG4gICAgICBnZXRDdXJyZW50VXNlcklkOiAoKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgICAgc2V0VXNlcklkOiAoaWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgIHVwZGF0ZVRyYWl0czogKHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuICAgICAgcmVzZXRTZXNzaW9uOiAoKSA9PiB2b2lkO1xuICAgICAgY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHM6ICgpID0+IHZvaWQ7XG4gICAgICBmbHVzaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAgIHBvc3RJZGVudGl0eVJlc29sdmU6ICh1c2VySWQ6IHN0cmluZywgcHJldmlvdXNJZDogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZDtcbiAgICB9LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gY2FsbGJhY2tzLmdldEN1cnJlbnRVc2VySWQoKTtcblxuICAgIGlmIChjdXJyZW50VXNlcklkID09PSB1c2VySWQpIHtcbiAgICAgIC8vIFNhbWUgdXNlciDigJQgbWVyZ2UgdHJhaXRzIG9ubHkgaWYgcHJvdmlkZWRcbiAgICAgIGlmICh0cmFpdHMpIHtcbiAgICAgICAgdGhpcy50cmFpdHMgPSB7IC4uLnRoaXMudHJhaXRzLCAuLi50cmFpdHMgfTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrcy51cGRhdGVUcmFpdHModGhpcy50cmFpdHMpO1xuICAgICAgdGhpcy5wZXJzaXN0KHVzZXJJZCwgdGhpcy50cmFpdHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzVXNlcklkID0gY3VycmVudFVzZXJJZDtcblxuICAgIC8vIE5ldyB1c2VyIG9yIHJlLWlkZW50aWZpY2F0aW9uIHdpdGggZGlmZmVyZW50IHVzZXJJZDpcbiAgICAvLyBmbHVzaCBxdWV1ZWQgZXZlbnRzIGF0dHJpYnV0ZWQgdG8gdGhlIG9sZCBpZGVudGl0eSBiZWZvcmUgc3dpdGNoaW5nXG4gICAgY2FsbGJhY2tzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgLy8gUmVzZXQgc2Vzc2lvbiBzdGF0ZSBzbyBuZXcgc2Vzc2lvbiBzdGFydHMgY2xlYW5cbiAgICBjYWxsYmFja3MucmVzZXRTZXNzaW9uKCk7XG4gICAgY2FsbGJhY2tzLmNsZWFyRXhwZXJpbWVudEFzc2lnbm1lbnRzKCk7XG5cbiAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgICB0aGlzLnRyYWl0cyA9IHRyYWl0cyA/PyB7fTtcbiAgICBjYWxsYmFja3Muc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgY2FsbGJhY2tzLnVwZGF0ZVRyYWl0cyh0aGlzLnRyYWl0cyk7XG4gICAgdGhpcy5wZXJzaXN0KHVzZXJJZCwgdGhpcy50cmFpdHMpO1xuXG4gICAgLy8gTm90aWZ5IHNlcnZlciAoZmlyZS1hbmQtZm9yZ2V0KVxuICAgIGNhbGxiYWNrcy5wb3N0SWRlbnRpdHlSZXNvbHZlKHVzZXJJZCwgcHJldmlvdXNVc2VySWQpO1xuXG4gICAgdGhpcy5sb2cuZGVidWcoXCJJZGVudGlmaWVkXCIsIHsgdXNlcklkLCBwcmV2aW91c1VzZXJJZCB9KTtcbiAgfVxuXG4gIHJlc2V0KGNhbGxiYWNrczoge1xuICAgIHJlc2V0U2Vzc2lvbjogKCkgPT4gdm9pZDtcbiAgICBjbGVhckV4cGVyaW1lbnRBc3NpZ25tZW50czogKCkgPT4gdm9pZDtcbiAgICBmbHVzaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfSk6IHZvaWQge1xuICAgIGNhbGxiYWNrcy5mbHVzaCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBjYWxsYmFja3MucmVzZXRTZXNzaW9uKCk7XG4gICAgY2FsbGJhY2tzLmNsZWFyRXhwZXJpbWVudEFzc2lnbm1lbnRzKCk7XG4gICAgdGhpcy51c2VySWQgPSBudWxsO1xuICAgIHRoaXMudHJhaXRzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZUy5pZGVudGl0eSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250aW51ZVxuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhcIlJlc2V0IGlkZW50aXR5LlwiKTtcbiAgfVxuXG4gIGdldFVzZXJJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy51c2VySWQ7XG4gIH1cblxuICBwcml2YXRlIGxvYWRGcm9tU3RvcmFnZSgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVlTLmlkZW50aXR5KTtcbiAgICAgIGlmICghcmF3KSByZXR1cm47XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMgU3RvcmVkSWRlbnRpdHk7XG4gICAgICB0aGlzLnVzZXJJZCA9IHBhcnNlZC51c2VySWQgPz8gbnVsbDtcbiAgICAgIHRoaXMudHJhaXRzID0gcGFyc2VkLnRyYWl0cyA/PyB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvcnJ1cHQg4oCUIGlnbm9yZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGVyc2lzdCh1c2VySWQ6IHN0cmluZywgdHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGNvbnN0IHBheWxvYWQ6IFN0b3JlZElkZW50aXR5ID0ge1xuICAgICAgdXNlcklkLFxuICAgICAgdHJhaXRzLFxuICAgICAgaWRlbnRpZmllZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLmlkZW50aXR5LCBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250aW51ZVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU1RPUkFHRV9LRVlTLCBDT05GSUdfTUFYX0FHRV9NUyB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNES0NvbmZpZyB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnU3luYyB7XG4gIHByaXZhdGUgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGV0YWc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBpVXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGlLZXk6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoSW50ZXJ2YWw6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb25Db25maWc6IChjb25maWc6IFNES0NvbmZpZykgPT4gdm9pZCxcbiAgKSB7fVxuXG4gIHN0YXJ0KGdldERldmljZUlkOiAoKSA9PiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gMS4gTG9hZCBmcm9tIGxvY2FsU3RvcmFnZSBzeW5jaHJvbm91c2x5IOKAlCB6ZXJvLWxhdGVuY3kgZmlyc3QgcGFpbnRcbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLmxvYWRGcm9tU3RvcmFnZSgpO1xuICAgIGlmIChzdG9yZWQpIHtcbiAgICAgIHRoaXMub25Db25maWcoc3RvcmVkLmNvbmZpZyk7XG4gICAgfVxuICAgIC8vIDIuIEZldGNoIGZyb20gQVBJIGFzeW5jaHJvbm91c2x5XG4gICAgdGhpcy5mZXRjaENvbmZpZyhnZXREZXZpY2VJZCgpKS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwiQ29uZmlnIGZldGNoIGZhaWxlZFwiLCBlcnIpO1xuICAgIH0pO1xuICAgIC8vIDMuIFN0YXJ0IHJlZnJlc2ggdGltZXIg4oCUIGFsd2F5cyByZWFkcyB0aGUgbGF0ZXN0IGRldmljZUlkXG4gICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hDb25maWcoZ2V0RGV2aWNlSWQoKSkuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICB0aGlzLmxvZy53YXJuKFwiQ29uZmlnIHJlZnJlc2ggZmFpbGVkXCIsIGVycik7XG4gICAgICB9KTtcbiAgICB9LCB0aGlzLnJlZnJlc2hJbnRlcnZhbCk7XG4gIH1cblxuICBzdG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmV0Y2hDb25maWcoZGV2aWNlSWQ6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBUEkgcmVxdWlyZXMgWC1EZXZpY2UtSUQg4oCUIHNraXAgZmV0Y2ggdW50aWwgZGV2aWNlIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZXMuXG4gICAgLy8gVGhlIHJlZnJlc2ggdGltZXIgd2lsbCBwaWNrIGl0IHVwIG9uIHRoZSBuZXh0IGN5Y2xlLlxuICAgIGlmICghZGV2aWNlSWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ29uZmlnIGZldGNoIHNraXBwZWQg4oCUIG5vIGRldmljZSBJRCB5ZXQuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hcGlLZXl9YCxcbiAgICAgIFwiWC1FbnZpcm9ubWVudFwiOiB0aGlzLmVudmlyb25tZW50LFxuICAgICAgXCJYLURldmljZS1JZFwiOiBkZXZpY2VJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLmV0YWcpIGhlYWRlcnNbXCJJZi1Ob25lLU1hdGNoXCJdID0gdGhpcy5ldGFnO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5hcGlVcmx9L3YxL2NvbmZpZ2AsIHsgaGVhZGVycyB9KTtcblxuICAgIGlmIChyZXMuc3RhdHVzID09PSAzMDQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ29uZmlnIHVuY2hhbmdlZCAoMzA0KS5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uZmlnIGZldGNoIHJldHVybmVkICR7cmVzLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdFdGFnID0gcmVzLmhlYWRlcnMuZ2V0KFwiRVRhZ1wiKTtcbiAgICBpZiAobmV3RXRhZykgdGhpcy5ldGFnID0gbmV3RXRhZztcblxuICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgeyBkYXRhOiBTREtDb25maWcgfTtcbiAgICB0aGlzLm9uQ29uZmlnKGpzb24uZGF0YSk7XG4gICAgdGhpcy5zYXZlVG9TdG9yYWdlKGpzb24uZGF0YSk7XG4gICAgdGhpcy5sb2cuZGVidWcoXCJDb25maWcgdXBkYXRlZFwiLCB7XG4gICAgICBmbGFnczogT2JqZWN0LmtleXMoanNvbi5kYXRhLmZsYWdzKS5sZW5ndGgsXG4gICAgICBleHBlcmltZW50czogT2JqZWN0LmtleXMoanNvbi5kYXRhLmV4cGVyaW1lbnRzKS5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICBsb2FkRnJvbVN0b3JhZ2UoKTogeyBjb25maWc6IFNES0NvbmZpZzsgY2FjaGVkQXQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5zZGtDb25maWcpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIHtcbiAgICAgICAgY29uZmlnOiBTREtDb25maWc7XG4gICAgICAgIGNhY2hlZEF0OiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIHBhcnNlZC5jYWNoZWRBdDtcbiAgICAgIGlmIChhZ2UgPiBDT05GSUdfTUFYX0FHRV9NUykge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcIkNhY2hlZCBjb25maWcgaXMgc3RhbGUgKD4yNGgpLCBpZ25vcmluZy5cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVUb1N0b3JhZ2UoY29uZmlnOiBTREtDb25maWcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIFNUT1JBR0VfS0VZUy5zZGtDb25maWcsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgY29uZmlnLCBjYWNoZWRBdDogRGF0ZS5ub3coKSB9KSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBRdW90YUV4Y2VlZGVkRXJyb3Igb3IgdW5hdmFpbGFibGUg4oCUIGNvbnRpbnVlIHdpdGhvdXQgY2FjaGluZ1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgREVGQVVMVFMgfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGlvbkNvbnRleHQsIEVucmljaGVkRXZlbnQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFdmVudFF1ZXVlIH0gZnJvbSBcIi4vcXVldWUuanNcIjtcbmltcG9ydCB0eXBlIHsgT2ZmbGluZVF1ZXVlIH0gZnJvbSBcIi4vb2ZmbGluZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25uZWN0aXZpdHlNb25pdG9yIH0gZnJvbSBcIi4vY29ubmVjdGl2aXR5LmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG4vKiogQXR0cmlidXRpb24gKyBmaXJzdC10b3VjaCBzbmFwc2hvdHMgYXJlIHNlc3Npb24tbGV2ZWwgc3RhdGUgKG5vdFxuICogIHBlci1ldmVudCksIHNvIHRoZSBUcmFuc3BvcnQgYXNrcyB0aGUgQ29udGV4dE1hbmFnZXIgdmlhIHRoZXNlXG4gKiAgZ2V0dGVycyBhdCBidWlsZC10aW1lIHJhdGhlciB0aGFuIHRocmVhZGluZyB0aGVtIHRocm91Z2ggZXZlcnlcbiAqICBlbnJpY2hlZCBldmVudC4gRWl0aGVyIGdldHRlciBtYXkgcmV0dXJuIHVuZGVmaW5lZCBmb3IgdmlzaXRzIHdpdGhcbiAqICBubyB0YWdnZWQgY2FtcGFpZ24gKyBlbXB0eSByZWZlcnJlciAobW9zdCBvcmdhbmljIHRyYWZmaWMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGlvbkdldHRlcnMge1xuICBnZXRTZXNzaW9uQXR0cmlidXRpb246ICgpID0+IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgZ2V0Rmlyc3RUb3VjaDogKCkgPT4gQXR0cmlidXRpb25Db250ZXh0IHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBOT19BVFRSSUJVVElPTjogQXR0cmlidXRpb25HZXR0ZXJzID0ge1xuICBnZXRTZXNzaW9uQXR0cmlidXRpb246ICgpID0+IHVuZGVmaW5lZCxcbiAgZ2V0Rmlyc3RUb3VjaDogKCkgPT4gdW5kZWZpbmVkLFxufTtcblxuZXhwb3J0IGNsYXNzIFRyYW5zcG9ydCB7XG4gIHByaXZhdGUgbGFzdEZsdXNoQXQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXRyeUJhY2tvZmYgPSBERUZBVUxUUy5yZXRyeUJhY2tvZmY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGlVcmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwaUtleTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJldHJ5QXR0ZW1wdHM6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlOiBFdmVudFF1ZXVlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb2ZmbGluZVF1ZXVlOiBPZmZsaW5lUXVldWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aXZpdHk6IENvbm5lY3Rpdml0eU1vbml0b3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcFZlcnNpb246IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXR0cmlidXRpb246IEF0dHJpYnV0aW9uR2V0dGVycyA9IE5PX0FUVFJJQlVUSU9OLFxuICApIHt9XG5cbiAgZ2V0TGFzdEZsdXNoQXQoKTogRGF0ZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxhc3RGbHVzaEF0O1xuICB9XG5cbiAgLyoqIFNwcmVhZC1mcmllbmRseSBzbmFwc2hvdCBvZiBzZXNzaW9uLWxldmVsIGF0dHJpYnV0aW9uICsgZmlyc3QtdG91Y2hcbiAgICogIHN0YXRlIGZvciBpbmNsdXNpb24gaW4gdGhlIGBjb250ZXh0YCBibG9jayBvZiBldmVyeSB3aXJlIHBheWxvYWQuXG4gICAqICBFbXB0eSBvYmplY3Qgd2hlbiBuZWl0aGVyIGlzIHNldCBzbyB0aGUgc3ByZWFkIGlzIGEgbm8tb3AgZm9yXG4gICAqICBwcml2YWN5LW1vZGUgLyBkaXJlY3QtdHJhZmZpYyB2aXNpdG9ycy4gKi9cbiAgcHJpdmF0ZSBidWlsZEF0dHJpYnV0aW9uQ29udGV4dCgpOiB7XG4gICAgYXR0cmlidXRpb24/OiBBdHRyaWJ1dGlvbkNvbnRleHQ7XG4gICAgZmlyc3RfdG91Y2g/OiBBdHRyaWJ1dGlvbkNvbnRleHQ7XG4gIH0ge1xuICAgIGNvbnN0IGF0dHJpYnV0aW9uID0gdGhpcy5hdHRyaWJ1dGlvbi5nZXRTZXNzaW9uQXR0cmlidXRpb24oKTtcbiAgICBjb25zdCBmaXJzdF90b3VjaCA9IHRoaXMuYXR0cmlidXRpb24uZ2V0Rmlyc3RUb3VjaCgpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi4oYXR0cmlidXRpb24gPyB7IGF0dHJpYnV0aW9uIH0gOiB7fSksXG4gICAgICAuLi4oZmlyc3RfdG91Y2ggPyB7IGZpcnN0X3RvdWNoIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMucXVldWUuZHJhaW4oKTtcbiAgICBpZiAoZXZlbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gSWYgb2ZmbGluZSwgbW92ZSBldmVudHMgZGlyZWN0bHkgdG8gb2ZmbGluZSBxdWV1ZVxuICAgIGlmICghdGhpcy5jb25uZWN0aXZpdHkuaXNPbmxpbmUoKSkge1xuICAgICAgdGhpcy5vZmZsaW5lUXVldWUuZW5xdWV1ZShldmVudHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbnQgPSBhd2FpdCB0aGlzLnNlbmRXaXRoUmV0cnkoZXZlbnRzLCAwKTtcbiAgICBpZiAoc2VudCkge1xuICAgICAgdGhpcy5sYXN0Rmx1c2hBdCA9IG5ldyBEYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZmx1c2hXaXRoQmVhY29uKGV2ZW50czogRW5yaWNoZWRFdmVudFtdKTogdm9pZCB7XG4gICAgaWYgKGV2ZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhbmF2aWdhdG9yLnNlbmRCZWFjb24pIHJldHVybjtcbiAgICBjb25zdCBmaXJzdCA9IGV2ZW50c1swXTtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgYmF0Y2g6IGV2ZW50cy5tYXAoKGUpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidHJhY2tcIiBhcyBjb25zdCxcbiAgICAgICAgZXZlbnQ6IGUuZXZlbnRfbmFtZSxcbiAgICAgICAgcHJvcGVydGllczogZS5ldmVudF9wcm9wZXJ0aWVzID8/IHt9LFxuICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgfSkpLFxuICAgICAgY29udGV4dDogZmlyc3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB1c2VyOiB7IGlkOiBmaXJzdC51c2VyX2lkID8/IHVuZGVmaW5lZCwgYW5vbnltb3VzX2lkOiBmaXJzdC5hbm9ueW1vdXNfaWQgfSxcbiAgICAgICAgICAgIGRldmljZToge1xuICAgICAgICAgICAgICBpZDogZmlyc3QuZGV2aWNlX2lkLFxuICAgICAgICAgICAgICBwbGF0Zm9ybTogZmlyc3QucGxhdGZvcm0gYXMgXCJ3ZWJcIiB8IFwiaW9zXCIgfCBcImFuZHJvaWRcIixcbiAgICAgICAgICAgICAgbG9jYWxlOiBmaXJzdC5sb2NhbGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2Vzc2lvbjogeyBpZDogZmlyc3Quc2Vzc2lvbl9pZCB9LFxuICAgICAgICAgICAgLi4uKHRoaXMuYXBwVmVyc2lvbiA/IHsgYXBwOiB7IHZlcnNpb246IHRoaXMuYXBwVmVyc2lvbiB9IH0gOiB7fSksXG4gICAgICAgICAgICAuLi50aGlzLmJ1aWxkQXR0cmlidXRpb25Db250ZXh0KCksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9LFxuICAgICAgc2VudF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIC8vIHNlbmRCZWFjb24gZG9lcyBub3Qgc3VwcG9ydCBjdXN0b20gaGVhZGVycyDigJQgcGFzcyBhdXRoIHZpYSBxdWVyeSBwYXJhbXNcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaVVybH0vdjEvaW5nZXN0P2FwaV9rZXk9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5hcGlLZXkpfSZlbnY9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5lbnZpcm9ubWVudCl9YDtcbiAgICBjb25zdCBzZW50ID0gbmF2aWdhdG9yLnNlbmRCZWFjb24odXJsLCBuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSkpO1xuICAgIGlmICghc2VudCkge1xuICAgICAgdGhpcy5sb2cud2FybihcInNlbmRCZWFjb24gZmFpbGVkIOKAlCBldmVudHMgbWF5IGJlIGxvc3Qgb24gcGFnZSB1bmxvYWQuXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZFdpdGhSZXRyeShldmVudHM6IEVucmljaGVkRXZlbnRbXSwgYXR0ZW1wdDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYm9keSwgY29tcHJlc3NlZCB9ID0gYXdhaXQgdGhpcy5idWlsZEJvZHkoZXZlbnRzKTtcbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmFwaUtleX1gLFxuICAgICAgICBcIlgtRW52aXJvbm1lbnRcIjogdGhpcy5lbnZpcm9ubWVudCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9O1xuICAgICAgaWYgKGNvbXByZXNzZWQpIHtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtRW5jb2RpbmdcIl0gPSBcImd6aXBcIjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5hcGlVcmx9L3YxL2luZ2VzdGAsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYm9keSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgIC8vIE1hbGZvcm1lZCBiYXRjaCDigJQgZHJvcCwgZG8gbm90IHJldHJ5XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFwiSW5nZXN0IDQwMDogZHJvcHBpbmcgYmF0Y2guXCIsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IHBhcnNlSW50KHJlcy5oZWFkZXJzLmdldChcIlJldHJ5LUFmdGVyXCIpID8/IFwiNVwiLCAxMCk7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYFJhdGUgbGltaXRlZCwgcmV0cnlpbmcgYWZ0ZXIgJHtyZXRyeUFmdGVyfXNgKTtcbiAgICAgICAgLy8gUmUtcXVldWUgZXZlbnRzIGZvciBuZXh0IGZsdXNoIGN5Y2xlXG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHRoaXMucXVldWUuYWRkKGUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID49IDUwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZ2VzdCA1eHg6ICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuZGVidWcoYEZsdXNoZWQgJHtldmVudHMubGVuZ3RofSBldmVudHMuYCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChhdHRlbXB0IDwgdGhpcy5yZXRyeUF0dGVtcHRzIC0gMSkge1xuICAgICAgICBjb25zdCBkZWxheSA9XG4gICAgICAgICAgdGhpcy5yZXRyeUJhY2tvZmZbYXR0ZW1wdF0gPz8gdGhpcy5yZXRyeUJhY2tvZmZbdGhpcy5yZXRyeUJhY2tvZmYubGVuZ3RoIC0gMV0gPz8gMTUwMDA7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYEZsdXNoIGF0dGVtcHQgJHthdHRlbXB0ICsgMX0gZmFpbGVkLCByZXRyeWluZyBpbiAke2RlbGF5fW1zYCwgZXJyKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoZGVsYXkpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kV2l0aFJldHJ5KGV2ZW50cywgYXR0ZW1wdCArIDEpO1xuICAgICAgfVxuICAgICAgLy8gTWF4IHJldHJpZXMgZXhjZWVkZWQg4oCUIG1vdmUgdG8gb2ZmbGluZSBxdWV1ZVxuICAgICAgdGhpcy5sb2cuZXJyb3IoXCJNYXggcmV0cmllcyBleGNlZWRlZCwgbW92aW5nIHRvIG9mZmxpbmUgcXVldWUuXCIsIGVycik7XG4gICAgICB0aGlzLm9mZmxpbmVRdWV1ZS5lbnF1ZXVlKGV2ZW50cyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEJvZHkoXG4gICAgZXZlbnRzOiBFbnJpY2hlZEV2ZW50W10sXG4gICk6IFByb21pc2U8eyBib2R5OiBzdHJpbmcgfCBCbG9iOyBjb21wcmVzc2VkOiBib29sZWFuIH0+IHtcbiAgICAvLyBUcmFuc2Zvcm0gZW5yaWNoZWQgZXZlbnRzIGludG8gdGhlIEFQSSdzIGluZ2VzdEJhdGNoU2NoZW1hIGZvcm1hdC5cbiAgICAvLyBUaGUgQVBJIGV4cGVjdHMgeyBiYXRjaDogW3t0eXBlLGV2ZW50LHByb3BlcnRpZXMsdGltZXN0YW1wfV0sIGNvbnRleHQ6IHsuLi59LCBzZW50X2F0IH1cbiAgICAvLyB3aGlsZSBpbnRlcm5hbGx5IHdlIHN0b3JlIGZsYXQgZW5yaWNoZWQgZXZlbnRzLlxuICAgIGNvbnN0IGZpcnN0ID0gZXZlbnRzWzBdO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBiYXRjaDogZXZlbnRzLm1hcCgoZSkgPT4gKHtcbiAgICAgICAgdHlwZTogXCJ0cmFja1wiIGFzIGNvbnN0LFxuICAgICAgICBldmVudDogZS5ldmVudF9uYW1lLFxuICAgICAgICBwcm9wZXJ0aWVzOiBlLmV2ZW50X3Byb3BlcnRpZXMgPz8ge30sXG4gICAgICAgIHRpbWVzdGFtcDogZS50aW1lc3RhbXAsXG4gICAgICB9KSksXG4gICAgICBjb250ZXh0OiBmaXJzdFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHVzZXI6IHsgaWQ6IGZpcnN0LnVzZXJfaWQgPz8gdW5kZWZpbmVkLCBhbm9ueW1vdXNfaWQ6IGZpcnN0LmFub255bW91c19pZCB9LFxuICAgICAgICAgICAgZGV2aWNlOiB7XG4gICAgICAgICAgICAgIGlkOiBmaXJzdC5kZXZpY2VfaWQsXG4gICAgICAgICAgICAgIHBsYXRmb3JtOiBmaXJzdC5wbGF0Zm9ybSBhcyBcIndlYlwiIHwgXCJpb3NcIiB8IFwiYW5kcm9pZFwiLFxuICAgICAgICAgICAgICBsb2NhbGU6IGZpcnN0LmxvY2FsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXNzaW9uOiB7IGlkOiBmaXJzdC5zZXNzaW9uX2lkIH0sXG4gICAgICAgICAgICAuLi4odGhpcy5hcHBWZXJzaW9uID8geyBhcHA6IHsgdmVyc2lvbjogdGhpcy5hcHBWZXJzaW9uIH0gfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLnRoaXMuYnVpbGRBdHRyaWJ1dGlvbkNvbnRleHQoKSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30sXG4gICAgICBzZW50X2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgaWYgKGpzb24ubGVuZ3RoIDwgMTAyNCkgcmV0dXJuIHsgYm9keToganNvbiwgY29tcHJlc3NlZDogZmFsc2UgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IENvbXByZXNzaW9uU3RyZWFtKFwiZ3ppcFwiKTtcbiAgICAgIGNvbnN0IHdyaXRlciA9IHN0cmVhbS53cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgIHZvaWQgd3JpdGVyLndyaXRlKGVuY29kZXIuZW5jb2RlKGpzb24pKTtcbiAgICAgIHZvaWQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICBjb25zdCBibG9iID0gYXdhaXQgbmV3IFJlc3BvbnNlKHN0cmVhbS5yZWFkYWJsZSkuYmxvYigpO1xuICAgICAgcmV0dXJuIHsgYm9keTogYmxvYiwgY29tcHJlc3NlZDogdHJ1ZSB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQ29tcHJlc3Npb25TdHJlYW0gbm90IHN1cHBvcnRlZCDigJQgc2VuZCB1bmNvbXByZXNzZWRcbiAgICAgIHJldHVybiB7IGJvZHk6IGpzb24sIGNvbXByZXNzZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG4iLCJpbXBvcnQgeyBTVE9SQUdFX0tFWVMsIE9GRkxJTkVfUVVFVUVfTUFYIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgRW5yaWNoZWRFdmVudCB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBPZmZsaW5lUXVldWUge1xuICBlbnF1ZXVlKGV2ZW50czogRW5yaWNoZWRFdmVudFtdKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBjb21iaW5lZCA9IFsuLi5leGlzdGluZywgLi4uZXZlbnRzXTtcbiAgICAvLyBLZWVwIG9ubHkgdGhlIG1vc3QgcmVjZW50IE9GRkxJTkVfUVVFVUVfTUFYIGV2ZW50c1xuICAgIGNvbnN0IHRyaW1tZWQgPSBjb21iaW5lZC5zbGljZSgtT0ZGTElORV9RVUVVRV9NQVgpO1xuICAgIHRoaXMuc2F2ZSh0cmltbWVkKTtcbiAgfVxuXG4gIGRyYWluKCk6IEVucmljaGVkRXZlbnRbXSB7XG4gICAgY29uc3QgZXZlbnRzID0gdGhpcy5sb2FkKCk7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHJldHVybiBldmVudHM7XG4gIH1cblxuICBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubG9hZCgpLmxlbmd0aDtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWVMub2ZmbGluZVF1ZXVlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkKCk6IEVucmljaGVkRXZlbnRbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5vZmZsaW5lUXVldWUpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybiBbXTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgRW5yaWNoZWRFdmVudFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZShldmVudHM6IEVucmljaGVkRXZlbnRbXSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMub2ZmbGluZVF1ZXVlLCBKU09OLnN0cmluZ2lmeShldmVudHMpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFF1b3RhRXhjZWVkZWRFcnJvciDigJQgcmVtb3ZlIGhhbGYgdGhlIG9sZGVzdCBldmVudHMgYW5kIHJldHJ5IG9uY2VcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgZXJyLm5hbWUgPT09IFwiUXVvdGFFeGNlZWRlZEVycm9yXCIpIHtcbiAgICAgICAgY29uc3QgaGFsZiA9IGV2ZW50cy5zbGljZShNYXRoLmZsb29yKGV2ZW50cy5sZW5ndGggLyAyKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLm9mZmxpbmVRdWV1ZSwgSlNPTi5zdHJpbmdpZnkoaGFsZikpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBnaXZlIHVwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBDb25uZWN0aXZpdHlNb25pdG9yIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvbmxpbmVDYWxsYmFja3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgb2ZmbGluZUNhbGxiYWNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbk9ubGluZUhhbmRsZXI6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25PZmZsaW5lSGFuZGxlcjogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm9uT25saW5lSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2Igb2YgdGhpcy5vbmxpbmVDYWxsYmFja3MpIGNiKCk7XG4gICAgfTtcbiAgICB0aGlzLm9uT2ZmbGluZUhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNiIG9mIHRoaXMub2ZmbGluZUNhbGxiYWNrcykgY2IoKTtcbiAgICB9O1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLm9uT25saW5lSGFuZGxlcik7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgdGhpcy5vbk9mZmxpbmVIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICBpc09ubGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciA9PT0gXCJ1bmRlZmluZWRcIiA/IHRydWUgOiBuYXZpZ2F0b3Iub25MaW5lO1xuICB9XG5cbiAgb25PbmxpbmUoY2I6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9ubGluZUNhbGxiYWNrcy5wdXNoKGNiKTtcbiAgfVxuXG4gIG9uT2ZmbGluZShjYjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub2ZmbGluZUNhbGxiYWNrcy5wdXNoKGNiKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib25saW5lXCIsIHRoaXMub25PbmxpbmVIYW5kbGVyKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib2ZmbGluZVwiLCB0aGlzLm9uT2ZmbGluZUhhbmRsZXIpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBFdmVudFF1ZXVlIH0gZnJvbSBcIi4vcXVldWUuanNcIjtcbmltcG9ydCB0eXBlIHsgVHJhbnNwb3J0IH0gZnJvbSBcIi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG4vKipcbiAqIE93bnMgcGFnZS1saWZlY3ljbGUgb2JzZXJ2YWJpbGl0eTpcbiAqXG4gKiAgIC0gTGlzdGVucyBmb3IgYHBhZ2VoaWRlYCAvIGBiZWZvcmV1bmxvYWRgIGFuZCBmbHVzaGVzIHRoZSBldmVudFxuICogICAgIHF1ZXVlIHZpYSBiZWFjb24gc28gaW4tZmxpZ2h0IGV2ZW50cyBzdXJ2aXZlIHRhYiBjbG9zZS5cbiAqICAgLSBUcmFja3MgcGVyLXBhZ2Ugc3RhdGUgKGBlbnRyeVRpbWVgLCBgbWF4U2Nyb2xsUGN0YCxcbiAqICAgICBgdGFiSGlkZGVuQ291bnRgLCBgY3VtdWxhdGl2ZUhpZGRlbk1zYCkgYW5kIGVtaXRzIGEgc2luZ2xlXG4gKiAgICAgYCRwYWdlX2xlYXZlYCBldmVudCBwZXIgcGFnZSBvbiByZWFsIGV4aXQuXG4gKlxuICogVGhlIGhvc3QgU1BBIG11c3QgY2FsbCBgcmVjb3JkUGFnZVZpZXcocGF0aClgIG9uIGV2ZXJ5IHJvdXRlIGNoYW5nZVxuICogKHRoZSBSZWFjdCBgPFBhZ2VWaWV3VHJhY2tlcj5gIGRvZXMgdGhpcykuIFRoZSBmaXJzdCBjYWxsIGFmdGVyXG4gKiByZWdpc3RlciBzdGFydHMgdGhlIHBhZ2UtbGVhdmUgdGltZXI7IHN1YnNlcXVlbnQgY2FsbHMgZW1pdCBhXG4gKiBzeW50aGV0aWMgYCRwYWdlX2xlYXZle2V4aXRfa2luZDogXCJzcGFfbmF2XCJ9YCBmb3IgdGhlIHByZXZpb3VzIHBhdGhcbiAqIGJlZm9yZSByZXNldHRpbmcgc3RhdGUgZm9yIHRoZSBuZXcgb25lLlxuICpcbiAqIGB0aW1lX29uX3BhZ2VfbXNgIGFuZCBgY3VtdWxhdGl2ZV9oaWRkZW5fbXNgIGFyZSByb3VuZGVkIHRvIDEwMG1zIOKAlFxuICogdGhlIGNvbnN1bWVyIGhhcyBubyB1c2UgZm9yIHN1Yi0xMDBtcyBwcmVjaXNpb24gYW5kIHJvdW5kaW5nIG1ha2VzXG4gKiBmaW5nZXJwcmludHMgaGFyZGVyLlxuICovXG5leHBvcnQgY2xhc3MgTGlmZWN5Y2xlTWFuYWdlciB7XG4gIHByaXZhdGUgaGFuZGxlcnM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgZmx1c2hlZE9uRXhpdCA9IGZhbHNlO1xuICBwcml2YXRlIGxlYXZlRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIFBlci1wYWdlIHN0YXRlLiBgY3VycmVudFBhdGggPT09IG51bGxgIG1lYW5zIHJlY29yZFBhZ2VWaWV3KCkgaGFzXG4gIC8vIG5ldmVyIGJlZW4gY2FsbGVkIGFuZCB3ZSBoYXZlIG5vdGhpbmcgdG8gZW1pdCBhIGxlYXZlIGV2ZW50IGZvci5cbiAgcHJpdmF0ZSBjdXJyZW50UGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZW50cnlUaW1lID0gMDtcbiAgcHJpdmF0ZSBtYXhTY3JvbGxQY3QgPSAwO1xuICBwcml2YXRlIHRhYkhpZGRlbkNvdW50ID0gMDtcbiAgcHJpdmF0ZSBoaWRkZW5TaW5jZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VtdWxhdGl2ZUhpZGRlbk1zID0gMDtcbiAgcHJpdmF0ZSBzY3JvbGxUaHJvdHRsZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IEV2ZW50UXVldWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc3BvcnQ6IFRyYW5zcG9ydCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW1pdEV2ZW50PzogKG5hbWU6IHN0cmluZywgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhlIHN0YXJ0IG9mIGEgbmV3IHBhZ2Ugdmlldy4gRW1pdHMgYCRwYWdlX2xlYXZlYCBmb3IgYW55XG4gICAqIHByZXZpb3VzIHBhZ2UgZmlyc3QgKHdpdGggYGV4aXRfa2luZDogXCJzcGFfbmF2XCJgKSwgdGhlbiByZXNldHNcbiAgICogc3RhdGUgZm9yIHRoZSBuZXcgcGFnZS4gSWRlbXBvdGVudCBmb3IgcmVwZWF0IGNhbGxzIHdpdGggdGhlIHNhbWVcbiAgICogcGF0aC5cbiAgICovXG4gIHJlY29yZFBhZ2VWaWV3KHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoID09PSBwYXRoKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY3VycmVudFBhdGggIT09IG51bGwgJiYgIXRoaXMubGVhdmVFbWl0dGVkKSB7XG4gICAgICB0aGlzLmVtaXRQYWdlTGVhdmUoXCJzcGFfbmF2XCIpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYXRoID0gcGF0aDtcbiAgICB0aGlzLmVudHJ5VGltZSA9IG5vd01zKCk7XG4gICAgdGhpcy5tYXhTY3JvbGxQY3QgPSAwO1xuICAgIHRoaXMudGFiSGlkZGVuQ291bnQgPSAwO1xuICAgIHRoaXMuaGlkZGVuU2luY2UgPSBudWxsO1xuICAgIHRoaXMuY3VtdWxhdGl2ZUhpZGRlbk1zID0gMDtcbiAgICB0aGlzLmxlYXZlRW1pdHRlZCA9IGZhbHNlO1xuICAgIHRoaXMuZmx1c2hlZE9uRXhpdCA9IGZhbHNlO1xuICB9XG5cbiAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblxuICAgIC8vIFVzZSBwYWdlaGlkZSBhcyB0aGUgcHJpbWFyeSBleGl0IGV2ZW50IChyZWNvbW1lbmRlZCBtb2Rlcm4gQVBJKS5cbiAgICAvLyBiZWZvcmV1bmxvYWQgaXMga2VwdCBhcyBhIGZhbGxiYWNrIGZvciBvbGRlciBicm93c2VycywgYnV0IGd1YXJkZWRcbiAgICAvLyBhZ2FpbnN0IGRvdWJsZS1kcmFpbmluZyB2aWEgYGZsdXNoZWRPbkV4aXRgLlxuICAgIGNvbnN0IG9uRXhpdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLmZsdXNoZWRPbkV4aXQpIHJldHVybjtcbiAgICAgIHRoaXMuZmx1c2hlZE9uRXhpdCA9IHRydWU7XG4gICAgICB0aGlzLmVtaXRQYWdlTGVhdmUoXCJwYWdlaGlkZVwiKTtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMucXVldWUuZHJhaW4oKTtcbiAgICAgIGlmIChldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnRyYW5zcG9ydC5mbHVzaFdpdGhCZWFjb24oZXZlbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25WaXNpYmlsaXR5Q2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJoaWRkZW5cIikge1xuICAgICAgICB0aGlzLnRhYkhpZGRlbkNvdW50ICs9IDE7XG4gICAgICAgIHRoaXMuaGlkZGVuU2luY2UgPSBub3dNcygpO1xuICAgICAgICAvLyBBc3luYyBmbHVzaCBvbiB0YWIgaGlkZSAobm90IHBhZ2UgY2xvc2UpIOKAlCBtYXkgbm90IGNvbXBsZXRlIGJ1dCBiZXN0LWVmZm9ydFxuICAgICAgICB0aGlzLnRyYW5zcG9ydC5mbHVzaCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwidmlzaWJsZVwiKSB7XG4gICAgICAgIGlmICh0aGlzLmhpZGRlblNpbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5jdW11bGF0aXZlSGlkZGVuTXMgKz0gbm93TXMoKSAtIHRoaXMuaGlkZGVuU2luY2U7XG4gICAgICAgICAgdGhpcy5oaWRkZW5TaW5jZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzZXQgZXhpdCBmbGFnIHdoZW4gcGFnZSBiZWNvbWVzIHZpc2libGUgYWdhaW4gKGJmY2FjaGUgcmVzdG9yZSlcbiAgICAgICAgdGhpcy5mbHVzaGVkT25FeGl0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU2Nyb2xsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lciAhPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgdGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lciA9IG51bGw7XG4gICAgICAgIGNvbnN0IHBjdCA9IGNvbXB1dGVTY3JvbGxQY3QoKTtcbiAgICAgICAgaWYgKHBjdCA+IHRoaXMubWF4U2Nyb2xsUGN0KSB0aGlzLm1heFNjcm9sbFBjdCA9IHBjdDtcbiAgICAgIH0sIDI1MCk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgb25FeGl0KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBvbkV4aXQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIG9uVmlzaWJpbGl0eUNoYW5nZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgb25TY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAgIHRoaXMuaGFuZGxlcnMucHVzaChcbiAgICAgICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgb25FeGl0KSxcbiAgICAgICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIG9uRXhpdCksXG4gICAgICAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCBvblZpc2liaWxpdHlDaGFuZ2UpLFxuICAgICAgKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgb25TY3JvbGwpLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lcik7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5sb2cuZGVidWcoXCJMaWZlY3ljbGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQuXCIpO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHJlbW92ZSBvZiB0aGlzLmhhbmRsZXJzKSB7XG4gICAgICByZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UGFnZUxlYXZlKGV4aXRLaW5kOiBcInBhZ2VoaWRlXCIgfCBcInNwYV9uYXZcIik6IHZvaWQge1xuICAgIGlmICh0aGlzLmxlYXZlRW1pdHRlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoID09PSBudWxsKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmVtaXRFdmVudCkgcmV0dXJuO1xuICAgIHRoaXMubGVhdmVFbWl0dGVkID0gdHJ1ZTtcblxuICAgIGxldCBjdW11bGF0aXZlSGlkZGVuID0gdGhpcy5jdW11bGF0aXZlSGlkZGVuTXM7XG4gICAgaWYgKHRoaXMuaGlkZGVuU2luY2UgIT09IG51bGwpIHtcbiAgICAgIGN1bXVsYXRpdmVIaWRkZW4gKz0gbm93TXMoKSAtIHRoaXMuaGlkZGVuU2luY2U7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0RXZlbnQoXCIkcGFnZV9sZWF2ZVwiLCB7XG4gICAgICBwYXRoOiB0aGlzLmN1cnJlbnRQYXRoLFxuICAgICAgdGltZV9vbl9wYWdlX21zOiByb3VuZFRvMTAwKG5vd01zKCkgLSB0aGlzLmVudHJ5VGltZSksXG4gICAgICBtYXhfc2Nyb2xsX3BjdDogdGhpcy5tYXhTY3JvbGxQY3QsXG4gICAgICB0YWJfaGlkZGVuX2NvdW50OiB0aGlzLnRhYkhpZGRlbkNvdW50LFxuICAgICAgY3VtdWxhdGl2ZV9oaWRkZW5fbXM6IHJvdW5kVG8xMDAoY3VtdWxhdGl2ZUhpZGRlbiksXG4gICAgICBleGl0X2tpbmQ6IGV4aXRLaW5kLFxuICAgIH0pO1xuICB9XG59XG5cbi8vIFVzZSBEYXRlLm5vdygpIHJhdGhlciB0aGFuIHBlcmZvcm1hbmNlLm5vdygpIOKAlCB3ZSByb3VuZCB0byAxMDBtcyBzb1xuLy8gdGhlIHN1Yi1tcyBwcmVjaXNpb24gaXMgdW51c2VkLCBhbmQgRGF0ZS5ub3coKSBpbnRlcm9wZXJhdGVzIGNsZWFubHlcbi8vIHdpdGggYHZpLnVzZUZha2VUaW1lcnMoKWAgd2hpY2ggZG9lc24ndCBtb2NrIHBlcmZvcm1hbmNlLm5vdygpIGJ5XG4vLyBkZWZhdWx0LlxuZnVuY3Rpb24gbm93TXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59XG5cbmZ1bmN0aW9uIHJvdW5kVG8xMDAobXM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKG1zIC8gMTAwKSAqIDEwMCk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTY3JvbGxQY3QoKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gMDtcbiAgY29uc3Qgc2Nyb2xsVG9wID0gd2luZG93LnNjcm9sbFkgPz8gMDtcbiAgY29uc3QgZG9jSGVpZ2h0ID0gKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8uc2Nyb2xsSGVpZ2h0ID8/IDApIC0gKHdpbmRvdy5pbm5lckhlaWdodCA/PyAwKTtcbiAgaWYgKGRvY0hlaWdodCA8PSAwKSByZXR1cm4gMTAwO1xuICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChzY3JvbGxUb3AgLyBkb2NIZWlnaHQpICogMTAwKSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG50eXBlIFRyYWNrZXIgPSAoZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNhcHR1cmVDb25maWcge1xuICAvKiogQ2FwdHVyZSB1bmNhdWdodCBlcnJvcnMgdmlhIGB3aW5kb3cub25lcnJvcmAuIERlZmF1bHQ6IHRydWUuICovXG4gIGVycm9ycz86IGJvb2xlYW47XG4gIC8qKiBDYXB0dXJlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbnMuIERlZmF1bHQ6IHRydWUuICovXG4gIHJlamVjdGlvbnM/OiBib29sZWFuO1xuICAvKiogRm9yd2FyZCBgZ29hdGVjaDphdXRoLWV2ZW50YCBDdXN0b21FdmVudHMgdmVyYmF0aW0gYXMgdHJhY2tlZCBldmVudHMuIERlZmF1bHQ6IHRydWUuICovXG4gIGF1dGhFdmVudHM/OiBib29sZWFuO1xuICAvKiogTWF4IHN0YWNrIGZyYW1lcyBsZW5ndGggaW4gY2hhcmFjdGVycy4gRGVmYXVsdDogNDA5Ni4gKi9cbiAgc3RhY2tMaW1pdD86IG51bWJlcjtcbiAgLyoqIERlLWR1cCB3aW5kb3cgaW4gbXMg4oCUIGlkZW50aWNhbCBlcnJvcnMgd2l0aGluIHRoaXMgd2luZG93IGFyZSBkcm9wcGVkLiBEZWZhdWx0OiAxMDAwLiAqL1xuICBkZWR1cGVXaW5kb3dNcz86IG51bWJlcjtcbn1cblxuY29uc3QgREVGQVVMVFM6IFJlcXVpcmVkPEVycm9yQ2FwdHVyZUNvbmZpZz4gPSB7XG4gIGVycm9yczogdHJ1ZSxcbiAgcmVqZWN0aW9uczogdHJ1ZSxcbiAgYXV0aEV2ZW50czogdHJ1ZSxcbiAgc3RhY2tMaW1pdDogNDA5NixcbiAgZGVkdXBlV2luZG93TXM6IDEwMDAsXG59O1xuXG5leHBvcnQgY2xhc3MgQnJvd3NlckVycm9yQ2FwdHVyZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2s6IFRyYWNrZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2ZnOiBSZXF1aXJlZDxFcnJvckNhcHR1cmVDb25maWc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIGxhc3RTaWduYXR1cmU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTaWduYXR1cmVBdCA9IDA7XG5cbiAgY29uc3RydWN0b3IodHJhY2s6IFRyYWNrZXIsIGxvZzogTG9nZ2VyLCBjb25maWc/OiBFcnJvckNhcHR1cmVDb25maWcpIHtcbiAgICB0aGlzLnRyYWNrID0gdHJhY2s7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5jZmcgPSB7IC4uLkRFRkFVTFRTLCAuLi4oY29uZmlnID8/IHt9KSB9O1xuICB9XG5cbiAgaW5zdGFsbCgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIGNvbnN0IHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogbnVsbDtcbiAgICBjb25zdCBicm93c2VyID0gZGV0ZWN0QnJvd3NlclRhZyh1c2VyQWdlbnQpO1xuXG4gICAgaWYgKHRoaXMuY2ZnLmVycm9ycykge1xuICAgICAgY29uc3Qgb25FcnJvciA9IChldmVudDogRXJyb3JFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBzdGFjayA9XG4gICAgICAgICAgZXZlbnQuZXJyb3IgJiYgZXZlbnQuZXJyb3Iuc3RhY2tcbiAgICAgICAgICAgID8gU3RyaW5nKGV2ZW50LmVycm9yLnN0YWNrKS5zbGljZSgwLCB0aGlzLmNmZy5zdGFja0xpbWl0KVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBgZXJyOiR7ZXZlbnQubWVzc2FnZX06JHtldmVudC5maWxlbmFtZX06JHtldmVudC5saW5lbm99YDtcbiAgICAgICAgaWYgKHRoaXMuc3VwcHJlc3Moc2lnbmF0dXJlKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNhZmVUcmFjayhcIiRlcnJvclwiLCB7XG4gICAgICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSxcbiAgICAgICAgICBzb3VyY2U6IGV2ZW50LmZpbGVuYW1lID8/IG51bGwsXG4gICAgICAgICAgbGluZTogZXZlbnQubGluZW5vID8/IG51bGwsXG4gICAgICAgICAgY29sOiBldmVudC5jb2xubyA/PyBudWxsLFxuICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgIHR5cGU6IFwidW5jYXVnaHRfZXJyb3JcIixcbiAgICAgICAgICBicm93c2VyLFxuICAgICAgICAgIHVzZXJfYWdlbnQ6IHVzZXJBZ2VudCxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgIHRoaXMuaGFuZGxlcnMucHVzaCgoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jZmcucmVqZWN0aW9ucykge1xuICAgICAgY29uc3Qgb25SZWplY3Rpb24gPSAoZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCByZWFzb24gPSBldmVudC5yZWFzb247XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAgIHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IHJlYXNvbi5tZXNzYWdlXG4gICAgICAgICAgICA6IHR5cGVvZiByZWFzb24gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyByZWFzb25cbiAgICAgICAgICAgICAgOiBzYWZlU3RyaW5naWZ5KHJlYXNvbik7XG4gICAgICAgIGNvbnN0IHN0YWNrID1cbiAgICAgICAgICByZWFzb24gaW5zdGFuY2VvZiBFcnJvciAmJiByZWFzb24uc3RhY2tcbiAgICAgICAgICAgID8gU3RyaW5nKHJlYXNvbi5zdGFjaykuc2xpY2UoMCwgdGhpcy5jZmcuc3RhY2tMaW1pdClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYHJlajoke21lc3NhZ2V9YDtcbiAgICAgICAgaWYgKHRoaXMuc3VwcHJlc3Moc2lnbmF0dXJlKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNhZmVUcmFjayhcIiRlcnJvclwiLCB7XG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgICB0eXBlOiBcInVuaGFuZGxlZF9yZWplY3Rpb25cIixcbiAgICAgICAgICBicm93c2VyLFxuICAgICAgICAgIHVzZXJfYWdlbnQ6IHVzZXJBZ2VudCxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgb25SZWplY3Rpb24pO1xuICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKCgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidW5oYW5kbGVkcmVqZWN0aW9uXCIsIG9uUmVqZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2ZnLmF1dGhFdmVudHMpIHtcbiAgICAgIGNvbnN0IG9uQXV0aEV2ZW50ID0gKGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSAoXG4gICAgICAgICAgZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8e1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIH0+XG4gICAgICAgICkuZGV0YWlsO1xuICAgICAgICBpZiAoIWRldGFpbD8ubmFtZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNhZmVUcmFjayhkZXRhaWwubmFtZSwge1xuICAgICAgICAgIC4uLihkZXRhaWwucHJvcGVydGllcyA/PyB7fSksXG4gICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICB1c2VyX2FnZW50OiB1c2VyQWdlbnQsXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZ29hdGVjaDphdXRoLWV2ZW50XCIsIG9uQXV0aEV2ZW50IGFzIEV2ZW50TGlzdGVuZXIpO1xuICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKCgpID0+XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiZ29hdGVjaDphdXRoLWV2ZW50XCIsIG9uQXV0aEV2ZW50IGFzIEV2ZW50TGlzdGVuZXIpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB1bmluc3RhbGwoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZW1vdmUgb2YgdGhpcy5oYW5kbGVycykgcmVtb3ZlKCk7XG4gICAgdGhpcy5oYW5kbGVycy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBzdXBwcmVzcyhzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMubGFzdFNpZ25hdHVyZSA9PT0gc2lnbmF0dXJlICYmIG5vdyAtIHRoaXMubGFzdFNpZ25hdHVyZUF0IDwgdGhpcy5jZmcuZGVkdXBlV2luZG93TXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmxhc3RTaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gICAgdGhpcy5sYXN0U2lnbmF0dXJlQXQgPSBub3c7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzYWZlVHJhY2sobmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnRyYWNrKG5hbWUsIHByb3BlcnRpZXMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihcImVycm9yIGNhcHR1cmUgdHJhY2soKSB0aHJld1wiLCBlcnIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRlY3RCcm93c2VyVGFnKHVhOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCF1YSkgcmV0dXJuIFwidW5rbm93blwiO1xuICBjb25zdCBpc0Nocm9tZSA9IC9DaHJvbWVcXC9cXGQvLnRlc3QodWEpICYmICEvRWRnXFwvLy50ZXN0KHVhKTtcbiAgY29uc3QgaXNGaXJlZm94ID0gL0ZpcmVmb3hcXC9cXGQvLnRlc3QodWEpO1xuICBjb25zdCBpc1NhZmFyaSA9IC9TYWZhcmlcXC8vLnRlc3QodWEpICYmICFpc0Nocm9tZSAmJiAhL0NyaU9TfEZ4aU9TfE9QUlxcLy8udGVzdCh1YSk7XG4gIHJldHVybiBpc0Nocm9tZSA/IFwiY2hyb21lXCIgOiBpc0ZpcmVmb3ggPyBcImZpcmVmb3hcIiA6IGlzU2FmYXJpID8gXCJzYWZhcmlcIiA6IFwib3RoZXJcIjtcbn1cblxuZnVuY3Rpb24gc2FmZVN0cmluZ2lmeSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKSA/PyBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBIVFRQIGVycm9yIGF1dG8tY2FwdHVyZSDigJQgd3JhcHMgYHdpbmRvdy5mZXRjaGAgYW5kIGVtaXRzIGEgc3RydWN0dXJlZFxuICogYCRodHRwX2Vycm9yYCBldmVudCBmb3IgZXZlcnkgNHh4LzV4eCByZXNwb25zZSBvciBuZXR3b3JrIGZhaWx1cmUuXG4gKlxuICogV2h5OiB3aXRob3V0IHRoaXMsIGN1c3RvbWVycyBoYXZlIHRvIGhhbmQtaW5zdHJ1bWVudCBldmVyeSBlbmRwb2ludCB0aGF0XG4gKiBtaWdodCByZXR1cm4gYW4gZXJyb3IgKHRoZSAwNC0yMiBzaWduLW91dCBkZWJ1ZyBzZXNzaW9uIGlzIHRoZSBjYW5vbmljYWxcbiAqIGV4YW1wbGUg4oCUIHdlIHNwZW50IGhvdXJzIHRoZW9yaXppbmcgYWJvdXQgY29va2llIGJlaGF2aW9yIGluc3RlYWQgb2ZcbiAqIHJlYWRpbmcgYGNvb2tpZV9rZXlzPVtdYCBvZmYgYSBzdHJ1Y3R1cmVkIGV2ZW50KS4gV2l0aCBpdCwgZXZlcnkgZmFpbGluZ1xuICogcmVxdWVzdCBiZWNvbWVzIGEgcXVlcnlhYmxlIGV2ZW50IG9uIHRoZSBHb2FUZWNoIGRhc2hib2FyZCB3aXRoIGVub3VnaFxuICogY29udGV4dCB0byBkaWFnbm9zZSBhdXRoLCBDT1JTLCBDRE4sIGFuZCBwcm94eSBidWdzIHdpdGhvdXQgdG91Y2hpbmdcbiAqIGN1c3RvbWVyIGNvZGUuXG4gKlxuICogRGVzaWduOlxuICogLSBNb25rZXktcGF0Y2hlcyBgd2luZG93LmZldGNoYCB3aXRoIGFuIGlkZW1wb3RlbnQgaW5zdGFsbCDigJQgYSBzZWNvbmRcbiAqICAgaW5zdGFsbCgpIGNhbGwgaXMgYSBuby1vcC5cbiAqIC0gQ2FwdHVyZXMgQ09SUy1leHBvc2VkIHJlc3BvbnNlIGhlYWRlcnMgb25seSAoU2V0LUNvb2tpZSBpcyBoaWRkZW4gZnJvbVxuICogICBKYXZhU2NyaXB0IHBlciBzcGVjLCBzbyB3ZSBjYXB0dXJlIGNvb2tpZSAqbmFtZXMqIHZpYSBgZG9jdW1lbnQuY29va2llYFxuICogICBhcyBhIHByb3h5IGZvciBcImRpZCB0aGUgc2VydmVyJ3MgU2V0LUNvb2tpZSBsYW5kXCIpLlxuICogLSBEZWR1cGUgd2luZG93IHByZXZlbnRzIGVycm9yIGxvb3BzIChpZGVudGljYWwgKHVybCwgc3RhdHVzKSB3aXRoaW5cbiAqICAgYGRlZHVwZVdpbmRvd01zYCBpcyBkcm9wcGVkKS5cbiAqIC0gTkVWRVIgY2FwdHVyZXMgcmVxdWVzdCBvciByZXNwb25zZSBib2RpZXMg4oCUIHRob3NlIG1heSBjYXJyeSBzZWNyZXRzLlxuICogICBJZiBhIGN1c3RvbWVyIG5lZWRzIGJvZGllcyB0aGV5IGNhbiBleHRlbmQgdmlhIHRoZSBgb25DYXB0dXJlYCBob29rLlxuICovXG5cbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5cbnR5cGUgVHJhY2tlciA9IChldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFcnJvckNhcHR1cmVDb25maWcge1xuICAvKiogTWFzdGVyIHN3aXRjaC4gRGVmYXVsdDogdHJ1ZS4gKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdGF0dXMgcHJlZGljYXRlIOKAlCByZXR1cm4gdHJ1ZSB0byBjYXB0dXJlLiBEZWZhdWx0OiBgcyA+PSA0MDBgLlxuICAgKiBOZXR3b3JrIGZhaWx1cmVzIChmZXRjaCByZWplY3Rpb25zKSBhcmUgQUxXQVlTIGNhcHR1cmVkIHJlZ2FyZGxlc3MuXG4gICAqL1xuICBzaG91bGRDYXB0dXJlPzogKHN0YXR1czogbnVtYmVyKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogVVJMIHBhdHRlcm5zIHRvIGV4Y2x1ZGUgKHRlc3RlZCB3aXRoIGAudGVzdCh1cmwpYCkuIFVzZWZ1bCB0byBza2lwXG4gICAqIGFuYWx5dGljcy9tb25pdG9yaW5nIGVuZHBvaW50cyB0aGF0IHdvdWxkIG90aGVyd2lzZSByZWN1cnNlLlxuICAgKiBEZWZhdWx0OiBleGNsdWRlcyBgL3YxL2luZ2VzdGAgYW5kIGAvdjEvY29uZmlnYCBvbiB0aGUgU0RLJ3Mgb3duIEFQSSBVUkwuXG4gICAqL1xuICBleGNsdWRlVXJsUGF0dGVybnM/OiBSZWdFeHBbXTtcbiAgLyoqXG4gICAqIENPUlMtZXhwb3NlZCByZXNwb25zZSBoZWFkZXJzIHRvIGNhcHR1cmUgKGxvd2VyY2FzZWQpLiBEZWZhdWx0OlxuICAgKiBbXCJ4LXJlcXVlc3QtaWRcIiwgXCJ2YXJ5XCIsIFwiY29udGVudC10eXBlXCIsIFwiYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2luXCJdLlxuICAgKi9cbiAgY2FwdHVyZVJlc3BvbnNlSGVhZGVycz86IHN0cmluZ1tdO1xuICAvKiogRGVkdXBlIHdpbmRvdyBpbiBtcyDigJQgaWRlbnRpY2FsICh1cmwsIHN0YXR1cykgaW5zaWRlIGlzIGRyb3BwZWQuIERlZmF1bHQ6IDEwMDAuICovXG4gIGRlZHVwZVdpbmRvd01zPzogbnVtYmVyO1xuICAvKiogQ2FsbGVkIEFGVEVSIHRoZSBldmVudCBpcyB0cmFja2VkIOKAlCBob29rIGZvciBjdXN0b20gZW5yaWNobWVudCBvciBzaW5rcy4gKi9cbiAgb25DYXB0dXJlPzogKGRldGFpbDogSHR0cEVycm9yRXZlbnREZXRhaWwpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEVycm9yRXZlbnREZXRhaWwge1xuICB1cmw6IHN0cmluZztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHN0YXR1czogbnVtYmVyOyAvLyAwIGZvciBuZXR3b3JrIGZhaWx1cmVcbiAgbGF0ZW5jeV9tczogbnVtYmVyO1xuICByZXF1ZXN0X2lkOiBzdHJpbmcgfCBudWxsO1xuICByZXNwb25zZV9oZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogTm9uLUh0dHBPbmx5IGNvb2tpZSBOQU1FUyBwcmVzZW50IG9uIGRvY3VtZW50LmNvb2tpZSBhdCB0aGUgdGltZSBvZlxuICAgKiB0aGUgZXJyb3IuIFZhbHVlcyBhcmUgbmV2ZXIgY2FwdHVyZWQuIFRoaXMgaXMgdGhlIGNsaWVudC1zaWRlIHByb3h5XG4gICAqIGZvciBcImRpZCB0aGUgc2VydmVyJ3MgU2V0LUNvb2tpZSBnZXQgYWNjZXB0ZWRcIiDigJQgaWYgYW4gYXV0aCBlbmRwb2ludFxuICAgKiA0MDFzIGFuZCB0aGVyZSBhcmUgemVybyBjb29raWVzIG9uIHRoZSBvcmlnaW4gdGhhdCAqc2hvdWxkKiBoYXZlIHNldFxuICAgKiBvbmUsIHRoZSBjb29raWUgd2FzIHJlamVjdGVkIGJ5IHRoZSBicm93c2VyLlxuICAgKi9cbiAgY29va2llX25hbWVzOiBzdHJpbmdbXTtcbiAgLyoqIFwibmV0d29ya19mYWlsdXJlXCIgfCBcImh0dHBfZXJyb3JcIi4gKi9cbiAga2luZDogXCJuZXR3b3JrX2ZhaWx1cmVcIiB8IFwiaHR0cF9lcnJvclwiO1xuICAvKiogUHJlc2VudCBvbiBraW5kPW5ldHdvcmtfZmFpbHVyZS4gKi9cbiAgZXJyb3JfbmFtZT86IHN0cmluZztcbiAgLyoqIFByZXNlbnQgb24ga2luZD1uZXR3b3JrX2ZhaWx1cmUuICovXG4gIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBUcnVlIGlmIHRoZSBmZXRjaCB3YXMgYWJvcnRlZCAoZS5nLiwgdGltZW91dCkuICovXG4gIGFib3J0ZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCBERUZBVUxUX0hFQURFUlMgPSBbXCJ4LXJlcXVlc3QtaWRcIiwgXCJ2YXJ5XCIsIFwiY29udGVudC10eXBlXCIsIFwiYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2luXCJdO1xuXG5leHBvcnQgY2xhc3MgSHR0cEVycm9yQ2FwdHVyZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2s6IFRyYWNrZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2ZnOiBSZXF1aXJlZDxcbiAgICBPbWl0PEh0dHBFcnJvckNhcHR1cmVDb25maWcsIFwiZXhjbHVkZVVybFBhdHRlcm5zXCIgfCBcIm9uQ2FwdHVyZVwiPlxuICA+ICYge1xuICAgIGV4Y2x1ZGVVcmxQYXR0ZXJuczogUmVnRXhwW107XG4gICAgb25DYXB0dXJlOiAoKGRldGFpbDogSHR0cEVycm9yRXZlbnREZXRhaWwpID0+IHZvaWQpIHwgbnVsbDtcbiAgfTtcbiAgcHJpdmF0ZSBvcmlnaW5hbEZldGNoOiB0eXBlb2YgZmV0Y2ggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbnN0YWxsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYXN0U2lnOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U2lnQXQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHRyYWNrOiBUcmFja2VyLCBsb2c6IExvZ2dlciwgY29uZmlnPzogSHR0cEVycm9yQ2FwdHVyZUNvbmZpZykge1xuICAgIHRoaXMudHJhY2sgPSB0cmFjaztcbiAgICB0aGlzLmxvZyA9IGxvZztcbiAgICB0aGlzLmNmZyA9IHtcbiAgICAgIGVuYWJsZWQ6IGNvbmZpZz8uZW5hYmxlZCA/PyB0cnVlLFxuICAgICAgc2hvdWxkQ2FwdHVyZTogY29uZmlnPy5zaG91bGRDYXB0dXJlID8/ICgocykgPT4gcyA+PSA0MDApLFxuICAgICAgZXhjbHVkZVVybFBhdHRlcm5zOiBjb25maWc/LmV4Y2x1ZGVVcmxQYXR0ZXJucyA/PyBbL1xcL3YxXFwvaW5nZXN0XFxiLywgL1xcL3YxXFwvY29uZmlnXFxiL10sXG4gICAgICBjYXB0dXJlUmVzcG9uc2VIZWFkZXJzOiBjb25maWc/LmNhcHR1cmVSZXNwb25zZUhlYWRlcnMgPz8gREVGQVVMVF9IRUFERVJTLFxuICAgICAgZGVkdXBlV2luZG93TXM6IGNvbmZpZz8uZGVkdXBlV2luZG93TXMgPz8gMTAwMCxcbiAgICAgIG9uQ2FwdHVyZTogY29uZmlnPy5vbkNhcHR1cmUgPz8gbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgaW5zdGFsbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnN0YWxsZWQgfHwgIXRoaXMuY2ZnLmVuYWJsZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2Ygd2luZG93LmZldGNoICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybjtcblxuICAgIC8vIFN0b3JlIHRoZSB1bmJvdW5kIG9yaWdpbmFsIHNvIHVuaW5zdGFsbCBjYW4gcmVzdG9yZSBieSByZWZlcmVuY2Ug4oCUXG4gICAgLy8gYnV0IGNhbGwgaXQgd2l0aCBgLmNhbGwod2luZG93LCAuLi4pYCBzbyBuYXRpdmUgYnJvd3NlciBmZXRjaFxuICAgIC8vIGltcGxlbWVudGF0aW9ucyAod2hpY2ggdGhyb3cgXCJJbGxlZ2FsIGludm9jYXRpb25cIiAvIFwiQ2FuIG9ubHkgY2FsbFxuICAgIC8vIFdpbmRvdy5mZXRjaCBvbiBpbnN0YW5jZXMgb2YgV2luZG93XCIgd2hlbiBpbnZva2VkIGJhcmUpIHdvcmsuXG4gICAgLy8ganNkb20ncyBwb2x5ZmlsbCBpcyBsb29zZSBhYm91dCBgdGhpc2AsIHNvIHRoZSB1bml0IHRlc3RzIGRvbid0XG4gICAgLy8gY2F0Y2ggdGhpcyDigJQgb25seSByZWFsIFNhZmFyaSAvIENocm9tZSBkby5cbiAgICB0aGlzLm9yaWdpbmFsRmV0Y2ggPSB3aW5kb3cuZmV0Y2g7XG5cbiAgICAvLyBBcnJvdyBwcmVzZXJ2ZXMgYHRoaXNgIHdpdGhvdXQgYWxpYXNpbmc7IHRoZSBsaW50IHJ1bGUgY2F0Y2hlcyBleHBsaWNpdFxuICAgIC8vIGBjb25zdCBzZWxmID0gdGhpc2AgcGF0dGVybnMgdGhhdCBhcmUgZXJyb3ItcHJvbmUgaW4gY2xhc3MgbWV0aG9kcy5cbiAgICB3aW5kb3cuZmV0Y2ggPSBhc3luYyAoaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBzdGFydGVkID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHVybCA9IGV4dHJhY3RVcmwoaW5wdXQpO1xuICAgICAgY29uc3QgbWV0aG9kID0gKFxuICAgICAgICBpbml0Py5tZXRob2QgPz8gKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCA/IGlucHV0Lm1ldGhvZCA6IFwiR0VUXCIpXG4gICAgICApLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMub3JpZ2luYWxGZXRjaCEuY2FsbCh3aW5kb3csIGlucHV0LCBpbml0KTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkU2tpcCh1cmwpKSByZXR1cm4gcmVzO1xuICAgICAgICBpZiAoIXRoaXMuY2ZnLnNob3VsZENhcHR1cmUocmVzLnN0YXR1cykpIHJldHVybiByZXM7XG4gICAgICAgIHRoaXMuZW1pdCh7XG4gICAgICAgICAga2luZDogXCJodHRwX2Vycm9yXCIsXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgICAgbGF0ZW5jeV9tczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWQsXG4gICAgICAgICAgcmVxdWVzdF9pZDogcmVzLmhlYWRlcnMuZ2V0KFwieC1yZXF1ZXN0LWlkXCIpLFxuICAgICAgICAgIHJlc3BvbnNlX2hlYWRlcnM6IHRoaXMucGx1Y2tIZWFkZXJzKHJlcy5oZWFkZXJzKSxcbiAgICAgICAgICBjb29raWVfbmFtZXM6IHRoaXMucmVhZENvb2tpZU5hbWVzKCksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghdGhpcy5zaG91bGRTa2lwKHVybCkpIHtcbiAgICAgICAgICBjb25zdCBhYm9ydGVkID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiO1xuICAgICAgICAgIGNvbnN0IGVyck5hbWUgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogXCJVbmtub3duRXJyb3JcIjtcbiAgICAgICAgICBjb25zdCBlcnJNZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgIHRoaXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIm5ldHdvcmtfZmFpbHVyZVwiLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICAgICAgbGF0ZW5jeV9tczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWQsXG4gICAgICAgICAgICByZXF1ZXN0X2lkOiBudWxsLFxuICAgICAgICAgICAgcmVzcG9uc2VfaGVhZGVyczoge30sXG4gICAgICAgICAgICBjb29raWVfbmFtZXM6IHRoaXMucmVhZENvb2tpZU5hbWVzKCksXG4gICAgICAgICAgICBlcnJvcl9uYW1lOiBlcnJOYW1lLFxuICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogZXJyTWVzc2FnZSxcbiAgICAgICAgICAgIGFib3J0ZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluc3RhbGxlZCA9IHRydWU7XG4gIH1cblxuICB1bmluc3RhbGwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmluc3RhbGxlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaXMub3JpZ2luYWxGZXRjaCkge1xuICAgICAgd2luZG93LmZldGNoID0gdGhpcy5vcmlnaW5hbEZldGNoO1xuICAgIH1cbiAgICB0aGlzLm9yaWdpbmFsRmV0Y2ggPSBudWxsO1xuICAgIHRoaXMuaW5zdGFsbGVkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFNraXAodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jZmcuZXhjbHVkZVVybFBhdHRlcm5zLnNvbWUoKHApID0+IHAudGVzdCh1cmwpKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdChkZXRhaWw6IEh0dHBFcnJvckV2ZW50RGV0YWlsKTogdm9pZCB7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYCR7ZGV0YWlsLm1ldGhvZH06JHtkZXRhaWwudXJsfToke2RldGFpbC5zdGF0dXN9YDtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLmxhc3RTaWcgPT09IHNpZ25hdHVyZSAmJiBub3cgLSB0aGlzLmxhc3RTaWdBdCA8IHRoaXMuY2ZnLmRlZHVwZVdpbmRvd01zKSByZXR1cm47XG4gICAgdGhpcy5sYXN0U2lnID0gc2lnbmF0dXJlO1xuICAgIHRoaXMubGFzdFNpZ0F0ID0gbm93O1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudHJhY2soXCIkaHR0cF9lcnJvclwiLCB7XG4gICAgICAgIHVybDogZGV0YWlsLnVybCxcbiAgICAgICAgbWV0aG9kOiBkZXRhaWwubWV0aG9kLFxuICAgICAgICBzdGF0dXM6IGRldGFpbC5zdGF0dXMsXG4gICAgICAgIGxhdGVuY3lfbXM6IGRldGFpbC5sYXRlbmN5X21zLFxuICAgICAgICByZXF1ZXN0X2lkOiBkZXRhaWwucmVxdWVzdF9pZCxcbiAgICAgICAgcmVzcG9uc2VfaGVhZGVyczogZGV0YWlsLnJlc3BvbnNlX2hlYWRlcnMsXG4gICAgICAgIGNvb2tpZV9uYW1lczogZGV0YWlsLmNvb2tpZV9uYW1lcyxcbiAgICAgICAga2luZDogZGV0YWlsLmtpbmQsXG4gICAgICAgIC4uLihkZXRhaWwuZXJyb3JfbmFtZSAhPT0gdW5kZWZpbmVkID8geyBlcnJvcl9uYW1lOiBkZXRhaWwuZXJyb3JfbmFtZSB9IDoge30pLFxuICAgICAgICAuLi4oZGV0YWlsLmVycm9yX21lc3NhZ2UgIT09IHVuZGVmaW5lZCA/IHsgZXJyb3JfbWVzc2FnZTogZGV0YWlsLmVycm9yX21lc3NhZ2UgfSA6IHt9KSxcbiAgICAgICAgLi4uKGRldGFpbC5hYm9ydGVkICE9PSB1bmRlZmluZWQgPyB7IGFib3J0ZWQ6IGRldGFpbC5hYm9ydGVkIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJodHRwLWVycm9yLWNhcHR1cmUgdHJhY2soKSB0aHJld1wiLCBlcnIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNmZy5vbkNhcHR1cmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY2ZnLm9uQ2FwdHVyZShkZXRhaWwpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oXCJodHRwLWVycm9yLWNhcHR1cmUgb25DYXB0dXJlKCkgdGhyZXdcIiwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBsdWNrSGVhZGVycyhoZWFkZXJzOiBIZWFkZXJzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMuY2ZnLmNhcHR1cmVSZXNwb25zZUhlYWRlcnMpIHtcbiAgICAgIGNvbnN0IHYgPSBoZWFkZXJzLmdldChuYW1lKTtcbiAgICAgIGlmICh2ICE9PSBudWxsKSBvdXRbbmFtZV0gPSB2O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkQ29va2llTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mIGRvY3VtZW50LmNvb2tpZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFtdO1xuICAgIGlmIChkb2N1bWVudC5jb29raWUubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGRvY3VtZW50LmNvb2tpZVxuICAgICAgLnNwbGl0KFwiO1wiKVxuICAgICAgLm1hcCgocGFpcikgPT4gcGFpci50cmltKCkuc3BsaXQoXCI9XCIpWzBdID8/IFwiXCIpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiBuYW1lLmxlbmd0aCA+IDApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RVcmwoaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlucHV0O1xuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBVUkwpIHJldHVybiBpbnB1dC50b1N0cmluZygpO1xuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KSByZXR1cm4gaW5wdXQudXJsO1xuICByZXR1cm4gU3RyaW5nKGlucHV0KTtcbn1cbiIsImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5cbi8qKlxuICogQ2xpY2stZnJ1c3RyYXRpb24gZGV0ZWN0b3Ig4oCUIGVtaXRzIHR3byBkaWFnbm9zdGljIGV2ZW50czpcbiAqXG4gKiAgIC0gYCRyYWdlX2NsaWNrYDog4omlMyBjbGlja3Mgd2l0aGluIGByYWdlV2luZG93TXNgICgxcyBkZWZhdWx0KSBhbmRcbiAqICAgICBgcmFnZVJhZGl1c1B4YCAoNTBweCBkZWZhdWx0KSBvZiBlYWNoIG90aGVyLiBJbmRpY2F0ZXMgdGhlIHVzZXJcbiAqICAgICBoYW1tZXJlZCB0aGUgc2FtZSBVSSBlbGVtZW50IGV4cGVjdGluZyBhIHJlc3BvbnNlLlxuICogICAtIGAkZGVhZF9jbGlja2A6IGNsaWNrIG9uIGFuIGVsZW1lbnQgdGhhdCBoYXMgbm8gaW50ZXJhY3RpdmVcbiAqICAgICBhbmNlc3RvciAoYnV0dG9uIC8gYSAvIGlucHV0IC8gc2VsZWN0IC8gdGV4dGFyZWEgLyBbcm9sZT1idXR0b25dIC9cbiAqICAgICBbdGFiaW5kZXhdIC8gW2NvbnRlbnRlZGl0YWJsZV0pLiBJbmRpY2F0ZXMgdGhlIHVzZXIgZXhwZWN0ZWQgdGhlXG4gKiAgICAgdGFyZ2V0IHRvIGJlIGNsaWNrYWJsZS5cbiAqXG4gKiBCb3RoIHNpZ25hbHMgYXJlIGJlc3QtZWZmb3J0IGhldXJpc3RpY3Mg4oCUIHRoZSBnb2FsIGlzIHRvIHN1cmZhY2VcbiAqIGZydXN0cmF0ZWQgVVggcGF0dGVybnMgYXQgdGhlIGRhc2hib2FyZCBsYXllciwgbm90IHRvIGJlIDEwMCVcbiAqIGFjY3VyYXRlLiBQZXItc2Vjb25kIGVtaXQgY2FwIChgbWF4RW1pdHNQZXJTZWNgKSBwcmV2ZW50cyBhblxuICogYW5ncnktY2xpY2sgc3Rvcm0gZnJvbSBkcm93bmluZyB0aGUgcXVldWUuXG4gKlxuICogUHJpdmFjeTogd2UgY2FwdHVyZSBjb29yZGluYXRlcyArIGEgc3RhYmxlIHRhcmdldCBzZWxlY3RvclxuICogKGB0YWdOYW1lICsgI2lkICsgLmNsYXNzLmxpc3RgKSDigJQgbmV2ZXIgaW5uZXIgdGV4dCwgYXR0cmlidXRlXG4gKiB2YWx1ZXMsIG9yIGZvcm0gZGF0YS5cbiAqL1xudHlwZSBUcmFja2VyID0gKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpY2tGcnVzdHJhdGlvbkNvbmZpZyB7XG4gIC8qKiBEZXRlY3QgcmFnZSBjbGlja3MuIERlZmF1bHQ6IHRydWUuICovXG4gIHJhZ2U/OiBib29sZWFuO1xuICAvKiogRGV0ZWN0IGRlYWQgY2xpY2tzLiBEZWZhdWx0OiB0cnVlLiAqL1xuICBkZWFkPzogYm9vbGVhbjtcbiAgLyoqIE51bWJlciBvZiBjbGlja3Mgd2l0aGluIHdpbmRvdytyYWRpdXMgdGhhdCBjb25zdGl0dXRlIHJhZ2UuIERlZmF1bHQ6IDMuICovXG4gIHJhZ2VUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBUaW1lIHdpbmRvdyBmb3IgcmFnZSBjbHVzdGVyaW5nLiBEZWZhdWx0OiAxMDAwbXMuICovXG4gIHJhZ2VXaW5kb3dNcz86IG51bWJlcjtcbiAgLyoqIFBpeGVsIHJhZGl1cyBmb3IgcmFnZSBjbHVzdGVyaW5nLiBEZWZhdWx0OiA1MC4gKi9cbiAgcmFnZVJhZGl1c1B4PzogbnVtYmVyO1xuICAvKiogQ2FwIHRoZSBlbWlzc2lvbiByYXRlIChjb21iaW5lZCByYWdlK2RlYWQpLiBEZWZhdWx0OiA1L3NlYy4gKi9cbiAgbWF4RW1pdHNQZXJTZWM/OiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRTOiBSZXF1aXJlZDxDbGlja0ZydXN0cmF0aW9uQ29uZmlnPiA9IHtcbiAgcmFnZTogdHJ1ZSxcbiAgZGVhZDogdHJ1ZSxcbiAgcmFnZVRocmVzaG9sZDogMyxcbiAgcmFnZVdpbmRvd01zOiAxMDAwLFxuICByYWdlUmFkaXVzUHg6IDUwLFxuICBtYXhFbWl0c1BlclNlYzogNSxcbn07XG5cbmNvbnN0IElOVEVSQUNUSVZFX1RBR1MgPSBuZXcgU2V0KFtcbiAgXCJBXCIsXG4gIFwiQlVUVE9OXCIsXG4gIFwiSU5QVVRcIixcbiAgXCJTRUxFQ1RcIixcbiAgXCJURVhUQVJFQVwiLFxuICBcIkxBQkVMXCIsXG4gIFwiU1VNTUFSWVwiLFxuICBcIk9QVElPTlwiLFxuICBcIkRFVEFJTFNcIixcbl0pO1xuXG5pbnRlcmZhY2UgQ2xpY2tSZWNvcmQge1xuICB0OiBudW1iZXI7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQ2xpY2tGcnVzdHJhdGlvbkNhcHR1cmUge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNrOiBUcmFja2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNmZzogUmVxdWlyZWQ8Q2xpY2tGcnVzdHJhdGlvbkNvbmZpZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgcmVjZW50OiBDbGlja1JlY29yZFtdID0gW107XG4gIHByaXZhdGUgcmFnZUNvb2xkb3duVW50aWwgPSAwO1xuICBwcml2YXRlIGVtaXRzVGhpc1NlY29uZCA9IDA7XG4gIHByaXZhdGUgZW1pdHNTZWNvbmRTdGFydGVkQXQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHRyYWNrOiBUcmFja2VyLCBsb2c6IExvZ2dlciwgY29uZmlnPzogQ2xpY2tGcnVzdHJhdGlvbkNvbmZpZykge1xuICAgIHRoaXMudHJhY2sgPSB0cmFjaztcbiAgICB0aGlzLmxvZyA9IGxvZztcbiAgICB0aGlzLmNmZyA9IHsgLi4uREVGQVVMVFMsIC4uLihjb25maWcgPz8ge30pIH07XG4gIH1cblxuICBpbnN0YWxsKCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG5cbiAgICBjb25zdCBvbkNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gQm9va2tlZXBpbmcgZm9yIHJhZ2UgZGV0ZWN0aW9uIOKAlCBrZWVwIG9ubHkgY2xpY2tzIGluc2lkZSB0aGUgd2luZG93LlxuICAgICAgdGhpcy5yZWNlbnQucHVzaCh7IHQ6IG5vdywgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9KTtcbiAgICAgIGNvbnN0IGN1dG9mZiA9IG5vdyAtIHRoaXMuY2ZnLnJhZ2VXaW5kb3dNcztcbiAgICAgIHRoaXMucmVjZW50ID0gdGhpcy5yZWNlbnQuZmlsdGVyKChjKSA9PiBjLnQgPj0gY3V0b2ZmKTtcblxuICAgICAgaWYgKHRoaXMuY2ZnLnJhZ2UpIHRoaXMubWF5YmVFbWl0UmFnZSh0YXJnZXQsIG5vdyk7XG4gICAgICBpZiAodGhpcy5jZmcuZGVhZCkgdGhpcy5tYXliZUVtaXREZWFkKGV2ZW50LCB0YXJnZXQsIG5vdyk7XG4gICAgfTtcblxuICAgIC8vIEJ1YmJsZSBwaGFzZSAoY2FwdHVyZTogZmFsc2UpIHNvIGFwcCBoYW5kbGVycyBoYXZlIGFscmVhZHkgcnVuIGJ5XG4gICAgLy8gdGhlIHRpbWUgd2Ugb2JzZXJ2ZSB0aGUgZXZlbnQuIFRoYXQgbGV0cyB1cyByZWFkIGBkZWZhdWx0UHJldmVudGVkYFxuICAgIC8vIGFuZCBza2lwICRkZWFkX2NsaWNrIGZvciBjbGlja3MgdGhlIHBhZ2UgYWN0dWFsbHkgaGFuZGxlZC5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgb25DbGljaywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIHRoaXMuaGFuZGxlcnMucHVzaCgoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgb25DbGljaykpO1xuXG4gICAgdGhpcy5sb2cuZGVidWcoXCJDbGljay1mcnVzdHJhdGlvbiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZC5cIik7XG4gIH1cblxuICB1bmluc3RhbGwoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZW1vdmUgb2YgdGhpcy5oYW5kbGVycykgcmVtb3ZlKCk7XG4gICAgdGhpcy5oYW5kbGVycy5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVjZW50ID0gW107XG4gIH1cblxuICBwcml2YXRlIG1heWJlRW1pdFJhZ2UodGFyZ2V0OiBFbGVtZW50LCBub3c6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChub3cgPCB0aGlzLnJhZ2VDb29sZG93blVudGlsKSByZXR1cm47XG4gICAgaWYgKHRoaXMucmVjZW50Lmxlbmd0aCA8IHRoaXMuY2ZnLnJhZ2VUaHJlc2hvbGQpIHJldHVybjtcblxuICAgIC8vIEFuY2hvciBvbiB0aGUgbW9zdCByZWNlbnQgY2xpY2sgYW5kIGNvdW50IGNsdXN0ZXIgbWVtYmVycy5cbiAgICBjb25zdCBhbmNob3IgPSB0aGlzLnJlY2VudFt0aGlzLnJlY2VudC5sZW5ndGggLSAxXSE7XG4gICAgbGV0IGNsdXN0ZXIgPSAwO1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLnJlY2VudCkge1xuICAgICAgY29uc3QgZHggPSBjLnggLSBhbmNob3IueDtcbiAgICAgIGNvbnN0IGR5ID0gYy55IC0gYW5jaG9yLnk7XG4gICAgICBpZiAoZHggKiBkeCArIGR5ICogZHkgPD0gdGhpcy5jZmcucmFnZVJhZGl1c1B4ICogdGhpcy5jZmcucmFnZVJhZGl1c1B4KSBjbHVzdGVyICs9IDE7XG4gICAgfVxuICAgIGlmIChjbHVzdGVyIDwgdGhpcy5jZmcucmFnZVRocmVzaG9sZCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy50cnlFbWl0KG5vdykpIHJldHVybjtcblxuICAgIC8vIENvb2xkb3duIHNvIGEgNS1jbGljayBidXJzdCBkb2Vzbid0IGZpcmUgMyB0aW1lcy5cbiAgICB0aGlzLnJhZ2VDb29sZG93blVudGlsID0gbm93ICsgdGhpcy5jZmcucmFnZVdpbmRvd01zO1xuXG4gICAgdGhpcy5zYWZlVHJhY2soXCIkcmFnZV9jbGlja1wiLCB7XG4gICAgICB0YXJnZXQ6IHRhcmdldFNlbGVjdG9yKHRhcmdldCksXG4gICAgICBjbHVzdGVyX3NpemU6IGNsdXN0ZXIsXG4gICAgICB4OiBhbmNob3IueCxcbiAgICAgIHk6IGFuY2hvci55LFxuICAgICAgcGF0aDogdHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiID8gbG9jYXRpb24ucGF0aG5hbWUgOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXliZUVtaXREZWFkKGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXQ6IEVsZW1lbnQsIG5vdzogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gUHJldmVudC1kZWZhdWx0IGNvdW50cyBhcyBcInRoZSBwYWdlIGhhbmRsZWQgaXRcIiDigJQgZG9uJ3QgZW1pdC5cbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgIGlmIChpc0ludGVyYWN0aXZlKHRhcmdldCkpIHJldHVybjtcbiAgICBpZiAoIXRoaXMudHJ5RW1pdChub3cpKSByZXR1cm47XG5cbiAgICB0aGlzLnNhZmVUcmFjayhcIiRkZWFkX2NsaWNrXCIsIHtcbiAgICAgIHRhcmdldDogdGFyZ2V0U2VsZWN0b3IodGFyZ2V0KSxcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgICAgcGF0aDogdHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiID8gbG9jYXRpb24ucGF0aG5hbWUgOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnlFbWl0KG5vdzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKG5vdyAtIHRoaXMuZW1pdHNTZWNvbmRTdGFydGVkQXQgPj0gMTAwMCkge1xuICAgICAgdGhpcy5lbWl0c1NlY29uZFN0YXJ0ZWRBdCA9IG5vdztcbiAgICAgIHRoaXMuZW1pdHNUaGlzU2Vjb25kID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW1pdHNUaGlzU2Vjb25kID49IHRoaXMuY2ZnLm1heEVtaXRzUGVyU2VjKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5lbWl0c1RoaXNTZWNvbmQgKz0gMTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2FmZVRyYWNrKG5hbWU6IHN0cmluZywgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy50cmFjayhuYW1lLCBwcm9wZXJ0aWVzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJjbGljay1mcnVzdHJhdGlvbiB0cmFjaygpIHRocmV3XCIsIGVycik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUoZWw6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgbGV0IGN1cjogRWxlbWVudCB8IG51bGwgPSBlbDtcbiAgbGV0IGRlcHRoID0gMDtcbiAgd2hpbGUgKGN1ciAmJiBkZXB0aCA8IDgpIHtcbiAgICBpZiAoSU5URVJBQ1RJVkVfVEFHUy5oYXMoY3VyLnRhZ05hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCByb2xlID0gY3VyLmdldEF0dHJpYnV0ZShcInJvbGVcIik7XG4gICAgaWYgKHJvbGUgJiYgL14oYnV0dG9ufGxpbmt8dGFifHN3aXRjaHxjaGVja2JveHxyYWRpb3xtZW51aXRlbXxvcHRpb24pJC8udGVzdChyb2xlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjdXIuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHJldHVybiB0cnVlO1xuICAgIGlmIChjdXIuaGFzQXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VyLmhhc0F0dHJpYnV0ZShcImRhdGEtY2xpY2thYmxlXCIpKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXIgPSBjdXIucGFyZW50RWxlbWVudDtcbiAgICBkZXB0aCArPSAxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdGFyZ2V0U2VsZWN0b3IoZWw6IEVsZW1lbnQpOiBzdHJpbmcge1xuICBjb25zdCB0YWcgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGlkID0gZWwuaWQgPyBgIyR7ZWwuaWR9YCA6IFwiXCI7XG4gIGNvbnN0IGNsYXNzZXMgPVxuICAgIGVsLmNsYXNzTGlzdC5sZW5ndGggPiAwID8gYC4ke0FycmF5LmZyb20oZWwuY2xhc3NMaXN0KS5zbGljZSgwLCAzKS5qb2luKFwiLlwiKX1gIDogXCJcIjtcbiAgcmV0dXJuIGAke3RhZ30ke2lkfSR7Y2xhc3Nlc31gLnNsaWNlKDAsIDEyMCk7XG59XG4iLCIvKipcbiAqIEF1ZGl0IEUtMDEwIOKAlCBvbmUtcGFzcyBtaWdyYXRpb24gZm9yIHRoZSBMYXVuY2hQYWQg4oaSIEdvYVRlY2ggc3RvcmFnZVxuICoga2V5IHJlbmFtZS4gUnVucyBvbmNlIGF0IFNESyBpbml0LiBGb3IgZXZlcnkgYGd0XypgIGtleSB0aGF0J3MgZW1wdHlcbiAqIGJ1dCBoYXMgYSBwb3B1bGF0ZWQgYGxwXypgIGxlZ2FjeSBzaWJsaW5nLCBjb3B5IHRoZSB2YWx1ZSBhY3Jvc3Mgc29cbiAqIGV4aXN0aW5nIHVzZXJzIGRvbid0IGxvc2UgdGhlaXIgZGV2aWNlIGlkLCBpZGVudGl0eSwgb2ZmbGluZSBldmVudFxuICogcXVldWUsIGF0dHJpYnV0aW9uLCBvciBleHBlcmltZW50IGFzc2lnbm1lbnRzLlxuICpcbiAqIElkZW1wb3RlbnQ6IGEgbWFya2VyIGtleSAoYGd0X3N0b3JhZ2VfbWlncmF0aW9uX3YxYCkgcmVjb3JkcyB0aGUgcnVuXG4gKiBzbyBzdWJzZXF1ZW50IGluaXRzIHNraXAgdGhlIHdvcmsuIFNhZmUgdG8gcmUtcnVuIHdpdGggbm8gc2lkZVxuICogZWZmZWN0cyBpZiB0aGUgbWFya2VyIGlzIHdpcGVkLlxuICpcbiAqIERlZmVuc2l2ZTogZXZlcnkgc3RvcmFnZSBjYWxsIGlzIHdyYXBwZWQg4oCUIFNhZmFyaSBQcml2YXRlIE1vZGUsIGxvd1xuICogZGlzaywgYW5kIHN0b3JhZ2UtcXVvdGEgRE9NRXhjZXB0aW9ucyBkb24ndCBhYm9ydCBTREsgaW5pdC5cbiAqXG4gKiBUaGUgbGVnYWN5IGBscF8qYCBzdHJpbmdzIGxpdmUgT05MWSBpbiB0aGlzIGZpbGUuIENvbnN1bWVycyBhbHdheXNcbiAqIGltcG9ydCBgU1RPUkFHRV9LRVlTLjxuYW1lPmAgZnJvbSBgZGVmYXVsdHMudHNgLlxuICovXG5cbmNvbnN0IE1JR1JBVElPTl9NQVJLRVJfS0VZID0gXCJndF9zdG9yYWdlX21pZ3JhdGlvbl92MVwiO1xuY29uc3QgTUlHUkFUSU9OX01BUktFUl9WQUxVRSA9IFwiZG9uZVwiO1xuXG5pbnRlcmZhY2UgS2V5TWlncmF0aW9uIHtcbiAgcmVhZG9ubHkgc3RvcmFnZTogXCJsb2NhbFwiIHwgXCJzZXNzaW9uXCI7XG4gIHJlYWRvbmx5IGxlZ2FjeTogc3RyaW5nO1xuICByZWFkb25seSBjdXJyZW50OiBzdHJpbmc7XG59XG5cbmNvbnN0IEtFWV9NQVA6IHJlYWRvbmx5IEtleU1pZ3JhdGlvbltdID0gW1xuICB7IHN0b3JhZ2U6IFwibG9jYWxcIiwgbGVnYWN5OiBcImxwX2RldmljZV9pZFwiLCBjdXJyZW50OiBcImd0X2RldmljZV9pZFwiIH0sXG4gIHsgc3RvcmFnZTogXCJsb2NhbFwiLCBsZWdhY3k6IFwibHBfYW5vbnltb3VzX2lkXCIsIGN1cnJlbnQ6IFwiZ3RfYW5vbnltb3VzX2lkXCIgfSxcbiAgeyBzdG9yYWdlOiBcImxvY2FsXCIsIGxlZ2FjeTogXCJscF9pZGVudGl0eVwiLCBjdXJyZW50OiBcImd0X2lkZW50aXR5XCIgfSxcbiAgeyBzdG9yYWdlOiBcImxvY2FsXCIsIGxlZ2FjeTogXCJscF9jb25maWdcIiwgY3VycmVudDogXCJndF9jb25maWdcIiB9LFxuICB7IHN0b3JhZ2U6IFwibG9jYWxcIiwgbGVnYWN5OiBcImxwX29mZmxpbmVfcXVldWVcIiwgY3VycmVudDogXCJndF9vZmZsaW5lX3F1ZXVlXCIgfSxcbiAgeyBzdG9yYWdlOiBcImxvY2FsXCIsIGxlZ2FjeTogXCJscF9leHBfYXNzaWdubWVudHNcIiwgY3VycmVudDogXCJndF9leHBfYXNzaWdubWVudHNcIiB9LFxuICB7IHN0b3JhZ2U6IFwibG9jYWxcIiwgbGVnYWN5OiBcImxwX2ZpcnN0X3RvdWNoXCIsIGN1cnJlbnQ6IFwiZ3RfZmlyc3RfdG91Y2hcIiB9LFxuICB7IHN0b3JhZ2U6IFwic2Vzc2lvblwiLCBsZWdhY3k6IFwibHBfc2Vzc2lvbl9pZFwiLCBjdXJyZW50OiBcImd0X3Nlc3Npb25faWRcIiB9LFxuICB7IHN0b3JhZ2U6IFwic2Vzc2lvblwiLCBsZWdhY3k6IFwibHBfc2Vzc2lvbl9sYXN0X3NlZW5cIiwgY3VycmVudDogXCJndF9zZXNzaW9uX2xhc3Rfc2VlblwiIH0sXG4gIHsgc3RvcmFnZTogXCJzZXNzaW9uXCIsIGxlZ2FjeTogXCJscF9zZXNzaW9uX2F0dHJpYnV0aW9uXCIsIGN1cnJlbnQ6IFwiZ3Rfc2Vzc2lvbl9hdHRyaWJ1dGlvblwiIH0sXG5dO1xuXG5mdW5jdGlvbiBzYWZlR2V0KHN0b3JlOiBTdG9yYWdlLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICB0cnkge1xuICAgIHJldHVybiBzdG9yZS5nZXRJdGVtKGtleSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVTZXQoc3RvcmU6IFN0b3JhZ2UsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgc3RvcmUuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgLyogc3dhbGxvdyDigJQgcXVvdGEgZXhjZWVkZWQgLyBwcml2YXRlIG1vZGUgLyBldGMuICovXG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZVJlbW92ZShzdG9yZTogU3RvcmFnZSwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBzdG9yZS5yZW1vdmVJdGVtKGtleSk7XG4gIH0gY2F0Y2gge1xuICAgIC8qIHN3YWxsb3cgKi9cbiAgfVxufVxuXG4vKipcbiAqIE1pZ3JhdGUgYGxwXypgIOKGkiBgZ3RfKmAgb25jZS4gTm8tb3Agb3V0c2lkZSB0aGUgYnJvd3Nlciwgbm8tb3Agd2hlblxuICogdGhlIG1hcmtlciBpcyBzZXQuIFB1YmxpYyBzbyB0ZXN0cyArIGZ1dHVyZSBtaWdyYXRpb25zIGNhbiBzdHViLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWlncmF0ZUxlZ2FjeVN0b3JhZ2VLZXlzKCk6IHZvaWQge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICBjb25zdCBsb2NhbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIGNvbnN0IHNlc3Npb24gPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2U7XG4gIGlmICghbG9jYWwgfHwgIXNlc3Npb24pIHJldHVybjtcblxuICAvLyBJZGVtcG90ZW5jeSBtYXJrZXIg4oCUIHJlYWQgZnJvbSBsb2NhbFN0b3JhZ2UgKHN0aWNreSBhY3Jvc3MgdGFicykuXG4gIGlmIChzYWZlR2V0KGxvY2FsLCBNSUdSQVRJT05fTUFSS0VSX0tFWSkgPT09IE1JR1JBVElPTl9NQVJLRVJfVkFMVUUpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIEtFWV9NQVApIHtcbiAgICBjb25zdCBzdG9yZSA9IGVudHJ5LnN0b3JhZ2UgPT09IFwibG9jYWxcIiA/IGxvY2FsIDogc2Vzc2lvbjtcbiAgICBjb25zdCBleGlzdGluZyA9IHNhZmVHZXQoc3RvcmUsIGVudHJ5LmN1cnJlbnQpO1xuICAgIGlmIChleGlzdGluZyAhPT0gbnVsbCkgY29udGludWU7IC8vIGFscmVhZHkgbWlncmF0ZWQgb3IgZnJlc2hseS13cml0dGVuXG4gICAgY29uc3QgbGVnYWN5ID0gc2FmZUdldChzdG9yZSwgZW50cnkubGVnYWN5KTtcbiAgICBpZiAobGVnYWN5ID09PSBudWxsKSBjb250aW51ZTtcbiAgICBzYWZlU2V0KHN0b3JlLCBlbnRyeS5jdXJyZW50LCBsZWdhY3kpO1xuICAgIC8vIFJlbW92ZSB0aGUgbGVnYWN5IGtleSBzbyBEZXZUb29scyBzaG93cyBhIGNsZWFuIFwiZ3RfKlwiIHN1cmZhY2UuXG4gICAgLy8gU2FmZTogdGhlIG5ldyBrZXkgaG9sZHMgdGhlIHZhbHVlOyBub3RoaW5nIGVsc2UgcmVhZHMgYGxwXypgIGFmdGVyXG4gICAgLy8gdGhpcyBwb2ludC5cbiAgICBzYWZlUmVtb3ZlKHN0b3JlLCBlbnRyeS5sZWdhY3kpO1xuICB9XG5cbiAgc2FmZVNldChsb2NhbCwgTUlHUkFUSU9OX01BUktFUl9LRVksIE1JR1JBVElPTl9NQVJLRVJfVkFMVUUpO1xufVxuIiwiaW1wb3J0IHsgREVGQVVMVFMsIEVWRU5UX05BTUVfTUFYX0xFTkdUSCwgU0RLX1ZFUlNJT04gfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5pbXBvcnQgeyBEaWFnbm9zdGljQnVzIH0gZnJvbSBcIi4vZGlhZ25vc3RpYy1idXMuanNcIjtcbmltcG9ydCB7IENvbnRleHRNYW5hZ2VyIH0gZnJvbSBcIi4vY29udGV4dC5qc1wiO1xuaW1wb3J0IHsgRXZlbnRRdWV1ZSB9IGZyb20gXCIuL3F1ZXVlLmpzXCI7XG5pbXBvcnQgeyBGbGFnTWFuYWdlciB9IGZyb20gXCIuL2ZsYWdzLmpzXCI7XG5pbXBvcnQgeyBFeHBlcmltZW50TWFuYWdlciB9IGZyb20gXCIuL2V4cGVyaW1lbnRzLmpzXCI7XG5pbXBvcnQgeyBJZGVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHsgQ29uZmlnU3luYyB9IGZyb20gXCIuL2NvbmZpZy1zeW5jLmpzXCI7XG5pbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tIFwiLi90cmFuc3BvcnQuanNcIjtcbmltcG9ydCB7IE9mZmxpbmVRdWV1ZSB9IGZyb20gXCIuL29mZmxpbmUuanNcIjtcbmltcG9ydCB7IENvbm5lY3Rpdml0eU1vbml0b3IgfSBmcm9tIFwiLi9jb25uZWN0aXZpdHkuanNcIjtcbmltcG9ydCB7IExpZmVjeWNsZU1hbmFnZXIgfSBmcm9tIFwiLi9saWZlY3ljbGUuanNcIjtcbmltcG9ydCB7IEJyb3dzZXJFcnJvckNhcHR1cmUgfSBmcm9tIFwiLi9lcnJvci1jYXB0dXJlLmpzXCI7XG5pbXBvcnQgeyBIdHRwRXJyb3JDYXB0dXJlIH0gZnJvbSBcIi4vaHR0cC1lcnJvci1jYXB0dXJlLmpzXCI7XG5pbXBvcnQgeyBDbGlja0ZydXN0cmF0aW9uQ2FwdHVyZSB9IGZyb20gXCIuL2NsaWNrLWZydXN0cmF0aW9uLmpzXCI7XG5pbXBvcnQgeyBtaWdyYXRlTGVnYWN5U3RvcmFnZUtleXMgfSBmcm9tIFwiLi9zdG9yYWdlLW1pZ3JhdGlvbi5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RGV2aWNlSWQsXG4gIHNldERldmljZUlkLFxuICBnZXREZXZpY2VJbmZvLFxuICBnZW5lcmF0ZUFub255bW91c0lkLFxuICByZWdpc3RlckRldmljZSxcbn0gZnJvbSBcIi4vZGV2aWNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IERpYWdub3N0aWNFdmVudCB9IGZyb20gXCIuL2RpYWdub3N0aWNzLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEdvYVRlY2hDb25maWcsXG4gIFJlc29sdmVkQ29uZmlnLFxuICBGbGFnVmFsdWUsXG4gIEV4cGVyaW1lbnRSZXN1bHQsXG4gIFNES1N0YXR1cyxcbiAgU0RLQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJR29hVGVjaCB9IGZyb20gXCIuL2ludGVyZmFjZXMuanNcIjtcblxuZXhwb3J0IGNsYXNzIEdvYVRlY2ggaW1wbGVtZW50cyBJR29hVGVjaCB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBHb2FUZWNoIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjZmc6IFJlc29sdmVkQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1czogRGlhZ25vc3RpY0J1cztcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBDb250ZXh0TWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWV1ZTogRXZlbnRRdWV1ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbGFnTWFuYWdlcjogRmxhZ01hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhwZXJpbWVudE1hbmFnZXI6IEV4cGVyaW1lbnRNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGlkZW50aXR5TWFuYWdlcjogSWRlbnRpdHlNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1N5bmM6IENvbmZpZ1N5bmM7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNwb3J0OiBUcmFuc3BvcnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2ZmbGluZVF1ZXVlOiBPZmZsaW5lUXVldWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGl2aXR5OiBDb25uZWN0aXZpdHlNb25pdG9yO1xuICBwcml2YXRlIHJlYWRvbmx5IGxpZmVjeWNsZTogTGlmZWN5Y2xlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBlcnJvckNhcHR1cmU6IEJyb3dzZXJFcnJvckNhcHR1cmUgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGh0dHBFcnJvckNhcHR1cmU6IEh0dHBFcnJvckNhcHR1cmUgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWNrRnJ1c3RyYXRpb25DYXB0dXJlOiBDbGlja0ZydXN0cmF0aW9uQ2FwdHVyZSB8IG51bGw7XG5cbiAgcHJpdmF0ZSBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGNvbmZpZzogUmVzb2x2ZWRDb25maWcsIGxvZzogTG9nZ2VyLCBidXM6IERpYWdub3N0aWNCdXMpIHtcbiAgICB0aGlzLmNmZyA9IGNvbmZpZztcbiAgICB0aGlzLmxvZyA9IGxvZztcbiAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICB0aGlzLmNvbnRleHQgPSBuZXcgQ29udGV4dE1hbmFnZXIoKTtcbiAgICB0aGlzLnF1ZXVlID0gbmV3IEV2ZW50UXVldWUoY29uZmlnLm1heFF1ZXVlU2l6ZSk7XG4gICAgdGhpcy5mbGFnTWFuYWdlciA9IG5ldyBGbGFnTWFuYWdlcigpO1xuICAgIHRoaXMuZmxhZ01hbmFnZXIuc2V0RGVidWdNb2RlKHRoaXMuY2ZnLmRlYnVnKTtcbiAgICB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyID0gbmV3IEV4cGVyaW1lbnRNYW5hZ2VyKCk7XG4gICAgdGhpcy5pZGVudGl0eU1hbmFnZXIgPSBuZXcgSWRlbnRpdHlNYW5hZ2VyKGxvZyk7XG4gICAgdGhpcy5vZmZsaW5lUXVldWUgPSBuZXcgT2ZmbGluZVF1ZXVlKCk7XG4gICAgdGhpcy5jb25uZWN0aXZpdHkgPSBuZXcgQ29ubmVjdGl2aXR5TW9uaXRvcigpO1xuICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3IFRyYW5zcG9ydChcbiAgICAgIGNvbmZpZy5hcGlVcmwsXG4gICAgICBjb25maWcuYXBpS2V5LFxuICAgICAgY29uZmlnLmVudmlyb25tZW50LFxuICAgICAgY29uZmlnLnJldHJ5QXR0ZW1wdHMsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdGhpcy5vZmZsaW5lUXVldWUsXG4gICAgICB0aGlzLmNvbm5lY3Rpdml0eSxcbiAgICAgIGxvZyxcbiAgICAgIGNvbmZpZy5hcHBWZXJzaW9uLFxuICAgICAge1xuICAgICAgICBnZXRTZXNzaW9uQXR0cmlidXRpb246ICgpID0+IHRoaXMuY29udGV4dC5nZXRTZXNzaW9uQXR0cmlidXRpb24oKSxcbiAgICAgICAgZ2V0Rmlyc3RUb3VjaDogKCkgPT4gdGhpcy5jb250ZXh0LmdldEZpcnN0VG91Y2goKSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVNYW5hZ2VyKHRoaXMucXVldWUsIHRoaXMudHJhbnNwb3J0LCBsb2csIChuYW1lLCBwcm9wcykgPT5cbiAgICAgIHRoaXMudHJhY2sobmFtZSwgcHJvcHMpLFxuICAgICk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5jZmcuYXV0b0NhcHR1cmVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBjYXB0dXJlQ2ZnID1cbiAgICAgICAgdHlwZW9mIHRoaXMuY2ZnLmF1dG9DYXB0dXJlRXJyb3JzID09PSBcIm9iamVjdFwiID8gdGhpcy5jZmcuYXV0b0NhcHR1cmVFcnJvcnMgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmVycm9yQ2FwdHVyZSA9IG5ldyBCcm93c2VyRXJyb3JDYXB0dXJlKFxuICAgICAgICAobmFtZSwgcHJvcHMpID0+IHRoaXMudHJhY2sobmFtZSwgcHJvcHMpLFxuICAgICAgICBsb2csXG4gICAgICAgIGNhcHR1cmVDZmcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVycm9yQ2FwdHVyZSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaXMuY2ZnLmF1dG9DYXB0dXJlSHR0cEVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGh0dHBDZmcgPVxuICAgICAgICB0eXBlb2YgdGhpcy5jZmcuYXV0b0NhcHR1cmVIdHRwRXJyb3JzID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgPyB0aGlzLmNmZy5hdXRvQ2FwdHVyZUh0dHBFcnJvcnNcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuaHR0cEVycm9yQ2FwdHVyZSA9IG5ldyBIdHRwRXJyb3JDYXB0dXJlKFxuICAgICAgICAobmFtZSwgcHJvcHMpID0+IHRoaXMudHJhY2sobmFtZSwgcHJvcHMpLFxuICAgICAgICBsb2csXG4gICAgICAgIGh0dHBDZmcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmh0dHBFcnJvckNhcHR1cmUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0aGlzLmNmZy5hdXRvQ2FwdHVyZUNsaWNrRnJ1c3RyYXRpb24gIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBjbGlja0NmZyA9XG4gICAgICAgIHR5cGVvZiB0aGlzLmNmZy5hdXRvQ2FwdHVyZUNsaWNrRnJ1c3RyYXRpb24gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICA/IHRoaXMuY2ZnLmF1dG9DYXB0dXJlQ2xpY2tGcnVzdHJhdGlvblxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jbGlja0ZydXN0cmF0aW9uQ2FwdHVyZSA9IG5ldyBDbGlja0ZydXN0cmF0aW9uQ2FwdHVyZShcbiAgICAgICAgKG5hbWUsIHByb3BzKSA9PiB0aGlzLnRyYWNrKG5hbWUsIHByb3BzKSxcbiAgICAgICAgbG9nLFxuICAgICAgICBjbGlja0NmZyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xpY2tGcnVzdHJhdGlvbkNhcHR1cmUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZ1N5bmMgPSBuZXcgQ29uZmlnU3luYyhcbiAgICAgIGNvbmZpZy5hcGlVcmwsXG4gICAgICBjb25maWcuYXBpS2V5LFxuICAgICAgY29uZmlnLmVudmlyb25tZW50LFxuICAgICAgY29uZmlnLmNvbmZpZ1JlZnJlc2hJbnRlcnZhbCxcbiAgICAgIGxvZyxcbiAgICAgIChjZmc6IFNES0NvbmZpZykgPT4gdGhpcy5hcHBseUNvbmZpZyhjZmcpLFxuICAgICk7XG4gIH1cblxuICAvLyAtLS0gU3RhdGljIEFQSSAtLS1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3LCBpbmRlcGVuZGVudCBHb2FUZWNoIGluc3RhbmNlLlxuICAgKiBUaGUgY2FsbGVyIG93bnMgdGhlIGluc3RhbmNlIGxpZmVjeWNsZSDigJQgbm8gZ2xvYmFsIHN0YXRlLlxuICAgKiBQcmVmZXJyZWQgZm9yIFJlYWN0IGFwcHMgKHBhc3MgaW5zdGFuY2UgdG8gQ29udGV4dCkuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlKGNvbmZpZzogR29hVGVjaENvbmZpZyk6IEdvYVRlY2gge1xuICAgIC8vIEF1ZGl0IEUtMDEwIOKAlCBjb3B5IGFueSBwcmUtZXhpc3RpbmcgYGxwXypgIHN0b3JhZ2UgZW50cmllcyBpbnRvXG4gICAgLy8gdGhlIG5ldyBgZ3RfKmAgc2xvdHMgYmVmb3JlIGFueSBvdGhlciBpbml0IGNvZGUgdG91Y2hlcyBzdG9yYWdlLlxuICAgIC8vIElkZW1wb3RlbnQgKyBicm93c2VyLW9ubHk7IG5vLW9wIG9uIE5vZGUgLyBzZWNvbmQgY2FsbC5cbiAgICBtaWdyYXRlTGVnYWN5U3RvcmFnZUtleXMoKTtcblxuICAgIC8vIFZhbGlkYXRlIEFQSSBrZXkgZm9ybWF0LiBPbmx5IHB1Ymxpc2hhYmxlIGtleXMgKGxwX3B1Yl8qKSBhcmUgYWNjZXB0ZWQg4oCUXG4gICAgLy8gc2VjcmV0IGtleXMgYmVsb25nIGluIEBnb2F0ZWNoL3NlcnZlciwgZGV2IGtleXMgaW4gQGdvYXRlY2gvY2xpLlxuICAgIC8vIENhbm9uaWNhbCBwYXR0ZXJuOiBwYWNrYWdlcy9zZGstYXV0aC1qcy9zcmMvYXV0aC1jbGllbnQudHMgUFVCTElTSEFCTEVfS0VZX1JFR0VYLlxuICAgIGlmICghL15scF9wdWJfW2EtejAtOV17M31fW2EtZjAtOV17NjR9JC8udGVzdChjb25maWcuYXBpS2V5KSkge1xuICAgICAgLy8gR2l2ZSBhIHRhcmdldGVkIG1lc3NhZ2UgZm9yIHRoZSB0d28gbW9zdCBjb21tb24gbWlzLWNvbmZpZ3VyYXRpb25zXG4gICAgICAvLyAocGFzdGluZyBhIHNlY3JldCBrZXksIHBhc3RpbmcgYSBkZXYga2V5KSB2cy4gYSBmdWxseS1tYWxmb3JtZWQgc3RyaW5nLlxuICAgICAgLy8gQWxsIHRocmVlIGFyZSBoYXJkIGVycm9ycyDigJQgdGhlcmUgaXMgbm8gcnVudGltZSB3aGVyZSBhIG5vbi1wdWJsaXNoYWJsZVxuICAgICAgLy8ga2V5IGlzIHNhZmUgdG8gdXNlIHdpdGggdGhpcyBTREsuXG4gICAgICBpZiAoL15scF9zZWNfLy50ZXN0KGNvbmZpZy5hcGlLZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIltHb2FUZWNoXSBTZWNyZXQga2V5cyAobHBfc2VjXyopIGNhbm5vdCBiZSB1c2VkIHdpdGggQHNoZWVwaXQtYWkvc2RrLWpzLiBcIiArXG4gICAgICAgICAgICBcIlRoaXMgU0RLIGlzIGZvciBjbGllbnQtc2lkZSAvIHB1Ymxpc2hhYmxlLWtleSB1c2UuIFwiICtcbiAgICAgICAgICAgIFwiVXNlIEBzaGVlcGl0LWFpL3NlcnZlciBmb3Igc2VydmVyLXNpZGUgY29kZS5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICgvXmxwX2Rldl8vLnRlc3QoY29uZmlnLmFwaUtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiW0dvYVRlY2hdIERldmVsb3BlciBrZXlzIChscF9kZXZfKikgY2Fubm90IGJlIHVzZWQgd2l0aCBAc2hlZXBpdC1haS9zZGstanMuIFwiICtcbiAgICAgICAgICAgIFwiRGV2IGtleXMgYXJlIGZvciBDTEkgLyBjb2RlZ2VuIHVzZSBvbmx5LiBcIiArXG4gICAgICAgICAgICBcIlVzZSBAZ29hdGVjaC9jbGkgZm9yIGRldmVsb3BlciB0b29saW5nLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0dvYVRlY2hdIEludmFsaWQgQVBJIGtleSBmb3JtYXQuIEV4cGVjdGVkIGxwX3B1Yl8uLi4gKHB1Ymxpc2hhYmxlIGtleSkuXCIpO1xuICAgIH1cbiAgICAvLyBNZXJnZSBkZWZhdWx0c1xuICAgIGNvbnN0IG1lcmdlZDogUmVzb2x2ZWRDb25maWcgPSB7XG4gICAgICBhcGlLZXk6IGNvbmZpZy5hcGlLZXksXG4gICAgICBhcGlVcmw6IGNvbmZpZy5hcGlVcmwgPz8gREVGQVVMVFMuYXBpVXJsLFxuICAgICAgZW52aXJvbm1lbnQ6IGNvbmZpZy5lbnZpcm9ubWVudCA/PyBERUZBVUxUUy5lbnZpcm9ubWVudCxcbiAgICAgIGZsdXNoSW50ZXJ2YWw6IGNvbmZpZy5mbHVzaEludGVydmFsID8/IERFRkFVTFRTLmZsdXNoSW50ZXJ2YWwsXG4gICAgICBmbHVzaFNpemU6IGNvbmZpZy5mbHVzaFNpemUgPz8gREVGQVVMVFMuZmx1c2hTaXplLFxuICAgICAgZGVidWc6IGNvbmZpZy5kZWJ1ZyA/PyBERUZBVUxUUy5kZWJ1ZyxcbiAgICAgIGNvbmZpZ1JlZnJlc2hJbnRlcnZhbDogY29uZmlnLmNvbmZpZ1JlZnJlc2hJbnRlcnZhbCA/PyBERUZBVUxUUy5jb25maWdSZWZyZXNoSW50ZXJ2YWwsXG4gICAgICBtYXhRdWV1ZVNpemU6IGNvbmZpZy5tYXhRdWV1ZVNpemUgPz8gREVGQVVMVFMubWF4UXVldWVTaXplLFxuICAgICAgcmV0cnlBdHRlbXB0czogY29uZmlnLnJldHJ5QXR0ZW1wdHMgPz8gREVGQVVMVFMucmV0cnlBdHRlbXB0cyxcbiAgICAgIG9uRXZlbnQ6IGNvbmZpZy5vbkV2ZW50LFxuICAgICAgb25EaWFnbm9zdGljOiBjb25maWcub25EaWFnbm9zdGljLFxuICAgICAgZGlhZ25vc3RpY0J1ZmZlclNpemU6IGNvbmZpZy5kaWFnbm9zdGljQnVmZmVyU2l6ZSA/PyBERUZBVUxUUy5kaWFnbm9zdGljQnVmZmVyU2l6ZSxcbiAgICAgIGF1dG9DYXB0dXJlRXJyb3JzOiBjb25maWcuYXV0b0NhcHR1cmVFcnJvcnMgPz8gdHJ1ZSxcbiAgICAgIC8vIERlZmF1bHQgT0ZGIHVudGlsIGJhdHRsZS10ZXN0ZWQgaW4gdGhlIHdpbGQuIE9wdC1pbiBmb3IgYXBwcyB0aGF0IHdhbnQgaXQuXG4gICAgICAvLyBNb25rZXktcGF0Y2hpbmcgd2luZG93LmZldGNoIGlzIHJpc2t5IOKAlCBqc2RvbSBkb2Vzbid0IGVuZm9yY2UgbmF0aXZlJ3NcbiAgICAgIC8vIGB0aGlzID09PSB3aW5kb3dgIGNvbnRyYWN0LCBzbyB1bml0IHRlc3RzIGNhbiBtaXNzIHJlYWwtYnJvd3NlciBidWdzLlxuICAgICAgYXV0b0NhcHR1cmVIdHRwRXJyb3JzOiBjb25maWcuYXV0b0NhcHR1cmVIdHRwRXJyb3JzID8/IGZhbHNlLFxuICAgICAgYXV0b0NhcHR1cmVDbGlja0ZydXN0cmF0aW9uOiBjb25maWcuYXV0b0NhcHR1cmVDbGlja0ZydXN0cmF0aW9uID8/IHRydWUsXG4gICAgICBhcHBWZXJzaW9uOiBjb25maWcuYXBwVmVyc2lvbiA/PyBudWxsLFxuICAgIH07XG4gICAgY29uc3QgYnVzID0gbmV3IERpYWdub3N0aWNCdXMobWVyZ2VkLmRpYWdub3N0aWNCdWZmZXJTaXplKTtcbiAgICBpZiAobWVyZ2VkLm9uRGlhZ25vc3RpYykge1xuICAgICAgYnVzLnN1YnNjcmliZShtZXJnZWQub25EaWFnbm9zdGljKTtcbiAgICB9XG4gICAgY29uc3QgbG9nID0gbmV3IExvZ2dlcihtZXJnZWQuZGVidWcsIGJ1cyk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgR29hVGVjaChtZXJnZWQsIGxvZywgYnVzKTtcbiAgICBpbnN0YW5jZS5zdGFydCgpO1xuICAgIGxvZy5kaWFnbm9zdGljKFwiaW5mb1wiLCBcImxpZmVjeWNsZVwiLCBcImxpZmVjeWNsZS5pbml0X29rXCIsIFwiU0RLIGluaXRpYWxpemVkXCIsIHtcbiAgICAgIGVudmlyb25tZW50OiBtZXJnZWQuZW52aXJvbm1lbnQsXG4gICAgICBhcGlVcmw6IG1lcmdlZC5hcGlVcmwsXG4gICAgfSk7XG4gICAgbG9nLmRlYnVnKFwiSW5pdGlhbGl6ZWRcIiwge1xuICAgICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LnNsaWNlKDAsIDEwKSArIFwiLi4uXCIsXG4gICAgICBlbnZpcm9ubWVudDogbWVyZ2VkLmVudmlyb25tZW50LFxuICAgICAgYXBpVXJsOiBtZXJnZWQuYXBpVXJsLFxuICAgIH0pO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzaW5nbGV0b24gaW5zdGFuY2UuIFJldHVybnMgZXhpc3RpbmcgaW5zdGFuY2UgaWYgYWxyZWFkeVxuICAgKiBpbml0aWFsaXplZCAobG9ncyBhIHdhcm5pbmcpLiBDYWxsIGBkZXN0cm95KClgIGZpcnN0IHRvIHJlLWluaXRpYWxpemUuXG4gICAqXG4gICAqIEZvciBSZWFjdCBhcHBzLCBwcmVmZXIgYEdvYVRlY2guY3JlYXRlKClgICsgQ29udGV4dCBpbnN0ZWFkLlxuICAgKi9cbiAgc3RhdGljIGluaXQoY29uZmlnOiBHb2FUZWNoQ29uZmlnKTogR29hVGVjaCB7XG4gICAgaWYgKEdvYVRlY2guaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgIEdvYVRlY2guaW5zdGFuY2UubG9nLndhcm4oXG4gICAgICAgIFwiaW5pdCgpIGNhbGxlZCBhZnRlciBhbHJlYWR5IGluaXRpYWxpemVkLiBDYWxsIGRlc3Ryb3koKSBmaXJzdCB0byByZS1pbml0aWFsaXplLiBSZXR1cm5pbmcgZXhpc3RpbmcgaW5zdGFuY2UuXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIEdvYVRlY2guaW5zdGFuY2U7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlID0gR29hVGVjaC5jcmVhdGUoY29uZmlnKTtcbiAgICBHb2FUZWNoLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlLiBUaHJvd3MgaWYgYGluaXQoKWAgd2FzIG5ldmVyIGNhbGxlZC4gKi9cbiAgc3RhdGljIGdldEluc3RhbmNlKCk6IEdvYVRlY2gge1xuICAgIGlmIChHb2FUZWNoLmluc3RhbmNlID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbR29hVGVjaF0gTm90IGluaXRpYWxpemVkLiBDYWxsIEdvYVRlY2guaW5pdCgpIGZpcnN0LlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIEdvYVRlY2guaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzaW5nbGV0b24gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdmlhIGBpbml0KClgLlxuICAgKiBVc2VmdWwgZm9yIEhNUiBndWFyZHMgYW5kIGNvbmRpdGlvbmFsIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgc3RhdGljIGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEdvYVRlY2guaW5zdGFuY2UgIT09IG51bGw7XG4gIH1cblxuICAvLyAtLS0gSW5zdGFuY2UgQVBJIC0tLVxuXG4gIC8qKlxuICAgKiBRdWV1ZSBhbiBhbmFseXRpY3MgZXZlbnQuIEF1dG8tZmx1c2hlcyB3aGVuIHRoZSBxdWV1ZSByZWFjaGVzXG4gICAqIGBmbHVzaFNpemVgIChkZWZhdWx0IDIwKSBvciB3aGVuIHRoZSBwZXJpb2RpYyBmbHVzaCB0aW1lciBmaXJlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogZ3QudHJhY2soXCJjb3Vyc2Vfdmlld2VkXCIsIHsgY291cnNlX2lkOiBcImNfMTIzXCIsIHNvdXJjZTogXCJjYXRhbG9nXCIgfSk7XG4gICAqL1xuICB0cmFjayhldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwidHJhY2soKSBjYWxsZWQgYWZ0ZXIgZGVzdHJveSgpLiBJZ25vcmluZy5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSB2YWxpZGF0ZUV2ZW50TmFtZShldmVudE5hbWUpO1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCk7XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBldmVudF9pZDogZ2VuZXJhdGVBbm9ueW1vdXNJZCgpLFxuICAgICAgZXZlbnRfbmFtZTogbmFtZSxcbiAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IHByb3BlcnRpZXMsXG4gICAgICBkZXZpY2VfaWQ6IGN0eC5kZXZpY2VfaWQsXG4gICAgICBhbm9ueW1vdXNfaWQ6IGN0eC5hbm9ueW1vdXNfaWQsXG4gICAgICBzZXNzaW9uX2lkOiBjdHguc2Vzc2lvbl9pZCxcbiAgICAgIHVzZXJfaWQ6IGN0eC51c2VyX2lkLFxuICAgICAgcGxhdGZvcm06IGN0eC5wbGF0Zm9ybSxcbiAgICAgIGFwcF92ZXJzaW9uOiB0aGlzLmNmZy5hcHBWZXJzaW9uID8/IHVuZGVmaW5lZCxcbiAgICAgIHNka192ZXJzaW9uOiBjdHguc2RrX3ZlcnNpb24sXG4gICAgICBsb2NhbGU6IGN0eC5sb2NhbGUsXG4gICAgICB0aW1lem9uZTogY3R4LnRpbWV6b25lLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgICB0aGlzLnF1ZXVlLmFkZChldmVudCk7XG4gICAgdGhpcy5jb250ZXh0LnRvdWNoU2Vzc2lvbigpO1xuICAgIC8vIE5vdGlmeSBvbkV2ZW50IGNhbGxiYWNrICh3cmFwcGVkIHRvIHByZXZlbnQgY2FsbGVyIGVycm9ycyBmcm9tIGJyZWFraW5nIHRyYWNrKVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmNmZy5vbkV2ZW50Py4obmFtZSwgcHJvcGVydGllcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwib25FdmVudCBjYWxsYmFjayB0aHJld1wiLCBlcnIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5zaXplKCkgPj0gdGhpcy5jZmcuZmx1c2hTaXplKSB7XG4gICAgICB0aGlzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVHJhY2tlZDogJHtuYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBmZWF0dXJlIGZsYWcgZm9yIHRoZSBjdXJyZW50IGRldmljZSArIGlkZW50aXR5LiBSZWFkc1xuICAgKiB0aGUgY2FjaGVkIHNlcnZlci1ldmFsdWF0ZWQgdmFsdWUgZnJvbSBgL3YxL2NvbmZpZ2AgKHJlZnJlc2hlZCBvblxuICAgKiBgY29uZmlnUmVmcmVzaEludGVydmFsYCkuIEZpcmVzIGAkZmxhZ19leHBvc3VyZWAgb25jZSBwZXIgc2Vzc2lvblxuICAgKiBwZXIgZmxhZy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogaWYgKGd0LmZsYWcoXCJuZXdfY2hlY2tvdXRfZmxvd1wiLCBmYWxzZSkpIHtcbiAgICogICByZW5kZXJOZXdDaGVja291dCgpO1xuICAgKiB9XG4gICAqL1xuICBmbGFnKGZsYWdLZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBGbGFnVmFsdWUgPSBmYWxzZSk6IEZsYWdWYWx1ZSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwiZmxhZygpIGNhbGxlZCBhZnRlciBkZXN0cm95KCkuIFJldHVybmluZyBkZWZhdWx0LlwiKTtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZsYWdNYW5hZ2VyLmV2YWx1YXRlKFxuICAgICAgZmxhZ0tleSxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIHRoaXMuY29udGV4dC5nZXRVc2VySWQoKSxcbiAgICAgIHRoaXMuY29udGV4dC5nZXRVc2VyVHJhaXRzKCksXG4gICAgICAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLnRyYWNrKFwiJGZsYWdfZXhwb3N1cmVcIiwgeyBmbGFnX2tleToga2V5LCBmbGFnX3ZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlRmxhZyhrZXk6IHN0cmluZywgdmFsdWU6IEZsYWdWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuZmxhZ01hbmFnZXIub3ZlcnJpZGVGbGFnKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgY2xlYXJPdmVycmlkZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mbGFnTWFuYWdlci5jbGVhck92ZXJyaWRlcygpO1xuICB9XG5cbiAgZ2V0T3ZlcnJpZGVzKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5mbGFnTWFuYWdlci5nZXRPdmVycmlkZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBidWNrZXRlZCB2YXJpYW50ICsgcGF5bG9hZCBmb3IgYW4gZXhwZXJpbWVudC4gU3RpY2t5XG4gICAqIHBlciBkZXZpY2UuIEZpcmVzIGAkZXhwZXJpbWVudF9leHBvc3VyZWAgb25jZSBwZXIgc2Vzc2lvbiBwZXJcbiAgICogZXhwZXJpbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgeyB2YXJpYW50LCBwYXlsb2FkIH0gPSBndC5leHBlcmltZW50KFwiaGVyb19oMV9jb3B5X3YxXCIpO1xuICAgKiBpZiAodmFyaWFudCAhPT0gXCJjb250cm9sXCIpIHNldEhlYWRsaW5lKChwYXlsb2FkIGFzIHsgaGVhZGxpbmU6IHN0cmluZyB9KS5oZWFkbGluZSk7XG4gICAqL1xuICBleHBlcmltZW50KGV4cGVyaW1lbnRLZXk6IHN0cmluZyk6IEV4cGVyaW1lbnRSZXN1bHQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5sb2cud2FybihcImV4cGVyaW1lbnQoKSBjYWxsZWQgYWZ0ZXIgZGVzdHJveSgpLiBSZXR1cm5pbmcgY29udHJvbC5cIik7XG4gICAgICByZXR1cm4geyB2YXJpYW50OiBcImNvbnRyb2xcIiB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leHBlcmltZW50TWFuYWdlci5yZXNvbHZlKGV4cGVyaW1lbnRLZXksIChrZXksIHZhcmlhbnQpID0+IHtcbiAgICAgIHRoaXMudHJhY2soXCIkZXhwZXJpbWVudF9leHBvc3VyZVwiLCB7XG4gICAgICAgIGV4cGVyaW1lbnRfa2V5OiBrZXksXG4gICAgICAgIHZhcmlhbnQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaWUgdGhlIGN1cnJlbnQgZGV2aWNlIHRvIGEgc3RhYmxlIHVzZXIgaWQgYW5kIG1lcmdlIHRyYWl0cyBvbnRvXG4gICAqIHRoZSBHb2FUZWNoIHVzZXIgcmVjb3JkLiBSZS1pZGVudGlmeWluZyB3aXRoIGEgZGlmZmVyZW50IHVzZXJJZFxuICAgKiBjbGVhcnMgdGhlIGNhY2hlZCBleHBlcmltZW50IGFzc2lnbm1lbnRzIHNvIHRoZSBuZXcgaWRlbnRpdHlcbiAgICogZ2V0cyBmcmVzaCBidWNrZXRzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBhd2FpdCBhcGkubG9naW4oZm9ybSk7XG4gICAqIGd0LmlkZW50aWZ5KFwidXNlcl9hYmMxMjNcIiwgeyBlbWFpbDogXCJqYW5lQGV4YW1wbGUuY29tXCIsIHBsYW46IFwicHJvXCIgfSk7XG4gICAqL1xuICBpZGVudGlmeSh1c2VySWQ6IHN0cmluZywgdHJhaXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJpZGVudGlmeSgpIGNhbGxlZCBhZnRlciBkZXN0cm95KCkuIElnbm9yaW5nLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pZGVudGl0eU1hbmFnZXIuaWRlbnRpZnkodXNlcklkLCB0cmFpdHMsIHtcbiAgICAgIGdldEN1cnJlbnRVc2VySWQ6ICgpID0+IHRoaXMuY29udGV4dC5nZXRVc2VySWQoKSxcbiAgICAgIHNldFVzZXJJZDogKGlkKSA9PiB0aGlzLmNvbnRleHQuc2V0VXNlcklkKGlkKSxcbiAgICAgIHVwZGF0ZVRyYWl0czogKHQpID0+IHRoaXMuY29udGV4dC51cGRhdGVVc2VyUHJvcGVydGllcyh0KSxcbiAgICAgIHJlc2V0U2Vzc2lvbjogKCkgPT4gdGhpcy5jb250ZXh0LnJlc2V0SWRlbnRpdHkoKSxcbiAgICAgIGNsZWFyRXhwZXJpbWVudEFzc2lnbm1lbnRzOiAoKSA9PiB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyLmNsZWFyQXNzaWdubWVudHMoKSxcbiAgICAgIGZsdXNoOiAoKSA9PiB0aGlzLmZsdXNoKCksXG4gICAgICBwb3N0SWRlbnRpdHlSZXNvbHZlOiAodWlkLCBwcmV2SWQpID0+IHtcbiAgICAgICAgdGhpcy5wb3N0SWRlbnRpdHlSZXNvbHZlKHVpZCwgcHJldklkKS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXCJJZGVudGl0eSByZXNvbHZlIGZhaWxlZFwiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRm9yZ2V0IHRoZSBjdXJyZW50IGlkZW50aXR5ICsgZXhwZXJpbWVudCBhc3NpZ25tZW50cyBhbmQgc3RhcnQgYVxuICAgKiBmcmVzaCBhbm9ueW1vdXMgc2Vzc2lvbi4gQ2FsbCBvbiBsb2dvdXQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGF3YWl0IGFwaS5sb2dvdXQoKTtcbiAgICogZ3QucmVzZXQoKTtcbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuaWRlbnRpdHlNYW5hZ2VyLnJlc2V0KHtcbiAgICAgIHJlc2V0U2Vzc2lvbjogKCkgPT4gdGhpcy5jb250ZXh0LnJlc2V0SWRlbnRpdHkoKSxcbiAgICAgIGNsZWFyRXhwZXJpbWVudEFzc2lnbm1lbnRzOiAoKSA9PiB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyLmNsZWFyQXNzaWdubWVudHMoKSxcbiAgICAgIGZsdXNoOiAoKSA9PiB0aGlzLmZsdXNoKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRHJhaW4gYW55IHF1ZXVlZCBldmVudHMgdG8gdGhlIEdvYVRlY2ggaW5nZXN0IGVuZHBvaW50LiBVc2VmdWxcbiAgICogYmVmb3JlIG5hdmlnYXRpb24gaW4gc2luZ2xlLXBhZ2UgYXBwcyBhbmQgcmVxdWlyZWQgYmVmb3JlXG4gICAqIFZlcmNlbC9MYW1iZGEgZnVuY3Rpb24gZXhpdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHJvdXRlci5iZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICogICBhd2FpdCBndC5mbHVzaCgpO1xuICAgKiB9KTtcbiAgICovXG4gIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LmZsdXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IHRoZSBTREsgb2YgYSByb3V0ZSBjaGFuZ2UuIFRoZSBmaXJzdCBjYWxsIHN0YXJ0cyBhIHBhZ2UtbGVhdmVcbiAgICogdGltZXI7IHN1YnNlcXVlbnQgY2FsbHMgZW1pdCBhIHN5bnRoZXRpYyBgJHBhZ2VfbGVhdmVgIGZvciB0aGUgcHJpb3JcbiAgICogcm91dGUgKHdpdGggYGV4aXRfa2luZDogXCJzcGFfbmF2XCJgKSBiZWZvcmUgcmVzZXR0aW5nIHN0YXRlLiBXaXJlXG4gICAqIHRoaXMgaW50byB5b3VyIHJvdXRlciDigJQgZm9yIE5leHQuanMsIHVzZSBgPFBhZ2VWaWV3VHJhY2tlcj5gIGZyb21cbiAgICogYEBzaGVlcGl0LWFpL3JlYWN0YCwgd2hpY2ggY2FsbHMgdGhpcyBmb3IgeW91LlxuICAgKlxuICAgKiBJZGVtcG90ZW50IGZvciByZXBlYXQgY2FsbHMgd2l0aCB0aGUgc2FtZSBwYXRoLlxuICAgKi9cbiAgcmVjb3JkUGFnZVZpZXcocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5saWZlY3ljbGUucmVjb3JkUGFnZVZpZXcocGF0aCk7XG4gIH1cblxuICBzdGF0dXMoKTogU0RLU3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdGlhbGl6ZWQ6ICF0aGlzLmRlc3Ryb3llZCxcbiAgICAgIG9ubGluZTogdGhpcy5jb25uZWN0aXZpdHkuaXNPbmxpbmUoKSxcbiAgICAgIHF1ZXVlRGVwdGg6IHRoaXMucXVldWUuc2l6ZSgpLFxuICAgICAgb2ZmbGluZVF1ZXVlRGVwdGg6IHRoaXMub2ZmbGluZVF1ZXVlLnNpemUoKSxcbiAgICAgIGxhc3RGbHVzaEF0OiB0aGlzLnRyYW5zcG9ydC5nZXRMYXN0Rmx1c2hBdCgpLFxuICAgICAgZGV2aWNlSWQ6IHRoaXMuY29udGV4dC5nZXREZXZpY2VJZCgpLFxuICAgICAgdXNlcklkOiB0aGlzLmNvbnRleHQuZ2V0VXNlcklkKCksXG4gICAgICBmbGFnQ291bnQ6IHRoaXMuZmxhZ01hbmFnZXIuY291bnQoKSxcbiAgICAgIGV4cGVyaW1lbnRDb3VudDogdGhpcy5leHBlcmltZW50TWFuYWdlci5jb3VudCgpLFxuICAgICAgc2RrVmVyc2lvbjogU0RLX1ZFUlNJT04sXG4gICAgfTtcbiAgfVxuXG4gIGRpYWdub3N0aWNzKCk6IERpYWdub3N0aWNCdXMge1xuICAgIHJldHVybiB0aGlzLmJ1cztcbiAgfVxuXG4gIGdldFJlY2VudERpYWdub3N0aWNzKCk6IERpYWdub3N0aWNFdmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5idXMuZ2V0UmVjZW50RGlhZ25vc3RpY3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGFsbCB0aW1lcnMsIGRyYWluIHJlbWFpbmluZyBldmVudHMsIGFuZCB0ZWFyIGRvd24gYXV0by1lcnJvclxuICAgKiArIGxpZmVjeWNsZSBsaXN0ZW5lcnMuIEFmdGVyIGBkZXN0cm95KClgIGZ1cnRoZXIgYHRyYWNrKClgIC9cbiAgICogYGZsYWcoKWAgY2FsbHMgYXJlIG5vLW9wcy4gSWRlbXBvdGVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmVwbGFjaW5nIHRoZSBTREsgaW5zdGFuY2UgKHJhcmU7IHVzdWFsbHkganVzdCBjYWxsIG9uY2UpXG4gICAqIGNvbnN0IG9sZCA9IEdvYVRlY2guZ2V0SW5zdGFuY2UoKTtcbiAgICogb2xkLmRlc3Ryb3koKTtcbiAgICogY29uc3QgZnJlc2ggPSBHb2FUZWNoLmluaXQoeyBhcGlLZXk6IG5leHRLZXkgfSk7XG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQgZmx1c2hcbiAgICB0aGlzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmICh0aGlzLmZsdXNoVGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5mbHVzaFRpbWVyKTtcbiAgICAgIHRoaXMuZmx1c2hUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnU3luYy5zdG9wKCk7XG4gICAgdGhpcy5jb25uZWN0aXZpdHkuZGVzdHJveSgpO1xuICAgIHRoaXMubGlmZWN5Y2xlLmRlc3Ryb3koKTtcbiAgICB0aGlzLmVycm9yQ2FwdHVyZT8udW5pbnN0YWxsKCk7XG4gICAgdGhpcy5odHRwRXJyb3JDYXB0dXJlPy51bmluc3RhbGwoKTtcbiAgICB0aGlzLmNsaWNrRnJ1c3RyYXRpb25DYXB0dXJlPy51bmluc3RhbGwoKTtcbiAgICAvLyBPbmx5IGNsZWFyIHNpbmdsZXRvbiByZWYgaWYgdGhpcyBJUyB0aGUgc2luZ2xldG9uXG4gICAgaWYgKEdvYVRlY2guaW5zdGFuY2UgPT09IHRoaXMpIHtcbiAgICAgIEdvYVRlY2guaW5zdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kaWFnbm9zdGljKFwiaW5mb1wiLCBcImxpZmVjeWNsZVwiLCBcImxpZmVjeWNsZS5kZXN0cm95ZWRcIiwgXCJTREsgaW5zdGFuY2UgZGVzdHJveWVkXCIpO1xuICAgIHRoaXMubG9nLmRlYnVnKFwiRGVzdHJveWVkLlwiKTtcbiAgfVxuXG4gIC8vIC0tLSBQcml2YXRlIC0tLVxuXG4gIHByaXZhdGUgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gTG9hZCBzdG9yZWQgZGV2aWNlIElEXG4gICAgY29uc3QgZXhpc3RpbmdEZXZpY2VJZCA9IGdldERldmljZUlkKCk7XG4gICAgaWYgKGV4aXN0aW5nRGV2aWNlSWQpIHtcbiAgICAgIHRoaXMuY29udGV4dC5zZXREZXZpY2VJZChleGlzdGluZ0RldmljZUlkKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBjb25maWcgc3luYyAobm9uLWJsb2NraW5nIOKAlCBsb2FkcyBmcm9tIGNhY2hlIGZpcnN0LCB0aGVuIGZldGNoZXMpXG4gICAgLy8gUGFzcyBhIGdldHRlciBzbyByZWZyZXNoIGludGVydmFscyBhbHdheXMgdXNlIHRoZSBsYXRlc3QgZGV2aWNlIElEXG4gICAgdGhpcy5jb25maWdTeW5jLnN0YXJ0KCgpID0+IHRoaXMuY29udGV4dC5nZXREZXZpY2VJZCgpKTtcblxuICAgIC8vIFJlZ2lzdGVyIGRldmljZSBpZiBuZWVkZWQgKG5vbi1ibG9ja2luZylcbiAgICBpZiAoIWV4aXN0aW5nRGV2aWNlSWQpIHtcbiAgICAgIGNvbnN0IGFub255bW91c0lkID0gdGhpcy5jb250ZXh0LmdldEFub255bW91c0lkKCk7XG4gICAgICBjb25zdCBpbmZvID0gZ2V0RGV2aWNlSW5mbygpO1xuICAgICAgcmVnaXN0ZXJEZXZpY2UoXG4gICAgICAgIHRoaXMuY2ZnLmFwaVVybCxcbiAgICAgICAgdGhpcy5jZmcuYXBpS2V5LFxuICAgICAgICB0aGlzLmNmZy5lbnZpcm9ubWVudCxcbiAgICAgICAgYW5vbnltb3VzSWQsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGluZm8sXG4gICAgICApXG4gICAgICAgIC50aGVuKChkZXZpY2VJZCkgPT4ge1xuICAgICAgICAgIHNldERldmljZUlkKGRldmljZUlkKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuc2V0RGV2aWNlSWQoZGV2aWNlSWQpO1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFwiRGV2aWNlIHJlZ2lzdGVyZWRcIiwgeyBkZXZpY2VJZCB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKFwiRGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQsIHVzaW5nIGFub255bW91cyBJRFwiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBmbHVzaCB0aW1lclxuICAgIHRoaXMuZmx1c2hUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfSwgdGhpcy5jZmcuZmx1c2hJbnRlcnZhbCk7XG5cbiAgICAvLyBSZWdpc3RlciBsaWZlY3ljbGUgbGlzdGVuZXJzIChiZWZvcmV1bmxvYWQsIHBhZ2VoaWRlLCB2aXNpYmlsaXR5Y2hhbmdlKVxuICAgIHRoaXMubGlmZWN5Y2xlLnJlZ2lzdGVyKCk7XG5cbiAgICAvLyBJbnN0YWxsIGJyb3dzZXIgZXJyb3IgY2FwdHVyZSAod2luZG93Lm9uZXJyb3IsIHVuaGFuZGxlZHJlamVjdGlvbixcbiAgICAvLyBnb2F0ZWNoOmF1dGgtZXZlbnQpLiBOby1vcCBvdXRzaWRlIHRoZSBicm93c2VyIG9yIHdoZW4gZGlzYWJsZWQuXG4gICAgdGhpcy5lcnJvckNhcHR1cmU/Lmluc3RhbGwoKTtcblxuICAgIC8vIEluc3RhbGwgSFRUUCBlcnJvciBjYXB0dXJlIOKAlCB3cmFwcyB3aW5kb3cuZmV0Y2gsIGVtaXRzICRodHRwX2Vycm9yIG9uXG4gICAgLy8gZXZlcnkgNHh4LzV4eCArIG5ldHdvcmsgZmFpbHVyZS4gTm8tb3Agb3V0c2lkZSB0aGUgYnJvd3NlciAvIGRpc2FibGVkLlxuICAgIHRoaXMuaHR0cEVycm9yQ2FwdHVyZT8uaW5zdGFsbCgpO1xuXG4gICAgLy8gSW5zdGFsbCBjbGljay1mcnVzdHJhdGlvbiBjYXB0dXJlIOKAlCBlbWl0cyAkcmFnZV9jbGljayArICRkZWFkX2NsaWNrXG4gICAgLy8gd2hlbiB0aGUgdXNlciBoYW1tZXJzIHRoZSBzYW1lIHNwb3Qgb3IgY2xpY2tzIGEgbm9uLWludGVyYWN0aXZlXG4gICAgLy8gdGFyZ2V0LiBOby1vcCBvdXRzaWRlIHRoZSBicm93c2VyIC8gZGlzYWJsZWQuXG4gICAgdGhpcy5jbGlja0ZydXN0cmF0aW9uQ2FwdHVyZT8uaW5zdGFsbCgpO1xuXG4gICAgLy8gRHJhaW4gb2ZmbGluZSBxdWV1ZSB3aGVuIGJhY2sgb25saW5lXG4gICAgdGhpcy5jb25uZWN0aXZpdHkub25PbmxpbmUoKCkgPT4ge1xuICAgICAgY29uc3QgcXVldWVkID0gdGhpcy5vZmZsaW5lUXVldWUuZHJhaW4oKTtcbiAgICAgIGlmIChxdWV1ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgQmFjayBvbmxpbmUg4oCUIGZsdXNoaW5nICR7cXVldWVkLmxlbmd0aH0gb2ZmbGluZSBldmVudHMuYCk7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBxdWV1ZWQpIHRoaXMucXVldWUuYWRkKGUpO1xuICAgICAgICB0aGlzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRW1pdCBgJHNlc3Npb25fc3RhcnRgIG9uY2UgcGVyIHNlc3Npb24uIFRoZSBDb250ZXh0TWFuYWdlcidzXG4gICAgLy8gYGlzTmV3U2Vzc2lvbmAgZmxhZyBpcyB0cnVlIG9uIHRoZSBmaXJzdCBTREsgaW5pdCB3aXRoaW4gYSBuZXdcbiAgICAvLyBzZXNzaW9uIChjb2xkIHN0YXJ0LCBvciBhZnRlciB0aGUgMzAtbWluIGlkbGUgd2luZG93IHJvbGxlZCBvdmVyKS5cbiAgICAvLyBFdmVyeSBzdWJzZXF1ZW50IGV2ZW50IGFscmVhZHkgY2FycmllcyBgY29udGV4dC5hdHRyaWJ1dGlvbmAsIGJ1dFxuICAgIC8vIHRoZSBkZWRpY2F0ZWQgc3RhcnQgZXZlbnQgbWFrZXMgaXQgdHJpdmlhbCB0byBidWlsZCBmdW5uZWxzIGxpa2VcbiAgICAvLyBcInNlc3Npb25zIHRoYXQgY2FtZSBmcm9tIHV0bV9zb3VyY2U9dHdpdHRlciBhbmQgdGhlbiBzaWduZWQgdXBcIi5cbiAgICBpZiAodGhpcy5jb250ZXh0LmlzTmV3U2Vzc2lvbikge1xuICAgICAgY29uc3QgYXR0ciA9IHRoaXMuY29udGV4dC5nZXRTZXNzaW9uQXR0cmlidXRpb24oKTtcbiAgICAgIHRoaXMudHJhY2soXCIkc2Vzc2lvbl9zdGFydFwiLCBhdHRyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q29uZmlnKGNvbmZpZzogU0RLQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5mbGFnTWFuYWdlci5zZXRFdmFsdWF0ZWRGbGFncyhjb25maWcuZmxhZ3MpO1xuICAgIHRoaXMuZXhwZXJpbWVudE1hbmFnZXIuc2V0QXNzaWdubWVudHMoY29uZmlnLmV4cGVyaW1lbnRzKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcIkNvbmZpZyBhcHBsaWVkXCIsIHtcbiAgICAgIGZsYWdzOiBPYmplY3Qua2V5cyhjb25maWcuZmxhZ3MpLmxlbmd0aCxcbiAgICAgIGV4cGVyaW1lbnRzOiBPYmplY3Qua2V5cyhjb25maWcuZXhwZXJpbWVudHMpLmxlbmd0aCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcG9zdElkZW50aXR5UmVzb2x2ZSh1c2VySWQ6IHN0cmluZywgX3ByZXZpb3VzVXNlcklkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpO1xuICAgIGlmICghZGV2aWNlSWQpIHJldHVybjtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgIGAke3RoaXMuY2ZnLmFwaVVybH0vdjEvZGV2aWNlcy8ke2VuY29kZVVSSUNvbXBvbmVudChkZXZpY2VJZCl9L2lkZW50aWZ5YCxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNmZy5hcGlLZXl9YCxcbiAgICAgICAgICBcIlgtRW52aXJvbm1lbnRcIjogdGhpcy5jZmcuZW52aXJvbm1lbnQsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXNlcl9pZDogdXNlcklkIH0pLFxuICAgICAgfSxcbiAgICApO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYElkZW50aXR5IHJlc29sdmUgZmFpbGVkOiAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXZlbnROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJbR29hVGVjaF0gRXZlbnQgbmFtZSBtdXN0IG5vdCBiZSBlbXB0eS5cIik7XG4gIH1cbiAgY29uc3QgdHJpbW1lZCA9IG5hbWUudHJpbSgpLnNsaWNlKDAsIEVWRU5UX05BTUVfTUFYX0xFTkdUSCk7XG4gIHJldHVybiB0cmltbWVkLnJlcGxhY2UoL1xccysvZywgXCJfXCIpO1xufVxuIl19
|