@goatech/sdk-js 0.1.0 → 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/README.md +21 -83
- package/dist/boot-error.d.mts +1 -39
- package/dist/boot-error.d.ts +1 -39
- package/dist/boot-error.js +12 -32
- package/dist/boot-error.mjs +1 -2
- package/dist/experiments.d.mts +1 -29
- package/dist/experiments.d.ts +1 -29
- package/dist/experiments.js +12 -2
- package/dist/experiments.mjs +1 -2
- package/dist/flags.d.mts +1 -34
- package/dist/flags.d.ts +1 -34
- package/dist/flags.js +12 -2
- package/dist/flags.mjs +1 -2
- package/dist/index.d.mts +4 -170
- package/dist/index.d.ts +4 -170
- package/dist/index.js +18 -31
- package/dist/index.mjs +10 -3
- package/package.json +21 -24
- package/dist/chunk-6BNLBHZS.mjs +0 -2
- package/dist/chunk-BQTMRKY5.mjs +0 -32
- package/dist/chunk-X5MDWZGR.mjs +0 -3
- package/dist/types-CxAq_Cds.d.mts +0 -371
- package/dist/types-CxAq_Cds.d.ts +0 -371
package/dist/index.js
CHANGED
|
@@ -1,32 +1,19 @@
|
|
|
1
|
-
'use strict';var h="0.1.0",u={apiUrl:"https://api.goatech.ai",environment:"production",flushInterval:5e3,flushSize:20,debug:false,configRefreshInterval:3e5,maxQueueSize:1e3,retryAttempts:3,retryBackoff:[1e3,5e3,15e3],diagnosticBufferSize:100},a={deviceId:"gt_device_id",anonymousId:"gt_anonymous_id",identity:"gt_identity",sdkConfig:"gt_config",offlineQueue:"gt_offline_queue",sessionId:"gt_session_id",sessionLastSeen:"gt_session_last_seen",experimentAssignments:"gt_exp_assignments",sessionAttribution:"gt_session_attribution",firstTouchAttribution:"gt_first_touch"},N=1800*1e3,P=1440*60*1e3;var $=200;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,r,i,s,o){this.bus?.emit({timestamp:new Date().toISOString(),severity:e,category:t,code:r,message:i,data:s,requestId:o});}emitDiagnostic(e,t,r,i){if(!this.bus)return;let s=i.length>0?i.length===1&&typeof i[0]=="object"&&i[0]!==null?i[0]:{details:i}:void 0;this.bus.emit({timestamp:new Date().toISOString(),severity:e,category:t,code:`${t}.${e}`,message:r,data:s});}};var z={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=z[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 r of this.listeners)if(!(t<r.minSeverity)&&!(r.categories!==null&&!r.categories.includes(e.category)))try{r.fn(e);}catch{}}}subscribe(e,t){if(this.listeners.length>=100)return ()=>{};let r={fn:e,minSeverity:z[t?.minSeverity??"debug"],categories:t?.categories??null};return this.listeners.push(r),()=>{let i=this.listeners.indexOf(r);i!==-1&&this.listeners.splice(i,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(a.deviceId)}catch{return null}}function K(n){try{localStorage.setItem(a.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 H(){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 V(n,e,t,r,i,s){let o={anonymous_id:r,...{},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":h},body:JSON.stringify(o)});if(!c.ok)throw new Error(`Device registration failed: ${c.status}`);return (await c.json()).data.device_id}var q=["utm_source","utm_medium","utm_campaign","utm_content","utm_term","gclid","fbclid"];function S(){return typeof window<"u"&&typeof document<"u"}function ee(n){if(n)try{return new URL(n).hostname}catch{return}}function te(){if(!S())return;let n={};try{let t=new URLSearchParams(window.location.search);for(let r of q){let i=t.get(r);i&&(n[r]=i.slice(0,200));}}catch{}let e=document.referrer||"";if(e){n.referrer=e.slice(0,500);let t=ee(e);t&&(n.referrer_host=t);}try{n.landing_page=(window.location.pathname+window.location.search).slice(0,500);}catch{}return n}function re(n){if(!n)return false;for(let e of q)if(n[e])return true;return !!n.referrer_host}function O(){if(!S())return;try{let e=sessionStorage.getItem(a.sessionAttribution);if(e){let t=JSON.parse(e);if(t&&typeof t=="object")return t}}catch{}let n=te();if(n){try{sessionStorage.setItem(a.sessionAttribution,JSON.stringify(n));}catch{}return n}}function G(n){if(S()){try{let e=localStorage.getItem(a.firstTouchAttribution);if(e){let t=JSON.parse(e);if(t&&typeof t=="object")return t}}catch{}if(re(n)){try{localStorage.setItem(a.firstTouchAttribution,JSON.stringify(n));}catch{}return n}}}function L(){if(S())try{sessionStorage.removeItem(a.sessionAttribution);}catch{}}var E=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=O(),this.firstTouch=G(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:h,...this.sessionAttribution?{attribution:this.sessionAttribution}:{},...this.firstTouch?{first_touch:this.firstTouch}:{}}}getSessionAttribution(){return this.sessionAttribution}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(a.anonymousId,this.anonymousId),sessionStorage.setItem(a.sessionId,this.sessionId),localStorage.removeItem(a.identity);}catch{}L(),this.sessionAttribution=O();}touchSession(){try{sessionStorage.setItem(a.sessionLastSeen,Date.now().toString());}catch{}}loadOrCreateAnonymousId(){try{let e=localStorage.getItem(a.anonymousId);if(e)return e;let t=d();return localStorage.setItem(a.anonymousId,t),t}catch{return d()}}loadOrCreateSession(){try{let e=sessionStorage.getItem(a.sessionLastSeen),t=sessionStorage.getItem(a.sessionId),r=Date.now();if(t&&e&&r-parseInt(e,10)<N)return {sessionId:t,isNew:!1};let i=d();return sessionStorage.setItem(a.sessionId,i),sessionStorage.setItem(a.sessionLastSeen,r.toString()),L(),{sessionId:i,isNew:!0}}catch{return {sessionId:d(),isNew:true}}}loadIdentity(){try{let e=localStorage.getItem(a.identity);if(!e)return;let t=JSON.parse(e);this.userId=t.userId??null,this.userTraits=t.traits??{};}catch{}}};var w=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 M="lp_debug_overrides",b=class{constructor(){this.flagValues={};this.debugOverrides={};this.exposed=new Set;this.debugMode=false;}setEvaluatedFlags(e){this.flagValues=e,this.exposed.clear();}setDebugMode(e){this.debugMode=e,e&&this.loadDebugOverrides();}overrideFlag(e,t){this.debugOverrides[e]=t,this.saveDebugOverrides();}clearOverrides(){this.debugOverrides={};try{localStorage.removeItem(M);}catch{}}getOverrides(){return {...this.debugOverrides}}count(){return Object.keys(this.flagValues).length}evaluate(e,t,r,i,s){if(this.debugMode&&e in this.debugOverrides)return this.debugOverrides[e];if(e in this.flagValues){let o=this.flagValues[e];return this.exposed.has(e)||(this.exposed.add(e),s(e,o)),o}return t}clearExposed(){this.exposed.clear();}loadDebugOverrides(){try{let e=localStorage.getItem(M);e&&(this.debugOverrides=JSON.parse(e));}catch{}}saveDebugOverrides(){try{localStorage.setItem(M,JSON.stringify(this.debugOverrides));}catch{}}};var x=class{constructor(){this.assignments={};this.stickyAssignments={};this.exposed=new Set;this.loadStickyAssignments();}setAssignments(e){this.assignments=e;}count(){return Object.keys(this.assignments).length}resolve(e,t){let r=this.assignments[e];if(!r)return {variant:"control"};let i=r.variant_key;return this.stickyAssignments[e]!==i&&(this.stickyAssignments[e]=i,this.saveStickyAssignments()),this.exposed.has(e)||(this.exposed.add(e),t(e,i)),{variant:i,payload:r.payload}}clearAssignments(){this.stickyAssignments={},this.exposed.clear();try{localStorage.removeItem(a.experimentAssignments);}catch{}}loadStickyAssignments(){try{let e=localStorage.getItem(a.experimentAssignments);e&&(this.stickyAssignments=JSON.parse(e));}catch{this.stickyAssignments={};}}saveStickyAssignments(){try{localStorage.setItem(a.experimentAssignments,JSON.stringify(this.stickyAssignments));}catch{}}};var _=class{constructor(e){this.log=e;this.userId=null;this.traits={};this.loadFromStorage();}identify(e,t,r){let i=r.getCurrentUserId();if(i===e){t&&(this.traits={...this.traits,...t}),r.updateTraits(this.traits),this.persist(e,this.traits);return}let s=i;r.flush().catch(()=>{}),r.resetSession(),r.clearExperimentAssignments(),this.userId=e,this.traits=t??{},r.setUserId(e),r.updateTraits(this.traits),this.persist(e,this.traits),r.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(a.identity);}catch{}this.log.debug("Reset identity.");}getUserId(){return this.userId}loadFromStorage(){try{let e=localStorage.getItem(a.identity);if(!e)return;let t=JSON.parse(e);this.userId=t.userId??null,this.traits=t.traits??{};}catch{}}persist(e,t){let r={userId:e,traits:t,identifiedAt:new Date().toISOString()};try{localStorage.setItem(a.identity,JSON.stringify(r));}catch{}}};var I=class{constructor(e,t,r,i,s,o){this.apiUrl=e;this.apiKey=t;this.environment=r;this.refreshInterval=i;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(r=>{this.log.warn("Config fetch failed",r);}),this.timer=setInterval(()=>{this.fetchConfig(e()).catch(r=>{this.log.warn("Config refresh failed",r);});},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 r=await fetch(`${this.apiUrl}/v1/config`,{headers:t});if(r.status===304){this.log.debug("Config unchanged (304).");return}if(!r.ok)throw new Error(`Config fetch returned ${r.status}`);let i=r.headers.get("ETag");i&&(this.etag=i);let s=await r.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=localStorage.getItem(a.sdkConfig);if(!e)return null;let t=JSON.parse(e);return Date.now()-t.cachedAt>P?(this.log.debug("Cached config is stale (>24h), ignoring."),null):t}catch{return null}}saveToStorage(e){try{localStorage.setItem(a.sdkConfig,JSON.stringify({config:e,cachedAt:Date.now()}));}catch{}}};var C=class{constructor(e,t,r,i,s,o,c,g,j=null){this.apiUrl=e;this.apiKey=t;this.environment=r;this.retryAttempts=i;this.queue=s;this.offlineQueue=o;this.connectivity=c;this.log=g;this.appVersion=j;this.lastFlushAt=null;this.retryBackoff=u.retryBackoff;}getLastFlushAt(){return this.lastFlushAt}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],r={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}}:{}}:{},sent_at:new Date().toISOString()},i=JSON.stringify(r),s=`${this.apiUrl}/v1/ingest?api_key=${encodeURIComponent(this.apiKey)}&env=${encodeURIComponent(this.environment)}`;navigator.sendBeacon(s,new Blob([i],{type:"application/json"}))||this.log.warn("sendBeacon failed \u2014 events may be lost on page unload.");}async sendWithRetry(e,t){try{let{body:r,compressed:i}=await this.buildBody(e),s={Authorization:`Bearer ${this.apiKey}`,"X-Environment":this.environment,"Content-Type":"application/json"};i&&(s["Content-Encoding"]="gzip");let o=await fetch(`${this.apiUrl}/v1/ingest`,{method:"POST",headers:s,body:r});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 g of e)this.queue.add(g);return !1}if(o.status>=500)throw new Error(`Ingest 5xx: ${o.status}`);return this.log.debug(`Flushed ${e.length} events.`),!0}catch(r){if(t<this.retryAttempts-1){let i=this.retryBackoff[t]??this.retryBackoff[this.retryBackoff.length-1]??15e3;return this.log.warn(`Flush attempt ${t+1} failed, retrying in ${i}ms`,r),await ie(i),this.sendWithRetry(e,t+1)}return this.log.error("Max retries exceeded, moving to offline queue.",r),this.offlineQueue.enqueue(e),false}}async buildBody(e){let t=e[0],r={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}}:{}}:{},sent_at:new Date().toISOString()},i=JSON.stringify(r);if(i.length<1024)return {body:i,compressed:false};try{let s=new CompressionStream("gzip"),o=s.writable.getWriter(),c=new TextEncoder;return o.write(c.encode(i)),o.close(),{body:await new Response(s.readable).blob(),compressed:!0}}catch{return {body:i,compressed:false}}}};function ie(n){return new Promise(e=>setTimeout(e,n))}var k=class{enqueue(e){let i=[...this.load(),...e].slice(-500);this.save(i);}drain(){let e=this.load();return this.clear(),e}size(){return this.load().length}clear(){try{localStorage.removeItem(a.offlineQueue);}catch{}}load(){try{let e=localStorage.getItem(a.offlineQueue);return e?JSON.parse(e):[]}catch{return []}}save(e){try{localStorage.setItem(a.offlineQueue,JSON.stringify(e));}catch(t){if(t instanceof DOMException&&t.name==="QuotaExceededError"){let r=e.slice(Math.floor(e.length/2));try{localStorage.setItem(a.offlineQueue,JSON.stringify(r));}catch{}}}}};var A=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,r,i){this.queue=e;this.transport=t;this.log=r;this.emitEvent=i;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 i=this.queue.drain();i.length>0&&this.transport.flushWithBeacon(i);},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);},r=()=>{this.scrollThrottleTimer===null&&(this.scrollThrottleTimer=setTimeout(()=>{this.scrollThrottleTimer=null;let i=ne();i>this.maxScrollPct&&(this.maxScrollPct=i);},250));};window.addEventListener("pagehide",e),window.addEventListener("beforeunload",e),document.addEventListener("visibilitychange",t),window.addEventListener("scroll",r,{passive:true}),this.handlers.push(()=>window.removeEventListener("pagehide",e),()=>window.removeEventListener("beforeunload",e),()=>document.removeEventListener("visibilitychange",t),()=>window.removeEventListener("scroll",r),()=>{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 ne(){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 se={errors:true,rejections:true,authEvents:true,stackLimit:4096,dedupeWindowMs:1e3},m=class{constructor(e,t,r){this.handlers=[];this.lastSignature=null;this.lastSignatureAt=0;this.track=e,this.log=t,this.cfg={...se,...r??{}};}install(){if(typeof window>"u")return;let e=typeof navigator<"u"?navigator.userAgent:null,t=oe(e);if(this.cfg.errors){let r=i=>{let s=i.error&&i.error.stack?String(i.error.stack).slice(0,this.cfg.stackLimit):null,o=`err:${i.message}:${i.filename}:${i.lineno}`;this.suppress(o)||this.safeTrack("$error",{message:i.message,source:i.filename??null,line:i.lineno??null,col:i.colno??null,stack:s,type:"uncaught_error",browser:t,user_agent:e});};window.addEventListener("error",r),this.handlers.push(()=>window.removeEventListener("error",r));}if(this.cfg.rejections){let r=i=>{let s=i.reason,o=s instanceof Error?s.message:typeof s=="string"?s:ae(s),c=s instanceof Error&&s.stack?String(s.stack).slice(0,this.cfg.stackLimit):null,g=`rej:${o}`;this.suppress(g)||this.safeTrack("$error",{message:o,stack:c,type:"unhandled_rejection",browser:t,user_agent:e});};window.addEventListener("unhandledrejection",r),this.handlers.push(()=>window.removeEventListener("unhandledrejection",r));}if(this.cfg.authEvents){let r=i=>{let s=i.detail;s?.name&&this.safeTrack(s.name,{...s.properties??{},browser:t,user_agent:e});};window.addEventListener("goatech:auth-event",r),this.handlers.push(()=>window.removeEventListener("goatech:auth-event",r));}}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(r){this.log.warn("error capture track() threw",r);}}};function oe(n){if(!n)return "unknown";let e=/Chrome\/\d/.test(n)&&!/Edg\//.test(n),t=/Firefox\/\d/.test(n),r=/Safari\//.test(n)&&!e&&!/CriOS|FxiOS|OPR\//.test(n);return e?"chrome":t?"firefox":r?"safari":"other"}function ae(n){try{return JSON.stringify(n)??String(n)}catch{return String(n)}}var ce=["x-request-id","vary","content-type","access-control-allow-origin"],v=class{constructor(e,t,r){this.originalFetch=null;this.installed=false;this.lastSig=null;this.lastSigAt=0;this.track=e,this.log=t,this.cfg={enabled:r?.enabled??true,shouldCapture:r?.shouldCapture??(i=>i>=400),excludeUrlPatterns:r?.excludeUrlPatterns??[/\/v1\/ingest\b/,/\/v1\/config\b/],captureResponseHeaders:r?.captureResponseHeaders??ce,dedupeWindowMs:r?.dedupeWindowMs??1e3,onCapture:r?.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 r=Date.now(),i=le(e),s=(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase();try{let o=await this.originalFetch.call(window,e,t);return this.shouldSkip(i)||!this.cfg.shouldCapture(o.status)||this.emit({kind:"http_error",url:i,method:s,status:o.status,latency_ms:Date.now()-r,request_id:o.headers.get("x-request-id"),response_headers:this.pluckHeaders(o.headers),cookie_names:this.readCookieNames()}),o}catch(o){if(!this.shouldSkip(i)){let c=o instanceof Error&&o.name==="AbortError",g=o instanceof Error?o.name:"UnknownError",j=o instanceof Error?o.message:String(o);this.emit({kind:"network_failure",url:i,method:s,status:0,latency_ms:Date.now()-r,request_id:null,response_headers:{},cookie_names:this.readCookieNames(),error_name:g,error_message:j,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}`,r=Date.now();if(!(this.lastSig===t&&r-this.lastSigAt<this.cfg.dedupeWindowMs)){this.lastSig=t,this.lastSigAt=r;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(i){this.log.warn("http-error-capture track() threw",i);}if(this.cfg.onCapture)try{this.cfg.onCapture(e);}catch(i){this.log.warn("http-error-capture onCapture() threw",i);}}}pluckHeaders(e){let t={};for(let r of this.cfg.captureResponseHeaders){let i=e.get(r);i!==null&&(t[r]=i);}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 le(n){return typeof n=="string"?n:n instanceof URL?n.toString():n instanceof Request?n.url:String(n)}var ue={rage:true,dead:true,rageThreshold:3,rageWindowMs:1e3,rageRadiusPx:50,maxEmitsPerSec:5},de=new Set(["A","BUTTON","INPUT","SELECT","TEXTAREA","LABEL","SUMMARY","OPTION","DETAILS"]),R=class{constructor(e,t,r){this.handlers=[];this.recent=[];this.rageCooldownUntil=0;this.emitsThisSecond=0;this.emitsSecondStartedAt=0;this.track=e,this.log=t,this.cfg={...ue,...r??{}};}install(){if(typeof window>"u")return;let e=t=>{let r=t.target;if(!(r instanceof Element))return;let i=Date.now();this.recent.push({t:i,x:t.clientX,y:t.clientY});let s=i-this.cfg.rageWindowMs;this.recent=this.recent.filter(o=>o.t>=s),this.cfg.rage&&this.maybeEmitRage(r,i),this.cfg.dead&&this.maybeEmitDead(t,r,i);};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 r=this.recent[this.recent.length-1],i=0;for(let s of this.recent){let o=s.x-r.x,c=s.y-r.y;o*o+c*c<=this.cfg.rageRadiusPx*this.cfg.rageRadiusPx&&(i+=1);}i<this.cfg.rageThreshold||this.tryEmit(t)&&(this.rageCooldownUntil=t+this.cfg.rageWindowMs,this.safeTrack("$rage_click",{target:J(e),cluster_size:i,x:r.x,y:r.y,path:typeof location<"u"?location.pathname:null}));}maybeEmitDead(e,t,r){e.defaultPrevented||ge(t)||this.tryEmit(r)&&this.safeTrack("$dead_click",{target:J(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(r){this.log.warn("click-frustration track() threw",r);}}};function ge(n){let e=n,t=0;for(;e&&t<8;){if(de.has(e.tagName))return true;let r=e.getAttribute("role");if(r&&/^(button|link|tab|switch|checkbox|radio|menuitem|option)$/.test(r)||e.hasAttribute("tabindex")||e.hasAttribute("contenteditable")||e.hasAttribute("data-clickable"))return true;e=e.parentElement,t+=1;}return false}function J(n){let e=n.tagName.toLowerCase(),t=n.id?`#${n.id}`:"",r=n.classList.length>0?`.${Array.from(n.classList).slice(0,3).join(".")}`:"";return `${e}${t}${r}`.slice(0,120)}var W="gt_storage_migration_v1",X="done",he=[{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 fe(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,W)!==X){for(let t of he){let r=t.storage==="local"?n:e;if(U(r,t.current)!==null)continue;let s=U(r,t.legacy);s!==null&&(Y(r,t.current,s),fe(r,t.legacy));}Y(n,W,X);}}var l=class l{constructor(e,t,r){this.flushTimer=null;this.destroyed=false;if(this.cfg=e,this.log=t,this.bus=r,this.context=new E,this.queue=new w(e.maxQueueSize),this.flagManager=new b,this.flagManager.setDebugMode(this.cfg.debug),this.experimentManager=new x,this.identityManager=new _(t),this.offlineQueue=new k,this.connectivity=new A,this.transport=new C(e.apiUrl,e.apiKey,e.environment,e.retryAttempts,this.queue,this.offlineQueue,this.connectivity,t,e.appVersion),this.lifecycle=new T(this.queue,this.transport,t,(i,s)=>this.track(i,s)),typeof window<"u"&&this.cfg.autoCaptureErrors!==false){let i=typeof this.cfg.autoCaptureErrors=="object"?this.cfg.autoCaptureErrors:void 0;this.errorCapture=new m((s,o)=>this.track(s,o),t,i);}else this.errorCapture=null;if(typeof window<"u"&&this.cfg.autoCaptureHttpErrors!==false){let i=typeof this.cfg.autoCaptureHttpErrors=="object"?this.cfg.autoCaptureHttpErrors:void 0;this.httpErrorCapture=new v((s,o)=>this.track(s,o),t,i);}else this.httpErrorCapture=null;if(typeof window<"u"&&this.cfg.autoCaptureClickFrustration!==false){let i=typeof this.cfg.autoCaptureClickFrustration=="object"?this.cfg.autoCaptureClickFrustration:void 0;this.clickFrustrationCapture=new R((s,o)=>this.track(s,o),t,i);}else this.clickFrustrationCapture=null;this.configSync=new I(e.apiUrl,e.apiKey,e.environment,e.configRefreshInterval,t,i=>this.applyConfig(i));}static create(e){if(Z(),!/^lp_(pub|sec)_/.test(e.apiKey))throw new Error("[GoaTech] Invalid API key format. Expected lp_pub_... or lp_sec_...");if(e.apiKey.startsWith("lp_sec_")&&typeof window<"u")throw new Error("[GoaTech] Secret keys (lp_sec_*) must not be used in the browser. Use a publishable key (lp_pub_*) for client-side code.");let t={apiKey:e.apiKey,apiUrl:e.apiUrl??u.apiUrl,environment:e.environment??u.environment,flushInterval:e.flushInterval??u.flushInterval,flushSize:e.flushSize??u.flushSize,debug:e.debug??u.debug,configRefreshInterval:e.configRefreshInterval??u.configRefreshInterval,maxQueueSize:e.maxQueueSize??u.maxQueueSize,retryAttempts:e.retryAttempts??u.retryAttempts,onEvent:e.onEvent,onDiagnostic:e.onDiagnostic,diagnosticBufferSize:e.diagnosticBufferSize??u.diagnosticBufferSize,autoCaptureErrors:e.autoCaptureErrors??true,autoCaptureHttpErrors:e.autoCaptureHttpErrors??false,autoCaptureClickFrustration:e.autoCaptureClickFrustration??true,appVersion:e.appVersion??null},r=new f(t.diagnosticBufferSize);t.onDiagnostic&&r.subscribe(t.onDiagnostic);let i=new y(t.debug,r),s=new l(t,i,r);return s.start(),i.diagnostic("info","lifecycle","lifecycle.init_ok","SDK initialized",{environment:t.environment,apiUrl:t.apiUrl}),i.debug("Initialized",{apiKey:e.apiKey.slice(0,10)+"...",environment:t.environment,apiUrl:t.apiUrl}),s}static init(e){if(l.instance!==null)return l.instance.log.warn("init() called after already initialized. Call destroy() first to re-initialize. Returning existing instance."),l.instance;let t=l.create(e);return l.instance=t,t}static getInstance(){if(l.instance===null)throw new Error("[GoaTech] Not initialized. Call GoaTech.init() first.");return l.instance}static isInitialized(){return l.instance!==null}track(e,t){if(this.destroyed){this.log.warn("track() called after destroy(). Ignoring.");return}let r=pe(e),i=this.context.getContext(),s={event_id:d(),event_name:r,event_properties:t,device_id:i.device_id,anonymous_id:i.anonymous_id,session_id:i.session_id,user_id:i.user_id,platform:i.platform,app_version:this.cfg.appVersion??void 0,sdk_version:i.sdk_version,locale:i.locale,timezone:i.timezone,timestamp:new Date().toISOString()};this.queue.add(s),this.context.touchSession();try{this.cfg.onEvent?.(r,t);}catch(o){this.log.warn("onEvent callback threw",o);}this.queue.size()>=this.cfg.flushSize&&this.flush().catch(()=>{}),this.log.debug(`Tracked: ${r}`);}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(),(r,i)=>{this.track("$flag_exposure",{flag_key:r,flag_value:i});})}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,r)=>{this.track("$experiment_exposure",{experiment_key:t,variant:r});})}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:r=>this.context.setUserId(r),updateTraits:r=>this.context.updateUserProperties(r),resetSession:()=>this.context.resetIdentity(),clearExperimentAssignments:()=>this.experimentManager.clearAssignments(),flush:()=>this.flush(),postIdentityResolve:(r,i)=>{this.postIdentityResolve(r,i).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:h}}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(),l.instance===this&&(l.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(),r=H();V(this.cfg.apiUrl,this.cfg.apiKey,this.cfg.environment,t,null,r).then(i=>{K(i),this.context.setDeviceId(i),this.log.debug("Device registered",{deviceId:i});}).catch(i=>{this.log.warn("Device registration failed, using anonymous ID",i);});}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 r of t)this.queue.add(r);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 r=D();if(!r)return;let i=await fetch(`${this.cfg.apiUrl}/v1/devices/${encodeURIComponent(r)}/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(!i.ok)throw new Error(`Identity resolve failed: ${i.status}`)}};l.instance=null;var F=l;function pe(n){if(!n||n.trim().length===0)throw new Error("[GoaTech] Event name must not be empty.");return n.trim().slice(0,$).replace(/\s+/g,"_")}function me(n){let e=JSON.stringify(n.endpoint),t=n.stackLimit??4096;return `(function(){
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
p.source=e&&e.filename?String(e.filename):null;
|
|
19
|
-
p.line=e&&typeof e.lineno==="number"?e.lineno:null;
|
|
20
|
-
p.col=e&&typeof e.colno==="number"?e.colno:null;
|
|
21
|
-
p.stack=e&&e.error&&e.error.stack?String(e.error.stack).slice(0,${t}):null;
|
|
22
|
-
post(p);
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var sdkJs = require('@sheepit-ai/sdk-js');
|
|
4
|
+
|
|
5
|
+
// src/index.ts
|
|
6
|
+
var globals = globalThis;
|
|
7
|
+
if (!globals.__goatech_sdk_js_warned__) {
|
|
8
|
+
globals.__goatech_sdk_js_warned__ = true;
|
|
9
|
+
console.warn(
|
|
10
|
+
"@goatech/sdk-js is deprecated; rename your import to @sheepit-ai/sdk-js before 2026-11-26. See https://www.goatech.ai/docs/migrate-to-sheepit"
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
Object.keys(sdkJs).forEach(function (k) {
|
|
15
|
+
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return sdkJs[k]; }
|
|
23
18
|
});
|
|
24
|
-
|
|
25
|
-
var p=base("unhandled_rejection");
|
|
26
|
-
var r=e&&e.reason;
|
|
27
|
-
p.message=r&&r.message?String(r.message):String(r);
|
|
28
|
-
p.stack=r&&r.stack?String(r.stack).slice(0,${t}):null;
|
|
29
|
-
post(p);
|
|
30
|
-
});
|
|
31
|
-
})();`}exports.BrowserErrorCapture=m;exports.DiagnosticBus=f;exports.GoaTech=F;exports.HttpErrorCapture=v;exports.getBootErrorScript=me;//# sourceMappingURL=index.js.map
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWZhdWx0cy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvZGlhZ25vc3RpYy1idXMudHMiLCIuLi9zcmMvZGV2aWNlLnRzIiwiLi4vc3JjL2F0dHJpYnV0aW9uLnRzIiwiLi4vc3JjL2NvbnRleHQudHMiLCIuLi9zcmMvcXVldWUudHMiLCIuLi9zcmMvZmxhZ3MudHMiLCIuLi9zcmMvZXhwZXJpbWVudHMudHMiLCIuLi9zcmMvaWRlbnRpdHkudHMiLCIuLi9zcmMvY29uZmlnLXN5bmMudHMiLCIuLi9zcmMvdHJhbnNwb3J0LnRzIiwiLi4vc3JjL29mZmxpbmUudHMiLCIuLi9zcmMvY29ubmVjdGl2aXR5LnRzIiwiLi4vc3JjL2xpZmVjeWNsZS50cyIsIi4uL3NyYy9lcnJvci1jYXB0dXJlLnRzIiwiLi4vc3JjL2h0dHAtZXJyb3ItY2FwdHVyZS50cyIsIi4uL3NyYy9jbGljay1mcnVzdHJhdGlvbi50cyIsIi4uL3NyYy9zdG9yYWdlLW1pZ3JhdGlvbi50cyIsIi4uL3NyYy9jbGllbnQudHMiLCIuLi9zcmMvYm9vdC1lcnJvci50cyJdLCJuYW1lcyI6WyJTREtfVkVSU0lPTiIsIkRFRkFVTFRTIiwiU1RPUkFHRV9LRVlTIiwiU0VTU0lPTl9USU1FT1VUX01TIiwiQ09ORklHX01BWF9BR0VfTVMiLCJFVkVOVF9OQU1FX01BWF9MRU5HVEgiLCJMb2dnZXIiLCJkZWJ1ZyIsImJ1cyIsIm1lc3NhZ2UiLCJhcmdzIiwic2V2ZXJpdHkiLCJjYXRlZ29yeSIsImNvZGUiLCJkYXRhIiwicmVxdWVzdElkIiwiU0VWRVJJVFlfT1JERVIiLCJEaWFnbm9zdGljQnVzIiwiYnVmZmVyU2l6ZSIsImV2ZW50Iiwic2V2ZXJpdHlOdW0iLCJsaXN0ZW5lciIsImZuIiwib3B0aW9ucyIsImVudHJ5IiwiaWR4IiwiZ2V0RGV2aWNlSWQiLCJzZXREZXZpY2VJZCIsImlkIiwiZ2VuZXJhdGVBbm9ueW1vdXNJZCIsImMiLCJyIiwiZ2V0RGV2aWNlSW5mbyIsInJlZ2lzdGVyRGV2aWNlIiwiYXBpVXJsIiwiYXBpS2V5IiwiZW52aXJvbm1lbnQiLCJhbm9ueW1vdXNJZCIsImV4aXN0aW5nRGV2aWNlSWQiLCJpbmZvIiwiYm9keSIsInJlcyIsIlVUTV9LRVlTIiwiaXNCcm93c2VyIiwicGFyc2VSZWZlcnJlckhvc3QiLCJyZWZlcnJlciIsImNhcHR1cmVGcm9tV2luZG93Iiwib3V0IiwicGFyYW1zIiwia2V5IiwidmFsdWUiLCJob3N0IiwiaGFzQW55QXR0cmlidXRpb24iLCJhIiwiZ2V0T3JDcmVhdGVTZXNzaW9uQXR0cmlidXRpb24iLCJjYWNoZWQiLCJwYXJzZWQiLCJmcmVzaCIsImdldE9yU2VlZEZpcnN0VG91Y2giLCJjbGVhclNlc3Npb25BdHRyaWJ1dGlvbiIsIkNvbnRleHRNYW5hZ2VyIiwic2Vzc2lvbklkIiwiaXNOZXciLCJ1c2VySWQiLCJ0cmFpdHMiLCJzdG9yZWQiLCJsYXN0U2VlbiIsImV4aXN0aW5nIiwibm93IiwicmF3IiwiRXZlbnRRdWV1ZSIsIm1heFNpemUiLCJhbGwiLCJERUJVR19PVkVSUklERVNfS0VZIiwiRmxhZ01hbmFnZXIiLCJmbGFncyIsImVuYWJsZWQiLCJmbGFnS2V5IiwiZGVmYXVsdFZhbHVlIiwiX3VzZXJJZCIsIl9hdHRyaWJ1dGVzIiwib25FeHBvc3VyZSIsIkV4cGVyaW1lbnRNYW5hZ2VyIiwiYXNzaWdubWVudHMiLCJleHBlcmltZW50S2V5IiwiYXNzaWdubWVudCIsInZhcmlhbnRLZXkiLCJJZGVudGl0eU1hbmFnZXIiLCJsb2ciLCJjYWxsYmFja3MiLCJjdXJyZW50VXNlcklkIiwicHJldmlvdXNVc2VySWQiLCJwYXlsb2FkIiwiQ29uZmlnU3luYyIsInJlZnJlc2hJbnRlcnZhbCIsIm9uQ29uZmlnIiwiZXJyIiwiZGV2aWNlSWQiLCJoZWFkZXJzIiwibmV3RXRhZyIsImpzb24iLCJjb25maWciLCJUcmFuc3BvcnQiLCJyZXRyeUF0dGVtcHRzIiwicXVldWUiLCJvZmZsaW5lUXVldWUiLCJjb25uZWN0aXZpdHkiLCJhcHBWZXJzaW9uIiwiZXZlbnRzIiwiZmlyc3QiLCJlIiwidXJsIiwiYXR0ZW1wdCIsImNvbXByZXNzZWQiLCJyZXRyeUFmdGVyIiwiZGVsYXkiLCJzbGVlcCIsInN0cmVhbSIsIndyaXRlciIsImVuY29kZXIiLCJtcyIsInJlc29sdmUiLCJPZmZsaW5lUXVldWUiLCJ0cmltbWVkIiwiaGFsZiIsIkNvbm5lY3Rpdml0eU1vbml0b3IiLCJjYiIsIkxpZmVjeWNsZU1hbmFnZXIiLCJ0cmFuc3BvcnQiLCJlbWl0RXZlbnQiLCJwYXRoIiwibm93TXMiLCJvbkV4aXQiLCJvblZpc2liaWxpdHlDaGFuZ2UiLCJvblNjcm9sbCIsInBjdCIsImNvbXB1dGVTY3JvbGxQY3QiLCJyZW1vdmUiLCJleGl0S2luZCIsImN1bXVsYXRpdmVIaWRkZW4iLCJyb3VuZFRvMTAwIiwic2Nyb2xsVG9wIiwiZG9jSGVpZ2h0IiwiQnJvd3NlckVycm9yQ2FwdHVyZSIsInRyYWNrIiwidXNlckFnZW50IiwiYnJvd3NlciIsImRldGVjdEJyb3dzZXJUYWciLCJvbkVycm9yIiwic3RhY2siLCJzaWduYXR1cmUiLCJvblJlamVjdGlvbiIsInJlYXNvbiIsInNhZmVTdHJpbmdpZnkiLCJvbkF1dGhFdmVudCIsImRldGFpbCIsIm5hbWUiLCJwcm9wZXJ0aWVzIiwidWEiLCJpc0Nocm9tZSIsImlzRmlyZWZveCIsImlzU2FmYXJpIiwiREVGQVVMVF9IRUFERVJTIiwiSHR0cEVycm9yQ2FwdHVyZSIsInMiLCJpbnB1dCIsImluaXQiLCJzdGFydGVkIiwiZXh0cmFjdFVybCIsIm1ldGhvZCIsImFib3J0ZWQiLCJlcnJOYW1lIiwiZXJyTWVzc2FnZSIsInAiLCJ2IiwicGFpciIsIklOVEVSQUNUSVZFX1RBR1MiLCJDbGlja0ZydXN0cmF0aW9uQ2FwdHVyZSIsIm9uQ2xpY2siLCJ0YXJnZXQiLCJjdXRvZmYiLCJhbmNob3IiLCJjbHVzdGVyIiwiZHgiLCJkeSIsInRhcmdldFNlbGVjdG9yIiwiaXNJbnRlcmFjdGl2ZSIsImVsIiwiY3VyIiwiZGVwdGgiLCJyb2xlIiwidGFnIiwiY2xhc3NlcyIsIk1JR1JBVElPTl9NQVJLRVJfS0VZIiwiTUlHUkFUSU9OX01BUktFUl9WQUxVRSIsIktFWV9NQVAiLCJzYWZlR2V0Iiwic3RvcmUiLCJzYWZlU2V0Iiwic2FmZVJlbW92ZSIsIm1pZ3JhdGVMZWdhY3lTdG9yYWdlS2V5cyIsImxvY2FsIiwic2Vzc2lvbiIsImxlZ2FjeSIsIl9Hb2FUZWNoIiwicHJvcHMiLCJjYXB0dXJlQ2ZnIiwiaHR0cENmZyIsImNsaWNrQ2ZnIiwiY2ZnIiwibWVyZ2VkIiwiaW5zdGFuY2UiLCJldmVudE5hbWUiLCJ2YWxpZGF0ZUV2ZW50TmFtZSIsImN0eCIsInZhcmlhbnQiLCJ0IiwidWlkIiwicHJldklkIiwicXVldWVkIiwiYXR0ciIsIl9wcmV2aW91c1VzZXJJZCIsIkdvYVRlY2giLCJnZXRCb290RXJyb3JTY3JpcHQiLCJlbmRwb2ludCIsInN0YWNrTGltaXQiXSwibWFwcGluZ3MiOiJhQUFPLElBQU1BLENBQUFBLENBQWMsUUFFZEMsQ0FBQUEsQ0FBVyxDQUN0QixPQUFRLHdCQUFBLENBQ1IsV0FBQSxDQUFhLGFBQ2IsYUFBQSxDQUFlLEdBQUEsQ0FDZixVQUFXLEVBQUEsQ0FDWCxLQUFBLENBQU8sTUFDUCxxQkFBQSxDQUF1QixHQUFBLENBQ3ZCLGFBQWMsR0FBQSxDQUNkLGFBQUEsQ0FBZSxFQUNmLFlBQUEsQ0FBYyxDQUFDLElBQU0sR0FBQSxDQUFNLElBQU0sRUFDakMsb0JBQUEsQ0FBc0IsR0FDeEIsRUFlYUMsQ0FBQUEsQ0FBZSxDQUMxQixTQUFVLGNBQUEsQ0FDVixXQUFBLENBQWEsa0JBQ2IsUUFBQSxDQUFVLGFBQUEsQ0FDVixVQUFXLFdBQUEsQ0FDWCxZQUFBLENBQWMsbUJBQ2QsU0FBQSxDQUFXLGVBQUEsQ0FDWCxlQUFBLENBQWlCLHNCQUFBLENBQ2pCLHFCQUFBLENBQXVCLG9CQUFBLENBSXZCLG1CQUFvQix3QkFBQSxDQUlwQixxQkFBQSxDQUF1QixnQkFDekIsQ0FBQSxDQUVhQyxDQUFBQSxDQUFxQixLQUFVLEdBQUEsQ0FDL0JDLENBQUFBLENBQW9CLEtBQVUsRUFBQSxDQUFLLEdBQUEsQ0FHekMsSUFBTUMsRUFBd0IsR0FBQSxDQ2hEOUIsSUFBTUMsRUFBTixLQUFhLENBS2xCLFdBQUEsQ0FBWUMsQ0FBQUEsQ0FBZ0JDLENBQUFBLENBQXFCLENBSGpELEtBQWlCLE1BQUEsQ0FBUyxXQUFBLENBSXhCLEtBQUssWUFBQSxDQUFlRCxDQUFBQSxDQUNwQixLQUFLLEdBQUEsQ0FBTUMsQ0FBQUEsRUFBTyxLQUNwQixDQUVBLEtBQUEsQ0FBTUMsS0FBb0JDLENBQUFBLENBQXVCLENBQzNDLEtBQUssWUFBQSxFQUNQLE9BQUEsQ0FBUSxNQUFNLElBQUEsQ0FBSyxNQUFBLENBQVFELENBQUFBLENBQVMsR0FBR0MsQ0FBSSxDQUFBLENBRTdDLEtBQUssY0FBQSxDQUFlLE9BQUEsQ0FBUyxZQUFhRCxDQUFBQSxDQUFTQyxDQUFJLEVBQ3pELENBRUEsSUFBQSxDQUFLRCxLQUFvQkMsQ0FBQUEsQ0FBdUIsQ0FDOUMsUUFBUSxJQUFBLENBQUssSUFBQSxDQUFLLE9BQVFELENBQUFBLENBQVMsR0FBR0MsQ0FBSSxDQUFBLENBQzFDLElBQUEsQ0FBSyxjQUFBLENBQWUsTUFBQSxDQUFRLFdBQUEsQ0FBYUQsQ0FBQUEsQ0FBU0MsQ0FBSSxFQUN4RCxDQUVBLE1BQU1ELENBQUFBLENBQUFBLEdBQW9CQyxDQUFBQSxDQUF1QixDQUMvQyxPQUFBLENBQVEsS0FBQSxDQUFNLEtBQUssTUFBQSxDQUFRRCxDQUFBQSxDQUFTLEdBQUdDLENBQUksQ0FBQSxDQUMzQyxLQUFLLGNBQUEsQ0FBZSxPQUFBLENBQVMsWUFBYUQsQ0FBQUEsQ0FBU0MsQ0FBSSxFQUN6RCxDQU1BLFVBQUEsQ0FDRUMsQ0FBQUEsQ0FDQUMsRUFDQUMsQ0FBQUEsQ0FDQUosQ0FBQUEsQ0FDQUssRUFDQUMsQ0FBQUEsQ0FDTSxDQUNOLEtBQUssR0FBQSxFQUFLLElBQUEsQ0FBSyxDQUNiLFNBQUEsQ0FBVyxJQUFJLE1BQUssQ0FBRSxXQUFBLEdBQ3RCLFFBQUEsQ0FBQUosQ0FBQUEsQ0FDQSxTQUFBQyxDQUFBQSxDQUNBLElBQUEsQ0FBQUMsQ0FBQUEsQ0FDQSxPQUFBLENBQUFKLENBQUFBLENBQ0EsSUFBQSxDQUFBSyxFQUNBLFNBQUEsQ0FBQUMsQ0FDRixDQUFDLEVBQ0gsQ0FFUSxlQUNOSixDQUFBQSxDQUNBQyxDQUFBQSxDQUNBSCxFQUNBQyxDQUFBQSxDQUNNLENBQ04sR0FBSSxDQUFDLElBQUEsQ0FBSyxJQUFLLE9BQ2YsSUFBTUksRUFDSkosQ0FBQUEsQ0FBSyxNQUFBLENBQVMsQ0FBQSxDQUNWQSxDQUFBQSxDQUFLLE1BQUEsR0FBVyxDQUFBLEVBQUssT0FBT0EsQ0FBQUEsQ0FBSyxDQUFDLEdBQU0sUUFBQSxFQUFZQSxDQUFBQSxDQUFLLENBQUMsQ0FBQSxHQUFNLElBQUEsQ0FDN0RBLEVBQUssQ0FBQyxDQUFBLENBQ1AsQ0FBRSxPQUFBLENBQVNBLENBQUssRUFDbEIsTUFBQSxDQUNOLElBQUEsQ0FBSyxJQUFJLElBQUEsQ0FBSyxDQUNaLFNBQUEsQ0FBVyxJQUFJLElBQUEsRUFBSyxDQUFFLGFBQVksQ0FDbEMsUUFBQSxDQUFBQyxFQUNBLFFBQUEsQ0FBQUMsQ0FBQUEsQ0FDQSxLQUFNLENBQUEsRUFBR0EsQ0FBUSxJQUFJRCxDQUFRLENBQUEsQ0FBQSxDQUM3QixRQUFBRixDQUFBQSxDQUNBLElBQUEsQ0FBQUssQ0FDRixDQUFDLEVBQ0gsQ0FDRixDQUFBLENDaEVBLElBQU1FLENBQUFBLENBQXFELENBQ3pELEtBQUEsQ0FBTyxDQUFBLENBQ1AsS0FBTSxDQUFBLENBQ04sSUFBQSxDQUFNLEVBQ04sS0FBQSxDQUFPLENBQ1QsRUFTYUMsQ0FBQUEsQ0FBTixLQUFvQixDQWlCekIsV0FBQSxDQUFZQyxDQUFBQSxDQUFxQixJQUFxQixDQWhCdEQsSUFBQSxDQUFpQixVQUlaLEVBQUMsQ0FHTixLQUFRLFVBQUEsQ0FBYSxDQUFBLENBQ3JCLElBQUEsQ0FBUSxLQUFBLENBQVEsQ0FBQSxDQUNoQixJQUFBLENBQVEsT0FBNkMsQ0FDbkQsS0FBQSxDQUFPLEVBQ1AsSUFBQSxDQUFNLENBQUEsQ0FDTixLQUFNLENBQUEsQ0FDTixLQUFBLENBQU8sQ0FDVCxDQUFBLENBR0UsSUFBQSxDQUFLLFFBQVUsSUFBQSxDQUFLLEdBQUEsQ0FBSSxJQUFpQixJQUFBLENBQUssR0FBQSxDQUFJLEVBQUdBLENBQVUsQ0FBQyxDQUFBLENBQ2hFLElBQUEsQ0FBSyxNQUFBLENBQVMsSUFBSSxNQUF1QixJQUFBLENBQUssT0FBTyxFQUN2RCxDQUVBLElBQUEsQ0FBS0MsRUFBOEIsQ0FDakMsSUFBTUMsRUFBY0osQ0FBQUEsQ0FBZUcsQ0FBQUEsQ0FBTSxRQUFRLENBQUEsQ0FDakQsR0FBSUMsSUFBZ0IsTUFBQSxDQUVwQixDQUFBLElBQUEsQ0FBSyxPQUFPLElBQUEsQ0FBSyxVQUFVLENBQUEsQ0FBSUQsQ0FBQUEsQ0FDL0IsSUFBQSxDQUFLLFVBQUEsQ0FBQSxDQUFjLEtBQUssVUFBQSxDQUFhLENBQUEsRUFBSyxLQUFLLE9BQUEsQ0FDM0MsSUFBQSxDQUFLLE1BQVEsSUFBQSxDQUFLLE9BQUEsRUFBUyxLQUFLLEtBQUEsRUFBQSxDQUNwQyxJQUFBLENBQUssT0FBT0EsQ0FBQUEsQ0FBTSxRQUFRLElBQzFCLElBQUEsSUFBV0UsQ0FBQUEsSUFBWSxLQUFLLFNBQUEsQ0FDMUIsR0FBSSxFQUFBRCxDQUFBQSxDQUFjQyxDQUFBQSxDQUFTLFdBQUEsQ0FBQSxFQUN2QixFQUFBQSxDQUFBQSxDQUFTLFVBQUEsR0FBZSxNQUFRLENBQUNBLENBQUFBLENBQVMsV0FBVyxRQUFBLENBQVNGLENBQUFBLENBQU0sUUFBUSxDQUFBLENBQUEsQ0FDaEYsR0FBSSxDQUNGRSxDQUFBQSxDQUFTLEVBQUEsQ0FBR0YsQ0FBSyxFQUNuQixDQUFBLEtBQVEsQ0FFUixDQUFBLENBRUosQ0FFQSxTQUFBLENBQVVHLENBQUFBLENBQXdCQyxDQUFBQSxDQUF3QyxDQUN4RSxHQUFJLElBQUEsQ0FBSyxTQUFBLENBQVUsUUFBVSxHQUFBLENBQzNCLE9BQU8sSUFBTSxDQUFDLENBQUEsQ0FFaEIsSUFBTUMsQ0FBQUEsQ0FBUSxDQUNaLEdBQUFGLENBQUFBLENBQ0EsV0FBQSxDQUFhTixFQUFlTyxDQUFBQSxFQUFTLFdBQUEsRUFBZSxPQUFPLENBQUEsQ0FDM0QsVUFBQSxDQUFZQSxDQUFBQSxFQUFTLFVBQUEsRUFBYyxJQUNyQyxDQUFBLENBQ0EsWUFBSyxTQUFBLENBQVUsSUFBQSxDQUFLQyxDQUFLLENBQUEsQ0FDbEIsSUFBTSxDQUNYLElBQU1DLENBQUFBLENBQU0sS0FBSyxTQUFBLENBQVUsT0FBQSxDQUFRRCxDQUFLLENBQUEsQ0FDcENDLENBQUFBLEdBQVEsSUFBSSxJQUFBLENBQUssU0FBQSxDQUFVLE9BQU9BLENBQUFBLENBQUssQ0FBQyxFQUM5QyxDQUNGLENBRUEsc0JBQTBDLENBQ3hDLE9BQUksS0FBSyxLQUFBLEdBQVUsQ0FBQSxDQUFVLEVBQUMsQ0FDMUIsSUFBQSxDQUFLLE1BQVEsSUFBQSxDQUFLLE9BQUEsQ0FDYixLQUFLLE1BQUEsQ0FBTyxLQUFBLENBQU0sRUFBRyxJQUFBLENBQUssS0FBSyxFQUdqQyxDQUFDLEdBQUcsSUFBQSxDQUFLLE1BQUEsQ0FBTyxLQUFBLENBQU0sSUFBQSxDQUFLLFVBQVUsQ0FBQSxDQUFHLEdBQUcsS0FBSyxNQUFBLENBQU8sS0FBQSxDQUFNLEVBQUcsSUFBQSxDQUFLLFVBQVUsQ0FBQyxDQUN6RixDQUVBLFdBQWdELENBQzlDLE9BQU8sQ0FBRSxHQUFHLElBQUEsQ0FBSyxNQUFPLENBQzFCLENBQ0YsRUMzRk8sU0FBU0MsQ0FBQUEsRUFBNkIsQ0FDM0MsR0FBSSxDQUNGLE9BQU8sYUFBYSxPQUFBLENBQVF4QixDQUFBQSxDQUFhLFFBQVEsQ0FDbkQsQ0FBQSxLQUFRLENBQ04sT0FBTyxJQUNULENBQ0YsQ0FFTyxTQUFTeUIsRUFBWUMsQ0FBQUEsQ0FBa0IsQ0FDNUMsR0FBSSxDQUNGLFlBQUEsQ0FBYSxPQUFBLENBQVExQixDQUFBQSxDQUFhLFFBQUEsQ0FBVTBCLENBQUUsRUFDaEQsQ0FBQSxLQUFRLENBRVIsQ0FDRixDQUVPLFNBQVNDLEdBQThCLENBQzVDLEdBQUksQ0FDRixPQUFPLE1BQUEsQ0FBTyxZQUNoQixDQUFBLEtBQVEsQ0FFTixPQUFPLHNDQUFBLENBQXVDLFFBQVEsT0FBQSxDQUFVQyxDQUFBQSxFQUFNLENBQ3BFLElBQU1DLENBQUFBLENBQUssSUFBQSxDQUFLLFFBQU8sQ0FBSSxFQUFBLENBQU0sRUFFakMsT0FBQSxDQURVRCxDQUFBQSxHQUFNLElBQU1DLENBQUFBLENBQUtBLENBQUFBLENBQUksRUFBTyxDQUFBLEVBQzdCLFFBQUEsQ0FBUyxFQUFFLENBQ3RCLENBQUMsQ0FDSCxDQUNGLENBRU8sU0FBU0MsQ0FBQUEsRUFBNEIsQ0FDMUMsT0FBTyxDQUNMLFFBQUEsQ0FBVSxPQUFPLFVBQWMsR0FBQSxDQUFjLFNBQUEsQ0FBVSxVQUFZLEtBQUEsQ0FBUSxRQUFBLENBQzNFLFVBQVcsT0FBTyxTQUFBLENBQWMsSUFBYyxTQUFBLENBQVUsU0FBQSxDQUFZLEdBQ3BFLFFBQUEsQ0FBVSxPQUFPLFVBQWMsR0FBQSxDQUFjLFNBQUEsQ0FBVSxTQUFXLElBQUEsQ0FDbEUsV0FBQSxDQUFhLE9BQU8sTUFBQSxDQUFXLEdBQUEsQ0FBYyxNQUFBLENBQU8sTUFBUSxDQUFBLENBQzVELFlBQUEsQ0FBYyxPQUFPLE1BQUEsQ0FBVyxHQUFBLENBQWMsT0FBTyxNQUFBLENBQVMsQ0FBQSxDQUM5RCxTQUFVLElBQUEsQ0FBSyxjQUFBLEdBQWlCLGVBQUEsRUFBZ0IsQ0FBRSxRQUNwRCxDQUNGLENBRUEsZUFBc0JDLENBQUFBLENBQ3BCQyxDQUFBQSxDQUNBQyxDQUFBQSxDQUNBQyxDQUFBQSxDQUNBQyxDQUFBQSxDQUNBQyxDQUFBQSxDQUNBQyxFQUNpQixDQUNqQixJQUFNQyxFQUFPLENBQ1gsWUFBQSxDQUFjSCxFQUNkLEdBQXlELEVBQUMsQ0FDMUQsU0FBVSxLQUFBLENBQ1YsTUFBQSxDQUFRRSxFQUFLLFFBQUEsQ0FDYixRQUFBLENBQVVBLENBQUFBLENBQUssUUFDakIsQ0FBQSxDQUNNRSxDQUFBQSxDQUFNLE1BQU0sS0FBQSxDQUFNLENBQUEsRUFBR1AsQ0FBTSxDQUFBLG9CQUFBLENBQUEsQ0FBd0IsQ0FDdkQsT0FBUSxNQUFBLENBQ1IsT0FBQSxDQUFTLENBQ1AsY0FBQSxDQUFnQixrQkFBQSxDQUNoQixjQUFlLENBQUEsT0FBQSxFQUFVQyxDQUFNLEdBQy9CLGVBQUEsQ0FBaUJDLENBQUFBLENBQ2pCLGdCQUFpQnBDLENBQ25CLENBQUEsQ0FDQSxJQUFBLENBQU0sSUFBQSxDQUFLLFNBQUEsQ0FBVXdDLENBQUksQ0FDM0IsQ0FBQyxDQUFBLENBQ0QsR0FBSSxDQUFDQyxDQUFBQSxDQUFJLEdBQ1AsTUFBTSxJQUFJLE1BQU0sQ0FBQSw0QkFBQSxFQUErQkEsQ0FBQUEsQ0FBSSxNQUFNLENBQUEsQ0FBRSxDQUFBLENBRzdELFFBRGMsTUFBTUEsQ0FBQUEsQ0FBSSxNQUFLLEVBQ2pCLElBQUEsQ0FBSyxTQUNuQixDQ25EQSxJQUFNQyxDQUFBQSxDQUFXLENBQ2YsWUFBQSxDQUNBLFlBQUEsQ0FDQSxlQUNBLGFBQUEsQ0FDQSxVQUFBLENBQ0EsUUFDQSxRQUNGLENBQUEsQ0FHQSxTQUFTQyxDQUFBQSxFQUFxQixDQUM1QixPQUFPLE9BQU8sTUFBQSxDQUFXLEtBQWUsT0FBTyxRQUFBLENBQWEsR0FDOUQsQ0FFQSxTQUFTQyxFQUFBQSxDQUFrQkMsQ0FBQUEsQ0FBc0MsQ0FDL0QsR0FBS0EsRUFDTCxHQUFJLENBQ0YsT0FBTyxJQUFJLEdBQUEsQ0FBSUEsQ0FBUSxDQUFBLENBQUUsUUFDM0IsTUFBUSxDQUNOLE1BQ0YsQ0FDRixDQUdPLFNBQVNDLElBQW9ELENBQ2xFLEdBQUksQ0FBQ0gsQ0FBQUEsRUFBVSxDQUFHLE9BRWxCLElBQU1JLENBQUFBLENBQTBCLEdBQ2hDLEdBQUksQ0FDRixJQUFNQyxDQUFBQSxDQUFTLElBQUksZ0JBQWdCLE1BQUEsQ0FBTyxRQUFBLENBQVMsTUFBTSxDQUFBLENBQ3pELElBQUEsSUFBV0MsS0FBT1AsQ0FBQUEsQ0FBVSxDQUMxQixJQUFNUSxDQUFBQSxDQUFRRixDQUFBQSxDQUFPLElBQUlDLENBQUcsQ0FBQSxDQUN4QkMsQ0FBQUEsR0FBT0gsQ0FBQUEsQ0FBSUUsQ0FBYSxDQUFBLENBQUlDLEVBQU0sS0FBQSxDQUFNLENBQUEsQ0FBRyxHQUFHLENBQUEsRUFDcEQsQ0FDRixNQUFRLENBRVIsQ0FFQSxJQUFNTCxDQUFBQSxDQUFXLFFBQUEsQ0FBUyxVQUFZLEVBQUEsQ0FDdEMsR0FBSUEsRUFBVSxDQUNaRSxDQUFBQSxDQUFJLFNBQVdGLENBQUFBLENBQVMsS0FBQSxDQUFNLENBQUEsQ0FBRyxHQUFHLENBQUEsQ0FDcEMsSUFBTU0sRUFBT1AsRUFBQUEsQ0FBa0JDLENBQVEsRUFDbkNNLENBQUFBLEdBQU1KLENBQUFBLENBQUksY0FBZ0JJLENBQUFBLEVBQ2hDLENBRUEsR0FBSSxDQUNGSixDQUFBQSxDQUFJLGNBQWdCLE1BQUEsQ0FBTyxRQUFBLENBQVMsU0FBVyxNQUFBLENBQU8sUUFBQSxDQUFTLFFBQVEsS0FBQSxDQUFNLENBQUEsQ0FBRyxHQUFHLEVBQ3JGLENBQUEsS0FBUSxDQUVSLENBRUEsT0FBT0EsQ0FDVCxDQUdPLFNBQVNLLEVBQUFBLENBQWtCQyxFQUE0QyxDQUM1RSxHQUFJLENBQUNBLENBQUFBLENBQUcsT0FBTyxPQUNmLElBQUEsSUFBV0osQ0FBQUEsSUFBT1AsRUFDaEIsR0FBSVcsQ0FBQUEsQ0FBRUosQ0FBYSxDQUFBLENBQUcsT0FBTyxNQUUvQixPQUFJLENBQUEsQ0FBQUksRUFBRSxhQUVSLENBUU8sU0FBU0MsQ0FBQUEsRUFBZ0UsQ0FDOUUsR0FBSSxDQUFDWCxDQUFBQSxHQUFhLE9BRWxCLEdBQUksQ0FDRixJQUFNWSxDQUFBQSxDQUFTLGVBQWUsT0FBQSxDQUFRckQsQ0FBQUEsQ0FBYSxrQkFBa0IsQ0FBQSxDQUNyRSxHQUFJcUQsQ0FBQUEsQ0FBUSxDQUNWLElBQU1DLENBQUFBLENBQVMsS0FBSyxLQUFBLENBQU1ELENBQU0sRUFDaEMsR0FBSUMsQ0FBQUEsRUFBVSxPQUFPQSxDQUFBQSxFQUFXLFFBQUEsQ0FBVSxPQUFPQSxDQUNuRCxDQUNGLE1BQVEsQ0FFUixDQUVBLElBQU1DLENBQUFBLENBQVFYLEVBQUFBLEdBQ2QsR0FBS1csQ0FBQUEsQ0FDTCxDQUFBLEdBQUksQ0FDRixjQUFBLENBQWUsT0FBQSxDQUFRdkQsRUFBYSxrQkFBQSxDQUFvQixJQUFBLENBQUssVUFBVXVELENBQUssQ0FBQyxFQUMvRSxDQUFBLEtBQVEsQ0FFUixDQUNBLE9BQU9BLENBQUFBLENBQ1QsQ0FTTyxTQUFTQyxDQUFBQSxDQUNkRCxFQUNnQyxDQUNoQyxHQUFLZCxHQUFVLENBRWYsQ0FBQSxHQUFJLENBQ0YsSUFBTVksQ0FBQUEsQ0FBUyxZQUFBLENBQWEsUUFBUXJELENBQUFBLENBQWEscUJBQXFCLEVBQ3RFLEdBQUlxRCxDQUFBQSxDQUFRLENBQ1YsSUFBTUMsQ0FBQUEsQ0FBUyxLQUFLLEtBQUEsQ0FBTUQsQ0FBTSxFQUNoQyxHQUFJQyxDQUFBQSxFQUFVLE9BQU9BLENBQUFBLEVBQVcsUUFBQSxDQUFVLE9BQU9BLENBQ25ELENBQ0YsQ0FBQSxLQUFRLENBRVIsQ0FFQSxHQUFLSixHQUFrQkssQ0FBSyxDQUFBLENBQzVCLElBQUksQ0FDRixZQUFBLENBQWEsUUFBUXZELENBQUFBLENBQWEscUJBQUEsQ0FBdUIsS0FBSyxTQUFBLENBQVV1RCxDQUFLLENBQUMsRUFDaEYsQ0FBQSxLQUFRLENBRVIsQ0FDQSxPQUFPQSxHQUNULENBSU8sU0FBU0UsQ0FBQUEsRUFBZ0MsQ0FDOUMsR0FBS2hCLENBQUFBLEdBQ0wsR0FBSSxDQUNGLGVBQWUsVUFBQSxDQUFXekMsQ0FBQUEsQ0FBYSxrQkFBa0IsRUFDM0QsQ0FBQSxLQUFRLENBRVIsQ0FDRixDQ25KTyxJQUFNMEQsQ0FBQUEsQ0FBTixLQUFxQixDQWlCMUIsV0FBQSxFQUFjLENBaEJkLEtBQVEsTUFBQSxDQUF3QixJQUFBLENBQ2hDLElBQUEsQ0FBUSxVQUFBLENBQXNDLEVBQUMsQ0FDL0MsS0FBUSxRQUFBLENBQTBCLElBQUEsQ0FlaEMsS0FBSyxXQUFBLENBQWMsSUFBQSxDQUFLLHlCQUF3QixDQUNoRCxHQUFNLENBQUUsU0FBQSxDQUFBQyxDQUFBQSxDQUFXLE1BQUFDLENBQU0sQ0FBQSxDQUFJLEtBQUssbUJBQUEsRUFBb0IsQ0FDdEQsS0FBSyxTQUFBLENBQVlELENBQUFBLENBQ2pCLElBQUEsQ0FBSyxZQUFBLENBQWVDLENBQUFBLENBQ3BCLElBQUEsQ0FBSyxtQkFBcUJSLENBQUFBLEVBQThCLENBQ3hELEtBQUssVUFBQSxDQUFhSSxDQUFBQSxDQUFvQixLQUFLLGtCQUFrQixDQUFBLENBQzdELEtBQUssWUFBQSxHQUNQLENBRUEsVUFBQSxFQUEyQixDQUN6QixPQUFPLENBQ0wsU0FBQSxDQUFXLEtBQUssUUFBQSxFQUFZLElBQUEsQ0FBSyxXQUFBLENBQ2pDLFlBQUEsQ0FBYyxJQUFBLENBQUssV0FBQSxDQUNuQixXQUFZLElBQUEsQ0FBSyxTQUFBLENBQ2pCLFFBQVMsSUFBQSxDQUFLLE1BQUEsQ0FDZCxTQUFVLE9BQU8sU0FBQSxDQUFjLElBQWMsS0FBQSxDQUFRLFFBQUEsQ0FDckQsT0FBUSxPQUFPLFNBQUEsQ0FBYyxJQUFjLFNBQUEsQ0FBVSxRQUFBLENBQVcsS0FDaEUsUUFBQSxDQUFVLElBQUEsQ0FBSyxjQUFBLEVBQWUsQ0FBRSxlQUFBLEVBQWdCLENBQUUsU0FDbEQsV0FBQSxDQUFhMUQsQ0FBQUEsQ0FDYixHQUFJLElBQUEsQ0FBSyxrQkFBQSxDQUFxQixDQUFFLFdBQUEsQ0FBYSxJQUFBLENBQUssa0JBQW1CLENBQUEsQ0FBSSxHQUN6RSxHQUFJLElBQUEsQ0FBSyxXQUFhLENBQUUsV0FBQSxDQUFhLEtBQUssVUFBVyxDQUFBLENBQUksRUFDM0QsQ0FDRixDQU1BLHVCQUF3RCxDQUN0RCxPQUFPLEtBQUssa0JBQ2QsQ0FFQSxZQUFZNEIsQ0FBQUEsQ0FBa0IsQ0FDNUIsS0FBSyxRQUFBLENBQVdBLEVBQ2xCLENBRUEsV0FBQSxFQUE2QixDQUMzQixPQUFPLElBQUEsQ0FBSyxRQUNkLENBRUEsU0FBQSxDQUFVbUMsQ0FBQUEsQ0FBc0IsQ0FDOUIsSUFBQSxDQUFLLE1BQUEsQ0FBU0EsRUFDaEIsQ0FFQSxTQUFBLEVBQTJCLENBQ3pCLE9BQU8sSUFBQSxDQUFLLE1BQ2QsQ0FFQSxjQUFBLEVBQXlCLENBQ3ZCLE9BQU8sSUFBQSxDQUFLLFdBQ2QsQ0FFQSxvQkFBQSxDQUFxQkMsQ0FBQUEsQ0FBdUMsQ0FDMUQsSUFBQSxDQUFLLFVBQUEsQ0FBYSxDQUFFLEdBQUcsSUFBQSxDQUFLLFVBQUEsQ0FBWSxHQUFHQSxDQUFPLEVBQ3BELENBRUEsYUFBQSxFQUF5QyxDQUN2QyxPQUFPLENBQUUsR0FBRyxLQUFLLFVBQVcsQ0FDOUIsQ0FFQSxhQUFBLEVBQXNCLENBQ3BCLEtBQUssTUFBQSxDQUFTLElBQUEsQ0FDZCxLQUFLLFVBQUEsQ0FBYSxHQUNsQixJQUFBLENBQUssV0FBQSxDQUFjbkMsQ0FBQUEsRUFBb0IsQ0FDdkMsSUFBQSxDQUFLLFNBQUEsQ0FBWUEsR0FBb0IsQ0FDckMsR0FBSSxDQUNGLFlBQUEsQ0FBYSxPQUFBLENBQVEzQixFQUFhLFdBQUEsQ0FBYSxJQUFBLENBQUssV0FBVyxDQUFBLENBQy9ELGNBQUEsQ0FBZSxRQUFRQSxDQUFBQSxDQUFhLFNBQUEsQ0FBVyxLQUFLLFNBQVMsQ0FBQSxDQUM3RCxhQUFhLFVBQUEsQ0FBV0EsQ0FBQUEsQ0FBYSxRQUFRLEVBQy9DLENBQUEsS0FBUSxDQUVSLENBSUF5RCxDQUFBQSxFQUF3QixDQUN4QixLQUFLLGtCQUFBLENBQXFCTCxDQUFBQSxHQUM1QixDQUVBLFlBQUEsRUFBcUIsQ0FDbkIsR0FBSSxDQUNGLGVBQWUsT0FBQSxDQUFRcEQsQ0FBQUEsQ0FBYSxnQkFBaUIsSUFBQSxDQUFLLEdBQUEsR0FBTSxRQUFBLEVBQVUsRUFDNUUsQ0FBQSxLQUFRLENBRVIsQ0FDRixDQUVRLHVCQUFBLEVBQWtDLENBQ3hDLEdBQUksQ0FDRixJQUFNK0QsRUFBUyxZQUFBLENBQWEsT0FBQSxDQUFRL0QsRUFBYSxXQUFXLENBQUEsQ0FDNUQsR0FBSStELENBQUFBLENBQVEsT0FBT0EsRUFDbkIsSUFBTXJDLENBQUFBLENBQUtDLEdBQW9CLENBQy9CLE9BQUEsWUFBQSxDQUFhLE9BQUEsQ0FBUTNCLENBQUFBLENBQWEsV0FBQSxDQUFhMEIsQ0FBRSxFQUMxQ0EsQ0FDVCxDQUFBLEtBQVEsQ0FDTixPQUFPQyxDQUFBQSxFQUNULENBQ0YsQ0FFUSxxQkFBNkQsQ0FDbkUsR0FBSSxDQUNGLElBQU1xQyxDQUFBQSxDQUFXLGVBQWUsT0FBQSxDQUFRaEUsQ0FBQUEsQ0FBYSxlQUFlLENBQUEsQ0FDOURpRSxDQUFBQSxDQUFXLGNBQUEsQ0FBZSxPQUFBLENBQVFqRSxDQUFBQSxDQUFhLFNBQVMsRUFDeERrRSxDQUFBQSxDQUFNLElBQUEsQ0FBSyxLQUFJLENBQ3JCLEdBQUlELEdBQVlELENBQUFBLEVBQVlFLENBQUFBLENBQU0sU0FBU0YsQ0FBQUEsQ0FBVSxFQUFFLEVBQUkvRCxDQUFBQSxDQUN6RCxPQUFPLENBQUUsU0FBQSxDQUFXZ0UsQ0FBQUEsQ0FBVSxNQUFPLENBQUEsQ0FBTSxDQUFBLENBRTdDLElBQU12QyxDQUFBQSxDQUFLQyxDQUFBQSxFQUFvQixDQUMvQixzQkFBZSxPQUFBLENBQVEzQixDQUFBQSxDQUFhLFVBQVcwQixDQUFFLENBQUEsQ0FDakQsZUFBZSxPQUFBLENBQVExQixDQUFBQSxDQUFhLGdCQUFpQmtFLENBQUFBLENBQUksUUFBQSxFQUFVLENBQUEsQ0FJbkVULENBQUFBLEdBQ08sQ0FBRSxTQUFBLENBQVcvQixFQUFJLEtBQUEsQ0FBTyxDQUFBLENBQUssQ0FDdEMsQ0FBQSxLQUFRLENBQ04sT0FBTyxDQUFFLFNBQUEsQ0FBV0MsQ0FBQUEsR0FBdUIsS0FBQSxDQUFPLElBQUssQ0FDekQsQ0FDRixDQUVRLGNBQXFCLENBQzNCLEdBQUksQ0FDRixJQUFNd0MsQ0FBQUEsQ0FBTSxhQUFhLE9BQUEsQ0FBUW5FLENBQUFBLENBQWEsUUFBUSxDQUFBLENBQ3RELEdBQUksQ0FBQ21FLENBQUFBLENBQUssT0FDVixJQUFNYixFQUFTLElBQUEsQ0FBSyxLQUFBLENBQU1hLENBQUcsQ0FBQSxDQUk3QixJQUFBLENBQUssT0FBU2IsQ0FBQUEsQ0FBTyxNQUFBLEVBQVUsS0FDL0IsSUFBQSxDQUFLLFVBQUEsQ0FBYUEsRUFBTyxNQUFBLEVBQVUsR0FDckMsQ0FBQSxLQUFRLENBRVIsQ0FDRixDQUNGLENBQUEsQ0MvSk8sSUFBTWMsQ0FBQUEsQ0FBTixLQUFpQixDQUl0QixZQUFZQyxDQUFBQSxDQUFpQixDQUY3QixLQUFRLEtBQUEsQ0FBeUIsR0FHL0IsSUFBQSxDQUFLLE9BQUEsQ0FBVUEsRUFDakIsQ0FFQSxHQUFBLENBQUlwRCxFQUE0QixDQUMxQixJQUFBLENBQUssTUFBTSxNQUFBLEVBQVUsSUFBQSxDQUFLLFNBRTVCLElBQUEsQ0FBSyxLQUFBLENBQU0sS0FBQSxFQUFNLENBRW5CLElBQUEsQ0FBSyxLQUFBLENBQU0sS0FBS0EsQ0FBSyxFQUN2QixDQUVBLEtBQUEsRUFBeUIsQ0FDdkIsSUFBTXFELENBQUFBLENBQU0sSUFBQSxDQUFLLE1BQU0sS0FBQSxFQUFNLENBQzdCLFlBQUssS0FBQSxDQUFRLEdBQ05BLENBQ1QsQ0FFQSxNQUFlLENBQ2IsT0FBTyxJQUFBLENBQUssS0FBQSxDQUFNLE1BQ3BCLENBQ0YsRUN6QkEsSUFBTUMsQ0FBQUEsQ0FBc0IscUJBV2ZDLENBQUFBLENBQU4sS0FBa0IsQ0FBbEIsV0FBQSxFQUFBLENBQ0wsSUFBQSxDQUFRLFdBQXNDLEVBQUMsQ0FDL0MsS0FBUSxjQUFBLENBQTBDLEdBQ2xELElBQUEsQ0FBUSxPQUFBLENBQVUsSUFBSSxHQUFBLENBQ3RCLElBQUEsQ0FBUSxTQUFBLENBQVksTUFBQSxDQUdwQixpQkFBQSxDQUFrQkMsQ0FBQUEsQ0FBc0MsQ0FDdEQsSUFBQSxDQUFLLFVBQUEsQ0FBYUEsRUFDbEIsSUFBQSxDQUFLLE9BQUEsQ0FBUSxRQUNmLENBRUEsYUFBYUMsQ0FBQUEsQ0FBd0IsQ0FDbkMsS0FBSyxTQUFBLENBQVlBLENBQUFBLENBQ2JBLEdBQVMsSUFBQSxDQUFLLGtCQUFBLEdBQ3BCLENBR0EsWUFBQSxDQUFhM0IsQ0FBQUEsQ0FBYUMsQ0FBQUEsQ0FBd0IsQ0FDaEQsSUFBQSxDQUFLLGVBQWVELENBQUcsQ0FBQSxDQUFJQyxFQUMzQixJQUFBLENBQUssa0JBQUEsR0FDUCxDQUdBLGNBQUEsRUFBdUIsQ0FDckIsSUFBQSxDQUFLLGNBQUEsQ0FBaUIsRUFBQyxDQUN2QixHQUFJLENBQ0YsWUFBQSxDQUFhLFVBQUEsQ0FBV3VCLENBQW1CLEVBQzdDLENBQUEsS0FBUSxDQUVSLENBQ0YsQ0FHQSxZQUFBLEVBQXdDLENBQ3RDLE9BQU8sQ0FBRSxHQUFHLElBQUEsQ0FBSyxjQUFlLENBQ2xDLENBRUEsS0FBQSxFQUFnQixDQUNkLE9BQU8sTUFBQSxDQUFPLEtBQUssSUFBQSxDQUFLLFVBQVUsRUFBRSxNQUN0QyxDQUVBLFNBQ0VJLENBQUFBLENBQ0FDLENBQUFBLENBQ0FDLENBQUFBLENBQ0FDLENBQUFBLENBQ0FDLENBQUFBLENBQ1csQ0FDWCxHQUFJLElBQUEsQ0FBSyxTQUFBLEVBQWFKLEtBQVcsSUFBQSxDQUFLLGNBQUEsQ0FDcEMsT0FBTyxJQUFBLENBQUssY0FBQSxDQUFlQSxDQUFPLENBQUEsQ0FHcEMsR0FBSUEsS0FBVyxJQUFBLENBQUssVUFBQSxDQUFZLENBQzlCLElBQU0zQixDQUFBQSxDQUFRLEtBQUssVUFBQSxDQUFXMkIsQ0FBTyxDQUFBLENBQ3JDLE9BQUssSUFBQSxDQUFLLE9BQUEsQ0FBUSxJQUFJQSxDQUFPLENBQUEsR0FDM0IsS0FBSyxPQUFBLENBQVEsR0FBQSxDQUFJQSxDQUFPLENBQUEsQ0FDeEJJLENBQUFBLENBQVdKLEVBQVMzQixDQUFLLENBQUEsQ0FBQSxDQUVwQkEsQ0FDVCxDQUVBLE9BQU80QixDQUNULENBRUEsWUFBQSxFQUFxQixDQUNuQixJQUFBLENBQUssT0FBQSxDQUFRLEtBQUEsR0FDZixDQUVRLGtCQUFBLEVBQTJCLENBQ2pDLEdBQUksQ0FDRixJQUFNYixDQUFBQSxDQUFTLFlBQUEsQ0FBYSxRQUFRUSxDQUFtQixDQUFBLENBQ25EUixJQUFRLElBQUEsQ0FBSyxjQUFBLENBQWlCLEtBQUssS0FBQSxDQUFNQSxDQUFNLEdBQ3JELENBQUEsS0FBUSxDQUVSLENBQ0YsQ0FFUSxrQkFBQSxFQUEyQixDQUNqQyxHQUFJLENBQ0YsWUFBQSxDQUFhLFFBQVFRLENBQUFBLENBQXFCLElBQUEsQ0FBSyxVQUFVLElBQUEsQ0FBSyxjQUFjLENBQUMsRUFDL0UsQ0FBQSxLQUFRLENBRVIsQ0FDRixDQUNGLEVDbEZPLElBQU1TLENBQUFBLENBQU4sS0FBd0IsQ0FNN0IsV0FBQSxFQUFjLENBTGQsSUFBQSxDQUFRLFdBQUEsQ0FBb0QsRUFBQyxDQUU3RCxJQUFBLENBQVEsaUJBQUEsQ0FBcUMsRUFBQyxDQUM5QyxJQUFBLENBQVEsUUFBVSxJQUFJLEdBQUEsQ0FHcEIsS0FBSyxxQkFBQSxHQUNQLENBRUEsY0FBQSxDQUFlQyxDQUFBQSxDQUF5RCxDQUN0RSxJQUFBLENBQUssV0FBQSxDQUFjQSxFQUNyQixDQUVBLEtBQUEsRUFBZ0IsQ0FDZCxPQUFPLE1BQUEsQ0FBTyxLQUFLLElBQUEsQ0FBSyxXQUFXLEVBQUUsTUFDdkMsQ0FFQSxRQUNFQyxDQUFBQSxDQUNBSCxDQUFBQSxDQUNrQixDQUNsQixJQUFNSSxDQUFBQSxDQUFhLEtBQUssV0FBQSxDQUFZRCxDQUFhLEVBQ2pELEdBQUksQ0FBQ0MsRUFDSCxPQUFPLENBQUUsUUFBUyxTQUFVLENBQUEsQ0FHOUIsSUFBTUMsQ0FBQUEsQ0FBYUQsQ0FBQUEsQ0FBVyxXQUFBLENBSTlCLE9BQUksSUFBQSxDQUFLLGlCQUFBLENBQWtCRCxDQUFhLENBQUEsR0FBTUUsQ0FBQUEsR0FDNUMsS0FBSyxpQkFBQSxDQUFrQkYsQ0FBYSxFQUFJRSxDQUFBQSxDQUN4QyxJQUFBLENBQUssdUJBQXNCLENBQUEsQ0FHeEIsSUFBQSxDQUFLLFFBQVEsR0FBQSxDQUFJRixDQUFhLElBQ2pDLElBQUEsQ0FBSyxPQUFBLENBQVEsR0FBQSxDQUFJQSxDQUFhLENBQUEsQ0FDOUJILENBQUFBLENBQVdHLEVBQWVFLENBQVUsQ0FBQSxDQUFBLENBRy9CLENBQUUsT0FBQSxDQUFTQSxDQUFBQSxDQUFZLFFBQVNELENBQUFBLENBQVcsT0FBUSxDQUM1RCxDQUVBLGdCQUFBLEVBQXlCLENBQ3ZCLElBQUEsQ0FBSyxpQkFBQSxDQUFvQixFQUFDLENBQzFCLElBQUEsQ0FBSyxRQUFRLEtBQUEsRUFBTSxDQUNuQixHQUFJLENBQ0YsWUFBQSxDQUFhLFVBQUEsQ0FBV25GLEVBQWEscUJBQXFCLEVBQzVELE1BQVEsQ0FFUixDQUNGLENBRVEscUJBQUEsRUFBOEIsQ0FDcEMsR0FBSSxDQUNGLElBQU1tRSxFQUFNLFlBQUEsQ0FBYSxPQUFBLENBQVFuRSxFQUFhLHFCQUFxQixDQUFBLENBQy9EbUUsSUFDRixJQUFBLENBQUssaUJBQUEsQ0FBb0IsSUFBQSxDQUFLLEtBQUEsQ0FBTUEsQ0FBRyxDQUFBLEVBRTNDLE1BQVEsQ0FDTixJQUFBLENBQUssa0JBQW9CLEdBQzNCLENBQ0YsQ0FFUSxxQkFBQSxFQUE4QixDQUNwQyxHQUFJLENBQ0YsYUFBYSxPQUFBLENBQ1huRSxDQUFBQSxDQUFhLHNCQUNiLElBQUEsQ0FBSyxTQUFBLENBQVUsS0FBSyxpQkFBaUIsQ0FDdkMsRUFDRixDQUFBLEtBQVEsQ0FFUixDQUNGLENBQ0YsQ0FBQSxDQ2xGTyxJQUFNcUYsRUFBTixLQUFzQixDQUkzQixZQUE2QkMsQ0FBQUEsQ0FBYSxDQUFiLFNBQUFBLENBQUFBLENBSDdCLElBQUEsQ0FBUSxPQUF3QixJQUFBLENBQ2hDLElBQUEsQ0FBUSxPQUFrQyxFQUFDLENBR3pDLEtBQUssZUFBQSxHQUNQLENBRUEsUUFBQSxDQUNFekIsQ0FBQUEsQ0FDQUMsQ0FBQUEsQ0FDQXlCLEVBU00sQ0FDTixJQUFNQyxFQUFnQkQsQ0FBQUEsQ0FBVSxnQkFBQSxHQUVoQyxHQUFJQyxDQUFBQSxHQUFrQjNCLEVBQVEsQ0FFeEJDLENBQUFBLEdBQ0YsS0FBSyxNQUFBLENBQVMsQ0FBRSxHQUFHLElBQUEsQ0FBSyxNQUFBLENBQVEsR0FBR0EsQ0FBTyxDQUFBLENBQUEsQ0FFNUN5QixDQUFBQSxDQUFVLFlBQUEsQ0FBYSxJQUFBLENBQUssTUFBTSxFQUNsQyxJQUFBLENBQUssT0FBQSxDQUFRMUIsRUFBUSxJQUFBLENBQUssTUFBTSxFQUNoQyxNQUNGLENBRUEsSUFBTTRCLENBQUFBLENBQWlCRCxDQUFBQSxDQUl2QkQsRUFBVSxLQUFBLEVBQU0sQ0FBRSxNQUFNLElBQU0sQ0FBQyxDQUFDLENBQUEsQ0FHaENBLENBQUFBLENBQVUsWUFBQSxFQUFhLENBQ3ZCQSxDQUFBQSxDQUFVLDBCQUFBLEdBRVYsSUFBQSxDQUFLLE1BQUEsQ0FBUzFCLEVBQ2QsSUFBQSxDQUFLLE1BQUEsQ0FBU0MsR0FBVSxFQUFDLENBQ3pCeUIsRUFBVSxTQUFBLENBQVUxQixDQUFNLEVBQzFCMEIsQ0FBQUEsQ0FBVSxZQUFBLENBQWEsS0FBSyxNQUFNLENBQUEsQ0FDbEMsS0FBSyxPQUFBLENBQVExQixDQUFBQSxDQUFRLElBQUEsQ0FBSyxNQUFNLENBQUEsQ0FHaEMwQixDQUFBQSxDQUFVLG9CQUFvQjFCLENBQUFBLENBQVE0QixDQUFjLEVBRXBELElBQUEsQ0FBSyxHQUFBLENBQUksTUFBTSxZQUFBLENBQWMsQ0FBRSxPQUFBNUIsQ0FBQUEsQ0FBUSxjQUFBLENBQUE0QixDQUFlLENBQUMsRUFDekQsQ0FFQSxLQUFBLENBQU1GLENBQUFBLENBSUcsQ0FDUEEsQ0FBQUEsQ0FBVSxLQUFBLEVBQU0sQ0FBRSxLQUFBLENBQU0sSUFBTSxDQUFDLENBQUMsQ0FBQSxDQUNoQ0EsQ0FBQUEsQ0FBVSxjQUFhLENBQ3ZCQSxDQUFBQSxDQUFVLDRCQUEyQixDQUNyQyxJQUFBLENBQUssT0FBUyxJQUFBLENBQ2QsSUFBQSxDQUFLLE9BQVMsRUFBQyxDQUNmLEdBQUksQ0FDRixZQUFBLENBQWEsV0FBV3ZGLENBQUFBLENBQWEsUUFBUSxFQUMvQyxDQUFBLEtBQVEsQ0FFUixDQUNBLEtBQUssR0FBQSxDQUFJLEtBQUEsQ0FBTSxpQkFBaUIsRUFDbEMsQ0FFQSxXQUEyQixDQUN6QixPQUFPLEtBQUssTUFDZCxDQUVRLGlCQUF3QixDQUM5QixHQUFJLENBQ0YsSUFBTW1FLENBQUFBLENBQU0sYUFBYSxPQUFBLENBQVFuRSxDQUFBQSxDQUFhLFFBQVEsQ0FBQSxDQUN0RCxHQUFJLENBQUNtRSxFQUFLLE9BQ1YsSUFBTWIsRUFBUyxJQUFBLENBQUssS0FBQSxDQUFNYSxDQUFHLENBQUEsQ0FDN0IsSUFBQSxDQUFLLE9BQVNiLENBQUFBLENBQU8sTUFBQSxFQUFVLEtBQy9CLElBQUEsQ0FBSyxNQUFBLENBQVNBLEVBQU8sTUFBQSxFQUFVLEdBQ2pDLENBQUEsS0FBUSxDQUVSLENBQ0YsQ0FFUSxPQUFBLENBQVFPLENBQUFBLENBQWdCQyxFQUF1QyxDQUNyRSxJQUFNNEIsRUFBMEIsQ0FDOUIsTUFBQSxDQUFBN0IsRUFDQSxNQUFBLENBQUFDLENBQUFBLENBQ0EsYUFBYyxJQUFJLElBQUEsR0FBTyxXQUFBLEVBQzNCLEVBQ0EsR0FBSSxDQUNGLGFBQWEsT0FBQSxDQUFROUQsQ0FBQUEsQ0FBYSxRQUFBLENBQVUsSUFBQSxDQUFLLFNBQUEsQ0FBVTBGLENBQU8sQ0FBQyxFQUNyRSxDQUFBLEtBQVEsQ0FFUixDQUNGLENBQ0YsRUMxR08sSUFBTUMsQ0FBQUEsQ0FBTixLQUFpQixDQUl0QixXQUFBLENBQ21CM0QsRUFDQUMsQ0FBQUEsQ0FDQUMsQ0FBQUEsQ0FDQTBELEVBQ0FOLENBQUFBLENBQ0FPLENBQUFBLENBQ2pCLENBTmlCLElBQUEsQ0FBQSxNQUFBLENBQUE3RCxDQUFBQSxDQUNBLElBQUEsQ0FBQSxNQUFBLENBQUFDLENBQUFBLENBQ0EsSUFBQSxDQUFBLFdBQUEsQ0FBQUMsQ0FBQUEsQ0FDQSxxQkFBQTBELENBQUFBLENBQ0EsSUFBQSxDQUFBLEdBQUEsQ0FBQU4sRUFDQSxJQUFBLENBQUEsUUFBQSxDQUFBTyxDQUFBQSxDQVRuQixLQUFRLEtBQUEsQ0FBK0MsSUFBQSxDQUN2RCxLQUFRLElBQUEsQ0FBc0IsS0FTM0IsQ0FFSCxLQUFBLENBQU1yRSxDQUFBQSxDQUF3QyxDQUU1QyxJQUFNdUMsQ0FBQUEsQ0FBUyxLQUFLLGVBQUEsRUFBZ0IsQ0FDaENBLEdBQ0YsSUFBQSxDQUFLLFFBQUEsQ0FBU0EsRUFBTyxNQUFNLENBQUEsQ0FHN0IsS0FBSyxXQUFBLENBQVl2QyxDQUFBQSxFQUFhLENBQUEsQ0FBRSxLQUFBLENBQU9zRSxHQUFpQixDQUN0RCxJQUFBLENBQUssSUFBSSxJQUFBLENBQUsscUJBQUEsQ0FBdUJBLENBQUcsRUFDMUMsQ0FBQyxFQUVELElBQUEsQ0FBSyxLQUFBLENBQVEsV0FBQSxDQUFZLElBQU0sQ0FDN0IsSUFBQSxDQUFLLFlBQVl0RSxDQUFBQSxFQUFhLEVBQUUsS0FBQSxDQUFPc0UsQ0FBQUEsRUFBaUIsQ0FDdEQsSUFBQSxDQUFLLEdBQUEsQ0FBSSxLQUFLLHVCQUFBLENBQXlCQSxDQUFHLEVBQzVDLENBQUMsRUFDSCxFQUFHLElBQUEsQ0FBSyxlQUFlLEVBQ3pCLENBRUEsSUFBQSxFQUFhLENBQ1AsSUFBQSxDQUFLLEtBQUEsR0FBVSxJQUFBLEdBQ2pCLGNBQWMsSUFBQSxDQUFLLEtBQUssRUFDeEIsSUFBQSxDQUFLLEtBQUEsQ0FBUSxNQUVqQixDQUVBLE1BQU0sWUFBWUMsQ0FBQUEsQ0FBd0MsQ0FHeEQsR0FBSSxDQUFDQSxDQUFBQSxDQUFVLENBQ2IsSUFBQSxDQUFLLEdBQUEsQ0FBSSxNQUFNLCtDQUEwQyxDQUFBLENBQ3pELE1BQ0YsQ0FFQSxJQUFNQyxDQUFBQSxDQUFrQyxDQUN0QyxhQUFBLENBQWUsQ0FBQSxPQUFBLEVBQVUsS0FBSyxNQUFNLENBQUEsQ0FBQSxDQUNwQyxnQkFBaUIsSUFBQSxDQUFLLFdBQUEsQ0FDdEIsY0FBZUQsQ0FDakIsQ0FBQSxDQUNJLEtBQUssSUFBQSxHQUFNQyxDQUFBQSxDQUFRLGVBQWUsQ0FBQSxDQUFJLElBQUEsQ0FBSyxNQUUvQyxJQUFNekQsQ0FBQUEsQ0FBTSxNQUFNLEtBQUEsQ0FBTSxDQUFBLEVBQUcsSUFBQSxDQUFLLE1BQU0sQ0FBQSxVQUFBLENBQUEsQ0FBYyxDQUFFLFFBQUF5RCxDQUFRLENBQUMsRUFFL0QsR0FBSXpELENBQUFBLENBQUksU0FBVyxHQUFBLENBQUssQ0FDdEIsS0FBSyxHQUFBLENBQUksS0FBQSxDQUFNLHlCQUF5QixDQUFBLENBQ3hDLE1BQ0YsQ0FFQSxHQUFJLENBQUNBLENBQUFBLENBQUksRUFBQSxDQUNQLE1BQU0sSUFBSSxNQUFNLENBQUEsc0JBQUEsRUFBeUJBLENBQUFBLENBQUksTUFBTSxDQUFBLENBQUUsQ0FBQSxDQUd2RCxJQUFNMEQsQ0FBQUEsQ0FBVTFELENBQUFBLENBQUksUUFBUSxHQUFBLENBQUksTUFBTSxFQUNsQzBELENBQUFBLEdBQVMsSUFBQSxDQUFLLEtBQU9BLENBQUFBLENBQUFBLENBRXpCLElBQU1DLEVBQVEsTUFBTTNELENBQUFBLENBQUksSUFBQSxFQUFLLENBQzdCLElBQUEsQ0FBSyxRQUFBLENBQVMyRCxFQUFLLElBQUksQ0FBQSxDQUN2QixLQUFLLGFBQUEsQ0FBY0EsQ0FBQUEsQ0FBSyxJQUFJLENBQUEsQ0FDNUIsSUFBQSxDQUFLLElBQUksS0FBQSxDQUFNLGdCQUFBLENBQWtCLENBQy9CLEtBQUEsQ0FBTyxNQUFBLENBQU8sS0FBS0EsQ0FBQUEsQ0FBSyxJQUFBLENBQUssS0FBSyxDQUFBLENBQUUsTUFBQSxDQUNwQyxXQUFBLENBQWEsTUFBQSxDQUFPLElBQUEsQ0FBS0EsQ0FBQUEsQ0FBSyxLQUFLLFdBQVcsQ0FBQSxDQUFFLE1BQ2xELENBQUMsRUFDSCxDQUVBLGVBQUEsRUFBa0UsQ0FDaEUsR0FBSSxDQUNGLElBQU0vQixFQUFNLFlBQUEsQ0FBYSxPQUFBLENBQVFuRSxFQUFhLFNBQVMsQ0FBQSxDQUN2RCxHQUFJLENBQUNtRSxDQUFBQSxDQUFLLE9BQU8sSUFBQSxDQUNqQixJQUFNYixDQUFBQSxDQUFTLEtBQUssS0FBQSxDQUFNYSxDQUFHLEVBSzdCLE9BRFksSUFBQSxDQUFLLEtBQUksQ0FBSWIsQ0FBQUEsQ0FBTyxTQUN0QnBELENBQUFBLEVBQ1IsSUFBQSxDQUFLLElBQUksS0FBQSxDQUFNLDBDQUEwQyxFQUNsRCxJQUFBLEVBRUZvRCxDQUNULE1BQVEsQ0FDTixPQUFPLElBQ1QsQ0FDRixDQUVBLGFBQUEsQ0FBYzZDLEVBQXlCLENBQ3JDLEdBQUksQ0FDRixZQUFBLENBQWEsT0FBQSxDQUNYbkcsRUFBYSxTQUFBLENBQ2IsSUFBQSxDQUFLLFVBQVUsQ0FBRSxNQUFBLENBQUFtRyxFQUFRLFFBQUEsQ0FBVSxJQUFBLENBQUssS0FBTSxDQUFDLENBQ2pELEVBQ0YsQ0FBQSxLQUFRLENBRVIsQ0FDRixDQUNGLENBQUEsQ0N0R08sSUFBTUMsQ0FBQUEsQ0FBTixLQUFnQixDQUlyQixXQUFBLENBQ21CcEUsQ0FBQUEsQ0FDQUMsRUFDQUMsQ0FBQUEsQ0FDQW1FLENBQUFBLENBQ0FDLEVBQ0FDLENBQUFBLENBQ0FDLENBQUFBLENBQ0FsQixFQUNBbUIsQ0FBQUEsQ0FBNEIsSUFBQSxDQUM3QyxDQVRpQixJQUFBLENBQUEsTUFBQSxDQUFBekUsQ0FBQUEsQ0FDQSxZQUFBQyxDQUFBQSxDQUNBLElBQUEsQ0FBQSxXQUFBLENBQUFDLENBQUFBLENBQ0EsSUFBQSxDQUFBLGFBQUEsQ0FBQW1FLENBQUFBLENBQ0EsSUFBQSxDQUFBLEtBQUEsQ0FBQUMsRUFDQSxJQUFBLENBQUEsWUFBQSxDQUFBQyxDQUFBQSxDQUNBLGtCQUFBQyxDQUFBQSxDQUNBLElBQUEsQ0FBQSxHQUFBLENBQUFsQixFQUNBLElBQUEsQ0FBQSxVQUFBLENBQUFtQixDQUFBQSxDQVpuQixLQUFRLFdBQUEsQ0FBMkIsSUFBQSxDQUNuQyxLQUFRLFlBQUEsQ0FBZTFHLENBQUFBLENBQVMsYUFZN0IsQ0FFSCxjQUFBLEVBQThCLENBQzVCLE9BQU8sSUFBQSxDQUFLLFdBQ2QsQ0FFQSxNQUFNLEtBQUEsRUFBdUIsQ0FDM0IsSUFBTTJHLENBQUFBLENBQVMsS0FBSyxLQUFBLENBQU0sS0FBQSxHQUMxQixHQUFJQSxDQUFBQSxDQUFPLFNBQVcsQ0FBQSxDQUFHLE9BR3pCLEdBQUksQ0FBQyxJQUFBLENBQUssYUFBYSxRQUFBLEVBQVMsQ0FBRyxDQUNqQyxJQUFBLENBQUssWUFBQSxDQUFhLE9BQUEsQ0FBUUEsQ0FBTSxDQUFBLENBQ2hDLE1BQ0YsQ0FFYSxNQUFNLElBQUEsQ0FBSyxjQUFjQSxDQUFBQSxDQUFRLENBQUMsSUFFN0MsSUFBQSxDQUFLLFdBQUEsQ0FBYyxJQUFJLElBQUEsRUFFM0IsQ0FFQSxnQkFBZ0JBLENBQUFBLENBQStCLENBRTdDLEdBRElBLENBQUFBLENBQU8sTUFBQSxHQUFXLEdBQ2xCLE9BQU8sU0FBQSxDQUFjLEdBQUEsRUFBZSxDQUFDLFNBQUEsQ0FBVSxVQUFBLENBQVksT0FDL0QsSUFBTUMsQ0FBQUEsQ0FBUUQsRUFBTyxDQUFDLENBQUEsQ0FDaEJoQixFQUFVLENBQ2QsS0FBQSxDQUFPZ0IsRUFBTyxHQUFBLENBQUtFLENBQUFBLEdBQU8sQ0FDeEIsSUFBQSxDQUFNLE9BQUEsQ0FDTixNQUFPQSxDQUFBQSxDQUFFLFVBQUEsQ0FDVCxXQUFZQSxDQUFBQSxDQUFFLGdCQUFBLEVBQW9CLEVBQUMsQ0FDbkMsU0FBQSxDQUFXQSxDQUFBQSxDQUFFLFNBQ2YsQ0FBQSxDQUFFLENBQUEsQ0FDRixRQUFTRCxDQUFBQSxDQUNMLENBQ0UsS0FBTSxDQUFFLEVBQUEsQ0FBSUEsRUFBTSxPQUFBLEVBQVcsTUFBQSxDQUFXLGFBQWNBLENBQUFBLENBQU0sWUFBYSxFQUN6RSxNQUFBLENBQVEsQ0FDTixHQUFJQSxDQUFBQSxDQUFNLFNBQUEsQ0FDVixTQUFVQSxDQUFBQSxDQUFNLFFBQUEsQ0FDaEIsT0FBUUEsQ0FBQUEsQ0FBTSxNQUNoQixFQUNBLE9BQUEsQ0FBUyxDQUFFLEdBQUlBLENBQUFBLENBQU0sVUFBVyxFQUNoQyxHQUFJLElBQUEsQ0FBSyxXQUFhLENBQUUsR0FBQSxDQUFLLENBQUUsT0FBQSxDQUFTLElBQUEsQ0FBSyxVQUFXLENBQUUsQ0FBQSxDQUFJLEVBQ2hFLENBQUEsQ0FDQSxHQUNKLE9BQUEsQ0FBUyxJQUFJLE1BQUssQ0FBRSxXQUFBLEVBQ3RCLENBQUEsQ0FDTXJFLENBQUFBLENBQU8sS0FBSyxTQUFBLENBQVVvRCxDQUFPLEVBRTdCbUIsQ0FBQUEsQ0FBTSxDQUFBLEVBQUcsS0FBSyxNQUFNLENBQUEsbUJBQUEsRUFBc0IsbUJBQW1CLElBQUEsQ0FBSyxNQUFNLENBQUMsQ0FBQSxLQUFBLEVBQVEsa0JBQUEsQ0FBbUIsSUFBQSxDQUFLLFdBQVcsQ0FBQyxDQUFBLENBQUEsQ0FDOUcsVUFBVSxVQUFBLENBQVdBLENBQUFBLENBQUssSUFBSSxJQUFBLENBQUssQ0FBQ3ZFLENBQUksQ0FBQSxDQUFHLENBQUUsS0FBTSxrQkFBbUIsQ0FBQyxDQUFDLENBQUEsRUFFbkYsSUFBQSxDQUFLLElBQUksSUFBQSxDQUFLLDZEQUF3RCxFQUUxRSxDQUVBLE1BQWMsYUFBQSxDQUFjb0UsRUFBeUJJLENBQUFBLENBQW1DLENBQ3RGLEdBQUksQ0FDRixHQUFNLENBQUUsSUFBQSxDQUFBeEUsQ0FBQUEsQ0FBTSxXQUFBeUUsQ0FBVyxDQUFBLENBQUksTUFBTSxJQUFBLENBQUssU0FBQSxDQUFVTCxDQUFNLENBQUEsQ0FDbERWLENBQUFBLENBQWtDLENBQ3RDLGFBQUEsQ0FBZSxDQUFBLE9BQUEsRUFBVSxJQUFBLENBQUssTUFBTSxDQUFBLENBQUEsQ0FDcEMsZUFBQSxDQUFpQixLQUFLLFdBQUEsQ0FDdEIsY0FBQSxDQUFnQixrQkFDbEIsQ0FBQSxDQUNJZSxDQUFBQSxHQUNGZixFQUFRLGtCQUFrQixDQUFBLENBQUksUUFHaEMsSUFBTXpELENBQUFBLENBQU0sTUFBTSxLQUFBLENBQU0sQ0FBQSxFQUFHLEtBQUssTUFBTSxDQUFBLFVBQUEsQ0FBQSxDQUFjLENBQ2xELE1BQUEsQ0FBUSxNQUFBLENBQ1IsT0FBQSxDQUFBeUQsQ0FBQUEsQ0FDQSxJQUFBLENBQUExRCxDQUNGLENBQUMsQ0FBQSxDQUVELEdBQUlDLEVBQUksTUFBQSxHQUFXLEdBQUEsQ0FFakIsWUFBSyxHQUFBLENBQUksS0FBQSxDQUFNLDhCQUErQixNQUFNQSxDQUFBQSxDQUFJLE1BQU0sQ0FBQSxDQUN2RCxHQUdULEdBQUlBLENBQUFBLENBQUksU0FBVyxHQUFBLENBQUssQ0FDdEIsSUFBTXlFLENBQUFBLENBQWEsUUFBQSxDQUFTekUsQ0FBQUEsQ0FBSSxRQUFRLEdBQUEsQ0FBSSxhQUFhLEdBQUssR0FBQSxDQUFLLEVBQUUsRUFDckUsSUFBQSxDQUFLLEdBQUEsQ0FBSSxLQUFLLENBQUEsNkJBQUEsRUFBZ0N5RSxDQUFVLEdBQUcsQ0FBQSxDQUUzRCxJQUFBLElBQVdKLEtBQUtGLENBQUFBLENBQVEsSUFBQSxDQUFLLE1BQU0sR0FBQSxDQUFJRSxDQUFDLENBQUEsQ0FDeEMsT0FBTyxDQUFBLENBQ1QsQ0FFQSxHQUFJckUsQ0FBQUEsQ0FBSSxNQUFBLEVBQVUsSUFDaEIsTUFBTSxJQUFJLE1BQU0sQ0FBQSxZQUFBLEVBQWVBLENBQUFBLENBQUksTUFBTSxDQUFBLENBQUUsQ0FBQSxDQUc3QyxZQUFLLEdBQUEsQ0FBSSxLQUFBLENBQU0sV0FBV21FLENBQUFBLENBQU8sTUFBTSxVQUFVLENBQUEsQ0FDMUMsQ0FBQSxDQUNULENBQUEsTUFBU1osQ0FBQUEsQ0FBSyxDQUNaLEdBQUlnQixFQUFVLElBQUEsQ0FBSyxhQUFBLENBQWdCLEVBQUcsQ0FDcEMsSUFBTUcsRUFDSixJQUFBLENBQUssWUFBQSxDQUFhSCxDQUFPLENBQUEsRUFBSyxJQUFBLENBQUssYUFBYSxJQUFBLENBQUssWUFBQSxDQUFhLE9BQVMsQ0FBQyxDQUFBLEVBQUssS0FDbkYsT0FBQSxJQUFBLENBQUssR0FBQSxDQUFJLElBQUEsQ0FBSyxDQUFBLGNBQUEsRUFBaUJBLENBQUFBLENBQVUsQ0FBQyx3QkFBd0JHLENBQUssQ0FBQSxFQUFBLENBQUEsQ0FBTW5CLENBQUcsQ0FBQSxDQUNoRixNQUFNb0IsR0FBTUQsQ0FBSyxDQUFBLENBQ1YsS0FBSyxhQUFBLENBQWNQLENBQUFBLENBQVFJLEVBQVUsQ0FBQyxDQUMvQyxDQUVBLE9BQUEsSUFBQSxDQUFLLEdBQUEsQ0FBSSxNQUFNLGdEQUFBLENBQWtEaEIsQ0FBRyxDQUFBLENBQ3BFLElBQUEsQ0FBSyxZQUFBLENBQWEsT0FBQSxDQUFRWSxDQUFNLENBQUEsQ0FDekIsS0FDVCxDQUNGLENBRUEsTUFBYyxVQUNaQSxDQUFBQSxDQUN1RCxDQUl2RCxJQUFNQyxDQUFBQSxDQUFRRCxDQUFBQSxDQUFPLENBQUMsQ0FBQSxDQUNoQmhCLENBQUFBLENBQVUsQ0FDZCxLQUFBLENBQU9nQixDQUFBQSxDQUFPLElBQUtFLENBQUFBLEdBQU8sQ0FDeEIsSUFBQSxDQUFNLE9BQUEsQ0FDTixLQUFBLENBQU9BLENBQUFBLENBQUUsV0FDVCxVQUFBLENBQVlBLENBQUFBLENBQUUsa0JBQW9CLEVBQUMsQ0FDbkMsVUFBV0EsQ0FBQUEsQ0FBRSxTQUNmLEVBQUUsQ0FBQSxDQUNGLE9BQUEsQ0FBU0QsRUFDTCxDQUNFLElBQUEsQ0FBTSxDQUFFLEVBQUEsQ0FBSUEsQ0FBQUEsQ0FBTSxTQUFXLE1BQUEsQ0FBVyxZQUFBLENBQWNBLENBQUFBLENBQU0sWUFBYSxDQUFBLENBQ3pFLE1BQUEsQ0FBUSxDQUNOLEVBQUEsQ0FBSUEsQ0FBQUEsQ0FBTSxVQUNWLFFBQUEsQ0FBVUEsQ0FBQUEsQ0FBTSxTQUNoQixNQUFBLENBQVFBLENBQUFBLENBQU0sTUFDaEIsQ0FBQSxDQUNBLE9BQUEsQ0FBUyxDQUFFLEVBQUEsQ0FBSUEsQ0FBQUEsQ0FBTSxVQUFXLENBQUEsQ0FDaEMsR0FBSSxLQUFLLFVBQUEsQ0FBYSxDQUFFLEdBQUEsQ0FBSyxDQUFFLE9BQUEsQ0FBUyxJQUFBLENBQUssVUFBVyxDQUFFLENBQUEsQ0FBSSxFQUNoRSxDQUFBLENBQ0EsRUFBQyxDQUNMLE9BQUEsQ0FBUyxJQUFJLElBQUEsRUFBSyxDQUFFLGFBQ3RCLENBQUEsQ0FDTVQsRUFBTyxJQUFBLENBQUssU0FBQSxDQUFVUixDQUFPLENBQUEsQ0FDbkMsR0FBSVEsQ0FBQUEsQ0FBSyxNQUFBLENBQVMsSUFBQSxDQUFNLE9BQU8sQ0FBRSxJQUFBLENBQU1BLENBQUFBLENBQU0sV0FBWSxLQUFNLENBQUEsQ0FDL0QsR0FBSSxDQUNGLElBQU1pQixFQUFTLElBQUksaUJBQUEsQ0FBa0IsTUFBTSxDQUFBLENBQ3JDQyxDQUFBQSxDQUFTRCxFQUFPLFFBQUEsQ0FBUyxTQUFBLEdBQ3pCRSxDQUFBQSxDQUFVLElBQUksV0FBQSxDQUNwQixPQUFLRCxDQUFBQSxDQUFPLEtBQUEsQ0FBTUMsRUFBUSxNQUFBLENBQU9uQixDQUFJLENBQUMsQ0FBQSxDQUNqQ2tCLENBQUFBLENBQU8sT0FBTSxDQUVYLENBQUUsS0FESSxNQUFNLElBQUksU0FBU0QsQ0FBQUEsQ0FBTyxRQUFRLEVBQUUsSUFBQSxFQUFLLENBQ2pDLFdBQVksQ0FBQSxDQUFLLENBQ3hDLENBQUEsS0FBUSxDQUVOLE9BQU8sQ0FBRSxLQUFNakIsQ0FBQUEsQ0FBTSxVQUFBLENBQVksS0FBTSxDQUN6QyxDQUNGLENBQ0YsQ0FBQSxDQUVBLFNBQVNnQixHQUFNSSxDQUFBQSxDQUEyQixDQUN4QyxPQUFPLElBQUksT0FBQSxDQUFTQyxHQUFZLFVBQUEsQ0FBV0EsQ0FBQUEsQ0FBU0QsQ0FBRSxDQUFDLENBQ3pELENDOUtPLElBQU1FLENBQUFBLENBQU4sS0FBbUIsQ0FDeEIsT0FBQSxDQUFRZCxDQUFBQSxDQUErQixDQUlyQyxJQUFNZSxDQUFBQSxDQUZXLENBQUMsR0FERCxJQUFBLENBQUssTUFBSyxDQUNJLEdBQUdmLENBQU0sQ0FBQSxDQUVmLEtBQUEsQ0FBTSxJQUFrQixDQUFBLENBQ2pELEtBQUssSUFBQSxDQUFLZSxDQUFPLEVBQ25CLENBRUEsS0FBQSxFQUF5QixDQUN2QixJQUFNZixDQUFBQSxDQUFTLElBQUEsQ0FBSyxNQUFLLENBQ3pCLE9BQUEsSUFBQSxDQUFLLE9BQU0sQ0FDSkEsQ0FDVCxDQUVBLElBQUEsRUFBZSxDQUNiLE9BQU8sSUFBQSxDQUFLLElBQUEsR0FBTyxNQUNyQixDQUVBLE9BQWMsQ0FDWixHQUFJLENBQ0YsWUFBQSxDQUFhLFVBQUEsQ0FBVzFHLENBQUFBLENBQWEsWUFBWSxFQUNuRCxDQUFBLEtBQVEsQ0FFUixDQUNGLENBRVEsTUFBd0IsQ0FDOUIsR0FBSSxDQUNGLElBQU1tRSxDQUFBQSxDQUFNLGFBQWEsT0FBQSxDQUFRbkUsQ0FBQUEsQ0FBYSxZQUFZLENBQUEsQ0FDMUQsT0FBS21FLEVBQ0UsSUFBQSxDQUFLLEtBQUEsQ0FBTUEsQ0FBRyxDQUFBLENBREosRUFFbkIsTUFBUSxDQUNOLE9BQU8sRUFDVCxDQUNGLENBRVEsSUFBQSxDQUFLdUMsQ0FBQUEsQ0FBK0IsQ0FDMUMsR0FBSSxDQUNGLGFBQWEsT0FBQSxDQUFRMUcsQ0FBQUEsQ0FBYSxhQUFjLElBQUEsQ0FBSyxTQUFBLENBQVUwRyxDQUFNLENBQUMsRUFDeEUsQ0FBQSxNQUFTWixDQUFBQSxDQUFLLENBRVosR0FBSUEsYUFBZSxZQUFBLEVBQWdCQSxDQUFBQSxDQUFJLE9BQVMsb0JBQUEsQ0FBc0IsQ0FDcEUsSUFBTTRCLENBQUFBLENBQU9oQixDQUFBQSxDQUFPLE1BQU0sSUFBQSxDQUFLLEtBQUEsQ0FBTUEsRUFBTyxNQUFBLENBQVMsQ0FBQyxDQUFDLENBQUEsQ0FDdkQsR0FBSSxDQUNGLFlBQUEsQ0FBYSxPQUFBLENBQVExRyxDQUFBQSxDQUFhLFlBQUEsQ0FBYyxJQUFBLENBQUssU0FBQSxDQUFVMEgsQ0FBSSxDQUFDLEVBQ3RFLE1BQVEsQ0FFUixDQUNGLENBQ0YsQ0FDRixDQUNGLEVDdkRPLElBQU1DLENBQUFBLENBQU4sS0FBMEIsQ0FNL0IsV0FBQSxFQUFjLENBTGQsSUFBQSxDQUFpQixlQUFBLENBQWtDLEVBQUMsQ0FDcEQsSUFBQSxDQUFpQixnQkFBQSxDQUFtQyxFQUFDLENBS25ELElBQUEsQ0FBSyxnQkFBa0IsSUFBWSxDQUNqQyxRQUFXQyxDQUFBQSxJQUFNLElBQUEsQ0FBSyxnQkFBaUJBLENBQUFBLEdBQ3pDLEVBQ0EsSUFBQSxDQUFLLGdCQUFBLENBQW1CLElBQVksQ0FDbEMsSUFBQSxJQUFXQSxLQUFNLElBQUEsQ0FBSyxnQkFBQSxDQUFrQkEsSUFDMUMsQ0FBQSxDQUNJLE9BQU8sTUFBQSxDQUFXLEdBQUEsR0FDcEIsTUFBQSxDQUFPLGlCQUFpQixRQUFBLENBQVUsSUFBQSxDQUFLLGVBQWUsQ0FBQSxDQUN0RCxNQUFBLENBQU8saUJBQWlCLFNBQUEsQ0FBVyxJQUFBLENBQUssZ0JBQWdCLENBQUEsRUFFNUQsQ0FFQSxVQUFvQixDQUNsQixPQUFPLE9BQU8sU0FBQSxDQUFjLEdBQUEsQ0FBYyxLQUFPLFNBQUEsQ0FBVSxNQUM3RCxDQUVBLFFBQUEsQ0FBU0EsQ0FBQUEsQ0FBc0IsQ0FDN0IsS0FBSyxlQUFBLENBQWdCLElBQUEsQ0FBS0EsQ0FBRSxFQUM5QixDQUVBLFVBQVVBLENBQUFBLENBQXNCLENBQzlCLEtBQUssZ0JBQUEsQ0FBaUIsSUFBQSxDQUFLQSxDQUFFLEVBQy9CLENBRUEsU0FBZ0IsQ0FDVixPQUFPLE9BQVcsR0FBQSxHQUNwQixNQUFBLENBQU8sbUJBQUEsQ0FBb0IsUUFBQSxDQUFVLElBQUEsQ0FBSyxlQUFlLEVBQ3pELE1BQUEsQ0FBTyxtQkFBQSxDQUFvQixVQUFXLElBQUEsQ0FBSyxnQkFBZ0IsR0FFL0QsQ0FDRixDQUFBLENDZE8sSUFBTUMsQ0FBQUEsQ0FBTixLQUF1QixDQWU1QixXQUFBLENBQ21CdkIsQ0FBQUEsQ0FDQXdCLEVBQ0F4QyxDQUFBQSxDQUNBeUMsQ0FBQUEsQ0FDakIsQ0FKaUIsSUFBQSxDQUFBLEtBQUEsQ0FBQXpCLENBQUFBLENBQ0EsSUFBQSxDQUFBLFNBQUEsQ0FBQXdCLENBQUFBLENBQ0EsSUFBQSxDQUFBLEdBQUEsQ0FBQXhDLENBQUFBLENBQ0EsZUFBQXlDLENBQUFBLENBbEJuQixJQUFBLENBQVEsU0FBMkIsRUFBQyxDQUNwQyxLQUFRLGFBQUEsQ0FBZ0IsS0FBQSxDQUN4QixLQUFRLFlBQUEsQ0FBZSxLQUFBLENBSXZCLEtBQVEsV0FBQSxDQUE2QixJQUFBLENBQ3JDLEtBQVEsU0FBQSxDQUFZLENBQUEsQ0FDcEIsS0FBUSxZQUFBLENBQWUsQ0FBQSxDQUN2QixJQUFBLENBQVEsY0FBQSxDQUFpQixDQUFBLENBQ3pCLElBQUEsQ0FBUSxZQUE2QixJQUFBLENBQ3JDLElBQUEsQ0FBUSxtQkFBcUIsQ0FBQSxDQUM3QixJQUFBLENBQVEsb0JBQTRELEtBT2pFLENBUUgsZUFBZUMsQ0FBQUEsQ0FBb0IsQ0FDN0IsS0FBSyxXQUFBLEdBQWdCQSxDQUFBQSxHQUNyQixLQUFLLFdBQUEsR0FBZ0IsSUFBQSxFQUFRLENBQUMsSUFBQSxDQUFLLFlBQUEsRUFDckMsSUFBQSxDQUFLLGFBQUEsQ0FBYyxTQUFTLENBQUEsQ0FFOUIsS0FBSyxXQUFBLENBQWNBLENBQUFBLENBQ25CLEtBQUssU0FBQSxDQUFZQyxDQUFBQSxHQUNqQixJQUFBLENBQUssWUFBQSxDQUFlLEVBQ3BCLElBQUEsQ0FBSyxjQUFBLENBQWlCLEVBQ3RCLElBQUEsQ0FBSyxXQUFBLENBQWMsS0FDbkIsSUFBQSxDQUFLLGtCQUFBLENBQXFCLEVBQzFCLElBQUEsQ0FBSyxZQUFBLENBQWUsS0FBQSxDQUNwQixJQUFBLENBQUssYUFBQSxDQUFnQixLQUFBLEVBQ3ZCLENBRUEsUUFBQSxFQUFpQixDQUNmLEdBQUksT0FBTyxNQUFBLENBQVcsSUFBYSxPQUtuQyxJQUFNQyxFQUFTLElBQVksQ0FDekIsR0FBSSxJQUFBLENBQUssYUFBQSxDQUFlLE9BQ3hCLElBQUEsQ0FBSyxhQUFBLENBQWdCLEtBQ3JCLElBQUEsQ0FBSyxhQUFBLENBQWMsVUFBVSxDQUFBLENBQzdCLElBQU14QixDQUFBQSxDQUFTLEtBQUssS0FBQSxDQUFNLEtBQUEsR0FDdEJBLENBQUFBLENBQU8sTUFBQSxDQUFTLEdBQ2xCLElBQUEsQ0FBSyxTQUFBLENBQVUsZ0JBQWdCQSxDQUFNLEVBRXpDLEVBRU15QixDQUFBQSxDQUFxQixJQUFZLENBQ2pDLFFBQUEsQ0FBUyxlQUFBLEdBQW9CLFdBQy9CLElBQUEsQ0FBSyxjQUFBLEVBQWtCLEVBQ3ZCLElBQUEsQ0FBSyxXQUFBLENBQWNGLEdBQU0sQ0FFekIsSUFBQSxDQUFLLFVBQVUsS0FBQSxFQUFNLENBQUUsTUFBTSxJQUFNLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FFbkMsUUFBQSxDQUFTLGtCQUFvQixTQUFBLEdBQzNCLElBQUEsQ0FBSyxjQUFnQixJQUFBLEdBQ3ZCLElBQUEsQ0FBSyxvQkFBc0JBLENBQUFBLEVBQU0sQ0FBSSxJQUFBLENBQUssV0FBQSxDQUMxQyxJQUFBLENBQUssV0FBQSxDQUFjLE1BR3JCLElBQUEsQ0FBSyxhQUFBLENBQWdCLE9BRXpCLENBQUEsQ0FFTUcsQ0FBQUEsQ0FBVyxJQUFZLENBQ3ZCLElBQUEsQ0FBSyxzQkFBd0IsSUFBQSxHQUNqQyxJQUFBLENBQUssb0JBQXNCLFVBQUEsQ0FBVyxJQUFNLENBQzFDLElBQUEsQ0FBSyxtQkFBQSxDQUFzQixLQUMzQixJQUFNQyxDQUFBQSxDQUFNQyxFQUFBQSxFQUFpQixDQUN6QkQsQ0FBQUEsQ0FBTSxJQUFBLENBQUssZUFBYyxJQUFBLENBQUssWUFBQSxDQUFlQSxHQUNuRCxDQUFBLENBQUcsR0FBRyxHQUNSLENBQUEsQ0FFQSxNQUFBLENBQU8saUJBQWlCLFVBQUEsQ0FBWUgsQ0FBTSxFQUMxQyxNQUFBLENBQU8sZ0JBQUEsQ0FBaUIsZUFBZ0JBLENBQU0sQ0FBQSxDQUM5QyxTQUFTLGdCQUFBLENBQWlCLGtCQUFBLENBQW9CQyxDQUFrQixDQUFBLENBQ2hFLE1BQUEsQ0FBTyxnQkFBQSxDQUFpQixTQUFVQyxDQUFBQSxDQUFVLENBQUUsUUFBUyxJQUFLLENBQUMsRUFFN0QsSUFBQSxDQUFLLFFBQUEsQ0FBUyxLQUNaLElBQU0sTUFBQSxDQUFPLG9CQUFvQixVQUFBLENBQVlGLENBQU0sRUFDbkQsSUFBTSxNQUFBLENBQU8sb0JBQW9CLGNBQUEsQ0FBZ0JBLENBQU0sQ0FBQSxDQUN2RCxJQUFNLFFBQUEsQ0FBUyxtQkFBQSxDQUFvQixtQkFBb0JDLENBQWtCLENBQUEsQ0FDekUsSUFBTSxNQUFBLENBQU8sbUJBQUEsQ0FBb0IsU0FBVUMsQ0FBUSxDQUFBLENBQ25ELElBQU0sQ0FDQSxJQUFBLENBQUssc0JBQXdCLElBQUEsR0FDL0IsWUFBQSxDQUFhLEtBQUssbUJBQW1CLENBQUEsQ0FDckMsS0FBSyxtQkFBQSxDQUFzQixJQUFBLEVBRS9CLENBQ0YsQ0FBQSxDQUVBLElBQUEsQ0FBSyxHQUFBLENBQUksTUFBTSxpQ0FBaUMsRUFDbEQsQ0FFQSxPQUFBLEVBQWdCLENBQ2QsUUFBV0csQ0FBQUEsSUFBVSxJQUFBLENBQUssU0FDeEJBLENBQUFBLEVBQU8sQ0FFVCxLQUFLLFFBQUEsQ0FBVyxHQUNsQixDQUVRLGFBQUEsQ0FBY0MsRUFBd0MsQ0FHNUQsR0FGSSxJQUFBLENBQUssWUFBQSxFQUNMLElBQUEsQ0FBSyxXQUFBLEdBQWdCLE1BQ3JCLENBQUMsSUFBQSxDQUFLLFVBQVcsT0FDckIsSUFBQSxDQUFLLGFBQWUsSUFBQSxDQUVwQixJQUFJQyxFQUFtQixJQUFBLENBQUssa0JBQUEsQ0FDeEIsS0FBSyxXQUFBLEdBQWdCLElBQUEsR0FDdkJBLEdBQW9CUixDQUFBQSxFQUFNLENBQUksS0FBSyxXQUFBLENBQUEsQ0FHckMsSUFBQSxDQUFLLFNBQUEsQ0FBVSxhQUFBLENBQWUsQ0FDNUIsSUFBQSxDQUFNLEtBQUssV0FBQSxDQUNYLGVBQUEsQ0FBaUJTLEVBQVdULENBQUFBLEVBQU0sQ0FBSSxLQUFLLFNBQVMsQ0FBQSxDQUNwRCxlQUFnQixJQUFBLENBQUssWUFBQSxDQUNyQixpQkFBa0IsSUFBQSxDQUFLLGNBQUEsQ0FDdkIscUJBQXNCUyxDQUFBQSxDQUFXRCxDQUFnQixFQUNqRCxTQUFBLENBQVdELENBQ2IsQ0FBQyxFQUNILENBQ0YsQ0FBQSxDQU1BLFNBQVNQLENBQUFBLEVBQWdCLENBQ3ZCLE9BQU8sSUFBQSxDQUFLLEdBQUEsRUFDZCxDQUVBLFNBQVNTLEVBQVdwQixDQUFBQSxDQUFvQixDQUN0QyxPQUFPLElBQUEsQ0FBSyxHQUFBLENBQUksRUFBRyxJQUFBLENBQUssS0FBQSxDQUFNQSxFQUFLLEdBQUcsQ0FBQSxDQUFJLEdBQUcsQ0FDL0MsQ0FFQSxTQUFTZ0IsSUFBMkIsQ0FDbEMsR0FBSSxPQUFPLFFBQUEsQ0FBYSxHQUFBLEVBQWUsT0FBTyxNQUFBLENBQVcsR0FBQSxDQUFhLE9BQU8sQ0FBQSxDQUM3RSxJQUFNSyxFQUFZLE1BQUEsQ0FBTyxPQUFBLEVBQVcsRUFDOUJDLENBQUFBLENBQUFBLENBQWEsUUFBQSxDQUFTLGlCQUFpQixZQUFBLEVBQWdCLENBQUEsR0FBTSxNQUFBLENBQU8sV0FBQSxFQUFlLENBQUEsQ0FBQSxDQUN6RixPQUFJQSxHQUFhLENBQUEsQ0FBVSxHQUFBLENBQ3BCLEtBQUssR0FBQSxDQUFJLEdBQUEsQ0FBSyxLQUFLLEtBQUEsQ0FBT0QsQ0FBQUEsQ0FBWUMsRUFBYSxHQUFHLENBQUMsQ0FDaEUsQ0MvSkEsSUFBTTdJLEdBQXlDLENBQzdDLE1BQUEsQ0FBUSxLQUNSLFVBQUEsQ0FBWSxJQUFBLENBQ1osVUFBQSxDQUFZLElBQUEsQ0FDWixVQUFBLENBQVksSUFBQSxDQUNaLGVBQWdCLEdBQ2xCLENBQUEsQ0FFYThJLEVBQU4sS0FBMEIsQ0FRL0IsWUFBWUMsQ0FBQUEsQ0FBZ0J4RCxDQUFBQSxDQUFhYSxFQUE2QixDQUp0RSxJQUFBLENBQWlCLFNBQTJCLEVBQUMsQ0FDN0MsS0FBUSxhQUFBLENBQStCLElBQUEsQ0FDdkMsS0FBUSxlQUFBLENBQWtCLENBQUEsQ0FHeEIsSUFBQSxDQUFLLEtBQUEsQ0FBUTJDLENBQUFBLENBQ2IsSUFBQSxDQUFLLElBQU14RCxDQUFBQSxDQUNYLElBQUEsQ0FBSyxJQUFNLENBQUUsR0FBR3ZGLEdBQVUsR0FBSW9HLENBQUFBLEVBQVUsRUFBSSxFQUM5QyxDQUVBLE9BQUEsRUFBZ0IsQ0FDZCxHQUFJLE9BQU8sTUFBQSxDQUFXLElBQWEsT0FDbkMsSUFBTTRDLENBQUFBLENBQVksT0FBTyxTQUFBLENBQWMsR0FBQSxDQUFjLFVBQVUsU0FBQSxDQUFZLElBQUEsQ0FDckVDLEVBQVVDLEVBQUFBLENBQWlCRixDQUFTLEVBRTFDLEdBQUksSUFBQSxDQUFLLElBQUksTUFBQSxDQUFRLENBQ25CLElBQU1HLENBQUFBLENBQVdqSSxDQUFBQSxFQUE0QixDQUMzQyxJQUFNa0ksQ0FBQUEsQ0FDSmxJLEVBQU0sS0FBQSxFQUFTQSxDQUFBQSxDQUFNLEtBQUEsQ0FBTSxLQUFBLENBQ3ZCLE1BQUEsQ0FBT0EsQ0FBQUEsQ0FBTSxNQUFNLEtBQUssQ0FBQSxDQUFFLE1BQU0sQ0FBQSxDQUFHLElBQUEsQ0FBSyxJQUFJLFVBQVUsQ0FBQSxDQUN0RCxLQUNBbUksQ0FBQUEsQ0FBWSxDQUFBLElBQUEsRUFBT25JLEVBQU0sT0FBTyxDQUFBLENBQUEsRUFBSUEsRUFBTSxRQUFRLENBQUEsQ0FBQSxFQUFJQSxFQUFNLE1BQU0sQ0FBQSxDQUFBLENBQ3BFLElBQUEsQ0FBSyxRQUFBLENBQVNtSSxDQUFTLENBQUEsRUFDM0IsS0FBSyxTQUFBLENBQVUsUUFBQSxDQUFVLENBQ3ZCLE9BQUEsQ0FBU25JLENBQUFBLENBQU0sUUFDZixNQUFBLENBQVFBLENBQUFBLENBQU0sVUFBWSxJQUFBLENBQzFCLElBQUEsQ0FBTUEsRUFBTSxNQUFBLEVBQVUsSUFBQSxDQUN0QixJQUFLQSxDQUFBQSxDQUFNLEtBQUEsRUFBUyxLQUNwQixLQUFBLENBQUFrSSxDQUFBQSxDQUNBLEtBQU0sZ0JBQUEsQ0FDTixPQUFBLENBQUFILEVBQ0EsVUFBQSxDQUFZRCxDQUNkLENBQUMsRUFDSCxDQUFBLENBQ0EsT0FBTyxnQkFBQSxDQUFpQixPQUFBLENBQVNHLENBQU8sQ0FBQSxDQUN4QyxJQUFBLENBQUssU0FBUyxJQUFBLENBQUssSUFBTSxPQUFPLG1CQUFBLENBQW9CLE9BQUEsQ0FBU0EsQ0FBTyxDQUFDLEVBQ3ZFLENBRUEsR0FBSSxJQUFBLENBQUssR0FBQSxDQUFJLFdBQVksQ0FDdkIsSUFBTUcsRUFBZXBJLENBQUFBLEVBQXVDLENBQzFELElBQU1xSSxDQUFBQSxDQUFTckksQ0FBQUEsQ0FBTSxPQUNmVixDQUFBQSxDQUNKK0ksQ0FBQUEsWUFBa0IsTUFDZEEsQ0FBQUEsQ0FBTyxPQUFBLENBQ1AsT0FBT0EsQ0FBQUEsRUFBVyxRQUFBLENBQ2hCQSxFQUNBQyxFQUFBQSxDQUFjRCxDQUFNLENBQUEsQ0FDdEJILENBQUFBLENBQ0pHLENBQUFBLFlBQWtCLEtBQUEsRUFBU0EsRUFBTyxLQUFBLENBQzlCLE1BQUEsQ0FBT0EsRUFBTyxLQUFLLENBQUEsQ0FBRSxNQUFNLENBQUEsQ0FBRyxJQUFBLENBQUssSUFBSSxVQUFVLENBQUEsQ0FDakQsS0FDQUYsQ0FBQUEsQ0FBWSxDQUFBLElBQUEsRUFBTzdJLENBQU8sQ0FBQSxDQUFBLENBQzVCLElBQUEsQ0FBSyxTQUFTNkksQ0FBUyxDQUFBLEVBQzNCLElBQUEsQ0FBSyxTQUFBLENBQVUsUUFBQSxDQUFVLENBQ3ZCLFFBQUE3SSxDQUFBQSxDQUNBLEtBQUEsQ0FBQTRJLEVBQ0EsSUFBQSxDQUFNLHFCQUFBLENBQ04sUUFBQUgsQ0FBQUEsQ0FDQSxVQUFBLENBQVlELENBQ2QsQ0FBQyxFQUNILEVBQ0EsTUFBQSxDQUFPLGdCQUFBLENBQWlCLHFCQUFzQk0sQ0FBVyxDQUFBLENBQ3pELEtBQUssUUFBQSxDQUFTLElBQUEsQ0FBSyxJQUFNLE1BQUEsQ0FBTyxtQkFBQSxDQUFvQixvQkFBQSxDQUFzQkEsQ0FBVyxDQUFDLEVBQ3hGLENBRUEsR0FBSSxJQUFBLENBQUssSUFBSSxVQUFBLENBQVksQ0FDdkIsSUFBTUcsQ0FBQUEsQ0FBZXZJLENBQUFBLEVBQXVCLENBQzFDLElBQU13SSxDQUFBQSxDQUNKeEksRUFJQSxNQUFBLENBQ0d3SSxDQUFBQSxFQUFRLE1BQ2IsSUFBQSxDQUFLLFNBQUEsQ0FBVUEsQ0FBQUEsQ0FBTyxJQUFBLENBQU0sQ0FDMUIsR0FBSUEsRUFBTyxVQUFBLEVBQWMsR0FDekIsT0FBQSxDQUFBVCxDQUFBQSxDQUNBLFdBQVlELENBQ2QsQ0FBQyxFQUNILENBQUEsQ0FDQSxNQUFBLENBQU8saUJBQWlCLG9CQUFBLENBQXNCUyxDQUE0QixFQUMxRSxJQUFBLENBQUssUUFBQSxDQUFTLEtBQUssSUFDakIsTUFBQSxDQUFPLG1CQUFBLENBQW9CLG9CQUFBLENBQXNCQSxDQUE0QixDQUMvRSxFQUNGLENBQ0YsQ0FFQSxXQUFrQixDQUNoQixJQUFBLElBQVdqQixLQUFVLElBQUEsQ0FBSyxRQUFBLENBQVVBLEdBQU8sQ0FDM0MsSUFBQSxDQUFLLFNBQVMsTUFBQSxDQUFTLEVBQ3pCLENBRVEsUUFBQSxDQUFTYSxDQUFBQSxDQUE0QixDQUMzQyxJQUFNbEYsQ0FBQUEsQ0FBTSxJQUFBLENBQUssR0FBQSxFQUFJLENBQ3JCLE9BQUksS0FBSyxhQUFBLEdBQWtCa0YsQ0FBQUEsRUFBYWxGLEVBQU0sSUFBQSxDQUFLLGVBQUEsQ0FBa0IsS0FBSyxHQUFBLENBQUksY0FBQSxDQUNyRSxNQUVULElBQUEsQ0FBSyxhQUFBLENBQWdCa0YsRUFDckIsSUFBQSxDQUFLLGVBQUEsQ0FBa0JsRixFQUNoQixLQUFBLENBQ1QsQ0FFUSxVQUFVd0YsQ0FBQUEsQ0FBY0MsQ0FBQUEsQ0FBMkMsQ0FDekUsR0FBSSxDQUNGLElBQUEsQ0FBSyxNQUFNRCxDQUFBQSxDQUFNQyxDQUFVLEVBQzdCLENBQUEsTUFBUzdELENBQUFBLENBQUssQ0FDWixJQUFBLENBQUssR0FBQSxDQUFJLEtBQUssNkJBQUEsQ0FBK0JBLENBQUcsRUFDbEQsQ0FDRixDQUNGLEVBRUEsU0FBU21ELEVBQUFBLENBQWlCVyxFQUEyQixDQUNuRCxHQUFJLENBQUNBLENBQUFBLENBQUksT0FBTyxTQUFBLENBQ2hCLElBQU1DLENBQUFBLENBQVcsWUFBQSxDQUFhLEtBQUtELENBQUUsQ0FBQSxFQUFLLENBQUMsT0FBQSxDQUFRLElBQUEsQ0FBS0EsQ0FBRSxDQUFBLENBQ3BERSxDQUFBQSxDQUFZLGNBQWMsSUFBQSxDQUFLRixDQUFFLEVBQ2pDRyxDQUFBQSxDQUFXLFVBQUEsQ0FBVyxLQUFLSCxDQUFFLENBQUEsRUFBSyxDQUFDQyxDQUFBQSxFQUFZLENBQUMsbUJBQUEsQ0FBb0IsS0FBS0QsQ0FBRSxDQUFBLENBQ2pGLE9BQU9DLENBQUFBLENBQVcsUUFBQSxDQUFXQyxFQUFZLFNBQUEsQ0FBWUMsQ0FBQUEsQ0FBVyxTQUFXLE9BQzdFLENBRUEsU0FBU1IsRUFBQUEsQ0FBY3ZHLENBQUFBLENBQXdCLENBQzdDLEdBQUksQ0FDRixPQUFPLElBQUEsQ0FBSyxTQUFBLENBQVVBLENBQUssQ0FBQSxFQUFLLE1BQUEsQ0FBT0EsQ0FBSyxDQUM5QyxDQUFBLEtBQVEsQ0FDTixPQUFPLE1BQUEsQ0FBT0EsQ0FBSyxDQUNyQixDQUNGLEtDNUVNZ0gsRUFBQUEsQ0FBa0IsQ0FBQyxlQUFnQixNQUFBLENBQVEsY0FBQSxDQUFnQiw2QkFBNkIsQ0FBQSxDQUVqRkMsQ0FBQUEsQ0FBTixLQUF1QixDQWM1QixXQUFBLENBQVluQixDQUFBQSxDQUFnQnhELENBQUFBLENBQWFhLENBQUFBLENBQWlDLENBTDFFLEtBQVEsYUFBQSxDQUFxQyxJQUFBLENBQzdDLEtBQVEsU0FBQSxDQUFZLEtBQUEsQ0FDcEIsS0FBUSxPQUFBLENBQXlCLElBQUEsQ0FDakMsS0FBUSxTQUFBLENBQVksQ0FBQSxDQUdsQixLQUFLLEtBQUEsQ0FBUTJDLENBQUFBLENBQ2IsS0FBSyxHQUFBLENBQU14RCxDQUFBQSxDQUNYLEtBQUssR0FBQSxDQUFNLENBQ1QsT0FBQSxDQUFTYSxDQUFBQSxFQUFRLE9BQUEsRUFBVyxJQUFBLENBQzVCLGNBQWVBLENBQUFBLEVBQVEsYUFBQSxHQUFtQitELEdBQU1BLENBQUFBLEVBQUssR0FBQSxDQUFBLENBQ3JELG1CQUFvQi9ELENBQUFBLEVBQVEsa0JBQUEsRUFBc0IsQ0FBQyxnQkFBQSxDQUFrQixnQkFBZ0IsRUFDckYsc0JBQUEsQ0FBd0JBLENBQUFBLEVBQVEsd0JBQTBCNkQsRUFBQUEsQ0FDMUQsY0FBQSxDQUFnQjdELEdBQVEsY0FBQSxFQUFrQixHQUFBLENBQzFDLFNBQUEsQ0FBV0EsQ0FBQUEsRUFBUSxTQUFBLEVBQWEsSUFDbEMsRUFDRixDQUVBLE9BQUEsRUFBZ0IsQ0FDVixJQUFBLENBQUssU0FBQSxFQUFhLENBQUMsSUFBQSxDQUFLLEdBQUEsQ0FBSSxTQUM1QixPQUFPLE1BQUEsQ0FBVyxLQUFlLE9BQU8sTUFBQSxDQUFPLE9BQVUsVUFBQSxHQVE3RCxJQUFBLENBQUssY0FBZ0IsTUFBQSxDQUFPLEtBQUEsQ0FJNUIsTUFBQSxDQUFPLEtBQUEsQ0FBUSxNQUFPZ0UsQ0FBQUEsQ0FBMEJDLElBQTBDLENBQ3hGLElBQU1DLEVBQVUsSUFBQSxDQUFLLEdBQUEsR0FDZnhELENBQUFBLENBQU15RCxFQUFBQSxDQUFXSCxDQUFLLENBQUEsQ0FDdEJJLENBQUFBLENBQUFBLENBQ0pILEdBQU0sTUFBQSxHQUFXRCxDQUFBQSxZQUFpQixRQUFVQSxDQUFBQSxDQUFNLE1BQUEsQ0FBUyxRQUMzRCxXQUFBLEVBQVksQ0FFZCxHQUFJLENBQ0YsSUFBTTVILEVBQU0sTUFBTSxJQUFBLENBQUssY0FBZSxJQUFBLENBQUssTUFBQSxDQUFRNEgsRUFBT0MsQ0FBSSxDQUFBLENBRTlELE9BREksSUFBQSxDQUFLLFVBQUEsQ0FBV3ZELENBQUcsQ0FBQSxFQUNuQixDQUFDLEtBQUssR0FBQSxDQUFJLGFBQUEsQ0FBY3RFLEVBQUksTUFBTSxDQUFBLEVBQ3RDLElBQUEsQ0FBSyxJQUFBLENBQUssQ0FDUixJQUFBLENBQU0sYUFDTixHQUFBLENBQUFzRSxDQUFBQSxDQUNBLE9BQUEwRCxDQUFBQSxDQUNBLE1BQUEsQ0FBUWhJLEVBQUksTUFBQSxDQUNaLFVBQUEsQ0FBWSxLQUFLLEdBQUEsRUFBSSxDQUFJOEgsRUFDekIsVUFBQSxDQUFZOUgsQ0FBQUEsQ0FBSSxRQUFRLEdBQUEsQ0FBSSxjQUFjLEVBQzFDLGdCQUFBLENBQWtCLElBQUEsQ0FBSyxZQUFBLENBQWFBLENBQUFBLENBQUksT0FBTyxDQUFBLENBQy9DLGFBQWMsSUFBQSxDQUFLLGVBQUEsRUFDckIsQ0FBQyxDQUFBLENBQ01BLENBQ1QsQ0FBQSxNQUFTdUQsQ0FBQUEsQ0FBSyxDQUNaLEdBQUksQ0FBQyxLQUFLLFVBQUEsQ0FBV2UsQ0FBRyxFQUFHLENBQ3pCLElBQU0yRCxFQUFVMUUsQ0FBQUEsWUFBZSxLQUFBLEVBQVNBLENBQUFBLENBQUksSUFBQSxHQUFTLFlBQUEsQ0FDL0MyRSxDQUFBQSxDQUFVM0UsYUFBZSxLQUFBLENBQVFBLENBQUFBLENBQUksS0FBTyxjQUFBLENBQzVDNEUsQ0FBQUEsQ0FBYTVFLGFBQWUsS0FBQSxDQUFRQSxDQUFBQSxDQUFJLFFBQVUsTUFBQSxDQUFPQSxDQUFHLEVBQ2xFLElBQUEsQ0FBSyxJQUFBLENBQUssQ0FDUixJQUFBLENBQU0saUJBQUEsQ0FDTixJQUFBZSxDQUFBQSxDQUNBLE1BQUEsQ0FBQTBELENBQUFBLENBQ0EsTUFBQSxDQUFRLENBQUEsQ0FDUixVQUFBLENBQVksS0FBSyxHQUFBLEVBQUksQ0FBSUYsRUFDekIsVUFBQSxDQUFZLElBQUEsQ0FDWixpQkFBa0IsRUFBQyxDQUNuQixhQUFjLElBQUEsQ0FBSyxlQUFBLEdBQ25CLFVBQUEsQ0FBWUksQ0FBQUEsQ0FDWixjQUFlQyxDQUFBQSxDQUNmLE9BQUEsQ0FBQUYsQ0FDRixDQUFDLEVBQ0gsQ0FDQSxNQUFNMUUsQ0FDUixDQUNGLEVBRUEsSUFBQSxDQUFLLFNBQUEsQ0FBWSxNQUNuQixDQUVBLFNBQUEsRUFBa0IsQ0FDWCxJQUFBLENBQUssU0FBQSxHQUNOLE9BQU8sTUFBQSxDQUFXLEdBQUEsRUFBZSxLQUFLLGFBQUEsR0FDeEMsTUFBQSxDQUFPLE1BQVEsSUFBQSxDQUFLLGFBQUEsQ0FBQSxDQUV0QixLQUFLLGFBQUEsQ0FBZ0IsSUFBQSxDQUNyQixJQUFBLENBQUssU0FBQSxDQUFZLEtBQUEsRUFDbkIsQ0FFUSxXQUFXZSxDQUFBQSxDQUFzQixDQUN2QyxPQUFPLElBQUEsQ0FBSyxHQUFBLENBQUksbUJBQW1CLElBQUEsQ0FBTThELENBQUFBLEVBQU1BLEVBQUUsSUFBQSxDQUFLOUQsQ0FBRyxDQUFDLENBQzVELENBRVEsS0FBSzRDLENBQUFBLENBQW9DLENBQy9DLElBQU1MLENBQUFBLENBQVksQ0FBQSxFQUFHSyxDQUFBQSxDQUFPLE1BQU0sQ0FBQSxDQUFBLEVBQUlBLENBQUFBLENBQU8sR0FBRyxDQUFBLENBQUEsRUFBSUEsQ0FBQUEsQ0FBTyxNQUFNLENBQUEsQ0FBQSxDQUMzRHZGLENBQUFBLENBQU0sS0FBSyxHQUFBLEVBQUksQ0FDckIsR0FBSSxFQUFBLElBQUEsQ0FBSyxPQUFBLEdBQVlrRixHQUFhbEYsQ0FBQUEsQ0FBTSxJQUFBLENBQUssVUFBWSxJQUFBLENBQUssR0FBQSxDQUFJLGdCQUNsRSxDQUFBLElBQUEsQ0FBSyxPQUFBLENBQVVrRixDQUFBQSxDQUNmLElBQUEsQ0FBSyxTQUFBLENBQVlsRixDQUFBQSxDQUVqQixHQUFJLENBQ0YsSUFBQSxDQUFLLE1BQU0sYUFBQSxDQUFlLENBQ3hCLElBQUt1RixDQUFBQSxDQUFPLEdBQUEsQ0FDWixPQUFRQSxDQUFBQSxDQUFPLE1BQUEsQ0FDZixPQUFRQSxDQUFBQSxDQUFPLE1BQUEsQ0FDZixXQUFZQSxDQUFBQSxDQUFPLFVBQUEsQ0FDbkIsV0FBWUEsQ0FBQUEsQ0FBTyxVQUFBLENBQ25CLGdCQUFBLENBQWtCQSxDQUFBQSxDQUFPLGdCQUFBLENBQ3pCLFlBQUEsQ0FBY0EsRUFBTyxZQUFBLENBQ3JCLElBQUEsQ0FBTUEsRUFBTyxJQUFBLENBQ2IsR0FBSUEsRUFBTyxVQUFBLEdBQWUsS0FBQSxDQUFBLENBQVksQ0FBRSxVQUFBLENBQVlBLENBQUFBLENBQU8sVUFBVyxDQUFBLENBQUksR0FDMUUsR0FBSUEsQ0FBQUEsQ0FBTyxnQkFBa0IsS0FBQSxDQUFBLENBQVksQ0FBRSxhQUFBLENBQWVBLENBQUFBLENBQU8sYUFBYyxDQUFBLENBQUksRUFBQyxDQUNwRixHQUFJQSxFQUFPLE9BQUEsR0FBWSxLQUFBLENBQUEsQ0FBWSxDQUFFLE9BQUEsQ0FBU0EsQ0FBQUEsQ0FBTyxPQUFRLENBQUEsQ0FBSSxFQUNuRSxDQUFDLEVBQ0gsT0FBUzNELENBQUFBLENBQUssQ0FDWixLQUFLLEdBQUEsQ0FBSSxJQUFBLENBQUssa0NBQUEsQ0FBb0NBLENBQUcsRUFDdkQsQ0FFQSxHQUFJLElBQUEsQ0FBSyxHQUFBLENBQUksVUFDWCxHQUFJLENBQ0YsS0FBSyxHQUFBLENBQUksU0FBQSxDQUFVMkQsQ0FBTSxFQUMzQixDQUFBLE1BQVMzRCxFQUFLLENBQ1osSUFBQSxDQUFLLElBQUksSUFBQSxDQUFLLHNDQUFBLENBQXdDQSxDQUFHLEVBQzNELENBQUEsQ0FFSixDQUVRLFlBQUEsQ0FBYUUsQ0FBQUEsQ0FBMEMsQ0FDN0QsSUFBTW5ELENBQUFBLENBQThCLEdBQ3BDLElBQUEsSUFBVzZHLENBQUFBLElBQVEsS0FBSyxHQUFBLENBQUksc0JBQUEsQ0FBd0IsQ0FDbEQsSUFBTWtCLENBQUFBLENBQUk1RSxFQUFRLEdBQUEsQ0FBSTBELENBQUksRUFDdEJrQixDQUFBQSxHQUFNLElBQUEsR0FBTS9ILEVBQUk2RyxDQUFJLENBQUEsQ0FBSWtCLENBQUFBLEVBQzlCLENBQ0EsT0FBTy9ILENBQ1QsQ0FFUSxlQUFBLEVBQTRCLENBQ2xDLE9BQUksT0FBTyxRQUFBLENBQWEsS0FBZSxPQUFPLFFBQUEsQ0FBUyxRQUFXLFFBQUEsQ0FBaUIsR0FDL0UsUUFBQSxDQUFTLE1BQUEsQ0FBTyxTQUFXLENBQUEsQ0FBVSxHQUNsQyxRQUFBLENBQVMsTUFBQSxDQUNiLEtBQUEsQ0FBTSxHQUFHLENBQUEsQ0FDVCxHQUFBLENBQUtnSSxHQUFTQSxDQUFBQSxDQUFLLElBQUEsR0FBTyxLQUFBLENBQU0sR0FBRyxFQUFFLENBQUMsQ0FBQSxFQUFLLEVBQUUsQ0FBQSxDQUM3QyxNQUFBLENBQVFuQixHQUFTQSxDQUFBQSxDQUFLLE1BQUEsQ0FBUyxDQUFDLENBQ3JDLENBQ0YsRUFFQSxTQUFTWSxFQUFBQSxDQUFXSCxDQUFBQSxDQUFrQyxDQUNwRCxPQUFJLE9BQU9BLEdBQVUsUUFBQSxDQUFpQkEsQ0FBQUEsQ0FDbENBLGFBQWlCLEdBQUEsQ0FBWUEsQ0FBQUEsQ0FBTSxVQUFTLENBQzVDQSxDQUFBQSxZQUFpQixRQUFnQkEsQ0FBQUEsQ0FBTSxHQUFBLENBQ3BDLE9BQU9BLENBQUssQ0FDckIsQ0N6TUEsSUFBTXBLLEVBQUFBLENBQTZDLENBQ2pELElBQUEsQ0FBTSxJQUFBLENBQ04sSUFBQSxDQUFNLElBQUEsQ0FDTixhQUFBLENBQWUsQ0FBQSxDQUNmLGFBQWMsR0FBQSxDQUNkLFlBQUEsQ0FBYyxHQUNkLGNBQUEsQ0FBZ0IsQ0FDbEIsRUFFTStLLEVBQUFBLENBQW1CLElBQUksSUFBSSxDQUMvQixHQUFBLENBQ0EsU0FDQSxPQUFBLENBQ0EsUUFBQSxDQUNBLFdBQ0EsT0FBQSxDQUNBLFNBQUEsQ0FDQSxTQUNBLFNBQ0YsQ0FBQyxDQUFBLENBUVlDLENBQUFBLENBQU4sS0FBOEIsQ0FVbkMsWUFBWWpDLENBQUFBLENBQWdCeEQsQ0FBQUEsQ0FBYWEsRUFBaUMsQ0FOMUUsSUFBQSxDQUFpQixTQUEyQixFQUFDLENBQzdDLEtBQVEsTUFBQSxDQUF3QixHQUNoQyxJQUFBLENBQVEsaUJBQUEsQ0FBb0IsRUFDNUIsSUFBQSxDQUFRLGVBQUEsQ0FBa0IsRUFDMUIsSUFBQSxDQUFRLG9CQUFBLENBQXVCLENBQUEsQ0FHN0IsSUFBQSxDQUFLLEtBQUEsQ0FBUTJDLENBQUFBLENBQ2IsS0FBSyxHQUFBLENBQU14RCxDQUFBQSxDQUNYLEtBQUssR0FBQSxDQUFNLENBQUUsR0FBR3ZGLEVBQUFBLENBQVUsR0FBSW9HLEdBQVUsRUFBSSxFQUM5QyxDQUVBLE9BQUEsRUFBZ0IsQ0FDZCxHQUFJLE9BQU8sT0FBVyxHQUFBLENBQWEsT0FFbkMsSUFBTTZFLENBQUFBLENBQVcvSixDQUFBQSxFQUE0QixDQUMzQyxJQUFNZ0ssQ0FBQUEsQ0FBU2hLLENBQUFBLENBQU0sT0FDckIsR0FBSSxFQUFFZ0ssYUFBa0IsT0FBQSxDQUFBLENBQVUsT0FDbEMsSUFBTS9HLENBQUFBLENBQU0sSUFBQSxDQUFLLEtBQUksQ0FHckIsSUFBQSxDQUFLLE9BQU8sSUFBQSxDQUFLLENBQUUsRUFBR0EsQ0FBQUEsQ0FBSyxDQUFBLENBQUdqRCxDQUFBQSxDQUFNLE9BQUEsQ0FBUyxDQUFBLENBQUdBLENBQUFBLENBQU0sT0FBUSxDQUFDLENBQUEsQ0FDL0QsSUFBTWlLLENBQUFBLENBQVNoSCxDQUFBQSxDQUFNLEtBQUssR0FBQSxDQUFJLFlBQUEsQ0FDOUIsS0FBSyxNQUFBLENBQVMsSUFBQSxDQUFLLE9BQU8sTUFBQSxDQUFRdEMsQ0FBQUEsRUFBTUEsRUFBRSxDQUFBLEVBQUtzSixDQUFNLEVBRWpELElBQUEsQ0FBSyxHQUFBLENBQUksSUFBQSxFQUFNLElBQUEsQ0FBSyxhQUFBLENBQWNELENBQUFBLENBQVEvRyxDQUFHLENBQUEsQ0FDN0MsSUFBQSxDQUFLLElBQUksSUFBQSxFQUFNLElBQUEsQ0FBSyxjQUFjakQsQ0FBQUEsQ0FBT2dLLENBQUFBLENBQVEvRyxDQUFHLEVBQzFELENBQUEsQ0FLQSxTQUFTLGdCQUFBLENBQWlCLE9BQUEsQ0FBUzhHLEVBQVMsQ0FBRSxPQUFBLENBQVMsSUFBSyxDQUFDLENBQUEsQ0FDN0QsSUFBQSxDQUFLLFFBQUEsQ0FBUyxJQUFBLENBQUssSUFBTSxTQUFTLG1CQUFBLENBQW9CLE9BQUEsQ0FBU0EsQ0FBTyxDQUFDLENBQUEsQ0FFdkUsS0FBSyxHQUFBLENBQUksS0FBQSxDQUFNLHlDQUF5QyxFQUMxRCxDQUVBLFdBQWtCLENBQ2hCLElBQUEsSUFBV3pDLEtBQVUsSUFBQSxDQUFLLFFBQUEsQ0FBVUEsR0FBTyxDQUMzQyxJQUFBLENBQUssUUFBQSxDQUFTLE1BQUEsQ0FBUyxDQUFBLENBQ3ZCLElBQUEsQ0FBSyxPQUFTLEdBQ2hCLENBRVEsYUFBQSxDQUFjMEMsQ0FBQUEsQ0FBaUIvRyxFQUFtQixDQUV4RCxHQURJQSxFQUFNLElBQUEsQ0FBSyxpQkFBQSxFQUNYLEtBQUssTUFBQSxDQUFPLE1BQUEsQ0FBUyxLQUFLLEdBQUEsQ0FBSSxhQUFBLENBQWUsT0FHakQsSUFBTWlILENBQUFBLENBQVMsSUFBQSxDQUFLLE1BQUEsQ0FBTyxJQUFBLENBQUssTUFBQSxDQUFPLE9BQVMsQ0FBQyxDQUFBLENBQzdDQyxFQUFVLENBQUEsQ0FDZCxJQUFBLElBQVd4SixLQUFLLElBQUEsQ0FBSyxNQUFBLENBQVEsQ0FDM0IsSUFBTXlKLENBQUFBLENBQUt6SixFQUFFLENBQUEsQ0FBSXVKLENBQUFBLENBQU8sRUFDbEJHLENBQUFBLENBQUsxSixDQUFBQSxDQUFFLEVBQUl1SixDQUFBQSxDQUFPLENBQUEsQ0FDcEJFLENBQUFBLENBQUtBLENBQUFBLENBQUtDLENBQUFBLENBQUtBLENBQUFBLEVBQU0sS0FBSyxHQUFBLENBQUksWUFBQSxDQUFlLEtBQUssR0FBQSxDQUFJLFlBQUEsR0FBY0YsR0FBVyxDQUFBLEVBQ3JGLENBQ0lBLEVBQVUsSUFBQSxDQUFLLEdBQUEsQ0FBSSxlQUNsQixJQUFBLENBQUssT0FBQSxDQUFRbEgsQ0FBRyxDQUFBLEdBR3JCLElBQUEsQ0FBSyxrQkFBb0JBLENBQUFBLENBQU0sSUFBQSxDQUFLLEdBQUEsQ0FBSSxZQUFBLENBRXhDLElBQUEsQ0FBSyxTQUFBLENBQVUsY0FBZSxDQUM1QixNQUFBLENBQVFxSCxFQUFlTixDQUFNLENBQUEsQ0FDN0IsYUFBY0csQ0FBQUEsQ0FDZCxDQUFBLENBQUdELEVBQU8sQ0FBQSxDQUNWLENBQUEsQ0FBR0EsRUFBTyxDQUFBLENBQ1YsSUFBQSxDQUFNLE9BQU8sUUFBQSxDQUFhLEdBQUEsQ0FBYyxTQUFTLFFBQUEsQ0FBVyxJQUM5RCxDQUFDLENBQUEsRUFDSCxDQUVRLGFBQUEsQ0FBY2xLLEVBQW1CZ0ssQ0FBQUEsQ0FBaUIvRyxDQUFBQSxDQUFtQixDQUV2RWpELENBQUFBLENBQU0sZ0JBQUEsRUFDTnVLLEdBQWNQLENBQU0sQ0FBQSxFQUNuQixLQUFLLE9BQUEsQ0FBUS9HLENBQUcsR0FFckIsSUFBQSxDQUFLLFNBQUEsQ0FBVSxjQUFlLENBQzVCLE1BQUEsQ0FBUXFILEVBQWVOLENBQU0sQ0FBQSxDQUM3QixDQUFBLENBQUdoSyxDQUFBQSxDQUFNLE9BQUEsQ0FDVCxDQUFBLENBQUdBLEVBQU0sT0FBQSxDQUNULElBQUEsQ0FBTSxPQUFPLFFBQUEsQ0FBYSxHQUFBLENBQWMsU0FBUyxRQUFBLENBQVcsSUFDOUQsQ0FBQyxFQUNILENBRVEsUUFBUWlELENBQUFBLENBQXNCLENBS3BDLE9BSklBLENBQUFBLENBQU0sSUFBQSxDQUFLLHNCQUF3QixHQUFBLEdBQ3JDLElBQUEsQ0FBSyxvQkFBQSxDQUF1QkEsQ0FBQUEsQ0FDNUIsSUFBQSxDQUFLLGVBQUEsQ0FBa0IsR0FFckIsSUFBQSxDQUFLLGVBQUEsRUFBbUIsS0FBSyxHQUFBLENBQUksY0FBQSxDQUF1QixPQUM1RCxJQUFBLENBQUssZUFBQSxFQUFtQixFQUNqQixJQUFBLENBQ1QsQ0FFUSxVQUFVd0YsQ0FBQUEsQ0FBY0MsQ0FBQUEsQ0FBMkMsQ0FDekUsR0FBSSxDQUNGLEtBQUssS0FBQSxDQUFNRCxDQUFBQSxDQUFNQyxDQUFVLEVBQzdCLENBQUEsTUFBUzdELENBQUFBLENBQUssQ0FDWixJQUFBLENBQUssR0FBQSxDQUFJLEtBQUssaUNBQUEsQ0FBbUNBLENBQUcsRUFDdEQsQ0FDRixDQUNGLEVBRUEsU0FBUzBGLEVBQUFBLENBQWNDLEVBQXNCLENBQzNDLElBQUlDLEVBQXNCRCxDQUFBQSxDQUN0QkUsQ0FBQUEsQ0FBUSxFQUNaLEtBQU9ELENBQUFBLEVBQU9DLENBQUFBLENBQVEsQ0FBQSxFQUFHLENBQ3ZCLEdBQUliLEdBQWlCLEdBQUEsQ0FBSVksQ0FBQUEsQ0FBSSxPQUFPLENBQUEsQ0FBRyxPQUFPLE1BQzlDLElBQU1FLENBQUFBLENBQU9GLEVBQUksWUFBQSxDQUFhLE1BQU0sRUFNcEMsR0FMSUUsQ0FBQUEsRUFBUSw0REFBNEQsSUFBQSxDQUFLQSxDQUFJLEdBRzdFRixDQUFBQSxDQUFJLFlBQUEsQ0FBYSxVQUFVLENBQUEsRUFDM0JBLENBQUFBLENBQUksYUFBYSxpQkFBaUIsQ0FBQSxFQUNsQ0EsRUFBSSxZQUFBLENBQWEsZ0JBQWdCLEVBQUcsT0FBTyxLQUFBLENBQy9DQSxFQUFNQSxDQUFBQSxDQUFJLGFBQUEsQ0FDVkMsR0FBUyxFQUNYLENBQ0EsT0FBTyxNQUNULENBRUEsU0FBU0osQ0FBQUEsQ0FBZUUsQ0FBQUEsQ0FBcUIsQ0FDM0MsSUFBTUksQ0FBQUEsQ0FBTUosQ0FBQUEsQ0FBRyxRQUFRLFdBQUEsRUFBWSxDQUM3Qi9KLEVBQUsrSixDQUFBQSxDQUFHLEVBQUEsQ0FBSyxJQUFJQSxDQUFBQSxDQUFHLEVBQUUsR0FBSyxFQUFBLENBQzNCSyxDQUFBQSxDQUNKTCxFQUFHLFNBQUEsQ0FBVSxNQUFBLENBQVMsRUFBSSxDQUFBLENBQUEsRUFBSSxLQUFBLENBQU0sS0FBS0EsQ0FBQUEsQ0FBRyxTQUFTLENBQUEsQ0FBRSxLQUFBLENBQU0sQ0FBQSxDQUFHLENBQUMsRUFBRSxJQUFBLENBQUssR0FBRyxDQUFDLENBQUEsQ0FBQSxDQUFLLEVBQUEsQ0FDbkYsT0FBTyxDQUFBLEVBQUdJLENBQUcsR0FBR25LLENBQUUsQ0FBQSxFQUFHb0ssQ0FBTyxDQUFBLENBQUEsQ0FBRyxLQUFBLENBQU0sRUFBRyxHQUFHLENBQzdDLENDcExBLElBQU1DLENBQUFBLENBQXVCLHlCQUFBLENBQ3ZCQyxDQUFBQSxDQUF5QixNQUFBLENBUXpCQyxFQUFBQSxDQUFtQyxDQUN2QyxDQUFFLE9BQUEsQ0FBUyxRQUFTLE1BQUEsQ0FBUSxjQUFBLENBQWdCLFFBQVMsY0FBZSxDQUFBLENBQ3BFLENBQUUsT0FBQSxDQUFTLE9BQUEsQ0FBUyxPQUFRLGlCQUFBLENBQW1CLE9BQUEsQ0FBUyxpQkFBa0IsQ0FBQSxDQUMxRSxDQUFFLFFBQVMsT0FBQSxDQUFTLE1BQUEsQ0FBUSxhQUFBLENBQWUsT0FBQSxDQUFTLGFBQWMsQ0FBQSxDQUNsRSxDQUFFLE9BQUEsQ0FBUyxPQUFBLENBQVMsT0FBUSxXQUFBLENBQWEsT0FBQSxDQUFTLFdBQVksQ0FBQSxDQUM5RCxDQUFFLFFBQVMsT0FBQSxDQUFTLE1BQUEsQ0FBUSxtQkFBb0IsT0FBQSxDQUFTLGtCQUFtQixFQUM1RSxDQUFFLE9BQUEsQ0FBUyxRQUFTLE1BQUEsQ0FBUSxvQkFBQSxDQUFzQixPQUFBLENBQVMsb0JBQXFCLENBQUEsQ0FDaEYsQ0FBRSxRQUFTLE9BQUEsQ0FBUyxNQUFBLENBQVEsaUJBQWtCLE9BQUEsQ0FBUyxnQkFBaUIsRUFDeEUsQ0FBRSxPQUFBLENBQVMsVUFBVyxNQUFBLENBQVEsZUFBQSxDQUFpQixRQUFTLGVBQWdCLENBQUEsQ0FDeEUsQ0FBRSxPQUFBLENBQVMsU0FBQSxDQUFXLE9BQVEsc0JBQUEsQ0FBd0IsT0FBQSxDQUFTLHNCQUF1QixDQUFBLENBQ3RGLENBQUUsT0FBQSxDQUFTLFVBQVcsTUFBQSxDQUFRLHdCQUFBLENBQTBCLFFBQVMsd0JBQXlCLENBQzVGLEVBRUEsU0FBU0MsQ0FBQUEsQ0FBUUMsRUFBZ0JwSixDQUFBQSxDQUE0QixDQUMzRCxHQUFJLENBQ0YsT0FBT29KLEVBQU0sT0FBQSxDQUFRcEosQ0FBRyxDQUMxQixDQUFBLEtBQVEsQ0FDTixPQUFPLElBQ1QsQ0FDRixDQUVBLFNBQVNxSixDQUFBQSxDQUFRRCxDQUFBQSxDQUFnQnBKLEVBQWFDLENBQUFBLENBQXFCLENBQ2pFLEdBQUksQ0FDRm1KLENBQUFBLENBQU0sUUFBUXBKLENBQUFBLENBQUtDLENBQUssRUFDMUIsQ0FBQSxLQUFRLENBRVIsQ0FDRixDQUVBLFNBQVNxSixHQUFXRixDQUFBQSxDQUFnQnBKLENBQUFBLENBQW1CLENBQ3JELEdBQUksQ0FDRm9KLENBQUFBLENBQU0sV0FBV3BKLENBQUcsRUFDdEIsTUFBUSxDQUVSLENBQ0YsQ0FNTyxTQUFTdUosQ0FBQUEsRUFBaUMsQ0FDL0MsR0FBSSxPQUFPLE9BQVcsR0FBQSxDQUFhLE9BQ25DLElBQU1DLENBQUFBLENBQVEsTUFBQSxDQUFPLGFBQ2ZDLENBQUFBLENBQVUsTUFBQSxDQUFPLGNBQUEsQ0FDdkIsR0FBSSxFQUFBLENBQUNELENBQUFBLEVBQVMsQ0FBQ0MsQ0FBQUEsQ0FBQUEsRUFHWE4sQ0FBQUEsQ0FBUUssRUFBT1IsQ0FBb0IsQ0FBQSxHQUFNQyxFQUU3QyxDQUFBLElBQUEsSUFBVzFLLENBQUFBLElBQVMySyxHQUFTLENBQzNCLElBQU1FLEVBQVE3SyxDQUFBQSxDQUFNLE9BQUEsR0FBWSxRQUFVaUwsQ0FBQUEsQ0FBUUMsQ0FBQUEsQ0FFbEQsR0FEaUJOLENBQUFBLENBQVFDLENBQUFBLENBQU83SyxDQUFBQSxDQUFNLE9BQU8sQ0FBQSxHQUM1QixJQUFBLENBQU0sU0FDdkIsSUFBTW1MLENBQUFBLENBQVNQLEVBQVFDLENBQUFBLENBQU83SyxDQUFBQSxDQUFNLE1BQU0sQ0FBQSxDQUN0Q21MLENBQUFBLEdBQVcsT0FDZkwsQ0FBQUEsQ0FBUUQsQ0FBQUEsQ0FBTzdLLEVBQU0sT0FBQSxDQUFTbUwsQ0FBTSxFQUlwQ0osRUFBQUEsQ0FBV0YsQ0FBQUEsQ0FBTzdLLEVBQU0sTUFBTSxDQUFBLEVBQ2hDLENBRUE4SyxDQUFBQSxDQUFRRyxDQUFBQSxDQUFPUixDQUFBQSxDQUFzQkMsQ0FBc0IsRUFBQSxDQUM3RCxDQ3hETyxJQUFNVSxDQUFBQSxDQUFOLE1BQU1BLENBQTRCLENBdUIvQixXQUFBLENBQVl2RyxFQUF3QmIsQ0FBQUEsQ0FBYWhGLENBQUFBLENBQW9CLENBSDdFLElBQUEsQ0FBUSxVQUFBLENBQW9ELEtBQzVELElBQUEsQ0FBUSxTQUFBLENBQVksTUE0QmxCLEdBekJBLElBQUEsQ0FBSyxHQUFBLENBQU02RixDQUFBQSxDQUNYLElBQUEsQ0FBSyxHQUFBLENBQU1iLEVBQ1gsSUFBQSxDQUFLLEdBQUEsQ0FBTWhGLEVBQ1gsSUFBQSxDQUFLLE9BQUEsQ0FBVSxJQUFJb0QsQ0FBQUEsQ0FDbkIsSUFBQSxDQUFLLE1BQVEsSUFBSVUsQ0FBQUEsQ0FBVytCLEVBQU8sWUFBWSxDQUFBLENBQy9DLEtBQUssV0FBQSxDQUFjLElBQUkzQixFQUN2QixJQUFBLENBQUssV0FBQSxDQUFZLFlBQUEsQ0FBYSxJQUFBLENBQUssR0FBQSxDQUFJLEtBQUssRUFDNUMsSUFBQSxDQUFLLGlCQUFBLENBQW9CLElBQUlRLENBQUFBLENBQzdCLElBQUEsQ0FBSyxnQkFBa0IsSUFBSUssQ0FBQUEsQ0FBZ0JDLENBQUcsQ0FBQSxDQUM5QyxJQUFBLENBQUssYUFBZSxJQUFJa0MsQ0FBQUEsQ0FDeEIsS0FBSyxZQUFBLENBQWUsSUFBSUcsRUFDeEIsSUFBQSxDQUFLLFNBQUEsQ0FBWSxJQUFJdkIsQ0FBQUEsQ0FDbkJELENBQUFBLENBQU8sTUFBQSxDQUNQQSxFQUFPLE1BQUEsQ0FDUEEsQ0FBQUEsQ0FBTyxZQUNQQSxDQUFBQSxDQUFPLGFBQUEsQ0FDUCxLQUFLLEtBQUEsQ0FDTCxJQUFBLENBQUssYUFDTCxJQUFBLENBQUssWUFBQSxDQUNMYixFQUNBYSxDQUFBQSxDQUFPLFVBQ1QsRUFDQSxJQUFBLENBQUssU0FBQSxDQUFZLElBQUkwQixDQUFBQSxDQUFpQixJQUFBLENBQUssS0FBQSxDQUFPLElBQUEsQ0FBSyxTQUFBLENBQVd2QyxDQUFBQSxDQUFLLENBQUNvRSxDQUFBQSxDQUFNaUQsQ0FBQUEsR0FDNUUsS0FBSyxLQUFBLENBQU1qRCxDQUFBQSxDQUFNaUQsQ0FBSyxDQUN4QixDQUFBLENBQ0ksT0FBTyxNQUFBLENBQVcsR0FBQSxFQUFlLEtBQUssR0FBQSxDQUFJLGlCQUFBLEdBQXNCLE1BQU8sQ0FDekUsSUFBTUMsRUFDSixPQUFPLElBQUEsQ0FBSyxJQUFJLGlCQUFBLEVBQXNCLFFBQUEsQ0FBVyxLQUFLLEdBQUEsQ0FBSSxpQkFBQSxDQUFvQixPQUNoRixJQUFBLENBQUssWUFBQSxDQUFlLElBQUkvRCxDQUFBQSxDQUN0QixDQUFDYSxFQUFNaUQsQ0FBQUEsR0FBVSxJQUFBLENBQUssTUFBTWpELENBQUFBLENBQU1pRCxDQUFLLEVBQ3ZDckgsQ0FBQUEsQ0FDQXNILENBQ0YsRUFDRixDQUFBLEtBQ0UsSUFBQSxDQUFLLFlBQUEsQ0FBZSxJQUFBLENBRXRCLEdBQUksT0FBTyxPQUFXLEdBQUEsRUFBZSxJQUFBLENBQUssSUFBSSxxQkFBQSxHQUEwQixLQUFBLENBQU8sQ0FDN0UsSUFBTUMsQ0FBQUEsQ0FDSixPQUFPLElBQUEsQ0FBSyxHQUFBLENBQUksdUJBQTBCLFFBQUEsQ0FDdEMsSUFBQSxDQUFLLElBQUkscUJBQUEsQ0FDVCxNQUFBLENBQ04sS0FBSyxnQkFBQSxDQUFtQixJQUFJNUMsQ0FBQUEsQ0FDMUIsQ0FBQ1AsQ0FBQUEsQ0FBTWlELENBQUFBLEdBQVUsS0FBSyxLQUFBLENBQU1qRCxDQUFBQSxDQUFNaUQsQ0FBSyxDQUFBLENBQ3ZDckgsQ0FBQUEsQ0FDQXVILENBQ0YsRUFDRixDQUFBLEtBQ0UsS0FBSyxnQkFBQSxDQUFtQixJQUFBLENBRTFCLEdBQUksT0FBTyxNQUFBLENBQVcsS0FBZSxJQUFBLENBQUssR0FBQSxDQUFJLDhCQUFnQyxLQUFBLENBQU8sQ0FDbkYsSUFBTUMsQ0FBQUEsQ0FDSixPQUFPLElBQUEsQ0FBSyxJQUFJLDJCQUFBLEVBQWdDLFFBQUEsQ0FDNUMsS0FBSyxHQUFBLENBQUksMkJBQUEsQ0FDVCxPQUNOLElBQUEsQ0FBSyx1QkFBQSxDQUEwQixJQUFJL0IsQ0FBQUEsQ0FDakMsQ0FBQ3JCLEVBQU1pRCxDQUFBQSxHQUFVLElBQUEsQ0FBSyxNQUFNakQsQ0FBQUEsQ0FBTWlELENBQUssRUFDdkNySCxDQUFBQSxDQUNBd0gsQ0FDRixFQUNGLENBQUEsS0FDRSxJQUFBLENBQUssdUJBQUEsQ0FBMEIsS0FFakMsSUFBQSxDQUFLLFVBQUEsQ0FBYSxJQUFJbkgsQ0FBQUEsQ0FDcEJRLENBQUFBLENBQU8sT0FDUEEsQ0FBQUEsQ0FBTyxNQUFBLENBQ1BBLEVBQU8sV0FBQSxDQUNQQSxDQUFBQSxDQUFPLHNCQUNQYixDQUFBQSxDQUNDeUgsQ0FBQUEsRUFBbUIsS0FBSyxXQUFBLENBQVlBLENBQUcsQ0FDMUMsRUFDRixDQVNBLE9BQU8sTUFBQSxDQUFPNUcsQ0FBQUEsQ0FBZ0MsQ0FPNUMsR0FIQW1HLENBQUFBLEVBQXlCLENBR3JCLENBQUMsZ0JBQUEsQ0FBaUIsSUFBQSxDQUFLbkcsRUFBTyxNQUFNLENBQUEsQ0FDdEMsTUFBTSxJQUFJLEtBQUEsQ0FBTSxxRUFBcUUsQ0FBQSxDQU12RixHQUFJQSxFQUFPLE1BQUEsQ0FBTyxVQUFBLENBQVcsU0FBUyxDQUFBLEVBQUssT0FBTyxNQUFBLENBQVcsR0FBQSxDQUMzRCxNQUFNLElBQUksTUFDUiwwSEFFRixDQUFBLENBR0YsSUFBTTZHLENBQUFBLENBQXlCLENBQzdCLE9BQVE3RyxDQUFBQSxDQUFPLE1BQUEsQ0FDZixPQUFRQSxDQUFBQSxDQUFPLE1BQUEsRUFBVXBHLEVBQVMsTUFBQSxDQUNsQyxXQUFBLENBQWFvRyxFQUFPLFdBQUEsRUFBZXBHLENBQUFBLENBQVMsWUFDNUMsYUFBQSxDQUFlb0csQ0FBQUEsQ0FBTyxhQUFBLEVBQWlCcEcsQ0FBQUEsQ0FBUyxhQUFBLENBQ2hELFNBQUEsQ0FBV29HLEVBQU8sU0FBQSxFQUFhcEcsQ0FBQUEsQ0FBUyxVQUN4QyxLQUFBLENBQU9vRyxDQUFBQSxDQUFPLE9BQVNwRyxDQUFBQSxDQUFTLEtBQUEsQ0FDaEMsc0JBQXVCb0csQ0FBQUEsQ0FBTyxxQkFBQSxFQUF5QnBHLEVBQVMscUJBQUEsQ0FDaEUsWUFBQSxDQUFjb0csRUFBTyxZQUFBLEVBQWdCcEcsQ0FBQUEsQ0FBUyxhQUM5QyxhQUFBLENBQWVvRyxDQUFBQSxDQUFPLGFBQUEsRUFBaUJwRyxDQUFBQSxDQUFTLGFBQUEsQ0FDaEQsT0FBQSxDQUFTb0csRUFBTyxPQUFBLENBQ2hCLFlBQUEsQ0FBY0EsRUFBTyxZQUFBLENBQ3JCLG9CQUFBLENBQXNCQSxFQUFPLG9CQUFBLEVBQXdCcEcsQ0FBQUEsQ0FBUyxxQkFDOUQsaUJBQUEsQ0FBbUJvRyxDQUFBQSxDQUFPLG1CQUFxQixJQUFBLENBSS9DLHFCQUFBLENBQXVCQSxFQUFPLHFCQUFBLEVBQXlCLEtBQUEsQ0FDdkQsNEJBQTZCQSxDQUFBQSxDQUFPLDJCQUFBLEVBQStCLElBQUEsQ0FDbkUsVUFBQSxDQUFZQSxDQUFBQSxDQUFPLFVBQUEsRUFBYyxJQUNuQyxDQUFBLENBQ003RixDQUFBQSxDQUFNLElBQUlTLENBQUFBLENBQWNpTSxDQUFBQSxDQUFPLG9CQUFvQixDQUFBLENBQ3JEQSxDQUFBQSxDQUFPLGNBQ1QxTSxDQUFBQSxDQUFJLFNBQUEsQ0FBVTBNLEVBQU8sWUFBWSxDQUFBLENBRW5DLElBQU0xSCxDQUFBQSxDQUFNLElBQUlsRixFQUFPNE0sQ0FBQUEsQ0FBTyxLQUFBLENBQU8xTSxDQUFHLENBQUEsQ0FDbEMyTSxDQUFBQSxDQUFXLElBQUlQLEVBQVFNLENBQUFBLENBQVExSCxDQUFBQSxDQUFLaEYsQ0FBRyxDQUFBLENBQzdDLE9BQUEyTSxFQUFTLEtBQUEsRUFBTSxDQUNmM0gsRUFBSSxVQUFBLENBQVcsTUFBQSxDQUFRLFlBQWEsbUJBQUEsQ0FBcUIsaUJBQUEsQ0FBbUIsQ0FDMUUsV0FBQSxDQUFhMEgsQ0FBQUEsQ0FBTyxZQUNwQixNQUFBLENBQVFBLENBQUFBLENBQU8sTUFDakIsQ0FBQyxDQUFBLENBQ0QxSCxDQUFBQSxDQUFJLE1BQU0sYUFBQSxDQUFlLENBQ3ZCLE9BQVFhLENBQUFBLENBQU8sTUFBQSxDQUFPLE1BQU0sQ0FBQSxDQUFHLEVBQUUsRUFBSSxLQUFBLENBQ3JDLFdBQUEsQ0FBYTZHLEVBQU8sV0FBQSxDQUNwQixNQUFBLENBQVFBLEVBQU8sTUFDakIsQ0FBQyxFQUNNQyxDQUNULENBUUEsT0FBTyxJQUFBLENBQUs5RyxDQUFBQSxDQUFnQyxDQUMxQyxHQUFJdUcsQ0FBQUEsQ0FBUSxRQUFBLEdBQWEsS0FDdkIsT0FBQUEsQ0FBQUEsQ0FBUSxTQUFTLEdBQUEsQ0FBSSxJQUFBLENBQ25CLDhHQUNGLENBQUEsQ0FDT0EsQ0FBQUEsQ0FBUSxTQUVqQixJQUFNTyxDQUFBQSxDQUFXUCxFQUFRLE1BQUEsQ0FBT3ZHLENBQU0sRUFDdEMsT0FBQXVHLENBQUFBLENBQVEsUUFBQSxDQUFXTyxDQUFBQSxDQUNaQSxDQUNULENBR0EsT0FBTyxXQUFBLEVBQXVCLENBQzVCLEdBQUlQLENBQUFBLENBQVEsUUFBQSxHQUFhLEtBQ3ZCLE1BQU0sSUFBSSxNQUFNLHVEQUF1RCxDQUFBLENBRXpFLE9BQU9BLENBQUFBLENBQVEsUUFDakIsQ0FNQSxPQUFPLGFBQUEsRUFBeUIsQ0FDOUIsT0FBT0EsQ0FBQUEsQ0FBUSxRQUFBLEdBQWEsSUFDOUIsQ0FXQSxLQUFBLENBQU1RLEVBQW1CdkQsQ0FBQUEsQ0FBNEMsQ0FDbkUsR0FBSSxJQUFBLENBQUssU0FBQSxDQUFXLENBQ2xCLElBQUEsQ0FBSyxHQUFBLENBQUksS0FBSywyQ0FBMkMsQ0FBQSxDQUN6RCxNQUNGLENBQ0EsSUFBTUQsRUFBT3lELEVBQUFBLENBQWtCRCxDQUFTLEVBQ2xDRSxDQUFBQSxDQUFNLElBQUEsQ0FBSyxPQUFBLENBQVEsVUFBQSxFQUFXLENBQzlCbk0sQ0FBQUEsQ0FBUSxDQUNaLFFBQUEsQ0FBVVUsQ0FBQUEsR0FDVixVQUFBLENBQVkrSCxDQUFBQSxDQUNaLGlCQUFrQkMsQ0FBQUEsQ0FDbEIsU0FBQSxDQUFXeUQsRUFBSSxTQUFBLENBQ2YsWUFBQSxDQUFjQSxFQUFJLFlBQUEsQ0FDbEIsVUFBQSxDQUFZQSxFQUFJLFVBQUEsQ0FDaEIsT0FBQSxDQUFTQSxFQUFJLE9BQUEsQ0FDYixRQUFBLENBQVVBLEVBQUksUUFBQSxDQUNkLFdBQUEsQ0FBYSxLQUFLLEdBQUEsQ0FBSSxVQUFBLEVBQWMsT0FDcEMsV0FBQSxDQUFhQSxDQUFBQSxDQUFJLFlBQ2pCLE1BQUEsQ0FBUUEsQ0FBQUEsQ0FBSSxPQUNaLFFBQUEsQ0FBVUEsQ0FBQUEsQ0FBSSxTQUNkLFNBQUEsQ0FBVyxJQUFJLE1BQUssQ0FBRSxXQUFBLEVBQ3hCLENBQUEsQ0FDQSxJQUFBLENBQUssS0FBQSxDQUFNLEdBQUEsQ0FBSW5NLENBQUssQ0FBQSxDQUNwQixLQUFLLE9BQUEsQ0FBUSxZQUFBLEdBRWIsR0FBSSxDQUNGLEtBQUssR0FBQSxDQUFJLE9BQUEsR0FBVXlJLEVBQU1DLENBQVUsRUFDckMsT0FBUzdELENBQUFBLENBQUssQ0FDWixLQUFLLEdBQUEsQ0FBSSxJQUFBLENBQUsseUJBQTBCQSxDQUFHLEVBQzdDLENBQ0ksSUFBQSxDQUFLLEtBQUEsQ0FBTSxJQUFBLElBQVUsSUFBQSxDQUFLLEdBQUEsQ0FBSSxXQUNoQyxJQUFBLENBQUssS0FBQSxHQUFRLEtBQUEsQ0FBTSxJQUFNLENBQUMsQ0FBQyxDQUFBLENBRTdCLEtBQUssR0FBQSxDQUFJLEtBQUEsQ0FBTSxZQUFZNEQsQ0FBSSxDQUFBLENBQUUsRUFDbkMsQ0FhQSxJQUFBLENBQUsvRSxDQUFBQSxDQUFpQkMsQ0FBQUEsQ0FBMEIsS0FBQSxDQUFrQixDQUNoRSxPQUFJLElBQUEsQ0FBSyxTQUFBLEVBQ1AsS0FBSyxHQUFBLENBQUksSUFBQSxDQUFLLG1EQUFtRCxDQUFBLENBQzFEQSxDQUFBQSxFQUVGLEtBQUssV0FBQSxDQUFZLFFBQUEsQ0FDdEJELEVBQ0FDLENBQUFBLENBQ0EsSUFBQSxDQUFLLFFBQVEsU0FBQSxFQUFVLENBQ3ZCLEtBQUssT0FBQSxDQUFRLGFBQUEsRUFBYyxDQUMzQixDQUFDN0IsQ0FBQUEsQ0FBS0MsQ0FBQUEsR0FBVSxDQUNkLElBQUEsQ0FBSyxLQUFBLENBQU0saUJBQWtCLENBQUUsUUFBQSxDQUFVRCxFQUFLLFVBQUEsQ0FBWUMsQ0FBTSxDQUFDLEVBQ25FLENBQ0YsQ0FDRixDQUVBLFlBQUEsQ0FBYUQsRUFBYUMsQ0FBQUEsQ0FBd0IsQ0FDaEQsS0FBSyxXQUFBLENBQVksWUFBQSxDQUFhRCxDQUFBQSxDQUFLQyxDQUFLLEVBQzFDLENBRUEsZ0JBQXVCLENBQ3JCLElBQUEsQ0FBSyxZQUFZLGNBQUEsR0FDbkIsQ0FFQSxZQUFBLEVBQXdDLENBQ3RDLE9BQU8sSUFBQSxDQUFLLFdBQUEsQ0FBWSxjQUMxQixDQVdBLFdBQVdrQyxDQUFBQSxDQUF5QyxDQUNsRCxPQUFJLElBQUEsQ0FBSyxTQUFBLEVBQ1AsSUFBQSxDQUFLLEdBQUEsQ0FBSSxJQUFBLENBQUsseURBQXlELEVBQ2hFLENBQUUsT0FBQSxDQUFTLFNBQVUsQ0FBQSxFQUV2QixJQUFBLENBQUssa0JBQWtCLE9BQUEsQ0FBUUEsQ0FBQUEsQ0FBZSxDQUFDbkMsQ0FBQUEsQ0FBS3NLLENBQUFBLEdBQVksQ0FDckUsSUFBQSxDQUFLLEtBQUEsQ0FBTSx1QkFBd0IsQ0FDakMsY0FBQSxDQUFnQnRLLEVBQ2hCLE9BQUEsQ0FBQXNLLENBQ0YsQ0FBQyxFQUNILENBQUMsQ0FDSCxDQVlBLFFBQUEsQ0FBU3hKLENBQUFBLENBQWdCQyxFQUF3QyxDQUMvRCxHQUFJLEtBQUssU0FBQSxDQUFXLENBQ2xCLEtBQUssR0FBQSxDQUFJLElBQUEsQ0FBSyw4Q0FBOEMsQ0FBQSxDQUM1RCxNQUNGLENBQ0EsSUFBQSxDQUFLLGVBQUEsQ0FBZ0IsU0FBU0QsQ0FBQUEsQ0FBUUMsQ0FBQUEsQ0FBUSxDQUM1QyxnQkFBQSxDQUFrQixJQUFNLElBQUEsQ0FBSyxRQUFRLFNBQUEsRUFBVSxDQUMvQyxVQUFZcEMsQ0FBQUEsRUFBTyxJQUFBLENBQUssUUFBUSxTQUFBLENBQVVBLENBQUUsRUFDNUMsWUFBQSxDQUFlNEwsQ0FBQUEsRUFBTSxLQUFLLE9BQUEsQ0FBUSxvQkFBQSxDQUFxQkEsQ0FBQyxDQUFBLENBQ3hELFlBQUEsQ0FBYyxJQUFNLElBQUEsQ0FBSyxPQUFBLENBQVEsYUFBQSxFQUFjLENBQy9DLDBCQUFBLENBQTRCLElBQU0sS0FBSyxpQkFBQSxDQUFrQixnQkFBQSxHQUN6RCxLQUFBLENBQU8sSUFBTSxLQUFLLEtBQUEsRUFBTSxDQUN4QixvQkFBcUIsQ0FBQ0MsQ0FBQUEsQ0FBS0MsSUFBVyxDQUNwQyxJQUFBLENBQUssb0JBQW9CRCxDQUFBQSxDQUFLQyxDQUFNLEVBQUUsS0FBQSxDQUFPMUgsQ0FBQUEsRUFBaUIsQ0FDNUQsSUFBQSxDQUFLLEdBQUEsQ0FBSSxLQUFBLENBQU0sMEJBQTJCQSxDQUFHLEVBQy9DLENBQUMsRUFDSCxDQUNGLENBQUMsRUFDSCxDQVVBLE9BQWMsQ0FDWixJQUFBLENBQUssZ0JBQWdCLEtBQUEsQ0FBTSxDQUN6QixhQUFjLElBQU0sSUFBQSxDQUFLLFFBQVEsYUFBQSxFQUFjLENBQy9DLDBCQUFBLENBQTRCLElBQU0sSUFBQSxDQUFLLGlCQUFBLENBQWtCLGtCQUFpQixDQUMxRSxLQUFBLENBQU8sSUFBTSxJQUFBLENBQUssS0FBQSxFQUNwQixDQUFDLEVBQ0gsQ0FZQSxNQUFNLEtBQUEsRUFBdUIsQ0FDM0IsTUFBTSxJQUFBLENBQUssVUFBVSxLQUFBLEdBQ3ZCLENBV0EsY0FBQSxDQUFla0MsQ0FBQUEsQ0FBb0IsQ0FDN0IsSUFBQSxDQUFLLFNBQUEsRUFDVCxJQUFBLENBQUssVUFBVSxjQUFBLENBQWVBLENBQUksRUFDcEMsQ0FFQSxNQUFBLEVBQW9CLENBQ2xCLE9BQU8sQ0FDTCxZQUFhLENBQUMsSUFBQSxDQUFLLFVBQ25CLE1BQUEsQ0FBUSxJQUFBLENBQUssYUFBYSxRQUFBLEVBQVMsQ0FDbkMsV0FBWSxJQUFBLENBQUssS0FBQSxDQUFNLElBQUEsRUFBSyxDQUM1QixpQkFBQSxDQUFtQixJQUFBLENBQUssYUFBYSxJQUFBLEVBQUssQ0FDMUMsWUFBYSxJQUFBLENBQUssU0FBQSxDQUFVLGdCQUFlLENBQzNDLFFBQUEsQ0FBVSxLQUFLLE9BQUEsQ0FBUSxXQUFBLEdBQ3ZCLE1BQUEsQ0FBUSxJQUFBLENBQUssUUFBUSxTQUFBLEVBQVUsQ0FDL0IsVUFBVyxJQUFBLENBQUssV0FBQSxDQUFZLEtBQUEsRUFBTSxDQUNsQyxlQUFBLENBQWlCLElBQUEsQ0FBSyxrQkFBa0IsS0FBQSxFQUFNLENBQzlDLFdBQVlsSSxDQUNkLENBQ0YsQ0FFQSxXQUFBLEVBQTZCLENBQzNCLE9BQU8sSUFBQSxDQUFLLEdBQ2QsQ0FFQSxvQkFBQSxFQUEwQyxDQUN4QyxPQUFPLElBQUEsQ0FBSyxHQUFBLENBQUksc0JBQ2xCLENBYUEsT0FBQSxFQUFnQixDQUNWLElBQUEsQ0FBSyxTQUFBLEdBQ1QsS0FBSyxTQUFBLENBQVksSUFBQSxDQUVqQixLQUFLLEtBQUEsRUFBTSxDQUFFLE1BQU0sSUFBTSxDQUFDLENBQUMsQ0FBQSxDQUN2QixJQUFBLENBQUssYUFBZSxJQUFBLEdBQ3RCLGFBQUEsQ0FBYyxLQUFLLFVBQVUsQ0FBQSxDQUM3QixLQUFLLFVBQUEsQ0FBYSxJQUFBLENBQUEsQ0FFcEIsSUFBQSxDQUFLLFVBQUEsQ0FBVyxJQUFBLEVBQUssQ0FDckIsS0FBSyxZQUFBLENBQWEsT0FBQSxHQUNsQixJQUFBLENBQUssU0FBQSxDQUFVLFNBQVEsQ0FDdkIsSUFBQSxDQUFLLGNBQWMsU0FBQSxFQUFVLENBQzdCLEtBQUssZ0JBQUEsRUFBa0IsU0FBQSxHQUN2QixJQUFBLENBQUssdUJBQUEsRUFBeUIsV0FBVSxDQUVwQzRNLENBQUFBLENBQVEsUUFBQSxHQUFhLElBQUEsR0FDdkJBLENBQUFBLENBQVEsUUFBQSxDQUFXLE1BRXJCLElBQUEsQ0FBSyxHQUFBLENBQUksV0FBVyxNQUFBLENBQVEsV0FBQSxDQUFhLHNCQUF1Qix3QkFBd0IsQ0FBQSxDQUN4RixLQUFLLEdBQUEsQ0FBSSxLQUFBLENBQU0sWUFBWSxDQUFBLEVBQzdCLENBSVEsT0FBYyxDQUVwQixJQUFNdEssRUFBbUJaLENBQUFBLEVBQVksQ0FVckMsR0FUSVksQ0FBQUEsRUFDRixJQUFBLENBQUssT0FBQSxDQUFRLFlBQVlBLENBQWdCLENBQUEsQ0FLM0MsS0FBSyxVQUFBLENBQVcsS0FBQSxDQUFNLElBQU0sSUFBQSxDQUFLLE9BQUEsQ0FBUSxhQUFhLENBQUEsQ0FHbEQsQ0FBQ0EsQ0FBQUEsQ0FBa0IsQ0FDckIsSUFBTUQsQ0FBQUEsQ0FBYyxJQUFBLENBQUssUUFBUSxjQUFBLEVBQWUsQ0FDMUNFLENBQUFBLENBQU9QLENBQUFBLEVBQWMsQ0FDM0JDLENBQUFBLENBQ0UsS0FBSyxHQUFBLENBQUksTUFBQSxDQUNULEtBQUssR0FBQSxDQUFJLE1BQUEsQ0FDVCxLQUFLLEdBQUEsQ0FBSSxXQUFBLENBQ1RJLEVBQ0EsSUFBQSxDQUNBRSxDQUNGLEVBQ0csSUFBQSxDQUFNMEQsQ0FBQUEsRUFBYSxDQUNsQnRFLENBQUFBLENBQVlzRSxDQUFRLEVBQ3BCLElBQUEsQ0FBSyxPQUFBLENBQVEsV0FBQSxDQUFZQSxDQUFRLENBQUEsQ0FDakMsSUFBQSxDQUFLLElBQUksS0FBQSxDQUFNLG1CQUFBLENBQXFCLENBQUUsUUFBQSxDQUFBQSxDQUFTLENBQUMsRUFDbEQsQ0FBQyxFQUNBLEtBQUEsQ0FBT0QsQ0FBQUEsRUFBaUIsQ0FDdkIsSUFBQSxDQUFLLEdBQUEsQ0FBSSxLQUFLLGdEQUFBLENBQWtEQSxDQUFHLEVBQ3JFLENBQUMsRUFDTCxDQXVDQSxHQXBDQSxJQUFBLENBQUssVUFBQSxDQUFhLFlBQVksSUFBTSxDQUNsQyxLQUFLLEtBQUEsRUFBTSxDQUFFLE1BQU0sSUFBTSxDQUFDLENBQUMsRUFDN0IsQ0FBQSxDQUFHLEtBQUssR0FBQSxDQUFJLGFBQWEsRUFHekIsSUFBQSxDQUFLLFNBQUEsQ0FBVSxVQUFTLENBSXhCLElBQUEsQ0FBSyxZQUFBLEVBQWMsT0FBQSxFQUFRLENBSTNCLElBQUEsQ0FBSyxrQkFBa0IsT0FBQSxFQUFRLENBSy9CLEtBQUssdUJBQUEsRUFBeUIsT0FBQSxHQUc5QixJQUFBLENBQUssWUFBQSxDQUFhLFNBQVMsSUFBTSxDQUMvQixJQUFNMkgsQ0FBQUEsQ0FBUyxJQUFBLENBQUssYUFBYSxLQUFBLEVBQU0sQ0FDdkMsR0FBSUEsQ0FBQUEsQ0FBTyxNQUFBLENBQVMsQ0FBQSxDQUFHLENBQ3JCLElBQUEsQ0FBSyxHQUFBLENBQUksTUFBTSxDQUFBLDRCQUFBLEVBQTBCQSxDQUFBQSxDQUFPLE1BQU0sQ0FBQSxnQkFBQSxDQUFrQixDQUFBLENBQ3hFLFFBQVc3RyxDQUFBQSxJQUFLNkcsQ0FBQUEsQ0FBUSxLQUFLLEtBQUEsQ0FBTSxHQUFBLENBQUk3RyxDQUFDLENBQUEsQ0FDeEMsSUFBQSxDQUFLLE9BQU0sQ0FBRSxLQUFBLENBQU0sSUFBTSxDQUFDLENBQUMsRUFDN0IsQ0FDRixDQUFDLENBQUEsQ0FRRyxLQUFLLE9BQUEsQ0FBUSxZQUFBLENBQWMsQ0FDN0IsSUFBTThHLENBQUFBLENBQU8sS0FBSyxPQUFBLENBQVEscUJBQUEsR0FDMUIsSUFBQSxDQUFLLEtBQUEsQ0FBTSxpQkFBa0JBLENBQTJDLEVBQzFFLENBQ0YsQ0FFUSxXQUFBLENBQVl2SCxFQUF5QixDQUMzQyxJQUFBLENBQUssV0FBQSxDQUFZLGlCQUFBLENBQWtCQSxDQUFBQSxDQUFPLEtBQUssRUFDL0MsSUFBQSxDQUFLLGlCQUFBLENBQWtCLGVBQWVBLENBQUFBLENBQU8sV0FBVyxFQUN4RCxJQUFBLENBQUssR0FBQSxDQUFJLE1BQU0sZ0JBQUEsQ0FBa0IsQ0FDL0IsTUFBTyxNQUFBLENBQU8sSUFBQSxDQUFLQSxFQUFPLEtBQUssQ0FBQSxDQUFFLE9BQ2pDLFdBQUEsQ0FBYSxNQUFBLENBQU8sSUFBQSxDQUFLQSxDQUFBQSxDQUFPLFdBQVcsQ0FBQSxDQUFFLE1BQy9DLENBQUMsRUFDSCxDQUVBLE1BQWMsbUJBQUEsQ0FBb0J0QyxFQUFnQjhKLENBQUFBLENBQStDLENBQy9GLElBQU01SCxDQUFBQSxDQUFXdkUsQ0FBQUEsR0FDakIsR0FBSSxDQUFDdUUsRUFBVSxPQUNmLElBQU14RCxFQUFNLE1BQU0sS0FBQSxDQUNoQixDQUFBLEVBQUcsSUFBQSxDQUFLLEdBQUEsQ0FBSSxNQUFNLGVBQWUsa0JBQUEsQ0FBbUJ3RCxDQUFRLENBQUMsQ0FBQSxTQUFBLENBQUEsQ0FDN0QsQ0FDRSxPQUFRLE1BQUEsQ0FDUixPQUFBLENBQVMsQ0FDUCxjQUFBLENBQWdCLGtCQUFBLENBQ2hCLGNBQWUsQ0FBQSxPQUFBLEVBQVUsSUFBQSxDQUFLLElBQUksTUFBTSxDQUFBLENBQUEsQ0FDeEMsZ0JBQWlCLElBQUEsQ0FBSyxHQUFBLENBQUksV0FDNUIsQ0FBQSxDQUNBLElBQUEsQ0FBTSxJQUFBLENBQUssVUFBVSxDQUFFLE9BQUEsQ0FBU2xDLENBQU8sQ0FBQyxDQUMxQyxDQUNGLENBQUEsQ0FDQSxHQUFJLENBQUN0QixDQUFBQSxDQUFJLEVBQUEsQ0FDUCxNQUFNLElBQUksS0FBQSxDQUFNLDRCQUE0QkEsQ0FBQUEsQ0FBSSxNQUFNLEVBQUUsQ0FFNUQsQ0FDRixDQUFBLENBN2hCYW1LLENBQUFBLENBQ0ksUUFBQSxDQUEyQixJQUFBLEtBRC9Ca0IsQ0FBQUEsQ0FBTmxCLEVBK2hCUCxTQUFTUyxFQUFBQSxDQUFrQnpELENBQUFBLENBQXNCLENBQy9DLEdBQUksQ0FBQ0EsR0FBUUEsQ0FBQUEsQ0FBSyxJQUFBLEdBQU8sTUFBQSxHQUFXLENBQUEsQ0FDbEMsTUFBTSxJQUFJLEtBQUEsQ0FBTSx5Q0FBeUMsQ0FBQSxDQUczRCxPQURnQkEsQ0FBQUEsQ0FBSyxJQUFBLEVBQUssQ0FBRSxLQUFBLENBQU0sRUFBR3ZKLENBQXFCLENBQUEsQ0FDM0MsUUFBUSxNQUFBLENBQVEsR0FBRyxDQUNwQyxDQy9pQk8sU0FBUzBOLEdBQW1CeE0sQ0FBQUEsQ0FBeUMsQ0FDMUUsSUFBTXlNLENBQUFBLENBQVcsSUFBQSxDQUFLLFVBQVV6TSxDQUFBQSxDQUFRLFFBQVEsRUFDMUMwTSxDQUFBQSxDQUFhMU0sQ0FBQUEsQ0FBUSxVQUFBLEVBQWMsSUFBQSxDQUN6QyxPQUFPLENBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDZCQUFBLEVBS3NCeU0sQ0FBUSxDQUFBO0FBQUE7QUFBQSxjQUFBLEVBRXZCQSxDQUFRLENBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvRUFBQSxFQWE4Q0MsQ0FBVSxDQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0NBQUEsRUFPL0JBLENBQVUsQ0FBQTtBQUFBO0FBQUE7QUFBQSxLQUFBLENBSTNEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFNES19WRVJTSU9OID0gXCIwLjEuMFwiO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVFMgPSB7XG4gIGFwaVVybDogXCJodHRwczovL2FwaS5nb2F0ZWNoLmFpXCIsXG4gIGVudmlyb25tZW50OiBcInByb2R1Y3Rpb25cIixcbiAgZmx1c2hJbnRlcnZhbDogNTAwMCxcbiAgZmx1c2hTaXplOiAyMCxcbiAgZGVidWc6IGZhbHNlLFxuICBjb25maWdSZWZyZXNoSW50ZXJ2YWw6IDMwMF8wMDAsXG4gIG1heFF1ZXVlU2l6ZTogMTAwMCxcbiAgcmV0cnlBdHRlbXB0czogMyxcbiAgcmV0cnlCYWNrb2ZmOiBbMTAwMCwgNTAwMCwgMTVfMDAwXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gIGRpYWdub3N0aWNCdWZmZXJTaXplOiAxMDAsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEJyb3dzZXIgc3RvcmFnZSBrZXlzLlxuICpcbiAqIEF1ZGl0IEUtMDEwIOKAlCByZW5hbWVkIGZyb20gYGxwXypgIHRvIGBndF8qYCB0byBtYXRjaCB0aGUgcmVzdCBvZiB0aGVcbiAqIEdvYVRlY2ggcmVuYW1lLiBgbWlncmF0ZUxlZ2FjeVN0b3JhZ2VLZXlzKClgIChzZWUgYC4vc3RvcmFnZS1taWdyYXRpb24udHNgKVxuICogcnVucyBvbmNlIG9uIFNESyBpbml0IGFuZCBjb3BpZXMgYW55IHByZS1leGlzdGluZyBgbHBfKmAgdmFsdWUgaW50b1xuICogdGhlIG5ldyBgZ3RfKmAgc2xvdCwgc28gZXhpc3RpbmcgdGVzdGVycyBkb24ndCBsb3NlIHRoZWlyIGRldmljZSBpZCxcbiAqIGlkZW50aXR5LCBvZmZsaW5lIHF1ZXVlLCBhdHRyaWJ1dGlvbiwgb3IgZXhwZXJpbWVudCBhc3NpZ25tZW50cy5cbiAqXG4gKiBTb3VyY2VzIG9mIHRydXRoOiBuZXZlciBoYXJkY29kZSB0aGUgYGd0XypgIHN0cmluZ3MgaW4gY29uc3VtZXJzIOKAlFxuICogYWx3YXlzIGltcG9ydCBgU1RPUkFHRV9LRVlTLjxuYW1lPmAuIFRoZSBsZWdhY3kgc3RyaW5ncyBsaXZlIG9ubHkgaW5cbiAqIGBzdG9yYWdlLW1pZ3JhdGlvbi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBTVE9SQUdFX0tFWVMgPSB7XG4gIGRldmljZUlkOiBcImd0X2RldmljZV9pZFwiLFxuICBhbm9ueW1vdXNJZDogXCJndF9hbm9ueW1vdXNfaWRcIixcbiAgaWRlbnRpdHk6IFwiZ3RfaWRlbnRpdHlcIixcbiAgc2RrQ29uZmlnOiBcImd0X2NvbmZpZ1wiLFxuICBvZmZsaW5lUXVldWU6IFwiZ3Rfb2ZmbGluZV9xdWV1ZVwiLFxuICBzZXNzaW9uSWQ6IFwiZ3Rfc2Vzc2lvbl9pZFwiLFxuICBzZXNzaW9uTGFzdFNlZW46IFwiZ3Rfc2Vzc2lvbl9sYXN0X3NlZW5cIixcbiAgZXhwZXJpbWVudEFzc2lnbm1lbnRzOiBcImd0X2V4cF9hc3NpZ25tZW50c1wiLFxuICAvKiogUGVyLXNlc3Npb24gYXR0cmlidXRpb24gc25hcHNob3QgKFVUTSArIHJlZmVycmVyICsgbGFuZGluZyBwYWdlKS5cbiAgICogIENhcHR1cmVkIG9uIHNlc3Npb24gY3JlYXRpb247IHBlcnNpc3RzIGZvciB0aGUgc2Vzc2lvbidzIGxpZmV0aW1lIHNvXG4gICAqICBldmVyeSBldmVudCBpbiB0aGF0IHNlc3Npb24gY2FycmllcyB0aGUgc2FtZSBmaXJzdC10b3VjaCBjb250ZXh0LiAqL1xuICBzZXNzaW9uQXR0cmlidXRpb246IFwiZ3Rfc2Vzc2lvbl9hdHRyaWJ1dGlvblwiLFxuICAvKiogRmlyc3QtZXZlci10b3VjaCBhdHRyaWJ1dGlvbiBhY3Jvc3MgdGhlIHdob2xlIGJyb3dzZXIgbGlmZXRpbWUuXG4gICAqICBXcml0dGVuIG9uY2Ugb24gdGhlIGZpcnN0IHNlc3Npb24gd2hlcmUgVVRNIG9yIHJlZmVycmVyIGlzIHByZXNlbnQ7XG4gICAqICBuZXZlciBvdmVyd3JpdHRlbi4gVXNlZnVsIGZvciBcImhvdyBkaWQgdGhpcyB1c2VyIEZJUlNUIGZpbmQgdXNcIi4gKi9cbiAgZmlyc3RUb3VjaEF0dHJpYnV0aW9uOiBcImd0X2ZpcnN0X3RvdWNoXCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgU0VTU0lPTl9USU1FT1VUX01TID0gMzAgKiA2MCAqIDEwMDA7XG5leHBvcnQgY29uc3QgQ09ORklHX01BWF9BR0VfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuZXhwb3J0IGNvbnN0IE9GRkxJTkVfUVVFVUVfTUFYID0gNTAwO1xuZXhwb3J0IGNvbnN0IEFUVFJJQlVURV9NQVhfS0VZUyA9IDUwO1xuZXhwb3J0IGNvbnN0IEVWRU5UX05BTUVfTUFYX0xFTkdUSCA9IDIwMDtcbiIsImltcG9ydCB0eXBlIHsgRGlhZ25vc3RpY0J1cyB9IGZyb20gXCIuL2RpYWdub3N0aWMtYnVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IERpYWdub3N0aWNDYXRlZ29yeSwgRGlhZ25vc3RpY1NldmVyaXR5IH0gZnJvbSBcIi4vZGlhZ25vc3RpY3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVidWdFbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZpeCA9IFwiW0dvYVRlY2hdXCI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVzOiBEaWFnbm9zdGljQnVzIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkZWJ1ZzogYm9vbGVhbiwgYnVzPzogRGlhZ25vc3RpY0J1cykge1xuICAgIHRoaXMuZGVidWdFbmFibGVkID0gZGVidWc7XG4gICAgdGhpcy5idXMgPSBidXMgPz8gbnVsbDtcbiAgfVxuXG4gIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVidWdFbmFibGVkKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKHRoaXMucHJlZml4LCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0RGlhZ25vc3RpYyhcImRlYnVnXCIsIFwibGlmZWN5Y2xlXCIsIG1lc3NhZ2UsIGFyZ3MpO1xuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGNvbnNvbGUud2Fybih0aGlzLnByZWZpeCwgbWVzc2FnZSwgLi4uYXJncyk7XG4gICAgdGhpcy5lbWl0RGlhZ25vc3RpYyhcIndhcm5cIiwgXCJsaWZlY3ljbGVcIiwgbWVzc2FnZSwgYXJncyk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IodGhpcy5wcmVmaXgsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIHRoaXMuZW1pdERpYWdub3N0aWMoXCJlcnJvclwiLCBcImxpZmVjeWNsZVwiLCBtZXNzYWdlLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGEgZGlhZ25vc3RpYyBldmVudCB3aXRoIGV4cGxpY2l0IGNhdGVnb3J5IGFuZCBjb2RlLlxuICAgKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGRlYnVnL3dhcm4vZXJyb3Igd2hlbiB5b3Ugd2FudCBmaW5lLWdyYWluZWQgY29udHJvbC5cbiAgICovXG4gIGRpYWdub3N0aWMoXG4gICAgc2V2ZXJpdHk6IERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBjYXRlZ29yeTogRGlhZ25vc3RpY0NhdGVnb3J5LFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHJlcXVlc3RJZD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5idXM/LmVtaXQoe1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBzZXZlcml0eSxcbiAgICAgIGNhdGVnb3J5LFxuICAgICAgY29kZSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBkYXRhLFxuICAgICAgcmVxdWVzdElkLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGlhZ25vc3RpYyhcbiAgICBzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5LFxuICAgIGNhdGVnb3J5OiBEaWFnbm9zdGljQ2F0ZWdvcnksXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd25bXSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmJ1cykgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPVxuICAgICAgYXJncy5sZW5ndGggPiAwXG4gICAgICAgID8gYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIgJiYgYXJnc1swXSAhPT0gbnVsbFxuICAgICAgICAgID8gKGFyZ3NbMF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgOiB7IGRldGFpbHM6IGFyZ3MgfVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJ1cy5lbWl0KHtcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgc2V2ZXJpdHksXG4gICAgICBjYXRlZ29yeSxcbiAgICAgIGNvZGU6IGAke2NhdGVnb3J5fS4ke3NldmVyaXR5fWAsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBEaWFnbm9zdGljRXZlbnQsXG4gIERpYWdub3N0aWNDYXRlZ29yeSxcbiAgRGlhZ25vc3RpY1NldmVyaXR5LFxuICBEaWFnbm9zdGljTGlzdGVuZXIsXG59IGZyb20gXCIuL2RpYWdub3N0aWNzLmpzXCI7XG5cbmNvbnN0IERFRkFVTFRfQlVGRkVSX1NJWkUgPSAxMDA7XG5jb25zdCBNQVhfQlVGRkVSX1NJWkUgPSAxMF8wMDA7XG5jb25zdCBNQVhfU1VCU0NSSUJFUlMgPSAxMDA7XG5cbmNvbnN0IFNFVkVSSVRZX09SREVSOiBSZWNvcmQ8RGlhZ25vc3RpY1NldmVyaXR5LCBudW1iZXI+ID0ge1xuICBkZWJ1ZzogMCxcbiAgaW5mbzogMSxcbiAgd2FybjogMixcbiAgZXJyb3I6IDMsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmliZU9wdGlvbnMge1xuICAvKiogT25seSByZWNlaXZlIGV2ZW50cyBhdCBvciBhYm92ZSB0aGlzIHNldmVyaXR5LiBEZWZhdWx0OiBcImRlYnVnXCIgKGFsbCkuICovXG4gIG1pblNldmVyaXR5PzogRGlhZ25vc3RpY1NldmVyaXR5O1xuICAvKiogT25seSByZWNlaXZlIGV2ZW50cyBpbiB0aGVzZSBjYXRlZ29yaWVzLiBEZWZhdWx0OiBhbGwuICovXG4gIGNhdGVnb3JpZXM/OiBEaWFnbm9zdGljQ2F0ZWdvcnlbXTtcbn1cblxuZXhwb3J0IGNsYXNzIERpYWdub3N0aWNCdXMge1xuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogQXJyYXk8e1xuICAgIGZuOiBEaWFnbm9zdGljTGlzdGVuZXI7XG4gICAgbWluU2V2ZXJpdHk6IG51bWJlcjtcbiAgICBjYXRlZ29yaWVzOiBEaWFnbm9zdGljQ2F0ZWdvcnlbXSB8IG51bGw7XG4gIH0+ID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBEaWFnbm9zdGljRXZlbnRbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgd3JpdGVJbmRleCA9IDA7XG4gIHByaXZhdGUgY291bnQgPSAwO1xuICBwcml2YXRlIGNvdW50czogUmVjb3JkPERpYWdub3N0aWNTZXZlcml0eSwgbnVtYmVyPiA9IHtcbiAgICBkZWJ1ZzogMCxcbiAgICBpbmZvOiAwLFxuICAgIHdhcm46IDAsXG4gICAgZXJyb3I6IDAsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoYnVmZmVyU2l6ZTogbnVtYmVyID0gREVGQVVMVF9CVUZGRVJfU0laRSkge1xuICAgIHRoaXMubWF4U2l6ZSA9IE1hdGgubWluKE1BWF9CVUZGRVJfU0laRSwgTWF0aC5tYXgoMSwgYnVmZmVyU2l6ZSkpO1xuICAgIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5PERpYWdub3N0aWNFdmVudD4odGhpcy5tYXhTaXplKTtcbiAgfVxuXG4gIGVtaXQoZXZlbnQ6IERpYWdub3N0aWNFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNldmVyaXR5TnVtID0gU0VWRVJJVFlfT1JERVJbZXZlbnQuc2V2ZXJpdHldO1xuICAgIGlmIChzZXZlcml0eU51bSA9PT0gdW5kZWZpbmVkKSByZXR1cm47IC8vIGlnbm9yZSBpbnZhbGlkIHNldmVyaXR5XG5cbiAgICB0aGlzLmJ1ZmZlclt0aGlzLndyaXRlSW5kZXhdID0gZXZlbnQ7XG4gICAgdGhpcy53cml0ZUluZGV4ID0gKHRoaXMud3JpdGVJbmRleCArIDEpICUgdGhpcy5tYXhTaXplO1xuICAgIGlmICh0aGlzLmNvdW50IDwgdGhpcy5tYXhTaXplKSB0aGlzLmNvdW50Kys7XG4gICAgdGhpcy5jb3VudHNbZXZlbnQuc2V2ZXJpdHldKys7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgaWYgKHNldmVyaXR5TnVtIDwgbGlzdGVuZXIubWluU2V2ZXJpdHkpIGNvbnRpbnVlO1xuICAgICAgaWYgKGxpc3RlbmVyLmNhdGVnb3JpZXMgIT09IG51bGwgJiYgIWxpc3RlbmVyLmNhdGVnb3JpZXMuaW5jbHVkZXMoZXZlbnQuY2F0ZWdvcnkpKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxpc3RlbmVyLmZuKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBuZXZlciBsZXQgYSBzdWJzY3JpYmVyIGJyZWFrIHRoZSBidXNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmUoZm46IERpYWdub3N0aWNMaXN0ZW5lciwgb3B0aW9ucz86IFN1YnNjcmliZU9wdGlvbnMpOiAoKSA9PiB2b2lkIHtcbiAgICBpZiAodGhpcy5saXN0ZW5lcnMubGVuZ3RoID49IE1BWF9TVUJTQ1JJQkVSUykge1xuICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgIH1cbiAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgIGZuLFxuICAgICAgbWluU2V2ZXJpdHk6IFNFVkVSSVRZX09SREVSW29wdGlvbnM/Lm1pblNldmVyaXR5ID8/IFwiZGVidWdcIl0sXG4gICAgICBjYXRlZ29yaWVzOiBvcHRpb25zPy5jYXRlZ29yaWVzID8/IG51bGwsXG4gICAgfTtcbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGVudHJ5KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5saXN0ZW5lcnMuaW5kZXhPZihlbnRyeSk7XG4gICAgICBpZiAoaWR4ICE9PSAtMSkgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgfTtcbiAgfVxuXG4gIGdldFJlY2VudERpYWdub3N0aWNzKCk6IERpYWdub3N0aWNFdmVudFtdIHtcbiAgICBpZiAodGhpcy5jb3VudCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGlmICh0aGlzLmNvdW50IDwgdGhpcy5tYXhTaXplKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWZmZXIuc2xpY2UoMCwgdGhpcy5jb3VudCk7XG4gICAgfVxuICAgIC8vIFJpbmcgYnVmZmVyIGlzIGZ1bGwg4oCUIHJldHVybiBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgcmV0dXJuIFsuLi50aGlzLmJ1ZmZlci5zbGljZSh0aGlzLndyaXRlSW5kZXgpLCAuLi50aGlzLmJ1ZmZlci5zbGljZSgwLCB0aGlzLndyaXRlSW5kZXgpXTtcbiAgfVxuXG4gIGdldENvdW50cygpOiBSZWNvcmQ8RGlhZ25vc3RpY1NldmVyaXR5LCBudW1iZXI+IHtcbiAgICByZXR1cm4geyAuLi50aGlzLmNvdW50cyB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBTVE9SQUdFX0tFWVMsIFNES19WRVJTSU9OIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXZpY2VJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVlTLmRldmljZUlkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldERldmljZUlkKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuZGV2aWNlSWQsIGlkKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbG9jYWxTdG9yYWdlIHVuYXZhaWxhYmxlIChwcml2YXRlIGJyb3dzaW5nIHF1b3RhLCBldGMuKSDigJQgY29udGludWUgd2l0aG91dCBwZXJzaXN0ZW5jZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFub255bW91c0lkKCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBjcnlwdG8ucmFuZG9tVVVJRFxuICAgIHJldHVybiBcInh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eFwiLnJlcGxhY2UoL1t4eV0vZywgKGMpID0+IHtcbiAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgICBjb25zdCB2ID0gYyA9PT0gXCJ4XCIgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXZpY2VJbmZvKCk6IERldmljZUluZm8ge1xuICByZXR1cm4ge1xuICAgIHBsYXRmb3JtOiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yLnBsYXRmb3JtIHx8IFwid2ViXCIgOiBcInNlcnZlclwiLFxuICAgIHVzZXJBZ2VudDogdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiBcIlwiLFxuICAgIGxhbmd1YWdlOiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yLmxhbmd1YWdlIDogXCJlblwiLFxuICAgIHNjcmVlbldpZHRoOiB0eXBlb2Ygc2NyZWVuICE9PSBcInVuZGVmaW5lZFwiID8gc2NyZWVuLndpZHRoIDogMCxcbiAgICBzY3JlZW5IZWlnaHQ6IHR5cGVvZiBzY3JlZW4gIT09IFwidW5kZWZpbmVkXCIgPyBzY3JlZW4uaGVpZ2h0IDogMCxcbiAgICB0aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJEZXZpY2UoXG4gIGFwaVVybDogc3RyaW5nLFxuICBhcGlLZXk6IHN0cmluZyxcbiAgZW52aXJvbm1lbnQ6IHN0cmluZyxcbiAgYW5vbnltb3VzSWQ6IHN0cmluZyxcbiAgZXhpc3RpbmdEZXZpY2VJZDogc3RyaW5nIHwgbnVsbCxcbiAgaW5mbzogRGV2aWNlSW5mbyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJvZHkgPSB7XG4gICAgYW5vbnltb3VzX2lkOiBhbm9ueW1vdXNJZCxcbiAgICAuLi4oZXhpc3RpbmdEZXZpY2VJZCA/IHsgZGV2aWNlX2lkOiBleGlzdGluZ0RldmljZUlkIH0gOiB7fSksXG4gICAgcGxhdGZvcm06IFwid2ViXCIgYXMgY29uc3QsXG4gICAgbG9jYWxlOiBpbmZvLmxhbmd1YWdlLFxuICAgIHRpbWV6b25lOiBpbmZvLnRpbWV6b25lLFxuICB9O1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L3YxL2RldmljZXMvcmVnaXN0ZXJgLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthcGlLZXl9YCxcbiAgICAgIFwiWC1FbnZpcm9ubWVudFwiOiBlbnZpcm9ubWVudCxcbiAgICAgIFwiWC1TREstVmVyc2lvblwiOiBTREtfVkVSU0lPTixcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICB9KTtcbiAgaWYgKCFyZXMub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERldmljZSByZWdpc3RyYXRpb24gZmFpbGVkOiAke3Jlcy5zdGF0dXN9YCk7XG4gIH1cbiAgY29uc3QganNvbiA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGRhdGE6IHsgZGV2aWNlX2lkOiBzdHJpbmcgfSB9O1xuICByZXR1cm4ganNvbi5kYXRhLmRldmljZV9pZDtcbn1cbiIsIi8qKlxuICogRmlyc3QtdG91Y2ggYXR0cmlidXRpb24gY2FwdHVyZSBmb3IgdGhlIGJyb3dzZXIgU0RLLlxuICpcbiAqIFBhcnNlcyBVVE0gcGFyYW1zLCBhZC1jbGljayBJRHMsIHJlZmVycmVyLCBhbmQgbGFuZGluZyBwYWdlIGZyb20gdGhlXG4gKiBjdXJyZW50IGJyb3dzZXIgY29udGV4dC4gQ2FsbGVkIG9uY2UgcGVyIHNlc3Npb24gYXQgY3JlYXRpb24gdGltZTsgdGhlXG4gKiByZXN1bHRpbmcgc25hcHNob3QgaXMgc3Rhc2hlZCBpbiBzZXNzaW9uU3RvcmFnZSBhbmQgYXR0YWNoZWQgdG8gZXZlcnlcbiAqIGV2ZW50J3MgY29udGV4dCB1bnRpbCB0aGUgc2Vzc2lvbiByb2xscyBvdmVyICgzMC1taW4gaW5hY3Rpdml0eSkuXG4gKlxuICogQWxzbyBtYWludGFpbnMgYSBsb25nZXItbGl2ZWQgXCJmaXJzdF90b3VjaFwiIHNuYXBzaG90IGluIGxvY2FsU3RvcmFnZSDigJRcbiAqIHdyaXR0ZW4gb25jZSBvbiB0aGUgZmlyc3Qgc2Vzc2lvbiB0aGF0IGhhcyBBTlkgYXR0cmlidXRpb24gc2lnbmFsLFxuICogbmV2ZXIgb3ZlcndyaXR0ZW4uIFBvd2VycyBcImhvdyBkaWQgdGhpcyB1c2VyIGZpcnN0IGFycml2ZVwiIHNlZ21lbnRzXG4gKiBldmVuIG1vbnRocyBsYXRlci5cbiAqXG4gKiBEZWZlbnNpdmU6XG4gKiAtIE5vLW9wcyArIHJldHVybnMgYHVuZGVmaW5lZGAgb3V0c2lkZSBicm93c2VycyAoc2VydmVyIFNESyBzaGFyZXNcbiAqICAgdGhpcyBmaWxlIHZpYSB0aGUgY29tbW9uIENvbnRleHRNYW5hZ2VyKS5cbiAqIC0gU3RvcmFnZSBhY2Nlc3Mgd3JhcHBlZCBpbiB0cnkvY2F0Y2ggKHByaXZhdGUgbW9kZSAvIFNhZmFyaSBxdW90YSkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgU1RPUkFHRV9LRVlTIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcblxuY29uc3QgVVRNX0tFWVMgPSBbXG4gIFwidXRtX3NvdXJjZVwiLFxuICBcInV0bV9tZWRpdW1cIixcbiAgXCJ1dG1fY2FtcGFpZ25cIixcbiAgXCJ1dG1fY29udGVudFwiLFxuICBcInV0bV90ZXJtXCIsXG4gIFwiZ2NsaWRcIixcbiAgXCJmYmNsaWRcIixcbl0gYXMgY29uc3Q7XG50eXBlIFV0bUtleSA9ICh0eXBlb2YgVVRNX0tFWVMpW251bWJlcl07XG5cbmZ1bmN0aW9uIGlzQnJvd3NlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlZmVycmVySG9zdChyZWZlcnJlcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZWZlcnJlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTChyZWZlcnJlcikuaG9zdG5hbWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIENhcHR1cmUgZnJvbSB0aGUgY3VycmVudCBwYWdlLiBSZXR1cm5zIGB1bmRlZmluZWRgIGluIG5vbi1icm93c2VyIGVudnMuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZUZyb21XaW5kb3coKTogQXR0cmlidXRpb25Db250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpc0Jyb3dzZXIoKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBvdXQ6IEF0dHJpYnV0aW9uQ29udGV4dCA9IHt9O1xuICB0cnkge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgVVRNX0tFWVMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKHZhbHVlKSBvdXRba2V5IGFzIFV0bUtleV0gPSB2YWx1ZS5zbGljZSgwLCAyMDApO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTWFsZm9ybWVkIFVSTCDigJQgcmFyZSwgYnV0IG5ldmVyIGxldCBpdCB0aHJvdy5cbiAgfVxuXG4gIGNvbnN0IHJlZmVycmVyID0gZG9jdW1lbnQucmVmZXJyZXIgfHwgXCJcIjtcbiAgaWYgKHJlZmVycmVyKSB7XG4gICAgb3V0LnJlZmVycmVyID0gcmVmZXJyZXIuc2xpY2UoMCwgNTAwKTtcbiAgICBjb25zdCBob3N0ID0gcGFyc2VSZWZlcnJlckhvc3QocmVmZXJyZXIpO1xuICAgIGlmIChob3N0KSBvdXQucmVmZXJyZXJfaG9zdCA9IGhvc3Q7XG4gIH1cblxuICB0cnkge1xuICAgIG91dC5sYW5kaW5nX3BhZ2UgPSAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCkuc2xpY2UoMCwgNTAwKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVW5yZWFjaGFibGUgaW4gbm9ybWFsIGJyb3dzZXJzLlxuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFRydWUgaWYgdGhlIHNuYXBzaG90IGhhcyBhdCBsZWFzdCBvbmUgbWVhbmluZ2Z1bCBzaWduYWwuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQW55QXR0cmlidXRpb24oYTogQXR0cmlidXRpb25Db250ZXh0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghYSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBvZiBVVE1fS0VZUykge1xuICAgIGlmIChhW2tleSBhcyBVdG1LZXldKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYS5yZWZlcnJlcl9ob3N0KSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIExvYWQgdGhlIHNlc3Npb24tc2NvcGVkIHNuYXBzaG90IGZyb20gc2Vzc2lvblN0b3JhZ2UgaWYgaXQgZXhpc3RzLFxuICogb3RoZXJ3aXNlIGNhcHR1cmUgYSBmcmVzaCBvbmUgZnJvbSBgd2luZG93YCBhbmQgcGVyc2lzdCBpdC4gU2FtZSBjYWxsXG4gKiB0d2ljZSBpbiB0aGUgc2FtZSBzZXNzaW9uIHJldHVybnMgdGhlIHNhbWUgb2JqZWN0IOKAlCBmaXJzdC10b3VjaCBvZlxuICogVEhJUyBzZXNzaW9uIG5ldmVyIHNoaWZ0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9yQ3JlYXRlU2Vzc2lvbkF0dHJpYnV0aW9uKCk6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNCcm93c2VyKCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uQXR0cmlidXRpb24pO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2FjaGVkKSBhcyBBdHRyaWJ1dGlvbkNvbnRleHQ7XG4gICAgICBpZiAocGFyc2VkICYmIHR5cGVvZiBwYXJzZWQgPT09IFwib2JqZWN0XCIpIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBDb3JydXB0IHN0b3JhZ2Ug4oCUIHJlLWNhcHR1cmUgYmVsb3cuXG4gIH1cblxuICBjb25zdCBmcmVzaCA9IGNhcHR1cmVGcm9tV2luZG93KCk7XG4gIGlmICghZnJlc2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbkF0dHJpYnV0aW9uLCBKU09OLnN0cmluZ2lmeShmcmVzaCkpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBRdW90YSAvIGRpc2FibGVkIOKAlCBzdGlsbCByZXR1cm4gdGhlIGluLW1lbW9yeSB2YWx1ZS5cbiAgfVxuICByZXR1cm4gZnJlc2g7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgZGV2aWNlJ3MgZmlyc3QtdG91Y2ggc25hcHNob3QgKGxvY2FsU3RvcmFnZSkuIFdyaXRlcyBgZnJlc2hgXG4gKiBvbmx5IGlmIG5vIGZpcnN0LXRvdWNoIGhhcyBiZWVuIHJlY29yZGVkIEFORCBgZnJlc2hgIGhhcyBhdCBsZWFzdCBvbmVcbiAqIG1lYW5pbmdmdWwgc2lnbmFsIOKAlCB3ZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSBhIHJlYWwgZmlyc3QtdG91Y2hcbiAqIG1vbnRocyBsYXRlciwgYW5kIHdlIGRvbid0IHdhbnQgdG8gYnVybiBhIGZpcnN0LXRvdWNoIHNsb3Qgb24gYW4gZW1wdHlcbiAqIGRpcmVjdC10cmFmZmljIHNlc3Npb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPclNlZWRGaXJzdFRvdWNoKFxuICBmcmVzaDogQXR0cmlidXRpb25Db250ZXh0IHwgdW5kZWZpbmVkLFxuKTogQXR0cmlidXRpb25Db250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpc0Jyb3dzZXIoKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGNvbnN0IGNhY2hlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5maXJzdFRvdWNoQXR0cmlidXRpb24pO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2FjaGVkKSBhcyBBdHRyaWJ1dGlvbkNvbnRleHQ7XG4gICAgICBpZiAocGFyc2VkICYmIHR5cGVvZiBwYXJzZWQgPT09IFwib2JqZWN0XCIpIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBDb3JydXB0IHN0b3JhZ2Ug4oCUIGZhbGwgdGhyb3VnaCB0byBzZWVkLlxuICB9XG5cbiAgaWYgKCFoYXNBbnlBdHRyaWJ1dGlvbihmcmVzaCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLmZpcnN0VG91Y2hBdHRyaWJ1dGlvbiwgSlNPTi5zdHJpbmdpZnkoZnJlc2gpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gUXVvdGEgLyBkaXNhYmxlZC5cbiAgfVxuICByZXR1cm4gZnJlc2g7XG59XG5cbi8qKiBDbGVhciB0aGUgc2Vzc2lvbiBzbmFwc2hvdC4gQ2FsbGVkIHdoZW4gYSBuZXcgc2Vzc2lvbiByb2xscyBvdmVyIHNvXG4gKiAgdGhlIG5leHQgcGFnZXZpZXcgcmVjYXB0dXJlcyBmcmVzaCBVVE0gKyByZWZlcnJlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclNlc3Npb25BdHRyaWJ1dGlvbigpOiB2b2lkIHtcbiAgaWYgKCFpc0Jyb3dzZXIoKSkgcmV0dXJuO1xuICB0cnkge1xuICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25BdHRyaWJ1dGlvbik7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElnbm9yZS5cbiAgfVxufVxuIiwiaW1wb3J0IHsgU1RPUkFHRV9LRVlTLCBTRVNTSU9OX1RJTUVPVVRfTVMsIFNES19WRVJTSU9OIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB7IGdlbmVyYXRlQW5vbnltb3VzSWQgfSBmcm9tIFwiLi9kZXZpY2UuanNcIjtcbmltcG9ydCB7XG4gIGNsZWFyU2Vzc2lvbkF0dHJpYnV0aW9uLFxuICBnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbixcbiAgZ2V0T3JTZWVkRmlyc3RUb3VjaCxcbn0gZnJvbSBcIi4vYXR0cmlidXRpb24uanNcIjtcbmltcG9ydCB0eXBlIHsgQXR0cmlidXRpb25Db250ZXh0LCBFdmVudENvbnRleHQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29udGV4dE1hbmFnZXIge1xuICBwcml2YXRlIHVzZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdXNlclRyYWl0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgcHJpdmF0ZSBkZXZpY2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYW5vbnltb3VzSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBzZXNzaW9uSWQ6IHN0cmluZztcbiAgLyoqIEZpcnN0LXRvdWNoIGF0dHJpYnV0aW9uIGZvciB0aGUgQ1VSUkVOVCBzZXNzaW9uLiBDYXB0dXJlZCBvbiBzZXNzaW9uXG4gICAqICBjcmVhdGUsIHJvbGxlZCBvdmVyIHdoZW4gdGhlIDMwLW1pbiB3aW5kb3cgZXhwaXJlcy4gKi9cbiAgcHJpdmF0ZSBzZXNzaW9uQXR0cmlidXRpb246IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgLyoqIEV2ZXItZmlyc3QtdG91Y2ggYXR0cmlidXRpb24gYWNyb3NzIHRoZSBkZXZpY2UuIFBlcnNpc3RzIGluXG4gICAqICBsb2NhbFN0b3JhZ2U7IHdyaXR0ZW4gb25jZS4gKi9cbiAgcHJpdmF0ZSBmaXJzdFRvdWNoOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQ7XG4gIC8qKiBUcnVlIHdoZW4gYGxvYWRPckNyZWF0ZVNlc3Npb25gIG1pbnRlZCBhIGJyYW5kLW5ldyBzZXNzaW9uIGlkIG9uXG4gICAqICB0aGlzIGluc3RhbmNlICh2cy4gcmVzdW1pbmcgYW4gZXhpc3Rpbmcgb25lKS4gQ29uc3VtZXJzIHVzZSB0aGlzIHRvXG4gICAqICBkZWNpZGUgd2hldGhlciB0byBmaXJlIGEgYCRzZXNzaW9uX3N0YXJ0YCBldmVudC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzTmV3U2Vzc2lvbjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmFub255bW91c0lkID0gdGhpcy5sb2FkT3JDcmVhdGVBbm9ueW1vdXNJZCgpO1xuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBpc05ldyB9ID0gdGhpcy5sb2FkT3JDcmVhdGVTZXNzaW9uKCk7XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgdGhpcy5pc05ld1Nlc3Npb24gPSBpc05ldztcbiAgICB0aGlzLnNlc3Npb25BdHRyaWJ1dGlvbiA9IGdldE9yQ3JlYXRlU2Vzc2lvbkF0dHJpYnV0aW9uKCk7XG4gICAgdGhpcy5maXJzdFRvdWNoID0gZ2V0T3JTZWVkRmlyc3RUb3VjaCh0aGlzLnNlc3Npb25BdHRyaWJ1dGlvbik7XG4gICAgdGhpcy5sb2FkSWRlbnRpdHkoKTtcbiAgfVxuXG4gIGdldENvbnRleHQoKTogRXZlbnRDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlX2lkOiB0aGlzLmRldmljZUlkID8/IHRoaXMuYW5vbnltb3VzSWQsXG4gICAgICBhbm9ueW1vdXNfaWQ6IHRoaXMuYW5vbnltb3VzSWQsXG4gICAgICBzZXNzaW9uX2lkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIHVzZXJfaWQ6IHRoaXMudXNlcklkLFxuICAgICAgcGxhdGZvcm06IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBcIndlYlwiIDogXCJzZXJ2ZXJcIixcbiAgICAgIGxvY2FsZTogdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IG5hdmlnYXRvci5sYW5ndWFnZSA6IFwiZW5cIixcbiAgICAgIHRpbWV6b25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUsXG4gICAgICBzZGtfdmVyc2lvbjogU0RLX1ZFUlNJT04sXG4gICAgICAuLi4odGhpcy5zZXNzaW9uQXR0cmlidXRpb24gPyB7IGF0dHJpYnV0aW9uOiB0aGlzLnNlc3Npb25BdHRyaWJ1dGlvbiB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuZmlyc3RUb3VjaCA/IHsgZmlyc3RfdG91Y2g6IHRoaXMuZmlyc3RUb3VjaCB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogU25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbidzIGF0dHJpYnV0aW9uLiBFbWl0IGFzIHByb3BzIG9uIHRoZVxuICAgKiAgYCRzZXNzaW9uX3N0YXJ0YCBldmVudCDigJQgdGhlc2UgZmllbGRzIEFSRSBhbHJlYWR5IG9uIGNvbnRleHQgb2ZcbiAgICogIGV2ZXJ5IGV2ZW50LCBidXQgaGF2aW5nIHRoZW0gYXQgdGhlIHRvcC1sZXZlbCBvZiB0aGUgc3RhcnQgZXZlbnRcbiAgICogIG1ha2VzIGZ1bm5lbHMgKyBkYXNoYm9hcmRzIGVhc2llciB0byBidWlsZC4gKi9cbiAgZ2V0U2Vzc2lvbkF0dHJpYnV0aW9uKCk6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbkF0dHJpYnV0aW9uO1xuICB9XG5cbiAgc2V0RGV2aWNlSWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV2aWNlSWQgPSBpZDtcbiAgfVxuXG4gIGdldERldmljZUlkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRldmljZUlkO1xuICB9XG5cbiAgc2V0VXNlcklkKHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51c2VySWQgPSB1c2VySWQ7XG4gIH1cblxuICBnZXRVc2VySWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudXNlcklkO1xuICB9XG5cbiAgZ2V0QW5vbnltb3VzSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hbm9ueW1vdXNJZDtcbiAgfVxuXG4gIHVwZGF0ZVVzZXJQcm9wZXJ0aWVzKHRyYWl0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJUcmFpdHMgPSB7IC4uLnRoaXMudXNlclRyYWl0cywgLi4udHJhaXRzIH07XG4gIH1cblxuICBnZXRVc2VyVHJhaXRzKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4geyAuLi50aGlzLnVzZXJUcmFpdHMgfTtcbiAgfVxuXG4gIHJlc2V0SWRlbnRpdHkoKTogdm9pZCB7XG4gICAgdGhpcy51c2VySWQgPSBudWxsO1xuICAgIHRoaXMudXNlclRyYWl0cyA9IHt9O1xuICAgIHRoaXMuYW5vbnltb3VzSWQgPSBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5hbm9ueW1vdXNJZCwgdGhpcy5hbm9ueW1vdXNJZCk7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uSWQsIHRoaXMuc2Vzc2lvbklkKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZUy5pZGVudGl0eSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250aW51ZVxuICAgIH1cbiAgICAvLyBUcmVhdCBpZGVudGl0eSByZXNldCBsaWtlIGEgbmV3IHNlc3Npb24gZm9yIGF0dHJpYnV0aW9uIHB1cnBvc2VzIOKAlFxuICAgIC8vIHRoZSBuZXh0IHBhZ2V2aWV3IHJlLWNhcHR1cmVzIFVUTSArIHJlZmVycmVyLiBGaXJzdC10b3VjaCBpcyBsZWZ0XG4gICAgLy8gYWxvbmU7IHRoYXQgYmVsb25ncyB0byB0aGUgZGV2aWNlLCBub3QgdGhlIGxvZ2dlZC1pbiB1c2VyLlxuICAgIGNsZWFyU2Vzc2lvbkF0dHJpYnV0aW9uKCk7XG4gICAgdGhpcy5zZXNzaW9uQXR0cmlidXRpb24gPSBnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbigpO1xuICB9XG5cbiAgdG91Y2hTZXNzaW9uKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uTGFzdFNlZW4sIERhdGUubm93KCkudG9TdHJpbmcoKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250aW51ZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZE9yQ3JlYXRlQW5vbnltb3VzSWQoKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVlTLmFub255bW91c0lkKTtcbiAgICAgIGlmIChzdG9yZWQpIHJldHVybiBzdG9yZWQ7XG4gICAgICBjb25zdCBpZCA9IGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5hbm9ueW1vdXNJZCwgaWQpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvYWRPckNyZWF0ZVNlc3Npb24oKTogeyBzZXNzaW9uSWQ6IHN0cmluZzsgaXNOZXc6IGJvb2xlYW4gfSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxhc3RTZWVuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbkxhc3RTZWVuKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbklkKTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAoZXhpc3RpbmcgJiYgbGFzdFNlZW4gJiYgbm93IC0gcGFyc2VJbnQobGFzdFNlZW4sIDEwKSA8IFNFU1NJT05fVElNRU9VVF9NUykge1xuICAgICAgICByZXR1cm4geyBzZXNzaW9uSWQ6IGV4aXN0aW5nLCBpc05ldzogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbklkLCBpZCk7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uTGFzdFNlZW4sIG5vdy50b1N0cmluZygpKTtcbiAgICAgIC8vIFNlc3Npb24gcm9sbGVkIG92ZXIgKG9yIGZpcnN0IHZpc2l0KS4gQ2xlYXIgYW55IHN0YWxlIHNlc3Npb24tXG4gICAgICAvLyBhdHRyaWJ1dGlvbiBzbmFwc2hvdCBzbyB0aGUgbmV4dCBjYXB0dXJlIHJlYWRzIGZyZXNoIFVUTStyZWZlcnJlclxuICAgICAgLy8gZnJvbSB0aGUgY3VycmVudCBwYWdlLlxuICAgICAgY2xlYXJTZXNzaW9uQXR0cmlidXRpb24oKTtcbiAgICAgIHJldHVybiB7IHNlc3Npb25JZDogaWQsIGlzTmV3OiB0cnVlIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyBzZXNzaW9uSWQ6IGdlbmVyYXRlQW5vbnltb3VzSWQoKSwgaXNOZXc6IHRydWUgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvYWRJZGVudGl0eSgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVlTLmlkZW50aXR5KTtcbiAgICAgIGlmICghcmF3KSByZXR1cm47XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMge1xuICAgICAgICB1c2VySWQ6IHN0cmluZztcbiAgICAgICAgdHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIH07XG4gICAgICB0aGlzLnVzZXJJZCA9IHBhcnNlZC51c2VySWQgPz8gbnVsbDtcbiAgICAgIHRoaXMudXNlclRyYWl0cyA9IHBhcnNlZC50cmFpdHMgPz8ge307XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb3JydXB0IHN0b3JhZ2Ug4oCUIGlnbm9yZVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBFbnJpY2hlZEV2ZW50IH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGNsYXNzIEV2ZW50UXVldWUge1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSBpdGVtczogRW5yaWNoZWRFdmVudFtdID0gW107XG5cbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5tYXhTaXplID0gbWF4U2l6ZTtcbiAgfVxuXG4gIGFkZChldmVudDogRW5yaWNoZWRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA+PSB0aGlzLm1heFNpemUpIHtcbiAgICAgIC8vIERyb3AgdGhlIG9sZGVzdCBldmVudCAoRklGTyBvdmVyZmxvdylcbiAgICAgIHRoaXMuaXRlbXMuc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy5pdGVtcy5wdXNoKGV2ZW50KTtcbiAgfVxuXG4gIGRyYWluKCk6IEVucmljaGVkRXZlbnRbXSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5pdGVtcy5zbGljZSgpO1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICByZXR1cm4gYWxsO1xuICB9XG5cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGbGFnVmFsdWUgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5jb25zdCBERUJVR19PVkVSUklERVNfS0VZID0gXCJscF9kZWJ1Z19vdmVycmlkZXNcIjtcblxuLyoqXG4gKiBGbGFnTWFuYWdlciBzdG9yZXMgc2VydmVyLWV2YWx1YXRlZCBGbGFnIHZhbHVlcyBhbmQgZXhwb3NlcyB0aGVtIHRvIFNES1xuICogY29uc3VtZXJzLiBFdmFsdWF0aW9uIGhhcHBlbnMgb24gdGhlIEFQSSAoc2VlIGAvdjEvY29uZmlnYCk7IHRoZSBTREsgb25seVxuICogY2FjaGVzIHRoZSByZXN1bHQgYW5kIHRyYWNrcyBleHBvc3VyZSBvbmNlIHBlciBmbGFnIHBlciBzZXNzaW9uLlxuICpcbiAqIERlYnVnIG92ZXJyaWRlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBzZXJ2ZXIgdmFsdWVzIHdoZW4gZGVidWcgbW9kZSBpc1xuICogYWN0aXZlLCBzbyBkZXZlbG9wZXJzIGNhbiB0ZXN0IGRpZmZlcmVudCBicmFuY2hlcyB3aXRob3V0IHRvdWNoaW5nIHRoZVxuICogc2VydmVyLiBPdmVycmlkZXMgYXJlIHBlcnNpc3RlZCBpbiBsb2NhbFN0b3JhZ2UgdW5kZXIgREVCVUdfT1ZFUlJJREVTX0tFWS5cbiAqL1xuZXhwb3J0IGNsYXNzIEZsYWdNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBmbGFnVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBwcml2YXRlIGRlYnVnT3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBwcml2YXRlIGV4cG9zZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBkZWJ1Z01vZGUgPSBmYWxzZTtcblxuICAvKiogQXBwbHkgdGhlIGxhdGVzdCBldmFsdWF0ZWQgZmxhZyB2YWx1ZXMgZnJvbSBgL3YxL2NvbmZpZ2AuICovXG4gIHNldEV2YWx1YXRlZEZsYWdzKGZsYWdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuZmxhZ1ZhbHVlcyA9IGZsYWdzO1xuICAgIHRoaXMuZXhwb3NlZC5jbGVhcigpO1xuICB9XG5cbiAgc2V0RGVidWdNb2RlKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRlYnVnTW9kZSA9IGVuYWJsZWQ7XG4gICAgaWYgKGVuYWJsZWQpIHRoaXMubG9hZERlYnVnT3ZlcnJpZGVzKCk7XG4gIH1cblxuICAvKiogT3ZlcnJpZGUgYSBmbGFnIHZhbHVlIGZvciBsb2NhbCB0ZXN0aW5nLiBPbmx5IGFjdGl2ZSB3aGVuIGRlYnVnPXRydWUuICovXG4gIG92ZXJyaWRlRmxhZyhrZXk6IHN0cmluZywgdmFsdWU6IEZsYWdWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuZGVidWdPdmVycmlkZXNba2V5XSA9IHZhbHVlO1xuICAgIHRoaXMuc2F2ZURlYnVnT3ZlcnJpZGVzKCk7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIGRlYnVnIG92ZXJyaWRlcy4gKi9cbiAgY2xlYXJPdmVycmlkZXMoKTogdm9pZCB7XG4gICAgdGhpcy5kZWJ1Z092ZXJyaWRlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShERUJVR19PVkVSUklERVNfS0VZKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vIGxvY2FsU3RvcmFnZVxuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgYWxsIGN1cnJlbnQgZGVidWcgb3ZlcnJpZGVzIChmb3IgZGVidWcgbWVudSBVSSkuICovXG4gIGdldE92ZXJyaWRlcygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5kZWJ1Z092ZXJyaWRlcyB9O1xuICB9XG5cbiAgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5mbGFnVmFsdWVzKS5sZW5ndGg7XG4gIH1cblxuICBldmFsdWF0ZShcbiAgICBmbGFnS2V5OiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiBGbGFnVmFsdWUsXG4gICAgX3VzZXJJZDogc3RyaW5nIHwgbnVsbCxcbiAgICBfYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgb25FeHBvc3VyZTogKGZsYWdLZXk6IHN0cmluZywgdmFsdWU6IEZsYWdWYWx1ZSkgPT4gdm9pZCxcbiAgKTogRmxhZ1ZhbHVlIHtcbiAgICBpZiAodGhpcy5kZWJ1Z01vZGUgJiYgZmxhZ0tleSBpbiB0aGlzLmRlYnVnT3ZlcnJpZGVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWJ1Z092ZXJyaWRlc1tmbGFnS2V5XSBhcyBGbGFnVmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGZsYWdLZXkgaW4gdGhpcy5mbGFnVmFsdWVzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZmxhZ1ZhbHVlc1tmbGFnS2V5XSBhcyBGbGFnVmFsdWU7XG4gICAgICBpZiAoIXRoaXMuZXhwb3NlZC5oYXMoZmxhZ0tleSkpIHtcbiAgICAgICAgdGhpcy5leHBvc2VkLmFkZChmbGFnS2V5KTtcbiAgICAgICAgb25FeHBvc3VyZShmbGFnS2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIGNsZWFyRXhwb3NlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cG9zZWQuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZERlYnVnT3ZlcnJpZGVzKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShERUJVR19PVkVSUklERVNfS0VZKTtcbiAgICAgIGlmIChzdG9yZWQpIHRoaXMuZGVidWdPdmVycmlkZXMgPSBKU09OLnBhcnNlKHN0b3JlZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBubyBsb2NhbFN0b3JhZ2Ugb3IgaW52YWxpZCBKU09OXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlRGVidWdPdmVycmlkZXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKERFQlVHX09WRVJSSURFU19LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMuZGVidWdPdmVycmlkZXMpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vIGxvY2FsU3RvcmFnZVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU1RPUkFHRV9LRVlTIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgRXhwZXJpbWVudEFzc2lnbm1lbnQsIEV4cGVyaW1lbnRSZXN1bHQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG50eXBlIEFzc2lnbm1lbnRTdG9yZSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbi8qKlxuICogRXhwZXJpbWVudHMgYXJlIGJ1Y2tldGVkIHNlcnZlci1zaWRlLiBUaGUgYC92MS9jb25maWdgIGVuZHBvaW50IHJldHVybnNcbiAqIGBleHBlcmltZW50czogeyBbZXhwZXJpbWVudEtleV06IHsgdmFyaWFudF9rZXksIHBheWxvYWQgfSB9YCDigJQgb25lIGVudHJ5XG4gKiBwZXIgZXhwZXJpbWVudCB0aGUgY2FsbGVyJ3MgZGV2aWNlIGlzIGVucm9sbGVkIGluLiBUaGUgU0RLJ3Mgam9iIGlzIHRvXG4gKiBjYWNoZSB0aGUgYXNzaWdubWVudCwgZW1pdCBhIHNpbmdsZSBleHBvc3VyZSBldmVudCBwZXIgc2Vzc2lvbiwgYW5kXG4gKiBzdXJmYWNlIHRoZSB2YXJpYW50IHRvIGNhbGxpbmcgY29kZS5cbiAqXG4gKiBObyBjbGllbnQtc2lkZSBidWNrZXRpbmcuIE5vIHRyYWZmaWMgZ2F0ZXMuIE5vIGN1bXVsYXRpdmUgd2VpZ2h0cy4gQWxsXG4gKiBvZiB0aGF0IGhhcHBlbnMgb24gdGhlIHNlcnZlciBzbyBldmVyeSBwbGF0Zm9ybSAod2ViLCBpT1MsIHNlcnZlciBTREspXG4gKiBhZ3JlZXMgb24gdGhlIGFzc2lnbm1lbnQgZm9yIGEgZ2l2ZW4gZGV2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgRXhwZXJpbWVudE1hbmFnZXIge1xuICBwcml2YXRlIGFzc2lnbm1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBFeHBlcmltZW50QXNzaWdubWVudD4gPSB7fTtcbiAgLyoqIFBlcnNpc3RlZCBwZXItc2Vzc2lvbjogcmVtZW1iZXJzIHdoaWNoIHZhcmlhbnQgd2UgbGFzdCBzdXJmYWNlZC4gKi9cbiAgcHJpdmF0ZSBzdGlja3lBc3NpZ25tZW50czogQXNzaWdubWVudFN0b3JlID0ge307XG4gIHByaXZhdGUgZXhwb3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubG9hZFN0aWNreUFzc2lnbm1lbnRzKCk7XG4gIH1cblxuICBzZXRBc3NpZ25tZW50cyhhc3NpZ25tZW50czogUmVjb3JkPHN0cmluZywgRXhwZXJpbWVudEFzc2lnbm1lbnQ+KTogdm9pZCB7XG4gICAgdGhpcy5hc3NpZ25tZW50cyA9IGFzc2lnbm1lbnRzO1xuICB9XG5cbiAgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hc3NpZ25tZW50cykubGVuZ3RoO1xuICB9XG5cbiAgcmVzb2x2ZShcbiAgICBleHBlcmltZW50S2V5OiBzdHJpbmcsXG4gICAgb25FeHBvc3VyZTogKGtleTogc3RyaW5nLCB2YXJpYW50OiBzdHJpbmcpID0+IHZvaWQsXG4gICk6IEV4cGVyaW1lbnRSZXN1bHQge1xuICAgIGNvbnN0IGFzc2lnbm1lbnQgPSB0aGlzLmFzc2lnbm1lbnRzW2V4cGVyaW1lbnRLZXldO1xuICAgIGlmICghYXNzaWdubWVudCkge1xuICAgICAgcmV0dXJuIHsgdmFyaWFudDogXCJjb250cm9sXCIgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYW50S2V5ID0gYXNzaWdubWVudC52YXJpYW50X2tleTtcblxuICAgIC8vIFBlcnNpc3Qgc28gdGhlIHZhcmlhbnQgaXMgc3RhYmxlIGV2ZW4gaWYgdGhlIHNlcnZlciByZXNwb25zZSBpc1xuICAgIC8vIGJyaWVmbHkgdW5hdmFpbGFibGUgYWZ0ZXIgYSBjYWNoZSBtaXNzLlxuICAgIGlmICh0aGlzLnN0aWNreUFzc2lnbm1lbnRzW2V4cGVyaW1lbnRLZXldICE9PSB2YXJpYW50S2V5KSB7XG4gICAgICB0aGlzLnN0aWNreUFzc2lnbm1lbnRzW2V4cGVyaW1lbnRLZXldID0gdmFyaWFudEtleTtcbiAgICAgIHRoaXMuc2F2ZVN0aWNreUFzc2lnbm1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmV4cG9zZWQuaGFzKGV4cGVyaW1lbnRLZXkpKSB7XG4gICAgICB0aGlzLmV4cG9zZWQuYWRkKGV4cGVyaW1lbnRLZXkpO1xuICAgICAgb25FeHBvc3VyZShleHBlcmltZW50S2V5LCB2YXJpYW50S2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB2YXJpYW50OiB2YXJpYW50S2V5LCBwYXlsb2FkOiBhc3NpZ25tZW50LnBheWxvYWQgfTtcbiAgfVxuXG4gIGNsZWFyQXNzaWdubWVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5zdGlja3lBc3NpZ25tZW50cyA9IHt9O1xuICAgIHRoaXMuZXhwb3NlZC5jbGVhcigpO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWVMuZXhwZXJpbWVudEFzc2lnbm1lbnRzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vIGxvY2FsU3RvcmFnZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZFN0aWNreUFzc2lnbm1lbnRzKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuZXhwZXJpbWVudEFzc2lnbm1lbnRzKTtcbiAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgdGhpcy5zdGlja3lBc3NpZ25tZW50cyA9IEpTT04ucGFyc2UocmF3KSBhcyBBc3NpZ25tZW50U3RvcmU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnN0aWNreUFzc2lnbm1lbnRzID0ge307XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlU3RpY2t5QXNzaWdubWVudHMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICBTVE9SQUdFX0tFWVMuZXhwZXJpbWVudEFzc2lnbm1lbnRzLFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnN0aWNreUFzc2lnbm1lbnRzKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBubyBsb2NhbFN0b3JhZ2VcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFNUT1JBR0VfS0VZUyB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG5pbnRlcmZhY2UgU3RvcmVkSWRlbnRpdHkge1xuICB1c2VySWQ6IHN0cmluZztcbiAgdHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWRlbnRpZmllZEF0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eU1hbmFnZXIge1xuICBwcml2YXRlIHVzZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dnZXIpIHtcbiAgICB0aGlzLmxvYWRGcm9tU3RvcmFnZSgpO1xuICB9XG5cbiAgaWRlbnRpZnkoXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICBjYWxsYmFja3M6IHtcbiAgICAgIGdldEN1cnJlbnRVc2VySWQ6ICgpID0+IHN0cmluZyB8IG51bGw7XG4gICAgICBzZXRVc2VySWQ6IChpZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgdXBkYXRlVHJhaXRzOiAodDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG4gICAgICByZXNldFNlc3Npb246ICgpID0+IHZvaWQ7XG4gICAgICBjbGVhckV4cGVyaW1lbnRBc3NpZ25tZW50czogKCkgPT4gdm9pZDtcbiAgICAgIGZsdXNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgICAgcG9zdElkZW50aXR5UmVzb2x2ZTogKHVzZXJJZDogc3RyaW5nLCBwcmV2aW91c0lkOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkO1xuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSBjYWxsYmFja3MuZ2V0Q3VycmVudFVzZXJJZCgpO1xuXG4gICAgaWYgKGN1cnJlbnRVc2VySWQgPT09IHVzZXJJZCkge1xuICAgICAgLy8gU2FtZSB1c2VyIOKAlCBtZXJnZSB0cmFpdHMgb25seSBpZiBwcm92aWRlZFxuICAgICAgaWYgKHRyYWl0cykge1xuICAgICAgICB0aGlzLnRyYWl0cyA9IHsgLi4udGhpcy50cmFpdHMsIC4uLnRyYWl0cyB9O1xuICAgICAgfVxuICAgICAgY2FsbGJhY2tzLnVwZGF0ZVRyYWl0cyh0aGlzLnRyYWl0cyk7XG4gICAgICB0aGlzLnBlcnNpc3QodXNlcklkLCB0aGlzLnRyYWl0cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNVc2VySWQgPSBjdXJyZW50VXNlcklkO1xuXG4gICAgLy8gTmV3IHVzZXIgb3IgcmUtaWRlbnRpZmljYXRpb24gd2l0aCBkaWZmZXJlbnQgdXNlcklkOlxuICAgIC8vIGZsdXNoIHF1ZXVlZCBldmVudHMgYXR0cmlidXRlZCB0byB0aGUgb2xkIGlkZW50aXR5IGJlZm9yZSBzd2l0Y2hpbmdcbiAgICBjYWxsYmFja3MuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICAvLyBSZXNldCBzZXNzaW9uIHN0YXRlIHNvIG5ldyBzZXNzaW9uIHN0YXJ0cyBjbGVhblxuICAgIGNhbGxiYWNrcy5yZXNldFNlc3Npb24oKTtcbiAgICBjYWxsYmFja3MuY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHMoKTtcblxuICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgIHRoaXMudHJhaXRzID0gdHJhaXRzID8/IHt9O1xuICAgIGNhbGxiYWNrcy5zZXRVc2VySWQodXNlcklkKTtcbiAgICBjYWxsYmFja3MudXBkYXRlVHJhaXRzKHRoaXMudHJhaXRzKTtcbiAgICB0aGlzLnBlcnNpc3QodXNlcklkLCB0aGlzLnRyYWl0cyk7XG5cbiAgICAvLyBOb3RpZnkgc2VydmVyIChmaXJlLWFuZC1mb3JnZXQpXG4gICAgY2FsbGJhY2tzLnBvc3RJZGVudGl0eVJlc29sdmUodXNlcklkLCBwcmV2aW91c1VzZXJJZCk7XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhcIklkZW50aWZpZWRcIiwgeyB1c2VySWQsIHByZXZpb3VzVXNlcklkIH0pO1xuICB9XG5cbiAgcmVzZXQoY2FsbGJhY2tzOiB7XG4gICAgcmVzZXRTZXNzaW9uOiAoKSA9PiB2b2lkO1xuICAgIGNsZWFyRXhwZXJpbWVudEFzc2lnbm1lbnRzOiAoKSA9PiB2b2lkO1xuICAgIGZsdXNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9KTogdm9pZCB7XG4gICAgY2FsbGJhY2tzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGNhbGxiYWNrcy5yZXNldFNlc3Npb24oKTtcbiAgICBjYWxsYmFja3MuY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHMoKTtcbiAgICB0aGlzLnVzZXJJZCA9IG51bGw7XG4gICAgdGhpcy50cmFpdHMgPSB7fTtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVlTLmlkZW50aXR5KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKFwiUmVzZXQgaWRlbnRpdHkuXCIpO1xuICB9XG5cbiAgZ2V0VXNlcklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnVzZXJJZDtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZyb21TdG9yYWdlKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuaWRlbnRpdHkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybjtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyBTdG9yZWRJZGVudGl0eTtcbiAgICAgIHRoaXMudXNlcklkID0gcGFyc2VkLnVzZXJJZCA/PyBudWxsO1xuICAgICAgdGhpcy50cmFpdHMgPSBwYXJzZWQudHJhaXRzID8/IHt9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gY29ycnVwdCDigJQgaWdub3JlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwZXJzaXN0KHVzZXJJZDogc3RyaW5nLCB0cmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgY29uc3QgcGF5bG9hZDogU3RvcmVkSWRlbnRpdHkgPSB7XG4gICAgICB1c2VySWQsXG4gICAgICB0cmFpdHMsXG4gICAgICBpZGVudGlmaWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuaWRlbnRpdHksIEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTVE9SQUdFX0tFWVMsIENPTkZJR19NQVhfQUdFX01TIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgU0RLQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdTeW5jIHtcbiAgcHJpdmF0ZSB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZXRhZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGlVcmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwaUtleTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hJbnRlcnZhbDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvbkNvbmZpZzogKGNvbmZpZzogU0RLQ29uZmlnKSA9PiB2b2lkLFxuICApIHt9XG5cbiAgc3RhcnQoZ2V0RGV2aWNlSWQ6ICgpID0+IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyAxLiBMb2FkIGZyb20gbG9jYWxTdG9yYWdlIHN5bmNocm9ub3VzbHkg4oCUIHplcm8tbGF0ZW5jeSBmaXJzdCBwYWludFxuICAgIGNvbnN0IHN0b3JlZCA9IHRoaXMubG9hZEZyb21TdG9yYWdlKCk7XG4gICAgaWYgKHN0b3JlZCkge1xuICAgICAgdGhpcy5vbkNvbmZpZyhzdG9yZWQuY29uZmlnKTtcbiAgICB9XG4gICAgLy8gMi4gRmV0Y2ggZnJvbSBBUEkgYXN5bmNocm9ub3VzbHlcbiAgICB0aGlzLmZldGNoQ29uZmlnKGdldERldmljZUlkKCkpLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJDb25maWcgZmV0Y2ggZmFpbGVkXCIsIGVycik7XG4gICAgfSk7XG4gICAgLy8gMy4gU3RhcnQgcmVmcmVzaCB0aW1lciDigJQgYWx3YXlzIHJlYWRzIHRoZSBsYXRlc3QgZGV2aWNlSWRcbiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5mZXRjaENvbmZpZyhnZXREZXZpY2VJZCgpKS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oXCJDb25maWcgcmVmcmVzaCBmYWlsZWRcIiwgZXJyKTtcbiAgICAgIH0pO1xuICAgIH0sIHRoaXMucmVmcmVzaEludGVydmFsKTtcbiAgfVxuXG4gIHN0b3AoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmZXRjaENvbmZpZyhkZXZpY2VJZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEFQSSByZXF1aXJlcyBYLURldmljZS1JRCDigJQgc2tpcCBmZXRjaCB1bnRpbCBkZXZpY2UgcmVnaXN0cmF0aW9uIGNvbXBsZXRlcy5cbiAgICAvLyBUaGUgcmVmcmVzaCB0aW1lciB3aWxsIHBpY2sgaXQgdXAgb24gdGhlIG5leHQgY3ljbGUuXG4gICAgaWYgKCFkZXZpY2VJZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXCJDb25maWcgZmV0Y2ggc2tpcHBlZCDigJQgbm8gZGV2aWNlIElEIHlldC5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmFwaUtleX1gLFxuICAgICAgXCJYLUVudmlyb25tZW50XCI6IHRoaXMuZW52aXJvbm1lbnQsXG4gICAgICBcIlgtRGV2aWNlLUlkXCI6IGRldmljZUlkLFxuICAgIH07XG4gICAgaWYgKHRoaXMuZXRhZykgaGVhZGVyc1tcIklmLU5vbmUtTWF0Y2hcIl0gPSB0aGlzLmV0YWc7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmFwaVVybH0vdjEvY29uZmlnYCwgeyBoZWFkZXJzIH0pO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgPT09IDMwNCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXCJDb25maWcgdW5jaGFuZ2VkICgzMDQpLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25maWcgZmV0Y2ggcmV0dXJuZWQgJHtyZXMuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0V0YWcgPSByZXMuaGVhZGVycy5nZXQoXCJFVGFnXCIpO1xuICAgIGlmIChuZXdFdGFnKSB0aGlzLmV0YWcgPSBuZXdFdGFnO1xuXG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGRhdGE6IFNES0NvbmZpZyB9O1xuICAgIHRoaXMub25Db25maWcoanNvbi5kYXRhKTtcbiAgICB0aGlzLnNhdmVUb1N0b3JhZ2UoanNvbi5kYXRhKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcIkNvbmZpZyB1cGRhdGVkXCIsIHtcbiAgICAgIGZsYWdzOiBPYmplY3Qua2V5cyhqc29uLmRhdGEuZmxhZ3MpLmxlbmd0aCxcbiAgICAgIGV4cGVyaW1lbnRzOiBPYmplY3Qua2V5cyhqc29uLmRhdGEuZXhwZXJpbWVudHMpLmxlbmd0aCxcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRGcm9tU3RvcmFnZSgpOiB7IGNvbmZpZzogU0RLQ29uZmlnOyBjYWNoZWRBdDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVlTLnNka0NvbmZpZyk7XG4gICAgICBpZiAoIXJhdykgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMge1xuICAgICAgICBjb25maWc6IFNES0NvbmZpZztcbiAgICAgICAgY2FjaGVkQXQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gcGFyc2VkLmNhY2hlZEF0O1xuICAgICAgaWYgKGFnZSA+IENPTkZJR19NQVhfQUdFX01TKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ2FjaGVkIGNvbmZpZyBpcyBzdGFsZSAoPjI0aCksIGlnbm9yaW5nLlwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2F2ZVRvU3RvcmFnZShjb25maWc6IFNES0NvbmZpZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgU1RPUkFHRV9LRVlTLnNka0NvbmZpZyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBjb25maWcsIGNhY2hlZEF0OiBEYXRlLm5vdygpIH0pLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFF1b3RhRXhjZWVkZWRFcnJvciBvciB1bmF2YWlsYWJsZSDigJQgY29udGludWUgd2l0aG91dCBjYWNoaW5nXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBERUZBVUxUUyB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEVucmljaGVkRXZlbnQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFdmVudFF1ZXVlIH0gZnJvbSBcIi4vcXVldWUuanNcIjtcbmltcG9ydCB0eXBlIHsgT2ZmbGluZVF1ZXVlIH0gZnJvbSBcIi4vb2ZmbGluZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25uZWN0aXZpdHlNb25pdG9yIH0gZnJvbSBcIi4vY29ubmVjdGl2aXR5LmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBsYXN0Rmx1c2hBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJldHJ5QmFja29mZiA9IERFRkFVTFRTLnJldHJ5QmFja29mZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwaVVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBpS2V5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmV0cnlBdHRlbXB0czogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IEV2ZW50UXVldWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvZmZsaW5lUXVldWU6IE9mZmxpbmVRdWV1ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpdml0eTogQ29ubmVjdGl2aXR5TW9uaXRvcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwVmVyc2lvbjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICkge31cblxuICBnZXRMYXN0Rmx1c2hBdCgpOiBEYXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdEZsdXNoQXQ7XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudHMgPSB0aGlzLnF1ZXVlLmRyYWluKCk7XG4gICAgaWYgKGV2ZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIElmIG9mZmxpbmUsIG1vdmUgZXZlbnRzIGRpcmVjdGx5IHRvIG9mZmxpbmUgcXVldWVcbiAgICBpZiAoIXRoaXMuY29ubmVjdGl2aXR5LmlzT25saW5lKCkpIHtcbiAgICAgIHRoaXMub2ZmbGluZVF1ZXVlLmVucXVldWUoZXZlbnRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZW50ID0gYXdhaXQgdGhpcy5zZW5kV2l0aFJldHJ5KGV2ZW50cywgMCk7XG4gICAgaWYgKHNlbnQpIHtcbiAgICAgIHRoaXMubGFzdEZsdXNoQXQgPSBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZsdXNoV2l0aEJlYWNvbihldmVudHM6IEVucmljaGVkRXZlbnRbXSk6IHZvaWQge1xuICAgIGlmIChldmVudHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgfHwgIW5hdmlnYXRvci5zZW5kQmVhY29uKSByZXR1cm47XG4gICAgY29uc3QgZmlyc3QgPSBldmVudHNbMF07XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGJhdGNoOiBldmVudHMubWFwKChlKSA9PiAoe1xuICAgICAgICB0eXBlOiBcInRyYWNrXCIgYXMgY29uc3QsXG4gICAgICAgIGV2ZW50OiBlLmV2ZW50X25hbWUsXG4gICAgICAgIHByb3BlcnRpZXM6IGUuZXZlbnRfcHJvcGVydGllcyA/PyB7fSxcbiAgICAgICAgdGltZXN0YW1wOiBlLnRpbWVzdGFtcCxcbiAgICAgIH0pKSxcbiAgICAgIGNvbnRleHQ6IGZpcnN0XG4gICAgICAgID8ge1xuICAgICAgICAgICAgdXNlcjogeyBpZDogZmlyc3QudXNlcl9pZCA/PyB1bmRlZmluZWQsIGFub255bW91c19pZDogZmlyc3QuYW5vbnltb3VzX2lkIH0sXG4gICAgICAgICAgICBkZXZpY2U6IHtcbiAgICAgICAgICAgICAgaWQ6IGZpcnN0LmRldmljZV9pZCxcbiAgICAgICAgICAgICAgcGxhdGZvcm06IGZpcnN0LnBsYXRmb3JtIGFzIFwid2ViXCIgfCBcImlvc1wiIHwgXCJhbmRyb2lkXCIsXG4gICAgICAgICAgICAgIGxvY2FsZTogZmlyc3QubG9jYWxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlc3Npb246IHsgaWQ6IGZpcnN0LnNlc3Npb25faWQgfSxcbiAgICAgICAgICAgIC4uLih0aGlzLmFwcFZlcnNpb24gPyB7IGFwcDogeyB2ZXJzaW9uOiB0aGlzLmFwcFZlcnNpb24gfSB9IDoge30pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSxcbiAgICAgIHNlbnRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICAvLyBzZW5kQmVhY29uIGRvZXMgbm90IHN1cHBvcnQgY3VzdG9tIGhlYWRlcnMg4oCUIHBhc3MgYXV0aCB2aWEgcXVlcnkgcGFyYW1zXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlVcmx9L3YxL2luZ2VzdD9hcGlfa2V5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYXBpS2V5KX0mZW52PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZW52aXJvbm1lbnQpfWA7XG4gICAgY29uc3Qgc2VudCA9IG5hdmlnYXRvci5zZW5kQmVhY29uKHVybCwgbmV3IEJsb2IoW2JvZHldLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pKTtcbiAgICBpZiAoIXNlbnQpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJzZW5kQmVhY29uIGZhaWxlZCDigJQgZXZlbnRzIG1heSBiZSBsb3N0IG9uIHBhZ2UgdW5sb2FkLlwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRXaXRoUmV0cnkoZXZlbnRzOiBFbnJpY2hlZEV2ZW50W10sIGF0dGVtcHQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGJvZHksIGNvbXByZXNzZWQgfSA9IGF3YWl0IHRoaXMuYnVpbGRCb2R5KGV2ZW50cyk7XG4gICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hcGlLZXl9YCxcbiAgICAgICAgXCJYLUVudmlyb25tZW50XCI6IHRoaXMuZW52aXJvbm1lbnQsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfTtcbiAgICAgIGlmIChjb21wcmVzc2VkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LUVuY29kaW5nXCJdID0gXCJnemlwXCI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuYXBpVXJsfS92MS9pbmdlc3RgLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICAvLyBNYWxmb3JtZWQgYmF0Y2gg4oCUIGRyb3AsIGRvIG5vdCByZXRyeVxuICAgICAgICB0aGlzLmxvZy5lcnJvcihcIkluZ2VzdCA0MDA6IGRyb3BwaW5nIGJhdGNoLlwiLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBwYXJzZUludChyZXMuaGVhZGVycy5nZXQoXCJSZXRyeS1BZnRlclwiKSA/PyBcIjVcIiwgMTApO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBSYXRlIGxpbWl0ZWQsIHJldHJ5aW5nIGFmdGVyICR7cmV0cnlBZnRlcn1zYCk7XG4gICAgICAgIC8vIFJlLXF1ZXVlIGV2ZW50cyBmb3IgbmV4dCBmbHVzaCBjeWNsZVxuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB0aGlzLnF1ZXVlLmFkZChlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzLnN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmdlc3QgNXh4OiAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBGbHVzaGVkICR7ZXZlbnRzLmxlbmd0aH0gZXZlbnRzLmApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoYXR0ZW1wdCA8IHRoaXMucmV0cnlBdHRlbXB0cyAtIDEpIHtcbiAgICAgICAgY29uc3QgZGVsYXkgPVxuICAgICAgICAgIHRoaXMucmV0cnlCYWNrb2ZmW2F0dGVtcHRdID8/IHRoaXMucmV0cnlCYWNrb2ZmW3RoaXMucmV0cnlCYWNrb2ZmLmxlbmd0aCAtIDFdID8/IDE1MDAwO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBGbHVzaCBhdHRlbXB0ICR7YXR0ZW1wdCArIDF9IGZhaWxlZCwgcmV0cnlpbmcgaW4gJHtkZWxheX1tc2AsIGVycik7XG4gICAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFdpdGhSZXRyeShldmVudHMsIGF0dGVtcHQgKyAxKTtcbiAgICAgIH1cbiAgICAgIC8vIE1heCByZXRyaWVzIGV4Y2VlZGVkIOKAlCBtb3ZlIHRvIG9mZmxpbmUgcXVldWVcbiAgICAgIHRoaXMubG9nLmVycm9yKFwiTWF4IHJldHJpZXMgZXhjZWVkZWQsIG1vdmluZyB0byBvZmZsaW5lIHF1ZXVlLlwiLCBlcnIpO1xuICAgICAgdGhpcy5vZmZsaW5lUXVldWUuZW5xdWV1ZShldmVudHMpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRCb2R5KFxuICAgIGV2ZW50czogRW5yaWNoZWRFdmVudFtdLFxuICApOiBQcm9taXNlPHsgYm9keTogc3RyaW5nIHwgQmxvYjsgY29tcHJlc3NlZDogYm9vbGVhbiB9PiB7XG4gICAgLy8gVHJhbnNmb3JtIGVucmljaGVkIGV2ZW50cyBpbnRvIHRoZSBBUEkncyBpbmdlc3RCYXRjaFNjaGVtYSBmb3JtYXQuXG4gICAgLy8gVGhlIEFQSSBleHBlY3RzIHsgYmF0Y2g6IFt7dHlwZSxldmVudCxwcm9wZXJ0aWVzLHRpbWVzdGFtcH1dLCBjb250ZXh0OiB7Li4ufSwgc2VudF9hdCB9XG4gICAgLy8gd2hpbGUgaW50ZXJuYWxseSB3ZSBzdG9yZSBmbGF0IGVucmljaGVkIGV2ZW50cy5cbiAgICBjb25zdCBmaXJzdCA9IGV2ZW50c1swXTtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgYmF0Y2g6IGV2ZW50cy5tYXAoKGUpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidHJhY2tcIiBhcyBjb25zdCxcbiAgICAgICAgZXZlbnQ6IGUuZXZlbnRfbmFtZSxcbiAgICAgICAgcHJvcGVydGllczogZS5ldmVudF9wcm9wZXJ0aWVzID8/IHt9LFxuICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgfSkpLFxuICAgICAgY29udGV4dDogZmlyc3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB1c2VyOiB7IGlkOiBmaXJzdC51c2VyX2lkID8/IHVuZGVmaW5lZCwgYW5vbnltb3VzX2lkOiBmaXJzdC5hbm9ueW1vdXNfaWQgfSxcbiAgICAgICAgICAgIGRldmljZToge1xuICAgICAgICAgICAgICBpZDogZmlyc3QuZGV2aWNlX2lkLFxuICAgICAgICAgICAgICBwbGF0Zm9ybTogZmlyc3QucGxhdGZvcm0gYXMgXCJ3ZWJcIiB8IFwiaW9zXCIgfCBcImFuZHJvaWRcIixcbiAgICAgICAgICAgICAgbG9jYWxlOiBmaXJzdC5sb2NhbGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2Vzc2lvbjogeyBpZDogZmlyc3Quc2Vzc2lvbl9pZCB9LFxuICAgICAgICAgICAgLi4uKHRoaXMuYXBwVmVyc2lvbiA/IHsgYXBwOiB7IHZlcnNpb246IHRoaXMuYXBwVmVyc2lvbiB9IH0gOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9LFxuICAgICAgc2VudF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIGlmIChqc29uLmxlbmd0aCA8IDEwMjQpIHJldHVybiB7IGJvZHk6IGpzb24sIGNvbXByZXNzZWQ6IGZhbHNlIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBDb21wcmVzc2lvblN0cmVhbShcImd6aXBcIik7XG4gICAgICBjb25zdCB3cml0ZXIgPSBzdHJlYW0ud3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICB2b2lkIHdyaXRlci53cml0ZShlbmNvZGVyLmVuY29kZShqc29uKSk7XG4gICAgICB2b2lkIHdyaXRlci5jbG9zZSgpO1xuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBSZXNwb25zZShzdHJlYW0ucmVhZGFibGUpLmJsb2IoKTtcbiAgICAgIHJldHVybiB7IGJvZHk6IGJsb2IsIGNvbXByZXNzZWQ6IHRydWUgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENvbXByZXNzaW9uU3RyZWFtIG5vdCBzdXBwb3J0ZWQg4oCUIHNlbmQgdW5jb21wcmVzc2VkXG4gICAgICByZXR1cm4geyBib2R5OiBqc29uLCBjb21wcmVzc2VkOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuIiwiaW1wb3J0IHsgU1RPUkFHRV9LRVlTLCBPRkZMSU5FX1FVRVVFX01BWCB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEVucmljaGVkRXZlbnQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgT2ZmbGluZVF1ZXVlIHtcbiAgZW5xdWV1ZShldmVudHM6IEVucmljaGVkRXZlbnRbXSk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5sb2FkKCk7XG4gICAgY29uc3QgY29tYmluZWQgPSBbLi4uZXhpc3RpbmcsIC4uLmV2ZW50c107XG4gICAgLy8gS2VlcCBvbmx5IHRoZSBtb3N0IHJlY2VudCBPRkZMSU5FX1FVRVVFX01BWCBldmVudHNcbiAgICBjb25zdCB0cmltbWVkID0gY29tYmluZWQuc2xpY2UoLU9GRkxJTkVfUVVFVUVfTUFYKTtcbiAgICB0aGlzLnNhdmUodHJpbW1lZCk7XG4gIH1cblxuICBkcmFpbigpOiBFbnJpY2hlZEV2ZW50W10ge1xuICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMubG9hZCgpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICByZXR1cm4gZXZlbnRzO1xuICB9XG5cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmxvYWQoKS5sZW5ndGg7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVlTLm9mZmxpbmVRdWV1ZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250aW51ZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZCgpOiBFbnJpY2hlZEV2ZW50W10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMub2ZmbGluZVF1ZXVlKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm4gW107XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIEVucmljaGVkRXZlbnRbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmUoZXZlbnRzOiBFbnJpY2hlZEV2ZW50W10pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLm9mZmxpbmVRdWV1ZSwgSlNPTi5zdHJpbmdpZnkoZXZlbnRzKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBRdW90YUV4Y2VlZGVkRXJyb3Ig4oCUIHJlbW92ZSBoYWxmIHRoZSBvbGRlc3QgZXZlbnRzIGFuZCByZXRyeSBvbmNlXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIGVyci5uYW1lID09PSBcIlF1b3RhRXhjZWVkZWRFcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IGhhbGYgPSBldmVudHMuc2xpY2UoTWF0aC5mbG9vcihldmVudHMubGVuZ3RoIC8gMikpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5vZmZsaW5lUXVldWUsIEpTT04uc3RyaW5naWZ5KGhhbGYpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZ2l2ZSB1cFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgQ29ubmVjdGl2aXR5TW9uaXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25saW5lQ2FsbGJhY2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG9mZmxpbmVDYWxsYmFja3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgb25PbmxpbmVIYW5kbGVyOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uT2ZmbGluZUhhbmRsZXI6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vbk9ubGluZUhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNiIG9mIHRoaXMub25saW5lQ2FsbGJhY2tzKSBjYigpO1xuICAgIH07XG4gICAgdGhpcy5vbk9mZmxpbmVIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBjYiBvZiB0aGlzLm9mZmxpbmVDYWxsYmFja3MpIGNiKCk7XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy5vbk9ubGluZUhhbmRsZXIpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMub25PZmZsaW5lSGFuZGxlcik7XG4gICAgfVxuICB9XG5cbiAgaXNPbmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyB0cnVlIDogbmF2aWdhdG9yLm9uTGluZTtcbiAgfVxuXG4gIG9uT25saW5lKGNiOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbmxpbmVDYWxsYmFja3MucHVzaChjYik7XG4gIH1cblxuICBvbk9mZmxpbmUoY2I6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9mZmxpbmVDYWxsYmFja3MucHVzaChjYik7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLm9uT25saW5lSGFuZGxlcik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgdGhpcy5vbk9mZmxpbmVIYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRXZlbnRRdWV1ZSB9IGZyb20gXCIuL3F1ZXVlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zcG9ydCB9IGZyb20gXCIuL3RyYW5zcG9ydC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tIFwiLi9sb2dnZXIuanNcIjtcblxuLyoqXG4gKiBPd25zIHBhZ2UtbGlmZWN5Y2xlIG9ic2VydmFiaWxpdHk6XG4gKlxuICogICAtIExpc3RlbnMgZm9yIGBwYWdlaGlkZWAgLyBgYmVmb3JldW5sb2FkYCBhbmQgZmx1c2hlcyB0aGUgZXZlbnRcbiAqICAgICBxdWV1ZSB2aWEgYmVhY29uIHNvIGluLWZsaWdodCBldmVudHMgc3Vydml2ZSB0YWIgY2xvc2UuXG4gKiAgIC0gVHJhY2tzIHBlci1wYWdlIHN0YXRlIChgZW50cnlUaW1lYCwgYG1heFNjcm9sbFBjdGAsXG4gKiAgICAgYHRhYkhpZGRlbkNvdW50YCwgYGN1bXVsYXRpdmVIaWRkZW5Nc2ApIGFuZCBlbWl0cyBhIHNpbmdsZVxuICogICAgIGAkcGFnZV9sZWF2ZWAgZXZlbnQgcGVyIHBhZ2Ugb24gcmVhbCBleGl0LlxuICpcbiAqIFRoZSBob3N0IFNQQSBtdXN0IGNhbGwgYHJlY29yZFBhZ2VWaWV3KHBhdGgpYCBvbiBldmVyeSByb3V0ZSBjaGFuZ2VcbiAqICh0aGUgUmVhY3QgYDxQYWdlVmlld1RyYWNrZXI+YCBkb2VzIHRoaXMpLiBUaGUgZmlyc3QgY2FsbCBhZnRlclxuICogcmVnaXN0ZXIgc3RhcnRzIHRoZSBwYWdlLWxlYXZlIHRpbWVyOyBzdWJzZXF1ZW50IGNhbGxzIGVtaXQgYVxuICogc3ludGhldGljIGAkcGFnZV9sZWF2ZXtleGl0X2tpbmQ6IFwic3BhX25hdlwifWAgZm9yIHRoZSBwcmV2aW91cyBwYXRoXG4gKiBiZWZvcmUgcmVzZXR0aW5nIHN0YXRlIGZvciB0aGUgbmV3IG9uZS5cbiAqXG4gKiBgdGltZV9vbl9wYWdlX21zYCBhbmQgYGN1bXVsYXRpdmVfaGlkZGVuX21zYCBhcmUgcm91bmRlZCB0byAxMDBtcyDigJRcbiAqIHRoZSBjb25zdW1lciBoYXMgbm8gdXNlIGZvciBzdWItMTAwbXMgcHJlY2lzaW9uIGFuZCByb3VuZGluZyBtYWtlc1xuICogZmluZ2VycHJpbnRzIGhhcmRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIExpZmVjeWNsZU1hbmFnZXIge1xuICBwcml2YXRlIGhhbmRsZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIGZsdXNoZWRPbkV4aXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsZWF2ZUVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBQZXItcGFnZSBzdGF0ZS4gYGN1cnJlbnRQYXRoID09PSBudWxsYCBtZWFucyByZWNvcmRQYWdlVmlldygpIGhhc1xuICAvLyBuZXZlciBiZWVuIGNhbGxlZCBhbmQgd2UgaGF2ZSBub3RoaW5nIHRvIGVtaXQgYSBsZWF2ZSBldmVudCBmb3IuXG4gIHByaXZhdGUgY3VycmVudFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVudHJ5VGltZSA9IDA7XG4gIHByaXZhdGUgbWF4U2Nyb2xsUGN0ID0gMDtcbiAgcHJpdmF0ZSB0YWJIaWRkZW5Db3VudCA9IDA7XG4gIHByaXZhdGUgaGlkZGVuU2luY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1bXVsYXRpdmVIaWRkZW5NcyA9IDA7XG4gIHByaXZhdGUgc2Nyb2xsVGhyb3R0bGVUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlOiBFdmVudFF1ZXVlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNwb3J0OiBUcmFuc3BvcnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVtaXRFdmVudD86IChuYW1lOiBzdHJpbmcsIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZCxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBNYXJrIHRoZSBzdGFydCBvZiBhIG5ldyBwYWdlIHZpZXcuIEVtaXRzIGAkcGFnZV9sZWF2ZWAgZm9yIGFueVxuICAgKiBwcmV2aW91cyBwYWdlIGZpcnN0ICh3aXRoIGBleGl0X2tpbmQ6IFwic3BhX25hdlwiYCksIHRoZW4gcmVzZXRzXG4gICAqIHN0YXRlIGZvciB0aGUgbmV3IHBhZ2UuIElkZW1wb3RlbnQgZm9yIHJlcGVhdCBjYWxscyB3aXRoIHRoZSBzYW1lXG4gICAqIHBhdGguXG4gICAqL1xuICByZWNvcmRQYWdlVmlldyhwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aCA9PT0gcGF0aCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoICE9PSBudWxsICYmICF0aGlzLmxlYXZlRW1pdHRlZCkge1xuICAgICAgdGhpcy5lbWl0UGFnZUxlYXZlKFwic3BhX25hdlwiKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGF0aCA9IHBhdGg7XG4gICAgdGhpcy5lbnRyeVRpbWUgPSBub3dNcygpO1xuICAgIHRoaXMubWF4U2Nyb2xsUGN0ID0gMDtcbiAgICB0aGlzLnRhYkhpZGRlbkNvdW50ID0gMDtcbiAgICB0aGlzLmhpZGRlblNpbmNlID0gbnVsbDtcbiAgICB0aGlzLmN1bXVsYXRpdmVIaWRkZW5NcyA9IDA7XG4gICAgdGhpcy5sZWF2ZUVtaXR0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZsdXNoZWRPbkV4aXQgPSBmYWxzZTtcbiAgfVxuXG4gIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG5cbiAgICAvLyBVc2UgcGFnZWhpZGUgYXMgdGhlIHByaW1hcnkgZXhpdCBldmVudCAocmVjb21tZW5kZWQgbW9kZXJuIEFQSSkuXG4gICAgLy8gYmVmb3JldW5sb2FkIGlzIGtlcHQgYXMgYSBmYWxsYmFjayBmb3Igb2xkZXIgYnJvd3NlcnMsIGJ1dCBndWFyZGVkXG4gICAgLy8gYWdhaW5zdCBkb3VibGUtZHJhaW5pbmcgdmlhIGBmbHVzaGVkT25FeGl0YC5cbiAgICBjb25zdCBvbkV4aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5mbHVzaGVkT25FeGl0KSByZXR1cm47XG4gICAgICB0aGlzLmZsdXNoZWRPbkV4aXQgPSB0cnVlO1xuICAgICAgdGhpcy5lbWl0UGFnZUxlYXZlKFwicGFnZWhpZGVcIik7XG4gICAgICBjb25zdCBldmVudHMgPSB0aGlzLnF1ZXVlLmRyYWluKCk7XG4gICAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuZmx1c2hXaXRoQmVhY29uKGV2ZW50cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uVmlzaWJpbGl0eUNoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwiaGlkZGVuXCIpIHtcbiAgICAgICAgdGhpcy50YWJIaWRkZW5Db3VudCArPSAxO1xuICAgICAgICB0aGlzLmhpZGRlblNpbmNlID0gbm93TXMoKTtcbiAgICAgICAgLy8gQXN5bmMgZmx1c2ggb24gdGFiIGhpZGUgKG5vdCBwYWdlIGNsb3NlKSDigJQgbWF5IG5vdCBjb21wbGV0ZSBidXQgYmVzdC1lZmZvcnRcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSBcInZpc2libGVcIikge1xuICAgICAgICBpZiAodGhpcy5oaWRkZW5TaW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuY3VtdWxhdGl2ZUhpZGRlbk1zICs9IG5vd01zKCkgLSB0aGlzLmhpZGRlblNpbmNlO1xuICAgICAgICAgIHRoaXMuaGlkZGVuU2luY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2V0IGV4aXQgZmxhZyB3aGVuIHBhZ2UgYmVjb21lcyB2aXNpYmxlIGFnYWluIChiZmNhY2hlIHJlc3RvcmUpXG4gICAgICAgIHRoaXMuZmx1c2hlZE9uRXhpdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblNjcm9sbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbFRocm90dGxlVGltZXIgIT09IG51bGwpIHJldHVybjtcbiAgICAgIHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNjcm9sbFRocm90dGxlVGltZXIgPSBudWxsO1xuICAgICAgICBjb25zdCBwY3QgPSBjb21wdXRlU2Nyb2xsUGN0KCk7XG4gICAgICAgIGlmIChwY3QgPiB0aGlzLm1heFNjcm9sbFBjdCkgdGhpcy5tYXhTY3JvbGxQY3QgPSBwY3Q7XG4gICAgICB9LCAyNTApO1xuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIG9uRXhpdCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgb25FeGl0KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCBvblZpc2liaWxpdHlDaGFuZ2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIG9uU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goXG4gICAgICAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIG9uRXhpdCksXG4gICAgICAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBvbkV4aXQpLFxuICAgICAgKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgb25WaXNpYmlsaXR5Q2hhbmdlKSxcbiAgICAgICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIG9uU2Nyb2xsKSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRocm90dGxlVGltZXIpO1xuICAgICAgICAgIHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMubG9nLmRlYnVnKFwiTGlmZWN5Y2xlIGxpc3RlbmVycyByZWdpc3RlcmVkLlwiKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZW1vdmUgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgcmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFBhZ2VMZWF2ZShleGl0S2luZDogXCJwYWdlaGlkZVwiIHwgXCJzcGFfbmF2XCIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sZWF2ZUVtaXR0ZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5lbWl0RXZlbnQpIHJldHVybjtcbiAgICB0aGlzLmxlYXZlRW1pdHRlZCA9IHRydWU7XG5cbiAgICBsZXQgY3VtdWxhdGl2ZUhpZGRlbiA9IHRoaXMuY3VtdWxhdGl2ZUhpZGRlbk1zO1xuICAgIGlmICh0aGlzLmhpZGRlblNpbmNlICE9PSBudWxsKSB7XG4gICAgICBjdW11bGF0aXZlSGlkZGVuICs9IG5vd01zKCkgLSB0aGlzLmhpZGRlblNpbmNlO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdEV2ZW50KFwiJHBhZ2VfbGVhdmVcIiwge1xuICAgICAgcGF0aDogdGhpcy5jdXJyZW50UGF0aCxcbiAgICAgIHRpbWVfb25fcGFnZV9tczogcm91bmRUbzEwMChub3dNcygpIC0gdGhpcy5lbnRyeVRpbWUpLFxuICAgICAgbWF4X3Njcm9sbF9wY3Q6IHRoaXMubWF4U2Nyb2xsUGN0LFxuICAgICAgdGFiX2hpZGRlbl9jb3VudDogdGhpcy50YWJIaWRkZW5Db3VudCxcbiAgICAgIGN1bXVsYXRpdmVfaGlkZGVuX21zOiByb3VuZFRvMTAwKGN1bXVsYXRpdmVIaWRkZW4pLFxuICAgICAgZXhpdF9raW5kOiBleGl0S2luZCxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBVc2UgRGF0ZS5ub3coKSByYXRoZXIgdGhhbiBwZXJmb3JtYW5jZS5ub3coKSDigJQgd2Ugcm91bmQgdG8gMTAwbXMgc29cbi8vIHRoZSBzdWItbXMgcHJlY2lzaW9uIGlzIHVudXNlZCwgYW5kIERhdGUubm93KCkgaW50ZXJvcGVyYXRlcyBjbGVhbmx5XG4vLyB3aXRoIGB2aS51c2VGYWtlVGltZXJzKClgIHdoaWNoIGRvZXNuJ3QgbW9jayBwZXJmb3JtYW5jZS5ub3coKSBieVxuLy8gZGVmYXVsdC5cbmZ1bmN0aW9uIG5vd01zKCk6IG51bWJlciB7XG4gIHJldHVybiBEYXRlLm5vdygpO1xufVxuXG5mdW5jdGlvbiByb3VuZFRvMTAwKG1zOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZChtcyAvIDEwMCkgKiAxMDApO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU2Nyb2xsUGN0KCk6IG51bWJlciB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIDA7XG4gIGNvbnN0IHNjcm9sbFRvcCA9IHdpbmRvdy5zY3JvbGxZID8/IDA7XG4gIGNvbnN0IGRvY0hlaWdodCA9IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ/LnNjcm9sbEhlaWdodCA/PyAwKSAtICh3aW5kb3cuaW5uZXJIZWlnaHQgPz8gMCk7XG4gIGlmIChkb2NIZWlnaHQgPD0gMCkgcmV0dXJuIDEwMDtcbiAgcmV0dXJuIE1hdGgubWluKDEwMCwgTWF0aC5yb3VuZCgoc2Nyb2xsVG9wIC8gZG9jSGVpZ2h0KSAqIDEwMCkpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tIFwiLi9sb2dnZXIuanNcIjtcblxudHlwZSBUcmFja2VyID0gKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JDYXB0dXJlQ29uZmlnIHtcbiAgLyoqIENhcHR1cmUgdW5jYXVnaHQgZXJyb3JzIHZpYSBgd2luZG93Lm9uZXJyb3JgLiBEZWZhdWx0OiB0cnVlLiAqL1xuICBlcnJvcnM/OiBib29sZWFuO1xuICAvKiogQ2FwdHVyZSB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25zLiBEZWZhdWx0OiB0cnVlLiAqL1xuICByZWplY3Rpb25zPzogYm9vbGVhbjtcbiAgLyoqIEZvcndhcmQgYGdvYXRlY2g6YXV0aC1ldmVudGAgQ3VzdG9tRXZlbnRzIHZlcmJhdGltIGFzIHRyYWNrZWQgZXZlbnRzLiBEZWZhdWx0OiB0cnVlLiAqL1xuICBhdXRoRXZlbnRzPzogYm9vbGVhbjtcbiAgLyoqIE1heCBzdGFjayBmcmFtZXMgbGVuZ3RoIGluIGNoYXJhY3RlcnMuIERlZmF1bHQ6IDQwOTYuICovXG4gIHN0YWNrTGltaXQ/OiBudW1iZXI7XG4gIC8qKiBEZS1kdXAgd2luZG93IGluIG1zIOKAlCBpZGVudGljYWwgZXJyb3JzIHdpdGhpbiB0aGlzIHdpbmRvdyBhcmUgZHJvcHBlZC4gRGVmYXVsdDogMTAwMC4gKi9cbiAgZGVkdXBlV2luZG93TXM/OiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRTOiBSZXF1aXJlZDxFcnJvckNhcHR1cmVDb25maWc+ID0ge1xuICBlcnJvcnM6IHRydWUsXG4gIHJlamVjdGlvbnM6IHRydWUsXG4gIGF1dGhFdmVudHM6IHRydWUsXG4gIHN0YWNrTGltaXQ6IDQwOTYsXG4gIGRlZHVwZVdpbmRvd01zOiAxMDAwLFxufTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJFcnJvckNhcHR1cmUge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNrOiBUcmFja2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNmZzogUmVxdWlyZWQ8RXJyb3JDYXB0dXJlQ29uZmlnPjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSBsYXN0U2lnbmF0dXJlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U2lnbmF0dXJlQXQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHRyYWNrOiBUcmFja2VyLCBsb2c6IExvZ2dlciwgY29uZmlnPzogRXJyb3JDYXB0dXJlQ29uZmlnKSB7XG4gICAgdGhpcy50cmFjayA9IHRyYWNrO1xuICAgIHRoaXMubG9nID0gbG9nO1xuICAgIHRoaXMuY2ZnID0geyAuLi5ERUZBVUxUUywgLi4uKGNvbmZpZyA/PyB7fSkgfTtcbiAgfVxuXG4gIGluc3RhbGwoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICBjb25zdCB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG4gICAgY29uc3QgYnJvd3NlciA9IGRldGVjdEJyb3dzZXJUYWcodXNlckFnZW50KTtcblxuICAgIGlmICh0aGlzLmNmZy5lcnJvcnMpIHtcbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXZlbnQ6IEVycm9yRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPVxuICAgICAgICAgIGV2ZW50LmVycm9yICYmIGV2ZW50LmVycm9yLnN0YWNrXG4gICAgICAgICAgICA/IFN0cmluZyhldmVudC5lcnJvci5zdGFjaykuc2xpY2UoMCwgdGhpcy5jZmcuc3RhY2tMaW1pdClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYGVycjoke2V2ZW50Lm1lc3NhZ2V9OiR7ZXZlbnQuZmlsZW5hbWV9OiR7ZXZlbnQubGluZW5vfWA7XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzKHNpZ25hdHVyZSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5zYWZlVHJhY2soXCIkZXJyb3JcIiwge1xuICAgICAgICAgIG1lc3NhZ2U6IGV2ZW50Lm1lc3NhZ2UsXG4gICAgICAgICAgc291cmNlOiBldmVudC5maWxlbmFtZSA/PyBudWxsLFxuICAgICAgICAgIGxpbmU6IGV2ZW50LmxpbmVubyA/PyBudWxsLFxuICAgICAgICAgIGNvbDogZXZlbnQuY29sbm8gPz8gbnVsbCxcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgICB0eXBlOiBcInVuY2F1Z2h0X2Vycm9yXCIsXG4gICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICB1c2VyX2FnZW50OiB1c2VyQWdlbnQsXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICB0aGlzLmhhbmRsZXJzLnB1c2goKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2ZnLnJlamVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9uUmVqZWN0aW9uID0gKGV2ZW50OiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZXZlbnQucmVhc29uO1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICByZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgPyByZWFzb24ubWVzc2FnZVxuICAgICAgICAgICAgOiB0eXBlb2YgcmVhc29uID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gcmVhc29uXG4gICAgICAgICAgICAgIDogc2FmZVN0cmluZ2lmeShyZWFzb24pO1xuICAgICAgICBjb25zdCBzdGFjayA9XG4gICAgICAgICAgcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgJiYgcmVhc29uLnN0YWNrXG4gICAgICAgICAgICA/IFN0cmluZyhyZWFzb24uc3RhY2spLnNsaWNlKDAsIHRoaXMuY2ZnLnN0YWNrTGltaXQpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGByZWo6JHttZXNzYWdlfWA7XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzKHNpZ25hdHVyZSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5zYWZlVHJhY2soXCIkZXJyb3JcIiwge1xuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgdHlwZTogXCJ1bmhhbmRsZWRfcmVqZWN0aW9uXCIsXG4gICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICB1c2VyX2FnZW50OiB1c2VyQWdlbnQsXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidW5oYW5kbGVkcmVqZWN0aW9uXCIsIG9uUmVqZWN0aW9uKTtcbiAgICAgIHRoaXMuaGFuZGxlcnMucHVzaCgoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCBvblJlamVjdGlvbikpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNmZy5hdXRoRXZlbnRzKSB7XG4gICAgICBjb25zdCBvbkF1dGhFdmVudCA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gKFxuICAgICAgICAgIGV2ZW50IGFzIEN1c3RvbUV2ZW50PHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICB9PlxuICAgICAgICApLmRldGFpbDtcbiAgICAgICAgaWYgKCFkZXRhaWw/Lm5hbWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zYWZlVHJhY2soZGV0YWlsLm5hbWUsIHtcbiAgICAgICAgICAuLi4oZGV0YWlsLnByb3BlcnRpZXMgPz8ge30pLFxuICAgICAgICAgIGJyb3dzZXIsXG4gICAgICAgICAgdXNlcl9hZ2VudDogdXNlckFnZW50LFxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImdvYXRlY2g6YXV0aC1ldmVudFwiLCBvbkF1dGhFdmVudCBhcyBFdmVudExpc3RlbmVyKTtcbiAgICAgIHRoaXMuaGFuZGxlcnMucHVzaCgoKSA9PlxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImdvYXRlY2g6YXV0aC1ldmVudFwiLCBvbkF1dGhFdmVudCBhcyBFdmVudExpc3RlbmVyKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdW5pbnN0YWxsKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcmVtb3ZlIG9mIHRoaXMuaGFuZGxlcnMpIHJlbW92ZSgpO1xuICAgIHRoaXMuaGFuZGxlcnMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgc3VwcHJlc3Moc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLmxhc3RTaWduYXR1cmUgPT09IHNpZ25hdHVyZSAmJiBub3cgLSB0aGlzLmxhc3RTaWduYXR1cmVBdCA8IHRoaXMuY2ZnLmRlZHVwZVdpbmRvd01zKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5sYXN0U2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgIHRoaXMubGFzdFNpZ25hdHVyZUF0ID0gbm93O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc2FmZVRyYWNrKG5hbWU6IHN0cmluZywgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy50cmFjayhuYW1lLCBwcm9wZXJ0aWVzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJlcnJvciBjYXB0dXJlIHRyYWNrKCkgdGhyZXdcIiwgZXJyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0ZWN0QnJvd3NlclRhZyh1YTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghdWEpIHJldHVybiBcInVua25vd25cIjtcbiAgY29uc3QgaXNDaHJvbWUgPSAvQ2hyb21lXFwvXFxkLy50ZXN0KHVhKSAmJiAhL0VkZ1xcLy8udGVzdCh1YSk7XG4gIGNvbnN0IGlzRmlyZWZveCA9IC9GaXJlZm94XFwvXFxkLy50ZXN0KHVhKTtcbiAgY29uc3QgaXNTYWZhcmkgPSAvU2FmYXJpXFwvLy50ZXN0KHVhKSAmJiAhaXNDaHJvbWUgJiYgIS9DcmlPU3xGeGlPU3xPUFJcXC8vLnRlc3QodWEpO1xuICByZXR1cm4gaXNDaHJvbWUgPyBcImNocm9tZVwiIDogaXNGaXJlZm94ID8gXCJmaXJlZm94XCIgOiBpc1NhZmFyaSA/IFwic2FmYXJpXCIgOiBcIm90aGVyXCI7XG59XG5cbmZ1bmN0aW9uIHNhZmVTdHJpbmdpZnkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgPz8gU3RyaW5nKHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cbiIsIi8qKlxuICogSFRUUCBlcnJvciBhdXRvLWNhcHR1cmUg4oCUIHdyYXBzIGB3aW5kb3cuZmV0Y2hgIGFuZCBlbWl0cyBhIHN0cnVjdHVyZWRcbiAqIGAkaHR0cF9lcnJvcmAgZXZlbnQgZm9yIGV2ZXJ5IDR4eC81eHggcmVzcG9uc2Ugb3IgbmV0d29yayBmYWlsdXJlLlxuICpcbiAqIFdoeTogd2l0aG91dCB0aGlzLCBjdXN0b21lcnMgaGF2ZSB0byBoYW5kLWluc3RydW1lbnQgZXZlcnkgZW5kcG9pbnQgdGhhdFxuICogbWlnaHQgcmV0dXJuIGFuIGVycm9yICh0aGUgMDQtMjIgc2lnbi1vdXQgZGVidWcgc2Vzc2lvbiBpcyB0aGUgY2Fub25pY2FsXG4gKiBleGFtcGxlIOKAlCB3ZSBzcGVudCBob3VycyB0aGVvcml6aW5nIGFib3V0IGNvb2tpZSBiZWhhdmlvciBpbnN0ZWFkIG9mXG4gKiByZWFkaW5nIGBjb29raWVfa2V5cz1bXWAgb2ZmIGEgc3RydWN0dXJlZCBldmVudCkuIFdpdGggaXQsIGV2ZXJ5IGZhaWxpbmdcbiAqIHJlcXVlc3QgYmVjb21lcyBhIHF1ZXJ5YWJsZSBldmVudCBvbiB0aGUgR29hVGVjaCBkYXNoYm9hcmQgd2l0aCBlbm91Z2hcbiAqIGNvbnRleHQgdG8gZGlhZ25vc2UgYXV0aCwgQ09SUywgQ0ROLCBhbmQgcHJveHkgYnVncyB3aXRob3V0IHRvdWNoaW5nXG4gKiBjdXN0b21lciBjb2RlLlxuICpcbiAqIERlc2lnbjpcbiAqIC0gTW9ua2V5LXBhdGNoZXMgYHdpbmRvdy5mZXRjaGAgd2l0aCBhbiBpZGVtcG90ZW50IGluc3RhbGwg4oCUIGEgc2Vjb25kXG4gKiAgIGluc3RhbGwoKSBjYWxsIGlzIGEgbm8tb3AuXG4gKiAtIENhcHR1cmVzIENPUlMtZXhwb3NlZCByZXNwb25zZSBoZWFkZXJzIG9ubHkgKFNldC1Db29raWUgaXMgaGlkZGVuIGZyb21cbiAqICAgSmF2YVNjcmlwdCBwZXIgc3BlYywgc28gd2UgY2FwdHVyZSBjb29raWUgKm5hbWVzKiB2aWEgYGRvY3VtZW50LmNvb2tpZWBcbiAqICAgYXMgYSBwcm94eSBmb3IgXCJkaWQgdGhlIHNlcnZlcidzIFNldC1Db29raWUgbGFuZFwiKS5cbiAqIC0gRGVkdXBlIHdpbmRvdyBwcmV2ZW50cyBlcnJvciBsb29wcyAoaWRlbnRpY2FsICh1cmwsIHN0YXR1cykgd2l0aGluXG4gKiAgIGBkZWR1cGVXaW5kb3dNc2AgaXMgZHJvcHBlZCkuXG4gKiAtIE5FVkVSIGNhcHR1cmVzIHJlcXVlc3Qgb3IgcmVzcG9uc2UgYm9kaWVzIOKAlCB0aG9zZSBtYXkgY2Fycnkgc2VjcmV0cy5cbiAqICAgSWYgYSBjdXN0b21lciBuZWVkcyBib2RpZXMgdGhleSBjYW4gZXh0ZW5kIHZpYSB0aGUgYG9uQ2FwdHVyZWAgaG9vay5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG50eXBlIFRyYWNrZXIgPSAoZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwRXJyb3JDYXB0dXJlQ29uZmlnIHtcbiAgLyoqIE1hc3RlciBzd2l0Y2guIERlZmF1bHQ6IHRydWUuICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogU3RhdHVzIHByZWRpY2F0ZSDigJQgcmV0dXJuIHRydWUgdG8gY2FwdHVyZS4gRGVmYXVsdDogYHMgPj0gNDAwYC5cbiAgICogTmV0d29yayBmYWlsdXJlcyAoZmV0Y2ggcmVqZWN0aW9ucykgYXJlIEFMV0FZUyBjYXB0dXJlZCByZWdhcmRsZXNzLlxuICAgKi9cbiAgc2hvdWxkQ2FwdHVyZT86IChzdGF0dXM6IG51bWJlcikgPT4gYm9vbGVhbjtcbiAgLyoqXG4gICAqIFVSTCBwYXR0ZXJucyB0byBleGNsdWRlICh0ZXN0ZWQgd2l0aCBgLnRlc3QodXJsKWApLiBVc2VmdWwgdG8gc2tpcFxuICAgKiBhbmFseXRpY3MvbW9uaXRvcmluZyBlbmRwb2ludHMgdGhhdCB3b3VsZCBvdGhlcndpc2UgcmVjdXJzZS5cbiAgICogRGVmYXVsdDogZXhjbHVkZXMgYC92MS9pbmdlc3RgIGFuZCBgL3YxL2NvbmZpZ2Agb24gdGhlIFNESydzIG93biBBUEkgVVJMLlxuICAgKi9cbiAgZXhjbHVkZVVybFBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKlxuICAgKiBDT1JTLWV4cG9zZWQgcmVzcG9uc2UgaGVhZGVycyB0byBjYXB0dXJlIChsb3dlcmNhc2VkKS4gRGVmYXVsdDpcbiAgICogW1wieC1yZXF1ZXN0LWlkXCIsIFwidmFyeVwiLCBcImNvbnRlbnQtdHlwZVwiLCBcImFjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpblwiXS5cbiAgICovXG4gIGNhcHR1cmVSZXNwb25zZUhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgLyoqIERlZHVwZSB3aW5kb3cgaW4gbXMg4oCUIGlkZW50aWNhbCAodXJsLCBzdGF0dXMpIGluc2lkZSBpcyBkcm9wcGVkLiBEZWZhdWx0OiAxMDAwLiAqL1xuICBkZWR1cGVXaW5kb3dNcz86IG51bWJlcjtcbiAgLyoqIENhbGxlZCBBRlRFUiB0aGUgZXZlbnQgaXMgdHJhY2tlZCDigJQgaG9vayBmb3IgY3VzdG9tIGVucmljaG1lbnQgb3Igc2lua3MuICovXG4gIG9uQ2FwdHVyZT86IChkZXRhaWw6IEh0dHBFcnJvckV2ZW50RGV0YWlsKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFcnJvckV2ZW50RGV0YWlsIHtcbiAgdXJsOiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBzdGF0dXM6IG51bWJlcjsgLy8gMCBmb3IgbmV0d29yayBmYWlsdXJlXG4gIGxhdGVuY3lfbXM6IG51bWJlcjtcbiAgcmVxdWVzdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzcG9uc2VfaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIE5vbi1IdHRwT25seSBjb29raWUgTkFNRVMgcHJlc2VudCBvbiBkb2N1bWVudC5jb29raWUgYXQgdGhlIHRpbWUgb2ZcbiAgICogdGhlIGVycm9yLiBWYWx1ZXMgYXJlIG5ldmVyIGNhcHR1cmVkLiBUaGlzIGlzIHRoZSBjbGllbnQtc2lkZSBwcm94eVxuICAgKiBmb3IgXCJkaWQgdGhlIHNlcnZlcidzIFNldC1Db29raWUgZ2V0IGFjY2VwdGVkXCIg4oCUIGlmIGFuIGF1dGggZW5kcG9pbnRcbiAgICogNDAxcyBhbmQgdGhlcmUgYXJlIHplcm8gY29va2llcyBvbiB0aGUgb3JpZ2luIHRoYXQgKnNob3VsZCogaGF2ZSBzZXRcbiAgICogb25lLCB0aGUgY29va2llIHdhcyByZWplY3RlZCBieSB0aGUgYnJvd3Nlci5cbiAgICovXG4gIGNvb2tpZV9uYW1lczogc3RyaW5nW107XG4gIC8qKiBcIm5ldHdvcmtfZmFpbHVyZVwiIHwgXCJodHRwX2Vycm9yXCIuICovXG4gIGtpbmQ6IFwibmV0d29ya19mYWlsdXJlXCIgfCBcImh0dHBfZXJyb3JcIjtcbiAgLyoqIFByZXNlbnQgb24ga2luZD1uZXR3b3JrX2ZhaWx1cmUuICovXG4gIGVycm9yX25hbWU/OiBzdHJpbmc7XG4gIC8qKiBQcmVzZW50IG9uIGtpbmQ9bmV0d29ya19mYWlsdXJlLiAqL1xuICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAvKiogVHJ1ZSBpZiB0aGUgZmV0Y2ggd2FzIGFib3J0ZWQgKGUuZy4sIHRpbWVvdXQpLiAqL1xuICBhYm9ydGVkPzogYm9vbGVhbjtcbn1cblxuY29uc3QgREVGQVVMVF9IRUFERVJTID0gW1wieC1yZXF1ZXN0LWlkXCIsIFwidmFyeVwiLCBcImNvbnRlbnQtdHlwZVwiLCBcImFjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpblwiXTtcblxuZXhwb3J0IGNsYXNzIEh0dHBFcnJvckNhcHR1cmUge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNrOiBUcmFja2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNmZzogUmVxdWlyZWQ8XG4gICAgT21pdDxIdHRwRXJyb3JDYXB0dXJlQ29uZmlnLCBcImV4Y2x1ZGVVcmxQYXR0ZXJuc1wiIHwgXCJvbkNhcHR1cmVcIj5cbiAgPiAmIHtcbiAgICBleGNsdWRlVXJsUGF0dGVybnM6IFJlZ0V4cFtdO1xuICAgIG9uQ2FwdHVyZTogKChkZXRhaWw6IEh0dHBFcnJvckV2ZW50RGV0YWlsKSA9PiB2b2lkKSB8IG51bGw7XG4gIH07XG4gIHByaXZhdGUgb3JpZ2luYWxGZXRjaDogdHlwZW9mIGZldGNoIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaW5zdGFsbGVkID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdFNpZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFNpZ0F0ID0gMDtcblxuICBjb25zdHJ1Y3Rvcih0cmFjazogVHJhY2tlciwgbG9nOiBMb2dnZXIsIGNvbmZpZz86IEh0dHBFcnJvckNhcHR1cmVDb25maWcpIHtcbiAgICB0aGlzLnRyYWNrID0gdHJhY2s7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5jZmcgPSB7XG4gICAgICBlbmFibGVkOiBjb25maWc/LmVuYWJsZWQgPz8gdHJ1ZSxcbiAgICAgIHNob3VsZENhcHR1cmU6IGNvbmZpZz8uc2hvdWxkQ2FwdHVyZSA/PyAoKHMpID0+IHMgPj0gNDAwKSxcbiAgICAgIGV4Y2x1ZGVVcmxQYXR0ZXJuczogY29uZmlnPy5leGNsdWRlVXJsUGF0dGVybnMgPz8gWy9cXC92MVxcL2luZ2VzdFxcYi8sIC9cXC92MVxcL2NvbmZpZ1xcYi9dLFxuICAgICAgY2FwdHVyZVJlc3BvbnNlSGVhZGVyczogY29uZmlnPy5jYXB0dXJlUmVzcG9uc2VIZWFkZXJzID8/IERFRkFVTFRfSEVBREVSUyxcbiAgICAgIGRlZHVwZVdpbmRvd01zOiBjb25maWc/LmRlZHVwZVdpbmRvd01zID8/IDEwMDAsXG4gICAgICBvbkNhcHR1cmU6IGNvbmZpZz8ub25DYXB0dXJlID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGluc3RhbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFsbGVkIHx8ICF0aGlzLmNmZy5lbmFibGVkKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mIHdpbmRvdy5mZXRjaCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG5cbiAgICAvLyBTdG9yZSB0aGUgdW5ib3VuZCBvcmlnaW5hbCBzbyB1bmluc3RhbGwgY2FuIHJlc3RvcmUgYnkgcmVmZXJlbmNlIOKAlFxuICAgIC8vIGJ1dCBjYWxsIGl0IHdpdGggYC5jYWxsKHdpbmRvdywgLi4uKWAgc28gbmF0aXZlIGJyb3dzZXIgZmV0Y2hcbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgKHdoaWNoIHRocm93IFwiSWxsZWdhbCBpbnZvY2F0aW9uXCIgLyBcIkNhbiBvbmx5IGNhbGxcbiAgICAvLyBXaW5kb3cuZmV0Y2ggb24gaW5zdGFuY2VzIG9mIFdpbmRvd1wiIHdoZW4gaW52b2tlZCBiYXJlKSB3b3JrLlxuICAgIC8vIGpzZG9tJ3MgcG9seWZpbGwgaXMgbG9vc2UgYWJvdXQgYHRoaXNgLCBzbyB0aGUgdW5pdCB0ZXN0cyBkb24ndFxuICAgIC8vIGNhdGNoIHRoaXMg4oCUIG9ubHkgcmVhbCBTYWZhcmkgLyBDaHJvbWUgZG8uXG4gICAgdGhpcy5vcmlnaW5hbEZldGNoID0gd2luZG93LmZldGNoO1xuXG4gICAgLy8gQXJyb3cgcHJlc2VydmVzIGB0aGlzYCB3aXRob3V0IGFsaWFzaW5nOyB0aGUgbGludCBydWxlIGNhdGNoZXMgZXhwbGljaXRcbiAgICAvLyBgY29uc3Qgc2VsZiA9IHRoaXNgIHBhdHRlcm5zIHRoYXQgYXJlIGVycm9yLXByb25lIGluIGNsYXNzIG1ldGhvZHMuXG4gICAgd2luZG93LmZldGNoID0gYXN5bmMgKGlucHV0OiBSZXF1ZXN0SW5mbyB8IFVSTCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3Qgc3RhcnRlZCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB1cmwgPSBleHRyYWN0VXJsKGlucHV0KTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IChcbiAgICAgICAgaW5pdD8ubWV0aG9kID8/IChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dC5tZXRob2QgOiBcIkdFVFwiKVxuICAgICAgKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9yaWdpbmFsRmV0Y2ghLmNhbGwod2luZG93LCBpbnB1dCwgaW5pdCk7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFNraXAodXJsKSkgcmV0dXJuIHJlcztcbiAgICAgICAgaWYgKCF0aGlzLmNmZy5zaG91bGRDYXB0dXJlKHJlcy5zdGF0dXMpKSByZXR1cm4gcmVzO1xuICAgICAgICB0aGlzLmVtaXQoe1xuICAgICAgICAgIGtpbmQ6IFwiaHR0cF9lcnJvclwiLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICAgIGxhdGVuY3lfbXM6IERhdGUubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAgIHJlcXVlc3RfaWQ6IHJlcy5oZWFkZXJzLmdldChcIngtcmVxdWVzdC1pZFwiKSxcbiAgICAgICAgICByZXNwb25zZV9oZWFkZXJzOiB0aGlzLnBsdWNrSGVhZGVycyhyZXMuaGVhZGVycyksXG4gICAgICAgICAgY29va2llX25hbWVzOiB0aGlzLnJlYWRDb29raWVOYW1lcygpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkU2tpcCh1cmwpKSB7XG4gICAgICAgICAgY29uc3QgYWJvcnRlZCA9IGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIjtcbiAgICAgICAgICBjb25zdCBlcnJOYW1lID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6IFwiVW5rbm93bkVycm9yXCI7XG4gICAgICAgICAgY29uc3QgZXJyTWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICB0aGlzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJuZXR3b3JrX2ZhaWx1cmVcIixcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICAgIGxhdGVuY3lfbXM6IERhdGUubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAgICAgcmVxdWVzdF9pZDogbnVsbCxcbiAgICAgICAgICAgIHJlc3BvbnNlX2hlYWRlcnM6IHt9LFxuICAgICAgICAgICAgY29va2llX25hbWVzOiB0aGlzLnJlYWRDb29raWVOYW1lcygpLFxuICAgICAgICAgICAgZXJyb3JfbmFtZTogZXJyTmFtZSxcbiAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGVyck1lc3NhZ2UsXG4gICAgICAgICAgICBhYm9ydGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5pbnN0YWxsZWQgPSB0cnVlO1xuICB9XG5cbiAgdW5pbnN0YWxsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnN0YWxsZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0aGlzLm9yaWdpbmFsRmV0Y2gpIHtcbiAgICAgIHdpbmRvdy5mZXRjaCA9IHRoaXMub3JpZ2luYWxGZXRjaDtcbiAgICB9XG4gICAgdGhpcy5vcmlnaW5hbEZldGNoID0gbnVsbDtcbiAgICB0aGlzLmluc3RhbGxlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRTa2lwKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2ZnLmV4Y2x1ZGVVcmxQYXR0ZXJucy5zb21lKChwKSA9PiBwLnRlc3QodXJsKSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXQoZGV0YWlsOiBIdHRwRXJyb3JFdmVudERldGFpbCk6IHZvaWQge1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke2RldGFpbC5tZXRob2R9OiR7ZGV0YWlsLnVybH06JHtkZXRhaWwuc3RhdHVzfWA7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5sYXN0U2lnID09PSBzaWduYXR1cmUgJiYgbm93IC0gdGhpcy5sYXN0U2lnQXQgPCB0aGlzLmNmZy5kZWR1cGVXaW5kb3dNcykgcmV0dXJuO1xuICAgIHRoaXMubGFzdFNpZyA9IHNpZ25hdHVyZTtcbiAgICB0aGlzLmxhc3RTaWdBdCA9IG5vdztcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnRyYWNrKFwiJGh0dHBfZXJyb3JcIiwge1xuICAgICAgICB1cmw6IGRldGFpbC51cmwsXG4gICAgICAgIG1ldGhvZDogZGV0YWlsLm1ldGhvZCxcbiAgICAgICAgc3RhdHVzOiBkZXRhaWwuc3RhdHVzLFxuICAgICAgICBsYXRlbmN5X21zOiBkZXRhaWwubGF0ZW5jeV9tcyxcbiAgICAgICAgcmVxdWVzdF9pZDogZGV0YWlsLnJlcXVlc3RfaWQsXG4gICAgICAgIHJlc3BvbnNlX2hlYWRlcnM6IGRldGFpbC5yZXNwb25zZV9oZWFkZXJzLFxuICAgICAgICBjb29raWVfbmFtZXM6IGRldGFpbC5jb29raWVfbmFtZXMsXG4gICAgICAgIGtpbmQ6IGRldGFpbC5raW5kLFxuICAgICAgICAuLi4oZGV0YWlsLmVycm9yX25hbWUgIT09IHVuZGVmaW5lZCA/IHsgZXJyb3JfbmFtZTogZGV0YWlsLmVycm9yX25hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKGRldGFpbC5lcnJvcl9tZXNzYWdlICE9PSB1bmRlZmluZWQgPyB7IGVycm9yX21lc3NhZ2U6IGRldGFpbC5lcnJvcl9tZXNzYWdlIH0gOiB7fSksXG4gICAgICAgIC4uLihkZXRhaWwuYWJvcnRlZCAhPT0gdW5kZWZpbmVkID8geyBhYm9ydGVkOiBkZXRhaWwuYWJvcnRlZCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwiaHR0cC1lcnJvci1jYXB0dXJlIHRyYWNrKCkgdGhyZXdcIiwgZXJyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jZmcub25DYXB0dXJlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNmZy5vbkNhcHR1cmUoZGV0YWlsKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKFwiaHR0cC1lcnJvci1jYXB0dXJlIG9uQ2FwdHVyZSgpIHRocmV3XCIsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwbHVja0hlYWRlcnMoaGVhZGVyczogSGVhZGVycyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLmNmZy5jYXB0dXJlUmVzcG9uc2VIZWFkZXJzKSB7XG4gICAgICBjb25zdCB2ID0gaGVhZGVycy5nZXQobmFtZSk7XG4gICAgICBpZiAodiAhPT0gbnVsbCkgb3V0W25hbWVdID0gdjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZENvb2tpZU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiBkb2N1bWVudC5jb29raWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBbXTtcbiAgICBpZiAoZG9jdW1lbnQuY29va2llLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWVcbiAgICAgIC5zcGxpdChcIjtcIilcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXIudHJpbSgpLnNwbGl0KFwiPVwiKVswXSA/PyBcIlwiKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gbmFtZS5sZW5ndGggPiAwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0VXJsKGlucHV0OiBSZXF1ZXN0SW5mbyB8IFVSTCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHJldHVybiBpbnB1dDtcbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgVVJMKSByZXR1cm4gaW5wdXQudG9TdHJpbmcoKTtcbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkgcmV0dXJuIGlucHV0LnVybDtcbiAgcmV0dXJuIFN0cmluZyhpbnB1dCk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG4vKipcbiAqIENsaWNrLWZydXN0cmF0aW9uIGRldGVjdG9yIOKAlCBlbWl0cyB0d28gZGlhZ25vc3RpYyBldmVudHM6XG4gKlxuICogICAtIGAkcmFnZV9jbGlja2A6IOKJpTMgY2xpY2tzIHdpdGhpbiBgcmFnZVdpbmRvd01zYCAoMXMgZGVmYXVsdCkgYW5kXG4gKiAgICAgYHJhZ2VSYWRpdXNQeGAgKDUwcHggZGVmYXVsdCkgb2YgZWFjaCBvdGhlci4gSW5kaWNhdGVzIHRoZSB1c2VyXG4gKiAgICAgaGFtbWVyZWQgdGhlIHNhbWUgVUkgZWxlbWVudCBleHBlY3RpbmcgYSByZXNwb25zZS5cbiAqICAgLSBgJGRlYWRfY2xpY2tgOiBjbGljayBvbiBhbiBlbGVtZW50IHRoYXQgaGFzIG5vIGludGVyYWN0aXZlXG4gKiAgICAgYW5jZXN0b3IgKGJ1dHRvbiAvIGEgLyBpbnB1dCAvIHNlbGVjdCAvIHRleHRhcmVhIC8gW3JvbGU9YnV0dG9uXSAvXG4gKiAgICAgW3RhYmluZGV4XSAvIFtjb250ZW50ZWRpdGFibGVdKS4gSW5kaWNhdGVzIHRoZSB1c2VyIGV4cGVjdGVkIHRoZVxuICogICAgIHRhcmdldCB0byBiZSBjbGlja2FibGUuXG4gKlxuICogQm90aCBzaWduYWxzIGFyZSBiZXN0LWVmZm9ydCBoZXVyaXN0aWNzIOKAlCB0aGUgZ29hbCBpcyB0byBzdXJmYWNlXG4gKiBmcnVzdHJhdGVkIFVYIHBhdHRlcm5zIGF0IHRoZSBkYXNoYm9hcmQgbGF5ZXIsIG5vdCB0byBiZSAxMDAlXG4gKiBhY2N1cmF0ZS4gUGVyLXNlY29uZCBlbWl0IGNhcCAoYG1heEVtaXRzUGVyU2VjYCkgcHJldmVudHMgYW5cbiAqIGFuZ3J5LWNsaWNrIHN0b3JtIGZyb20gZHJvd25pbmcgdGhlIHF1ZXVlLlxuICpcbiAqIFByaXZhY3k6IHdlIGNhcHR1cmUgY29vcmRpbmF0ZXMgKyBhIHN0YWJsZSB0YXJnZXQgc2VsZWN0b3JcbiAqIChgdGFnTmFtZSArICNpZCArIC5jbGFzcy5saXN0YCkg4oCUIG5ldmVyIGlubmVyIHRleHQsIGF0dHJpYnV0ZVxuICogdmFsdWVzLCBvciBmb3JtIGRhdGEuXG4gKi9cbnR5cGUgVHJhY2tlciA9IChldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsaWNrRnJ1c3RyYXRpb25Db25maWcge1xuICAvKiogRGV0ZWN0IHJhZ2UgY2xpY2tzLiBEZWZhdWx0OiB0cnVlLiAqL1xuICByYWdlPzogYm9vbGVhbjtcbiAgLyoqIERldGVjdCBkZWFkIGNsaWNrcy4gRGVmYXVsdDogdHJ1ZS4gKi9cbiAgZGVhZD86IGJvb2xlYW47XG4gIC8qKiBOdW1iZXIgb2YgY2xpY2tzIHdpdGhpbiB3aW5kb3crcmFkaXVzIHRoYXQgY29uc3RpdHV0ZSByYWdlLiBEZWZhdWx0OiAzLiAqL1xuICByYWdlVGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogVGltZSB3aW5kb3cgZm9yIHJhZ2UgY2x1c3RlcmluZy4gRGVmYXVsdDogMTAwMG1zLiAqL1xuICByYWdlV2luZG93TXM/OiBudW1iZXI7XG4gIC8qKiBQaXhlbCByYWRpdXMgZm9yIHJhZ2UgY2x1c3RlcmluZy4gRGVmYXVsdDogNTAuICovXG4gIHJhZ2VSYWRpdXNQeD86IG51bWJlcjtcbiAgLyoqIENhcCB0aGUgZW1pc3Npb24gcmF0ZSAoY29tYmluZWQgcmFnZStkZWFkKS4gRGVmYXVsdDogNS9zZWMuICovXG4gIG1heEVtaXRzUGVyU2VjPzogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUUzogUmVxdWlyZWQ8Q2xpY2tGcnVzdHJhdGlvbkNvbmZpZz4gPSB7XG4gIHJhZ2U6IHRydWUsXG4gIGRlYWQ6IHRydWUsXG4gIHJhZ2VUaHJlc2hvbGQ6IDMsXG4gIHJhZ2VXaW5kb3dNczogMTAwMCxcbiAgcmFnZVJhZGl1c1B4OiA1MCxcbiAgbWF4RW1pdHNQZXJTZWM6IDUsXG59O1xuXG5jb25zdCBJTlRFUkFDVElWRV9UQUdTID0gbmV3IFNldChbXG4gIFwiQVwiLFxuICBcIkJVVFRPTlwiLFxuICBcIklOUFVUXCIsXG4gIFwiU0VMRUNUXCIsXG4gIFwiVEVYVEFSRUFcIixcbiAgXCJMQUJFTFwiLFxuICBcIlNVTU1BUllcIixcbiAgXCJPUFRJT05cIixcbiAgXCJERVRBSUxTXCIsXG5dKTtcblxuaW50ZXJmYWNlIENsaWNrUmVjb3JkIHtcbiAgdDogbnVtYmVyO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrRnJ1c3RyYXRpb25DYXB0dXJlIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFjazogVHJhY2tlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjZmc6IFJlcXVpcmVkPENsaWNrRnJ1c3RyYXRpb25Db25maWc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIHJlY2VudDogQ2xpY2tSZWNvcmRbXSA9IFtdO1xuICBwcml2YXRlIHJhZ2VDb29sZG93blVudGlsID0gMDtcbiAgcHJpdmF0ZSBlbWl0c1RoaXNTZWNvbmQgPSAwO1xuICBwcml2YXRlIGVtaXRzU2Vjb25kU3RhcnRlZEF0ID0gMDtcblxuICBjb25zdHJ1Y3Rvcih0cmFjazogVHJhY2tlciwgbG9nOiBMb2dnZXIsIGNvbmZpZz86IENsaWNrRnJ1c3RyYXRpb25Db25maWcpIHtcbiAgICB0aGlzLnRyYWNrID0gdHJhY2s7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5jZmcgPSB7IC4uLkRFRkFVTFRTLCAuLi4oY29uZmlnID8/IHt9KSB9O1xuICB9XG5cbiAgaW5zdGFsbCgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXG4gICAgY29uc3Qgb25DbGljayA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIEJvb2trZWVwaW5nIGZvciByYWdlIGRldGVjdGlvbiDigJQga2VlcCBvbmx5IGNsaWNrcyBpbnNpZGUgdGhlIHdpbmRvdy5cbiAgICAgIHRoaXMucmVjZW50LnB1c2goeyB0OiBub3csIHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSk7XG4gICAgICBjb25zdCBjdXRvZmYgPSBub3cgLSB0aGlzLmNmZy5yYWdlV2luZG93TXM7XG4gICAgICB0aGlzLnJlY2VudCA9IHRoaXMucmVjZW50LmZpbHRlcigoYykgPT4gYy50ID49IGN1dG9mZik7XG5cbiAgICAgIGlmICh0aGlzLmNmZy5yYWdlKSB0aGlzLm1heWJlRW1pdFJhZ2UodGFyZ2V0LCBub3cpO1xuICAgICAgaWYgKHRoaXMuY2ZnLmRlYWQpIHRoaXMubWF5YmVFbWl0RGVhZChldmVudCwgdGFyZ2V0LCBub3cpO1xuICAgIH07XG5cbiAgICAvLyBCdWJibGUgcGhhc2UgKGNhcHR1cmU6IGZhbHNlKSBzbyBhcHAgaGFuZGxlcnMgaGF2ZSBhbHJlYWR5IHJ1biBieVxuICAgIC8vIHRoZSB0aW1lIHdlIG9ic2VydmUgdGhlIGV2ZW50LiBUaGF0IGxldHMgdXMgcmVhZCBgZGVmYXVsdFByZXZlbnRlZGBcbiAgICAvLyBhbmQgc2tpcCAkZGVhZF9jbGljayBmb3IgY2xpY2tzIHRoZSBwYWdlIGFjdHVhbGx5IGhhbmRsZWQuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG9uQ2xpY2ssIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG9uQ2xpY2spKTtcblxuICAgIHRoaXMubG9nLmRlYnVnKFwiQ2xpY2stZnJ1c3RyYXRpb24gbGlzdGVuZXJzIHJlZ2lzdGVyZWQuXCIpO1xuICB9XG5cbiAgdW5pbnN0YWxsKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcmVtb3ZlIG9mIHRoaXMuaGFuZGxlcnMpIHJlbW92ZSgpO1xuICAgIHRoaXMuaGFuZGxlcnMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlY2VudCA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXliZUVtaXRSYWdlKHRhcmdldDogRWxlbWVudCwgbm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAobm93IDwgdGhpcy5yYWdlQ29vbGRvd25VbnRpbCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlY2VudC5sZW5ndGggPCB0aGlzLmNmZy5yYWdlVGhyZXNob2xkKSByZXR1cm47XG5cbiAgICAvLyBBbmNob3Igb24gdGhlIG1vc3QgcmVjZW50IGNsaWNrIGFuZCBjb3VudCBjbHVzdGVyIG1lbWJlcnMuXG4gICAgY29uc3QgYW5jaG9yID0gdGhpcy5yZWNlbnRbdGhpcy5yZWNlbnQubGVuZ3RoIC0gMV0hO1xuICAgIGxldCBjbHVzdGVyID0gMDtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5yZWNlbnQpIHtcbiAgICAgIGNvbnN0IGR4ID0gYy54IC0gYW5jaG9yLng7XG4gICAgICBjb25zdCBkeSA9IGMueSAtIGFuY2hvci55O1xuICAgICAgaWYgKGR4ICogZHggKyBkeSAqIGR5IDw9IHRoaXMuY2ZnLnJhZ2VSYWRpdXNQeCAqIHRoaXMuY2ZnLnJhZ2VSYWRpdXNQeCkgY2x1c3RlciArPSAxO1xuICAgIH1cbiAgICBpZiAoY2x1c3RlciA8IHRoaXMuY2ZnLnJhZ2VUaHJlc2hvbGQpIHJldHVybjtcbiAgICBpZiAoIXRoaXMudHJ5RW1pdChub3cpKSByZXR1cm47XG5cbiAgICAvLyBDb29sZG93biBzbyBhIDUtY2xpY2sgYnVyc3QgZG9lc24ndCBmaXJlIDMgdGltZXMuXG4gICAgdGhpcy5yYWdlQ29vbGRvd25VbnRpbCA9IG5vdyArIHRoaXMuY2ZnLnJhZ2VXaW5kb3dNcztcblxuICAgIHRoaXMuc2FmZVRyYWNrKFwiJHJhZ2VfY2xpY2tcIiwge1xuICAgICAgdGFyZ2V0OiB0YXJnZXRTZWxlY3Rvcih0YXJnZXQpLFxuICAgICAgY2x1c3Rlcl9zaXplOiBjbHVzdGVyLFxuICAgICAgeDogYW5jaG9yLngsXG4gICAgICB5OiBhbmNob3IueSxcbiAgICAgIHBhdGg6IHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiA/IGxvY2F0aW9uLnBhdGhuYW1lIDogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWF5YmVFbWl0RGVhZChldmVudDogTW91c2VFdmVudCwgdGFyZ2V0OiBFbGVtZW50LCBub3c6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFByZXZlbnQtZGVmYXVsdCBjb3VudHMgYXMgXCJ0aGUgcGFnZSBoYW5kbGVkIGl0XCIg4oCUIGRvbid0IGVtaXQuXG4gICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICBpZiAoaXNJbnRlcmFjdGl2ZSh0YXJnZXQpKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnRyeUVtaXQobm93KSkgcmV0dXJuO1xuXG4gICAgdGhpcy5zYWZlVHJhY2soXCIkZGVhZF9jbGlja1wiLCB7XG4gICAgICB0YXJnZXQ6IHRhcmdldFNlbGVjdG9yKHRhcmdldCksXG4gICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgeTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHBhdGg6IHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiA/IGxvY2F0aW9uLnBhdGhuYW1lIDogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdHJ5RW1pdChub3c6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChub3cgLSB0aGlzLmVtaXRzU2Vjb25kU3RhcnRlZEF0ID49IDEwMDApIHtcbiAgICAgIHRoaXMuZW1pdHNTZWNvbmRTdGFydGVkQXQgPSBub3c7XG4gICAgICB0aGlzLmVtaXRzVGhpc1NlY29uZCA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLmVtaXRzVGhpc1NlY29uZCA+PSB0aGlzLmNmZy5tYXhFbWl0c1BlclNlYykgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuZW1pdHNUaGlzU2Vjb25kICs9IDE7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNhZmVUcmFjayhuYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudHJhY2sobmFtZSwgcHJvcGVydGllcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwiY2xpY2stZnJ1c3RyYXRpb24gdHJhY2soKSB0aHJld1wiLCBlcnIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKGVsOiBFbGVtZW50KTogYm9vbGVhbiB7XG4gIGxldCBjdXI6IEVsZW1lbnQgfCBudWxsID0gZWw7XG4gIGxldCBkZXB0aCA9IDA7XG4gIHdoaWxlIChjdXIgJiYgZGVwdGggPCA4KSB7XG4gICAgaWYgKElOVEVSQUNUSVZFX1RBR1MuaGFzKGN1ci50YWdOYW1lKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgcm9sZSA9IGN1ci5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgIGlmIChyb2xlICYmIC9eKGJ1dHRvbnxsaW5rfHRhYnxzd2l0Y2h8Y2hlY2tib3h8cmFkaW98bWVudWl0ZW18b3B0aW9uKSQvLnRlc3Qocm9sZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY3VyLmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VyLmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1ci5oYXNBdHRyaWJ1dGUoXCJkYXRhLWNsaWNrYWJsZVwiKSkgcmV0dXJuIHRydWU7XG4gICAgY3VyID0gY3VyLnBhcmVudEVsZW1lbnQ7XG4gICAgZGVwdGggKz0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHRhcmdldFNlbGVjdG9yKGVsOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpZCA9IGVsLmlkID8gYCMke2VsLmlkfWAgOiBcIlwiO1xuICBjb25zdCBjbGFzc2VzID1cbiAgICBlbC5jbGFzc0xpc3QubGVuZ3RoID4gMCA/IGAuJHtBcnJheS5mcm9tKGVsLmNsYXNzTGlzdCkuc2xpY2UoMCwgMykuam9pbihcIi5cIil9YCA6IFwiXCI7XG4gIHJldHVybiBgJHt0YWd9JHtpZH0ke2NsYXNzZXN9YC5zbGljZSgwLCAxMjApO1xufVxuIiwiLyoqXG4gKiBBdWRpdCBFLTAxMCDigJQgb25lLXBhc3MgbWlncmF0aW9uIGZvciB0aGUgTGF1bmNoUGFkIOKGkiBHb2FUZWNoIHN0b3JhZ2VcbiAqIGtleSByZW5hbWUuIFJ1bnMgb25jZSBhdCBTREsgaW5pdC4gRm9yIGV2ZXJ5IGBndF8qYCBrZXkgdGhhdCdzIGVtcHR5XG4gKiBidXQgaGFzIGEgcG9wdWxhdGVkIGBscF8qYCBsZWdhY3kgc2libGluZywgY29weSB0aGUgdmFsdWUgYWNyb3NzIHNvXG4gKiBleGlzdGluZyB1c2VycyBkb24ndCBsb3NlIHRoZWlyIGRldmljZSBpZCwgaWRlbnRpdHksIG9mZmxpbmUgZXZlbnRcbiAqIHF1ZXVlLCBhdHRyaWJ1dGlvbiwgb3IgZXhwZXJpbWVudCBhc3NpZ25tZW50cy5cbiAqXG4gKiBJZGVtcG90ZW50OiBhIG1hcmtlciBrZXkgKGBndF9zdG9yYWdlX21pZ3JhdGlvbl92MWApIHJlY29yZHMgdGhlIHJ1blxuICogc28gc3Vic2VxdWVudCBpbml0cyBza2lwIHRoZSB3b3JrLiBTYWZlIHRvIHJlLXJ1biB3aXRoIG5vIHNpZGVcbiAqIGVmZmVjdHMgaWYgdGhlIG1hcmtlciBpcyB3aXBlZC5cbiAqXG4gKiBEZWZlbnNpdmU6IGV2ZXJ5IHN0b3JhZ2UgY2FsbCBpcyB3cmFwcGVkIOKAlCBTYWZhcmkgUHJpdmF0ZSBNb2RlLCBsb3dcbiAqIGRpc2ssIGFuZCBzdG9yYWdlLXF1b3RhIERPTUV4Y2VwdGlvbnMgZG9uJ3QgYWJvcnQgU0RLIGluaXQuXG4gKlxuICogVGhlIGxlZ2FjeSBgbHBfKmAgc3RyaW5ncyBsaXZlIE9OTFkgaW4gdGhpcyBmaWxlLiBDb25zdW1lcnMgYWx3YXlzXG4gKiBpbXBvcnQgYFNUT1JBR0VfS0VZUy48bmFtZT5gIGZyb20gYGRlZmF1bHRzLnRzYC5cbiAqL1xuXG5jb25zdCBNSUdSQVRJT05fTUFSS0VSX0tFWSA9IFwiZ3Rfc3RvcmFnZV9taWdyYXRpb25fdjFcIjtcbmNvbnN0IE1JR1JBVElPTl9NQVJLRVJfVkFMVUUgPSBcImRvbmVcIjtcblxuaW50ZXJmYWNlIEtleU1pZ3JhdGlvbiB7XG4gIHJlYWRvbmx5IHN0b3JhZ2U6IFwibG9jYWxcIiB8IFwic2Vzc2lvblwiO1xuICByZWFkb25seSBsZWdhY3k6IHN0cmluZztcbiAgcmVhZG9ubHkgY3VycmVudDogc3RyaW5nO1xufVxuXG5jb25zdCBLRVlfTUFQOiByZWFkb25seSBLZXlNaWdyYXRpb25bXSA9IFtcbiAgeyBzdG9yYWdlOiBcImxvY2FsXCIsIGxlZ2FjeTogXCJscF9kZXZpY2VfaWRcIiwgY3VycmVudDogXCJndF9kZXZpY2VfaWRcIiB9LFxuICB7IHN0b3JhZ2U6IFwibG9jYWxcIiwgbGVnYWN5OiBcImxwX2Fub255bW91c19pZFwiLCBjdXJyZW50OiBcImd0X2Fub255bW91c19pZFwiIH0sXG4gIHsgc3RvcmFnZTogXCJsb2NhbFwiLCBsZWdhY3k6IFwibHBfaWRlbnRpdHlcIiwgY3VycmVudDogXCJndF9pZGVudGl0eVwiIH0sXG4gIHsgc3RvcmFnZTogXCJsb2NhbFwiLCBsZWdhY3k6IFwibHBfY29uZmlnXCIsIGN1cnJlbnQ6IFwiZ3RfY29uZmlnXCIgfSxcbiAgeyBzdG9yYWdlOiBcImxvY2FsXCIsIGxlZ2FjeTogXCJscF9vZmZsaW5lX3F1ZXVlXCIsIGN1cnJlbnQ6IFwiZ3Rfb2ZmbGluZV9xdWV1ZVwiIH0sXG4gIHsgc3RvcmFnZTogXCJsb2NhbFwiLCBsZWdhY3k6IFwibHBfZXhwX2Fzc2lnbm1lbnRzXCIsIGN1cnJlbnQ6IFwiZ3RfZXhwX2Fzc2lnbm1lbnRzXCIgfSxcbiAgeyBzdG9yYWdlOiBcImxvY2FsXCIsIGxlZ2FjeTogXCJscF9maXJzdF90b3VjaFwiLCBjdXJyZW50OiBcImd0X2ZpcnN0X3RvdWNoXCIgfSxcbiAgeyBzdG9yYWdlOiBcInNlc3Npb25cIiwgbGVnYWN5OiBcImxwX3Nlc3Npb25faWRcIiwgY3VycmVudDogXCJndF9zZXNzaW9uX2lkXCIgfSxcbiAgeyBzdG9yYWdlOiBcInNlc3Npb25cIiwgbGVnYWN5OiBcImxwX3Nlc3Npb25fbGFzdF9zZWVuXCIsIGN1cnJlbnQ6IFwiZ3Rfc2Vzc2lvbl9sYXN0X3NlZW5cIiB9LFxuICB7IHN0b3JhZ2U6IFwic2Vzc2lvblwiLCBsZWdhY3k6IFwibHBfc2Vzc2lvbl9hdHRyaWJ1dGlvblwiLCBjdXJyZW50OiBcImd0X3Nlc3Npb25fYXR0cmlidXRpb25cIiB9LFxuXTtcblxuZnVuY3Rpb24gc2FmZUdldChzdG9yZTogU3RvcmFnZSwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc3RvcmUuZ2V0SXRlbShrZXkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlU2V0KHN0b3JlOiBTdG9yYWdlLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIHN0b3JlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIC8qIHN3YWxsb3cg4oCUIHF1b3RhIGV4Y2VlZGVkIC8gcHJpdmF0ZSBtb2RlIC8gZXRjLiAqL1xuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVSZW1vdmUoc3RvcmU6IFN0b3JhZ2UsIGtleTogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgc3RvcmUucmVtb3ZlSXRlbShrZXkpO1xuICB9IGNhdGNoIHtcbiAgICAvKiBzd2FsbG93ICovXG4gIH1cbn1cblxuLyoqXG4gKiBNaWdyYXRlIGBscF8qYCDihpIgYGd0XypgIG9uY2UuIE5vLW9wIG91dHNpZGUgdGhlIGJyb3dzZXIsIG5vLW9wIHdoZW5cbiAqIHRoZSBtYXJrZXIgaXMgc2V0LiBQdWJsaWMgc28gdGVzdHMgKyBmdXR1cmUgbWlncmF0aW9ucyBjYW4gc3R1Yi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pZ3JhdGVMZWdhY3lTdG9yYWdlS2V5cygpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgY29uc3QgbG9jYWwgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICBjb25zdCBzZXNzaW9uID0gd2luZG93LnNlc3Npb25TdG9yYWdlO1xuICBpZiAoIWxvY2FsIHx8ICFzZXNzaW9uKSByZXR1cm47XG5cbiAgLy8gSWRlbXBvdGVuY3kgbWFya2VyIOKAlCByZWFkIGZyb20gbG9jYWxTdG9yYWdlIChzdGlja3kgYWNyb3NzIHRhYnMpLlxuICBpZiAoc2FmZUdldChsb2NhbCwgTUlHUkFUSU9OX01BUktFUl9LRVkpID09PSBNSUdSQVRJT05fTUFSS0VSX1ZBTFVFKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBLRVlfTUFQKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBlbnRyeS5zdG9yYWdlID09PSBcImxvY2FsXCIgPyBsb2NhbCA6IHNlc3Npb247XG4gICAgY29uc3QgZXhpc3RpbmcgPSBzYWZlR2V0KHN0b3JlLCBlbnRyeS5jdXJyZW50KTtcbiAgICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IG1pZ3JhdGVkIG9yIGZyZXNobHktd3JpdHRlblxuICAgIGNvbnN0IGxlZ2FjeSA9IHNhZmVHZXQoc3RvcmUsIGVudHJ5LmxlZ2FjeSk7XG4gICAgaWYgKGxlZ2FjeSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgc2FmZVNldChzdG9yZSwgZW50cnkuY3VycmVudCwgbGVnYWN5KTtcbiAgICAvLyBSZW1vdmUgdGhlIGxlZ2FjeSBrZXkgc28gRGV2VG9vbHMgc2hvd3MgYSBjbGVhbiBcImd0XypcIiBzdXJmYWNlLlxuICAgIC8vIFNhZmU6IHRoZSBuZXcga2V5IGhvbGRzIHRoZSB2YWx1ZTsgbm90aGluZyBlbHNlIHJlYWRzIGBscF8qYCBhZnRlclxuICAgIC8vIHRoaXMgcG9pbnQuXG4gICAgc2FmZVJlbW92ZShzdG9yZSwgZW50cnkubGVnYWN5KTtcbiAgfVxuXG4gIHNhZmVTZXQobG9jYWwsIE1JR1JBVElPTl9NQVJLRVJfS0VZLCBNSUdSQVRJT05fTUFSS0VSX1ZBTFVFKTtcbn1cbiIsImltcG9ydCB7IERFRkFVTFRTLCBFVkVOVF9OQU1FX01BWF9MRU5HVEgsIFNES19WRVJTSU9OIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0J1cyB9IGZyb20gXCIuL2RpYWdub3N0aWMtYnVzLmpzXCI7XG5pbXBvcnQgeyBDb250ZXh0TWFuYWdlciB9IGZyb20gXCIuL2NvbnRleHQuanNcIjtcbmltcG9ydCB7IEV2ZW50UXVldWUgfSBmcm9tIFwiLi9xdWV1ZS5qc1wiO1xuaW1wb3J0IHsgRmxhZ01hbmFnZXIgfSBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0IHsgRXhwZXJpbWVudE1hbmFnZXIgfSBmcm9tIFwiLi9leHBlcmltZW50cy5qc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcbmltcG9ydCB7IENvbmZpZ1N5bmMgfSBmcm9tIFwiLi9jb25maWctc3luYy5qc1wiO1xuaW1wb3J0IHsgVHJhbnNwb3J0IH0gZnJvbSBcIi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyBPZmZsaW5lUXVldWUgfSBmcm9tIFwiLi9vZmZsaW5lLmpzXCI7XG5pbXBvcnQgeyBDb25uZWN0aXZpdHlNb25pdG9yIH0gZnJvbSBcIi4vY29ubmVjdGl2aXR5LmpzXCI7XG5pbXBvcnQgeyBMaWZlY3ljbGVNYW5hZ2VyIH0gZnJvbSBcIi4vbGlmZWN5Y2xlLmpzXCI7XG5pbXBvcnQgeyBCcm93c2VyRXJyb3JDYXB0dXJlIH0gZnJvbSBcIi4vZXJyb3ItY2FwdHVyZS5qc1wiO1xuaW1wb3J0IHsgSHR0cEVycm9yQ2FwdHVyZSB9IGZyb20gXCIuL2h0dHAtZXJyb3ItY2FwdHVyZS5qc1wiO1xuaW1wb3J0IHsgQ2xpY2tGcnVzdHJhdGlvbkNhcHR1cmUgfSBmcm9tIFwiLi9jbGljay1mcnVzdHJhdGlvbi5qc1wiO1xuaW1wb3J0IHsgbWlncmF0ZUxlZ2FjeVN0b3JhZ2VLZXlzIH0gZnJvbSBcIi4vc3RvcmFnZS1taWdyYXRpb24uanNcIjtcbmltcG9ydCB7XG4gIGdldERldmljZUlkLFxuICBzZXREZXZpY2VJZCxcbiAgZ2V0RGV2aWNlSW5mbyxcbiAgZ2VuZXJhdGVBbm9ueW1vdXNJZCxcbiAgcmVnaXN0ZXJEZXZpY2UsXG59IGZyb20gXCIuL2RldmljZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljRXZlbnQgfSBmcm9tIFwiLi9kaWFnbm9zdGljcy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBHb2FUZWNoQ29uZmlnLFxuICBSZXNvbHZlZENvbmZpZyxcbiAgRmxhZ1ZhbHVlLFxuICBFeHBlcmltZW50UmVzdWx0LFxuICBTREtTdGF0dXMsXG4gIFNES0NvbmZpZyxcbn0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgSUdvYVRlY2ggfSBmcm9tIFwiLi9pbnRlcmZhY2VzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBHb2FUZWNoIGltcGxlbWVudHMgSUdvYVRlY2gge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogR29hVGVjaCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2ZnOiBSZXNvbHZlZENvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBidXM6IERpYWdub3N0aWNCdXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dE1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IEV2ZW50UXVldWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmxhZ01hbmFnZXI6IEZsYWdNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cGVyaW1lbnRNYW5hZ2VyOiBFeHBlcmltZW50TWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpZGVudGl0eU1hbmFnZXI6IElkZW50aXR5TWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTeW5jOiBDb25maWdTeW5jO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zcG9ydDogVHJhbnNwb3J0O1xuICBwcml2YXRlIHJlYWRvbmx5IG9mZmxpbmVRdWV1ZTogT2ZmbGluZVF1ZXVlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpdml0eTogQ29ubmVjdGl2aXR5TW9uaXRvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaWZlY3ljbGU6IExpZmVjeWNsZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JDYXB0dXJlOiBCcm93c2VyRXJyb3JDYXB0dXJlIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBodHRwRXJyb3JDYXB0dXJlOiBIdHRwRXJyb3JDYXB0dXJlIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGlja0ZydXN0cmF0aW9uQ2FwdHVyZTogQ2xpY2tGcnVzdHJhdGlvbkNhcHR1cmUgfCBudWxsO1xuXG4gIHByaXZhdGUgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IFJlc29sdmVkQ29uZmlnLCBsb2c6IExvZ2dlciwgYnVzOiBEaWFnbm9zdGljQnVzKSB7XG4gICAgdGhpcy5jZmcgPSBjb25maWc7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5idXMgPSBidXM7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHRNYW5hZ2VyKCk7XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBFdmVudFF1ZXVlKGNvbmZpZy5tYXhRdWV1ZVNpemUpO1xuICAgIHRoaXMuZmxhZ01hbmFnZXIgPSBuZXcgRmxhZ01hbmFnZXIoKTtcbiAgICB0aGlzLmZsYWdNYW5hZ2VyLnNldERlYnVnTW9kZSh0aGlzLmNmZy5kZWJ1Zyk7XG4gICAgdGhpcy5leHBlcmltZW50TWFuYWdlciA9IG5ldyBFeHBlcmltZW50TWFuYWdlcigpO1xuICAgIHRoaXMuaWRlbnRpdHlNYW5hZ2VyID0gbmV3IElkZW50aXR5TWFuYWdlcihsb2cpO1xuICAgIHRoaXMub2ZmbGluZVF1ZXVlID0gbmV3IE9mZmxpbmVRdWV1ZSgpO1xuICAgIHRoaXMuY29ubmVjdGl2aXR5ID0gbmV3IENvbm5lY3Rpdml0eU1vbml0b3IoKTtcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBUcmFuc3BvcnQoXG4gICAgICBjb25maWcuYXBpVXJsLFxuICAgICAgY29uZmlnLmFwaUtleSxcbiAgICAgIGNvbmZpZy5lbnZpcm9ubWVudCxcbiAgICAgIGNvbmZpZy5yZXRyeUF0dGVtcHRzLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHRoaXMub2ZmbGluZVF1ZXVlLFxuICAgICAgdGhpcy5jb25uZWN0aXZpdHksXG4gICAgICBsb2csXG4gICAgICBjb25maWcuYXBwVmVyc2lvbixcbiAgICApO1xuICAgIHRoaXMubGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZU1hbmFnZXIodGhpcy5xdWV1ZSwgdGhpcy50cmFuc3BvcnQsIGxvZywgKG5hbWUsIHByb3BzKSA9PlxuICAgICAgdGhpcy50cmFjayhuYW1lLCBwcm9wcyksXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0aGlzLmNmZy5hdXRvQ2FwdHVyZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGNhcHR1cmVDZmcgPVxuICAgICAgICB0eXBlb2YgdGhpcy5jZmcuYXV0b0NhcHR1cmVFcnJvcnMgPT09IFwib2JqZWN0XCIgPyB0aGlzLmNmZy5hdXRvQ2FwdHVyZUVycm9ycyA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZXJyb3JDYXB0dXJlID0gbmV3IEJyb3dzZXJFcnJvckNhcHR1cmUoXG4gICAgICAgIChuYW1lLCBwcm9wcykgPT4gdGhpcy50cmFjayhuYW1lLCBwcm9wcyksXG4gICAgICAgIGxvZyxcbiAgICAgICAgY2FwdHVyZUNmZyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JDYXB0dXJlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5jZmcuYXV0b0NhcHR1cmVIdHRwRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgaHR0cENmZyA9XG4gICAgICAgIHR5cGVvZiB0aGlzLmNmZy5hdXRvQ2FwdHVyZUh0dHBFcnJvcnMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICA/IHRoaXMuY2ZnLmF1dG9DYXB0dXJlSHR0cEVycm9yc1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5odHRwRXJyb3JDYXB0dXJlID0gbmV3IEh0dHBFcnJvckNhcHR1cmUoXG4gICAgICAgIChuYW1lLCBwcm9wcykgPT4gdGhpcy50cmFjayhuYW1lLCBwcm9wcyksXG4gICAgICAgIGxvZyxcbiAgICAgICAgaHR0cENmZyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaHR0cEVycm9yQ2FwdHVyZSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaXMuY2ZnLmF1dG9DYXB0dXJlQ2xpY2tGcnVzdHJhdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGNsaWNrQ2ZnID1cbiAgICAgICAgdHlwZW9mIHRoaXMuY2ZnLmF1dG9DYXB0dXJlQ2xpY2tGcnVzdHJhdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gdGhpcy5jZmcuYXV0b0NhcHR1cmVDbGlja0ZydXN0cmF0aW9uXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNsaWNrRnJ1c3RyYXRpb25DYXB0dXJlID0gbmV3IENsaWNrRnJ1c3RyYXRpb25DYXB0dXJlKFxuICAgICAgICAobmFtZSwgcHJvcHMpID0+IHRoaXMudHJhY2sobmFtZSwgcHJvcHMpLFxuICAgICAgICBsb2csXG4gICAgICAgIGNsaWNrQ2ZnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGlja0ZydXN0cmF0aW9uQ2FwdHVyZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnU3luYyA9IG5ldyBDb25maWdTeW5jKFxuICAgICAgY29uZmlnLmFwaVVybCxcbiAgICAgIGNvbmZpZy5hcGlLZXksXG4gICAgICBjb25maWcuZW52aXJvbm1lbnQsXG4gICAgICBjb25maWcuY29uZmlnUmVmcmVzaEludGVydmFsLFxuICAgICAgbG9nLFxuICAgICAgKGNmZzogU0RLQ29uZmlnKSA9PiB0aGlzLmFwcGx5Q29uZmlnKGNmZyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIC0tLSBTdGF0aWMgQVBJIC0tLVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcsIGluZGVwZW5kZW50IEdvYVRlY2ggaW5zdGFuY2UuXG4gICAqIFRoZSBjYWxsZXIgb3ducyB0aGUgaW5zdGFuY2UgbGlmZWN5Y2xlIOKAlCBubyBnbG9iYWwgc3RhdGUuXG4gICAqIFByZWZlcnJlZCBmb3IgUmVhY3QgYXBwcyAocGFzcyBpbnN0YW5jZSB0byBDb250ZXh0KS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUoY29uZmlnOiBHb2FUZWNoQ29uZmlnKTogR29hVGVjaCB7XG4gICAgLy8gQXVkaXQgRS0wMTAg4oCUIGNvcHkgYW55IHByZS1leGlzdGluZyBgbHBfKmAgc3RvcmFnZSBlbnRyaWVzIGludG9cbiAgICAvLyB0aGUgbmV3IGBndF8qYCBzbG90cyBiZWZvcmUgYW55IG90aGVyIGluaXQgY29kZSB0b3VjaGVzIHN0b3JhZ2UuXG4gICAgLy8gSWRlbXBvdGVudCArIGJyb3dzZXItb25seTsgbm8tb3Agb24gTm9kZSAvIHNlY29uZCBjYWxsLlxuICAgIG1pZ3JhdGVMZWdhY3lTdG9yYWdlS2V5cygpO1xuXG4gICAgLy8gVmFsaWRhdGUgQVBJIGtleSBmb3JtYXRcbiAgICBpZiAoIS9ebHBfKHB1YnxzZWMpXy8udGVzdChjb25maWcuYXBpS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0dvYVRlY2hdIEludmFsaWQgQVBJIGtleSBmb3JtYXQuIEV4cGVjdGVkIGxwX3B1Yl8uLi4gb3IgbHBfc2VjXy4uLlwiKTtcbiAgICB9XG4gICAgLy8gUmVqZWN0IHNlY3JldCBrZXlzIGluIHRoZSBicm93c2VyIOKAlCB0aGV5IGdyYW50IHdyaXRlIGFjY2VzcyB0byB0aGVcbiAgICAvLyB3aG9sZSBwcm9qZWN0IGFuZCBtdXN0IG5ldmVyIHNoaXAgaW4gY2xpZW50IGJ1bmRsZXMuIGBzZWNgIGtleXMgYXJlXG4gICAgLy8gZm9yIHNlcnZlciBTREtzIG9ubHkuIChQcmV2aW91c2x5IHRoaXMgd2FzIGp1c3QgYSBjb25zb2xlLndhcm47IGFuXG4gICAgLy8gaWdub3JlZCB3YXJuaW5nIG1lYW5zIGEgcmVhbCBzZWNyZXQga2V5IGluIGV2ZXJ5IHVzZXIncyBidW5kbGUuKVxuICAgIGlmIChjb25maWcuYXBpS2V5LnN0YXJ0c1dpdGgoXCJscF9zZWNfXCIpICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJbR29hVGVjaF0gU2VjcmV0IGtleXMgKGxwX3NlY18qKSBtdXN0IG5vdCBiZSB1c2VkIGluIHRoZSBicm93c2VyLiBcIiArXG4gICAgICAgICAgXCJVc2UgYSBwdWJsaXNoYWJsZSBrZXkgKGxwX3B1Yl8qKSBmb3IgY2xpZW50LXNpZGUgY29kZS5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIE1lcmdlIGRlZmF1bHRzXG4gICAgY29uc3QgbWVyZ2VkOiBSZXNvbHZlZENvbmZpZyA9IHtcbiAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcbiAgICAgIGFwaVVybDogY29uZmlnLmFwaVVybCA/PyBERUZBVUxUUy5hcGlVcmwsXG4gICAgICBlbnZpcm9ubWVudDogY29uZmlnLmVudmlyb25tZW50ID8/IERFRkFVTFRTLmVudmlyb25tZW50LFxuICAgICAgZmx1c2hJbnRlcnZhbDogY29uZmlnLmZsdXNoSW50ZXJ2YWwgPz8gREVGQVVMVFMuZmx1c2hJbnRlcnZhbCxcbiAgICAgIGZsdXNoU2l6ZTogY29uZmlnLmZsdXNoU2l6ZSA/PyBERUZBVUxUUy5mbHVzaFNpemUsXG4gICAgICBkZWJ1ZzogY29uZmlnLmRlYnVnID8/IERFRkFVTFRTLmRlYnVnLFxuICAgICAgY29uZmlnUmVmcmVzaEludGVydmFsOiBjb25maWcuY29uZmlnUmVmcmVzaEludGVydmFsID8/IERFRkFVTFRTLmNvbmZpZ1JlZnJlc2hJbnRlcnZhbCxcbiAgICAgIG1heFF1ZXVlU2l6ZTogY29uZmlnLm1heFF1ZXVlU2l6ZSA/PyBERUZBVUxUUy5tYXhRdWV1ZVNpemUsXG4gICAgICByZXRyeUF0dGVtcHRzOiBjb25maWcucmV0cnlBdHRlbXB0cyA/PyBERUZBVUxUUy5yZXRyeUF0dGVtcHRzLFxuICAgICAgb25FdmVudDogY29uZmlnLm9uRXZlbnQsXG4gICAgICBvbkRpYWdub3N0aWM6IGNvbmZpZy5vbkRpYWdub3N0aWMsXG4gICAgICBkaWFnbm9zdGljQnVmZmVyU2l6ZTogY29uZmlnLmRpYWdub3N0aWNCdWZmZXJTaXplID8/IERFRkFVTFRTLmRpYWdub3N0aWNCdWZmZXJTaXplLFxuICAgICAgYXV0b0NhcHR1cmVFcnJvcnM6IGNvbmZpZy5hdXRvQ2FwdHVyZUVycm9ycyA/PyB0cnVlLFxuICAgICAgLy8gRGVmYXVsdCBPRkYgdW50aWwgYmF0dGxlLXRlc3RlZCBpbiB0aGUgd2lsZC4gT3B0LWluIGZvciBhcHBzIHRoYXQgd2FudCBpdC5cbiAgICAgIC8vIE1vbmtleS1wYXRjaGluZyB3aW5kb3cuZmV0Y2ggaXMgcmlza3kg4oCUIGpzZG9tIGRvZXNuJ3QgZW5mb3JjZSBuYXRpdmUnc1xuICAgICAgLy8gYHRoaXMgPT09IHdpbmRvd2AgY29udHJhY3QsIHNvIHVuaXQgdGVzdHMgY2FuIG1pc3MgcmVhbC1icm93c2VyIGJ1Z3MuXG4gICAgICBhdXRvQ2FwdHVyZUh0dHBFcnJvcnM6IGNvbmZpZy5hdXRvQ2FwdHVyZUh0dHBFcnJvcnMgPz8gZmFsc2UsXG4gICAgICBhdXRvQ2FwdHVyZUNsaWNrRnJ1c3RyYXRpb246IGNvbmZpZy5hdXRvQ2FwdHVyZUNsaWNrRnJ1c3RyYXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFwcFZlcnNpb246IGNvbmZpZy5hcHBWZXJzaW9uID8/IG51bGwsXG4gICAgfTtcbiAgICBjb25zdCBidXMgPSBuZXcgRGlhZ25vc3RpY0J1cyhtZXJnZWQuZGlhZ25vc3RpY0J1ZmZlclNpemUpO1xuICAgIGlmIChtZXJnZWQub25EaWFnbm9zdGljKSB7XG4gICAgICBidXMuc3Vic2NyaWJlKG1lcmdlZC5vbkRpYWdub3N0aWMpO1xuICAgIH1cbiAgICBjb25zdCBsb2cgPSBuZXcgTG9nZ2VyKG1lcmdlZC5kZWJ1ZywgYnVzKTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBHb2FUZWNoKG1lcmdlZCwgbG9nLCBidXMpO1xuICAgIGluc3RhbmNlLnN0YXJ0KCk7XG4gICAgbG9nLmRpYWdub3N0aWMoXCJpbmZvXCIsIFwibGlmZWN5Y2xlXCIsIFwibGlmZWN5Y2xlLmluaXRfb2tcIiwgXCJTREsgaW5pdGlhbGl6ZWRcIiwge1xuICAgICAgZW52aXJvbm1lbnQ6IG1lcmdlZC5lbnZpcm9ubWVudCxcbiAgICAgIGFwaVVybDogbWVyZ2VkLmFwaVVybCxcbiAgICB9KTtcbiAgICBsb2cuZGVidWcoXCJJbml0aWFsaXplZFwiLCB7XG4gICAgICBhcGlLZXk6IGNvbmZpZy5hcGlLZXkuc2xpY2UoMCwgMTApICsgXCIuLi5cIixcbiAgICAgIGVudmlyb25tZW50OiBtZXJnZWQuZW52aXJvbm1lbnQsXG4gICAgICBhcGlVcmw6IG1lcmdlZC5hcGlVcmwsXG4gICAgfSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNpbmdsZXRvbiBpbnN0YW5jZS4gUmV0dXJucyBleGlzdGluZyBpbnN0YW5jZSBpZiBhbHJlYWR5XG4gICAqIGluaXRpYWxpemVkIChsb2dzIGEgd2FybmluZykuIENhbGwgYGRlc3Ryb3koKWAgZmlyc3QgdG8gcmUtaW5pdGlhbGl6ZS5cbiAgICpcbiAgICogRm9yIFJlYWN0IGFwcHMsIHByZWZlciBgR29hVGVjaC5jcmVhdGUoKWAgKyBDb250ZXh0IGluc3RlYWQuXG4gICAqL1xuICBzdGF0aWMgaW5pdChjb25maWc6IEdvYVRlY2hDb25maWcpOiBHb2FUZWNoIHtcbiAgICBpZiAoR29hVGVjaC5pbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgR29hVGVjaC5pbnN0YW5jZS5sb2cud2FybihcbiAgICAgICAgXCJpbml0KCkgY2FsbGVkIGFmdGVyIGFscmVhZHkgaW5pdGlhbGl6ZWQuIENhbGwgZGVzdHJveSgpIGZpcnN0IHRvIHJlLWluaXRpYWxpemUuIFJldHVybmluZyBleGlzdGluZyBpbnN0YW5jZS5cIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gR29hVGVjaC5pbnN0YW5jZTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFuY2UgPSBHb2FUZWNoLmNyZWF0ZShjb25maWcpO1xuICAgIEdvYVRlY2guaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKiogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuIFRocm93cyBpZiBgaW5pdCgpYCB3YXMgbmV2ZXIgY2FsbGVkLiAqL1xuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogR29hVGVjaCB7XG4gICAgaWYgKEdvYVRlY2guaW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltHb2FUZWNoXSBOb3QgaW5pdGlhbGl6ZWQuIENhbGwgR29hVGVjaC5pbml0KCkgZmlyc3QuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gR29hVGVjaC5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNpbmdsZXRvbiBoYXMgYmVlbiBpbml0aWFsaXplZCB2aWEgYGluaXQoKWAuXG4gICAqIFVzZWZ1bCBmb3IgSE1SIGd1YXJkcyBhbmQgY29uZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBzdGF0aWMgaXNJbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gR29hVGVjaC5pbnN0YW5jZSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8vIC0tLSBJbnN0YW5jZSBBUEkgLS0tXG5cbiAgLyoqXG4gICAqIFF1ZXVlIGFuIGFuYWx5dGljcyBldmVudC4gQXV0by1mbHVzaGVzIHdoZW4gdGhlIHF1ZXVlIHJlYWNoZXNcbiAgICogYGZsdXNoU2l6ZWAgKGRlZmF1bHQgMjApIG9yIHdoZW4gdGhlIHBlcmlvZGljIGZsdXNoIHRpbWVyIGZpcmVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBndC50cmFjayhcImNvdXJzZV92aWV3ZWRcIiwgeyBjb3Vyc2VfaWQ6IFwiY18xMjNcIiwgc291cmNlOiBcImNhdGFsb2dcIiB9KTtcbiAgICovXG4gIHRyYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJ0cmFjaygpIGNhbGxlZCBhZnRlciBkZXN0cm95KCkuIElnbm9yaW5nLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IHZhbGlkYXRlRXZlbnROYW1lKGV2ZW50TmFtZSk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50X2lkOiBnZW5lcmF0ZUFub255bW91c0lkKCksXG4gICAgICBldmVudF9uYW1lOiBuYW1lLFxuICAgICAgZXZlbnRfcHJvcGVydGllczogcHJvcGVydGllcyxcbiAgICAgIGRldmljZV9pZDogY3R4LmRldmljZV9pZCxcbiAgICAgIGFub255bW91c19pZDogY3R4LmFub255bW91c19pZCxcbiAgICAgIHNlc3Npb25faWQ6IGN0eC5zZXNzaW9uX2lkLFxuICAgICAgdXNlcl9pZDogY3R4LnVzZXJfaWQsXG4gICAgICBwbGF0Zm9ybTogY3R4LnBsYXRmb3JtLFxuICAgICAgYXBwX3ZlcnNpb246IHRoaXMuY2ZnLmFwcFZlcnNpb24gPz8gdW5kZWZpbmVkLFxuICAgICAgc2RrX3ZlcnNpb246IGN0eC5zZGtfdmVyc2lvbixcbiAgICAgIGxvY2FsZTogY3R4LmxvY2FsZSxcbiAgICAgIHRpbWV6b25lOiBjdHgudGltZXpvbmUsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICAgIHRoaXMucXVldWUuYWRkKGV2ZW50KTtcbiAgICB0aGlzLmNvbnRleHQudG91Y2hTZXNzaW9uKCk7XG4gICAgLy8gTm90aWZ5IG9uRXZlbnQgY2FsbGJhY2sgKHdyYXBwZWQgdG8gcHJldmVudCBjYWxsZXIgZXJyb3JzIGZyb20gYnJlYWtpbmcgdHJhY2spXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2ZnLm9uRXZlbnQ/LihuYW1lLCBwcm9wZXJ0aWVzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJvbkV2ZW50IGNhbGxiYWNrIHRocmV3XCIsIGVycik7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXVlLnNpemUoKSA+PSB0aGlzLmNmZy5mbHVzaFNpemUpIHtcbiAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBUcmFja2VkOiAke25hbWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGZlYXR1cmUgZmxhZyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlICsgaWRlbnRpdHkuIFJlYWRzXG4gICAqIHRoZSBjYWNoZWQgc2VydmVyLWV2YWx1YXRlZCB2YWx1ZSBmcm9tIGAvdjEvY29uZmlnYCAocmVmcmVzaGVkIG9uXG4gICAqIGBjb25maWdSZWZyZXNoSW50ZXJ2YWxgKS4gRmlyZXMgYCRmbGFnX2V4cG9zdXJlYCBvbmNlIHBlciBzZXNzaW9uXG4gICAqIHBlciBmbGFnLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpZiAoZ3QuZmxhZyhcIm5ld19jaGVja291dF9mbG93XCIsIGZhbHNlKSkge1xuICAgKiAgIHJlbmRlck5ld0NoZWNrb3V0KCk7XG4gICAqIH1cbiAgICovXG4gIGZsYWcoZmxhZ0tleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IEZsYWdWYWx1ZSA9IGZhbHNlKTogRmxhZ1ZhbHVlIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJmbGFnKCkgY2FsbGVkIGFmdGVyIGRlc3Ryb3koKS4gUmV0dXJuaW5nIGRlZmF1bHQuXCIpO1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmxhZ01hbmFnZXIuZXZhbHVhdGUoXG4gICAgICBmbGFnS2V5LFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgdGhpcy5jb250ZXh0LmdldFVzZXJJZCgpLFxuICAgICAgdGhpcy5jb250ZXh0LmdldFVzZXJUcmFpdHMoKSxcbiAgICAgIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMudHJhY2soXCIkZmxhZ19leHBvc3VyZVwiLCB7IGZsYWdfa2V5OiBrZXksIGZsYWdfdmFsdWU6IHZhbHVlIH0pO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGVGbGFnKGtleTogc3RyaW5nLCB2YWx1ZTogRmxhZ1ZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy5mbGFnTWFuYWdlci5vdmVycmlkZUZsYWcoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBjbGVhck92ZXJyaWRlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZsYWdNYW5hZ2VyLmNsZWFyT3ZlcnJpZGVzKCk7XG4gIH1cblxuICBnZXRPdmVycmlkZXMoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmZsYWdNYW5hZ2VyLmdldE92ZXJyaWRlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGJ1Y2tldGVkIHZhcmlhbnQgKyBwYXlsb2FkIGZvciBhbiBleHBlcmltZW50LiBTdGlja3lcbiAgICogcGVyIGRldmljZS4gRmlyZXMgYCRleHBlcmltZW50X2V4cG9zdXJlYCBvbmNlIHBlciBzZXNzaW9uIHBlclxuICAgKiBleHBlcmltZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCB7IHZhcmlhbnQsIHBheWxvYWQgfSA9IGd0LmV4cGVyaW1lbnQoXCJoZXJvX2gxX2NvcHlfdjFcIik7XG4gICAqIGlmICh2YXJpYW50ICE9PSBcImNvbnRyb2xcIikgc2V0SGVhZGxpbmUoKHBheWxvYWQgYXMgeyBoZWFkbGluZTogc3RyaW5nIH0pLmhlYWRsaW5lKTtcbiAgICovXG4gIGV4cGVyaW1lbnQoZXhwZXJpbWVudEtleTogc3RyaW5nKTogRXhwZXJpbWVudFJlc3VsdCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwiZXhwZXJpbWVudCgpIGNhbGxlZCBhZnRlciBkZXN0cm95KCkuIFJldHVybmluZyBjb250cm9sLlwiKTtcbiAgICAgIHJldHVybiB7IHZhcmlhbnQ6IFwiY29udHJvbFwiIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyLnJlc29sdmUoZXhwZXJpbWVudEtleSwgKGtleSwgdmFyaWFudCkgPT4ge1xuICAgICAgdGhpcy50cmFjayhcIiRleHBlcmltZW50X2V4cG9zdXJlXCIsIHtcbiAgICAgICAgZXhwZXJpbWVudF9rZXk6IGtleSxcbiAgICAgICAgdmFyaWFudCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpZSB0aGUgY3VycmVudCBkZXZpY2UgdG8gYSBzdGFibGUgdXNlciBpZCBhbmQgbWVyZ2UgdHJhaXRzIG9udG9cbiAgICogdGhlIEdvYVRlY2ggdXNlciByZWNvcmQuIFJlLWlkZW50aWZ5aW5nIHdpdGggYSBkaWZmZXJlbnQgdXNlcklkXG4gICAqIGNsZWFycyB0aGUgY2FjaGVkIGV4cGVyaW1lbnQgYXNzaWdubWVudHMgc28gdGhlIG5ldyBpZGVudGl0eVxuICAgKiBnZXRzIGZyZXNoIGJ1Y2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGF3YWl0IGFwaS5sb2dpbihmb3JtKTtcbiAgICogZ3QuaWRlbnRpZnkoXCJ1c2VyX2FiYzEyM1wiLCB7IGVtYWlsOiBcImphbmVAZXhhbXBsZS5jb21cIiwgcGxhbjogXCJwcm9cIiB9KTtcbiAgICovXG4gIGlkZW50aWZ5KHVzZXJJZDogc3RyaW5nLCB0cmFpdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5sb2cud2FybihcImlkZW50aWZ5KCkgY2FsbGVkIGFmdGVyIGRlc3Ryb3koKS4gSWdub3JpbmcuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlkZW50aXR5TWFuYWdlci5pZGVudGlmeSh1c2VySWQsIHRyYWl0cywge1xuICAgICAgZ2V0Q3VycmVudFVzZXJJZDogKCkgPT4gdGhpcy5jb250ZXh0LmdldFVzZXJJZCgpLFxuICAgICAgc2V0VXNlcklkOiAoaWQpID0+IHRoaXMuY29udGV4dC5zZXRVc2VySWQoaWQpLFxuICAgICAgdXBkYXRlVHJhaXRzOiAodCkgPT4gdGhpcy5jb250ZXh0LnVwZGF0ZVVzZXJQcm9wZXJ0aWVzKHQpLFxuICAgICAgcmVzZXRTZXNzaW9uOiAoKSA9PiB0aGlzLmNvbnRleHQucmVzZXRJZGVudGl0eSgpLFxuICAgICAgY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHM6ICgpID0+IHRoaXMuZXhwZXJpbWVudE1hbmFnZXIuY2xlYXJBc3NpZ25tZW50cygpLFxuICAgICAgZmx1c2g6ICgpID0+IHRoaXMuZmx1c2goKSxcbiAgICAgIHBvc3RJZGVudGl0eVJlc29sdmU6ICh1aWQsIHByZXZJZCkgPT4ge1xuICAgICAgICB0aGlzLnBvc3RJZGVudGl0eVJlc29sdmUodWlkLCBwcmV2SWQpLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvcihcIklkZW50aXR5IHJlc29sdmUgZmFpbGVkXCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JnZXQgdGhlIGN1cnJlbnQgaWRlbnRpdHkgKyBleHBlcmltZW50IGFzc2lnbm1lbnRzIGFuZCBzdGFydCBhXG4gICAqIGZyZXNoIGFub255bW91cyBzZXNzaW9uLiBDYWxsIG9uIGxvZ291dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgYXBpLmxvZ291dCgpO1xuICAgKiBndC5yZXNldCgpO1xuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5pZGVudGl0eU1hbmFnZXIucmVzZXQoe1xuICAgICAgcmVzZXRTZXNzaW9uOiAoKSA9PiB0aGlzLmNvbnRleHQucmVzZXRJZGVudGl0eSgpLFxuICAgICAgY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHM6ICgpID0+IHRoaXMuZXhwZXJpbWVudE1hbmFnZXIuY2xlYXJBc3NpZ25tZW50cygpLFxuICAgICAgZmx1c2g6ICgpID0+IHRoaXMuZmx1c2goKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbiBhbnkgcXVldWVkIGV2ZW50cyB0byB0aGUgR29hVGVjaCBpbmdlc3QgZW5kcG9pbnQuIFVzZWZ1bFxuICAgKiBiZWZvcmUgbmF2aWdhdGlvbiBpbiBzaW5nbGUtcGFnZSBhcHBzIGFuZCByZXF1aXJlZCBiZWZvcmVcbiAgICogVmVyY2VsL0xhbWJkYSBmdW5jdGlvbiBleGl0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcm91dGVyLmJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgKiAgIGF3YWl0IGd0LmZsdXNoKCk7XG4gICAqIH0pO1xuICAgKi9cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50cmFuc3BvcnQuZmx1c2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgdGhlIFNESyBvZiBhIHJvdXRlIGNoYW5nZS4gVGhlIGZpcnN0IGNhbGwgc3RhcnRzIGEgcGFnZS1sZWF2ZVxuICAgKiB0aW1lcjsgc3Vic2VxdWVudCBjYWxscyBlbWl0IGEgc3ludGhldGljIGAkcGFnZV9sZWF2ZWAgZm9yIHRoZSBwcmlvclxuICAgKiByb3V0ZSAod2l0aCBgZXhpdF9raW5kOiBcInNwYV9uYXZcImApIGJlZm9yZSByZXNldHRpbmcgc3RhdGUuIFdpcmVcbiAgICogdGhpcyBpbnRvIHlvdXIgcm91dGVyIOKAlCBmb3IgTmV4dC5qcywgdXNlIGA8UGFnZVZpZXdUcmFja2VyPmAgZnJvbVxuICAgKiBgQGdvYXRlY2gvcmVhY3RgLCB3aGljaCBjYWxscyB0aGlzIGZvciB5b3UuXG4gICAqXG4gICAqIElkZW1wb3RlbnQgZm9yIHJlcGVhdCBjYWxscyB3aXRoIHRoZSBzYW1lIHBhdGguXG4gICAqL1xuICByZWNvcmRQYWdlVmlldyhwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmxpZmVjeWNsZS5yZWNvcmRQYWdlVmlldyhwYXRoKTtcbiAgfVxuXG4gIHN0YXR1cygpOiBTREtTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0aWFsaXplZDogIXRoaXMuZGVzdHJveWVkLFxuICAgICAgb25saW5lOiB0aGlzLmNvbm5lY3Rpdml0eS5pc09ubGluZSgpLFxuICAgICAgcXVldWVEZXB0aDogdGhpcy5xdWV1ZS5zaXplKCksXG4gICAgICBvZmZsaW5lUXVldWVEZXB0aDogdGhpcy5vZmZsaW5lUXVldWUuc2l6ZSgpLFxuICAgICAgbGFzdEZsdXNoQXQ6IHRoaXMudHJhbnNwb3J0LmdldExhc3RGbHVzaEF0KCksXG4gICAgICBkZXZpY2VJZDogdGhpcy5jb250ZXh0LmdldERldmljZUlkKCksXG4gICAgICB1c2VySWQ6IHRoaXMuY29udGV4dC5nZXRVc2VySWQoKSxcbiAgICAgIGZsYWdDb3VudDogdGhpcy5mbGFnTWFuYWdlci5jb3VudCgpLFxuICAgICAgZXhwZXJpbWVudENvdW50OiB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyLmNvdW50KCksXG4gICAgICBzZGtWZXJzaW9uOiBTREtfVkVSU0lPTixcbiAgICB9O1xuICB9XG5cbiAgZGlhZ25vc3RpY3MoKTogRGlhZ25vc3RpY0J1cyB7XG4gICAgcmV0dXJuIHRoaXMuYnVzO1xuICB9XG5cbiAgZ2V0UmVjZW50RGlhZ25vc3RpY3MoKTogRGlhZ25vc3RpY0V2ZW50W10ge1xuICAgIHJldHVybiB0aGlzLmJ1cy5nZXRSZWNlbnREaWFnbm9zdGljcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYWxsIHRpbWVycywgZHJhaW4gcmVtYWluaW5nIGV2ZW50cywgYW5kIHRlYXIgZG93biBhdXRvLWVycm9yXG4gICAqICsgbGlmZWN5Y2xlIGxpc3RlbmVycy4gQWZ0ZXIgYGRlc3Ryb3koKWAgZnVydGhlciBgdHJhY2soKWAgL1xuICAgKiBgZmxhZygpYCBjYWxscyBhcmUgbm8tb3BzLiBJZGVtcG90ZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXBsYWNpbmcgdGhlIFNESyBpbnN0YW5jZSAocmFyZTsgdXN1YWxseSBqdXN0IGNhbGwgb25jZSlcbiAgICogY29uc3Qgb2xkID0gR29hVGVjaC5nZXRJbnN0YW5jZSgpO1xuICAgKiBvbGQuZGVzdHJveSgpO1xuICAgKiBjb25zdCBmcmVzaCA9IEdvYVRlY2guaW5pdCh7IGFwaUtleTogbmV4dEtleSB9KTtcbiAgICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIGZpcmUtYW5kLWZvcmdldCBmbHVzaFxuICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKHRoaXMuZmx1c2hUaW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmZsdXNoVGltZXIpO1xuICAgICAgdGhpcy5mbHVzaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb25maWdTeW5jLnN0b3AoKTtcbiAgICB0aGlzLmNvbm5lY3Rpdml0eS5kZXN0cm95KCk7XG4gICAgdGhpcy5saWZlY3ljbGUuZGVzdHJveSgpO1xuICAgIHRoaXMuZXJyb3JDYXB0dXJlPy51bmluc3RhbGwoKTtcbiAgICB0aGlzLmh0dHBFcnJvckNhcHR1cmU/LnVuaW5zdGFsbCgpO1xuICAgIHRoaXMuY2xpY2tGcnVzdHJhdGlvbkNhcHR1cmU/LnVuaW5zdGFsbCgpO1xuICAgIC8vIE9ubHkgY2xlYXIgc2luZ2xldG9uIHJlZiBpZiB0aGlzIElTIHRoZSBzaW5nbGV0b25cbiAgICBpZiAoR29hVGVjaC5pbnN0YW5jZSA9PT0gdGhpcykge1xuICAgICAgR29hVGVjaC5pbnN0YW5jZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRpYWdub3N0aWMoXCJpbmZvXCIsIFwibGlmZWN5Y2xlXCIsIFwibGlmZWN5Y2xlLmRlc3Ryb3llZFwiLCBcIlNESyBpbnN0YW5jZSBkZXN0cm95ZWRcIik7XG4gICAgdGhpcy5sb2cuZGVidWcoXCJEZXN0cm95ZWQuXCIpO1xuICB9XG5cbiAgLy8gLS0tIFByaXZhdGUgLS0tXG5cbiAgcHJpdmF0ZSBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBMb2FkIHN0b3JlZCBkZXZpY2UgSURcbiAgICBjb25zdCBleGlzdGluZ0RldmljZUlkID0gZ2V0RGV2aWNlSWQoKTtcbiAgICBpZiAoZXhpc3RpbmdEZXZpY2VJZCkge1xuICAgICAgdGhpcy5jb250ZXh0LnNldERldmljZUlkKGV4aXN0aW5nRGV2aWNlSWQpO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IGNvbmZpZyBzeW5jIChub24tYmxvY2tpbmcg4oCUIGxvYWRzIGZyb20gY2FjaGUgZmlyc3QsIHRoZW4gZmV0Y2hlcylcbiAgICAvLyBQYXNzIGEgZ2V0dGVyIHNvIHJlZnJlc2ggaW50ZXJ2YWxzIGFsd2F5cyB1c2UgdGhlIGxhdGVzdCBkZXZpY2UgSURcbiAgICB0aGlzLmNvbmZpZ1N5bmMuc3RhcnQoKCkgPT4gdGhpcy5jb250ZXh0LmdldERldmljZUlkKCkpO1xuXG4gICAgLy8gUmVnaXN0ZXIgZGV2aWNlIGlmIG5lZWRlZCAobm9uLWJsb2NraW5nKVxuICAgIGlmICghZXhpc3RpbmdEZXZpY2VJZCkge1xuICAgICAgY29uc3QgYW5vbnltb3VzSWQgPSB0aGlzLmNvbnRleHQuZ2V0QW5vbnltb3VzSWQoKTtcbiAgICAgIGNvbnN0IGluZm8gPSBnZXREZXZpY2VJbmZvKCk7XG4gICAgICByZWdpc3RlckRldmljZShcbiAgICAgICAgdGhpcy5jZmcuYXBpVXJsLFxuICAgICAgICB0aGlzLmNmZy5hcGlLZXksXG4gICAgICAgIHRoaXMuY2ZnLmVudmlyb25tZW50LFxuICAgICAgICBhbm9ueW1vdXNJZCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgaW5mbyxcbiAgICAgIClcbiAgICAgICAgLnRoZW4oKGRldmljZUlkKSA9PiB7XG4gICAgICAgICAgc2V0RGV2aWNlSWQoZGV2aWNlSWQpO1xuICAgICAgICAgIHRoaXMuY29udGV4dC5zZXREZXZpY2VJZChkZXZpY2VJZCk7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXCJEZXZpY2UgcmVnaXN0ZXJlZFwiLCB7IGRldmljZUlkIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oXCJEZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCwgdXNpbmcgYW5vbnltb3VzIElEXCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IGZsdXNoIHRpbWVyXG4gICAgdGhpcy5mbHVzaFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5mbHVzaCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9LCB0aGlzLmNmZy5mbHVzaEludGVydmFsKTtcblxuICAgIC8vIFJlZ2lzdGVyIGxpZmVjeWNsZSBsaXN0ZW5lcnMgKGJlZm9yZXVubG9hZCwgcGFnZWhpZGUsIHZpc2liaWxpdHljaGFuZ2UpXG4gICAgdGhpcy5saWZlY3ljbGUucmVnaXN0ZXIoKTtcblxuICAgIC8vIEluc3RhbGwgYnJvd3NlciBlcnJvciBjYXB0dXJlICh3aW5kb3cub25lcnJvciwgdW5oYW5kbGVkcmVqZWN0aW9uLFxuICAgIC8vIGdvYXRlY2g6YXV0aC1ldmVudCkuIE5vLW9wIG91dHNpZGUgdGhlIGJyb3dzZXIgb3Igd2hlbiBkaXNhYmxlZC5cbiAgICB0aGlzLmVycm9yQ2FwdHVyZT8uaW5zdGFsbCgpO1xuXG4gICAgLy8gSW5zdGFsbCBIVFRQIGVycm9yIGNhcHR1cmUg4oCUIHdyYXBzIHdpbmRvdy5mZXRjaCwgZW1pdHMgJGh0dHBfZXJyb3Igb25cbiAgICAvLyBldmVyeSA0eHgvNXh4ICsgbmV0d29yayBmYWlsdXJlLiBOby1vcCBvdXRzaWRlIHRoZSBicm93c2VyIC8gZGlzYWJsZWQuXG4gICAgdGhpcy5odHRwRXJyb3JDYXB0dXJlPy5pbnN0YWxsKCk7XG5cbiAgICAvLyBJbnN0YWxsIGNsaWNrLWZydXN0cmF0aW9uIGNhcHR1cmUg4oCUIGVtaXRzICRyYWdlX2NsaWNrICsgJGRlYWRfY2xpY2tcbiAgICAvLyB3aGVuIHRoZSB1c2VyIGhhbW1lcnMgdGhlIHNhbWUgc3BvdCBvciBjbGlja3MgYSBub24taW50ZXJhY3RpdmVcbiAgICAvLyB0YXJnZXQuIE5vLW9wIG91dHNpZGUgdGhlIGJyb3dzZXIgLyBkaXNhYmxlZC5cbiAgICB0aGlzLmNsaWNrRnJ1c3RyYXRpb25DYXB0dXJlPy5pbnN0YWxsKCk7XG5cbiAgICAvLyBEcmFpbiBvZmZsaW5lIHF1ZXVlIHdoZW4gYmFjayBvbmxpbmVcbiAgICB0aGlzLmNvbm5lY3Rpdml0eS5vbk9ubGluZSgoKSA9PiB7XG4gICAgICBjb25zdCBxdWV1ZWQgPSB0aGlzLm9mZmxpbmVRdWV1ZS5kcmFpbigpO1xuICAgICAgaWYgKHF1ZXVlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBCYWNrIG9ubGluZSDigJQgZmx1c2hpbmcgJHtxdWV1ZWQubGVuZ3RofSBvZmZsaW5lIGV2ZW50cy5gKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHF1ZXVlZCkgdGhpcy5xdWV1ZS5hZGQoZSk7XG4gICAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFbWl0IGAkc2Vzc2lvbl9zdGFydGAgb25jZSBwZXIgc2Vzc2lvbi4gVGhlIENvbnRleHRNYW5hZ2VyJ3NcbiAgICAvLyBgaXNOZXdTZXNzaW9uYCBmbGFnIGlzIHRydWUgb24gdGhlIGZpcnN0IFNESyBpbml0IHdpdGhpbiBhIG5ld1xuICAgIC8vIHNlc3Npb24gKGNvbGQgc3RhcnQsIG9yIGFmdGVyIHRoZSAzMC1taW4gaWRsZSB3aW5kb3cgcm9sbGVkIG92ZXIpLlxuICAgIC8vIEV2ZXJ5IHN1YnNlcXVlbnQgZXZlbnQgYWxyZWFkeSBjYXJyaWVzIGBjb250ZXh0LmF0dHJpYnV0aW9uYCwgYnV0XG4gICAgLy8gdGhlIGRlZGljYXRlZCBzdGFydCBldmVudCBtYWtlcyBpdCB0cml2aWFsIHRvIGJ1aWxkIGZ1bm5lbHMgbGlrZVxuICAgIC8vIFwic2Vzc2lvbnMgdGhhdCBjYW1lIGZyb20gdXRtX3NvdXJjZT10d2l0dGVyIGFuZCB0aGVuIHNpZ25lZCB1cFwiLlxuICAgIGlmICh0aGlzLmNvbnRleHQuaXNOZXdTZXNzaW9uKSB7XG4gICAgICBjb25zdCBhdHRyID0gdGhpcy5jb250ZXh0LmdldFNlc3Npb25BdHRyaWJ1dGlvbigpO1xuICAgICAgdGhpcy50cmFjayhcIiRzZXNzaW9uX3N0YXJ0XCIsIGF0dHIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDb25maWcoY29uZmlnOiBTREtDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmZsYWdNYW5hZ2VyLnNldEV2YWx1YXRlZEZsYWdzKGNvbmZpZy5mbGFncyk7XG4gICAgdGhpcy5leHBlcmltZW50TWFuYWdlci5zZXRBc3NpZ25tZW50cyhjb25maWcuZXhwZXJpbWVudHMpO1xuICAgIHRoaXMubG9nLmRlYnVnKFwiQ29uZmlnIGFwcGxpZWRcIiwge1xuICAgICAgZmxhZ3M6IE9iamVjdC5rZXlzKGNvbmZpZy5mbGFncykubGVuZ3RoLFxuICAgICAgZXhwZXJpbWVudHM6IE9iamVjdC5rZXlzKGNvbmZpZy5leHBlcmltZW50cykubGVuZ3RoLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb3N0SWRlbnRpdHlSZXNvbHZlKHVzZXJJZDogc3RyaW5nLCBfcHJldmlvdXNVc2VySWQ6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXZpY2VJZCA9IGdldERldmljZUlkKCk7XG4gICAgaWYgKCFkZXZpY2VJZCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgYCR7dGhpcy5jZmcuYXBpVXJsfS92MS9kZXZpY2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRldmljZUlkKX0vaWRlbnRpZnlgLFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY2ZnLmFwaUtleX1gLFxuICAgICAgICAgIFwiWC1FbnZpcm9ubWVudFwiOiB0aGlzLmNmZy5lbnZpcm9ubWVudCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1c2VyX2lkOiB1c2VySWQgfSksXG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSWRlbnRpdHkgcmVzb2x2ZSBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFdmVudE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIltHb2FUZWNoXSBFdmVudCBuYW1lIG11c3Qgbm90IGJlIGVtcHR5LlwiKTtcbiAgfVxuICBjb25zdCB0cmltbWVkID0gbmFtZS50cmltKCkuc2xpY2UoMCwgRVZFTlRfTkFNRV9NQVhfTEVOR1RIKTtcbiAgcmV0dXJuIHRyaW1tZWQucmVwbGFjZSgvXFxzKy9nLCBcIl9cIik7XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIEJvb3RFcnJvclNjcmlwdE9wdGlvbnMge1xuICAvKipcbiAgICogVVJMIHRoZSB1bHRyYS1lYXJseSBlcnJvciBzY3JpcHQgcG9zdHMgdG8uIE11c3QgYmUgc2FtZS1vcmlnaW4gcmVsYXRpdmVcbiAgICogKGUuZy4gXCIvYXBpL2xvZy1ib290LWVycm9yXCIpIHNvIGBuYXZpZ2F0b3Iuc2VuZEJlYWNvbmAgd29ya3Mgb24gcGFnZSB1bmxvYWQuXG4gICAqIEN1c3RvbWVycyB3aXJlIGEgY29ycmVzcG9uZGluZyBzZXJ2ZXIgcm91dGUgdGhhdCBmb3J3YXJkcyB0byBHb2FUZWNoIG9yXG4gICAqIGxvZ3MgdG8gdGhlaXIgaW5mcmEuIChTZWUgUkVBRE1FIGZvciBhIE5leHQuanMgZXhhbXBsZS4pXG4gICAqL1xuICBlbmRwb2ludDogc3RyaW5nO1xuICAvKiogU3RhY2stdHJhY2UgbGVuZ3RoIGNhcCBpbiBjaGFycy4gRGVmYXVsdDogNDA5Ni4gKi9cbiAgc3RhY2tMaW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIElJRkUgc3RyaW5nIHRvIGlubGluZSBpbiBgPGhlYWQ+YCBCRUZPUkUgYW55IGJ1bmRsZSBsb2Fkcy5cbiAqIENhcHR1cmVzIGVycm9ycyB0aGF0IGhhcHBlbiBiZWZvcmUgUmVhY3QgLyB0aGUgU0RLIGh5ZHJhdGVzIOKAlCBhIHJlbmRlclxuICogY3Jhc2ggaW4gdGhhdCB3aW5kb3cgbmV2ZXIgcmVhY2hlcyB0aGUgbm9ybWFsIGV2ZW50IHBpcGVsaW5lLlxuICpcbiAqIFVzYWdlIChOZXh0LmpzIEFwcCBSb3V0ZXIpOlxuICpcbiAqICAgaW1wb3J0IHsgZ2V0Qm9vdEVycm9yU2NyaXB0IH0gZnJvbSBcIkBnb2F0ZWNoL3Nkay1qcy9ib290LWVycm9yXCI7XG4gKiAgIC4uLlxuICogICA8aGVhZD5cbiAqICAgICA8c2NyaXB0IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogZ2V0Qm9vdEVycm9yU2NyaXB0KHsgZW5kcG9pbnQ6IFwiL2FwaS9sb2ctYm9vdC1lcnJvclwiIH0pIH19IC8+XG4gKiAgIDwvaGVhZD5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb3RFcnJvclNjcmlwdChvcHRpb25zOiBCb290RXJyb3JTY3JpcHRPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgZW5kcG9pbnQgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmVuZHBvaW50KTtcbiAgY29uc3Qgc3RhY2tMaW1pdCA9IG9wdGlvbnMuc3RhY2tMaW1pdCA/PyA0MDk2O1xuICByZXR1cm4gYChmdW5jdGlvbigpe1xuICBmdW5jdGlvbiBwb3N0KHApe1xuICAgIHRyeSB7XG4gICAgICB2YXIgZCA9IEpTT04uc3RyaW5naWZ5KHApO1xuICAgICAgaWYgKG5hdmlnYXRvci5zZW5kQmVhY29uKSB7XG4gICAgICAgIG5hdmlnYXRvci5zZW5kQmVhY29uKCR7ZW5kcG9pbnR9LCBuZXcgQmxvYihbZF0se3R5cGU6XCJhcHBsaWNhdGlvbi9qc29uXCJ9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmZXRjaCgke2VuZHBvaW50fSx7bWV0aG9kOlwiUE9TVFwiLGJvZHk6ZCxrZWVwYWxpdmU6dHJ1ZSxoZWFkZXJzOntcIkNvbnRlbnQtVHlwZVwiOlwiYXBwbGljYXRpb24vanNvblwifX0pLmNhdGNoKGZ1bmN0aW9uKCl7fSk7XG4gICAgICB9XG4gICAgfSBjYXRjaChlKXt9XG4gIH1cbiAgZnVuY3Rpb24gYmFzZShyKXtcbiAgICByZXR1cm4ge3JlYXNvbjpyLHVhOm5hdmlnYXRvci51c2VyQWdlbnQsdXJsOmxvY2F0aW9uLmhyZWYsdHM6RGF0ZS5ub3coKSxwYXRobmFtZTpsb2NhdGlvbi5wYXRobmFtZX07XG4gIH1cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLGZ1bmN0aW9uKGUpe1xuICAgIHZhciBwPWJhc2UoXCJ1bmNhdWdodF9lcnJvclwiKTtcbiAgICBwLm1lc3NhZ2U9ZSYmZS5tZXNzYWdlP1N0cmluZyhlLm1lc3NhZ2UpOlwiKG5vIG1lc3NhZ2UpXCI7XG4gICAgcC5zb3VyY2U9ZSYmZS5maWxlbmFtZT9TdHJpbmcoZS5maWxlbmFtZSk6bnVsbDtcbiAgICBwLmxpbmU9ZSYmdHlwZW9mIGUubGluZW5vPT09XCJudW1iZXJcIj9lLmxpbmVubzpudWxsO1xuICAgIHAuY29sPWUmJnR5cGVvZiBlLmNvbG5vPT09XCJudW1iZXJcIj9lLmNvbG5vOm51bGw7XG4gICAgcC5zdGFjaz1lJiZlLmVycm9yJiZlLmVycm9yLnN0YWNrP1N0cmluZyhlLmVycm9yLnN0YWNrKS5zbGljZSgwLCR7c3RhY2tMaW1pdH0pOm51bGw7XG4gICAgcG9zdChwKTtcbiAgfSk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidW5oYW5kbGVkcmVqZWN0aW9uXCIsZnVuY3Rpb24oZSl7XG4gICAgdmFyIHA9YmFzZShcInVuaGFuZGxlZF9yZWplY3Rpb25cIik7XG4gICAgdmFyIHI9ZSYmZS5yZWFzb247XG4gICAgcC5tZXNzYWdlPXImJnIubWVzc2FnZT9TdHJpbmcoci5tZXNzYWdlKTpTdHJpbmcocik7XG4gICAgcC5zdGFjaz1yJiZyLnN0YWNrP1N0cmluZyhyLnN0YWNrKS5zbGljZSgwLCR7c3RhY2tMaW1pdH0pOm51bGw7XG4gICAgcG9zdChwKTtcbiAgfSk7XG59KSgpO2A7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdEVycm9yUGF5bG9hZCB7XG4gIHJlYXNvbjogXCJ1bmNhdWdodF9lcnJvclwiIHwgXCJ1bmhhbmRsZWRfcmVqZWN0aW9uXCI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc291cmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgbGluZT86IG51bWJlciB8IG51bGw7XG4gIGNvbD86IG51bWJlciB8IG51bGw7XG4gIHN0YWNrPzogc3RyaW5nIHwgbnVsbDtcbiAgdWE6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHBhdGhuYW1lOiBzdHJpbmc7XG4gIHRzOiBudW1iZXI7XG59XG4iXX0=
|
|
19
|
+
});
|