@arena-im/react-sdk-auth 1.13.0-dev.1 → 1.13.0-dev.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"anonymous-token-provider.d.ts","sourceRoot":"","sources":["../../src/context/anonymous-token-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAKzC,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,mBAoBA"}
1
+ {"version":3,"file":"anonymous-token-provider.d.ts","sourceRoot":"","sources":["../../src/context/anonymous-token-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AASjD,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,mBA8CA"}
package/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import{createContext as n,useContext as o,useState as r,useRef as i,useEffect as s,useCallback as a}from"react";import{useMutation as u,QueryClient as c,QueryClientProvider as l}from"@tanstack/react-query";import{create as d}from"zustand";import{subscribeWithSelector as k}from"zustand/middleware";import p from"js-cookie";import{jwtDecode as m}from"jwt-decode";const T=n(void 0),h=({children:t})=>{const[n,o]=r(!1),[i,s]=r(void 0),[a,u]=r(void 0),[c,l]=r(void 0),[d,k]=r(void 0),[p,m]=r(void 0);return e(T.Provider,{value:{isOpen:n,appName:i,language:p,appDescription:a,trackOptions:d,onAuthCompleted:c,openDialog:({trackOptions:e,appName:t,language:n,appDescription:r,onAuthCompleted:i})=>{o(!0),k(e),s(t),m(n),u(r),l(i)},closeDialog:()=>o(!1),onOpenChange:e=>o(e)},children:t})},f=()=>{const e=o(T);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e},g=e=>{const t="development"===e;return{profileServiceUrl:t?"https://profile-service-dev.arena.im":"https://profile-service-prd.arena.im",identityServiceUrl:t?"https://token-service-dev.arena.im":"https://token-service-prd.arena.im",refreshTokenApiKey:t?"AIzaSyCJhWFCK3ics9kJ2eSgQD7kWHUsOsJyPdk":"AIzaSyD_a4tNVdFVqgGbTfOGCaZ5pvUHErcE79c",authIframeUrl:t?"https://auth2.dev.arena.im":"https://auth2.arena.im",environment:e,debug:"development"===e}},y=n(void 0),U=({children:t,environment:n="development"})=>{const o=g(n);return e(y.Provider,{value:{config:o,environment:n},children:t})},S=()=>{const e=o(y);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},v={"Content-Type":"application/json"};async function I(e,t,n={}){const o=await fetch(t,{...n,method:e,headers:{"Content-Type":"application/json",...n.headers}});if(!o.ok)throw new Error(`Error: ${o.statusText}`);return o.json()}var w,_;!function(e){e.ANONYMOUS="anonymous",e.GUEST="guest",e.PUBLIC="public",e.CUSTOM="custom"}(w||(w={})),function(e){e.PUBLIC_ID_TOKEN="arena-auth-public-id-token",e.PUBLIC_REFRESH_TOKEN="arena-auth-public-refresh-token",e.ANONYMOUS_ID_TOKEN="arena-auth-anonymous-id-token",e.GUEST_ID_TOKEN="arena-auth-guest-id-token",e.CUSTOM_ID_TOKEN="arena-auth-custom-id-token",e.CUSTOM_USER="arena-auth-custom-user"}(_||(_={}));const O="arena-auth-token-updated";function P(e,t){document.dispatchEvent(new CustomEvent(O,{detail:{...t,type:e}}))}const E={public:{idToken:p.get(_.PUBLIC_ID_TOKEN)||null,refreshToken:p.get(_.PUBLIC_REFRESH_TOKEN)||null},anonymous:{idToken:p.get(_.ANONYMOUS_ID_TOKEN)||null},guest:{idToken:p.get(_.GUEST_ID_TOKEN)||null},custom:{idToken:p.get(_.CUSTOM_ID_TOKEN)||null}},C=d()(k((e,t)=>{const n=(n,o,r=!0,i)=>{n===t().tokens.public.idToken&&o===t().tokens.public.refreshToken||(e(e=>({tokens:{...e.tokens,public:{idToken:n,refreshToken:o}}})),p.set(_.PUBLIC_ID_TOKEN,n,{expires:1/24}),p.set(_.PUBLIC_REFRESH_TOKEN,o,{expires:30}),r&&P(w.PUBLIC,{idToken:n,refreshToken:o,source:i}))},o=(n,o=!0,r)=>{n!==t().tokens.anonymous.idToken&&(e(e=>({tokens:{...e.tokens,anonymous:{idToken:n}}})),p.set(_.ANONYMOUS_ID_TOKEN,n,{expires:1/24}),o&&P(w.ANONYMOUS,{idToken:n,source:r}))},r=(n,o=!0,r)=>{n!==t().tokens.guest.idToken&&(e(e=>({tokens:{...e.tokens,guest:{idToken:n}}})),p.set(_.GUEST_ID_TOKEN,n,{expires:1/24}),o&&P(w.GUEST,{idToken:n,source:r}))},i=(n,o=!0,r)=>{n!==t().tokens.custom.idToken&&(e(e=>({tokens:{...e.tokens,custom:{idToken:n}}})),p.set(_.CUSTOM_ID_TOKEN,n),o&&P(w.CUSTOM,{idToken:n,source:r}))},s=(t=!0,n)=>{p.remove(_.PUBLIC_ID_TOKEN),p.remove(_.PUBLIC_REFRESH_TOKEN),e(e=>({tokens:{...e.tokens,public:{idToken:null,refreshToken:null}}})),t&&P(w.PUBLIC,{idToken:null,source:n})},a=(t=!0,n)=>{p.remove(_.ANONYMOUS_ID_TOKEN),e(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),t&&P(w.ANONYMOUS,{idToken:null,source:n})},u=(t=!0,n)=>{p.remove(_.GUEST_ID_TOKEN),e(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),t&&P(w.GUEST,{idToken:null,source:n})},c=(t=!0,n)=>{p.remove(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_USER),e(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),t&&P(w.CUSTOM,{idToken:null,source:n})};return{tokens:E,getToken:e=>t().tokens[e]?.idToken||null,getMostPrivilegedToken:(e=[w.PUBLIC,w.GUEST,w.ANONYMOUS])=>t().tokens.custom.idToken&&e.includes(w.CUSTOM)?{type:w.CUSTOM,idToken:t().tokens.custom.idToken}:t().tokens.public.idToken&&e.includes(w.PUBLIC)?{type:w.PUBLIC,idToken:t().tokens.public.idToken}:t().tokens.guest.idToken&&e.includes(w.GUEST)?{type:w.GUEST,idToken:t().tokens.guest.idToken}:t().tokens.anonymous.idToken&&e.includes(w.ANONYMOUS)?{type:w.ANONYMOUS,idToken:t().tokens.anonymous.idToken}:null,getRefreshToken:e=>t().tokens[e]?.refreshToken||null,updatePublicTokens:(e,t,o)=>{n(e,t,!0,o)},updateAnonymousToken:(e,t)=>{o(e,!0,t)},updateGuestTokens:(e,t)=>{r(e,!0,t)},updateCustomToken:(e,t)=>{i(e,!0,t)},clearTokens:e=>{s(!0,e),a(!0,e),u(!0,e),c(!0,e)},clearPublicTokens:e=>{s(!0,e)},clearAnonymousTokens:e=>{a(!0,e)},clearGuestTokens:e=>{u(!0,e)},clearCustomTokens:e=>{c(!0,e)},silentUpdatePublicTokens:(e,t)=>{n(e,t,!1)},silentUpdateAnonymousToken:e=>{o(e,!1)},silentUpdateGuestTokens:e=>{r(e,!1)},silentUpdateCustomToken:e=>{i(e,!1)},silentClearPublicTokens:()=>{s(!1)},silentClearAnonymousTokens:()=>{a(!1)},silentClearGuestTokens:()=>{u(!1)},silentClearCustomTokens:()=>{c(!1)}}}));function N(){const e=C(e=>e.silentUpdatePublicTokens),t=C(e=>e.silentUpdateAnonymousToken),n=C(e=>e.silentUpdateGuestTokens),o=C(e=>e.silentUpdateCustomToken),r=C(e=>e.clearTokens),a=C(e=>e.silentClearPublicTokens),u=C(e=>e.silentClearAnonymousTokens),c=C(e=>e.silentClearGuestTokens),l=C(e=>e.silentClearCustomTokens),d=i(`widget-${Math.random().toString(36).substr(2,9)}`);return s(()=>{const r=r=>{const{idToken:i,refreshToken:s,type:k,source:p}=r.detail;if(p!==d.current)switch(k){case w.PUBLIC:if(i){if(!s)throw new Error("Refresh token is required for public tokens");e(i,s)}else a();break;case w.ANONYMOUS:i?t(i):u();break;case w.GUEST:i?n(i):c();break;case w.CUSTOM:i?o(i):l()}};return document.addEventListener(O,r),()=>{document.removeEventListener(O,r)}},[e,t,n,o,r,a,u,c,l]),{eventSource:d.current}}function b(){const e=C(e=>e.getToken),t=C(e=>e.getMostPrivilegedToken),n=C(e=>e.getRefreshToken),o=C(e=>e.updatePublicTokens),r=C(e=>e.updateAnonymousToken),i=C(e=>e.updateGuestTokens),s=C(e=>e.updateCustomToken),a=C(e=>e.clearTokens),u=C(e=>e.clearPublicTokens),c=C(e=>e.clearCustomTokens),{eventSource:l}=N();return{getToken:e,getMostPrivilegedToken:t,getRefreshToken:n,updatePublicTokens:(e,t)=>o(e,t,l),updateAnonymousToken:e=>r(e,l),updateGuestTokens:e=>i(e,l),updateCustomToken:e=>s(e,l),clearTokens:()=>a(l),clearPublicTokens:()=>u(l),clearCustomTokens:()=>c(l)}}function A(e){return C(t=>t.tokens[e])}function x(e){return C(t=>t.tokens[e]?.idToken)}function L(e){return C(t=>t.tokens[e]?.refreshToken)}var D,R;function K(){const e=A(w.PUBLIC),{refreshPublicTokens:t}=F(),{config:n}=S(),o=n.profileServiceUrl;return{getPublicProfile:async function(e){const t=`${o}/public/users/${e}/profile?fields=bio,photoURL,displayName,location,handle`;return await I("GET",t)},updatePublicProfile:async function(r){const i=`${o}/me/profile/personal`;await async function(e){const{method:t,url:n,options:o={},token:r}=e;if(!r)throw new Error("No authentication token found");const i={...v,...o.headers,Authorization:`Bearer ${r}`},s={...o,method:t,headers:i},a=await fetch(n,s);if(!a.ok){const e=await a.text();if(!e)throw new Error(`Error to process request - ${a.status}`);const{errors:t}=JSON.parse(e)||{};throw new Error(t?.[0]||"Internal server error")}const u=a.headers.get("content-type");if(!u||!u.includes("application/json"))return a;const c=await a.text();if(!c)return null;try{return JSON.parse(c)}catch(e){throw console.error(e),new Error("Invalid JSON response from server")}}({method:"PUT",url:i,options:{body:JSON.stringify(r)},token:e.idToken}),t({refreshTokenApiKey:n.refreshTokenApiKey})}}}!function(e){e.AvatarProfile="avatar-profile",e.AvatarChat="avatar-chat",e.Comments="comments",e.GlobalProfile="global-profile",e.GroupChat="group-chat",e.Polls="polls",e.UniversalSnippet="universal-snippet"}(D||(D={})),function(e){e.AuthenticationCompleted="Authentication Completed",e.AuthenticationStarted="Authentication Started",e.AuthenticationViewed="Authentication Viewed"}(R||(R={}));const M=d()(k((e,t)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:t=>{e({user:t})},setPublicProfile:t=>{e({publicProfile:t})},setUserByTokenId:t=>{try{const n=m(t),o={uid:n.user_id,displayName:n.safeDisplayName,email:n.email,photoURL:n.safePhotoURL,handle:n.handle};e({user:o})}catch(e){console.error(e)}},logout:()=>{try{const t=C.getState();t.clearPublicTokens(),t.clearCustomTokens(),e({user:null}),document.dispatchEvent(new Event("arena-comments-logout"))}catch(e){console.error(e)}},refreshPublicTokens:async e=>{try{const n=p.get(_.PUBLIC_REFRESH_TOKEN);if(!n)throw new Error("No refresh token found");const o=`${"https://securetoken.googleapis.com/v1/token?key="}${e.refreshTokenApiKey}`,r=await fetch(o,{method:"POST",body:new URLSearchParams({refresh_token:n,grant_type:"refresh_token"})}),i=await r.json(),{setUserByTokenId:s}=t();s(i.id_token);C.getState().updatePublicTokens(i.id_token,i.refresh_token)}catch(e){console.error(e);const{logout:n}=t();n()}},loadStoredUser:async n=>{const o=p.get(_.PUBLIC_ID_TOKEN),r=p.get(_.PUBLIC_REFRESH_TOKEN),i=localStorage.getItem(_.CUSTOM_ID_TOKEN),s=localStorage.getItem(_.CUSTOM_USER);if(i&&s){const t=JSON.parse(s);e({user:t});C.getState().updateCustomToken(i)}else if(o){const{setUserByTokenId:e}=t();e(o)}else if(r&&n){const{refreshPublicTokens:e}=t();await e(n)}e({refreshedTokenLoaded:!0})},ssoV2Exchange:async(e,n,o)=>{try{const r=g(o??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,s=await I("POST",i,{body:JSON.stringify({signedUserData:n})});if(s){const e=m(s.token),{setUser:n,setPublicProfile:o}=t();n({uid:e?.sub,email:e?.email,displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle}),o({displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle});C.getState().updateCustomToken(s.token)}return s}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function B(){return M(e=>e.user)}function G(){return M(e=>e.publicProfile)}function $(){return M(e=>e.refreshedTokenLoaded)}function F(){return{setUser:M(e=>e.setUser),setPublicProfile:M(e=>e.setPublicProfile),logout:M(e=>e.logout),refreshPublicTokens:M(e=>e.refreshPublicTokens),setUserByTokenId:M(e=>e.setUserByTokenId),loadStoredUser:M(e=>e.loadStoredUser),ssoV2Exchange:M(e=>e.ssoV2Exchange)}}function J(){const{updatePublicProfile:e}=K();return{updatePublicProfile:e}}function Y(){return{user:M(e=>e.user),publicProfile:M(e=>e.publicProfile),refreshedTokenLoaded:M(e=>e.refreshedTokenLoaded)}}function j({children:e}){const{config:t}=S(),n=B(),{setPublicProfile:o,loadStoredUser:r}=F(),{getPublicProfile:i}=K(),{mutateAsync:c}=u({mutationFn:i}),l=a(async()=>{if(n?.uid){const e=await c(n.uid);o(e)}},[n?.uid,c,o]);return s(()=>{l()},[l]),s(()=>{r(t)},[t,r]),e}const H="arenaAnonymousId",V="rs_anonymous_id",z="rs_initial_referrer",q="rs_initial_referring_domain";function W(){const e=localStorage.getItem(V);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(V,t),t}function Z(e){const t={};return["utm_source","utm_medium","utm_campaign","utm_term","utm_content"].forEach(n=>{const o=e.searchParams.get(n);o&&(t[n]=o)}),Object.keys(t).length?t:void 0}function Q(){const e=window,t=document,n=window.screen,o=new URL(e.location.href);!function(){if(!localStorage.getItem(z)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(z,e),localStorage.setItem(q,t)}}();const r=localStorage.getItem(z)||"$direct",i=localStorage.getItem(q)||"";return{channel:"web",anonymousId:W(),locale:navigator.language,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,os:{name:navigator.platform,version:void 0},page:{path:o.pathname,referrer:t.referrer||"$direct",referring_domain:t.referrer?new URL(t.referrer).hostname:"",search:o.search,title:t.title,url:o.toString(),initial_referrer:r,initial_referring_domain:i},screen:{density:e.devicePixelRatio||1,height:n.height,width:n.width,innerHeight:e.innerHeight,innerWidth:e.innerWidth},campaign:Z(o)}}function X(e={}){const t={};e.userId&&(t.userId=e.userId);let n=null;try{n=localStorage.getItem(H)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(H,e.anonymousId)}catch(e){console.warn("Failed to save anonymousId to localStorage:",e)}}else if(n)t.anonymousId=n;else{const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)});t.anonymousId=e;try{localStorage.setItem(H,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function ee(){const e=document.querySelector('link[rel="canonical"]');return function(e){try{const t=new URL(e);return t.search="",t.href}catch(t){return console.error("Error clearing search params from URL:",t),e}}(e?.href||window.location.href)}function te(e,t,n){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:ee(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:Q(),timestamp:(new Date).toISOString(),integrations:{All:!0},...X(n)}}function ne(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function oe(e){return a((t,n,o)=>{if(!e)return;const r=(i=e.rsWriteKey,s=e.rsDataPlaneUrl,{page:async(e,t,n)=>{const o=await fetch(`${s}/v1/page`,{method:"POST",headers:ne(i),body:JSON.stringify({type:"page",...te(e,t,n)})});if(o.ok)return await o.text();throw new Error("Failed to send page event to Rudderstack")},track:async(e,t,n,o)=>{const r=await fetch(`${s}/v1/track`,{method:"POST",headers:ne(i),body:JSON.stringify({event:t,type:"track",...te(e,n,o)})});if(r.ok)return await r.text();throw new Error("Failed to send track event to Rudderstack")}});var i,s;const a={site_id:e.siteId,widget_id:e.widgetId,trigger:e.trigger,...o};r.track(e.widgetType,t,a,n?{userId:n}:void 0)},[e])}function re(){const{appName:t,appDescription:n,language:o,trackOptions:r,isOpen:i,closeDialog:a,onAuthCompleted:u}=f(),c=t||"Arena AI Chat",l=n||"Arena AI Chat",{setUser:d}=F(),{updatePublicTokens:k}=b(),{config:p}=S(),m=oe(r),T=`${p.authIframeUrl}/?app-name=${c}&app-description=${l}&language=${o??"en"}`;return s(()=>{const e=e=>{if("arena-authentication"===e.data?.source)if("canceled"!==e.data?.type)if("authentication-viewed"!==e.data?.type){if("authentication-started"===e.data?.type){const{authType:t}=e.data?.payload||{};return void m(R.AuthenticationStarted,void 0,{authType:t})}if("authentication-completed"===e.data?.type){const{idToken:t,refreshToken:n,user:o,authType:r,isSignup:i}=e.data?.payload||{};return o?(m(R.AuthenticationCompleted,o.uid,{is_signup:i,auth_type:r}),u?.(o),k(t,n),d(o),void a()):void console.error("Authentication completed but user data is missing")}}else m(R.AuthenticationViewed);else a()};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[d,k,u,m,a]),i?e("iframe",{src:T,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function ie({children:e}){const t=C(e=>e.tokens),n=C(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:o}=function(){const{config:e}=S(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`;return await I("POST",e)}}}();return s(()=>{t.anonymous.idToken||o().then(e=>{n(e.access_token)})},[t.anonymous.idToken,n,o]),e}function se({children:n,queryClient:o,environment:r}){return o=o||new c,e(l,{client:o,children:e(U,{environment:r,children:e(j,{children:e(h,{children:t(ie,{children:[n,e(re,{})]})})})})})}export{R as AnalyticsEvent,D as AnalyticsWidgetType,_ as AuthCookie,se as AuthProvider,w as TokenType,f as useAuthDialog,G as usePublicProfile,L as useRefreshToken,$ as useRefreshedTokenLoaded,A as useToken,N as useTokenEventListener,C as useTokenStore,x as useTokenValue,b as useTokens,J as useUpdateProfile,B as useUser,F as useUserActions,M as useUserStore,Y as useUserWithProfile};
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vc3JjL3R5cGVzL3Rva2VuLnRzIiwiLi4vc3JjL3V0aWxzL2RvbS1ldmVudHMudHMiLCIuLi9zcmMvc3RvcmVzL3Rva2VuLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lci50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW5zLnRzIiwiLi4vc3JjL3R5cGVzL2FuYWx5dGljcy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzLnRzIiwiLi4vc3JjL3N0b3Jlcy91c2VyLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS11c2VyLnRzIiwiLi4vc3JjL2NvbnRleHQvdXNlci1wcm92aWRlci50c3giLCIuLi9zcmMvdXRpbHMvYW5hbHl0aWNzLnRzIiwiLi4vc3JjL3V0aWxzL3VybC50cyIsIi4uL3NyYy9ob29rcy91c2UtdHJhY2sudHMiLCIuLi9zcmMvZGlhbG9nL2luZGV4LnRzeCIsIi4uL3NyYy9jb250ZXh0L2Fub255bW91cy10b2tlbi1wcm92aWRlci50c3giLCIuLi9zcmMvc2VydmljZXMvYXV0aC91c2UtYXV0aC1zZXJ2aWNlcy50cyIsIi4uL3NyYy9jb250ZXh0L2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0LCB1c2VTdGF0ZSwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVXNlclByb3BzIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBUcmFja09wdGlvbnMgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5pbnRlcmZhY2UgQXV0aERpYWxvZ0NvbnRleHRUeXBlIHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBhcHBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGFwcERlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBvbkF1dGhDb21wbGV0ZWQ6ICgodXNlcjogVXNlclByb3BzKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgb3BlbkRpYWxvZzogKG9wdGlvbnM6IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB2b2lkO1xuICBjbG9zZURpYWxvZzogKCkgPT4gdm9pZDtcbiAgb25PcGVuQ2hhbmdlOiAob3BlbjogYm9vbGVhbikgPT4gdm9pZDtcbn1cblxuY29uc3QgQXV0aERpYWxvZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PEF1dGhEaWFsb2dDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZFxuKTtcblxudHlwZSBPcGVuRGlhbG9nT3B0aW9ucyA9IHtcbiAgdHJhY2tPcHRpb25zOiBUcmFja09wdGlvbnM7XG4gIGFwcE5hbWU/OiBzdHJpbmc7XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBhcHBEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgb25BdXRoQ29tcGxldGVkPzogKCkgPT4gKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjb25zdCBBdXRoRGlhbG9nUHJvdmlkZXIgPSAoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdE5vZGUgfSkgPT4ge1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwTmFtZSwgc2V0QXBwTmFtZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFthcHBEZXNjcmlwdGlvbiwgc2V0QXBwRGVzY3JpcHRpb25dID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW29uQXV0aENvbXBsZXRlZCwgc2V0T25BdXRoQ29tcGxldGVkXSA9IHVzZVN0YXRlPFxuICAgICgodXNlcjogVXNlclByb3BzKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFt0cmFja09wdGlvbnMsIHNldFRyYWNrT3B0aW9uc10gPSB1c2VTdGF0ZTxUcmFja09wdGlvbnMgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBbbGFuZ3VhZ2UsIHNldExhbmd1YWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IG9wZW5EaWFsb2cgPSAoe1xuICAgIHRyYWNrT3B0aW9ucyxcbiAgICBhcHBOYW1lLFxuICAgIGxhbmd1YWdlLFxuICAgIGFwcERlc2NyaXB0aW9uLFxuICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgfTogT3BlbkRpYWxvZ09wdGlvbnMpID0+IHtcbiAgICBzZXRJc09wZW4odHJ1ZSk7XG4gICAgc2V0VHJhY2tPcHRpb25zKHRyYWNrT3B0aW9ucyk7XG4gICAgc2V0QXBwTmFtZShhcHBOYW1lKTtcbiAgICBzZXRMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgc2V0QXBwRGVzY3JpcHRpb24oYXBwRGVzY3JpcHRpb24pO1xuICAgIHNldE9uQXV0aENvbXBsZXRlZChvbkF1dGhDb21wbGV0ZWQpO1xuICB9O1xuXG4gIGNvbnN0IGNsb3NlRGlhbG9nID0gKCkgPT4gc2V0SXNPcGVuKGZhbHNlKTtcbiAgY29uc3Qgb25PcGVuQ2hhbmdlID0gKG9wZW46IGJvb2xlYW4pID0+IHNldElzT3BlbihvcGVuKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRoRGlhbG9nQ29udGV4dC5Qcm92aWRlclxuICAgICAgdmFsdWU9e3tcbiAgICAgICAgaXNPcGVuLFxuICAgICAgICBhcHBOYW1lLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgYXBwRGVzY3JpcHRpb24sXG4gICAgICAgIHRyYWNrT3B0aW9ucyxcbiAgICAgICAgb25BdXRoQ29tcGxldGVkLFxuICAgICAgICBvcGVuRGlhbG9nLFxuICAgICAgICBjbG9zZURpYWxvZyxcbiAgICAgICAgb25PcGVuQ2hhbmdlLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9BdXRoRGlhbG9nQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VBdXRoRGlhbG9nID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChBdXRoRGlhbG9nQ29udGV4dCk7XG4gIGlmICghY29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQXV0aERpYWxvZyBtdXN0IGJlIHVzZWQgd2l0aGluIGFuIEF1dGhEaWFsb2dQcm92aWRlcicpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgcHJvZmlsZVNlcnZpY2VVcmw6IHN0cmluZztcbiAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICBhdXRoSWZyYW1lVXJsOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuICBkZWJ1ZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnQgPSAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gKGVudmlyb25tZW50OiBFbnZpcm9ubWVudCk6IENvbmZpZyA9PiB7XG4gIGNvbnN0IGlzRGV2ID0gZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCc7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9maWxlU2VydmljZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLWRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9QUkQgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5JREVOVElUWV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vdG9rZW4tc2VydmljZS1kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LklERU5USVRZX1NFUlZJQ0VfVVJMX1BSRCB8fFxuICAgICAgICAnaHR0cHM6Ly90b2tlbi1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgcmVmcmVzaFRva2VuQXBpS2V5OiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5GSVJFQkFTRV9QVUJMSUNfQVBJX0tFWV9ERVYgfHxcbiAgICAgICAgJ0FJemFTeUNKaFdGQ0szaWNzOWtKMmVTZ1FEN2tXSFVzT3NKeVBkaydcbiAgICAgIDogcHJvY2Vzcy5lbnYuRklSRUJBU0VfUFVCTElDX0FQSV9LRVlfUFJEIHx8XG4gICAgICAgICdBSXphU3lELTl0U3JRV243M1MwcW02QnFFSDUtMTJIcThMMGVUc1EnLFxuICAgIGF1dGhJZnJhbWVVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LkFVVEhfSUZSQU1FX1VSTF9ERVYgfHwgJ2h0dHBzOi8vYXV0aDIuZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5BVVRIX0lGUkFNRV9VUkxfUFJEIHx8ICdodHRwczovL2F1dGgyLmFyZW5hLmltJyxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBkZWJ1ZzogZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCcsXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnLCBFbnZpcm9ubWVudCwgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcblxuaW50ZXJmYWNlIENvbmZpZ0NvbnRleHRUeXBlIHtcbiAgY29uZmlnOiBDb25maWc7XG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudDtcbn1cblxuY29uc3QgQ29uZmlnQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Q29uZmlnQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmludGVyZmFjZSBDb25maWdQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IENvbmZpZ1Byb3ZpZGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGVudmlyb25tZW50ID0gJ2RldmVsb3BtZW50Jyxcbn06IENvbmZpZ1Byb3ZpZGVyUHJvcHMpID0+IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKGVudmlyb25tZW50KTtcblxuICByZXR1cm4gKFxuICAgIDxDb25maWdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IGNvbmZpZywgZW52aXJvbm1lbnQgfX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9Db25maWdDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUNvbmZpZyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGlmICghY29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQ29uZmlnIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBDb25maWdQcm92aWRlcicpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcbiIsImNvbnN0IGRlZmF1bHRIZWFkZXJzID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QoXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fVxuKSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBtZXRob2QsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9LFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvcjogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlY3VyZWRSZXF1ZXN0KHBhcmFtczoge1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0O1xuICB0b2tlbjogc3RyaW5nO1xufSkge1xuICBjb25zdCB7IG1ldGhvZCwgdXJsLCBvcHRpb25zID0ge30sIHRva2VuIH0gPSBwYXJhbXM7XG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvdW5kJyk7XG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0ge1xuICAgIC4uLmRlZmF1bHRIZWFkZXJzLFxuICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgfTtcblxuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHBheWxvYWQpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB0byBwcm9jZXNzIHJlcXVlc3QgLSAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGVycm9ycyB9ID0gSlNPTi5wYXJzZSh0ZXh0KSB8fCB7fTtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcnM/LlswXSB8fCAnSW50ZXJuYWwgc2VydmVyIGVycm9yJztcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICBpZiAoIWNvbnRlbnRUeXBlIHx8ICFjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKU09OIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFRva2VuVHlwZSB7XG4gIEFOT05ZTU9VUyA9ICdhbm9ueW1vdXMnLFxuICBHVUVTVCA9ICdndWVzdCcsXG4gIFBVQkxJQyA9ICdwdWJsaWMnLFxuICBDVVNUT00gPSAnY3VzdG9tJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblBhaXIge1xuICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBUb2tlbnNNYXAgPSBSZWNvcmQ8VG9rZW5UeXBlLCBUb2tlblBhaXI+O1xuXG5leHBvcnQgZW51bSBBdXRoQ29va2llIHtcbiAgUFVCTElDX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtcHVibGljLWlkLXRva2VuJyxcbiAgUFVCTElDX1JFRlJFU0hfVE9LRU4gPSAnYXJlbmEtYXV0aC1wdWJsaWMtcmVmcmVzaC10b2tlbicsXG4gIEFOT05ZTU9VU19JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWFub255bW91cy1pZC10b2tlbicsXG4gIEdVRVNUX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtZ3Vlc3QtaWQtdG9rZW4nLFxuICBDVVNUT01fSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1jdXN0b20taWQtdG9rZW4nLFxuICBDVVNUT01fVVNFUiA9ICdhcmVuYS1hdXRoLWN1c3RvbS11c2VyJyxcbn1cbiIsImltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcblxuZXhwb3J0IGNvbnN0IFRPS0VOX1VQREFURURfRVZFTlQgPSAnYXJlbmEtYXV0aC10b2tlbi11cGRhdGVkJztcblxuaW50ZXJmYWNlIFRva2VuRXZlbnRQYXJhbXMge1xuICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICBzb3VyY2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFxuICB0eXBlOiBUb2tlblR5cGUsXG4gIHBhcmFtczogVG9rZW5FdmVudFBhcmFtc1xuKSB7XG4gIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgbmV3IEN1c3RvbUV2ZW50KFRPS0VOX1VQREFURURfRVZFTlQsIHtcbiAgICAgIGRldGFpbDogeyAuLi5wYXJhbXMsIHR5cGUgfSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnenVzdGFuZCc7XG5pbXBvcnQgeyBzdWJzY3JpYmVXaXRoU2VsZWN0b3IgfSBmcm9tICd6dXN0YW5kL21pZGRsZXdhcmUnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IEF1dGhDb29raWUsIFRva2Vuc01hcCwgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudCB9IGZyb20gJy4uL3V0aWxzL2RvbS1ldmVudHMnO1xuXG5pbnRlcmZhY2UgVG9rZW5TdG9yZSB7XG4gIHRva2VuczogVG9rZW5zTWFwO1xuICBnZXRUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbjogKFxuICAgIG9wdGlvbnM/OiBBcnJheTxUb2tlblR5cGU+XG4gICkgPT4geyB0eXBlOiBUb2tlblR5cGU7IGlkVG9rZW46IHN0cmluZyB9IHwgbnVsbDtcbiAgZ2V0UmVmcmVzaFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiBzdHJpbmcgfCBudWxsO1xuICB1cGRhdGVQdWJsaWNUb2tlbnM6IChcbiAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgc291cmNlPzogc3RyaW5nXG4gICkgPT4gdm9pZDtcbiAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyUHVibGljVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckFub255bW91c1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJHdWVzdFRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJDdXN0b21Ub2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZVB1YmxpY1Rva2VuczogKGlkVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyUHVibGljVG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckFub255bW91c1Rva2VuczogKCkgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJHdWVzdFRva2VuczogKCkgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGRlZmF1bHRUb2tlbnM6IFRva2Vuc01hcCA9IHtcbiAgcHVibGljOiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pIHx8IG51bGwsXG4gICAgcmVmcmVzaFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBhbm9ueW1vdXM6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLkFOT05ZTU9VU19JRF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbiAgZ3Vlc3Q6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLkdVRVNUX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBjdXN0b206IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VUb2tlblN0b3JlID0gY3JlYXRlPFRva2VuU3RvcmU+KCkoXG4gIHN1YnNjcmliZVdpdGhTZWxlY3Rvcigoc2V0LCBnZXQpID0+IHtcbiAgICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiAmJlxuICAgICAgICByZWZyZXNoVG9rZW4gPT09IGdldCgpLnRva2Vucy5wdWJsaWMucmVmcmVzaFRva2VuXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIHB1YmxpYzoge1xuICAgICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTiwgaWRUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAxIC8gMjQsXG4gICAgICB9KTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTiwgcmVmcmVzaFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDMwLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLlBVQkxJQywge1xuICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgcmVmcmVzaFRva2VuLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpZFRva2VuID09PSBnZXQoKS50b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGFub255bW91czoge1xuICAgICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLkFOT05ZTU9VU19JRF9UT0tFTiwgaWRUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAxIC8gMjQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQU5PTllNT1VTLCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBndWVzdDoge1xuICAgICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLkdVRVNUX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5HVUVTVCwgeyBpZFRva2VuLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpZFRva2VuID09PSBnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGN1c3RvbTogeyBpZFRva2VuIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOLCBpZFRva2VuKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQ1VTVE9NLCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pO1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgcHVibGljOiB7IGlkVG9rZW46IG51bGwsIHJlZnJlc2hUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5QVUJMSUMsIHsgaWRUb2tlbjogbnVsbCwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLkFOT05ZTU9VU19JRF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgYW5vbnltb3VzOiB7IGlkVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQU5PTllNT1VTLCB7XG4gICAgICAgICAgaWRUb2tlbjogbnVsbCxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckd1ZXN0VG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4pO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGd1ZXN0OiB7IGlkVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuR1VFU1QsIHsgaWRUb2tlbjogbnVsbCwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckN1c3RvbVRva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShBdXRoQ29va2llLkNVU1RPTV9VU0VSKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBjdXN0b206IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5DVVNUT00sIHsgaWRUb2tlbjogbnVsbCwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW5zOiBkZWZhdWx0VG9rZW5zLFxuXG4gICAgICBnZXRUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KCkudG9rZW5zW3R5cGVdPy5pZFRva2VuIHx8IG51bGw7XG4gICAgICB9LFxuXG4gICAgICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuOiAoXG4gICAgICAgIG9wdGlvbnMgPSBbVG9rZW5UeXBlLlBVQkxJQywgVG9rZW5UeXBlLkdVRVNULCBUb2tlblR5cGUuQU5PTllNT1VTXVxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4gJiYgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuQ1VTVE9NKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuQ1VTVE9NLFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLmN1c3RvbS5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4gJiYgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuUFVCTElDKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuUFVCTElDLFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5HVUVTVCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkdVRVNULFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbiAmJlxuICAgICAgICAgIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkFOT05ZTU9VUylcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5BTk9OWU1PVVMsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuXG4gICAgICBnZXRSZWZyZXNoVG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldCgpLnRva2Vuc1t0eXBlXT8ucmVmcmVzaFRva2VuIHx8IG51bGw7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVQdWJsaWNUb2tlbnM6IChcbiAgICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgICApID0+IHtcbiAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zSGVscGVyKGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIoaWRUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIoaWRUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIoaWRUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyUHVibGljVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckFub255bW91c1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJHdWVzdFRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhckd1ZXN0VG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckN1c3RvbVRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlcihpZFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlcihpZFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlcihpZFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhclB1YmxpY1Rva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckFub255bW91c1Rva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckd1ZXN0VG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcbiAgICB9O1xuICB9KVxuKTtcbiIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyBUT0tFTl9VUERBVEVEX0VWRU5UIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWV2ZW50cyc7XG5cbmludGVyZmFjZSBUb2tlblVwZGF0ZUV2ZW50IHtcbiAgZGV0YWlsOiB7XG4gICAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIHR5cGU6IFRva2VuVHlwZTtcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbkV2ZW50TGlzdGVuZXIoKSB7XG4gIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlUHVibGljVG9rZW5zXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB1cGRhdGVHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlR3Vlc3RUb2tlbnNcbiAgKTtcbiAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUN1c3RvbVRva2VuXG4gICk7XG4gIGNvbnN0IGNsZWFyVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhclRva2Vucyk7XG4gIGNvbnN0IGNsZWFyUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhclB1YmxpY1Rva2Vuc1xuICApO1xuICBjb25zdCBjbGVhckFub255bW91c1Rva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnNcbiAgKTtcbiAgY29uc3QgY2xlYXJHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJHdWVzdFRva2Vucyk7XG4gIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckN1c3RvbVRva2Vuc1xuICApO1xuXG4gIGNvbnN0IGV2ZW50U291cmNlUmVmID0gdXNlUmVmPHN0cmluZz4oXG4gICAgYHdpZGdldC0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVUb2tlblVwZGF0ZSA9IChcbiAgICAgIGV2ZW50OiBDdXN0b21FdmVudDxUb2tlblVwZGF0ZUV2ZW50WydkZXRhaWwnXT5cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB0eXBlLCBzb3VyY2UgfSA9IGV2ZW50LmRldGFpbDtcblxuICAgICAgaWYgKHNvdXJjZSA9PT0gZXZlbnRTb3VyY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFRva2VuVHlwZS5QVUJMSUM6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVmcmVzaCB0b2tlbiBpcyByZXF1aXJlZCBmb3IgcHVibGljIHRva2VucycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zKGlkVG9rZW4sIHJlZnJlc2hUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyUHVibGljVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkFOT05ZTU9VUzpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4oaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkdVRVNUOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVHdWVzdFRva2VucyhpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJHdWVzdFRva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRva2VuVHlwZS5DVVNUT006XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckN1c3RvbVRva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFRPS0VOX1VQREFURURfRVZFTlQsXG4gICAgICBoYW5kbGVUb2tlblVwZGF0ZSBhcyBFdmVudExpc3RlbmVyXG4gICAgKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBUT0tFTl9VUERBVEVEX0VWRU5ULFxuICAgICAgICBoYW5kbGVUb2tlblVwZGF0ZSBhcyBFdmVudExpc3RlbmVyXG4gICAgICApO1xuICAgIH07XG4gIH0sIFtcbiAgICB1cGRhdGVQdWJsaWNUb2tlbnMsXG4gICAgdXBkYXRlQW5vbnltb3VzVG9rZW4sXG4gICAgdXBkYXRlR3Vlc3RUb2tlbnMsXG4gICAgdXBkYXRlQ3VzdG9tVG9rZW4sXG4gICAgY2xlYXJUb2tlbnMsXG4gICAgY2xlYXJQdWJsaWNUb2tlbnMsXG4gICAgY2xlYXJBbm9ueW1vdXNUb2tlbnMsXG4gICAgY2xlYXJHdWVzdFRva2VucyxcbiAgICBjbGVhckN1c3RvbVRva2VucyxcbiAgXSk7XG5cbiAgcmV0dXJuIHtcbiAgICBldmVudFNvdXJjZTogZXZlbnRTb3VyY2VSZWYuY3VycmVudCxcbiAgfTtcbn1cbiIsImltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgdXNlVG9rZW5FdmVudExpc3RlbmVyIH0gZnJvbSAnLi91c2UtdG9rZW4tZXZlbnQtbGlzdGVuZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5zKCkge1xuICBjb25zdCBnZXRUb2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuZ2V0VG9rZW4pO1xuICBjb25zdCBnZXRNb3N0UHJpdmlsZWdlZFRva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5nZXRNb3N0UHJpdmlsZWdlZFRva2VuXG4gICk7XG4gIGNvbnN0IGdldFJlZnJlc2hUb2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuZ2V0UmVmcmVzaFRva2VuKTtcbiAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS51cGRhdGVQdWJsaWNUb2tlbnMpO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUudXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgdXBkYXRlR3Vlc3RUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZUd1ZXN0VG9rZW5zKTtcbiAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW4gPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZUN1c3RvbVRva2VuKTtcbiAgY29uc3QgY2xlYXJUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyUHVibGljVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyQ3VzdG9tVG9rZW5zKTtcblxuICBjb25zdCB7IGV2ZW50U291cmNlIH0gPSB1c2VUb2tlbkV2ZW50TGlzdGVuZXIoKTtcblxuICByZXR1cm4ge1xuICAgIGdldFRva2VuLFxuICAgIGdldE1vc3RQcml2aWxlZ2VkVG9rZW4sXG4gICAgZ2V0UmVmcmVzaFRva2VuLFxuICAgIHVwZGF0ZVB1YmxpY1Rva2VuczogKGlkVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbihpZFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVHdWVzdFRva2VucyhpZFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVDdXN0b21Ub2tlbihpZFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgY2xlYXJUb2tlbnM6ICgpID0+IGNsZWFyVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgICBjbGVhclB1YmxpY1Rva2VuczogKCkgPT4gY2xlYXJQdWJsaWNUb2tlbnMoZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyQ3VzdG9tVG9rZW5zOiAoKSA9PiBjbGVhckN1c3RvbVRva2VucyhldmVudFNvdXJjZSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbih0eXBlOiAnYW5vbnltb3VzJyB8ICdndWVzdCcgfCAncHVibGljJyB8ICdjdXN0b20nKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlblZhbHVlKFxuICB0eXBlOiAnYW5vbnltb3VzJyB8ICdndWVzdCcgfCAncHVibGljJyB8ICdjdXN0b20nXG4pIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdPy5pZFRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZnJlc2hUb2tlbih0eXBlOiAnYW5vbnltb3VzJyB8ICdndWVzdCcgfCAncHVibGljJykge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0/LnJlZnJlc2hUb2tlbik7XG59XG4iLCJ0eXBlIE51bGxhYmxlPFQ+ID0gVCB8IG51bGw7XG5cbmV4cG9ydCBlbnVtIEFuYWx5dGljc1dpZGdldFR5cGUge1xuICBBdmF0YXJQcm9maWxlID0gJ2F2YXRhci1wcm9maWxlJyxcbiAgQXZhdGFyQ2hhdCA9ICdhdmF0YXItY2hhdCcsXG4gIENvbW1lbnRzID0gJ2NvbW1lbnRzJyxcbiAgR2xvYmFsUHJvZmlsZSA9ICdnbG9iYWwtcHJvZmlsZScsXG4gIEdyb3VwQ2hhdCA9ICdncm91cC1jaGF0JyxcbiAgUG9sbHMgPSAncG9sbHMnLFxuICBVbml2ZXJzYWxTbmlwcGV0ID0gJ3VuaXZlcnNhbC1zbmlwcGV0Jyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tPcHRpb25zID0ge1xuICB3aWRnZXRJZDogc3RyaW5nIHwgbnVsbDtcbiAgd2lkZ2V0VHlwZTogQW5hbHl0aWNzV2lkZ2V0VHlwZTtcbiAgc2l0ZUlkOiBzdHJpbmc7XG4gIHJzV3JpdGVLZXk6IHN0cmluZztcbiAgcnNEYXRhUGxhbmVVcmw6IHN0cmluZztcbiAgdHJpZ2dlcjogc3RyaW5nO1xufTtcblxuZXhwb3J0IGVudW0gQW5hbHl0aWNzRXZlbnQge1xuICBBdXRoZW50aWNhdGlvbkNvbXBsZXRlZCA9ICdBdXRoZW50aWNhdGlvbiBDb21wbGV0ZWQnLFxuICBBdXRoZW50aWNhdGlvblN0YXJ0ZWQgPSAnQXV0aGVudGljYXRpb24gU3RhcnRlZCcsXG4gIEF1dGhlbnRpY2F0aW9uVmlld2VkID0gJ0F1dGhlbnRpY2F0aW9uIFZpZXdlZCcsXG59XG5cbmV4cG9ydCB0eXBlIFRyYWNrUHJvcHMgPSBOdWxsYWJsZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlQcm9wcyB7XG4gIGFub255bW91c0lkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVkZGVyQ29udGV4dCB7XG4gIGNoYW5uZWw6ICd3ZWInO1xuICBhbm9ueW1vdXNJZD86IHN0cmluZztcbiAgbG9jYWxlPzogc3RyaW5nO1xuICB1c2VyQWdlbnQ/OiBzdHJpbmc7XG4gIHRpbWV6b25lPzogc3RyaW5nO1xuICBvcz86IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH07XG4gIHBhZ2U/OiB7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICByZWZlcnJlcj86IHN0cmluZztcbiAgICByZWZlcnJpbmdfZG9tYWluPzogc3RyaW5nO1xuICAgIHNlYXJjaD86IHN0cmluZztcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgaW5pdGlhbF9yZWZlcnJlcj86IHN0cmluZztcbiAgICBpbml0aWFsX3JlZmVycmluZ19kb21haW4/OiBzdHJpbmc7XG4gIH07XG4gIHNjcmVlbj86IHtcbiAgICBkZW5zaXR5PzogbnVtYmVyO1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBpbm5lckhlaWdodD86IG51bWJlcjtcbiAgICBpbm5lcldpZHRoPzogbnVtYmVyO1xuICB9O1xuICBjYW1wYWlnbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG4iLCJpbXBvcnQgeyBQdWJsaWNQcm9maWxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyByZXF1ZXN0LCBzZWN1cmVkUmVxdWVzdCB9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi8uLi9ob29rcy91c2UtdG9rZW5zJztcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IHVzZVVzZXJBY3Rpb25zIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLXVzZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHJvZmlsZVNlcnZpY2VzKCkge1xuICBjb25zdCB0b2tlbiA9IHVzZVRva2VuKFRva2VuVHlwZS5QVUJMSUMpO1xuICBjb25zdCB7IHJlZnJlc2hQdWJsaWNUb2tlbnMgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgcHJvZmlsZVVybCA9IGNvbmZpZy5wcm9maWxlU2VydmljZVVybDtcblxuICBhc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNQcm9maWxlKHVzZXJJZD86IHN0cmluZyk6IFByb21pc2U8UHVibGljUHJvZmlsZT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9ICdiaW8scGhvdG9VUkwsZGlzcGxheU5hbWUsbG9jYXRpb24saGFuZGxlJztcbiAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9wdWJsaWMvdXNlcnMvJHt1c2VySWR9L3Byb2ZpbGU/ZmllbGRzPSR7ZmllbGRzfWA7XG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVQdWJsaWNQcm9maWxlKFxuICAgIHBhcmFtczogT21pdDxQdWJsaWNQcm9maWxlLCAnbWV0YWRhdGEnPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9tZS9wcm9maWxlL3BlcnNvbmFsYDtcbiAgICBhd2FpdCBzZWN1cmVkUmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgdXJsLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXJhbXMpLFxuICAgICAgfSxcbiAgICAgIHRva2VuOiB0b2tlbi5pZFRva2VuISxcbiAgICB9KTtcbiAgICByZWZyZXNoUHVibGljVG9rZW5zKHsgcmVmcmVzaFRva2VuQXBpS2V5OiBjb25maWcucmVmcmVzaFRva2VuQXBpS2V5IH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0UHVibGljUHJvZmlsZSxcbiAgICB1cGRhdGVQdWJsaWNQcm9maWxlLFxuICB9O1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnenVzdGFuZCc7XG5pbXBvcnQgeyBzdWJzY3JpYmVXaXRoU2VsZWN0b3IgfSBmcm9tICd6dXN0YW5kL21pZGRsZXdhcmUnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7XG4gIFVzZXJQcm9wcyxcbiAgRmlyZWJhc2VVc2VyLFxuICBTc29Vc2VyUHJvcHMsXG4gIFNzb1YyRXhjaGFuZ2VSZXNwb25zZSxcbn0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tICdqd3QtZGVjb2RlJztcbmltcG9ydCB7IHR5cGUgUHVibGljUHJvZmlsZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2ZpbGUvdHlwZXMnO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4vdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IEVudmlyb25tZW50LCBnZXRDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuXG5pbnRlcmZhY2UgVXNlclN0b3JlIHtcbiAgdXNlcjogVXNlclByb3BzIHwgbnVsbDtcbiAgcHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGw7XG4gIHJlZnJlc2hlZFRva2VuTG9hZGVkOiBib29sZWFuO1xuICBzZXRVc2VyOiAodXNlcjogVXNlclByb3BzIHwgbnVsbCkgPT4gdm9pZDtcbiAgc2V0UHVibGljUHJvZmlsZTogKHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsKSA9PiB2b2lkO1xuICBsb2dvdXQ6ICgpID0+IHZvaWQ7XG4gIHJlZnJlc2hQdWJsaWNUb2tlbnM6IChjb25maWc6IHtcbiAgICByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZztcbiAgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc2V0VXNlckJ5VG9rZW5JZDogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgbG9hZFN0b3JlZFVzZXI6IChjb25maWc/OiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IFByb21pc2U8dm9pZD47XG4gIHNzb1YyRXhjaGFuZ2U6IChcbiAgICBzc29Tb3VyY2VJRDogc3RyaW5nLFxuICAgIGp3dDogc3RyaW5nLFxuICAgIGVudj86IEVudmlyb25tZW50XG4gICkgPT4gUHJvbWlzZTxTc29WMkV4Y2hhbmdlUmVzcG9uc2U+O1xufVxuXG5leHBvcnQgY29uc3QgdXNlVXNlclN0b3JlID0gY3JlYXRlPFVzZXJTdG9yZT4oKShcbiAgc3Vic2NyaWJlV2l0aFNlbGVjdG9yKChzZXQsIGdldCkgPT4gKHtcbiAgICB1c2VyOiBudWxsLFxuICAgIHB1YmxpY1Byb2ZpbGU6IG51bGwsXG4gICAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IGZhbHNlLFxuXG4gICAgc2V0VXNlcjogKHVzZXI6IFVzZXJQcm9wcyB8IG51bGwpID0+IHtcbiAgICAgIHNldCh7IHVzZXIgfSk7XG4gICAgfSxcblxuICAgIHNldFB1YmxpY1Byb2ZpbGU6IChwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbCkgPT4ge1xuICAgICAgc2V0KHsgcHVibGljUHJvZmlsZSB9KTtcbiAgICB9LFxuXG4gICAgc2V0VXNlckJ5VG9rZW5JZDogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXNlciA9IGp3dERlY29kZTxGaXJlYmFzZVVzZXI+KGlkVG9rZW4pO1xuICAgICAgICBjb25zdCB1c2VyUHJvcHM6IFVzZXJQcm9wcyA9IHtcbiAgICAgICAgICB1aWQ6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgICBkaXNwbGF5TmFtZTogdXNlci5zYWZlRGlzcGxheU5hbWUsXG4gICAgICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICAgICAgcGhvdG9VUkw6IHVzZXIuc2FmZVBob3RvVVJMLFxuICAgICAgICAgIGhhbmRsZTogdXNlci5oYW5kbGUsXG4gICAgICAgIH07XG4gICAgICAgIHNldCh7IHVzZXI6IHVzZXJQcm9wcyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2dvdXQ6ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUuY2xlYXJQdWJsaWNUb2tlbnMoKTtcbiAgICAgICAgdG9rZW5TdG9yZS5jbGVhckN1c3RvbVRva2VucygpO1xuICAgICAgICBzZXQoeyB1c2VyOiBudWxsIH0pO1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnYXJlbmEtY29tbWVudHMtbG9nb3V0JykpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnM6IGFzeW5jIChjb25maWc6IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG5cbiAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlZnJlc2ggdG9rZW4gZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZWZpeCA9ICdodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZWFwaXMuY29tL3YxL3Rva2VuP2tleT0nO1xuICAgICAgICBjb25zdCBhcGlLZXkgPSBjb25maWcucmVmcmVzaFRva2VuQXBpS2V5O1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcmVmaXh9JHthcGlLZXl9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgY29uc3QgeyBzZXRVc2VyQnlUb2tlbklkIH0gPSBnZXQoKTtcbiAgICAgICAgc2V0VXNlckJ5VG9rZW5JZChkYXRhLmlkX3Rva2VuKTtcblxuICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICB0b2tlblN0b3JlLnVwZGF0ZVB1YmxpY1Rva2VucyhkYXRhLmlkX3Rva2VuLCBkYXRhLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIGNvbnN0IHsgbG9nb3V0IH0gPSBnZXQoKTtcbiAgICAgICAgbG9nb3V0KCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGxvYWRTdG9yZWRVc2VyOiBhc3luYyAoY29uZmlnPzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBwdWJsaWNJZFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pO1xuICAgICAgY29uc3QgcHVibGljUmVmcmVzaFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG4gICAgICBjb25zdCBjdXN0b21JZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pO1xuICAgICAgY29uc3QgY3VzdG9tVXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEF1dGhDb29raWUuQ1VTVE9NX1VTRVIpO1xuXG4gICAgICBpZiAoISFjdXN0b21JZFRva2VuICYmICEhY3VzdG9tVXNlcikge1xuICAgICAgICBjb25zdCBwYXJzZWRVc2VyID0gSlNPTi5wYXJzZShjdXN0b21Vc2VyKTtcblxuICAgICAgICBzZXQoeyB1c2VyOiBwYXJzZWRVc2VyIH0pO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUudXBkYXRlQ3VzdG9tVG9rZW4oY3VzdG9tSWRUb2tlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHVibGljSWRUb2tlbikge1xuICAgICAgICAgIGNvbnN0IHsgc2V0VXNlckJ5VG9rZW5JZCB9ID0gZ2V0KCk7XG4gICAgICAgICAgc2V0VXNlckJ5VG9rZW5JZChwdWJsaWNJZFRva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmIChwdWJsaWNSZWZyZXNoVG9rZW4gJiYgY29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgeyByZWZyZXNoUHVibGljVG9rZW5zIH0gPSBnZXQoKTtcbiAgICAgICAgICBhd2FpdCByZWZyZXNoUHVibGljVG9rZW5zKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0KHsgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IHRydWUgfSk7XG4gICAgfSxcblxuICAgIHNzb1YyRXhjaGFuZ2U6IGFzeW5jIChcbiAgICAgIHNzb1NvdXJjZUlEOiBzdHJpbmcsXG4gICAgICBqd3Q6IHN0cmluZyxcbiAgICAgIGVudj86IEVudmlyb25tZW50XG4gICAgKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoZW52ID8/ICdwcm9kdWN0aW9uJyk7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVVcmwgPSBjb25maWcucHJvZmlsZVNlcnZpY2VVcmw7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJvZmlsZVVybH0vc3NvL3NvdXJjZXMvJHtzc29Tb3VyY2VJRH0vdXNlcmA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBTc29WMkV4Y2hhbmdlUmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KCdQT1NUJywgdXJsLCB7XG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzaWduZWRVc2VyRGF0YTogand0IH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkVXNlciA9IGp3dERlY29kZTxTc29Vc2VyUHJvcHM+KHJlc3BvbnNlLnRva2VuKTtcblxuICAgICAgICAgIGNvbnN0IHsgc2V0VXNlciwgc2V0UHVibGljUHJvZmlsZSB9ID0gZ2V0KCk7XG5cbiAgICAgICAgICBzZXRVc2VyKHtcbiAgICAgICAgICAgIHVpZDogZGVjb2RlZFVzZXI/LnN1YixcbiAgICAgICAgICAgIGVtYWlsOiBkZWNvZGVkVXNlcj8uZW1haWwsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogZGVjb2RlZFVzZXI/LmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgcGhvdG9VUkw6IGRlY29kZWRVc2VyPy5waG90b1VSTCxcbiAgICAgICAgICAgIGhhbmRsZTogZGVjb2RlZFVzZXI/LmhhbmRsZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHNldFB1YmxpY1Byb2ZpbGUoe1xuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGRlY29kZWRVc2VyPy5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIHBob3RvVVJMOiBkZWNvZGVkVXNlcj8ucGhvdG9VUkwsXG4gICAgICAgICAgICBoYW5kbGU6IGRlY29kZWRVc2VyPy5oYW5kbGUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgIHRva2VuU3RvcmUudXBkYXRlQ3VzdG9tVG9rZW4ocmVzcG9uc2UudG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU1NPIFYyIEV4Y2hhbmdlIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0sXG4gIH0pKVxuKTtcbiIsImltcG9ydCB7IHVzZVByb2ZpbGVTZXJ2aWNlcyB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2ZpbGUvdXNlLXByb2ZpbGUtc2VydmljZXMnO1xuaW1wb3J0IHsgdXNlVXNlclN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3VzZXItc3RvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlcigpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS51c2VyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVB1YmxpY1Byb2ZpbGUoKSB7XG4gIHJldHVybiB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucHVibGljUHJvZmlsZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWZyZXNoZWRUb2tlbkxvYWRlZCgpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoZWRUb2tlbkxvYWRlZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyQWN0aW9ucygpIHtcbiAgY29uc3Qgc2V0VXNlciA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRVc2VyKTtcbiAgY29uc3Qgc2V0UHVibGljUHJvZmlsZSA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRQdWJsaWNQcm9maWxlKTtcbiAgY29uc3QgbG9nb3V0ID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLmxvZ291dCk7XG4gIGNvbnN0IHJlZnJlc2hQdWJsaWNUb2tlbnMgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucmVmcmVzaFB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IHNldFVzZXJCeVRva2VuSWQgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0VXNlckJ5VG9rZW5JZCk7XG4gIGNvbnN0IGxvYWRTdG9yZWRVc2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLmxvYWRTdG9yZWRVc2VyKTtcbiAgY29uc3Qgc3NvVjJFeGNoYW5nZSA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zc29WMkV4Y2hhbmdlKTtcbiAgXG5cbiAgcmV0dXJuIHtcbiAgICBzZXRVc2VyLFxuICAgIHNldFB1YmxpY1Byb2ZpbGUsXG4gICAgbG9nb3V0LFxuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnMsXG4gICAgc2V0VXNlckJ5VG9rZW5JZCxcbiAgICBsb2FkU3RvcmVkVXNlcixcbiAgICBzc29WMkV4Y2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXBkYXRlUHJvZmlsZSgpIHtcbiAgY29uc3QgeyB1cGRhdGVQdWJsaWNQcm9maWxlIH0gPSB1c2VQcm9maWxlU2VydmljZXMoKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGVQdWJsaWNQcm9maWxlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlcldpdGhQcm9maWxlKCkge1xuICBjb25zdCB1c2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnVzZXIpO1xuICBjb25zdCBwdWJsaWNQcm9maWxlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnB1YmxpY1Byb2ZpbGUpO1xuICBjb25zdCByZWZyZXNoZWRUb2tlbkxvYWRlZCA9IHVzZVVzZXJTdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoZWRUb2tlbkxvYWRlZFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdXNlcixcbiAgICBwdWJsaWNQcm9maWxlLFxuICAgIHJlZnJlc2hlZFRva2VuTG9hZGVkLFxuICB9O1xufVxuXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVVzZXIsIHVzZVVzZXJBY3Rpb25zIH0gZnJvbSAnLi4vaG9va3MvdXNlLXVzZXInO1xuaW1wb3J0IHsgdXNlTXV0YXRpb24gfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgdXNlUHJvZmlsZVNlcnZpY2VzIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VyUHJvdmlkZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKCk7XG4gIGNvbnN0IHsgc2V0UHVibGljUHJvZmlsZSwgbG9hZFN0b3JlZFVzZXIgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgZ2V0UHVibGljUHJvZmlsZTogZ2V0UHVibGljUHJvZmlsZVNlcnZpY2UgfSA9IHVzZVByb2ZpbGVTZXJ2aWNlcygpO1xuICBjb25zdCB7IG11dGF0ZUFzeW5jOiBnZXRQdWJsaWNQcm9maWxlIH0gPSB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogZ2V0UHVibGljUHJvZmlsZVNlcnZpY2UsXG4gIH0pO1xuXG4gIGNvbnN0IGxvYWRQdWJsaWNQcm9maWxlID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmICh1c2VyPy51aWQpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZXRQdWJsaWNQcm9maWxlKHVzZXIudWlkKTtcbiAgICAgIHNldFB1YmxpY1Byb2ZpbGUocHJvZmlsZSk7XG4gICAgfVxuICB9LCBbdXNlcj8udWlkLCBnZXRQdWJsaWNQcm9maWxlLCBzZXRQdWJsaWNQcm9maWxlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsb2FkUHVibGljUHJvZmlsZSgpO1xuICB9LCBbbG9hZFB1YmxpY1Byb2ZpbGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvYWRTdG9yZWRVc2VyKGNvbmZpZyk7XG4gIH0sIFtjb25maWcsIGxvYWRTdG9yZWRVc2VyXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICBBbmFseXRpY3NFdmVudCxcbiAgSWRlbnRpdHlQcm9wcyxcbiAgUnVkZGVyQ29udGV4dCxcbiAgVHJhY2tQcm9wcyxcbn0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW1wb3J0IHsgcmVtb3ZlUGFyYW1zRnJvbVVybCB9IGZyb20gJy4uL3V0aWxzL3VybCc7XG5cbmNvbnN0IEFOT05ZTU9VU19JRF9LRVkgPSAnYXJlbmFBbm9ueW1vdXNJZCc7XG5cbmNvbnN0IExTX0tFWVMgPSB7XG4gIGFub246ICdyc19hbm9ueW1vdXNfaWQnLFxuICBpbml0UmVmZXJyZXI6ICdyc19pbml0aWFsX3JlZmVycmVyJyxcbiAgaW5pdERvbWFpbjogJ3JzX2luaXRpYWxfcmVmZXJyaW5nX2RvbWFpbicsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7XG4gICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JTZXRBbm9ueW1vdXNJZCgpOiBzdHJpbmcge1xuICBjb25zdCBleGlzdGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuYW5vbik7XG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICBjb25zdCBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuYW5vbiwgaWQpO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVySW5pdGlhbFJlZmVycmVyKCk6IHZvaWQge1xuICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyKSkge1xuICAgIGNvbnN0IHJlZiA9IGRvY3VtZW50LnJlZmVycmVyIHx8ICckZGlyZWN0JztcbiAgICBjb25zdCBkb21haW4gPSByZWYgJiYgcmVmICE9PSAnJGRpcmVjdCcgPyBuZXcgVVJMKHJlZikuaG9zdG5hbWUgOiAnJztcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVlTLmluaXRSZWZlcnJlciwgcmVmKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVlTLmluaXREb21haW4sIGRvbWFpbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDYW1wYWlnbih1OiBVUkwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5cyA9IFtcbiAgICAndXRtX3NvdXJjZScsXG4gICAgJ3V0bV9tZWRpdW0nLFxuICAgICd1dG1fY2FtcGFpZ24nLFxuICAgICd1dG1fdGVybScsXG4gICAgJ3V0bV9jb250ZW50JyxcbiAgXTtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGtleXMuZm9yRWFjaChrID0+IHtcbiAgICBjb25zdCB2ID0gdS5zZWFyY2hQYXJhbXMuZ2V0KGspO1xuICAgIGlmICh2KSBvdXRba10gPSB2O1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID8gb3V0IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSdWRkZXJDb250ZXh0KCk6IFJ1ZGRlckNvbnRleHQge1xuICBjb25zdCB3ID0gd2luZG93O1xuICBjb25zdCBkID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHMgPSB3aW5kb3cuc2NyZWVuO1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHcubG9jYXRpb24uaHJlZik7XG5cbiAgcmVtZW1iZXJJbml0aWFsUmVmZXJyZXIoKTtcblxuICBjb25zdCBpbml0aWFsX3JlZmVycmVyID1cbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmluaXRSZWZlcnJlcikgfHwgJyRkaXJlY3QnO1xuICBjb25zdCBpbml0aWFsX3JlZmVycmluZ19kb21haW4gPVxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdERvbWFpbikgfHwgJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsOiAnd2ViJyxcbiAgICBhbm9ueW1vdXNJZDogZ2V0T3JTZXRBbm9ueW1vdXNJZCgpLFxuICAgIGxvY2FsZTogbmF2aWdhdG9yLmxhbmd1YWdlLFxuICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICB0aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICAgIG9zOiB7IG5hbWU6IG5hdmlnYXRvci5wbGF0Zm9ybSwgdmVyc2lvbjogdW5kZWZpbmVkIH0sXG4gICAgcGFnZToge1xuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcmVmZXJyZXI6IGQucmVmZXJyZXIgfHwgJyRkaXJlY3QnLFxuICAgICAgcmVmZXJyaW5nX2RvbWFpbjogZC5yZWZlcnJlciA/IG5ldyBVUkwoZC5yZWZlcnJlcikuaG9zdG5hbWUgOiAnJyxcbiAgICAgIHNlYXJjaDogdXJsLnNlYXJjaCxcbiAgICAgIHRpdGxlOiBkLnRpdGxlLFxuICAgICAgdXJsOiB1cmwudG9TdHJpbmcoKSxcbiAgICAgIGluaXRpYWxfcmVmZXJyZXIsXG4gICAgICBpbml0aWFsX3JlZmVycmluZ19kb21haW4sXG4gICAgfSxcbiAgICBzY3JlZW46IHtcbiAgICAgIGRlbnNpdHk6ICh3LmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPz8gMSxcbiAgICAgIGhlaWdodDogcy5oZWlnaHQsXG4gICAgICB3aWR0aDogcy53aWR0aCxcbiAgICAgIGlubmVySGVpZ2h0OiB3LmlubmVySGVpZ2h0LFxuICAgICAgaW5uZXJXaWR0aDogdy5pbm5lcldpZHRoLFxuICAgIH0sXG4gICAgY2FtcGFpZ246IHBhcnNlQ2FtcGFpZ24odXJsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0SWRlbnRpZmllcihvcHRpb25zOiBJZGVudGl0eVByb3BzID0ge30pOiBJZGVudGl0eVByb3BzIHtcbiAgY29uc3QgaWRlbnRpZmllcjogSWRlbnRpdHlQcm9wcyA9IHt9O1xuXG4gIGlmIChvcHRpb25zLnVzZXJJZCkge1xuICAgIGlkZW50aWZpZXIudXNlcklkID0gb3B0aW9ucy51c2VySWQ7XG4gIH1cblxuICBsZXQgY3VycmVudEFub255bW91c0lkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICB0cnkge1xuICAgIGN1cnJlbnRBbm9ueW1vdXNJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEFOT05ZTU9VU19JRF9LRVkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFjY2VzcyBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYW5vbnltb3VzSWQpIHtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gb3B0aW9ucy5hbm9ueW1vdXNJZDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSwgb3B0aW9ucy5hbm9ueW1vdXNJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgYW5vbnltb3VzSWQgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY3VycmVudEFub255bW91c0lkKSB7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IGN1cnJlbnRBbm9ueW1vdXNJZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuZXdBbm9ueW1vdXNJZCA9IGdlbmVyYXRlVVVJRCgpO1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBuZXdBbm9ueW1vdXNJZDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSwgbmV3QW5vbnltb3VzSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIG5ldyBhbm9ueW1vdXNJZCB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVyO1xufVxuXG5mdW5jdGlvbiBnZXRDYW5vbmljYWxVcmwoKTogc3RyaW5nIHtcbiAgY29uc3QgY2Fub25pY2FsTWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJ2xpbmtbcmVsPVwiY2Fub25pY2FsXCJdJ1xuICApIGFzIEhUTUxMaW5rRWxlbWVudDtcbiAgY29uc3QgcmF3VXJsID0gY2Fub25pY2FsTWV0YT8uaHJlZiB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgcmV0dXJuIHJlbW92ZVBhcmFtc0Zyb21VcmwocmF3VXJsKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRQcm9wZXJ0aWVzKFxuICB3aWRnZXRUeXBlOiBzdHJpbmcsXG4gIHByb3BlcnRpZXM6IFRyYWNrUHJvcHMsXG4gIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuKSB7XG4gIHJldHVybiB7XG4gICAgcHJvcGVydGllczoge1xuICAgICAgd2lkZ2V0X3R5cGU6IHdpZGdldFR5cGUsXG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgZG9tYWluOiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsXG4gICAgICB0aXRsZTogd2luZG93LmRvY3VtZW50LnRpdGxlLFxuICAgICAgY2Fub25pY2FsX3VybDogZ2V0Q2Fub25pY2FsVXJsKCksXG4gICAgICBzbmlwcGV0X2lkOiB3aW5kb3cuX19BUkVOQV9fPy5zbmlwcGV0SWQgfHwgbnVsbCxcbiAgICAgIC4uLnByb3BlcnRpZXMsXG4gICAgfSxcbiAgICBjb250ZXh0OiBidWlsZFJ1ZGRlckNvbnRleHQoKSxcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBpbnRlZ3JhdGlvbnM6IHsgQWxsOiB0cnVlIH0sXG4gICAgLi4uZ2V0SWRlbnRpZmllcihpZGVudGl0eSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50SGVhZGVycyh3cml0ZUtleTogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICBBdXRob3JpemF0aW9uOiAnQmFzaWMgJyArIGJ0b2EoYCR7d3JpdGVLZXl9OmApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5hbHl0aWNzKHdyaXRlS2V5OiBzdHJpbmcsIGRhdGFQbGFuZVVybDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgcGFnZTogYXN5bmMgKFxuICAgICAgd2lkZ2V0VHlwZTogQW5hbHl0aWNzV2lkZ2V0VHlwZSxcbiAgICAgIHByb3BlcnRpZXM6IFRyYWNrUHJvcHMsXG4gICAgICBpZGVudGl0eT86IElkZW50aXR5UHJvcHNcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7ZGF0YVBsYW5lVXJsfS92MS9wYWdlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5KSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgICAgICAuLi5nZXRFdmVudFByb3BlcnRpZXMod2lkZ2V0VHlwZSwgcHJvcGVydGllcywgaWRlbnRpdHkpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzZW5kIHBhZ2UgZXZlbnQgdG8gUnVkZGVyc3RhY2snKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRyYWNrOiBhc3luYyAoXG4gICAgICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICAgICAgZXZlbnQ6IEFuYWx5dGljc0V2ZW50LFxuICAgICAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgICAgIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtkYXRhUGxhbmVVcmx9L3YxL3RyYWNrYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5KSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHR5cGU6ICd0cmFjaycsXG4gICAgICAgICAgLi4uZ2V0RXZlbnRQcm9wZXJ0aWVzKHdpZGdldFR5cGUsIHByb3BlcnRpZXMsIGlkZW50aXR5KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2VuZCB0cmFjayBldmVudCB0byBSdWRkZXJzdGFjaycpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcmVtb3ZlUGFyYW1zRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgdXJsT2JqLnNlYXJjaCA9ICcnO1xuXG4gICAgcmV0dXJuIHVybE9iai5ocmVmO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNsZWFyaW5nIHNlYXJjaCBwYXJhbXMgZnJvbSBVUkw6JywgZXJyb3IpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cbiIsImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0QW5hbHl0aWNzIH0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzJztcbmltcG9ydCB7IEFuYWx5dGljc0V2ZW50LCBUcmFja09wdGlvbnMgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVHJhY2sodHJhY2tPcHRpb25zPzogVHJhY2tPcHRpb25zKSB7XG4gIGNvbnN0IHRyYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnQ6IEFuYWx5dGljc0V2ZW50LFxuICAgICAgdXNlcklkPzogc3RyaW5nLFxuICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+XG4gICAgKSA9PiB7XG4gICAgICBpZiAoIXRyYWNrT3B0aW9ucykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhbmFseXRpY3MgPSBnZXRBbmFseXRpY3MoXG4gICAgICAgIHRyYWNrT3B0aW9ucy5yc1dyaXRlS2V5LFxuICAgICAgICB0cmFja09wdGlvbnMucnNEYXRhUGxhbmVVcmxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRyYWNrUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gPSB7XG4gICAgICAgIHNpdGVfaWQ6IHRyYWNrT3B0aW9ucy5zaXRlSWQsXG4gICAgICAgIHdpZGdldF9pZDogdHJhY2tPcHRpb25zLndpZGdldElkLFxuICAgICAgICB0cmlnZ2VyOiB0cmFja09wdGlvbnMudHJpZ2dlcixcbiAgICAgICAgLi4ucHJvcGVydGllcyxcbiAgICAgIH07XG5cbiAgICAgIGFuYWx5dGljcy50cmFjayhcbiAgICAgICAgdHJhY2tPcHRpb25zLndpZGdldFR5cGUsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0cmFja1Byb3BlcnRpZXMsXG4gICAgICAgIHVzZXJJZCA/IHsgdXNlcklkIH0gOiB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSxcbiAgICBbdHJhY2tPcHRpb25zXVxuICApO1xuXG4gIHJldHVybiB0cmFjaztcbn1cbiIsImltcG9ydCB7IHVzZUF1dGhEaWFsb2cgfSBmcm9tICcuLi9jb250ZXh0L2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVVzZXJBY3Rpb25zIH0gZnJvbSAnLi4vaG9va3MvdXNlLXVzZXInO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVG9rZW5zIH0gZnJvbSAnLi4vaG9va3MvdXNlLXRva2Vucyc7XG5pbXBvcnQgeyBBbmFseXRpY3NFdmVudCB9IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5pbXBvcnQgeyB1c2VUcmFjayB9IGZyb20gJy4uL2hvb2tzL3VzZS10cmFjayc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEF1dGhEaWFsb2coKSB7XG4gIGNvbnN0IHtcbiAgICBhcHBOYW1lLFxuICAgIGFwcERlc2NyaXB0aW9uLFxuICAgIGxhbmd1YWdlLFxuICAgIHRyYWNrT3B0aW9ucyxcbiAgICBpc09wZW4sXG4gICAgY2xvc2VEaWFsb2csXG4gICAgb25BdXRoQ29tcGxldGVkLFxuICB9ID0gdXNlQXV0aERpYWxvZygpO1xuICBjb25zdCBmcmFtZUFwcE5hbWUgPSBhcHBOYW1lIHx8ICdBcmVuYSBBSSBDaGF0JztcbiAgY29uc3QgZnJhbWVBcHBEZXNjcmlwdGlvbiA9IGFwcERlc2NyaXB0aW9uIHx8ICdBcmVuYSBBSSBDaGF0JztcbiAgY29uc3QgeyBzZXRVc2VyIH0gPSB1c2VVc2VyQWN0aW9ucygpO1xuICBjb25zdCB7IHVwZGF0ZVB1YmxpY1Rva2VucyB9ID0gdXNlVG9rZW5zKCk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcblxuICBjb25zdCB0cmFjayA9IHVzZVRyYWNrKHRyYWNrT3B0aW9ucyk7XG5cbiAgY29uc3QgaWZyYW1lVXJsID0gYCR7Y29uZmlnLmF1dGhJZnJhbWVVcmx9Lz9hcHAtbmFtZT0ke2ZyYW1lQXBwTmFtZX0mYXBwLWRlc2NyaXB0aW9uPSR7ZnJhbWVBcHBEZXNjcmlwdGlvbn0mbGFuZ3VhZ2U9JHtsYW5ndWFnZSA/PyAnZW4nfWA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8uc291cmNlICE9PSAnYXJlbmEtYXV0aGVudGljYXRpb24nKSByZXR1cm47XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdjYW5jZWxlZCcpIHtcbiAgICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tdmlld2VkJykge1xuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvblZpZXdlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLXN0YXJ0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHsgYXV0aFR5cGUgfSA9IG1lc3NhZ2UuZGF0YT8ucGF5bG9hZCB8fCB7fTtcbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25TdGFydGVkLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICBhdXRoVHlwZTogYXV0aFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi1jb21wbGV0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHsgaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB1c2VyLCBhdXRoVHlwZSwgaXNTaWdudXAgfSA9XG4gICAgICAgICAgbWVzc2FnZS5kYXRhPy5wYXlsb2FkIHx8IHt9O1xuXG4gICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGNvbXBsZXRlZCBidXQgdXNlciBkYXRhIGlzIG1pc3NpbmcnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvbkNvbXBsZXRlZCwgdXNlci51aWQsIHtcbiAgICAgICAgICBpc19zaWdudXA6IGlzU2lnbnVwLFxuICAgICAgICAgIGF1dGhfdHlwZTogYXV0aFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICBvbkF1dGhDb21wbGV0ZWQ/Lih1c2VyKTtcbiAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zKGlkVG9rZW4sIHJlZnJlc2hUb2tlbik7XG4gICAgICAgIHNldFVzZXIodXNlcik7XG4gICAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcblxuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICB9LCBbc2V0VXNlciwgdXBkYXRlUHVibGljVG9rZW5zLCBvbkF1dGhDb21wbGV0ZWQsIHRyYWNrLCBjbG9zZURpYWxvZ10pO1xuXG4gIHJldHVybiBpc09wZW4gPyAoXG4gICAgPGlmcmFtZVxuICAgICAgc3JjPXtpZnJhbWVVcmx9XG4gICAgICB0aXRsZT1cIkFyZW5hIEF1dGhlbnRpY2F0aW9uXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHdpZHRoOiAnMTAwdncnLFxuICAgICAgICBoZWlnaHQ6ICcxMDB2aCcsXG4gICAgICAgIHpJbmRleDogOTk5OTk5OTk5OSxcbiAgICAgIH19XG4gICAgPjwvaWZyYW1lPlxuICApIDogbnVsbDtcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IHVzZUF1dGhTZXJ2aWNlcyB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdXNlLWF1dGgtc2VydmljZXMnO1xuaW1wb3J0IHsgRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQW5vbnltb3VzVG9rZW5Qcm92aWRlcih7XG4gIGNoaWxkcmVuLFxufToge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkge1xuICBjb25zdCB0b2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS51cGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB7IGdldEFub255bW91c0lkZW50aXR5VG9rZW4gfSA9IHVzZUF1dGhTZXJ2aWNlcygpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4pIHtcbiAgICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4oKS50aGVuKCh0b2tlbjogRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSkgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbih0b2tlbi5hY2Nlc3NfdG9rZW4pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbXG4gICAgdG9rZW5zLmFub255bW91cy5pZFRva2VuLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuLFxuICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4sXG4gIF0pO1xuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbiIsImltcG9ydCB7IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUF1dGhTZXJ2aWNlcygpIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCBpZGVudGl0eVVybCA9IGNvbmZpZy5pZGVudGl0eVNlcnZpY2VVcmw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbigpOiBQcm9taXNlPEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmwgPSBgJHtpZGVudGl0eVVybH0vYW5vbnltb3VzLXRva2VuYDtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdCgnUE9TVCcsIHVybCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4sXG4gIH07XG59XG4iLCJpbXBvcnQgeyBBdXRoRGlhbG9nUHJvdmlkZXIgfSBmcm9tICcuL2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbmltcG9ydCB7IFF1ZXJ5Q2xpZW50LCBRdWVyeUNsaWVudFByb3ZpZGVyIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IFVzZXJQcm92aWRlciB9IGZyb20gJy4vdXNlci1wcm92aWRlcic7XG5pbXBvcnQgeyBDb25maWdQcm92aWRlciB9IGZyb20gJy4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBBdXRoRGlhbG9nIGZyb20gJy4uL2RpYWxvZyc7XG5pbXBvcnQgeyBBbm9ueW1vdXNUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi9hbm9ueW1vdXMtdG9rZW4tcHJvdmlkZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gQXV0aFByb3ZpZGVyKHtcbiAgY2hpbGRyZW4sXG4gIHF1ZXJ5Q2xpZW50LFxuICBlbnZpcm9ubWVudCxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgcXVlcnlDbGllbnQ/OiBRdWVyeUNsaWVudDtcbiAgZW52aXJvbm1lbnQ/OiAncHJvZHVjdGlvbicgfCAnZGV2ZWxvcG1lbnQnO1xufSkge1xuICBxdWVyeUNsaWVudCA9IHF1ZXJ5Q2xpZW50IHx8IG5ldyBRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiAoXG4gICAgPFF1ZXJ5Q2xpZW50UHJvdmlkZXIgY2xpZW50PXtxdWVyeUNsaWVudH0+XG4gICAgICA8Q29uZmlnUHJvdmlkZXIgZW52aXJvbm1lbnQ9e2Vudmlyb25tZW50fT5cbiAgICAgICAgPFVzZXJQcm92aWRlcj5cbiAgICAgICAgICA8QXV0aERpYWxvZ1Byb3ZpZGVyPlxuICAgICAgICAgICAgPEFub255bW91c1Rva2VuUHJvdmlkZXI+XG4gICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAgPEF1dGhEaWFsb2cgLz5cbiAgICAgICAgICAgIDwvQW5vbnltb3VzVG9rZW5Qcm92aWRlcj5cbiAgICAgICAgICA8L0F1dGhEaWFsb2dQcm92aWRlcj5cbiAgICAgICAgPC9Vc2VyUHJvdmlkZXI+XG4gICAgICA8L0NvbmZpZ1Byb3ZpZGVyPlxuICAgIDwvUXVlcnlDbGllbnRQcm92aWRlcj5cbiAgKTtcbn1cblxuZXhwb3J0IHsgdXNlQXV0aERpYWxvZyB9IGZyb20gJy4vYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuIl0sIm5hbWVzIjpbIkF1dGhEaWFsb2dDb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsInVuZGVmaW5lZCIsIkF1dGhEaWFsb2dQcm92aWRlciIsImNoaWxkcmVuIiwiaXNPcGVuIiwic2V0SXNPcGVuIiwidXNlU3RhdGUiLCJhcHBOYW1lIiwic2V0QXBwTmFtZSIsImFwcERlc2NyaXB0aW9uIiwic2V0QXBwRGVzY3JpcHRpb24iLCJvbkF1dGhDb21wbGV0ZWQiLCJzZXRPbkF1dGhDb21wbGV0ZWQiLCJ0cmFja09wdGlvbnMiLCJzZXRUcmFja09wdGlvbnMiLCJsYW5ndWFnZSIsInNldExhbmd1YWdlIiwiX2pzeCIsIlByb3ZpZGVyIiwidmFsdWUiLCJvcGVuRGlhbG9nIiwiY2xvc2VEaWFsb2ciLCJvbk9wZW5DaGFuZ2UiLCJvcGVuIiwidXNlQXV0aERpYWxvZyIsImNvbnRleHQiLCJ1c2VDb250ZXh0IiwiRXJyb3IiLCJnZXRDb25maWciLCJlbnZpcm9ubWVudCIsImlzRGV2IiwicHJvZmlsZVNlcnZpY2VVcmwiLCJpZGVudGl0eVNlcnZpY2VVcmwiLCJyZWZyZXNoVG9rZW5BcGlLZXkiLCJhdXRoSWZyYW1lVXJsIiwiZGVidWciLCJDb25maWdDb250ZXh0IiwiQ29uZmlnUHJvdmlkZXIiLCJjb25maWciLCJ1c2VDb25maWciLCJkZWZhdWx0SGVhZGVycyIsImFzeW5jIiwicmVxdWVzdCIsIm1ldGhvZCIsInVybCIsIm9wdGlvbnMiLCJyZXNwb25zZSIsImZldGNoIiwiaGVhZGVycyIsIm9rIiwic3RhdHVzVGV4dCIsImpzb24iLCJUb2tlblR5cGUiLCJBdXRoQ29va2llIiwiVE9LRU5fVVBEQVRFRF9FVkVOVCIsImRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQiLCJ0eXBlIiwicGFyYW1zIiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJkZWZhdWx0VG9rZW5zIiwicHVibGljIiwiaWRUb2tlbiIsIkNvb2tpZXMiLCJnZXQiLCJQVUJMSUNfSURfVE9LRU4iLCJyZWZyZXNoVG9rZW4iLCJQVUJMSUNfUkVGUkVTSF9UT0tFTiIsImFub255bW91cyIsIkFOT05ZTU9VU19JRF9UT0tFTiIsImd1ZXN0IiwiR1VFU1RfSURfVE9LRU4iLCJjdXN0b20iLCJDVVNUT01fSURfVE9LRU4iLCJ1c2VUb2tlblN0b3JlIiwiY3JlYXRlIiwic3Vic2NyaWJlV2l0aFNlbGVjdG9yIiwic2V0IiwidXBkYXRlUHVibGljVG9rZW5zSGVscGVyIiwic291cmNlIiwidG9rZW5zIiwic3RhdGUiLCJleHBpcmVzIiwiUFVCTElDIiwidXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIiLCJBTk9OWU1PVVMiLCJ1cGRhdGVHdWVzdFRva2Vuc0hlbHBlciIsIkdVRVNUIiwidXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIiLCJDVVNUT00iLCJjbGVhclB1YmxpY1Rva2Vuc0hlbHBlciIsInJlbW92ZSIsImNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyIiwiY2xlYXJHdWVzdFRva2Vuc0hlbHBlciIsImNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyIiwibG9jYWxTdG9yYWdlIiwicmVtb3ZlSXRlbSIsIkNVU1RPTV9VU0VSIiwiZ2V0VG9rZW4iLCJnZXRNb3N0UHJpdmlsZWdlZFRva2VuIiwiaW5jbHVkZXMiLCJnZXRSZWZyZXNoVG9rZW4iLCJ1cGRhdGVQdWJsaWNUb2tlbnMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbiIsInVwZGF0ZUd1ZXN0VG9rZW5zIiwidXBkYXRlQ3VzdG9tVG9rZW4iLCJjbGVhclRva2VucyIsImNsZWFyUHVibGljVG9rZW5zIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJjbGVhckd1ZXN0VG9rZW5zIiwiY2xlYXJDdXN0b21Ub2tlbnMiLCJzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnMiLCJzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbiIsInNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zIiwic2lsZW50VXBkYXRlQ3VzdG9tVG9rZW4iLCJzaWxlbnRDbGVhclB1YmxpY1Rva2VucyIsInNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zIiwic2lsZW50Q2xlYXJHdWVzdFRva2VucyIsInNpbGVudENsZWFyQ3VzdG9tVG9rZW5zIiwidXNlVG9rZW5FdmVudExpc3RlbmVyIiwiZXZlbnRTb3VyY2VSZWYiLCJ1c2VSZWYiLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHIiLCJ1c2VFZmZlY3QiLCJoYW5kbGVUb2tlblVwZGF0ZSIsImV2ZW50IiwiY3VycmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZXZlbnRTb3VyY2UiLCJ1c2VUb2tlbnMiLCJ1c2VUb2tlbiIsInVzZVRva2VuVmFsdWUiLCJ1c2VSZWZyZXNoVG9rZW4iLCJBbmFseXRpY3NXaWRnZXRUeXBlIiwiQW5hbHl0aWNzRXZlbnQiLCJ1c2VQcm9maWxlU2VydmljZXMiLCJ0b2tlbiIsInJlZnJlc2hQdWJsaWNUb2tlbnMiLCJ1c2VVc2VyQWN0aW9ucyIsInByb2ZpbGVVcmwiLCJnZXRQdWJsaWNQcm9maWxlIiwidXNlcklkIiwidXBkYXRlUHVibGljUHJvZmlsZSIsIkF1dGhvcml6YXRpb24iLCJwYXlsb2FkIiwidGV4dCIsInN0YXR1cyIsImVycm9ycyIsIkpTT04iLCJwYXJzZSIsImNvbnRlbnRUeXBlIiwiZXJyb3IiLCJjb25zb2xlIiwic2VjdXJlZFJlcXVlc3QiLCJib2R5Iiwic3RyaW5naWZ5IiwidXNlVXNlclN0b3JlIiwidXNlciIsInB1YmxpY1Byb2ZpbGUiLCJyZWZyZXNoZWRUb2tlbkxvYWRlZCIsInNldFVzZXIiLCJzZXRQdWJsaWNQcm9maWxlIiwic2V0VXNlckJ5VG9rZW5JZCIsImp3dERlY29kZSIsInVzZXJQcm9wcyIsInVpZCIsInVzZXJfaWQiLCJkaXNwbGF5TmFtZSIsInNhZmVEaXNwbGF5TmFtZSIsImVtYWlsIiwicGhvdG9VUkwiLCJzYWZlUGhvdG9VUkwiLCJoYW5kbGUiLCJsb2dvdXQiLCJ0b2tlblN0b3JlIiwiZ2V0U3RhdGUiLCJFdmVudCIsIlVSTFNlYXJjaFBhcmFtcyIsInJlZnJlc2hfdG9rZW4iLCJncmFudF90eXBlIiwiZGF0YSIsImlkX3Rva2VuIiwibG9hZFN0b3JlZFVzZXIiLCJwdWJsaWNJZFRva2VuIiwicHVibGljUmVmcmVzaFRva2VuIiwiY3VzdG9tSWRUb2tlbiIsImdldEl0ZW0iLCJjdXN0b21Vc2VyIiwicGFyc2VkVXNlciIsInNzb1YyRXhjaGFuZ2UiLCJzc29Tb3VyY2VJRCIsImp3dCIsImVudiIsInNpZ25lZFVzZXJEYXRhIiwiZGVjb2RlZFVzZXIiLCJzdWIiLCJ1c2VVc2VyIiwidXNlUHVibGljUHJvZmlsZSIsInVzZVJlZnJlc2hlZFRva2VuTG9hZGVkIiwidXNlVXBkYXRlUHJvZmlsZSIsInVzZVVzZXJXaXRoUHJvZmlsZSIsIlVzZXJQcm92aWRlciIsImdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlIiwibXV0YXRlQXN5bmMiLCJ1c2VNdXRhdGlvbiIsIm11dGF0aW9uRm4iLCJsb2FkUHVibGljUHJvZmlsZSIsInVzZUNhbGxiYWNrIiwicHJvZmlsZSIsIkFOT05ZTU9VU19JRF9LRVkiLCJMU19LRVlTIiwiZ2V0T3JTZXRBbm9ueW1vdXNJZCIsImV4aXN0aW5nIiwiaWQiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwic2V0SXRlbSIsInBhcnNlQ2FtcGFpZ24iLCJ1Iiwib3V0IiwiZm9yRWFjaCIsImsiLCJ2Iiwic2VhcmNoUGFyYW1zIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImJ1aWxkUnVkZGVyQ29udGV4dCIsInciLCJ3aW5kb3ciLCJkIiwicyIsInNjcmVlbiIsIlVSTCIsImxvY2F0aW9uIiwiaHJlZiIsInJlZiIsInJlZmVycmVyIiwiZG9tYWluIiwiaG9zdG5hbWUiLCJyZW1lbWJlckluaXRpYWxSZWZlcnJlciIsImluaXRpYWxfcmVmZXJyZXIiLCJpbml0aWFsX3JlZmVycmluZ19kb21haW4iLCJjaGFubmVsIiwiYW5vbnltb3VzSWQiLCJsb2NhbGUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0aW1lem9uZSIsIkludGwiLCJEYXRlVGltZUZvcm1hdCIsInJlc29sdmVkT3B0aW9ucyIsInRpbWVab25lIiwib3MiLCJuYW1lIiwicGxhdGZvcm0iLCJ2ZXJzaW9uIiwicGFnZSIsInBhdGgiLCJwYXRobmFtZSIsInJlZmVycmluZ19kb21haW4iLCJzZWFyY2giLCJ0aXRsZSIsImRlbnNpdHkiLCJkZXZpY2VQaXhlbFJhdGlvIiwiaGVpZ2h0Iiwid2lkdGgiLCJpbm5lckhlaWdodCIsImlubmVyV2lkdGgiLCJjYW1wYWlnbiIsImdldElkZW50aWZpZXIiLCJpZGVudGlmaWVyIiwiY3VycmVudEFub255bW91c0lkIiwid2FybiIsIm5ld0Fub255bW91c0lkIiwicmVwbGFjZSIsImMiLCJyIiwiZ2V0Q2Fub25pY2FsVXJsIiwiY2Fub25pY2FsTWV0YSIsInF1ZXJ5U2VsZWN0b3IiLCJ1cmxPYmoiLCJyZW1vdmVQYXJhbXNGcm9tVXJsIiwiZ2V0RXZlbnRQcm9wZXJ0aWVzIiwid2lkZ2V0VHlwZSIsInByb3BlcnRpZXMiLCJpZGVudGl0eSIsIndpZGdldF90eXBlIiwiY2Fub25pY2FsX3VybCIsInNuaXBwZXRfaWQiLCJfX0FSRU5BX18iLCJzbmlwcGV0SWQiLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJpbnRlZ3JhdGlvbnMiLCJBbGwiLCJnZXRFdmVudEhlYWRlcnMiLCJ3cml0ZUtleSIsImJ0b2EiLCJ1c2VUcmFjayIsImFuYWx5dGljcyIsInJzV3JpdGVLZXkiLCJkYXRhUGxhbmVVcmwiLCJyc0RhdGFQbGFuZVVybCIsInRyYWNrIiwidHJhY2tQcm9wZXJ0aWVzIiwic2l0ZV9pZCIsInNpdGVJZCIsIndpZGdldF9pZCIsIndpZGdldElkIiwidHJpZ2dlciIsIkF1dGhEaWFsb2ciLCJmcmFtZUFwcE5hbWUiLCJmcmFtZUFwcERlc2NyaXB0aW9uIiwiaWZyYW1lVXJsIiwiaGFuZGxlciIsIm1lc3NhZ2UiLCJhdXRoVHlwZSIsIkF1dGhlbnRpY2F0aW9uU3RhcnRlZCIsImlzU2lnbnVwIiwiQXV0aGVudGljYXRpb25Db21wbGV0ZWQiLCJpc19zaWdudXAiLCJhdXRoX3R5cGUiLCJBdXRoZW50aWNhdGlvblZpZXdlZCIsInNyYyIsInN0eWxlIiwicG9zaXRpb24iLCJ0b3AiLCJsZWZ0IiwiekluZGV4IiwiQW5vbnltb3VzVG9rZW5Qcm92aWRlciIsImdldEFub255bW91c0lkZW50aXR5VG9rZW4iLCJpZGVudGl0eVVybCIsInVzZUF1dGhTZXJ2aWNlcyIsInRoZW4iLCJhY2Nlc3NfdG9rZW4iLCJBdXRoUHJvdmlkZXIiLCJxdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50IiwiUXVlcnlDbGllbnRQ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
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{createContext as n,useContext as o,useState as r,useRef as i,useEffect as s,useCallback as a}from"react";import{useMutation as u,QueryClient as c,QueryClientProvider as l}from"@tanstack/react-query";import{create as d}from"zustand";import{subscribeWithSelector as k}from"zustand/middleware";import p from"js-cookie";import{jwtDecode as m}from"jwt-decode";const T=n(void 0),h=({children:t})=>{const[n,o]=r(!1),[i,s]=r(void 0),[a,u]=r(void 0),[c,l]=r(void 0),[d,k]=r(void 0),[p,m]=r(void 0);return e(T.Provider,{value:{isOpen:n,appName:i,language:p,appDescription:a,trackOptions:d,onAuthCompleted:c,openDialog:({trackOptions:e,appName:t,language:n,appDescription:r,onAuthCompleted:i})=>{o(!0),k(e),s(t),m(n),u(r),l(i)},closeDialog:()=>o(!1),onOpenChange:e=>o(e)},children:t})},f=()=>{const e=o(T);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e},g=e=>{const t="development"===e;return{profileServiceUrl:t?"https://profile-service-dev.arena.im":"https://profile-service-prd.arena.im",identityServiceUrl:t?"https://token-service-dev.arena.im":"https://token-service-prd.arena.im",refreshTokenApiKey:t?"AIzaSyCJhWFCK3ics9kJ2eSgQD7kWHUsOsJyPdk":"AIzaSyD_a4tNVdFVqgGbTfOGCaZ5pvUHErcE79c",authIframeUrl:t?"https://auth2.dev.arena.im":"https://auth2.arena.im",environment:e,debug:"development"===e}},y=n(void 0),U=({children:t,environment:n="development"})=>{const o=g(n);return e(y.Provider,{value:{config:o,environment:n},children:t})},S=()=>{const e=o(y);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},w={"Content-Type":"application/json"};async function I(e,t,n={}){const o=await fetch(t,{...n,method:e,headers:{"Content-Type":"application/json",...n.headers}});if(!o.ok)throw new Error(`Error: ${o.statusText}`);return o.json()}var v,O;!function(e){e.ANONYMOUS="anonymous",e.GUEST="guest",e.PUBLIC="public",e.CUSTOM="custom"}(v||(v={})),function(e){e.PUBLIC_ID_TOKEN="arena-auth-public-id-token",e.PUBLIC_REFRESH_TOKEN="arena-auth-public-refresh-token",e.ANONYMOUS_ID_TOKEN="arena-auth-anonymous-id-token",e.GUEST_ID_TOKEN="arena-auth-guest-id-token",e.CUSTOM_ID_TOKEN="arena-auth-custom-id-token",e.CUSTOM_USER="arena-auth-custom-user"}(O||(O={}));const _="arena-auth-token-updated";function P(e,t){document.dispatchEvent(new CustomEvent(_,{detail:{...t,type:e}}))}const E={public:{idToken:p.get(O.PUBLIC_ID_TOKEN)||null,refreshToken:p.get(O.PUBLIC_REFRESH_TOKEN)||null},anonymous:{idToken:p.get(O.ANONYMOUS_ID_TOKEN)||null},guest:{idToken:p.get(O.GUEST_ID_TOKEN)||null},custom:{idToken:p.get(O.CUSTOM_ID_TOKEN)||null}},C=d()(k((e,t)=>{const n=(n,o,r=!0,i)=>{n===t().tokens.public.idToken&&o===t().tokens.public.refreshToken||(e(e=>({tokens:{...e.tokens,public:{idToken:n,refreshToken:o}}})),p.set(O.PUBLIC_ID_TOKEN,n,{expires:1/24}),p.set(O.PUBLIC_REFRESH_TOKEN,o,{expires:30}),r&&P(v.PUBLIC,{idToken:n,refreshToken:o,source:i}))},o=(n,o=!0,r)=>{n!==t().tokens.anonymous.idToken&&(e(e=>({tokens:{...e.tokens,anonymous:{idToken:n}}})),p.set(O.ANONYMOUS_ID_TOKEN,n,{expires:1/24}),o&&P(v.ANONYMOUS,{idToken:n,source:r}))},r=(n,o=!0,r)=>{n!==t().tokens.guest.idToken&&(e(e=>({tokens:{...e.tokens,guest:{idToken:n}}})),p.set(O.GUEST_ID_TOKEN,n,{expires:1/24}),o&&P(v.GUEST,{idToken:n,source:r}))},i=(n,o=!0,r)=>{n!==t().tokens.custom.idToken&&(e(e=>({tokens:{...e.tokens,custom:{idToken:n}}})),p.set(O.CUSTOM_ID_TOKEN,n),o&&P(v.CUSTOM,{idToken:n,source:r}))},s=(t=!0,n)=>{p.remove(O.PUBLIC_ID_TOKEN),p.remove(O.PUBLIC_REFRESH_TOKEN),e(e=>({tokens:{...e.tokens,public:{idToken:null,refreshToken:null}}})),t&&P(v.PUBLIC,{idToken:null,source:n})},a=(t=!0,n)=>{p.remove(O.ANONYMOUS_ID_TOKEN),e(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),t&&P(v.ANONYMOUS,{idToken:null,source:n})},u=(t=!0,n)=>{p.remove(O.GUEST_ID_TOKEN),e(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),t&&P(v.GUEST,{idToken:null,source:n})},c=(t=!0,n)=>{p.remove(O.CUSTOM_ID_TOKEN),localStorage.removeItem(O.CUSTOM_ID_TOKEN),localStorage.removeItem(O.CUSTOM_USER),e(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),t&&P(v.CUSTOM,{idToken:null,source:n})};return{tokens:E,getToken:e=>t().tokens[e]?.idToken||null,getMostPrivilegedToken:(e=[v.PUBLIC,v.GUEST,v.ANONYMOUS])=>t().tokens.custom.idToken&&e.includes(v.CUSTOM)?{type:v.CUSTOM,idToken:t().tokens.custom.idToken}:t().tokens.public.idToken&&e.includes(v.PUBLIC)?{type:v.PUBLIC,idToken:t().tokens.public.idToken}:t().tokens.guest.idToken&&e.includes(v.GUEST)?{type:v.GUEST,idToken:t().tokens.guest.idToken}:t().tokens.anonymous.idToken&&e.includes(v.ANONYMOUS)?{type:v.ANONYMOUS,idToken:t().tokens.anonymous.idToken}:null,getRefreshToken:e=>t().tokens[e]?.refreshToken||null,updatePublicTokens:(e,t,o)=>{n(e,t,!0,o)},updateAnonymousToken:(e,t)=>{o(e,!0,t)},updateGuestTokens:(e,t)=>{r(e,!0,t)},updateCustomToken:(e,t)=>{i(e,!0,t)},clearTokens:e=>{s(!0,e),a(!0,e),u(!0,e),c(!0,e)},clearPublicTokens:e=>{s(!0,e)},clearAnonymousTokens:e=>{a(!0,e)},clearGuestTokens:e=>{u(!0,e)},clearCustomTokens:e=>{c(!0,e)},silentUpdatePublicTokens:(e,t)=>{n(e,t,!1)},silentUpdateAnonymousToken:e=>{o(e,!1)},silentUpdateGuestTokens:e=>{r(e,!1)},silentUpdateCustomToken:e=>{i(e,!1)},silentClearPublicTokens:()=>{s(!1)},silentClearAnonymousTokens:()=>{a(!1)},silentClearGuestTokens:()=>{u(!1)},silentClearCustomTokens:()=>{c(!1)}}}));function b(){const e=C(e=>e.silentUpdatePublicTokens),t=C(e=>e.silentUpdateAnonymousToken),n=C(e=>e.silentUpdateGuestTokens),o=C(e=>e.silentUpdateCustomToken),r=C(e=>e.clearTokens),a=C(e=>e.silentClearPublicTokens),u=C(e=>e.silentClearAnonymousTokens),c=C(e=>e.silentClearGuestTokens),l=C(e=>e.silentClearCustomTokens),d=i(`widget-${Math.random().toString(36).substr(2,9)}`);return s(()=>{const r=r=>{const{idToken:i,refreshToken:s,type:k,source:p}=r.detail;if(p!==d.current)switch(k){case v.PUBLIC:if(i){if(!s)throw new Error("Refresh token is required for public tokens");e(i,s)}else a();break;case v.ANONYMOUS:i?t(i):u();break;case v.GUEST:i?n(i):c();break;case v.CUSTOM:i?o(i):l()}};return document.addEventListener(_,r),()=>{document.removeEventListener(_,r)}},[e,t,n,o,r,a,u,c,l]),{eventSource:d.current}}function N(){const e=C(e=>e.getToken),t=C(e=>e.getMostPrivilegedToken),n=C(e=>e.getRefreshToken),o=C(e=>e.updatePublicTokens),r=C(e=>e.updateAnonymousToken),i=C(e=>e.updateGuestTokens),s=C(e=>e.updateCustomToken),a=C(e=>e.clearTokens),u=C(e=>e.clearPublicTokens),c=C(e=>e.clearCustomTokens),{eventSource:l}=b();return{getToken:e,getMostPrivilegedToken:t,getRefreshToken:n,updatePublicTokens:(e,t)=>o(e,t,l),updateAnonymousToken:e=>r(e,l),updateGuestTokens:e=>i(e,l),updateCustomToken:e=>s(e,l),clearTokens:()=>a(l),clearPublicTokens:()=>u(l),clearCustomTokens:()=>c(l)}}function A(e){return C(t=>t.tokens[e])}function x(e){return C(t=>t.tokens[e]?.idToken)}function L(e){return C(t=>t.tokens[e]?.refreshToken)}var D,R;function K(){const e=A(v.PUBLIC),{refreshPublicTokens:t}=F(),{config:n}=S(),o=n.profileServiceUrl;return{getPublicProfile:async function(e){const t=`${o}/public/users/${e}/profile?fields=bio,photoURL,displayName,location,handle`;return await I("GET",t)},updatePublicProfile:async function(r){const i=`${o}/me/profile/personal`;await async function(e){const{method:t,url:n,options:o={},token:r}=e;if(!r)throw new Error("No authentication token found");const i={...w,...o.headers,Authorization:`Bearer ${r}`},s={...o,method:t,headers:i},a=await fetch(n,s);if(!a.ok){const e=await a.text();if(!e)throw new Error(`Error to process request - ${a.status}`);const{errors:t}=JSON.parse(e)||{};throw new Error(t?.[0]||"Internal server error")}const u=a.headers.get("content-type");if(!u||!u.includes("application/json"))return a;const c=await a.text();if(!c)return null;try{return JSON.parse(c)}catch(e){throw console.error(e),new Error("Invalid JSON response from server")}}({method:"PUT",url:i,options:{body:JSON.stringify(r)},token:e.idToken}),t({refreshTokenApiKey:n.refreshTokenApiKey})}}}!function(e){e.AvatarProfile="avatar-profile",e.AvatarChat="avatar-chat",e.Comments="comments",e.GlobalProfile="global-profile",e.GroupChat="group-chat",e.Polls="polls",e.UniversalSnippet="universal-snippet"}(D||(D={})),function(e){e.AuthenticationCompleted="Authentication Completed",e.AuthenticationStarted="Authentication Started",e.AuthenticationViewed="Authentication Viewed"}(R||(R={}));const M=d()(k((e,t)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:t=>{e({user:t})},setPublicProfile:t=>{e({publicProfile:t})},setUserByTokenId:t=>{try{const n=m(t),o={uid:n.user_id,displayName:n.safeDisplayName,email:n.email,photoURL:n.safePhotoURL,handle:n.handle};e({user:o})}catch(e){console.error(e)}},logout:()=>{try{const t=C.getState();t.clearPublicTokens(),t.clearCustomTokens(),e({user:null}),document.dispatchEvent(new Event("arena-comments-logout"))}catch(e){console.error(e)}},refreshPublicTokens:async e=>{try{const n=p.get(O.PUBLIC_REFRESH_TOKEN);if(!n)throw new Error("No refresh token found");const o=`${"https://securetoken.googleapis.com/v1/token?key="}${e.refreshTokenApiKey}`,r=await fetch(o,{method:"POST",body:new URLSearchParams({refresh_token:n,grant_type:"refresh_token"})}),i=await r.json(),{setUserByTokenId:s}=t();s(i.id_token);C.getState().updatePublicTokens(i.id_token,i.refresh_token)}catch(e){console.error(e);const{logout:n}=t();n()}},loadStoredUser:async n=>{const o=p.get(O.PUBLIC_ID_TOKEN),r=p.get(O.PUBLIC_REFRESH_TOKEN),i=localStorage.getItem(O.CUSTOM_ID_TOKEN),s=localStorage.getItem(O.CUSTOM_USER);if(i&&s){const t=JSON.parse(s);e({user:t});C.getState().updateCustomToken(i)}else if(o){const{setUserByTokenId:e}=t();e(o)}else if(r&&n){const{refreshPublicTokens:e}=t();await e(n)}e({refreshedTokenLoaded:!0})},ssoV2Exchange:async(e,n,o)=>{try{const r=g(o??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,s=await I("POST",i,{body:JSON.stringify({signedUserData:n})});if(s){const e=m(s.token),{setUser:n,setPublicProfile:o}=t();n({uid:e?.sub,email:e?.email,displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle}),o({displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle});C.getState().updateCustomToken(s.token)}return s}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function B(){return M(e=>e.user)}function G(){return M(e=>e.publicProfile)}function $(){return M(e=>e.refreshedTokenLoaded)}function F(){return{setUser:M(e=>e.setUser),setPublicProfile:M(e=>e.setPublicProfile),logout:M(e=>e.logout),refreshPublicTokens:M(e=>e.refreshPublicTokens),setUserByTokenId:M(e=>e.setUserByTokenId),loadStoredUser:M(e=>e.loadStoredUser),ssoV2Exchange:M(e=>e.ssoV2Exchange)}}function J(){const{updatePublicProfile:e}=K();return{updatePublicProfile:e}}function Y(){return{user:M(e=>e.user),publicProfile:M(e=>e.publicProfile),refreshedTokenLoaded:M(e=>e.refreshedTokenLoaded)}}function j({children:e}){const{config:t}=S(),n=B(),{setPublicProfile:o,loadStoredUser:r}=F(),{getPublicProfile:i}=K(),{mutateAsync:c}=u({mutationFn:i}),l=a(async()=>{if(n?.uid){const e=await c(n.uid);o(e)}},[n?.uid,c,o]);return s(()=>{l()},[l]),s(()=>{r(t)},[t,r]),e}const H="arenaAnonymousId",V="rs_anonymous_id",z="rs_initial_referrer",q="rs_initial_referring_domain";function W(){const e=localStorage.getItem(V);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(V,t),t}function Z(e){const t={};return["utm_source","utm_medium","utm_campaign","utm_term","utm_content"].forEach(n=>{const o=e.searchParams.get(n);o&&(t[n]=o)}),Object.keys(t).length?t:void 0}function Q(){const e=window,t=document,n=window.screen,o=new URL(e.location.href);!function(){if(!localStorage.getItem(z)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(z,e),localStorage.setItem(q,t)}}();const r=localStorage.getItem(z)||"$direct",i=localStorage.getItem(q)||"";return{channel:"web",anonymousId:W(),locale:navigator.language,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,os:{name:navigator.platform,version:void 0},page:{path:o.pathname,referrer:t.referrer||"$direct",referring_domain:t.referrer?new URL(t.referrer).hostname:"",search:o.search,title:t.title,url:o.toString(),initial_referrer:r,initial_referring_domain:i},screen:{density:e.devicePixelRatio||1,height:n.height,width:n.width,innerHeight:e.innerHeight,innerWidth:e.innerWidth},campaign:Z(o)}}function X(e={}){const t={};e.userId&&(t.userId=e.userId);let n=null;try{n=localStorage.getItem(H)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(H,e.anonymousId)}catch(e){console.warn("Failed to save anonymousId to localStorage:",e)}}else if(n)t.anonymousId=n;else{const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)});t.anonymousId=e;try{localStorage.setItem(H,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function ee(){const e=document.querySelector('link[rel="canonical"]');return function(e){try{const t=new URL(e);return t.search="",t.href}catch(t){return console.error("Error clearing search params from URL:",t),e}}(e?.href||window.location.href)}function te(e,t,n){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:ee(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:Q(),timestamp:(new Date).toISOString(),integrations:{All:!0},...X(n)}}function ne(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function oe(e){return a((t,n,o)=>{if(!e)return;const r=(i=e.rsWriteKey,s=e.rsDataPlaneUrl,{page:async(e,t,n)=>{const o=await fetch(`${s}/v1/page`,{method:"POST",headers:ne(i),body:JSON.stringify({type:"page",...te(e,t,n)})});if(o.ok)return await o.text();throw new Error("Failed to send page event to Rudderstack")},track:async(e,t,n,o)=>{const r=await fetch(`${s}/v1/track`,{method:"POST",headers:ne(i),body:JSON.stringify({event:t,type:"track",...te(e,n,o)})});if(r.ok)return await r.text();throw new Error("Failed to send track event to Rudderstack")}});var i,s;const a={site_id:e.siteId,widget_id:e.widgetId,trigger:e.trigger,...o};r.track(e.widgetType,t,a,n?{userId:n}:void 0)},[e])}function re(){const{appName:t,appDescription:n,language:o,trackOptions:r,isOpen:i,closeDialog:a,onAuthCompleted:u}=f(),c=t||"Arena AI Chat",l=n||"Arena AI Chat",{setUser:d}=F(),{updatePublicTokens:k}=N(),{config:p}=S(),m=oe(r),T=`${p.authIframeUrl}/?app-name=${c}&app-description=${l}&language=${o??"en"}`;return s(()=>{const e=e=>{if("arena-authentication"===e.data?.source)if("canceled"!==e.data?.type)if("authentication-viewed"!==e.data?.type){if("authentication-started"===e.data?.type){const{authType:t}=e.data?.payload||{};return void m(R.AuthenticationStarted,void 0,{authType:t})}if("authentication-completed"===e.data?.type){const{idToken:t,refreshToken:n,user:o,authType:r,isSignup:i}=e.data?.payload||{};return o?(m(R.AuthenticationCompleted,o.uid,{is_signup:i,auth_type:r}),u?.(o),k(t,n),d(o),void a()):void console.error("Authentication completed but user data is missing")}}else m(R.AuthenticationViewed);else a()};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[d,k,u,m,a]),i?e("iframe",{src:T,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function ie(e){const t=e?.trim();return t&&"null"!==t&&"undefined"!==t?t:null}function se(){if("undefined"==typeof window)return null;const e=window,t=ie(e.rudderanalytics?.getAnonymousId?.()??e.rudderAnalytics?.getAnonymousId?.());if(t)return t;try{return ie(window.localStorage.getItem("arena-analytics:rs-anonymous-id"))}catch{return null}}function ae({children:e}){const{config:t}=S(),n=C(e=>e.tokens),o=C(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:r}=function(){const{config:e}=S(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`,n=se();return n?await I("POST",e,{body:JSON.stringify({anonymousId:n})}):await I("POST",e)}}}(),a=i(!1);return s(()=>{const e=se();(!n.anonymous.idToken||t.debug&&Boolean(e)&&!a.current)&&(n.anonymous.idToken&&(a.current=!0),r().then(e=>{o(e.access_token,n.anonymous.idToken?"force-refresh-debug":void 0)}).catch(e=>{n.anonymous.idToken&&(a.current=!1),console.error("[react-sdk-auth] getAnonymousIdentityToken failed",{error:e})}))},[t.debug,n.anonymous.idToken,o,r]),e}function ue({children:n,queryClient:o,environment:r}){return o=o||new c,e(l,{client:o,children:e(U,{environment:r,children:e(j,{children:e(h,{children:t(ae,{children:[n,e(re,{})]})})})})})}export{R as AnalyticsEvent,D as AnalyticsWidgetType,O as AuthCookie,ue as AuthProvider,v as TokenType,f as useAuthDialog,G as usePublicProfile,L as useRefreshToken,$ as useRefreshedTokenLoaded,A as useToken,b as useTokenEventListener,C as useTokenStore,x as useTokenValue,N as useTokens,J as useUpdateProfile,B as useUser,F as useUserActions,M as useUserStore,Y as useUserWithProfile};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vc3JjL3R5cGVzL3Rva2VuLnRzIiwiLi4vc3JjL3V0aWxzL2RvbS1ldmVudHMudHMiLCIuLi9zcmMvc3RvcmVzL3Rva2VuLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lci50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW5zLnRzIiwiLi4vc3JjL3R5cGVzL2FuYWx5dGljcy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzLnRzIiwiLi4vc3JjL3N0b3Jlcy91c2VyLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS11c2VyLnRzIiwiLi4vc3JjL2NvbnRleHQvdXNlci1wcm92aWRlci50c3giLCIuLi9zcmMvdXRpbHMvYW5hbHl0aWNzLnRzIiwiLi4vc3JjL3V0aWxzL3VybC50cyIsIi4uL3NyYy9ob29rcy91c2UtdHJhY2sudHMiLCIuLi9zcmMvZGlhbG9nL2luZGV4LnRzeCIsIi4uL3NyYy9zZXJ2aWNlcy9hdXRoL3VzZS1hdXRoLXNlcnZpY2VzLnRzIiwiLi4vc3JjL2NvbnRleHQvYW5vbnltb3VzLXRva2VuLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy9jb250ZXh0L2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0LCB1c2VTdGF0ZSwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVXNlclByb3BzIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBUcmFja09wdGlvbnMgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5pbnRlcmZhY2UgQXV0aERpYWxvZ0NvbnRleHRUeXBlIHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBhcHBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGFwcERlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBvbkF1dGhDb21wbGV0ZWQ6ICgodXNlcjogVXNlclByb3BzKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgb3BlbkRpYWxvZzogKG9wdGlvbnM6IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB2b2lkO1xuICBjbG9zZURpYWxvZzogKCkgPT4gdm9pZDtcbiAgb25PcGVuQ2hhbmdlOiAob3BlbjogYm9vbGVhbikgPT4gdm9pZDtcbn1cblxuY29uc3QgQXV0aERpYWxvZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PEF1dGhEaWFsb2dDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZFxuKTtcblxudHlwZSBPcGVuRGlhbG9nT3B0aW9ucyA9IHtcbiAgdHJhY2tPcHRpb25zOiBUcmFja09wdGlvbnM7XG4gIGFwcE5hbWU/OiBzdHJpbmc7XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBhcHBEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgb25BdXRoQ29tcGxldGVkPzogKCkgPT4gKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjb25zdCBBdXRoRGlhbG9nUHJvdmlkZXIgPSAoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdE5vZGUgfSkgPT4ge1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwTmFtZSwgc2V0QXBwTmFtZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFthcHBEZXNjcmlwdGlvbiwgc2V0QXBwRGVzY3JpcHRpb25dID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW29uQXV0aENvbXBsZXRlZCwgc2V0T25BdXRoQ29tcGxldGVkXSA9IHVzZVN0YXRlPFxuICAgICgodXNlcjogVXNlclByb3BzKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFt0cmFja09wdGlvbnMsIHNldFRyYWNrT3B0aW9uc10gPSB1c2VTdGF0ZTxUcmFja09wdGlvbnMgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBbbGFuZ3VhZ2UsIHNldExhbmd1YWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IG9wZW5EaWFsb2cgPSAoe1xuICAgIHRyYWNrT3B0aW9ucyxcbiAgICBhcHBOYW1lLFxuICAgIGxhbmd1YWdlLFxuICAgIGFwcERlc2NyaXB0aW9uLFxuICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgfTogT3BlbkRpYWxvZ09wdGlvbnMpID0+IHtcbiAgICBzZXRJc09wZW4odHJ1ZSk7XG4gICAgc2V0VHJhY2tPcHRpb25zKHRyYWNrT3B0aW9ucyk7XG4gICAgc2V0QXBwTmFtZShhcHBOYW1lKTtcbiAgICBzZXRMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgc2V0QXBwRGVzY3JpcHRpb24oYXBwRGVzY3JpcHRpb24pO1xuICAgIHNldE9uQXV0aENvbXBsZXRlZChvbkF1dGhDb21wbGV0ZWQpO1xuICB9O1xuXG4gIGNvbnN0IGNsb3NlRGlhbG9nID0gKCkgPT4gc2V0SXNPcGVuKGZhbHNlKTtcbiAgY29uc3Qgb25PcGVuQ2hhbmdlID0gKG9wZW46IGJvb2xlYW4pID0+IHNldElzT3BlbihvcGVuKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRoRGlhbG9nQ29udGV4dC5Qcm92aWRlclxuICAgICAgdmFsdWU9e3tcbiAgICAgICAgaXNPcGVuLFxuICAgICAgICBhcHBOYW1lLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgYXBwRGVzY3JpcHRpb24sXG4gICAgICAgIHRyYWNrT3B0aW9ucyxcbiAgICAgICAgb25BdXRoQ29tcGxldGVkLFxuICAgICAgICBvcGVuRGlhbG9nLFxuICAgICAgICBjbG9zZURpYWxvZyxcbiAgICAgICAgb25PcGVuQ2hhbmdlLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9BdXRoRGlhbG9nQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VBdXRoRGlhbG9nID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChBdXRoRGlhbG9nQ29udGV4dCk7XG4gIGlmICghY29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQXV0aERpYWxvZyBtdXN0IGJlIHVzZWQgd2l0aGluIGFuIEF1dGhEaWFsb2dQcm92aWRlcicpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgcHJvZmlsZVNlcnZpY2VVcmw6IHN0cmluZztcbiAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICBhdXRoSWZyYW1lVXJsOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuICBkZWJ1ZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnQgPSAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gKGVudmlyb25tZW50OiBFbnZpcm9ubWVudCk6IENvbmZpZyA9PiB7XG4gIGNvbnN0IGlzRGV2ID0gZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCc7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9maWxlU2VydmljZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLWRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9QUkQgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5JREVOVElUWV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vdG9rZW4tc2VydmljZS1kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LklERU5USVRZX1NFUlZJQ0VfVVJMX1BSRCB8fFxuICAgICAgICAnaHR0cHM6Ly90b2tlbi1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgcmVmcmVzaFRva2VuQXBpS2V5OiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5GSVJFQkFTRV9QVUJMSUNfQVBJX0tFWV9ERVYgfHxcbiAgICAgICAgJ0FJemFTeUNKaFdGQ0szaWNzOWtKMmVTZ1FEN2tXSFVzT3NKeVBkaydcbiAgICAgIDogcHJvY2Vzcy5lbnYuRklSRUJBU0VfUFVCTElDX0FQSV9LRVlfUFJEIHx8XG4gICAgICAgICdBSXphU3lELTl0U3JRV243M1MwcW02QnFFSDUtMTJIcThMMGVUc1EnLFxuICAgIGF1dGhJZnJhbWVVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LkFVVEhfSUZSQU1FX1VSTF9ERVYgfHwgJ2h0dHBzOi8vYXV0aDIuZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5BVVRIX0lGUkFNRV9VUkxfUFJEIHx8ICdodHRwczovL2F1dGgyLmFyZW5hLmltJyxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBkZWJ1ZzogZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCcsXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnLCBFbnZpcm9ubWVudCwgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcblxuaW50ZXJmYWNlIENvbmZpZ0NvbnRleHRUeXBlIHtcbiAgY29uZmlnOiBDb25maWc7XG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudDtcbn1cblxuY29uc3QgQ29uZmlnQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Q29uZmlnQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmludGVyZmFjZSBDb25maWdQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IENvbmZpZ1Byb3ZpZGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGVudmlyb25tZW50ID0gJ2RldmVsb3BtZW50Jyxcbn06IENvbmZpZ1Byb3ZpZGVyUHJvcHMpID0+IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKGVudmlyb25tZW50KTtcblxuICByZXR1cm4gKFxuICAgIDxDb25maWdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IGNvbmZpZywgZW52aXJvbm1lbnQgfX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9Db25maWdDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUNvbmZpZyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCk7XG4gIGlmICghY29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQ29uZmlnIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBDb25maWdQcm92aWRlcicpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufTtcbiIsImNvbnN0IGRlZmF1bHRIZWFkZXJzID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QoXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fVxuKSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBtZXRob2QsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9LFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvcjogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlY3VyZWRSZXF1ZXN0KHBhcmFtczoge1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0O1xuICB0b2tlbjogc3RyaW5nO1xufSkge1xuICBjb25zdCB7IG1ldGhvZCwgdXJsLCBvcHRpb25zID0ge30sIHRva2VuIH0gPSBwYXJhbXM7XG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvdW5kJyk7XG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0ge1xuICAgIC4uLmRlZmF1bHRIZWFkZXJzLFxuICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgfTtcblxuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHBheWxvYWQpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB0byBwcm9jZXNzIHJlcXVlc3QgLSAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGVycm9ycyB9ID0gSlNPTi5wYXJzZSh0ZXh0KSB8fCB7fTtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcnM/LlswXSB8fCAnSW50ZXJuYWwgc2VydmVyIGVycm9yJztcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICBpZiAoIWNvbnRlbnRUeXBlIHx8ICFjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKU09OIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFRva2VuVHlwZSB7XG4gIEFOT05ZTU9VUyA9ICdhbm9ueW1vdXMnLFxuICBHVUVTVCA9ICdndWVzdCcsXG4gIFBVQkxJQyA9ICdwdWJsaWMnLFxuICBDVVNUT00gPSAnY3VzdG9tJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblBhaXIge1xuICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBUb2tlbnNNYXAgPSBSZWNvcmQ8VG9rZW5UeXBlLCBUb2tlblBhaXI+O1xuXG5leHBvcnQgZW51bSBBdXRoQ29va2llIHtcbiAgUFVCTElDX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtcHVibGljLWlkLXRva2VuJyxcbiAgUFVCTElDX1JFRlJFU0hfVE9LRU4gPSAnYXJlbmEtYXV0aC1wdWJsaWMtcmVmcmVzaC10b2tlbicsXG4gIEFOT05ZTU9VU19JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWFub255bW91cy1pZC10b2tlbicsXG4gIEdVRVNUX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtZ3Vlc3QtaWQtdG9rZW4nLFxuICBDVVNUT01fSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1jdXN0b20taWQtdG9rZW4nLFxuICBDVVNUT01fVVNFUiA9ICdhcmVuYS1hdXRoLWN1c3RvbS11c2VyJyxcbn1cbiIsImltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcblxuZXhwb3J0IGNvbnN0IFRPS0VOX1VQREFURURfRVZFTlQgPSAnYXJlbmEtYXV0aC10b2tlbi11cGRhdGVkJztcblxuaW50ZXJmYWNlIFRva2VuRXZlbnRQYXJhbXMge1xuICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICBzb3VyY2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFxuICB0eXBlOiBUb2tlblR5cGUsXG4gIHBhcmFtczogVG9rZW5FdmVudFBhcmFtc1xuKSB7XG4gIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgbmV3IEN1c3RvbUV2ZW50KFRPS0VOX1VQREFURURfRVZFTlQsIHtcbiAgICAgIGRldGFpbDogeyAuLi5wYXJhbXMsIHR5cGUgfSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnenVzdGFuZCc7XG5pbXBvcnQgeyBzdWJzY3JpYmVXaXRoU2VsZWN0b3IgfSBmcm9tICd6dXN0YW5kL21pZGRsZXdhcmUnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IEF1dGhDb29raWUsIFRva2Vuc01hcCwgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudCB9IGZyb20gJy4uL3V0aWxzL2RvbS1ldmVudHMnO1xuXG5pbnRlcmZhY2UgVG9rZW5TdG9yZSB7XG4gIHRva2VuczogVG9rZW5zTWFwO1xuICBnZXRUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbjogKFxuICAgIG9wdGlvbnM/OiBBcnJheTxUb2tlblR5cGU+XG4gICkgPT4geyB0eXBlOiBUb2tlblR5cGU7IGlkVG9rZW46IHN0cmluZyB9IHwgbnVsbDtcbiAgZ2V0UmVmcmVzaFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiBzdHJpbmcgfCBudWxsO1xuICB1cGRhdGVQdWJsaWNUb2tlbnM6IChcbiAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgc291cmNlPzogc3RyaW5nXG4gICkgPT4gdm9pZDtcbiAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyUHVibGljVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckFub255bW91c1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJHdWVzdFRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJDdXN0b21Ub2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZVB1YmxpY1Rva2VuczogKGlkVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyUHVibGljVG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckFub255bW91c1Rva2VuczogKCkgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJHdWVzdFRva2VuczogKCkgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGRlZmF1bHRUb2tlbnM6IFRva2Vuc01hcCA9IHtcbiAgcHVibGljOiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pIHx8IG51bGwsXG4gICAgcmVmcmVzaFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBhbm9ueW1vdXM6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLkFOT05ZTU9VU19JRF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbiAgZ3Vlc3Q6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLkdVRVNUX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBjdXN0b206IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VUb2tlblN0b3JlID0gY3JlYXRlPFRva2VuU3RvcmU+KCkoXG4gIHN1YnNjcmliZVdpdGhTZWxlY3Rvcigoc2V0LCBnZXQpID0+IHtcbiAgICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiAmJlxuICAgICAgICByZWZyZXNoVG9rZW4gPT09IGdldCgpLnRva2Vucy5wdWJsaWMucmVmcmVzaFRva2VuXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIHB1YmxpYzoge1xuICAgICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTiwgaWRUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAxIC8gMjQsXG4gICAgICB9KTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTiwgcmVmcmVzaFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDMwLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLlBVQkxJQywge1xuICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgcmVmcmVzaFRva2VuLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpZFRva2VuID09PSBnZXQoKS50b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGFub255bW91czoge1xuICAgICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLkFOT05ZTU9VU19JRF9UT0tFTiwgaWRUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAxIC8gMjQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQU5PTllNT1VTLCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBndWVzdDoge1xuICAgICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLkdVRVNUX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5HVUVTVCwgeyBpZFRva2VuLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpZFRva2VuID09PSBnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGN1c3RvbTogeyBpZFRva2VuIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOLCBpZFRva2VuKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQ1VTVE9NLCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pO1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgcHVibGljOiB7IGlkVG9rZW46IG51bGwsIHJlZnJlc2hUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5QVUJMSUMsIHsgaWRUb2tlbjogbnVsbCwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLkFOT05ZTU9VU19JRF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgYW5vbnltb3VzOiB7IGlkVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQU5PTllNT1VTLCB7XG4gICAgICAgICAgaWRUb2tlbjogbnVsbCxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckd1ZXN0VG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4pO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGd1ZXN0OiB7IGlkVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuR1VFU1QsIHsgaWRUb2tlbjogbnVsbCwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhckN1c3RvbVRva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShBdXRoQ29va2llLkNVU1RPTV9VU0VSKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBjdXN0b206IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5DVVNUT00sIHsgaWRUb2tlbjogbnVsbCwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW5zOiBkZWZhdWx0VG9rZW5zLFxuXG4gICAgICBnZXRUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KCkudG9rZW5zW3R5cGVdPy5pZFRva2VuIHx8IG51bGw7XG4gICAgICB9LFxuXG4gICAgICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuOiAoXG4gICAgICAgIG9wdGlvbnMgPSBbVG9rZW5UeXBlLlBVQkxJQywgVG9rZW5UeXBlLkdVRVNULCBUb2tlblR5cGUuQU5PTllNT1VTXVxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4gJiYgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuQ1VTVE9NKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuQ1VTVE9NLFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLmN1c3RvbS5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4gJiYgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuUFVCTElDKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuUFVCTElDLFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5HVUVTVCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkdVRVNULFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbiAmJlxuICAgICAgICAgIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkFOT05ZTU9VUylcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5BTk9OWU1PVVMsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuXG4gICAgICBnZXRSZWZyZXNoVG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldCgpLnRva2Vuc1t0eXBlXT8ucmVmcmVzaFRva2VuIHx8IG51bGw7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVQdWJsaWNUb2tlbnM6IChcbiAgICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgICApID0+IHtcbiAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zSGVscGVyKGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIoaWRUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIoaWRUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIoaWRUb2tlbiwgdHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyUHVibGljVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckFub255bW91c1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJHdWVzdFRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhckd1ZXN0VG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckN1c3RvbVRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlcihpZFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlcihpZFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlcihpZFRva2VuLCBmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhclB1YmxpY1Rva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckFub255bW91c1Rva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckd1ZXN0VG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcbiAgICB9O1xuICB9KVxuKTtcbiIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyBUT0tFTl9VUERBVEVEX0VWRU5UIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWV2ZW50cyc7XG5cbmludGVyZmFjZSBUb2tlblVwZGF0ZUV2ZW50IHtcbiAgZGV0YWlsOiB7XG4gICAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIHR5cGU6IFRva2VuVHlwZTtcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbkV2ZW50TGlzdGVuZXIoKSB7XG4gIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlUHVibGljVG9rZW5zXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB1cGRhdGVHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlR3Vlc3RUb2tlbnNcbiAgKTtcbiAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUN1c3RvbVRva2VuXG4gICk7XG4gIGNvbnN0IGNsZWFyVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhclRva2Vucyk7XG4gIGNvbnN0IGNsZWFyUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhclB1YmxpY1Rva2Vuc1xuICApO1xuICBjb25zdCBjbGVhckFub255bW91c1Rva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnNcbiAgKTtcbiAgY29uc3QgY2xlYXJHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJHdWVzdFRva2Vucyk7XG4gIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckN1c3RvbVRva2Vuc1xuICApO1xuXG4gIGNvbnN0IGV2ZW50U291cmNlUmVmID0gdXNlUmVmPHN0cmluZz4oXG4gICAgYHdpZGdldC0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVUb2tlblVwZGF0ZSA9IChcbiAgICAgIGV2ZW50OiBDdXN0b21FdmVudDxUb2tlblVwZGF0ZUV2ZW50WydkZXRhaWwnXT5cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB0eXBlLCBzb3VyY2UgfSA9IGV2ZW50LmRldGFpbDtcblxuICAgICAgaWYgKHNvdXJjZSA9PT0gZXZlbnRTb3VyY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFRva2VuVHlwZS5QVUJMSUM6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVmcmVzaCB0b2tlbiBpcyByZXF1aXJlZCBmb3IgcHVibGljIHRva2VucycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zKGlkVG9rZW4sIHJlZnJlc2hUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyUHVibGljVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkFOT05ZTU9VUzpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4oaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkdVRVNUOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVHdWVzdFRva2VucyhpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJHdWVzdFRva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRva2VuVHlwZS5DVVNUT006XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckN1c3RvbVRva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFRPS0VOX1VQREFURURfRVZFTlQsXG4gICAgICBoYW5kbGVUb2tlblVwZGF0ZSBhcyBFdmVudExpc3RlbmVyXG4gICAgKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBUT0tFTl9VUERBVEVEX0VWRU5ULFxuICAgICAgICBoYW5kbGVUb2tlblVwZGF0ZSBhcyBFdmVudExpc3RlbmVyXG4gICAgICApO1xuICAgIH07XG4gIH0sIFtcbiAgICB1cGRhdGVQdWJsaWNUb2tlbnMsXG4gICAgdXBkYXRlQW5vbnltb3VzVG9rZW4sXG4gICAgdXBkYXRlR3Vlc3RUb2tlbnMsXG4gICAgdXBkYXRlQ3VzdG9tVG9rZW4sXG4gICAgY2xlYXJUb2tlbnMsXG4gICAgY2xlYXJQdWJsaWNUb2tlbnMsXG4gICAgY2xlYXJBbm9ueW1vdXNUb2tlbnMsXG4gICAgY2xlYXJHdWVzdFRva2VucyxcbiAgICBjbGVhckN1c3RvbVRva2VucyxcbiAgXSk7XG5cbiAgcmV0dXJuIHtcbiAgICBldmVudFNvdXJjZTogZXZlbnRTb3VyY2VSZWYuY3VycmVudCxcbiAgfTtcbn1cbiIsImltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgdXNlVG9rZW5FdmVudExpc3RlbmVyIH0gZnJvbSAnLi91c2UtdG9rZW4tZXZlbnQtbGlzdGVuZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5zKCkge1xuICBjb25zdCBnZXRUb2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuZ2V0VG9rZW4pO1xuICBjb25zdCBnZXRNb3N0UHJpdmlsZWdlZFRva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5nZXRNb3N0UHJpdmlsZWdlZFRva2VuXG4gICk7XG4gIGNvbnN0IGdldFJlZnJlc2hUb2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuZ2V0UmVmcmVzaFRva2VuKTtcbiAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS51cGRhdGVQdWJsaWNUb2tlbnMpO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUudXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgdXBkYXRlR3Vlc3RUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZUd1ZXN0VG9rZW5zKTtcbiAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW4gPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZUN1c3RvbVRva2VuKTtcbiAgY29uc3QgY2xlYXJUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyUHVibGljVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyQ3VzdG9tVG9rZW5zKTtcblxuICBjb25zdCB7IGV2ZW50U291cmNlIH0gPSB1c2VUb2tlbkV2ZW50TGlzdGVuZXIoKTtcblxuICByZXR1cm4ge1xuICAgIGdldFRva2VuLFxuICAgIGdldE1vc3RQcml2aWxlZ2VkVG9rZW4sXG4gICAgZ2V0UmVmcmVzaFRva2VuLFxuICAgIHVwZGF0ZVB1YmxpY1Rva2VuczogKGlkVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbihpZFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVHdWVzdFRva2VucyhpZFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+XG4gICAgICB1cGRhdGVDdXN0b21Ub2tlbihpZFRva2VuLCBldmVudFNvdXJjZSksXG4gICAgY2xlYXJUb2tlbnM6ICgpID0+IGNsZWFyVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgICBjbGVhclB1YmxpY1Rva2VuczogKCkgPT4gY2xlYXJQdWJsaWNUb2tlbnMoZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyQ3VzdG9tVG9rZW5zOiAoKSA9PiBjbGVhckN1c3RvbVRva2VucyhldmVudFNvdXJjZSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbih0eXBlOiAnYW5vbnltb3VzJyB8ICdndWVzdCcgfCAncHVibGljJyB8ICdjdXN0b20nKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlblZhbHVlKFxuICB0eXBlOiAnYW5vbnltb3VzJyB8ICdndWVzdCcgfCAncHVibGljJyB8ICdjdXN0b20nXG4pIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdPy5pZFRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZnJlc2hUb2tlbih0eXBlOiAnYW5vbnltb3VzJyB8ICdndWVzdCcgfCAncHVibGljJykge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0/LnJlZnJlc2hUb2tlbik7XG59XG4iLCJ0eXBlIE51bGxhYmxlPFQ+ID0gVCB8IG51bGw7XG5cbmV4cG9ydCBlbnVtIEFuYWx5dGljc1dpZGdldFR5cGUge1xuICBBdmF0YXJQcm9maWxlID0gJ2F2YXRhci1wcm9maWxlJyxcbiAgQXZhdGFyQ2hhdCA9ICdhdmF0YXItY2hhdCcsXG4gIENvbW1lbnRzID0gJ2NvbW1lbnRzJyxcbiAgR2xvYmFsUHJvZmlsZSA9ICdnbG9iYWwtcHJvZmlsZScsXG4gIEdyb3VwQ2hhdCA9ICdncm91cC1jaGF0JyxcbiAgUG9sbHMgPSAncG9sbHMnLFxuICBVbml2ZXJzYWxTbmlwcGV0ID0gJ3VuaXZlcnNhbC1zbmlwcGV0Jyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tPcHRpb25zID0ge1xuICB3aWRnZXRJZDogc3RyaW5nIHwgbnVsbDtcbiAgd2lkZ2V0VHlwZTogQW5hbHl0aWNzV2lkZ2V0VHlwZTtcbiAgc2l0ZUlkOiBzdHJpbmc7XG4gIHJzV3JpdGVLZXk6IHN0cmluZztcbiAgcnNEYXRhUGxhbmVVcmw6IHN0cmluZztcbiAgdHJpZ2dlcjogc3RyaW5nO1xufTtcblxuZXhwb3J0IGVudW0gQW5hbHl0aWNzRXZlbnQge1xuICBBdXRoZW50aWNhdGlvbkNvbXBsZXRlZCA9ICdBdXRoZW50aWNhdGlvbiBDb21wbGV0ZWQnLFxuICBBdXRoZW50aWNhdGlvblN0YXJ0ZWQgPSAnQXV0aGVudGljYXRpb24gU3RhcnRlZCcsXG4gIEF1dGhlbnRpY2F0aW9uVmlld2VkID0gJ0F1dGhlbnRpY2F0aW9uIFZpZXdlZCcsXG59XG5cbmV4cG9ydCB0eXBlIFRyYWNrUHJvcHMgPSBOdWxsYWJsZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlQcm9wcyB7XG4gIGFub255bW91c0lkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVkZGVyQ29udGV4dCB7XG4gIGNoYW5uZWw6ICd3ZWInO1xuICBhbm9ueW1vdXNJZD86IHN0cmluZztcbiAgbG9jYWxlPzogc3RyaW5nO1xuICB1c2VyQWdlbnQ/OiBzdHJpbmc7XG4gIHRpbWV6b25lPzogc3RyaW5nO1xuICBvcz86IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH07XG4gIHBhZ2U/OiB7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICByZWZlcnJlcj86IHN0cmluZztcbiAgICByZWZlcnJpbmdfZG9tYWluPzogc3RyaW5nO1xuICAgIHNlYXJjaD86IHN0cmluZztcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgaW5pdGlhbF9yZWZlcnJlcj86IHN0cmluZztcbiAgICBpbml0aWFsX3JlZmVycmluZ19kb21haW4/OiBzdHJpbmc7XG4gIH07XG4gIHNjcmVlbj86IHtcbiAgICBkZW5zaXR5PzogbnVtYmVyO1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBpbm5lckhlaWdodD86IG51bWJlcjtcbiAgICBpbm5lcldpZHRoPzogbnVtYmVyO1xuICB9O1xuICBjYW1wYWlnbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG4iLCJpbXBvcnQgeyBQdWJsaWNQcm9maWxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyByZXF1ZXN0LCBzZWN1cmVkUmVxdWVzdCB9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVG9rZW4gfSBmcm9tICcuLi8uLi9ob29rcy91c2UtdG9rZW5zJztcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IHVzZVVzZXJBY3Rpb25zIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLXVzZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHJvZmlsZVNlcnZpY2VzKCkge1xuICBjb25zdCB0b2tlbiA9IHVzZVRva2VuKFRva2VuVHlwZS5QVUJMSUMpO1xuICBjb25zdCB7IHJlZnJlc2hQdWJsaWNUb2tlbnMgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgcHJvZmlsZVVybCA9IGNvbmZpZy5wcm9maWxlU2VydmljZVVybDtcblxuICBhc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNQcm9maWxlKHVzZXJJZD86IHN0cmluZyk6IFByb21pc2U8UHVibGljUHJvZmlsZT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9ICdiaW8scGhvdG9VUkwsZGlzcGxheU5hbWUsbG9jYXRpb24saGFuZGxlJztcbiAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9wdWJsaWMvdXNlcnMvJHt1c2VySWR9L3Byb2ZpbGU/ZmllbGRzPSR7ZmllbGRzfWA7XG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVQdWJsaWNQcm9maWxlKFxuICAgIHBhcmFtczogT21pdDxQdWJsaWNQcm9maWxlLCAnbWV0YWRhdGEnPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9tZS9wcm9maWxlL3BlcnNvbmFsYDtcbiAgICBhd2FpdCBzZWN1cmVkUmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgdXJsLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXJhbXMpLFxuICAgICAgfSxcbiAgICAgIHRva2VuOiB0b2tlbi5pZFRva2VuISxcbiAgICB9KTtcbiAgICByZWZyZXNoUHVibGljVG9rZW5zKHsgcmVmcmVzaFRva2VuQXBpS2V5OiBjb25maWcucmVmcmVzaFRva2VuQXBpS2V5IH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0UHVibGljUHJvZmlsZSxcbiAgICB1cGRhdGVQdWJsaWNQcm9maWxlLFxuICB9O1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnenVzdGFuZCc7XG5pbXBvcnQgeyBzdWJzY3JpYmVXaXRoU2VsZWN0b3IgfSBmcm9tICd6dXN0YW5kL21pZGRsZXdhcmUnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7XG4gIFVzZXJQcm9wcyxcbiAgRmlyZWJhc2VVc2VyLFxuICBTc29Vc2VyUHJvcHMsXG4gIFNzb1YyRXhjaGFuZ2VSZXNwb25zZSxcbn0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tICdqd3QtZGVjb2RlJztcbmltcG9ydCB7IHR5cGUgUHVibGljUHJvZmlsZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2ZpbGUvdHlwZXMnO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4vdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IEVudmlyb25tZW50LCBnZXRDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuXG5pbnRlcmZhY2UgVXNlclN0b3JlIHtcbiAgdXNlcjogVXNlclByb3BzIHwgbnVsbDtcbiAgcHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGw7XG4gIHJlZnJlc2hlZFRva2VuTG9hZGVkOiBib29sZWFuO1xuICBzZXRVc2VyOiAodXNlcjogVXNlclByb3BzIHwgbnVsbCkgPT4gdm9pZDtcbiAgc2V0UHVibGljUHJvZmlsZTogKHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsKSA9PiB2b2lkO1xuICBsb2dvdXQ6ICgpID0+IHZvaWQ7XG4gIHJlZnJlc2hQdWJsaWNUb2tlbnM6IChjb25maWc6IHtcbiAgICByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZztcbiAgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc2V0VXNlckJ5VG9rZW5JZDogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgbG9hZFN0b3JlZFVzZXI6IChjb25maWc/OiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IFByb21pc2U8dm9pZD47XG4gIHNzb1YyRXhjaGFuZ2U6IChcbiAgICBzc29Tb3VyY2VJRDogc3RyaW5nLFxuICAgIGp3dDogc3RyaW5nLFxuICAgIGVudj86IEVudmlyb25tZW50XG4gICkgPT4gUHJvbWlzZTxTc29WMkV4Y2hhbmdlUmVzcG9uc2U+O1xufVxuXG5leHBvcnQgY29uc3QgdXNlVXNlclN0b3JlID0gY3JlYXRlPFVzZXJTdG9yZT4oKShcbiAgc3Vic2NyaWJlV2l0aFNlbGVjdG9yKChzZXQsIGdldCkgPT4gKHtcbiAgICB1c2VyOiBudWxsLFxuICAgIHB1YmxpY1Byb2ZpbGU6IG51bGwsXG4gICAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IGZhbHNlLFxuXG4gICAgc2V0VXNlcjogKHVzZXI6IFVzZXJQcm9wcyB8IG51bGwpID0+IHtcbiAgICAgIHNldCh7IHVzZXIgfSk7XG4gICAgfSxcblxuICAgIHNldFB1YmxpY1Byb2ZpbGU6IChwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbCkgPT4ge1xuICAgICAgc2V0KHsgcHVibGljUHJvZmlsZSB9KTtcbiAgICB9LFxuXG4gICAgc2V0VXNlckJ5VG9rZW5JZDogKGlkVG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXNlciA9IGp3dERlY29kZTxGaXJlYmFzZVVzZXI+KGlkVG9rZW4pO1xuICAgICAgICBjb25zdCB1c2VyUHJvcHM6IFVzZXJQcm9wcyA9IHtcbiAgICAgICAgICB1aWQ6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgICBkaXNwbGF5TmFtZTogdXNlci5zYWZlRGlzcGxheU5hbWUsXG4gICAgICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICAgICAgcGhvdG9VUkw6IHVzZXIuc2FmZVBob3RvVVJMLFxuICAgICAgICAgIGhhbmRsZTogdXNlci5oYW5kbGUsXG4gICAgICAgIH07XG4gICAgICAgIHNldCh7IHVzZXI6IHVzZXJQcm9wcyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2dvdXQ6ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUuY2xlYXJQdWJsaWNUb2tlbnMoKTtcbiAgICAgICAgdG9rZW5TdG9yZS5jbGVhckN1c3RvbVRva2VucygpO1xuICAgICAgICBzZXQoeyB1c2VyOiBudWxsIH0pO1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnYXJlbmEtY29tbWVudHMtbG9nb3V0JykpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnM6IGFzeW5jIChjb25maWc6IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG5cbiAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlZnJlc2ggdG9rZW4gZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZWZpeCA9ICdodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZWFwaXMuY29tL3YxL3Rva2VuP2tleT0nO1xuICAgICAgICBjb25zdCBhcGlLZXkgPSBjb25maWcucmVmcmVzaFRva2VuQXBpS2V5O1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcmVmaXh9JHthcGlLZXl9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgY29uc3QgeyBzZXRVc2VyQnlUb2tlbklkIH0gPSBnZXQoKTtcbiAgICAgICAgc2V0VXNlckJ5VG9rZW5JZChkYXRhLmlkX3Rva2VuKTtcblxuICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICB0b2tlblN0b3JlLnVwZGF0ZVB1YmxpY1Rva2VucyhkYXRhLmlkX3Rva2VuLCBkYXRhLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIGNvbnN0IHsgbG9nb3V0IH0gPSBnZXQoKTtcbiAgICAgICAgbG9nb3V0KCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGxvYWRTdG9yZWRVc2VyOiBhc3luYyAoY29uZmlnPzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBwdWJsaWNJZFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4pO1xuICAgICAgY29uc3QgcHVibGljUmVmcmVzaFRva2VuID0gQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTik7XG4gICAgICBjb25zdCBjdXN0b21JZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pO1xuICAgICAgY29uc3QgY3VzdG9tVXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEF1dGhDb29raWUuQ1VTVE9NX1VTRVIpO1xuXG4gICAgICBpZiAoISFjdXN0b21JZFRva2VuICYmICEhY3VzdG9tVXNlcikge1xuICAgICAgICBjb25zdCBwYXJzZWRVc2VyID0gSlNPTi5wYXJzZShjdXN0b21Vc2VyKTtcblxuICAgICAgICBzZXQoeyB1c2VyOiBwYXJzZWRVc2VyIH0pO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUudXBkYXRlQ3VzdG9tVG9rZW4oY3VzdG9tSWRUb2tlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHVibGljSWRUb2tlbikge1xuICAgICAgICAgIGNvbnN0IHsgc2V0VXNlckJ5VG9rZW5JZCB9ID0gZ2V0KCk7XG4gICAgICAgICAgc2V0VXNlckJ5VG9rZW5JZChwdWJsaWNJZFRva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmIChwdWJsaWNSZWZyZXNoVG9rZW4gJiYgY29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgeyByZWZyZXNoUHVibGljVG9rZW5zIH0gPSBnZXQoKTtcbiAgICAgICAgICBhd2FpdCByZWZyZXNoUHVibGljVG9rZW5zKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0KHsgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IHRydWUgfSk7XG4gICAgfSxcblxuICAgIHNzb1YyRXhjaGFuZ2U6IGFzeW5jIChcbiAgICAgIHNzb1NvdXJjZUlEOiBzdHJpbmcsXG4gICAgICBqd3Q6IHN0cmluZyxcbiAgICAgIGVudj86IEVudmlyb25tZW50XG4gICAgKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoZW52ID8/ICdwcm9kdWN0aW9uJyk7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVVcmwgPSBjb25maWcucHJvZmlsZVNlcnZpY2VVcmw7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJvZmlsZVVybH0vc3NvL3NvdXJjZXMvJHtzc29Tb3VyY2VJRH0vdXNlcmA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBTc29WMkV4Y2hhbmdlUmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KCdQT1NUJywgdXJsLCB7XG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzaWduZWRVc2VyRGF0YTogand0IH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkVXNlciA9IGp3dERlY29kZTxTc29Vc2VyUHJvcHM+KHJlc3BvbnNlLnRva2VuKTtcblxuICAgICAgICAgIGNvbnN0IHsgc2V0VXNlciwgc2V0UHVibGljUHJvZmlsZSB9ID0gZ2V0KCk7XG5cbiAgICAgICAgICBzZXRVc2VyKHtcbiAgICAgICAgICAgIHVpZDogZGVjb2RlZFVzZXI/LnN1YixcbiAgICAgICAgICAgIGVtYWlsOiBkZWNvZGVkVXNlcj8uZW1haWwsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogZGVjb2RlZFVzZXI/LmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgcGhvdG9VUkw6IGRlY29kZWRVc2VyPy5waG90b1VSTCxcbiAgICAgICAgICAgIGhhbmRsZTogZGVjb2RlZFVzZXI/LmhhbmRsZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHNldFB1YmxpY1Byb2ZpbGUoe1xuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGRlY29kZWRVc2VyPy5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIHBob3RvVVJMOiBkZWNvZGVkVXNlcj8ucGhvdG9VUkwsXG4gICAgICAgICAgICBoYW5kbGU6IGRlY29kZWRVc2VyPy5oYW5kbGUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgIHRva2VuU3RvcmUudXBkYXRlQ3VzdG9tVG9rZW4ocmVzcG9uc2UudG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU1NPIFYyIEV4Y2hhbmdlIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0sXG4gIH0pKVxuKTtcbiIsImltcG9ydCB7IHVzZVByb2ZpbGVTZXJ2aWNlcyB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2ZpbGUvdXNlLXByb2ZpbGUtc2VydmljZXMnO1xuaW1wb3J0IHsgdXNlVXNlclN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3VzZXItc3RvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlcigpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS51c2VyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVB1YmxpY1Byb2ZpbGUoKSB7XG4gIHJldHVybiB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucHVibGljUHJvZmlsZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWZyZXNoZWRUb2tlbkxvYWRlZCgpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoZWRUb2tlbkxvYWRlZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyQWN0aW9ucygpIHtcbiAgY29uc3Qgc2V0VXNlciA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRVc2VyKTtcbiAgY29uc3Qgc2V0UHVibGljUHJvZmlsZSA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRQdWJsaWNQcm9maWxlKTtcbiAgY29uc3QgbG9nb3V0ID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLmxvZ291dCk7XG4gIGNvbnN0IHJlZnJlc2hQdWJsaWNUb2tlbnMgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucmVmcmVzaFB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IHNldFVzZXJCeVRva2VuSWQgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0VXNlckJ5VG9rZW5JZCk7XG4gIGNvbnN0IGxvYWRTdG9yZWRVc2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLmxvYWRTdG9yZWRVc2VyKTtcbiAgY29uc3Qgc3NvVjJFeGNoYW5nZSA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zc29WMkV4Y2hhbmdlKTtcbiAgXG5cbiAgcmV0dXJuIHtcbiAgICBzZXRVc2VyLFxuICAgIHNldFB1YmxpY1Byb2ZpbGUsXG4gICAgbG9nb3V0LFxuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnMsXG4gICAgc2V0VXNlckJ5VG9rZW5JZCxcbiAgICBsb2FkU3RvcmVkVXNlcixcbiAgICBzc29WMkV4Y2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXBkYXRlUHJvZmlsZSgpIHtcbiAgY29uc3QgeyB1cGRhdGVQdWJsaWNQcm9maWxlIH0gPSB1c2VQcm9maWxlU2VydmljZXMoKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGVQdWJsaWNQcm9maWxlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlcldpdGhQcm9maWxlKCkge1xuICBjb25zdCB1c2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnVzZXIpO1xuICBjb25zdCBwdWJsaWNQcm9maWxlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnB1YmxpY1Byb2ZpbGUpO1xuICBjb25zdCByZWZyZXNoZWRUb2tlbkxvYWRlZCA9IHVzZVVzZXJTdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoZWRUb2tlbkxvYWRlZFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdXNlcixcbiAgICBwdWJsaWNQcm9maWxlLFxuICAgIHJlZnJlc2hlZFRva2VuTG9hZGVkLFxuICB9O1xufVxuXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVVzZXIsIHVzZVVzZXJBY3Rpb25zIH0gZnJvbSAnLi4vaG9va3MvdXNlLXVzZXInO1xuaW1wb3J0IHsgdXNlTXV0YXRpb24gfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgdXNlUHJvZmlsZVNlcnZpY2VzIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VyUHJvdmlkZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKCk7XG4gIGNvbnN0IHsgc2V0UHVibGljUHJvZmlsZSwgbG9hZFN0b3JlZFVzZXIgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgZ2V0UHVibGljUHJvZmlsZTogZ2V0UHVibGljUHJvZmlsZVNlcnZpY2UgfSA9IHVzZVByb2ZpbGVTZXJ2aWNlcygpO1xuICBjb25zdCB7IG11dGF0ZUFzeW5jOiBnZXRQdWJsaWNQcm9maWxlIH0gPSB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogZ2V0UHVibGljUHJvZmlsZVNlcnZpY2UsXG4gIH0pO1xuXG4gIGNvbnN0IGxvYWRQdWJsaWNQcm9maWxlID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmICh1c2VyPy51aWQpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZXRQdWJsaWNQcm9maWxlKHVzZXIudWlkKTtcbiAgICAgIHNldFB1YmxpY1Byb2ZpbGUocHJvZmlsZSk7XG4gICAgfVxuICB9LCBbdXNlcj8udWlkLCBnZXRQdWJsaWNQcm9maWxlLCBzZXRQdWJsaWNQcm9maWxlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsb2FkUHVibGljUHJvZmlsZSgpO1xuICB9LCBbbG9hZFB1YmxpY1Byb2ZpbGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvYWRTdG9yZWRVc2VyKGNvbmZpZyk7XG4gIH0sIFtjb25maWcsIGxvYWRTdG9yZWRVc2VyXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICBBbmFseXRpY3NFdmVudCxcbiAgSWRlbnRpdHlQcm9wcyxcbiAgUnVkZGVyQ29udGV4dCxcbiAgVHJhY2tQcm9wcyxcbn0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW1wb3J0IHsgcmVtb3ZlUGFyYW1zRnJvbVVybCB9IGZyb20gJy4uL3V0aWxzL3VybCc7XG5cbmNvbnN0IEFOT05ZTU9VU19JRF9LRVkgPSAnYXJlbmFBbm9ueW1vdXNJZCc7XG5cbmNvbnN0IExTX0tFWVMgPSB7XG4gIGFub246ICdyc19hbm9ueW1vdXNfaWQnLFxuICBpbml0UmVmZXJyZXI6ICdyc19pbml0aWFsX3JlZmVycmVyJyxcbiAgaW5pdERvbWFpbjogJ3JzX2luaXRpYWxfcmVmZXJyaW5nX2RvbWFpbicsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7XG4gICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JTZXRBbm9ueW1vdXNJZCgpOiBzdHJpbmcge1xuICBjb25zdCBleGlzdGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuYW5vbik7XG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICBjb25zdCBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuYW5vbiwgaWQpO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVySW5pdGlhbFJlZmVycmVyKCk6IHZvaWQge1xuICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyKSkge1xuICAgIGNvbnN0IHJlZiA9IGRvY3VtZW50LnJlZmVycmVyIHx8ICckZGlyZWN0JztcbiAgICBjb25zdCBkb21haW4gPSByZWYgJiYgcmVmICE9PSAnJGRpcmVjdCcgPyBuZXcgVVJMKHJlZikuaG9zdG5hbWUgOiAnJztcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVlTLmluaXRSZWZlcnJlciwgcmVmKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVlTLmluaXREb21haW4sIGRvbWFpbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDYW1wYWlnbih1OiBVUkwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5cyA9IFtcbiAgICAndXRtX3NvdXJjZScsXG4gICAgJ3V0bV9tZWRpdW0nLFxuICAgICd1dG1fY2FtcGFpZ24nLFxuICAgICd1dG1fdGVybScsXG4gICAgJ3V0bV9jb250ZW50JyxcbiAgXTtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGtleXMuZm9yRWFjaChrID0+IHtcbiAgICBjb25zdCB2ID0gdS5zZWFyY2hQYXJhbXMuZ2V0KGspO1xuICAgIGlmICh2KSBvdXRba10gPSB2O1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID8gb3V0IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSdWRkZXJDb250ZXh0KCk6IFJ1ZGRlckNvbnRleHQge1xuICBjb25zdCB3ID0gd2luZG93O1xuICBjb25zdCBkID0gZG9jdW1lbnQ7XG4gIGNvbnN0IHMgPSB3aW5kb3cuc2NyZWVuO1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHcubG9jYXRpb24uaHJlZik7XG5cbiAgcmVtZW1iZXJJbml0aWFsUmVmZXJyZXIoKTtcblxuICBjb25zdCBpbml0aWFsX3JlZmVycmVyID1cbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmluaXRSZWZlcnJlcikgfHwgJyRkaXJlY3QnO1xuICBjb25zdCBpbml0aWFsX3JlZmVycmluZ19kb21haW4gPVxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdERvbWFpbikgfHwgJyc7XG5cbiAgcmV0dXJuIHtcbiAgICBjaGFubmVsOiAnd2ViJyxcbiAgICBhbm9ueW1vdXNJZDogZ2V0T3JTZXRBbm9ueW1vdXNJZCgpLFxuICAgIGxvY2FsZTogbmF2aWdhdG9yLmxhbmd1YWdlLFxuICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICB0aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICAgIG9zOiB7IG5hbWU6IG5hdmlnYXRvci5wbGF0Zm9ybSwgdmVyc2lvbjogdW5kZWZpbmVkIH0sXG4gICAgcGFnZToge1xuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcmVmZXJyZXI6IGQucmVmZXJyZXIgfHwgJyRkaXJlY3QnLFxuICAgICAgcmVmZXJyaW5nX2RvbWFpbjogZC5yZWZlcnJlciA/IG5ldyBVUkwoZC5yZWZlcnJlcikuaG9zdG5hbWUgOiAnJyxcbiAgICAgIHNlYXJjaDogdXJsLnNlYXJjaCxcbiAgICAgIHRpdGxlOiBkLnRpdGxlLFxuICAgICAgdXJsOiB1cmwudG9TdHJpbmcoKSxcbiAgICAgIGluaXRpYWxfcmVmZXJyZXIsXG4gICAgICBpbml0aWFsX3JlZmVycmluZ19kb21haW4sXG4gICAgfSxcbiAgICBzY3JlZW46IHtcbiAgICAgIGRlbnNpdHk6ICh3LmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPz8gMSxcbiAgICAgIGhlaWdodDogcy5oZWlnaHQsXG4gICAgICB3aWR0aDogcy53aWR0aCxcbiAgICAgIGlubmVySGVpZ2h0OiB3LmlubmVySGVpZ2h0LFxuICAgICAgaW5uZXJXaWR0aDogdy5pbm5lcldpZHRoLFxuICAgIH0sXG4gICAgY2FtcGFpZ246IHBhcnNlQ2FtcGFpZ24odXJsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0SWRlbnRpZmllcihvcHRpb25zOiBJZGVudGl0eVByb3BzID0ge30pOiBJZGVudGl0eVByb3BzIHtcbiAgY29uc3QgaWRlbnRpZmllcjogSWRlbnRpdHlQcm9wcyA9IHt9O1xuXG4gIGlmIChvcHRpb25zLnVzZXJJZCkge1xuICAgIGlkZW50aWZpZXIudXNlcklkID0gb3B0aW9ucy51c2VySWQ7XG4gIH1cblxuICBsZXQgY3VycmVudEFub255bW91c0lkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICB0cnkge1xuICAgIGN1cnJlbnRBbm9ueW1vdXNJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEFOT05ZTU9VU19JRF9LRVkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFjY2VzcyBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYW5vbnltb3VzSWQpIHtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gb3B0aW9ucy5hbm9ueW1vdXNJZDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSwgb3B0aW9ucy5hbm9ueW1vdXNJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgYW5vbnltb3VzSWQgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY3VycmVudEFub255bW91c0lkKSB7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IGN1cnJlbnRBbm9ueW1vdXNJZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuZXdBbm9ueW1vdXNJZCA9IGdlbmVyYXRlVVVJRCgpO1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBuZXdBbm9ueW1vdXNJZDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSwgbmV3QW5vbnltb3VzSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIG5ldyBhbm9ueW1vdXNJZCB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVyO1xufVxuXG5mdW5jdGlvbiBnZXRDYW5vbmljYWxVcmwoKTogc3RyaW5nIHtcbiAgY29uc3QgY2Fub25pY2FsTWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgJ2xpbmtbcmVsPVwiY2Fub25pY2FsXCJdJ1xuICApIGFzIEhUTUxMaW5rRWxlbWVudDtcbiAgY29uc3QgcmF3VXJsID0gY2Fub25pY2FsTWV0YT8uaHJlZiB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgcmV0dXJuIHJlbW92ZVBhcmFtc0Zyb21VcmwocmF3VXJsKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRQcm9wZXJ0aWVzKFxuICB3aWRnZXRUeXBlOiBzdHJpbmcsXG4gIHByb3BlcnRpZXM6IFRyYWNrUHJvcHMsXG4gIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuKSB7XG4gIHJldHVybiB7XG4gICAgcHJvcGVydGllczoge1xuICAgICAgd2lkZ2V0X3R5cGU6IHdpZGdldFR5cGUsXG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgZG9tYWluOiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsXG4gICAgICB0aXRsZTogd2luZG93LmRvY3VtZW50LnRpdGxlLFxuICAgICAgY2Fub25pY2FsX3VybDogZ2V0Q2Fub25pY2FsVXJsKCksXG4gICAgICBzbmlwcGV0X2lkOiB3aW5kb3cuX19BUkVOQV9fPy5zbmlwcGV0SWQgfHwgbnVsbCxcbiAgICAgIC4uLnByb3BlcnRpZXMsXG4gICAgfSxcbiAgICBjb250ZXh0OiBidWlsZFJ1ZGRlckNvbnRleHQoKSxcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBpbnRlZ3JhdGlvbnM6IHsgQWxsOiB0cnVlIH0sXG4gICAgLi4uZ2V0SWRlbnRpZmllcihpZGVudGl0eSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50SGVhZGVycyh3cml0ZUtleTogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICBBdXRob3JpemF0aW9uOiAnQmFzaWMgJyArIGJ0b2EoYCR7d3JpdGVLZXl9OmApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5hbHl0aWNzKHdyaXRlS2V5OiBzdHJpbmcsIGRhdGFQbGFuZVVybDogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgcGFnZTogYXN5bmMgKFxuICAgICAgd2lkZ2V0VHlwZTogQW5hbHl0aWNzV2lkZ2V0VHlwZSxcbiAgICAgIHByb3BlcnRpZXM6IFRyYWNrUHJvcHMsXG4gICAgICBpZGVudGl0eT86IElkZW50aXR5UHJvcHNcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7ZGF0YVBsYW5lVXJsfS92MS9wYWdlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5KSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgICAgICAuLi5nZXRFdmVudFByb3BlcnRpZXMod2lkZ2V0VHlwZSwgcHJvcGVydGllcywgaWRlbnRpdHkpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzZW5kIHBhZ2UgZXZlbnQgdG8gUnVkZGVyc3RhY2snKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRyYWNrOiBhc3luYyAoXG4gICAgICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICAgICAgZXZlbnQ6IEFuYWx5dGljc0V2ZW50LFxuICAgICAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgICAgIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtkYXRhUGxhbmVVcmx9L3YxL3RyYWNrYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5KSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHR5cGU6ICd0cmFjaycsXG4gICAgICAgICAgLi4uZ2V0RXZlbnRQcm9wZXJ0aWVzKHdpZGdldFR5cGUsIHByb3BlcnRpZXMsIGlkZW50aXR5KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2VuZCB0cmFjayBldmVudCB0byBSdWRkZXJzdGFjaycpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcmVtb3ZlUGFyYW1zRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgdXJsT2JqLnNlYXJjaCA9ICcnO1xuXG4gICAgcmV0dXJuIHVybE9iai5ocmVmO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNsZWFyaW5nIHNlYXJjaCBwYXJhbXMgZnJvbSBVUkw6JywgZXJyb3IpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cbiIsImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0QW5hbHl0aWNzIH0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzJztcbmltcG9ydCB7IEFuYWx5dGljc0V2ZW50LCBUcmFja09wdGlvbnMgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVHJhY2sodHJhY2tPcHRpb25zPzogVHJhY2tPcHRpb25zKSB7XG4gIGNvbnN0IHRyYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnQ6IEFuYWx5dGljc0V2ZW50LFxuICAgICAgdXNlcklkPzogc3RyaW5nLFxuICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+XG4gICAgKSA9PiB7XG4gICAgICBpZiAoIXRyYWNrT3B0aW9ucykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhbmFseXRpY3MgPSBnZXRBbmFseXRpY3MoXG4gICAgICAgIHRyYWNrT3B0aW9ucy5yc1dyaXRlS2V5LFxuICAgICAgICB0cmFja09wdGlvbnMucnNEYXRhUGxhbmVVcmxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRyYWNrUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gPSB7XG4gICAgICAgIHNpdGVfaWQ6IHRyYWNrT3B0aW9ucy5zaXRlSWQsXG4gICAgICAgIHdpZGdldF9pZDogdHJhY2tPcHRpb25zLndpZGdldElkLFxuICAgICAgICB0cmlnZ2VyOiB0cmFja09wdGlvbnMudHJpZ2dlcixcbiAgICAgICAgLi4ucHJvcGVydGllcyxcbiAgICAgIH07XG5cbiAgICAgIGFuYWx5dGljcy50cmFjayhcbiAgICAgICAgdHJhY2tPcHRpb25zLndpZGdldFR5cGUsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0cmFja1Byb3BlcnRpZXMsXG4gICAgICAgIHVzZXJJZCA/IHsgdXNlcklkIH0gOiB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSxcbiAgICBbdHJhY2tPcHRpb25zXVxuICApO1xuXG4gIHJldHVybiB0cmFjaztcbn1cbiIsImltcG9ydCB7IHVzZUF1dGhEaWFsb2cgfSBmcm9tICcuLi9jb250ZXh0L2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVVzZXJBY3Rpb25zIH0gZnJvbSAnLi4vaG9va3MvdXNlLXVzZXInO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVG9rZW5zIH0gZnJvbSAnLi4vaG9va3MvdXNlLXRva2Vucyc7XG5pbXBvcnQgeyBBbmFseXRpY3NFdmVudCB9IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5pbXBvcnQgeyB1c2VUcmFjayB9IGZyb20gJy4uL2hvb2tzL3VzZS10cmFjayc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEF1dGhEaWFsb2coKSB7XG4gIGNvbnN0IHtcbiAgICBhcHBOYW1lLFxuICAgIGFwcERlc2NyaXB0aW9uLFxuICAgIGxhbmd1YWdlLFxuICAgIHRyYWNrT3B0aW9ucyxcbiAgICBpc09wZW4sXG4gICAgY2xvc2VEaWFsb2csXG4gICAgb25BdXRoQ29tcGxldGVkLFxuICB9ID0gdXNlQXV0aERpYWxvZygpO1xuICBjb25zdCBmcmFtZUFwcE5hbWUgPSBhcHBOYW1lIHx8ICdBcmVuYSBBSSBDaGF0JztcbiAgY29uc3QgZnJhbWVBcHBEZXNjcmlwdGlvbiA9IGFwcERlc2NyaXB0aW9uIHx8ICdBcmVuYSBBSSBDaGF0JztcbiAgY29uc3QgeyBzZXRVc2VyIH0gPSB1c2VVc2VyQWN0aW9ucygpO1xuICBjb25zdCB7IHVwZGF0ZVB1YmxpY1Rva2VucyB9ID0gdXNlVG9rZW5zKCk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcblxuICBjb25zdCB0cmFjayA9IHVzZVRyYWNrKHRyYWNrT3B0aW9ucyk7XG5cbiAgY29uc3QgaWZyYW1lVXJsID0gYCR7Y29uZmlnLmF1dGhJZnJhbWVVcmx9Lz9hcHAtbmFtZT0ke2ZyYW1lQXBwTmFtZX0mYXBwLWRlc2NyaXB0aW9uPSR7ZnJhbWVBcHBEZXNjcmlwdGlvbn0mbGFuZ3VhZ2U9JHtsYW5ndWFnZSA/PyAnZW4nfWA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8uc291cmNlICE9PSAnYXJlbmEtYXV0aGVudGljYXRpb24nKSByZXR1cm47XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdjYW5jZWxlZCcpIHtcbiAgICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tdmlld2VkJykge1xuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvblZpZXdlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLXN0YXJ0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHsgYXV0aFR5cGUgfSA9IG1lc3NhZ2UuZGF0YT8ucGF5bG9hZCB8fCB7fTtcbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25TdGFydGVkLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICBhdXRoVHlwZTogYXV0aFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi1jb21wbGV0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHsgaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB1c2VyLCBhdXRoVHlwZSwgaXNTaWdudXAgfSA9XG4gICAgICAgICAgbWVzc2FnZS5kYXRhPy5wYXlsb2FkIHx8IHt9O1xuXG4gICAgICAgIGlmICghdXNlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGNvbXBsZXRlZCBidXQgdXNlciBkYXRhIGlzIG1pc3NpbmcnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvbkNvbXBsZXRlZCwgdXNlci51aWQsIHtcbiAgICAgICAgICBpc19zaWdudXA6IGlzU2lnbnVwLFxuICAgICAgICAgIGF1dGhfdHlwZTogYXV0aFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICBvbkF1dGhDb21wbGV0ZWQ/Lih1c2VyKTtcbiAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zKGlkVG9rZW4sIHJlZnJlc2hUb2tlbik7XG4gICAgICAgIHNldFVzZXIodXNlcik7XG4gICAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcblxuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICB9LCBbc2V0VXNlciwgdXBkYXRlUHVibGljVG9rZW5zLCBvbkF1dGhDb21wbGV0ZWQsIHRyYWNrLCBjbG9zZURpYWxvZ10pO1xuXG4gIHJldHVybiBpc09wZW4gPyAoXG4gICAgPGlmcmFtZVxuICAgICAgc3JjPXtpZnJhbWVVcmx9XG4gICAgICB0aXRsZT1cIkFyZW5hIEF1dGhlbnRpY2F0aW9uXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHdpZHRoOiAnMTAwdncnLFxuICAgICAgICBoZWlnaHQ6ICcxMDB2aCcsXG4gICAgICAgIHpJbmRleDogOTk5OTk5OTk5OSxcbiAgICAgIH19XG4gICAgPjwvaWZyYW1lPlxuICApIDogbnVsbDtcbn1cbiIsImltcG9ydCB7IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHJlcXVlc3QgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyJztcblxuY29uc3QgUlVEREVSX0FOT05ZTU9VU19JRF9TVE9SQUdFX0tFWSA9ICdhcmVuYS1hbmFseXRpY3M6cnMtYW5vbnltb3VzLWlkJztcblxudHlwZSBSdWRkZXJXaW5kb3cgPSBXaW5kb3cgJiB7XG4gIHJ1ZGRlcmFuYWx5dGljcz86IHsgZ2V0QW5vbnltb3VzSWQ/OiAoKSA9PiBzdHJpbmcgfCBudWxsIH07XG4gIHJ1ZGRlckFuYWx5dGljcz86IHsgZ2V0QW5vbnltb3VzSWQ/OiAoKSA9PiBzdHJpbmcgfCBudWxsIH07XG59O1xuXG5mdW5jdGlvbiBwYXJzZUFub255bW91c0lkKHZhbHVlPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBwYXJzZWQgPSB2YWx1ZT8udHJpbSgpO1xuICBpZiAoIXBhcnNlZCB8fCBwYXJzZWQgPT09ICdudWxsJyB8fCBwYXJzZWQgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1ZGRlckFub255bW91c0lkKCk6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHJ1ZGRlcldpbmRvdyA9IHdpbmRvdyBhcyBSdWRkZXJXaW5kb3c7XG4gIGNvbnN0IGZyb21SdWRkZXJDbGllbnQgPSBwYXJzZUFub255bW91c0lkKFxuICAgIHJ1ZGRlcldpbmRvdy5ydWRkZXJhbmFseXRpY3M/LmdldEFub255bW91c0lkPy4oKSA/P1xuICAgICAgcnVkZGVyV2luZG93LnJ1ZGRlckFuYWx5dGljcz8uZ2V0QW5vbnltb3VzSWQ/LigpLFxuICApO1xuICBpZiAoZnJvbVJ1ZGRlckNsaWVudCkgcmV0dXJuIGZyb21SdWRkZXJDbGllbnQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VBbm9ueW1vdXNJZChcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShSVURERVJfQU5PTllNT1VTX0lEX1NUT1JBR0VfS0VZKSxcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQXV0aFNlcnZpY2VzKCkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IGlkZW50aXR5VXJsID0gY29uZmlnLmlkZW50aXR5U2VydmljZVVybDtcblxuICBhc3luYyBmdW5jdGlvbiBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuKCk6IFByb21pc2U8RXhjaGFuZ2VUb2tlbnNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHVybCA9IGAke2lkZW50aXR5VXJsfS9hbm9ueW1vdXMtdG9rZW5gO1xuICAgIGNvbnN0IGFub255bW91c0lkID0gZ2V0UnVkZGVyQW5vbnltb3VzSWQoKTtcblxuICAgIGlmICghYW5vbnltb3VzSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KCdQT1NUJywgdXJsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdCgnUE9TVCcsIHVybCwge1xuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhbm9ueW1vdXNJZCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbixcbiAgfTtcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHtcbiAgZ2V0UnVkZGVyQW5vbnltb3VzSWQsXG4gIHVzZUF1dGhTZXJ2aWNlcyxcbn0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC91c2UtYXV0aC1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBBbm9ueW1vdXNUb2tlblByb3ZpZGVyKHtcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59KSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgdG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnMpO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUudXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgeyBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuIH0gPSB1c2VBdXRoU2VydmljZXMoKTtcbiAgY29uc3QgaGFzRm9yY2VkUmVmcmVzaEluRGVidWdSZWYgPSB1c2VSZWYoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcnVkZGVyQW5vbnltb3VzSWQgPSBnZXRSdWRkZXJBbm9ueW1vdXNJZCgpO1xuICAgIGNvbnN0IHNob3VsZFJlZnJlc2hBbm9ueW1vdXNUb2tlbiA9XG4gICAgICAhdG9rZW5zLmFub255bW91cy5pZFRva2VuIHx8XG4gICAgICAoY29uZmlnLmRlYnVnICYmXG4gICAgICAgIEJvb2xlYW4ocnVkZGVyQW5vbnltb3VzSWQpICYmXG4gICAgICAgICFoYXNGb3JjZWRSZWZyZXNoSW5EZWJ1Z1JlZi5jdXJyZW50KTtcblxuICAgIGlmICghc2hvdWxkUmVmcmVzaEFub255bW91c1Rva2VuKSByZXR1cm47XG5cbiAgICBpZiAodG9rZW5zLmFub255bW91cy5pZFRva2VuKSB7XG4gICAgICBoYXNGb3JjZWRSZWZyZXNoSW5EZWJ1Z1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuKClcbiAgICAgIC50aGVuKCh0b2tlbjogRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSkgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbihcbiAgICAgICAgICB0b2tlbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgdG9rZW5zLmFub255bW91cy5pZFRva2VuID8gJ2ZvcmNlLXJlZnJlc2gtZGVidWcnIDogdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKHRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbikge1xuICAgICAgICAgIGhhc0ZvcmNlZFJlZnJlc2hJbkRlYnVnUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhY3Qtc2RrLWF1dGhdIGdldEFub255bW91c0lkZW50aXR5VG9rZW4gZmFpbGVkJywge1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9LCBbXG4gICAgY29uZmlnLmRlYnVnLFxuICAgIHRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbixcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbixcbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuLFxuICBdKTtcblxuICByZXR1cm4gY2hpbGRyZW47XG59XG4iLCJpbXBvcnQgeyBBdXRoRGlhbG9nUHJvdmlkZXIgfSBmcm9tICcuL2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbmltcG9ydCB7IFF1ZXJ5Q2xpZW50LCBRdWVyeUNsaWVudFByb3ZpZGVyIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IFVzZXJQcm92aWRlciB9IGZyb20gJy4vdXNlci1wcm92aWRlcic7XG5pbXBvcnQgeyBDb25maWdQcm92aWRlciB9IGZyb20gJy4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBBdXRoRGlhbG9nIGZyb20gJy4uL2RpYWxvZyc7XG5pbXBvcnQgeyBBbm9ueW1vdXNUb2tlblByb3ZpZGVyIH0gZnJvbSAnLi9hbm9ueW1vdXMtdG9rZW4tcHJvdmlkZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gQXV0aFByb3ZpZGVyKHtcbiAgY2hpbGRyZW4sXG4gIHF1ZXJ5Q2xpZW50LFxuICBlbnZpcm9ubWVudCxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgcXVlcnlDbGllbnQ/OiBRdWVyeUNsaWVudDtcbiAgZW52aXJvbm1lbnQ/OiAncHJvZHVjdGlvbicgfCAnZGV2ZWxvcG1lbnQnO1xufSkge1xuICBxdWVyeUNsaWVudCA9IHF1ZXJ5Q2xpZW50IHx8IG5ldyBRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiAoXG4gICAgPFF1ZXJ5Q2xpZW50UHJvdmlkZXIgY2xpZW50PXtxdWVyeUNsaWVudH0+XG4gICAgICA8Q29uZmlnUHJvdmlkZXIgZW52aXJvbm1lbnQ9e2Vudmlyb25tZW50fT5cbiAgICAgICAgPFVzZXJQcm92aWRlcj5cbiAgICAgICAgICA8QXV0aERpYWxvZ1Byb3ZpZGVyPlxuICAgICAgICAgICAgPEFub255bW91c1Rva2VuUHJvdmlkZXI+XG4gICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAgPEF1dGhEaWFsb2cgLz5cbiAgICAgICAgICAgIDwvQW5vbnltb3VzVG9rZW5Qcm92aWRlcj5cbiAgICAgICAgICA8L0F1dGhEaWFsb2dQcm92aWRlcj5cbiAgICAgICAgPC9Vc2VyUHJvdmlkZXI+XG4gICAgICA8L0NvbmZpZ1Byb3ZpZGVyPlxuICAgIDwvUXVlcnlDbGllbnRQcm92aWRlcj5cbiAgKTtcbn1cblxuZXhwb3J0IHsgdXNlQXV0aERpYWxvZyB9IGZyb20gJy4vYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuIl0sIm5hbWVzIjpbIkF1dGhEaWFsb2dDb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsInVuZGVmaW5lZCIsIkF1dGhEaWFsb2dQcm92aWRlciIsImNoaWxkcmVuIiwiaXNPcGVuIiwic2V0SXNPcGVuIiwidXNlU3RhdGUiLCJhcHBOYW1lIiwic2V0QXBwTmFtZSIsImFwcERlc2NyaXB0aW9uIiwic2V0QXBwRGVzY3JpcHRpb24iLCJvbkF1dGhDb21wbGV0ZWQiLCJzZXRPbkF1dGhDb21wbGV0ZWQiLCJ0cmFja09wdGlvbnMiLCJzZXRUcmFja09wdGlvbnMiLCJsYW5ndWFnZSIsInNldExhbmd1YWdlIiwiX2pzeCIsIlByb3ZpZGVyIiwidmFsdWUiLCJvcGVuRGlhbG9nIiwiY2xvc2VEaWFsb2ciLCJvbk9wZW5DaGFuZ2UiLCJvcGVuIiwidXNlQXV0aERpYWxvZyIsImNvbnRleHQiLCJ1c2VDb250ZXh0IiwiRXJyb3IiLCJnZXRDb25maWciLCJlbnZpcm9ubWVudCIsImlzRGV2IiwicHJvZmlsZVNlcnZpY2VVcmwiLCJpZGVudGl0eVNlcnZpY2VVcmwiLCJyZWZyZXNoVG9rZW5BcGlLZXkiLCJhdXRoSWZyYW1lVXJsIiwiZGVidWciLCJDb25maWdDb250ZXh0IiwiQ29uZmlnUHJvdmlkZXIiLCJjb25maWciLCJ1c2VDb25maWciLCJkZWZhdWx0SGVhZGVycyIsImFzeW5jIiwicmVxdWVzdCIsIm1ldGhvZCIsInVybCIsIm9wdGlvbnMiLCJyZXNwb25zZSIsImZldGNoIiwiaGVhZGVycyIsIm9rIiwic3RhdHVzVGV4dCIsImpzb24iLCJUb2tlblR5cGUiLCJBdXRoQ29va2llIiwiVE9LRU5fVVBEQVRFRF9FVkVOVCIsImRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQiLCJ0eXBlIiwicGFyYW1zIiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJkZWZhdWx0VG9rZW5zIiwicHVibGljIiwiaWRUb2tlbiIsIkNvb2tpZXMiLCJnZXQiLCJQVUJMSUNfSURfVE9LRU4iLCJyZWZyZXNoVG9rZW4iLCJQVUJMSUNfUkVGUkVTSF9UT0tFTiIsImFub255bW91cyIsIkFOT05ZTU9VU19JRF9UT0tFTiIsImd1ZXN0IiwiR1VFU1RfSURfVE9LRU4iLCJjdXN0b20iLCJDVVNUT01fSURfVE9LRU4iLCJ1c2VUb2tlblN0b3JlIiwiY3JlYXRlIiwic3Vic2NyaWJlV2l0aFNlbGVjdG9yIiwic2V0IiwidXBkYXRlUHVibGljVG9rZW5zSGVscGVyIiwic291cmNlIiwidG9rZW5zIiwic3RhdGUiLCJleHBpcmVzIiwiUFVCTElDIiwidXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIiLCJBTk9OWU1PVVMiLCJ1cGRhdGVHdWVzdFRva2Vuc0hlbHBlciIsIkdVRVNUIiwidXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIiLCJDVVNUT00iLCJjbGVhclB1YmxpY1Rva2Vuc0hlbHBlciIsInJlbW92ZSIsImNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyIiwiY2xlYXJHdWVzdFRva2Vuc0hlbHBlciIsImNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyIiwibG9jYWxTdG9yYWdlIiwicmVtb3ZlSXRlbSIsIkNVU1RPTV9VU0VSIiwiZ2V0VG9rZW4iLCJnZXRNb3N0UHJpdmlsZWdlZFRva2VuIiwiaW5jbHVkZXMiLCJnZXRSZWZyZXNoVG9rZW4iLCJ1cGRhdGVQdWJsaWNUb2tlbnMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbiIsInVwZGF0ZUd1ZXN0VG9rZW5zIiwidXBkYXRlQ3VzdG9tVG9rZW4iLCJjbGVhclRva2VucyIsImNsZWFyUHVibGljVG9rZW5zIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJjbGVhckd1ZXN0VG9rZW5zIiwiY2xlYXJDdXN0b21Ub2tlbnMiLCJzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnMiLCJzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbiIsInNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zIiwic2lsZW50VXBkYXRlQ3VzdG9tVG9rZW4iLCJzaWxlbnRDbGVhclB1YmxpY1Rva2VucyIsInNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zIiwic2lsZW50Q2xlYXJHdWVzdFRva2VucyIsInNpbGVudENsZWFyQ3VzdG9tVG9rZW5zIiwidXNlVG9rZW5FdmVudExpc3RlbmVyIiwiZXZlbnRTb3VyY2VSZWYiLCJ1c2VSZWYiLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHIiLCJ1c2VFZmZlY3QiLCJoYW5kbGVUb2tlblVwZGF0ZSIsImV2ZW50IiwiY3VycmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZXZlbnRTb3VyY2UiLCJ1c2VUb2tlbnMiLCJ1c2VUb2tlbiIsInVzZVRva2VuVmFsdWUiLCJ1c2VSZWZyZXNoVG9rZW4iLCJBbmFseXRpY3NXaWRnZXRUeXBlIiwiQW5hbHl0aWNzRXZlbnQiLCJ1c2VQcm9maWxlU2VydmljZXMiLCJ0b2tlbiIsInJlZnJlc2hQdWJsaWNUb2tlbnMiLCJ1c2VVc2VyQWN0aW9ucyIsInByb2ZpbGVVcmwiLCJnZXRQdWJsaWNQcm9maWxlIiwidXNlcklkIiwidXBkYXRlUHVibGljUHJvZmlsZSIsIkF1dGhvcml6YXRpb24iLCJwYXlsb2FkIiwidGV4dCIsInN0YXR1cyIsImVycm9ycyIsIkpTT04iLCJwYXJzZSIsImNvbnRlbnRUeXBlIiwiZXJyb3IiLCJjb25zb2xlIiwic2VjdXJlZFJlcXVlc3QiLCJib2R5Iiwic3RyaW5naWZ5IiwidXNlVXNlclN0b3JlIiwidXNlciIsInB1YmxpY1Byb2ZpbGUiLCJyZWZyZXNoZWRUb2tlbkxvYWRlZCIsInNldFVzZXIiLCJzZXRQdWJsaWNQcm9maWxlIiwic2V0VXNlckJ5VG9rZW5JZCIsImp3dERlY29kZSIsInVzZXJQcm9wcyIsInVpZCIsInVzZXJfaWQiLCJkaXNwbGF5TmFtZSIsInNhZmVEaXNwbGF5TmFtZSIsImVtYWlsIiwicGhvdG9VUkwiLCJzYWZlUGhvdG9VUkwiLCJoYW5kbGUiLCJsb2dvdXQiLCJ0b2tlblN0b3JlIiwiZ2V0U3RhdGUiLCJFdmVudCIsIlVSTFNlYXJjaFBhcmFtcyIsInJlZnJlc2hfdG9rZW4iLCJncmFudF90eXBlIiwiZGF0YSIsImlkX3Rva2VuIiwibG9hZFN0b3JlZFVzZXIiLCJwdWJsaWNJZFRva2VuIiwicHVibGljUmVmcmVzaFRva2VuIiwiY3VzdG9tSWRUb2tlbiIsImdldEl0ZW0iLCJjdXN0b21Vc2VyIiwicGFyc2VkVXNlciIsInNzb1YyRXhjaGFuZ2UiLCJzc29Tb3VyY2VJRCIsImp3dCIsImVudiIsInNpZ25lZFVzZXJEYXRhIiwiZGVjb2RlZFVzZXIiLCJzdWIiLCJ1c2VVc2VyIiwidXNlUHVibGljUHJvZmlsZSIsInVzZVJlZnJlc2hlZFRva2VuTG9hZGVkIiwidXNlVXBkYXRlUHJvZmlsZSIsInVzZVVzZXJXaXRoUHJvZmlsZSIsIlVzZXJQcm92aWRlciIsImdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlIiwibXV0YXRlQXN5bmMiLCJ1c2VNdXRhdGlvbiIsIm11dGF0aW9uRm4iLCJsb2FkUHVibGljUHJvZmlsZSIsInVzZUNhbGxiYWNrIiwicHJvZmlsZSIsIkFOT05ZTU9VU19JRF9LRVkiLCJMU19LRVlTIiwiZ2V0T3JTZXRBbm9ueW1vdXNJZCIsImV4aXN0aW5nIiwiaWQiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwic2V0SXRlbSIsInBhcnNlQ2FtcGFpZ24iLCJ1Iiwib3V0IiwiZm9yRWFjaCIsImsiLCJ2Iiwic2VhcmNoUGFyYW1zIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImJ1aWxkUnVkZGVyQ29udGV4dCIsInciLCJ3aW5kb3ciLCJkIiwicyIsInNjcmVlbiIsIlVSTCIsImxvY2F0aW9uIiwiaHJlZiIsInJlZiIsInJlZmVycmVyIiwiZG9tYWluIiwiaG9zdG5hbWUiLCJyZW1lbWJlckluaXRpYWxSZWZlcnJlciIsImluaXRpYWxfcmVmZXJyZXIiLCJpbml0aWFsX3JlZmVycmluZ19kb21haW4iLCJjaGFubmVsIiwiYW5vbnltb3VzSWQiLCJsb2NhbGUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0aW1lem9uZSIsIkludGwiLCJEYXRlVGltZUZvcm1hdCIsInJlc29sdmVkT3B0aW9ucyIsInRpbWVab25lIiwib3MiLCJuYW1lIiwicGxhdGZvcm0iLCJ2ZXJzaW9uIiwicGFnZSIsInBhdGgiLCJwYXRobmFtZSIsInJlZmVycmluZ19kb21haW4iLCJzZWFyY2giLCJ0aXRsZSIsImRlbnNpdHkiLCJkZXZpY2VQaXhlbFJhdGlvIiwiaGVpZ2h0Iiwid2lkdGgiLCJpbm5lckhlaWdodCIsImlubmVyV2lkdGgiLCJjYW1wYWlnbiIsImdldElkZW50aWZpZXIiLCJpZGVudGlmaWVyIiwiY3VycmVudEFub255bW91c0lkIiwid2FybiIsIm5ld0Fub255bW91c0lkIiwicmVwbGFjZSIsImMiLCJyIiwiZ2V0Q2Fub25pY2FsVXJsIiwiY2Fub25pY2FsTWV0YSIsInF1ZXJ5U2VsZWN0b3IiLCJ1cmxPYmoiLCJyZW1vdmVQYXJhbXNGcm9tVXJsIiwiZ2V0RXZlbnRQcm9wZXJ0aWVzIiwid2lkZ2V0VHlwZSIsInByb3BlcnRpZXMiLCJpZGVudGl0eSIsIndpZGdldF90eXBlIiwiY2Fub25pY2FsX3VybCIsInNuaXBwZXRfaWQiLCJfX0FSRU5BX18iLCJzbmlwcGV0SWQiLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJpbnRlZ3JhdGlvbnMiLCJBbGwiLCJnZXRFdmVudEhlYWRlcnMiLCJ3cml0ZUtleSIsImJ0b2EiLCJ1c2VUcmFjayIsImFuYWx5dGljcyIsInJzV3JpdGVLZXkiLCJkYXRhUGxhbmVVcmwiLCJyc0RhdGFQbGFuZVVybCIsInRyYWNrIiwidHJhY2tQcm9wZXJ0aWVzIiwic2l0ZV9pZCIsInNpdGVJZCIsIndpZGdldF9pZCIsIndpZGdldElkIiwidHJpZ2dlciIsIkF1dGhEaWFsb2ciLCJmcmFtZUFwcE5hbWUiLCJmcmFtZUFwcERlc2NyaXB0aW9uIiwiaWZyYW1lVXJsIiwiaGFuZGxlciIsIm1lc3NhZ2UiLCJhdXRoVHlwZSIsIkF1dGhlbnRpY2F0aW9uU3RhcnRlZCIsImlzU2lnbnVwIiwiQXV0aGVudGljYXRpb25Db21wbGV0ZWQiLCJpc19zaWdudXAiLCJhdXRoX3R5cGUiLCJBdXRoZW50aWNhdGlvblZpZXdlZCIsInNyYyIsInN0eWxlIiwicG9zaXRpb24iLCJ0b3AiLCJsZWZ0IiwiekluZGV4IiwicGFyc2VBbm9ueW1vdXNJZCIsInBhcnNlZCIsInRyaW0iLCJnZXRSdWRkZXJBbm9ueW1vdXNJZCIsInJ1ZGRlcldpbmRvdyIsImZyb21SdWRkZXJDbGllbnQiLCJydWRkZXJhbmFseXRpY3MiLCJnZXRBbm9ueW1vdXNJZCIsInJ1ZGRlckFuYWx5dGljcyIsIkFub255bW91c1Rva2VuUHJvdmlkZXIiLCJnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuIiwiaWRlbnRpdHlVcmwiLCJ1c2VBdXRoU2VydmljZXMiLCJoYXNGb3JjZWRSZWZyZXNoSW5EZWJ1Z1JlZiIsInJ1ZGRlckFub255bW91c0lkIiwiQm9vbGVhbiIsInRoZW4iLCJhY2Nlc3NfdG9rZW4iLCJjYXRjaCIsIkF1dGhQcm92aWRlciIsInF1ZXJ5Q2xpZW50IiwiUXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudFByb3ZpZGVyIiwiY2xpZW50IiwiX2pzeHMiXSwibWFwcGluZ3MiOiI0WkFnQkEsTUFBTUEsRUFBb0JDLE9BQ3hCQyxHQVdXQyxFQUFxQixFQUFHQyxlQUNuQyxNQUFPQyxFQUFRQyxHQUFhQyxHQUFTLElBQzlCQyxFQUFTQyxHQUFjRixPQUE2QkwsSUFDcERRLEVBQWdCQyxHQUFxQkosT0FDMUNMLElBRUtVLEVBQWlCQyxHQUFzQk4sT0FFNUNMLElBQ0tZLEVBQWNDLEdBQW1CUixPQUN0Q0wsSUFFS2MsRUFBVUMsR0FBZVYsT0FDOUJMLEdBb0JGLE9BQ0VnQixFQUFDbEIsRUFBa0JtQixTQUFRLENBQ3pCQyxNQUFPLENBQ0xmLFNBQ0FHLFVBQ0FRLFdBQ0FOLGlCQUNBSSxlQUNBRixrQkFDQVMsV0EzQmEsRUFDakJQLGVBQ0FOLFVBQ0FRLFdBQ0FOLGlCQUNBRSxzQkFFQU4sR0FBVSxHQUNWUyxFQUFnQkQsR0FDaEJMLEVBQVdELEdBQ1hTLEVBQVlELEdBQ1pMLEVB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