@arena-im/react-sdk-auth 1.14.1 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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,useEffect as i,useRef as s,useCallback as a}from"react";import{useMutation as c,QueryClient as u,QueryClientProvider as l}from"@tanstack/react-query";import{create as d}from"zustand";import{subscribeWithSelector as p}from"zustand/middleware";import h from"js-cookie";import{jwtDecode as k}from"jwt-decode";const f=n(void 0),T=({children:t})=>{const[n,o]=r(!1),[i,s]=r(void 0),[a,c]=r(void 0),[u,l]=r(void 0),[d,p]=r(void 0),[h,k]=r(void 0);return e(f.Provider,{value:{isOpen:n,appName:i,language:h,appDescription:a,trackOptions:d,onAuthCompleted:u,openDialog:({trackOptions:e,appName:t,language:n,appDescription:r,onAuthCompleted:i})=>{o(!0),p(e),s(t),k(n),c(r),l(i)},closeDialog:()=>o(!1),onOpenChange:e=>o(e)},children:t})},m=()=>{const e=o(f);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e};let g="development";const y=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}},U=n(void 0),w=({children:t,environment:n="development"})=>{const o=y(n);return i(()=>{!function(e){g=e}(n)},[n]),e(U.Provider,{value:{config:o,environment:n},children:t})},S=()=>{const e=o(U);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},E={"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,_;!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"}(_||(_={}));const O="arena-auth-token-updated";function P(e,t){document.dispatchEvent(new CustomEvent(O,{detail:{...t,type:e}}))}const C={public:{idToken:h.get(_.PUBLIC_ID_TOKEN)||null,refreshToken:h.get(_.PUBLIC_REFRESH_TOKEN)||null},anonymous:{idToken:h.get(_.ANONYMOUS_ID_TOKEN)||null},guest:{idToken:h.get(_.GUEST_ID_TOKEN)||null},custom:{idToken:h.get(_.CUSTOM_ID_TOKEN)||null}},N=d()(p((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}}})),h.set(_.PUBLIC_ID_TOKEN,n,{expires:1/24}),h.set(_.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}}})),h.set(_.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}}})),h.set(_.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}}})),h.set(_.CUSTOM_ID_TOKEN,n),o&&P(v.CUSTOM,{idToken:n,source:r}))},s=(t=!0,n)=>{h.remove(_.PUBLIC_ID_TOKEN),h.remove(_.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)=>{h.remove(_.ANONYMOUS_ID_TOKEN),e(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),t&&P(v.ANONYMOUS,{idToken:null,source:n})},c=(t=!0,n)=>{h.remove(_.GUEST_ID_TOKEN),e(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),t&&P(v.GUEST,{idToken:null,source:n})},u=(t=!0,n)=>{h.remove(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_USER),e(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),t&&P(v.CUSTOM,{idToken:null,source:n})};return{tokens:C,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),c(!0,e),u(!0,e)},clearPublicTokens:e=>{s(!0,e)},clearAnonymousTokens:e=>{a(!0,e)},clearGuestTokens:e=>{c(!0,e)},clearCustomTokens:e=>{u(!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:()=>{c(!1)},silentClearCustomTokens:()=>{u(!1)}}}));function b(){const e=N(e=>e.silentUpdatePublicTokens),t=N(e=>e.silentUpdateAnonymousToken),n=N(e=>e.silentUpdateGuestTokens),o=N(e=>e.silentUpdateCustomToken),r=N(e=>e.clearTokens),a=N(e=>e.silentClearPublicTokens),c=N(e=>e.silentClearAnonymousTokens),u=N(e=>e.silentClearGuestTokens),l=N(e=>e.silentClearCustomTokens),d=s(`widget-${Math.random().toString(36).substr(2,9)}`);return i(()=>{const r=r=>{const{idToken:i,refreshToken:s,type:p,source:h}=r.detail;if(h!==d.current)switch(p){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):c();break;case v.GUEST:i?n(i):u();break;case v.CUSTOM:i?o(i):l()}};return document.addEventListener(O,r),()=>{document.removeEventListener(O,r)}},[e,t,n,o,r,a,c,u,l]),{eventSource:d.current}}function A(){const e=N(e=>e.getToken),t=N(e=>e.getMostPrivilegedToken),n=N(e=>e.getRefreshToken),o=N(e=>e.updatePublicTokens),r=N(e=>e.updateAnonymousToken),i=N(e=>e.updateGuestTokens),s=N(e=>e.updateCustomToken),a=N(e=>e.clearTokens),c=N(e=>e.clearPublicTokens),u=N(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:()=>c(l),clearCustomTokens:()=>u(l)}}function x(e){return N(t=>t.tokens[e])}function L(e){return N(t=>t.tokens[e]?.idToken)}function R(e){return N(t=>t.tokens[e]?.refreshToken)}var D,K;function B(){const e=x(v.PUBLIC),{refreshPublicTokens:t}=J(),{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={...E,...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 c=a.headers.get("content-type");if(!c||!c.includes("application/json"))return a;const u=await a.text();if(!u)return null;try{return JSON.parse(u)}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"}(K||(K={}));const M=d()(p((e,t)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:t=>{e({user:t})},setPublicProfile:t=>{e({publicProfile:t})},setUserByTokenId:t=>{try{const n=k(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=N.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=h.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);N.getState().updatePublicTokens(i.id_token,i.refresh_token)}catch(e){console.error(e);const{logout:n}=t();n()}},loadStoredUser:async n=>{const o=h.get(_.PUBLIC_ID_TOKEN),r=h.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});N.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=y(o??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,s=await I("POST",i,{body:JSON.stringify({signedUserData:n})});if(s){const e=k(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});N.getState().updateCustomToken(s.token)}return s}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function $(){return M(e=>e.user)}function G(){return M(e=>e.publicProfile)}function F(){return M(e=>e.refreshedTokenLoaded)}function J(){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}=B();return{updatePublicProfile:e}}function z(){return{user:M(e=>e.user),publicProfile:M(e=>e.publicProfile),refreshedTokenLoaded:M(e=>e.refreshedTokenLoaded)}}function H({children:e}){const{config:t}=S(),n=$(),{setPublicProfile:o,loadStoredUser:r}=J(),{getPublicProfile:s}=B(),{mutateAsync:u}=c({mutationFn:s}),l=a(async()=>{if(n?.uid){const e=await u(n.uid);o(e)}},[n?.uid,u,o]);return i(()=>{l()},[l]),i(()=>{r(t)},[t,r]),e}const Y="arenaAnonymousId",V="rs_anonymous_id",q="rs_initial_referrer",W="rs_initial_referring_domain";function Z(){const e=localStorage.getItem(V);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(V,t),t}function Q(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 X(){const e=window,t=document,n=window.screen,o=new URL(e.location.href);!function(){if(!localStorage.getItem(q)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(q,e),localStorage.setItem(W,t)}}();const r=localStorage.getItem(q)||"$direct",i=localStorage.getItem(W)||"";return{channel:"web",anonymousId:Z(),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:Q(o)}}function ee(e={}){const t={};e.userId&&(t.userId=e.userId);let n=null;try{n=localStorage.getItem(Y)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(Y,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(Y,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function te(){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 ne(e,t,n){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:te(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:X(),timestamp:(new Date).toISOString(),integrations:{All:!0},...ee(n)}}function oe(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function re(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:oe(i),body:JSON.stringify({type:"page",...ne(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:oe(i),body:JSON.stringify({event:t,type:"track",...ne(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 ie(){const{appName:t,appDescription:n,language:o,trackOptions:r,isOpen:s,closeDialog:a,onAuthCompleted:c}=m(),u=t||"Arena AI Chat",l=n||"Arena AI Chat",{setUser:d}=J(),{updatePublicTokens:p}=A(),{config:h}=S(),k=re(r),f=`${h.authIframeUrl}/?app-name=${u}&app-description=${l}&language=${o??"en"}`;return i(()=>{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 k(K.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?(k(K.AuthenticationCompleted,o.uid,{is_signup:i,auth_type:r}),c?.(o),p(t,n),d(o),void a()):void console.error("Authentication completed but user data is missing")}}else k(K.AuthenticationViewed);else a()};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[d,p,c,k,a]),s?e("iframe",{src:f,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function se({children:e}){const t=N(e=>e.tokens),n=N(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 i(()=>{t.anonymous.idToken||o().then(e=>{n(e.access_token)})},[t.anonymous.idToken,n,o]),e}function ae({children:n,queryClient:o,environment:r}){return o=o||new u,e(l,{client:o,children:e(w,{environment:r,children:e(H,{children:e(T,{children:t(se,{children:[n,e(ie,{})]})})})})})}function ce(){return y(g).refreshTokenApiKey}const ue={"Content-Type":"application/json"};let le=null;async function de(){if(le)return le;const e=M.getState();return le=e.refreshPublicTokens({refreshTokenApiKey:ce()}).finally(()=>{le=null}),le}async function pe(e,t,n={}){async function o(){const o=await async function(e,t,n={}){const o=h.get(_.PUBLIC_ID_TOKEN);if(!o)throw new Error("No authentication token found");const r={...ue,...n.headers,Authorization:`Bearer ${o}`},i={...n,method:e,headers:r};return fetch(t,i)}(e,t,n);if(o.ok)return async function(e){const t=e.headers.get("content-type");if(!t||!t.includes("application/json"))return e;const n=await e.text();if(!n)return null;try{return JSON.parse(n)}catch(e){throw console.error({error:e}),new Error("Invalid JSON response from server")}}(o);const r=await o.text();if(!r)throw new Error(`Failed to process request - ${o.status}`);if(401===o.status){const e=new Error("Unauthorized");throw e.status=401,e}!function(e,t){let n;try{const e=JSON.parse(t);n=e?.errors?.[0]||t||"Internal server error"}catch{n=t||"Internal server error"}throw new Error(n)}(0,r)}if(!h.get(_.PUBLIC_ID_TOKEN)){if(h.get(_.PUBLIC_REFRESH_TOKEN))return await de(),await o();throw new Error("No authentication token found")}try{return await o()}catch(e){if(!(e instanceof Error&&"status"in e&&401===e.status))throw e;if(!h.get(_.PUBLIC_REFRESH_TOKEN))throw new Error("Unauthorized");await de();try{return await o()}catch(e){if(e instanceof Error&&"status"in e&&401===e.status)throw new Error("Unauthorized");throw e}}}export{K as AnalyticsEvent,D as AnalyticsWidgetType,_ as AuthCookie,ae as AuthProvider,v as TokenType,pe as authenticatedRequest,m as useAuthDialog,G as usePublicProfile,R as useRefreshToken,F as useRefreshedTokenLoaded,x as useToken,b as useTokenEventListener,N as useTokenStore,L as useTokenValue,A as useTokens,j as useUpdateProfile,$ as useUser,J as useUserActions,M as useUserStore,z as useUserWithProfile};
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL3J1bnRpbWUtZW52aXJvbm1lbnQudHMiLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vc3JjL3R5cGVzL3Rva2VuLnRzIiwiLi4vc3JjL3V0aWxzL2RvbS1ldmVudHMudHMiLCIuLi9zcmMvc3RvcmVzL3Rva2VuLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lci50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW5zLnRzIiwiLi4vc3JjL3R5cGVzL2FuYWx5dGljcy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzLnRzIiwiLi4vc3JjL3N0b3Jlcy91c2VyLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS11c2VyLnRzIiwiLi4vc3JjL2NvbnRleHQvdXNlci1wcm92aWRlci50c3giLCIuLi9zcmMvdXRpbHMvYW5hbHl0aWNzLnRzIiwiLi4vc3JjL3V0aWxzL3VybC50cyIsIi4uL3NyYy9ob29rcy91c2UtdHJhY2sudHMiLCIuLi9zcmMvZGlhbG9nL2luZGV4LnRzeCIsIi4uL3NyYy9jb250ZXh0L2Fub255bW91cy10b2tlbi1wcm92aWRlci50c3giLCIuLi9zcmMvc2VydmljZXMvYXV0aC91c2UtYXV0aC1zZXJ2aWNlcy50cyIsIi4uL3NyYy9jb250ZXh0L2luZGV4LnRzeCIsIi4uL3NyYy91dGlscy9hdXRoZW50aWNhdGVkLXJlcXVlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlU3RhdGUsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFVzZXJQcm9wcyB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW50ZXJmYWNlIEF1dGhEaWFsb2dDb250ZXh0VHlwZSB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgYXBwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhcHBEZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cmFja09wdGlvbnM6IFRyYWNrT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgb25BdXRoQ29tcGxldGVkOiAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9wZW5EaWFsb2c6IChvcHRpb25zOiBPcGVuRGlhbG9nT3B0aW9ucykgPT4gdm9pZDtcbiAgY2xvc2VEaWFsb2c6ICgpID0+IHZvaWQ7XG4gIG9uT3BlbkNoYW5nZTogKG9wZW46IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEF1dGhEaWFsb2dDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxBdXRoRGlhbG9nQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWRcbik7XG5cbnR5cGUgT3BlbkRpYWxvZ09wdGlvbnMgPSB7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zO1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgYXBwRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG9uQXV0aENvbXBsZXRlZD86ICgpID0+ICh1c2VyOiBVc2VyUHJvcHMpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgY29uc3QgQXV0aERpYWxvZ1Byb3ZpZGVyID0gKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pID0+IHtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2FwcE5hbWUsIHNldEFwcE5hbWVdID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBjb25zdCBbYXBwRGVzY3JpcHRpb24sIHNldEFwcERlc2NyaXB0aW9uXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IFtvbkF1dGhDb21wbGV0ZWQsIHNldE9uQXV0aENvbXBsZXRlZF0gPSB1c2VTdGF0ZTxcbiAgICAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBjb25zdCBbdHJhY2tPcHRpb25zLCBzZXRUcmFja09wdGlvbnNdID0gdXNlU3RhdGU8VHJhY2tPcHRpb25zIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW2xhbmd1YWdlLCBzZXRMYW5ndWFnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBvcGVuRGlhbG9nID0gKHtcbiAgICB0cmFja09wdGlvbnMsXG4gICAgYXBwTmFtZSxcbiAgICBsYW5ndWFnZSxcbiAgICBhcHBEZXNjcmlwdGlvbixcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH06IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB7XG4gICAgc2V0SXNPcGVuKHRydWUpO1xuICAgIHNldFRyYWNrT3B0aW9ucyh0cmFja09wdGlvbnMpO1xuICAgIHNldEFwcE5hbWUoYXBwTmFtZSk7XG4gICAgc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpO1xuICAgIHNldEFwcERlc2NyaXB0aW9uKGFwcERlc2NyaXB0aW9uKTtcbiAgICBzZXRPbkF1dGhDb21wbGV0ZWQob25BdXRoQ29tcGxldGVkKTtcbiAgfTtcblxuICBjb25zdCBjbG9zZURpYWxvZyA9ICgpID0+IHNldElzT3BlbihmYWxzZSk7XG4gIGNvbnN0IG9uT3BlbkNoYW5nZSA9IChvcGVuOiBib29sZWFuKSA9PiBzZXRJc09wZW4ob3Blbik7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXt7XG4gICAgICAgIGlzT3BlbixcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIGFwcERlc2NyaXB0aW9uLFxuICAgICAgICB0cmFja09wdGlvbnMsXG4gICAgICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgICAgICAgb3BlbkRpYWxvZyxcbiAgICAgICAgY2xvc2VEaWFsb2csXG4gICAgICAgIG9uT3BlbkNoYW5nZSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQXV0aERpYWxvZyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQXV0aERpYWxvZ0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUF1dGhEaWFsb2cgbXVzdCBiZSB1c2VkIHdpdGhpbiBhbiBBdXRoRGlhbG9nUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iLCJpbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4vaW5kZXgnO1xuXG5sZXQgcnVudGltZUVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9ICdkZXZlbG9wbWVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRSdW50aW1lRW52aXJvbm1lbnQoZW52aXJvbm1lbnQ6IEVudmlyb25tZW50KTogdm9pZCB7XG4gIHJ1bnRpbWVFbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVudGltZUVudmlyb25tZW50KCk6IEVudmlyb25tZW50IHtcbiAgcmV0dXJuIHJ1bnRpbWVFbnZpcm9ubWVudDtcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgcHJvZmlsZVNlcnZpY2VVcmw6IHN0cmluZztcbiAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICBhdXRoSWZyYW1lVXJsOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuICBkZWJ1ZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnQgPSAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gKGVudmlyb25tZW50OiBFbnZpcm9ubWVudCk6IENvbmZpZyA9PiB7XG4gIGNvbnN0IGlzRGV2ID0gZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCc7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9maWxlU2VydmljZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLWRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9QUkQgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5JREVOVElUWV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vdG9rZW4tc2VydmljZS1kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LklERU5USVRZX1NFUlZJQ0VfVVJMX1BSRCB8fFxuICAgICAgICAnaHR0cHM6Ly90b2tlbi1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgcmVmcmVzaFRva2VuQXBpS2V5OiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5GSVJFQkFTRV9QVUJMSUNfQVBJX0tFWV9ERVYgfHxcbiAgICAgICAgJ0FJemFTeUNKaFdGQ0szaWNzOWtKMmVTZ1FEN2tXSFVzT3NKeVBkaydcbiAgICAgIDogcHJvY2Vzcy5lbnYuRklSRUJBU0VfUFVCTElDX0FQSV9LRVlfUFJEIHx8XG4gICAgICAgICdBSXphU3lELTl0U3JRV243M1MwcW02QnFFSDUtMTJIcThMMGVUc1EnLFxuICAgIGF1dGhJZnJhbWVVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LkFVVEhfSUZSQU1FX1VSTF9ERVYgfHwgJ2h0dHBzOi8vYXV0aDIuZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5BVVRIX0lGUkFNRV9VUkxfUFJEIHx8ICdodHRwczovL2F1dGgyLmFyZW5hLmltJyxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBkZWJ1ZzogZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCcsXG4gIH07XG59O1xuXG5leHBvcnQge1xuICBzZXRSdW50aW1lRW52aXJvbm1lbnQsXG4gIGdldFJ1bnRpbWVFbnZpcm9ubWVudCxcbn0gZnJvbSAnLi9ydW50aW1lLWVudmlyb25tZW50JztcbiIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIFJlYWN0Tm9kZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnLCBFbnZpcm9ubWVudCwgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IHNldFJ1bnRpbWVFbnZpcm9ubWVudCB9IGZyb20gJy4uL2NvbmZpZy9ydW50aW1lLWVudmlyb25tZW50JztcblxuaW50ZXJmYWNlIENvbmZpZ0NvbnRleHRUeXBlIHtcbiAgY29uZmlnOiBDb25maWc7XG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudDtcbn1cblxuY29uc3QgQ29uZmlnQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Q29uZmlnQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmludGVyZmFjZSBDb25maWdQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IENvbmZpZ1Byb3ZpZGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGVudmlyb25tZW50ID0gJ2RldmVsb3BtZW50Jyxcbn06IENvbmZpZ1Byb3ZpZGVyUHJvcHMpID0+IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKGVudmlyb25tZW50KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFJ1bnRpbWVFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7XG4gIH0sIFtlbnZpcm9ubWVudF0pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbmZpZ0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgY29uZmlnLCBlbnZpcm9ubWVudCB9fT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0NvbmZpZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQ29uZmlnID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VDb25maWcgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIENvbmZpZ1Byb3ZpZGVyJyk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIiwiY29uc3QgZGVmYXVsdEhlYWRlcnMgPSB7XG4gICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4pIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VjdXJlZFJlcXVlc3QocGFyYW1zOiB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgb3B0aW9uczogUmVxdWVzdEluaXQ7XG4gIHRva2VuOiBzdHJpbmc7XG59KSB7XG4gIGNvbnN0IHsgbWV0aG9kLCB1cmwsIG9wdGlvbnMgPSB7fSwgdG9rZW4gfSA9IHBhcmFtcztcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gYXV0aGVudGljYXRpb24gdG9rZW4gZm91bmQnKTtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLi4uZGVmYXVsdEhlYWRlcnMsXG4gICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICB9O1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBtZXRob2QsXG4gICAgaGVhZGVycyxcbiAgfTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgcGF5bG9hZCk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRvIHByb2Nlc3MgcmVxdWVzdCAtICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBKU09OLnBhcnNlKHRleHQpIHx8IHt9O1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9ycz8uWzBdIHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gVG9rZW5UeXBlIHtcbiAgQU5PTllNT1VTID0gJ2Fub255bW91cycsXG4gIEdVRVNUID0gJ2d1ZXN0JyxcbiAgUFVCTElDID0gJ3B1YmxpYycsXG4gIENVU1RPTSA9ICdjdXN0b20nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUGFpciB7XG4gIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCB0eXBlIFRva2Vuc01hcCA9IFJlY29yZDxUb2tlblR5cGUsIFRva2VuUGFpcj47XG5cbmV4cG9ydCBlbnVtIEF1dGhDb29raWUge1xuICBQVUJMSUNfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1wdWJsaWMtaWQtdG9rZW4nLFxuICBQVUJMSUNfUkVGUkVTSF9UT0tFTiA9ICdhcmVuYS1hdXRoLXB1YmxpYy1yZWZyZXNoLXRva2VuJyxcbiAgQU5PTllNT1VTX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtYW5vbnltb3VzLWlkLXRva2VuJyxcbiAgR1VFU1RfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1ndWVzdC1pZC10b2tlbicsXG4gIENVU1RPTV9JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWN1c3RvbS1pZC10b2tlbicsXG4gIENVU1RPTV9VU0VSID0gJ2FyZW5hLWF1dGgtY3VzdG9tLXVzZXInLFxufVxuIiwiaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuXG5leHBvcnQgY29uc3QgVE9LRU5fVVBEQVRFRF9FVkVOVCA9ICdhcmVuYS1hdXRoLXRva2VuLXVwZGF0ZWQnO1xuXG5pbnRlcmZhY2UgVG9rZW5FdmVudFBhcmFtcyB7XG4gIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG4gIHNvdXJjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoXG4gIHR5cGU6IFRva2VuVHlwZSxcbiAgcGFyYW1zOiBUb2tlbkV2ZW50UGFyYW1zXG4pIHtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICBuZXcgQ3VzdG9tRXZlbnQoVE9LRU5fVVBEQVRFRF9FVkVOVCwge1xuICAgICAgZGV0YWlsOiB7IC4uLnBhcmFtcywgdHlwZSB9LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJztcbmltcG9ydCB7IHN1YnNjcmliZVdpdGhTZWxlY3RvciB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSwgVG9rZW5zTWFwLCBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZG9tLWV2ZW50cyc7XG5cbmludGVyZmFjZSBUb2tlblN0b3JlIHtcbiAgdG9rZW5zOiBUb2tlbnNNYXA7XG4gIGdldFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiBzdHJpbmcgfCBudWxsO1xuICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuOiAoXG4gICAgb3B0aW9ucz86IEFycmF5PFRva2VuVHlwZT5cbiAgKSA9PiB7IHR5cGU6IFRva2VuVHlwZTsgaWRUb2tlbjogc3RyaW5nIH0gfCBudWxsO1xuICBnZXRSZWZyZXNoVG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHN0cmluZyB8IG51bGw7XG4gIHVwZGF0ZVB1YmxpY1Rva2VuczogKFxuICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgKSA9PiB2b2lkO1xuICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhclRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJQdWJsaWNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyQW5vbnltb3VzVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckd1ZXN0VG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckN1c3RvbVRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckd1ZXN0VG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckN1c3RvbVRva2VuczogKCkgPT4gdm9pZDtcbn1cblxuY29uc3QgZGVmYXVsdFRva2VuczogVG9rZW5zTWFwID0ge1xuICBwdWJsaWM6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTikgfHwgbnVsbCxcbiAgICByZWZyZXNoVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGFub255bW91czoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBndWVzdDoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGN1c3RvbToge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHVzZVRva2VuU3RvcmUgPSBjcmVhdGU8VG9rZW5TdG9yZT4oKShcbiAgc3Vic2NyaWJlV2l0aFNlbGVjdG9yKChzZXQsIGdldCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuICYmXG4gICAgICAgIHJlZnJlc2hUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLnB1YmxpYy5yZWZyZXNoVG9rZW5cbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgcHVibGljOiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOLCByZWZyZXNoVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMzAsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuUFVCTElDLCB7XG4gICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgYW5vbnltb3VzOiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5BTk9OWU1PVVMsIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGd1ZXN0OiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkdVRVNULCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgY3VzdG9tOiB7IGlkVG9rZW4gfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4sIGlkVG9rZW4pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5DVVNUT00sIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBwdWJsaWM6IHsgaWRUb2tlbjogbnVsbCwgcmVmcmVzaFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLlBVQkxJQywgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBhbm9ueW1vdXM6IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5BTk9OWU1PVVMsIHtcbiAgICAgICAgICBpZFRva2VuOiBudWxsLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgZ3Vlc3Q6IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5HVUVTVCwgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKEF1dGhDb29raWUuQ1VTVE9NX1VTRVIpO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGN1c3RvbTogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkNVU1RPTSwgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b2tlbnM6IGRlZmF1bHRUb2tlbnMsXG5cbiAgICAgIGdldFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQoKS50b2tlbnNbdHlwZV0/LmlkVG9rZW4gfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIGdldE1vc3RQcml2aWxlZ2VkVG9rZW46IChcbiAgICAgICAgb3B0aW9ucyA9IFtUb2tlblR5cGUuUFVCTElDLCBUb2tlblR5cGUuR1VFU1QsIFRva2VuVHlwZS5BTk9OWU1PVVNdXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5DVVNUT00pKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5DVVNUT00sXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5QVUJMSUMpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5QVUJMSUMsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkdVRVNUKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuR1VFU1QsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuICYmXG4gICAgICAgICAgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuQU5PTllNT1VTKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkFOT05ZTU9VUyxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIGdldFJlZnJlc2hUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KCkudG9rZW5zW3R5cGVdPy5yZWZyZXNoVG9rZW4gfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZVB1YmxpY1Rva2VuczogKFxuICAgICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICAgICkgPT4ge1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJQdWJsaWNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckd1ZXN0VG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlcihpZFRva2VuLCByZWZyZXNoVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyUHVibGljVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyR3Vlc3RUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckN1c3RvbVRva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0pXG4pO1xuIiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IFRPS0VOX1VQREFURURfRVZFTlQgfSBmcm9tICcuLi91dGlscy9kb20tZXZlbnRzJztcblxuaW50ZXJmYWNlIFRva2VuVXBkYXRlRXZlbnQge1xuICBkZXRhaWw6IHtcbiAgICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG4gICAgdHlwZTogVG9rZW5UeXBlO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuRXZlbnRMaXN0ZW5lcigpIHtcbiAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnNcbiAgKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVHdWVzdFRva2Vuc1xuICApO1xuICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW5cbiAgKTtcbiAgY29uc3QgY2xlYXJUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyUHVibGljVG9rZW5zXG4gICk7XG4gIGNvbnN0IGNsZWFyQW5vbnltb3VzVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckFub255bW91c1Rva2Vuc1xuICApO1xuICBjb25zdCBjbGVhckd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckd1ZXN0VG9rZW5zKTtcbiAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyQ3VzdG9tVG9rZW5zXG4gICk7XG5cbiAgY29uc3QgZXZlbnRTb3VyY2VSZWYgPSB1c2VSZWY8c3RyaW5nPihcbiAgICBgd2lkZ2V0LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWBcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVRva2VuVXBkYXRlID0gKFxuICAgICAgZXZlbnQ6IEN1c3RvbUV2ZW50PFRva2VuVXBkYXRlRXZlbnRbJ2RldGFpbCddPlxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBpZFRva2VuLCByZWZyZXNoVG9rZW4sIHR5cGUsIHNvdXJjZSB9ID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgICBpZiAoc291cmNlID09PSBldmVudFNvdXJjZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLlBVQkxJQzpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGlzIHJlcXVpcmVkIGZvciBwdWJsaWMgdG9rZW5zJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuQU5PTllNT1VTOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbihpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuR1VFU1Q6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckd1ZXN0VG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW4oaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgVE9LRU5fVVBEQVRFRF9FVkVOVCxcbiAgICAgIGhhbmRsZVRva2VuVXBkYXRlIGFzIEV2ZW50TGlzdGVuZXJcbiAgICApO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFRPS0VOX1VQREFURURfRVZFTlQsXG4gICAgICAgIGhhbmRsZVRva2VuVXBkYXRlIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgICk7XG4gICAgfTtcbiAgfSwgW1xuICAgIHVwZGF0ZVB1YmxpY1Rva2VucyxcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbixcbiAgICB1cGRhdGVHdWVzdFRva2VucyxcbiAgICB1cGRhdGVDdXN0b21Ub2tlbixcbiAgICBjbGVhclRva2VucyxcbiAgICBjbGVhclB1YmxpY1Rva2VucyxcbiAgICBjbGVhckFub255bW91c1Rva2VucyxcbiAgICBjbGVhckd1ZXN0VG9rZW5zLFxuICAgIGNsZWFyQ3VzdG9tVG9rZW5zLFxuICBdKTtcblxuICByZXR1cm4ge1xuICAgIGV2ZW50U291cmNlOiBldmVudFNvdXJjZVJlZi5jdXJyZW50LFxuICB9O1xufVxuIiwiaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyB1c2VUb2tlbkV2ZW50TGlzdGVuZXIgfSBmcm9tICcuL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbnMoKSB7XG4gIGNvbnN0IGdldFRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5nZXRUb2tlbik7XG4gIGNvbnN0IGdldE1vc3RQcml2aWxlZ2VkVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLmdldE1vc3RQcml2aWxlZ2VkVG9rZW5cbiAgKTtcbiAgY29uc3QgZ2V0UmVmcmVzaFRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5nZXRSZWZyZXNoVG9rZW4pO1xuICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZVB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS51cGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB1cGRhdGVHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlR3Vlc3RUb2tlbnMpO1xuICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlQ3VzdG9tVG9rZW4pO1xuICBjb25zdCBjbGVhclRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJUb2tlbnMpO1xuICBjb25zdCBjbGVhclB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJQdWJsaWNUb2tlbnMpO1xuICBjb25zdCBjbGVhckN1c3RvbVRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJDdXN0b21Ub2tlbnMpO1xuXG4gIGNvbnN0IHsgZXZlbnRTb3VyY2UgfSA9IHVzZVRva2VuRXZlbnRMaXN0ZW5lcigpO1xuXG4gIHJldHVybiB7XG4gICAgZ2V0VG9rZW4sXG4gICAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbixcbiAgICBnZXRSZWZyZXNoVG9rZW4sXG4gICAgdXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUN1c3RvbVRva2VuKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICBjbGVhclRva2VuczogKCkgPT4gY2xlYXJUb2tlbnMoZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyUHVibGljVG9rZW5zOiAoKSA9PiBjbGVhclB1YmxpY1Rva2VucyhldmVudFNvdXJjZSksXG4gICAgY2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IGNsZWFyQ3VzdG9tVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuKHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnIHwgJ2N1c3RvbScpIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuVmFsdWUoXG4gIHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnIHwgJ2N1c3RvbSdcbikge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0/LmlkVG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaFRva2VuKHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXT8ucmVmcmVzaFRva2VuKTtcbn1cbiIsInR5cGUgTnVsbGFibGU8VD4gPSBUIHwgbnVsbDtcblxuZXhwb3J0IGVudW0gQW5hbHl0aWNzV2lkZ2V0VHlwZSB7XG4gIEF2YXRhclByb2ZpbGUgPSAnYXZhdGFyLXByb2ZpbGUnLFxuICBBdmF0YXJDaGF0ID0gJ2F2YXRhci1jaGF0JyxcbiAgQ29tbWVudHMgPSAnY29tbWVudHMnLFxuICBHbG9iYWxQcm9maWxlID0gJ2dsb2JhbC1wcm9maWxlJyxcbiAgR3JvdXBDaGF0ID0gJ2dyb3VwLWNoYXQnLFxuICBQb2xscyA9ICdwb2xscycsXG4gIFVuaXZlcnNhbFNuaXBwZXQgPSAndW5pdmVyc2FsLXNuaXBwZXQnLFxufVxuXG5leHBvcnQgdHlwZSBUcmFja09wdGlvbnMgPSB7XG4gIHdpZGdldElkOiBzdHJpbmcgfCBudWxsO1xuICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlO1xuICBzaXRlSWQ6IHN0cmluZztcbiAgcnNXcml0ZUtleTogc3RyaW5nO1xuICByc0RhdGFQbGFuZVVybDogc3RyaW5nO1xuICB0cmlnZ2VyOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZW51bSBBbmFseXRpY3NFdmVudCB7XG4gIEF1dGhlbnRpY2F0aW9uQ29tcGxldGVkID0gJ0F1dGhlbnRpY2F0aW9uIENvbXBsZXRlZCcsXG4gIEF1dGhlbnRpY2F0aW9uU3RhcnRlZCA9ICdBdXRoZW50aWNhdGlvbiBTdGFydGVkJyxcbiAgQXV0aGVudGljYXRpb25WaWV3ZWQgPSAnQXV0aGVudGljYXRpb24gVmlld2VkJyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tQcm9wcyA9IE51bGxhYmxlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVByb3BzIHtcbiAgYW5vbnltb3VzSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWRkZXJDb250ZXh0IHtcbiAgY2hhbm5lbDogJ3dlYic7XG4gIGFub255bW91c0lkPzogc3RyaW5nO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIHVzZXJBZ2VudD86IHN0cmluZztcbiAgdGltZXpvbmU/OiBzdHJpbmc7XG4gIG9zPzogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfTtcbiAgcGFnZT86IHtcbiAgICBwYXRoPzogc3RyaW5nO1xuICAgIHJlZmVycmVyPzogc3RyaW5nO1xuICAgIHJlZmVycmluZ19kb21haW4/OiBzdHJpbmc7XG4gICAgc2VhcmNoPzogc3RyaW5nO1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBpbml0aWFsX3JlZmVycmVyPzogc3RyaW5nO1xuICAgIGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbj86IHN0cmluZztcbiAgfTtcbiAgc2NyZWVuPzoge1xuICAgIGRlbnNpdHk/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIGlubmVySGVpZ2h0PzogbnVtYmVyO1xuICAgIGlubmVyV2lkdGg/OiBudW1iZXI7XG4gIH07XG4gIGNhbXBhaWduPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cbiIsImltcG9ydCB7IFB1YmxpY1Byb2ZpbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHJlcXVlc3QsIHNlY3VyZWRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VUb2tlbiB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZS10b2tlbnMnO1xuaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi8uLi9ob29rcy91c2UtdXNlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9maWxlU2VydmljZXMoKSB7XG4gIGNvbnN0IHRva2VuID0gdXNlVG9rZW4oVG9rZW5UeXBlLlBVQkxJQyk7XG4gIGNvbnN0IHsgcmVmcmVzaFB1YmxpY1Rva2VucyB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCBwcm9maWxlVXJsID0gY29uZmlnLnByb2ZpbGVTZXJ2aWNlVXJsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFB1YmxpY1Byb2ZpbGUodXNlcklkPzogc3RyaW5nKTogUHJvbWlzZTxQdWJsaWNQcm9maWxlPiB7XG4gICAgY29uc3QgZmllbGRzID0gJ2JpbyxwaG90b1VSTCxkaXNwbGF5TmFtZSxsb2NhdGlvbixoYW5kbGUnO1xuICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L3B1YmxpYy91c2Vycy8ke3VzZXJJZH0vcHJvZmlsZT9maWVsZHM9JHtmaWVsZHN9YDtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVB1YmxpY1Byb2ZpbGUoXG4gICAgcGFyYW1zOiBPbWl0PFB1YmxpY1Byb2ZpbGUsICdtZXRhZGF0YSc+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L21lL3Byb2ZpbGUvcGVyc29uYWxgO1xuICAgIGF3YWl0IHNlY3VyZWRSZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICB1cmwsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBhcmFtcyksXG4gICAgICB9LFxuICAgICAgdG9rZW46IHRva2VuLmlkVG9rZW4hLFxuICAgIH0pO1xuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnMoeyByZWZyZXNoVG9rZW5BcGlLZXk6IGNvbmZpZy5yZWZyZXNoVG9rZW5BcGlLZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXRQdWJsaWNQcm9maWxlLFxuICAgIHVwZGF0ZVB1YmxpY1Byb2ZpbGUsXG4gIH07XG59XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJztcbmltcG9ydCB7IHN1YnNjcmliZVdpdGhTZWxlY3RvciB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHtcbiAgVXNlclByb3BzLFxuICBGaXJlYmFzZVVzZXIsXG4gIFNzb1VzZXJQcm9wcyxcbiAgU3NvVjJFeGNoYW5nZVJlc3BvbnNlLFxufSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gJ2p3dC1kZWNvZGUnO1xuaW1wb3J0IHsgdHlwZSBQdWJsaWNQcm9maWxlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS90eXBlcyc7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyBBdXRoQ29va2llIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIGdldENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmludGVyZmFjZSBVc2VyU3RvcmUge1xuICB1c2VyOiBVc2VyUHJvcHMgfCBudWxsO1xuICBwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbDtcbiAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IGJvb2xlYW47XG4gIHNldFVzZXI6ICh1c2VyOiBVc2VyUHJvcHMgfCBudWxsKSA9PiB2b2lkO1xuICBzZXRQdWJsaWNQcm9maWxlOiAocHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGwpID0+IHZvaWQ7XG4gIGxvZ291dDogKCkgPT4gdm9pZDtcbiAgcmVmcmVzaFB1YmxpY1Rva2VuczogKGNvbmZpZzoge1xuICAgIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzZXRVc2VyQnlUb2tlbklkOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBsb2FkU3RvcmVkVXNlcjogKGNvbmZpZz86IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc3NvVjJFeGNoYW5nZTogKFxuICAgIHNzb1NvdXJjZUlEOiBzdHJpbmcsXG4gICAgand0OiBzdHJpbmcsXG4gICAgZW52PzogRW52aXJvbm1lbnRcbiAgKSA9PiBQcm9taXNlPFNzb1YyRXhjaGFuZ2VSZXNwb25zZT47XG59XG5cbmV4cG9ydCBjb25zdCB1c2VVc2VyU3RvcmUgPSBjcmVhdGU8VXNlclN0b3JlPigpKFxuICBzdWJzY3JpYmVXaXRoU2VsZWN0b3IoKHNldCwgZ2V0KSA9PiAoe1xuICAgIHVzZXI6IG51bGwsXG4gICAgcHVibGljUHJvZmlsZTogbnVsbCxcbiAgICByZWZyZXNoZWRUb2tlbkxvYWRlZDogZmFsc2UsXG5cbiAgICBzZXRVc2VyOiAodXNlcjogVXNlclByb3BzIHwgbnVsbCkgPT4ge1xuICAgICAgc2V0KHsgdXNlciB9KTtcbiAgICB9LFxuXG4gICAgc2V0UHVibGljUHJvZmlsZTogKHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsKSA9PiB7XG4gICAgICBzZXQoeyBwdWJsaWNQcm9maWxlIH0pO1xuICAgIH0sXG5cbiAgICBzZXRVc2VyQnlUb2tlbklkOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1c2VyID0gand0RGVjb2RlPEZpcmViYXNlVXNlcj4oaWRUb2tlbik7XG4gICAgICAgIGNvbnN0IHVzZXJQcm9wczogVXNlclByb3BzID0ge1xuICAgICAgICAgIHVpZDogdXNlci51c2VyX2lkLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiB1c2VyLnNhZmVEaXNwbGF5TmFtZSxcbiAgICAgICAgICBlbWFpbDogdXNlci5lbWFpbCxcbiAgICAgICAgICBwaG90b1VSTDogdXNlci5zYWZlUGhvdG9VUkwsXG4gICAgICAgICAgaGFuZGxlOiB1c2VyLmhhbmRsZSxcbiAgICAgICAgfTtcbiAgICAgICAgc2V0KHsgdXNlcjogdXNlclByb3BzIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGxvZ291dDogKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS5jbGVhclB1YmxpY1Rva2VucygpO1xuICAgICAgICB0b2tlblN0b3JlLmNsZWFyQ3VzdG9tVG9rZW5zKCk7XG4gICAgICAgIHNldCh7IHVzZXI6IG51bGwgfSk7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdhcmVuYS1jb21tZW50cy1sb2dvdXQnKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVmcmVzaFB1YmxpY1Rva2VuczogYXN5bmMgKGNvbmZpZzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcblxuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlZml4ID0gJ2h0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlYXBpcy5jb20vdjEvdG9rZW4/a2V5PSc7XG4gICAgICAgIGNvbnN0IGFwaUtleSA9IGNvbmZpZy5yZWZyZXNoVG9rZW5BcGlLZXk7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3ByZWZpeH0ke2FwaUtleX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICBjb25zdCB7IHNldFVzZXJCeVRva2VuSWQgfSA9IGdldCgpO1xuICAgICAgICBzZXRVc2VyQnlUb2tlbklkKGRhdGEuaWRfdG9rZW4pO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUudXBkYXRlUHVibGljVG9rZW5zKGRhdGEuaWRfdG9rZW4sIGRhdGEucmVmcmVzaF90b2tlbik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgY29uc3QgeyBsb2dvdXQgfSA9IGdldCgpO1xuICAgICAgICBsb2dvdXQoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbG9hZFN0b3JlZFVzZXI6IGFzeW5jIChjb25maWc/OiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IHB1YmxpY0lkVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG4gICAgICBjb25zdCBwdWJsaWNSZWZyZXNoVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcbiAgICAgIGNvbnN0IGN1c3RvbUlkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBjb25zdCBjdXN0b21Vc2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQXV0aENvb2tpZS5DVVNUT01fVVNFUik7XG5cbiAgICAgIGlmICghIWN1c3RvbUlkVG9rZW4gJiYgISFjdXN0b21Vc2VyKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVzZXIgPSBKU09OLnBhcnNlKGN1c3RvbVVzZXIpO1xuXG4gICAgICAgIHNldCh7IHVzZXI6IHBhcnNlZFVzZXIgfSk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVDdXN0b21Ub2tlbihjdXN0b21JZFRva2VuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwdWJsaWNJZFRva2VuKSB7XG4gICAgICAgICAgY29uc3QgeyBzZXRVc2VyQnlUb2tlbklkIH0gPSBnZXQoKTtcbiAgICAgICAgICBzZXRVc2VyQnlUb2tlbklkKHB1YmxpY0lkVG9rZW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHB1YmxpY1JlZnJlc2hUb2tlbiAmJiBjb25maWcpIHtcbiAgICAgICAgICBjb25zdCB7IHJlZnJlc2hQdWJsaWNUb2tlbnMgfSA9IGdldCgpO1xuICAgICAgICAgIGF3YWl0IHJlZnJlc2hQdWJsaWNUb2tlbnMoY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXQoeyByZWZyZXNoZWRUb2tlbkxvYWRlZDogdHJ1ZSB9KTtcbiAgICB9LFxuXG4gICAgc3NvVjJFeGNoYW5nZTogYXN5bmMgKFxuICAgICAgc3NvU291cmNlSUQ6IHN0cmluZyxcbiAgICAgIGp3dDogc3RyaW5nLFxuICAgICAgZW52PzogRW52aXJvbm1lbnRcbiAgICApID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZyhlbnYgPz8gJ3Byb2R1Y3Rpb24nKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZVVybCA9IGNvbmZpZy5wcm9maWxlU2VydmljZVVybDtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9zc28vc291cmNlcy8ke3Nzb1NvdXJjZUlEfS91c2VyYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFNzb1YyRXhjaGFuZ2VSZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwsIHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNpZ25lZFVzZXJEYXRhOiBqd3QgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRVc2VyID0gand0RGVjb2RlPFNzb1VzZXJQcm9wcz4ocmVzcG9uc2UudG9rZW4pO1xuXG4gICAgICAgICAgY29uc3QgeyBzZXRVc2VyLCBzZXRQdWJsaWNQcm9maWxlIH0gPSBnZXQoKTtcblxuICAgICAgICAgIHNldFVzZXIoe1xuICAgICAgICAgICAgdWlkOiBkZWNvZGVkVXNlcj8uc3ViLFxuICAgICAgICAgICAgZW1haWw6IGRlY29kZWRVc2VyPy5lbWFpbCxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBkZWNvZGVkVXNlcj8uZGlzcGxheU5hbWUsXG4gICAgICAgICAgICBwaG90b1VSTDogZGVjb2RlZFVzZXI/LnBob3RvVVJMLFxuICAgICAgICAgICAgaGFuZGxlOiBkZWNvZGVkVXNlcj8uaGFuZGxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2V0UHVibGljUHJvZmlsZSh7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogZGVjb2RlZFVzZXI/LmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgcGhvdG9VUkw6IGRlY29kZWRVc2VyPy5waG90b1VSTCxcbiAgICAgICAgICAgIGhhbmRsZTogZGVjb2RlZFVzZXI/LmhhbmRsZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVDdXN0b21Ub2tlbihyZXNwb25zZS50b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTU08gVjIgRXhjaGFuZ2UgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSxcbiAgfSkpXG4pO1xuIiwiaW1wb3J0IHsgdXNlUHJvZmlsZVNlcnZpY2VzIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcyc7XG5pbXBvcnQgeyB1c2VVc2VyU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdXNlci1zdG9yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnVzZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHVibGljUHJvZmlsZSgpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5wdWJsaWNQcm9maWxlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZnJlc2hlZFRva2VuTG9hZGVkKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnJlZnJlc2hlZFRva2VuTG9hZGVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJBY3Rpb25zKCkge1xuICBjb25zdCBzZXRVc2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFVzZXIpO1xuICBjb25zdCBzZXRQdWJsaWNQcm9maWxlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFB1YmxpY1Byb2ZpbGUpO1xuICBjb25zdCBsb2dvdXQgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUubG9nb3V0KTtcbiAgY29uc3QgcmVmcmVzaFB1YmxpY1Rva2VucyA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoUHVibGljVG9rZW5zKTtcbiAgY29uc3Qgc2V0VXNlckJ5VG9rZW5JZCA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRVc2VyQnlUb2tlbklkKTtcbiAgY29uc3QgbG9hZFN0b3JlZFVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUubG9hZFN0b3JlZFVzZXIpO1xuICBjb25zdCBzc29WMkV4Y2hhbmdlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNzb1YyRXhjaGFuZ2UpO1xuICBcblxuICByZXR1cm4ge1xuICAgIHNldFVzZXIsXG4gICAgc2V0UHVibGljUHJvZmlsZSxcbiAgICBsb2dvdXQsXG4gICAgcmVmcmVzaFB1YmxpY1Rva2VucyxcbiAgICBzZXRVc2VyQnlUb2tlbklkLFxuICAgIGxvYWRTdG9yZWRVc2VyLFxuICAgIHNzb1YyRXhjaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVcGRhdGVQcm9maWxlKCkge1xuICBjb25zdCB7IHVwZGF0ZVB1YmxpY1Byb2ZpbGUgfSA9IHVzZVByb2ZpbGVTZXJ2aWNlcygpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZVB1YmxpY1Byb2ZpbGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyV2l0aFByb2ZpbGUoKSB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUudXNlcik7XG4gIGNvbnN0IHB1YmxpY1Byb2ZpbGUgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucHVibGljUHJvZmlsZSk7XG4gIGNvbnN0IHJlZnJlc2hlZFRva2VuTG9hZGVkID0gdXNlVXNlclN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnJlZnJlc2hlZFRva2VuTG9hZGVkXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB1c2VyLFxuICAgIHB1YmxpY1Byb2ZpbGUsXG4gICAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQsXG4gIH07XG59XG5cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVXNlciwgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdXNlcic7XG5pbXBvcnQgeyB1c2VNdXRhdGlvbiB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyB1c2VQcm9maWxlU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZXJQcm92aWRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKTtcbiAgY29uc3QgeyBzZXRQdWJsaWNQcm9maWxlLCBsb2FkU3RvcmVkVXNlciB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyBnZXRQdWJsaWNQcm9maWxlOiBnZXRQdWJsaWNQcm9maWxlU2VydmljZSB9ID0gdXNlUHJvZmlsZVNlcnZpY2VzKCk7XG4gIGNvbnN0IHsgbXV0YXRlQXN5bmM6IGdldFB1YmxpY1Byb2ZpbGUgfSA9IHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBnZXRQdWJsaWNQcm9maWxlU2VydmljZSxcbiAgfSk7XG5cbiAgY29uc3QgbG9hZFB1YmxpY1Byb2ZpbGUgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKHVzZXI/LnVpZCkge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFB1YmxpY1Byb2ZpbGUodXNlci51aWQpO1xuICAgICAgc2V0UHVibGljUHJvZmlsZShwcm9maWxlKTtcbiAgICB9XG4gIH0sIFt1c2VyPy51aWQsIGdldFB1YmxpY1Byb2ZpbGUsIHNldFB1YmxpY1Byb2ZpbGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvYWRQdWJsaWNQcm9maWxlKCk7XG4gIH0sIFtsb2FkUHVibGljUHJvZmlsZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZFN0b3JlZFVzZXIoY29uZmlnKTtcbiAgfSwgW2NvbmZpZywgbG9hZFN0b3JlZFVzZXJdKTtcblxuICByZXR1cm4gY2hpbGRyZW47XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFuYWx5dGljc1dpZGdldFR5cGUsXG4gIEFuYWx5dGljc0V2ZW50LFxuICBJZGVudGl0eVByb3BzLFxuICBSdWRkZXJDb250ZXh0LFxuICBUcmFja1Byb3BzLFxufSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5pbXBvcnQgeyByZW1vdmVQYXJhbXNGcm9tVXJsIH0gZnJvbSAnLi4vdXRpbHMvdXJsJztcblxuY29uc3QgQU5PTllNT1VTX0lEX0tFWSA9ICdhcmVuYUFub255bW91c0lkJztcblxuY29uc3QgTFNfS0VZUyA9IHtcbiAgYW5vbjogJ3JzX2Fub255bW91c19pZCcsXG4gIGluaXRSZWZlcnJlcjogJ3JzX2luaXRpYWxfcmVmZXJyZXInLFxuICBpbml0RG9tYWluOiAncnNfaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluJyxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRPclNldEFub255bW91c0lkKCk6IHN0cmluZyB7XG4gIGNvbnN0IGV4aXN0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5hbm9uKTtcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gIGNvbnN0IGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5hbm9uLCBpZCk7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXJJbml0aWFsUmVmZXJyZXIoKTogdm9pZCB7XG4gIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIpKSB7XG4gICAgY29uc3QgcmVmID0gZG9jdW1lbnQucmVmZXJyZXIgfHwgJyRkaXJlY3QnO1xuICAgIGNvbnN0IGRvbWFpbiA9IHJlZiAmJiByZWYgIT09ICckZGlyZWN0JyA/IG5ldyBVUkwocmVmKS5ob3N0bmFtZSA6ICcnO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyLCByZWYpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuaW5pdERvbWFpbiwgZG9tYWluKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUNhbXBhaWduKHU6IFVSTCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlzID0gW1xuICAgICd1dG1fc291cmNlJyxcbiAgICAndXRtX21lZGl1bScsXG4gICAgJ3V0bV9jYW1wYWlnbicsXG4gICAgJ3V0bV90ZXJtJyxcbiAgICAndXRtX2NvbnRlbnQnLFxuICBdO1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAga2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgIGNvbnN0IHYgPSB1LnNlYXJjaFBhcmFtcy5nZXQoayk7XG4gICAgaWYgKHYpIG91dFtrXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPyBvdXQgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJ1ZGRlckNvbnRleHQoKTogUnVkZGVyQ29udGV4dCB7XG4gIGNvbnN0IHcgPSB3aW5kb3c7XG4gIGNvbnN0IGQgPSBkb2N1bWVudDtcbiAgY29uc3QgcyA9IHdpbmRvdy5zY3JlZW47XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwody5sb2NhdGlvbi5ocmVmKTtcblxuICByZW1lbWJlckluaXRpYWxSZWZlcnJlcigpO1xuXG4gIGNvbnN0IGluaXRpYWxfcmVmZXJyZXIgPVxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyKSB8fCAnJGRpcmVjdCc7XG4gIGNvbnN0IGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbiA9XG4gICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0RG9tYWluKSB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGNoYW5uZWw6ICd3ZWInLFxuICAgIGFub255bW91c0lkOiBnZXRPclNldEFub255bW91c0lkKCksXG4gICAgbG9jYWxlOiBuYXZpZ2F0b3IubGFuZ3VhZ2UsXG4gICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgIHRpbWV6b25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUsXG4gICAgb3M6IHsgbmFtZTogbmF2aWdhdG9yLnBsYXRmb3JtLCB2ZXJzaW9uOiB1bmRlZmluZWQgfSxcbiAgICBwYWdlOiB7XG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICByZWZlcnJlcjogZC5yZWZlcnJlciB8fCAnJGRpcmVjdCcsXG4gICAgICByZWZlcnJpbmdfZG9tYWluOiBkLnJlZmVycmVyID8gbmV3IFVSTChkLnJlZmVycmVyKS5ob3N0bmFtZSA6ICcnLFxuICAgICAgc2VhcmNoOiB1cmwuc2VhcmNoLFxuICAgICAgdGl0bGU6IGQudGl0bGUsXG4gICAgICB1cmw6IHVybC50b1N0cmluZygpLFxuICAgICAgaW5pdGlhbF9yZWZlcnJlcixcbiAgICAgIGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbixcbiAgICB9LFxuICAgIHNjcmVlbjoge1xuICAgICAgZGVuc2l0eTogKHcuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA/PyAxLFxuICAgICAgaGVpZ2h0OiBzLmhlaWdodCxcbiAgICAgIHdpZHRoOiBzLndpZHRoLFxuICAgICAgaW5uZXJIZWlnaHQ6IHcuaW5uZXJIZWlnaHQsXG4gICAgICBpbm5lcldpZHRoOiB3LmlubmVyV2lkdGgsXG4gICAgfSxcbiAgICBjYW1wYWlnbjogcGFyc2VDYW1wYWlnbih1cmwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRJZGVudGlmaWVyKG9wdGlvbnM6IElkZW50aXR5UHJvcHMgPSB7fSk6IElkZW50aXR5UHJvcHMge1xuICBjb25zdCBpZGVudGlmaWVyOiBJZGVudGl0eVByb3BzID0ge307XG5cbiAgaWYgKG9wdGlvbnMudXNlcklkKSB7XG4gICAgaWRlbnRpZmllci51c2VySWQgPSBvcHRpb25zLnVzZXJJZDtcbiAgfVxuXG4gIGxldCBjdXJyZW50QW5vbnltb3VzSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY3VycmVudEFub255bW91c0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYWNjZXNzIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbm9ueW1vdXNJZCkge1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBvcHRpb25zLmFub255bW91c0lkO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShBTk9OWU1PVVNfSURfS0VZLCBvcHRpb25zLmFub255bW91c0lkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSBhbm9ueW1vdXNJZCB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjdXJyZW50QW5vbnltb3VzSWQpIHtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gY3VycmVudEFub255bW91c0lkO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5ld0Fub255bW91c0lkID0gZ2VuZXJhdGVVVUlEKCk7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IG5ld0Fub255bW91c0lkO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShBTk9OWU1PVVNfSURfS0VZLCBuZXdBbm9ueW1vdXNJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgbmV3IGFub255bW91c0lkIHRvIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXI7XG59XG5cbmZ1bmN0aW9uIGdldENhbm9uaWNhbFVybCgpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxNZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAnbGlua1tyZWw9XCJjYW5vbmljYWxcIl0nXG4gICkgYXMgSFRNTExpbmtFbGVtZW50O1xuICBjb25zdCByYXdVcmwgPSBjYW5vbmljYWxNZXRhPy5ocmVmIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICByZXR1cm4gcmVtb3ZlUGFyYW1zRnJvbVVybChyYXdVcmwpO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudFByb3BlcnRpZXMoXG4gIHdpZGdldFR5cGU6IHN0cmluZyxcbiAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICB3aWRnZXRfdHlwZTogd2lkZ2V0VHlwZSxcbiAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgICBkb21haW46IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxcbiAgICAgIHRpdGxlOiB3aW5kb3cuZG9jdW1lbnQudGl0bGUsXG4gICAgICBjYW5vbmljYWxfdXJsOiBnZXRDYW5vbmljYWxVcmwoKSxcbiAgICAgIHNuaXBwZXRfaWQ6IHdpbmRvdy5fX0FSRU5BX18/LnNuaXBwZXRJZCB8fCBudWxsLFxuICAgICAgLi4ucHJvcGVydGllcyxcbiAgICB9LFxuICAgIGNvbnRleHQ6IGJ1aWxkUnVkZGVyQ29udGV4dCgpLFxuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGludGVncmF0aW9uczogeyBBbGw6IHRydWUgfSxcbiAgICAuLi5nZXRJZGVudGlmaWVyKGlkZW50aXR5KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIEF1dGhvcml6YXRpb246ICdCYXNpYyAnICsgYnRvYShgJHt3cml0ZUtleX06YCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmFseXRpY3Mod3JpdGVLZXk6IHN0cmluZywgZGF0YVBsYW5lVXJsOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBwYWdlOiBhc3luYyAoXG4gICAgICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICAgICAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgICAgIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtkYXRhUGxhbmVVcmx9L3YxL3BhZ2VgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXkpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdHlwZTogJ3BhZ2UnLFxuICAgICAgICAgIC4uLmdldEV2ZW50UHJvcGVydGllcyh3aWRnZXRUeXBlLCBwcm9wZXJ0aWVzLCBpZGVudGl0eSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNlbmQgcGFnZSBldmVudCB0byBSdWRkZXJzdGFjaycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdHJhY2s6IGFzeW5jIChcbiAgICAgIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGUsXG4gICAgICBldmVudDogQW5hbHl0aWNzRXZlbnQsXG4gICAgICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICAgICAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2RhdGFQbGFuZVVybH0vdjEvdHJhY2tgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXkpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgdHlwZTogJ3RyYWNrJyxcbiAgICAgICAgICAuLi5nZXRFdmVudFByb3BlcnRpZXMod2lkZ2V0VHlwZSwgcHJvcGVydGllcywgaWRlbnRpdHkpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzZW5kIHRyYWNrIGV2ZW50IHRvIFJ1ZGRlcnN0YWNrJyk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiByZW1vdmVQYXJhbXNGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICB1cmxPYmouc2VhcmNoID0gJyc7XG5cbiAgICByZXR1cm4gdXJsT2JqLmhyZWY7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgY2xlYXJpbmcgc2VhcmNoIHBhcmFtcyBmcm9tIFVSTDonLCBlcnJvcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRBbmFseXRpY3MgfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3MnO1xuaW1wb3J0IHsgQW5hbHl0aWNzRXZlbnQsIFRyYWNrT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUcmFjayh0cmFja09wdGlvbnM/OiBUcmFja09wdGlvbnMpIHtcbiAgY29uc3QgdHJhY2sgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBldmVudDogQW5hbHl0aWNzRXZlbnQsXG4gICAgICB1c2VySWQ/OiBzdHJpbmcsXG4gICAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD5cbiAgICApID0+IHtcbiAgICAgIGlmICghdHJhY2tPcHRpb25zKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGFuYWx5dGljcyA9IGdldEFuYWx5dGljcyhcbiAgICAgICAgdHJhY2tPcHRpb25zLnJzV3JpdGVLZXksXG4gICAgICAgIHRyYWNrT3B0aW9ucy5yc0RhdGFQbGFuZVVybFxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHJhY2tQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiA9IHtcbiAgICAgICAgc2l0ZV9pZDogdHJhY2tPcHRpb25zLnNpdGVJZCxcbiAgICAgICAgd2lkZ2V0X2lkOiB0cmFja09wdGlvbnMud2lkZ2V0SWQsXG4gICAgICAgIHRyaWdnZXI6IHRyYWNrT3B0aW9ucy50cmlnZ2VyLFxuICAgICAgICAuLi5wcm9wZXJ0aWVzLFxuICAgICAgfTtcblxuICAgICAgYW5hbHl0aWNzLnRyYWNrKFxuICAgICAgICB0cmFja09wdGlvbnMud2lkZ2V0VHlwZSxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRyYWNrUHJvcGVydGllcyxcbiAgICAgICAgdXNlcklkID8geyB1c2VySWQgfSA6IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9LFxuICAgIFt0cmFja09wdGlvbnNdXG4gICk7XG5cbiAgcmV0dXJuIHRyYWNrO1xufVxuIiwiaW1wb3J0IHsgdXNlQXV0aERpYWxvZyB9IGZyb20gJy4uL2NvbnRleHQvYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdXNlcic7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VUb2tlbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdG9rZW5zJztcbmltcG9ydCB7IEFuYWx5dGljc0V2ZW50IH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcbmltcG9ydCB7IHVzZVRyYWNrIH0gZnJvbSAnLi4vaG9va3MvdXNlLXRyYWNrJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXV0aERpYWxvZygpIHtcbiAgY29uc3Qge1xuICAgIGFwcE5hbWUsXG4gICAgYXBwRGVzY3JpcHRpb24sXG4gICAgbGFuZ3VhZ2UsXG4gICAgdHJhY2tPcHRpb25zLFxuICAgIGlzT3BlbixcbiAgICBjbG9zZURpYWxvZyxcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH0gPSB1c2VBdXRoRGlhbG9nKCk7XG4gIGNvbnN0IGZyYW1lQXBwTmFtZSA9IGFwcE5hbWUgfHwgJ0FyZW5hIEFJIENoYXQnO1xuICBjb25zdCBmcmFtZUFwcERlc2NyaXB0aW9uID0gYXBwRGVzY3JpcHRpb24gfHwgJ0FyZW5hIEFJIENoYXQnO1xuICBjb25zdCB7IHNldFVzZXIgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgdXBkYXRlUHVibGljVG9rZW5zIH0gPSB1c2VUb2tlbnMoKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuXG4gIGNvbnN0IHRyYWNrID0gdXNlVHJhY2sodHJhY2tPcHRpb25zKTtcblxuICBjb25zdCBpZnJhbWVVcmwgPSBgJHtjb25maWcuYXV0aElmcmFtZVVybH0vP2FwcC1uYW1lPSR7ZnJhbWVBcHBOYW1lfSZhcHAtZGVzY3JpcHRpb249JHtmcmFtZUFwcERlc2NyaXB0aW9ufSZsYW5ndWFnZT0ke2xhbmd1YWdlID8/ICdlbid9YDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSAobWVzc2FnZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy5zb3VyY2UgIT09ICdhcmVuYS1hdXRoZW50aWNhdGlvbicpIHJldHVybjtcblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2NhbmNlbGVkJykge1xuICAgICAgICBjbG9zZURpYWxvZygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi12aWV3ZWQnKSB7XG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uVmlld2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tc3RhcnRlZCcpIHtcbiAgICAgICAgY29uc3QgeyBhdXRoVHlwZSB9ID0gbWVzc2FnZS5kYXRhPy5wYXlsb2FkIHx8IHt9O1xuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvblN0YXJ0ZWQsIHVuZGVmaW5lZCwge1xuICAgICAgICAgIGF1dGhUeXBlOiBhdXRoVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLWNvbXBsZXRlZCcpIHtcbiAgICAgICAgY29uc3QgeyBpZFRva2VuLCByZWZyZXNoVG9rZW4sIHVzZXIsIGF1dGhUeXBlLCBpc1NpZ251cCB9ID1cbiAgICAgICAgICBtZXNzYWdlLmRhdGE/LnBheWxvYWQgfHwge307XG5cbiAgICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQXV0aGVudGljYXRpb24gY29tcGxldGVkIGJ1dCB1c2VyIGRhdGEgaXMgbWlzc2luZycpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uQ29tcGxldGVkLCB1c2VyLnVpZCwge1xuICAgICAgICAgIGlzX3NpZ251cDogaXNTaWdudXAsXG4gICAgICAgICAgYXV0aF90eXBlOiBhdXRoVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG9uQXV0aENvbXBsZXRlZD8uKHVzZXIpO1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgICAgc2V0VXNlcih1c2VyKTtcbiAgICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gIH0sIFtzZXRVc2VyLCB1cGRhdGVQdWJsaWNUb2tlbnMsIG9uQXV0aENvbXBsZXRlZCwgdHJhY2ssIGNsb3NlRGlhbG9nXSk7XG5cbiAgcmV0dXJuIGlzT3BlbiA/IChcbiAgICA8aWZyYW1lXG4gICAgICBzcmM9e2lmcmFtZVVybH1cbiAgICAgIHRpdGxlPVwiQXJlbmEgQXV0aGVudGljYXRpb25cIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgd2lkdGg6ICcxMDB2dycsXG4gICAgICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgekluZGV4OiA5OTk5OTk5OTk5LFxuICAgICAgfX1cbiAgICA+PC9pZnJhbWU+XG4gICkgOiBudWxsO1xufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgdXNlQXV0aFNlcnZpY2VzIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC91c2UtYXV0aC1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBBbm9ueW1vdXNUb2tlblByb3ZpZGVyKHtcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59KSB7XG4gIGNvbnN0IHRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHsgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbiB9ID0gdXNlQXV0aFNlcnZpY2VzKCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbikge1xuICAgICAgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbigpLnRoZW4oKHRva2VuOiBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKHRva2VuLmFjY2Vzc190b2tlbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtcbiAgICB0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4sXG4gICAgdXBkYXRlQW5vbnltb3VzVG9rZW4sXG4gICAgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbixcbiAgXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuIiwiaW1wb3J0IHsgRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlQXV0aFNlcnZpY2VzKCkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IGlkZW50aXR5VXJsID0gY29uZmlnLmlkZW50aXR5U2VydmljZVVybDtcblxuICBhc3luYyBmdW5jdGlvbiBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuKCk6IFByb21pc2U8RXhjaGFuZ2VUb2tlbnNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHVybCA9IGAke2lkZW50aXR5VXJsfS9hbm9ueW1vdXMtdG9rZW5gO1xuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KCdQT1NUJywgdXJsKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbixcbiAgfTtcbn1cbiIsImltcG9ydCB7IEF1dGhEaWFsb2dQcm92aWRlciB9IGZyb20gJy4vYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuaW1wb3J0IHsgUXVlcnlDbGllbnQsIFF1ZXJ5Q2xpZW50UHJvdmlkZXIgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgVXNlclByb3ZpZGVyIH0gZnJvbSAnLi91c2VyLXByb3ZpZGVyJztcbmltcG9ydCB7IENvbmZpZ1Byb3ZpZGVyIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IEF1dGhEaWFsb2cgZnJvbSAnLi4vZGlhbG9nJztcbmltcG9ydCB7IEFub255bW91c1Rva2VuUHJvdmlkZXIgfSBmcm9tICcuL2Fub255bW91cy10b2tlbi1wcm92aWRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBBdXRoUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgcXVlcnlDbGllbnQsXG4gIGVudmlyb25tZW50LFxufToge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBxdWVyeUNsaWVudD86IFF1ZXJ5Q2xpZW50O1xuICBlbnZpcm9ubWVudD86ICdwcm9kdWN0aW9uJyB8ICdkZXZlbG9wbWVudCc7XG59KSB7XG4gIHF1ZXJ5Q2xpZW50ID0gcXVlcnlDbGllbnQgfHwgbmV3IFF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIChcbiAgICA8UXVlcnlDbGllbnRQcm92aWRlciBjbGllbnQ9e3F1ZXJ5Q2xpZW50fT5cbiAgICAgIDxDb25maWdQcm92aWRlciBlbnZpcm9ubWVudD17ZW52aXJvbm1lbnR9PlxuICAgICAgICA8VXNlclByb3ZpZGVyPlxuICAgICAgICAgIDxBdXRoRGlhbG9nUHJvdmlkZXI+XG4gICAgICAgICAgICA8QW5vbnltb3VzVG9rZW5Qcm92aWRlcj5cbiAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICA8QXV0aERpYWxvZyAvPlxuICAgICAgICAgICAgPC9Bbm9ueW1vdXNUb2tlblByb3ZpZGVyPlxuICAgICAgICAgIDwvQXV0aERpYWxvZ1Byb3ZpZGVyPlxuICAgICAgICA8L1VzZXJQcm92aWRlcj5cbiAgICAgIDwvQ29uZmlnUHJvdmlkZXI+XG4gICAgPC9RdWVyeUNsaWVudFByb3ZpZGVyPlxuICApO1xufVxuXG5leHBvcnQgeyB1c2VBdXRoRGlhbG9nIH0gZnJvbSAnLi9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG4iLCJpbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IHVzZVVzZXJTdG9yZSB9IGZyb20gJy4uL3N0b3Jlcyc7XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgZ2V0UnVudGltZUVudmlyb25tZW50IH0gZnJvbSAnLi4vY29uZmlnL3J1bnRpbWUtZW52aXJvbm1lbnQnO1xuXG5mdW5jdGlvbiBnZXRSZWZyZXNoVG9rZW5BcGlLZXkoKTogc3RyaW5nIHtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRSdW50aW1lRW52aXJvbm1lbnQoKTtcbiAgcmV0dXJuIGdldENvbmZpZyhlbnZpcm9ubWVudCkucmVmcmVzaFRva2VuQXBpS2V5O1xufVxuXG5jb25zdCBkZWZhdWx0SGVhZGVycyA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbn07XG5cbmxldCByZWZyZXNoUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVSZWZyZXNoVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChyZWZyZXNoUHJvbWlzZSkge1xuICAgIHJldHVybiByZWZyZXNoUHJvbWlzZTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJTdG9yZSA9IHVzZVVzZXJTdG9yZS5nZXRTdGF0ZSgpO1xuICByZWZyZXNoUHJvbWlzZSA9IHVzZXJTdG9yZVxuICAgIC5yZWZyZXNoUHVibGljVG9rZW5zKHtcbiAgICAgIHJlZnJlc2hUb2tlbkFwaUtleTogZ2V0UmVmcmVzaFRva2VuQXBpS2V5KCksXG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICByZWZyZXNoUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG5cbiAgcmV0dXJuIHJlZnJlc2hQcm9taXNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhdXRoZW50aWNhdGVkRmV0Y2goXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fVxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB0b2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcblxuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICB9XG5cbiAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAuLi5kZWZhdWx0SGVhZGVycyxcbiAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gIH07XG5cbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgcmV0dXJuIGZldGNoKHVybCwgcGFyYW1zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZXNwb25zZShyZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcih7IGVycm9yIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKU09OIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dPbkVycm9yUmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlLCB0ZXh0OiBzdHJpbmcpOiBuZXZlciB7XG4gIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZztcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkPy5lcnJvcnM/LlswXSB8fCB0ZXh0IHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICB9IGNhdGNoIHtcbiAgICBlcnJvck1lc3NhZ2UgPSB0ZXh0IHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRoZW50aWNhdGVkUmVxdWVzdChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgYXN5bmMgZnVuY3Rpb24gYXR0ZW1wdCgpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF1dGhlbnRpY2F0ZWRGZXRjaChtZXRob2QsIHVybCwgb3B0aW9ucyk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiBwYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXF1ZXN0IC0gJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ1VuYXV0aG9yaXplZCcpIGFzIEVycm9yICYgeyBzdGF0dXM/OiBudW1iZXIgfTtcbiAgICAgIGVyci5zdGF0dXMgPSA0MDE7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhyb3dPbkVycm9yUmVzcG9uc2UocmVzcG9uc2UsIHRleHQpO1xuICB9XG5cbiAgY29uc3QgaGFzVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG5cbiAgaWYgKCFoYXNUb2tlbikge1xuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIGF3YWl0IGVuc3VyZVJlZnJlc2hUb2tlbigpO1xuICAgICAgcmV0dXJuIGF3YWl0IGF0dGVtcHQoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgYXR0ZW1wdCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGlzNDAxID1cbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICdzdGF0dXMnIGluIGVycm9yICYmXG4gICAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwMTtcblxuICAgIGlmICghaXM0MDEpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYXV0aG9yaXplZCcpO1xuICAgIH1cblxuICAgIGF3YWl0IGVuc3VyZVJlZnJlc2hUb2tlbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhdHRlbXB0KCk7XG4gICAgfSBjYXRjaCAocmV0cnlFcnJvcikge1xuICAgICAgY29uc3QgcmV0cnlJczQwMSA9XG4gICAgICAgIHJldHJ5RXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAnc3RhdHVzJyBpbiByZXRyeUVycm9yICYmXG4gICAgICAgIChyZXRyeUVycm9yIGFzIEVycm9yICYgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzID09PSA0MDE7XG5cbiAgICAgIGlmIChyZXRyeUlzNDAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hdXRob3JpemVkJyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IHJldHJ5RXJyb3I7XG4gICAgfVxuICB9XG59XG4iXSwibmFtZXMiOlsiQXV0aERpYWxvZ0NvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwidW5kZWZpbmVkIiwiQXV0aERpYWxvZ1Byb3ZpZGVyIiwiY2hpbGRyZW4iLCJpc09wZW4iLCJzZXRJc09wZW4iLCJ1c2VTdGF0ZSIsImFwcE5hbWUiLCJzZXRBcHBOYW1lIiwiYXBwRGVzY3JpcHRpb24iLCJzZXRBcHBEZXNjcmlwdGlvbiIsIm9uQXV0aENvbXBsZXRlZCIsInNldE9uQXV0aENvbXBsZXRlZCIsInRyYWNrT3B0aW9ucyIsInNldFRyYWNrT3B0aW9ucyIsImxhbmd1YWdlIiwic2V0TGFuZ3VhZ2UiLCJfanN4IiwiUHJvdmlkZXIiLCJ2YWx1ZSIsIm9wZW5EaWFsb2ciLCJjbG9zZURpYWxvZyIsIm9uT3BlbkNoYW5nZSIsIm9wZW4iLCJ1c2VBdXRoRGlhbG9nIiwiY29udGV4dCIsInVzZUNvbnRleHQiLCJFcnJvciIsInJ1bnRpbWVFbnZpcm9ubWVudCIsImdldENvbmZpZyIsImVudmlyb25tZW50IiwiaXNEZXYiLCJwcm9maWxlU2VydmljZVVybCIsImlkZW50aXR5U2VydmljZVVybCIsInJlZnJlc2hUb2tlbkFwaUtleSIsImF1dGhJZnJhbWVVcmwiLCJkZWJ1ZyIsIkNvbmZpZ0NvbnRleHQiLCJDb25maWdQcm92aWRlciIsImNvbmZpZyIsInVzZUVmZmVjdCIsInNldFJ1bnRpbWVFbnZpcm9ubWVudCIsInVzZUNvbmZpZyIsImRlZmF1bHRIZWFkZXJzIiwiYXN5bmMiLCJyZXF1ZXN0IiwibWV0aG9kIiwidXJsIiwib3B0aW9ucyIsInJlc3BvbnNlIiwiZmV0Y2giLCJoZWFkZXJzIiwib2siLCJzdGF0dXNUZXh0IiwianNvbiIsIlRva2VuVHlwZSIsIkF1dGhDb29raWUiLCJUT0tFTl9VUERBVEVEX0VWRU5UIiwiZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudCIsInR5cGUiLCJwYXJhbXMiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsImRldGFpbCIsImRlZmF1bHRUb2tlbnMiLCJwdWJsaWMiLCJpZFRva2VuIiwiQ29va2llcyIsImdldCIsIlBVQkxJQ19JRF9UT0tFTiIsInJlZnJlc2hUb2tlbiIsIlBVQkxJQ19SRUZSRVNIX1RPS0VOIiwiYW5vbnltb3VzIiwiQU5PTllNT1VTX0lEX1RPS0VOIiwiZ3Vlc3QiLCJHVUVTVF9JRF9UT0tFTiIsImN1c3RvbSIsIkNVU1RPTV9JRF9UT0tFTiIsInVzZVRva2VuU3RvcmUiLCJjcmVhdGUiLCJzdWJzY3JpYmVXaXRoU2VsZWN0b3IiLCJzZXQiLCJ1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIiLCJzb3VyY2UiLCJ0b2tlbnMiLCJzdGF0ZSIsImV4cGlyZXMiLCJQVUJMSUMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciIsIkFOT05ZTU9VUyIsInVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyIiwiR1VFU1QiLCJ1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciIsIkNVU1RPTSIsImNsZWFyUHVibGljVG9rZW5zSGVscGVyIiwicmVtb3ZlIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIiLCJjbGVhckd1ZXN0VG9rZW5zSGVscGVyIiwiY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIiLCJsb2NhbFN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwiQ1VTVE9NX1VTRVIiLCJnZXRUb2tlbiIsImdldE1vc3RQcml2aWxlZ2VkVG9rZW4iLCJpbmNsdWRlcyIsImdldFJlZnJlc2hUb2tlbiIsInVwZGF0ZVB1YmxpY1Rva2VucyIsInVwZGF0ZUFub255bW91c1Rva2VuIiwidXBkYXRlR3Vlc3RUb2tlbnMiLCJ1cGRhdGVDdXN0b21Ub2tlbiIsImNsZWFyVG9rZW5zIiwiY2xlYXJQdWJsaWNUb2tlbnMiLCJjbGVhckFub255bW91c1Rva2VucyIsImNsZWFyR3Vlc3RUb2tlbnMiLCJjbGVhckN1c3RvbVRva2VucyIsInNpbGVudFVwZGF0ZVB1YmxpY1Rva2VucyIsInNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuIiwic2lsZW50VXBkYXRlR3Vlc3RUb2tlbnMiLCJzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbiIsInNpbGVudENsZWFyUHVibGljVG9rZW5zIiwic2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJzaWxlbnRDbGVhckd1ZXN0VG9rZW5zIiwic2lsZW50Q2xlYXJDdXN0b21Ub2tlbnMiLCJ1c2VUb2tlbkV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZVJlZiIsInVzZVJlZiIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0ciIsImhhbmRsZVRva2VuVXBkYXRlIiwiZXZlbnQiLCJjdXJyZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZSIsInVzZVRva2VucyIsInVzZVRva2VuIiwidXNlVG9rZW5WYWx1ZSIsInVzZVJlZnJlc2hUb2tlbiIsIkFuYWx5dGljc1dpZGdldFR5cGUiLCJBbmFseXRpY3NFdmVudCIsInVzZVByb2ZpbGVTZXJ2aWNlcyIsInRva2VuIiwicmVmcmVzaFB1YmxpY1Rva2VucyIsInVzZVVzZXJBY3Rpb25zIiwicHJvZmlsZVVybCIsImdldFB1YmxpY1Byb2ZpbGUiLCJ1c2VySWQiLCJ1cGRhdGVQdWJsaWNQcm9maWxlIiwiQXV0aG9yaXphdGlvbiIsInBheWxvYWQiLCJ0ZXh0Iiwic3RhdHVzIiwiZXJyb3JzIiwiSlNPTiIsInBhcnNlIiwiY29udGVudFR5cGUiLCJlcnJvciIsImNvbnNvbGUiLCJzZWN1cmVkUmVxdWVzdCIsImJvZHkiLCJzdHJpbmdpZnkiLCJ1c2VVc2VyU3RvcmUiLCJ1c2VyIiwicHVibGljUHJvZmlsZSIsInJlZnJlc2hlZFRva2VuTG9hZGVkIiwic2V0VXNlciIsInNldFB1YmxpY1Byb2ZpbGUiLCJzZXRVc2VyQnlUb2tlbklkIiwiand0RGVjb2RlIiwidXNlclByb3BzIiwidWlkIiwidXNlcl9pZCIsImRpc3BsYXlOYW1lIiwic2FmZURpc3BsYXlOYW1lIiwiZW1haWwiLCJwaG90b1VSTCIsInNhZmVQaG90b1VSTCIsImhhbmRsZSIsImxvZ291dCIsInRva2VuU3RvcmUiLCJnZXRTdGF0ZSIsIkV2ZW50IiwiVVJMU2VhcmNoUGFyYW1zIiwicmVmcmVzaF90b2tlbiIsImdyYW50X3R5cGUiLCJkYXRhIiwiaWRfdG9rZW4iLCJsb2FkU3RvcmVkVXNlciIsInB1YmxpY0lkVG9rZW4iLCJwdWJsaWNSZWZyZXNoVG9rZW4iLCJjdXN0b21JZFRva2VuIiwiZ2V0SXRlbSIsImN1c3RvbVVzZXIiLCJwYXJzZWRVc2VyIiwic3NvVjJFeGNoYW5nZSIsInNzb1NvdXJjZUlEIiwiand0IiwiZW52Iiwic2lnbmVkVXNlckRhdGEiLCJkZWNvZGVkVXNlciIsInN1YiIsInVzZVVzZXIiLCJ1c2VQdWJsaWNQcm9maWxlIiwidXNlUmVmcmVzaGVkVG9rZW5Mb2FkZWQiLCJ1c2VVcGRhdGVQcm9maWxlIiwidXNlVXNlcldpdGhQcm9maWxlIiwiVXNlclByb3ZpZGVyIiwiZ2V0UHVibGljUHJvZmlsZVNlcnZpY2UiLCJtdXRhdGVBc3luYyIsInVzZU11dGF0aW9uIiwibXV0YXRpb25GbiIsImxvYWRQdWJsaWNQcm9maWxlIiwidXNlQ2FsbGJhY2siLCJwcm9maWxlIiwiQU5PTllNT1VTX0lEX0tFWSIsIkxTX0tFWVMiLCJnZXRPclNldEFub255bW91c0lkIiwiZXhpc3RpbmciLCJpZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJzZXRJdGVtIiwicGFyc2VDYW1wYWlnbiIsInUiLCJvdXQiLCJmb3JFYWNoIiwiayIsInYiLCJzZWFyY2hQYXJhbXMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiYnVpbGRSdWRkZXJDb250ZXh0IiwidyIsIndpbmRvdyIsImQiLCJzIiwic2NyZWVuIiwiVVJMIiwibG9jYXRpb24iLCJocmVmIiwicmVmIiwicmVmZXJyZXIiLCJkb21haW4iLCJob3N0bmFtZSIsInJlbWVtYmVySW5pdGlhbFJlZmVycmVyIiwiaW5pdGlhbF9yZWZlcnJlciIsImluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbiIsImNoYW5uZWwiLCJhbm9ueW1vdXNJZCIsImxvY2FsZSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInRpbWV6b25lIiwiSW50bCIsIkRhdGVUaW1lRm9ybWF0IiwicmVzb2x2ZWRPcHRpb25zIiwidGltZVpvbmUiLCJvcyIsIm5hbWUiLCJwbGF0Zm9ybSIsInZlcnNpb24iLCJwYWdlIiwicGF0aCIsInBhdGhuYW1lIiwicmVmZXJyaW5nX2RvbWFpbiIsInNlYXJjaCIsInRpdGxlIiwiZGVuc2l0eSIsImRldmljZVBpeGVsUmF0aW8iLCJoZWlnaHQiLCJ3aWR0aCIsImlubmVySGVpZ2h0IiwiaW5uZXJXaWR0aCIsImNhbXBhaWduIiwiZ2V0SWRlbnRpZmllciIsImlkZW50aWZpZXIiLCJjdXJyZW50QW5vbnltb3VzSWQiLCJ3YXJuIiwibmV3QW5vbnltb3VzSWQiLCJyZXBsYWNlIiwiYyIsInIiLCJnZXRDYW5vbmljYWxVcmwiLCJjYW5vbmljYWxNZXRhIiwicXVlcnlTZWxlY3RvciIsInVybE9iaiIsInJlbW92ZVBhcmFtc0Zyb21VcmwiLCJnZXRFdmVudFByb3BlcnRpZXMiLCJ3aWRnZXRUeXBlIiwicHJvcGVydGllcyIsImlkZW50aXR5Iiwid2lkZ2V0X3R5cGUiLCJjYW5vbmljYWxfdXJsIiwic25pcHBldF9pZCIsIl9fQVJFTkFfXyIsInNuaXBwZXRJZCIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImludGVncmF0aW9ucyIsIkFsbCIsImdldEV2ZW50SGVhZGVycyIsIndyaXRlS2V5IiwiYnRvYSIsInVzZVRyYWNrIiwiYW5hbHl0aWNzIiwicnNXcml0ZUtleSIsImRhdGFQbGFuZVVybCIsInJzRGF0YVBsYW5lVXJsIiwidHJhY2siLCJ0cmFja1Byb3BlcnRpZXMiLCJzaXRlX2lkIiwic2l0ZUlkIiwid2lkZ2V0X2lkIiwid2lkZ2V0SWQiLCJ0cmlnZ2VyIiwiQXV0aERpYWxvZyIsImZyYW1lQXBwTmFtZSIsImZyYW1lQXBwRGVzY3JpcHRpb24iLCJpZnJhbWVVcmwiLCJoYW5kbGVyIiwibWVzc2FnZSIsImF1dGhUeXBlIiwiQXV0aGVudGljYXRpb25TdGFydGVkIiwiaXNTaWdudXAiLCJBdXRoZW50aWNhdGlvbkNvbXBsZXRlZCIsImlzX3NpZ251cCIsImF1dGhfdHlwZSIsIkF1dGhlbnRpY2F0aW9uVmlld2VkIiwic3JjIiwic3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsImxlZnQiLCJ6SW5kZXgiLCJBbm9ueW1vdXNUb2tlblByb3ZpZGVyIiwiZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbiIsImlkZW50aXR5VXJsIiwidXNlQXV0aFNlcnZpY2VzIiwidGhlbiIsImFjY2Vzc190b2tlbiIsIkF1dGhQcm92aWRlciIsInF1ZXJ5Q2xpZW50IiwiUXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudFByb3ZpZGVyIiwiY2xpZW50IiwiX2pzeHMiLCJnZXRSZWZyZXNoVG9rZW5BcGlLZXkiLCJyZWZyZXNoUHJvbWlzZSIsImVuc3VyZVJlZnJlc2hUb2tlbiIsInVzZXJTdG9yZSIsImZpbmFsbHkiLCJhdXRoZW50aWNhdGVkUmVxdWVzdCIsImF0dGVtcHQiLCJhdXRoZW50aWNhdGVkRmV0Y2giLCJwYXJzZVJlc3BvbnNlIiwiZXJyIiwiZXJyb3JNZXNzYWdlIiwicGFyc2VkIiwidGhyb3dPbkVycm9yUmVzcG9uc2UiLCJyZXRyeUVycm9yIl0sIm1hcHBpbmdzIjoiNFpBZ0JBLE1BQU1BLEVBQW9CQyxPQUN4QkMsR0FXV0MsRUFBcUIsRUFBR0MsZUFDbkMsTUFBT0MsRUFBUUMsR0FBYUMsR0FBUyxJQUM5QkMsRUFBU0MsR0FBY0YsT0FBNkJMLElBQ3BEUSxFQUFnQkMsR0FBcUJKLE9BQzFDTCxJQUVLVSxFQUFpQkMsR0FBc0JOLE9BRTVDTCxJQUNLWSxFQUFjQyxHQUFtQlIsT0FDdENMLElBRUtjLEVBQVVDLEdBQWVWLE9BQzlCTCxHQW9CRixPQUNFZ0IsRUFBQ2xCLEVBQWtCbUIsU0FBUSxDQUN6QkMsTUFBTyxDQUNMZixTQUNBRyxVQUNBUSxXQUNBTixpQkFDQUksZUFDQUYsa0JBQ0FTLFdBM0JhLEVBQ2pCUCxlQUNBTixVQUNBUSxXQUNBTixpQkFDQUUsc0JBRUFOLEdBQVUsR0FDVlMsRUFBZ0JELEdBQ2hCTCxFQUFXRCxHQUNYUyxFQUFZRCxHQUNaTCxFQUFrQkQsR0FDbEJHLEVBQW1CRCxJQWdCZlUsWUFiYyxJQUFNaEIsR0FBVSxHQWM5QmlCLGFBYmdCQyxHQUFrQmxCLEVBQVVrQixJQWM3Q3BCLFNBRUFB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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,useEffect as i,useRef 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 h}from"zustand/middleware";import p from"js-cookie";import{jwtDecode as k}from"jwt-decode";const f=n(void 0),m=({children:t})=>{const[n,o]=r(!1),[i,s]=r(void 0),[a,u]=r(void 0),[c,l]=r(void 0),[d,h]=r(void 0),[p,k]=r(void 0);return e(f.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),h(e),s(t),k(n),u(r),l(i)},closeDialog:()=>o(!1),onOpenChange:e=>o(e)},children:t})},T=()=>{const e=o(f);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e};let g="development";const y=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}},w=n(void 0),U=({children:t,environment:n="development"})=>{const o=y(n);return i(()=>{!function(e){g=e}(n)},[n]),e(w.Provider,{value:{config:o,environment:n},children:t})},S=()=>{const e=o(w);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},I={"Content-Type":"application/json"};async function E(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,_;!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"}(_||(_={}));const O="arena-auth-token-updated";function P(e,t){document.dispatchEvent(new CustomEvent(O,{detail:{...t,type:e}}))}const C={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}},N=d()(h((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(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(_.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(_.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(_.CUSTOM_ID_TOKEN,n),o&&P(v.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(v.PUBLIC,{idToken:null,source:n})},a=(t=!0,n)=>{p.remove(_.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(_.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(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_ID_TOKEN),localStorage.removeItem(_.CUSTOM_USER),e(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),t&&P(v.CUSTOM,{idToken:null,source:n})};return{tokens:C,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=N(e=>e.silentUpdatePublicTokens),t=N(e=>e.silentUpdateAnonymousToken),n=N(e=>e.silentUpdateGuestTokens),o=N(e=>e.silentUpdateCustomToken),r=N(e=>e.clearTokens),a=N(e=>e.silentClearPublicTokens),u=N(e=>e.silentClearAnonymousTokens),c=N(e=>e.silentClearGuestTokens),l=N(e=>e.silentClearCustomTokens),d=s(`widget-${Math.random().toString(36).substr(2,9)}`);return i(()=>{const r=r=>{const{idToken:i,refreshToken:s,type:h,source:p}=r.detail;if(p!==d.current)switch(h){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(O,r),()=>{document.removeEventListener(O,r)}},[e,t,n,o,r,a,u,c,l]),{eventSource:d.current}}function A(){const e=N(e=>e.getToken),t=N(e=>e.getMostPrivilegedToken),n=N(e=>e.getRefreshToken),o=N(e=>e.updatePublicTokens),r=N(e=>e.updateAnonymousToken),i=N(e=>e.updateGuestTokens),s=N(e=>e.updateCustomToken),a=N(e=>e.clearTokens),u=N(e=>e.clearPublicTokens),c=N(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 x(e){return N(t=>t.tokens[e])}function L(e){return N(t=>t.tokens[e]?.idToken)}function R(e){return N(t=>t.tokens[e]?.refreshToken)}var D,K;function B(){const e=x(v.PUBLIC),{refreshPublicTokens:t}=J(),{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 E("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={...I,...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"}(K||(K={}));const M=d()(h((e,t)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:t=>{e({user:t})},setPublicProfile:t=>{e({publicProfile:t})},setUserByTokenId:t=>{try{const n=k(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=N.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);N.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});N.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=y(o??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,s=await E("POST",i,{body:JSON.stringify({signedUserData:n})});if(s){const e=k(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});N.getState().updateCustomToken(s.token)}return s}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function $(){return M(e=>e.user)}function G(){return M(e=>e.publicProfile)}function F(){return M(e=>e.refreshedTokenLoaded)}function J(){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}=B();return{updatePublicProfile:e}}function z(){return{user:M(e=>e.user),publicProfile:M(e=>e.publicProfile),refreshedTokenLoaded:M(e=>e.refreshedTokenLoaded)}}function H({children:e}){const{config:t}=S(),n=$(),{setPublicProfile:o,loadStoredUser:r}=J(),{getPublicProfile:s}=B(),{mutateAsync:c}=u({mutationFn:s}),l=a(async()=>{if(n?.uid){const e=await c(n.uid);o(e)}},[n?.uid,c,o]);return i(()=>{l()},[l]),i(()=>{r(t)},[t,r]),e}const Y="arenaAnonymousId",V="rs_anonymous_id",q="rs_initial_referrer",W="rs_initial_referring_domain";function Z(){const e=localStorage.getItem(V);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(V,t),t}function Q(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 X(){const e=window,t=document,n=window.screen,o=new URL(e.location.href);!function(){if(!localStorage.getItem(q)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(q,e),localStorage.setItem(W,t)}}();const r=localStorage.getItem(q)||"$direct",i=localStorage.getItem(W)||"";return{channel:"web",anonymousId:Z(),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:Q(o)}}function ee(e={}){const t={};e.userId&&(t.userId=e.userId);let n=null;try{n=localStorage.getItem(Y)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(Y,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(Y,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function te(){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 ne(e,t,n){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:te(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:X(),timestamp:(new Date).toISOString(),integrations:{All:!0},...ee(n)}}function oe(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function re(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:oe(i),body:JSON.stringify({type:"page",...ne(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:oe(i),body:JSON.stringify({event:t,type:"track",...ne(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 ie(){const{appName:t,appDescription:n,language:o,trackOptions:r,isOpen:s,closeDialog:a,onAuthCompleted:u}=T(),c=t||"Arena AI Chat",l=n||"Arena AI Chat",{setUser:d}=J(),{updatePublicTokens:h}=A(),{config:p}=S(),k=re(r),f=`${p.authIframeUrl}/?app-name=${c}&app-description=${l}&language=${o??"en"}`;return i(()=>{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 k(K.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?(k(K.AuthenticationCompleted,o.uid,{is_signup:i,auth_type:r}),u?.(o),h(t,n),d(o),void a()):void console.error("Authentication completed but user data is missing")}}else k(K.AuthenticationViewed);else a()};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[d,h,u,k,a]),s?e("iframe",{src:f,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function se(e){const t=e?.trim();return t&&"null"!==t&&"undefined"!==t?t:null}function ae(){if("undefined"==typeof window)return null;const e=window,t=se(e.rudderanalytics?.getAnonymousId?.()??e.rudderAnalytics?.getAnonymousId?.());if(t)return t;try{return se(window.localStorage.getItem("arena-analytics:rs-anonymous-id"))}catch{return null}}function ue({children:e}){const{config:t}=S(),n=N(e=>e.tokens),o=N(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:r}=function(){const{config:e}=S(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`,n=ae();return n?await E("POST",e,{body:JSON.stringify({anonymousId:n})}):await E("POST",e)}}}(),a=s(!1);return i(()=>{const e=ae();(!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 ce({children:n,queryClient:o,environment:r}){return o=o||new c,e(l,{client:o,children:e(U,{environment:r,children:e(H,{children:e(m,{children:t(ue,{children:[n,e(ie,{})]})})})})})}function le(){return y(g).refreshTokenApiKey}const de={"Content-Type":"application/json"};let he=null;async function pe(){if(he)return he;const e=M.getState();return he=e.refreshPublicTokens({refreshTokenApiKey:le()}).finally(()=>{he=null}),he}async function ke(e,t,n={}){async function o(){const o=await async function(e,t,n={}){const o=p.get(_.PUBLIC_ID_TOKEN);if(!o)throw new Error("No authentication token found");const r={...de,...n.headers,Authorization:`Bearer ${o}`},i={...n,method:e,headers:r};return fetch(t,i)}(e,t,n);if(o.ok)return async function(e){const t=e.headers.get("content-type");if(!t||!t.includes("application/json"))return e;const n=await e.text();if(!n)return null;try{return JSON.parse(n)}catch(e){throw console.error({error:e}),new Error("Invalid JSON response from server")}}(o);const r=await o.text();if(!r)throw new Error(`Failed to process request - ${o.status}`);if(401===o.status){const e=new Error("Unauthorized");throw e.status=401,e}!function(e,t){let n;try{const e=JSON.parse(t);n=e?.errors?.[0]||t||"Internal server error"}catch{n=t||"Internal server error"}throw new Error(n)}(0,r)}if(!p.get(_.PUBLIC_ID_TOKEN)){if(p.get(_.PUBLIC_REFRESH_TOKEN))return await pe(),await o();throw new Error("No authentication token found")}try{return await o()}catch(e){if(!(e instanceof Error&&"status"in e&&401===e.status))throw e;if(!p.get(_.PUBLIC_REFRESH_TOKEN))throw new Error("Unauthorized");await pe();try{return await o()}catch(e){if(e instanceof Error&&"status"in e&&401===e.status)throw new Error("Unauthorized");throw e}}}export{K as AnalyticsEvent,D as AnalyticsWidgetType,_ as AuthCookie,ce as AuthProvider,v as TokenType,ke as authenticatedRequest,T as useAuthDialog,G as usePublicProfile,R as useRefreshToken,F as useRefreshedTokenLoaded,x as useToken,b as useTokenEventListener,N as useTokenStore,L as useTokenValue,A as useTokens,j as useUpdateProfile,$ as useUser,J as useUserActions,M as useUserStore,z as useUserWithProfile};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL3J1bnRpbWUtZW52aXJvbm1lbnQudHMiLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vc3JjL3R5cGVzL3Rva2VuLnRzIiwiLi4vc3JjL3V0aWxzL2RvbS1ldmVudHMudHMiLCIuLi9zcmMvc3RvcmVzL3Rva2VuLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lci50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW5zLnRzIiwiLi4vc3JjL3R5cGVzL2FuYWx5dGljcy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzLnRzIiwiLi4vc3JjL3N0b3Jlcy91c2VyLXN0b3JlLnRzIiwiLi4vc3JjL2hvb2tzL3VzZS11c2VyLnRzIiwiLi4vc3JjL2NvbnRleHQvdXNlci1wcm92aWRlci50c3giLCIuLi9zcmMvdXRpbHMvYW5hbHl0aWNzLnRzIiwiLi4vc3JjL3V0aWxzL3VybC50cyIsIi4uL3NyYy9ob29rcy91c2UtdHJhY2sudHMiLCIuLi9zcmMvZGlhbG9nL2luZGV4LnRzeCIsIi4uL3NyYy9zZXJ2aWNlcy9hdXRoL3VzZS1hdXRoLXNlcnZpY2VzLnRzIiwiLi4vc3JjL2NvbnRleHQvYW5vbnltb3VzLXRva2VuLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy9jb250ZXh0L2luZGV4LnRzeCIsIi4uL3NyYy91dGlscy9hdXRoZW50aWNhdGVkLXJlcXVlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlU3RhdGUsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFVzZXJQcm9wcyB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW50ZXJmYWNlIEF1dGhEaWFsb2dDb250ZXh0VHlwZSB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgYXBwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhcHBEZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cmFja09wdGlvbnM6IFRyYWNrT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgb25BdXRoQ29tcGxldGVkOiAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9wZW5EaWFsb2c6IChvcHRpb25zOiBPcGVuRGlhbG9nT3B0aW9ucykgPT4gdm9pZDtcbiAgY2xvc2VEaWFsb2c6ICgpID0+IHZvaWQ7XG4gIG9uT3BlbkNoYW5nZTogKG9wZW46IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEF1dGhEaWFsb2dDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxBdXRoRGlhbG9nQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWRcbik7XG5cbnR5cGUgT3BlbkRpYWxvZ09wdGlvbnMgPSB7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zO1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgYXBwRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG9uQXV0aENvbXBsZXRlZD86ICgpID0+ICh1c2VyOiBVc2VyUHJvcHMpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgY29uc3QgQXV0aERpYWxvZ1Byb3ZpZGVyID0gKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pID0+IHtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2FwcE5hbWUsIHNldEFwcE5hbWVdID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBjb25zdCBbYXBwRGVzY3JpcHRpb24sIHNldEFwcERlc2NyaXB0aW9uXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IFtvbkF1dGhDb21wbGV0ZWQsIHNldE9uQXV0aENvbXBsZXRlZF0gPSB1c2VTdGF0ZTxcbiAgICAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBjb25zdCBbdHJhY2tPcHRpb25zLCBzZXRUcmFja09wdGlvbnNdID0gdXNlU3RhdGU8VHJhY2tPcHRpb25zIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW2xhbmd1YWdlLCBzZXRMYW5ndWFnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBvcGVuRGlhbG9nID0gKHtcbiAgICB0cmFja09wdGlvbnMsXG4gICAgYXBwTmFtZSxcbiAgICBsYW5ndWFnZSxcbiAgICBhcHBEZXNjcmlwdGlvbixcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH06IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB7XG4gICAgc2V0SXNPcGVuKHRydWUpO1xuICAgIHNldFRyYWNrT3B0aW9ucyh0cmFja09wdGlvbnMpO1xuICAgIHNldEFwcE5hbWUoYXBwTmFtZSk7XG4gICAgc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpO1xuICAgIHNldEFwcERlc2NyaXB0aW9uKGFwcERlc2NyaXB0aW9uKTtcbiAgICBzZXRPbkF1dGhDb21wbGV0ZWQob25BdXRoQ29tcGxldGVkKTtcbiAgfTtcblxuICBjb25zdCBjbG9zZURpYWxvZyA9ICgpID0+IHNldElzT3BlbihmYWxzZSk7XG4gIGNvbnN0IG9uT3BlbkNoYW5nZSA9IChvcGVuOiBib29sZWFuKSA9PiBzZXRJc09wZW4ob3Blbik7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXt7XG4gICAgICAgIGlzT3BlbixcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIGFwcERlc2NyaXB0aW9uLFxuICAgICAgICB0cmFja09wdGlvbnMsXG4gICAgICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgICAgICAgb3BlbkRpYWxvZyxcbiAgICAgICAgY2xvc2VEaWFsb2csXG4gICAgICAgIG9uT3BlbkNoYW5nZSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQXV0aERpYWxvZyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQXV0aERpYWxvZ0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUF1dGhEaWFsb2cgbXVzdCBiZSB1c2VkIHdpdGhpbiBhbiBBdXRoRGlhbG9nUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iLCJpbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4vaW5kZXgnO1xuXG5sZXQgcnVudGltZUVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9ICdkZXZlbG9wbWVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRSdW50aW1lRW52aXJvbm1lbnQoZW52aXJvbm1lbnQ6IEVudmlyb25tZW50KTogdm9pZCB7XG4gIHJ1bnRpbWVFbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVudGltZUVudmlyb25tZW50KCk6IEVudmlyb25tZW50IHtcbiAgcmV0dXJuIHJ1bnRpbWVFbnZpcm9ubWVudDtcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgcHJvZmlsZVNlcnZpY2VVcmw6IHN0cmluZztcbiAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICBhdXRoSWZyYW1lVXJsOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuICBkZWJ1ZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnQgPSAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gKGVudmlyb25tZW50OiBFbnZpcm9ubWVudCk6IENvbmZpZyA9PiB7XG4gIGNvbnN0IGlzRGV2ID0gZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCc7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9maWxlU2VydmljZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLWRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuUFJPRklMRV9TRVJWSUNFX1VSTF9QUkQgfHxcbiAgICAgICAgJ2h0dHBzOi8vcHJvZmlsZS1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgaWRlbnRpdHlTZXJ2aWNlVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5JREVOVElUWV9TRVJWSUNFX1VSTF9ERVYgfHxcbiAgICAgICAgJ2h0dHBzOi8vdG9rZW4tc2VydmljZS1kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LklERU5USVRZX1NFUlZJQ0VfVVJMX1BSRCB8fFxuICAgICAgICAnaHR0cHM6Ly90b2tlbi1zZXJ2aWNlLXByZC5hcmVuYS5pbScsXG4gICAgcmVmcmVzaFRva2VuQXBpS2V5OiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5GSVJFQkFTRV9QVUJMSUNfQVBJX0tFWV9ERVYgfHxcbiAgICAgICAgJ0FJemFTeUNKaFdGQ0szaWNzOWtKMmVTZ1FEN2tXSFVzT3NKeVBkaydcbiAgICAgIDogcHJvY2Vzcy5lbnYuRklSRUJBU0VfUFVCTElDX0FQSV9LRVlfUFJEIHx8XG4gICAgICAgICdBSXphU3lELTl0U3JRV243M1MwcW02QnFFSDUtMTJIcThMMGVUc1EnLFxuICAgIGF1dGhJZnJhbWVVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LkFVVEhfSUZSQU1FX1VSTF9ERVYgfHwgJ2h0dHBzOi8vYXV0aDIuZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5BVVRIX0lGUkFNRV9VUkxfUFJEIHx8ICdodHRwczovL2F1dGgyLmFyZW5hLmltJyxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBkZWJ1ZzogZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCcsXG4gIH07XG59O1xuXG5leHBvcnQge1xuICBzZXRSdW50aW1lRW52aXJvbm1lbnQsXG4gIGdldFJ1bnRpbWVFbnZpcm9ubWVudCxcbn0gZnJvbSAnLi9ydW50aW1lLWVudmlyb25tZW50JztcbiIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIFJlYWN0Tm9kZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnLCBFbnZpcm9ubWVudCwgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IHNldFJ1bnRpbWVFbnZpcm9ubWVudCB9IGZyb20gJy4uL2NvbmZpZy9ydW50aW1lLWVudmlyb25tZW50JztcblxuaW50ZXJmYWNlIENvbmZpZ0NvbnRleHRUeXBlIHtcbiAgY29uZmlnOiBDb25maWc7XG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudDtcbn1cblxuY29uc3QgQ29uZmlnQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Q29uZmlnQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmludGVyZmFjZSBDb25maWdQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgZW52aXJvbm1lbnQ/OiBFbnZpcm9ubWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IENvbmZpZ1Byb3ZpZGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGVudmlyb25tZW50ID0gJ2RldmVsb3BtZW50Jyxcbn06IENvbmZpZ1Byb3ZpZGVyUHJvcHMpID0+IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKGVudmlyb25tZW50KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFJ1bnRpbWVFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7XG4gIH0sIFtlbnZpcm9ubWVudF0pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbmZpZ0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgY29uZmlnLCBlbnZpcm9ubWVudCB9fT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0NvbmZpZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQ29uZmlnID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VDb25maWcgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIENvbmZpZ1Byb3ZpZGVyJyk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIiwiY29uc3QgZGVmYXVsdEhlYWRlcnMgPSB7XG4gICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4pIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VjdXJlZFJlcXVlc3QocGFyYW1zOiB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgb3B0aW9uczogUmVxdWVzdEluaXQ7XG4gIHRva2VuOiBzdHJpbmc7XG59KSB7XG4gIGNvbnN0IHsgbWV0aG9kLCB1cmwsIG9wdGlvbnMgPSB7fSwgdG9rZW4gfSA9IHBhcmFtcztcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gYXV0aGVudGljYXRpb24gdG9rZW4gZm91bmQnKTtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLi4uZGVmYXVsdEhlYWRlcnMsXG4gICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICB9O1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBtZXRob2QsXG4gICAgaGVhZGVycyxcbiAgfTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgcGF5bG9hZCk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRvIHByb2Nlc3MgcmVxdWVzdCAtICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBKU09OLnBhcnNlKHRleHQpIHx8IHt9O1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9ycz8uWzBdIHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gVG9rZW5UeXBlIHtcbiAgQU5PTllNT1VTID0gJ2Fub255bW91cycsXG4gIEdVRVNUID0gJ2d1ZXN0JyxcbiAgUFVCTElDID0gJ3B1YmxpYycsXG4gIENVU1RPTSA9ICdjdXN0b20nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUGFpciB7XG4gIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCB0eXBlIFRva2Vuc01hcCA9IFJlY29yZDxUb2tlblR5cGUsIFRva2VuUGFpcj47XG5cbmV4cG9ydCBlbnVtIEF1dGhDb29raWUge1xuICBQVUJMSUNfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1wdWJsaWMtaWQtdG9rZW4nLFxuICBQVUJMSUNfUkVGUkVTSF9UT0tFTiA9ICdhcmVuYS1hdXRoLXB1YmxpYy1yZWZyZXNoLXRva2VuJyxcbiAgQU5PTllNT1VTX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtYW5vbnltb3VzLWlkLXRva2VuJyxcbiAgR1VFU1RfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1ndWVzdC1pZC10b2tlbicsXG4gIENVU1RPTV9JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWN1c3RvbS1pZC10b2tlbicsXG4gIENVU1RPTV9VU0VSID0gJ2FyZW5hLWF1dGgtY3VzdG9tLXVzZXInLFxufVxuIiwiaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuXG5leHBvcnQgY29uc3QgVE9LRU5fVVBEQVRFRF9FVkVOVCA9ICdhcmVuYS1hdXRoLXRva2VuLXVwZGF0ZWQnO1xuXG5pbnRlcmZhY2UgVG9rZW5FdmVudFBhcmFtcyB7XG4gIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG4gIHNvdXJjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoXG4gIHR5cGU6IFRva2VuVHlwZSxcbiAgcGFyYW1zOiBUb2tlbkV2ZW50UGFyYW1zXG4pIHtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICBuZXcgQ3VzdG9tRXZlbnQoVE9LRU5fVVBEQVRFRF9FVkVOVCwge1xuICAgICAgZGV0YWlsOiB7IC4uLnBhcmFtcywgdHlwZSB9LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJztcbmltcG9ydCB7IHN1YnNjcmliZVdpdGhTZWxlY3RvciB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSwgVG9rZW5zTWFwLCBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZG9tLWV2ZW50cyc7XG5cbmludGVyZmFjZSBUb2tlblN0b3JlIHtcbiAgdG9rZW5zOiBUb2tlbnNNYXA7XG4gIGdldFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiBzdHJpbmcgfCBudWxsO1xuICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuOiAoXG4gICAgb3B0aW9ucz86IEFycmF5PFRva2VuVHlwZT5cbiAgKSA9PiB7IHR5cGU6IFRva2VuVHlwZTsgaWRUb2tlbjogc3RyaW5nIH0gfCBudWxsO1xuICBnZXRSZWZyZXNoVG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHN0cmluZyB8IG51bGw7XG4gIHVwZGF0ZVB1YmxpY1Rva2VuczogKFxuICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgKSA9PiB2b2lkO1xuICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhclRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJQdWJsaWNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyQW5vbnltb3VzVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckd1ZXN0VG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckN1c3RvbVRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckd1ZXN0VG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckN1c3RvbVRva2VuczogKCkgPT4gdm9pZDtcbn1cblxuY29uc3QgZGVmYXVsdFRva2VuczogVG9rZW5zTWFwID0ge1xuICBwdWJsaWM6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTikgfHwgbnVsbCxcbiAgICByZWZyZXNoVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGFub255bW91czoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBndWVzdDoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGN1c3RvbToge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHVzZVRva2VuU3RvcmUgPSBjcmVhdGU8VG9rZW5TdG9yZT4oKShcbiAgc3Vic2NyaWJlV2l0aFNlbGVjdG9yKChzZXQsIGdldCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuICYmXG4gICAgICAgIHJlZnJlc2hUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLnB1YmxpYy5yZWZyZXNoVG9rZW5cbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgcHVibGljOiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOLCByZWZyZXNoVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMzAsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuUFVCTElDLCB7XG4gICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgYW5vbnltb3VzOiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5BTk9OWU1PVVMsIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGd1ZXN0OiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkdVRVNULCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgY3VzdG9tOiB7IGlkVG9rZW4gfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4sIGlkVG9rZW4pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5DVVNUT00sIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBwdWJsaWM6IHsgaWRUb2tlbjogbnVsbCwgcmVmcmVzaFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLlBVQkxJQywgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBhbm9ueW1vdXM6IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5BTk9OWU1PVVMsIHtcbiAgICAgICAgICBpZFRva2VuOiBudWxsLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgZ3Vlc3Q6IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5HVUVTVCwgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKEF1dGhDb29raWUuQ1VTVE9NX1VTRVIpO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGN1c3RvbTogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkNVU1RPTSwgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b2tlbnM6IGRlZmF1bHRUb2tlbnMsXG5cbiAgICAgIGdldFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQoKS50b2tlbnNbdHlwZV0/LmlkVG9rZW4gfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIGdldE1vc3RQcml2aWxlZ2VkVG9rZW46IChcbiAgICAgICAgb3B0aW9ucyA9IFtUb2tlblR5cGUuUFVCTElDLCBUb2tlblR5cGUuR1VFU1QsIFRva2VuVHlwZS5BTk9OWU1PVVNdXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5DVVNUT00pKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5DVVNUT00sXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5QVUJMSUMpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5QVUJMSUMsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkdVRVNUKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuR1VFU1QsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuICYmXG4gICAgICAgICAgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuQU5PTllNT1VTKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkFOT05ZTU9VUyxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIGdldFJlZnJlc2hUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KCkudG9rZW5zW3R5cGVdPy5yZWZyZXNoVG9rZW4gfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZVB1YmxpY1Rva2VuczogKFxuICAgICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICAgICkgPT4ge1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJQdWJsaWNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckd1ZXN0VG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlcihpZFRva2VuLCByZWZyZXNoVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyUHVibGljVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyR3Vlc3RUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckN1c3RvbVRva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0pXG4pO1xuIiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IFRPS0VOX1VQREFURURfRVZFTlQgfSBmcm9tICcuLi91dGlscy9kb20tZXZlbnRzJztcblxuaW50ZXJmYWNlIFRva2VuVXBkYXRlRXZlbnQge1xuICBkZXRhaWw6IHtcbiAgICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG4gICAgdHlwZTogVG9rZW5UeXBlO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuRXZlbnRMaXN0ZW5lcigpIHtcbiAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnNcbiAgKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVHdWVzdFRva2Vuc1xuICApO1xuICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW5cbiAgKTtcbiAgY29uc3QgY2xlYXJUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyUHVibGljVG9rZW5zXG4gICk7XG4gIGNvbnN0IGNsZWFyQW5vbnltb3VzVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckFub255bW91c1Rva2Vuc1xuICApO1xuICBjb25zdCBjbGVhckd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckd1ZXN0VG9rZW5zKTtcbiAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyQ3VzdG9tVG9rZW5zXG4gICk7XG5cbiAgY29uc3QgZXZlbnRTb3VyY2VSZWYgPSB1c2VSZWY8c3RyaW5nPihcbiAgICBgd2lkZ2V0LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWBcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVRva2VuVXBkYXRlID0gKFxuICAgICAgZXZlbnQ6IEN1c3RvbUV2ZW50PFRva2VuVXBkYXRlRXZlbnRbJ2RldGFpbCddPlxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBpZFRva2VuLCByZWZyZXNoVG9rZW4sIHR5cGUsIHNvdXJjZSB9ID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgICBpZiAoc291cmNlID09PSBldmVudFNvdXJjZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLlBVQkxJQzpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGlzIHJlcXVpcmVkIGZvciBwdWJsaWMgdG9rZW5zJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuQU5PTllNT1VTOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbihpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuR1VFU1Q6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckd1ZXN0VG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW4oaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgVE9LRU5fVVBEQVRFRF9FVkVOVCxcbiAgICAgIGhhbmRsZVRva2VuVXBkYXRlIGFzIEV2ZW50TGlzdGVuZXJcbiAgICApO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFRPS0VOX1VQREFURURfRVZFTlQsXG4gICAgICAgIGhhbmRsZVRva2VuVXBkYXRlIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgICk7XG4gICAgfTtcbiAgfSwgW1xuICAgIHVwZGF0ZVB1YmxpY1Rva2VucyxcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbixcbiAgICB1cGRhdGVHdWVzdFRva2VucyxcbiAgICB1cGRhdGVDdXN0b21Ub2tlbixcbiAgICBjbGVhclRva2VucyxcbiAgICBjbGVhclB1YmxpY1Rva2VucyxcbiAgICBjbGVhckFub255bW91c1Rva2VucyxcbiAgICBjbGVhckd1ZXN0VG9rZW5zLFxuICAgIGNsZWFyQ3VzdG9tVG9rZW5zLFxuICBdKTtcblxuICByZXR1cm4ge1xuICAgIGV2ZW50U291cmNlOiBldmVudFNvdXJjZVJlZi5jdXJyZW50LFxuICB9O1xufVxuIiwiaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyB1c2VUb2tlbkV2ZW50TGlzdGVuZXIgfSBmcm9tICcuL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbnMoKSB7XG4gIGNvbnN0IGdldFRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5nZXRUb2tlbik7XG4gIGNvbnN0IGdldE1vc3RQcml2aWxlZ2VkVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLmdldE1vc3RQcml2aWxlZ2VkVG9rZW5cbiAgKTtcbiAgY29uc3QgZ2V0UmVmcmVzaFRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5nZXRSZWZyZXNoVG9rZW4pO1xuICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZVB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS51cGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB1cGRhdGVHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlR3Vlc3RUb2tlbnMpO1xuICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlQ3VzdG9tVG9rZW4pO1xuICBjb25zdCBjbGVhclRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJUb2tlbnMpO1xuICBjb25zdCBjbGVhclB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJQdWJsaWNUb2tlbnMpO1xuICBjb25zdCBjbGVhckN1c3RvbVRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJDdXN0b21Ub2tlbnMpO1xuXG4gIGNvbnN0IHsgZXZlbnRTb3VyY2UgfSA9IHVzZVRva2VuRXZlbnRMaXN0ZW5lcigpO1xuXG4gIHJldHVybiB7XG4gICAgZ2V0VG9rZW4sXG4gICAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbixcbiAgICBnZXRSZWZyZXNoVG9rZW4sXG4gICAgdXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUN1c3RvbVRva2VuKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICBjbGVhclRva2VuczogKCkgPT4gY2xlYXJUb2tlbnMoZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyUHVibGljVG9rZW5zOiAoKSA9PiBjbGVhclB1YmxpY1Rva2VucyhldmVudFNvdXJjZSksXG4gICAgY2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IGNsZWFyQ3VzdG9tVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuKHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnIHwgJ2N1c3RvbScpIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuVmFsdWUoXG4gIHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnIHwgJ2N1c3RvbSdcbikge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0/LmlkVG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaFRva2VuKHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXT8ucmVmcmVzaFRva2VuKTtcbn1cbiIsInR5cGUgTnVsbGFibGU8VD4gPSBUIHwgbnVsbDtcblxuZXhwb3J0IGVudW0gQW5hbHl0aWNzV2lkZ2V0VHlwZSB7XG4gIEF2YXRhclByb2ZpbGUgPSAnYXZhdGFyLXByb2ZpbGUnLFxuICBBdmF0YXJDaGF0ID0gJ2F2YXRhci1jaGF0JyxcbiAgQ29tbWVudHMgPSAnY29tbWVudHMnLFxuICBHbG9iYWxQcm9maWxlID0gJ2dsb2JhbC1wcm9maWxlJyxcbiAgR3JvdXBDaGF0ID0gJ2dyb3VwLWNoYXQnLFxuICBQb2xscyA9ICdwb2xscycsXG4gIFVuaXZlcnNhbFNuaXBwZXQgPSAndW5pdmVyc2FsLXNuaXBwZXQnLFxufVxuXG5leHBvcnQgdHlwZSBUcmFja09wdGlvbnMgPSB7XG4gIHdpZGdldElkOiBzdHJpbmcgfCBudWxsO1xuICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlO1xuICBzaXRlSWQ6IHN0cmluZztcbiAgcnNXcml0ZUtleTogc3RyaW5nO1xuICByc0RhdGFQbGFuZVVybDogc3RyaW5nO1xuICB0cmlnZ2VyOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZW51bSBBbmFseXRpY3NFdmVudCB7XG4gIEF1dGhlbnRpY2F0aW9uQ29tcGxldGVkID0gJ0F1dGhlbnRpY2F0aW9uIENvbXBsZXRlZCcsXG4gIEF1dGhlbnRpY2F0aW9uU3RhcnRlZCA9ICdBdXRoZW50aWNhdGlvbiBTdGFydGVkJyxcbiAgQXV0aGVudGljYXRpb25WaWV3ZWQgPSAnQXV0aGVudGljYXRpb24gVmlld2VkJyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tQcm9wcyA9IE51bGxhYmxlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVByb3BzIHtcbiAgYW5vbnltb3VzSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWRkZXJDb250ZXh0IHtcbiAgY2hhbm5lbDogJ3dlYic7XG4gIGFub255bW91c0lkPzogc3RyaW5nO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIHVzZXJBZ2VudD86IHN0cmluZztcbiAgdGltZXpvbmU/OiBzdHJpbmc7XG4gIG9zPzogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfTtcbiAgcGFnZT86IHtcbiAgICBwYXRoPzogc3RyaW5nO1xuICAgIHJlZmVycmVyPzogc3RyaW5nO1xuICAgIHJlZmVycmluZ19kb21haW4/OiBzdHJpbmc7XG4gICAgc2VhcmNoPzogc3RyaW5nO1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBpbml0aWFsX3JlZmVycmVyPzogc3RyaW5nO1xuICAgIGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbj86IHN0cmluZztcbiAgfTtcbiAgc2NyZWVuPzoge1xuICAgIGRlbnNpdHk/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIGlubmVySGVpZ2h0PzogbnVtYmVyO1xuICAgIGlubmVyV2lkdGg/OiBudW1iZXI7XG4gIH07XG4gIGNhbXBhaWduPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cbiIsImltcG9ydCB7IFB1YmxpY1Byb2ZpbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHJlcXVlc3QsIHNlY3VyZWRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VUb2tlbiB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZS10b2tlbnMnO1xuaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi8uLi9ob29rcy91c2UtdXNlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9maWxlU2VydmljZXMoKSB7XG4gIGNvbnN0IHRva2VuID0gdXNlVG9rZW4oVG9rZW5UeXBlLlBVQkxJQyk7XG4gIGNvbnN0IHsgcmVmcmVzaFB1YmxpY1Rva2VucyB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCBwcm9maWxlVXJsID0gY29uZmlnLnByb2ZpbGVTZXJ2aWNlVXJsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFB1YmxpY1Byb2ZpbGUodXNlcklkPzogc3RyaW5nKTogUHJvbWlzZTxQdWJsaWNQcm9maWxlPiB7XG4gICAgY29uc3QgZmllbGRzID0gJ2JpbyxwaG90b1VSTCxkaXNwbGF5TmFtZSxsb2NhdGlvbixoYW5kbGUnO1xuICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L3B1YmxpYy91c2Vycy8ke3VzZXJJZH0vcHJvZmlsZT9maWVsZHM9JHtmaWVsZHN9YDtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVB1YmxpY1Byb2ZpbGUoXG4gICAgcGFyYW1zOiBPbWl0PFB1YmxpY1Byb2ZpbGUsICdtZXRhZGF0YSc+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L21lL3Byb2ZpbGUvcGVyc29uYWxgO1xuICAgIGF3YWl0IHNlY3VyZWRSZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICB1cmwsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBhcmFtcyksXG4gICAgICB9LFxuICAgICAgdG9rZW46IHRva2VuLmlkVG9rZW4hLFxuICAgIH0pO1xuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnMoeyByZWZyZXNoVG9rZW5BcGlLZXk6IGNvbmZpZy5yZWZyZXNoVG9rZW5BcGlLZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXRQdWJsaWNQcm9maWxlLFxuICAgIHVwZGF0ZVB1YmxpY1Byb2ZpbGUsXG4gIH07XG59XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJztcbmltcG9ydCB7IHN1YnNjcmliZVdpdGhTZWxlY3RvciB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHtcbiAgVXNlclByb3BzLFxuICBGaXJlYmFzZVVzZXIsXG4gIFNzb1VzZXJQcm9wcyxcbiAgU3NvVjJFeGNoYW5nZVJlc3BvbnNlLFxufSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gJ2p3dC1kZWNvZGUnO1xuaW1wb3J0IHsgdHlwZSBQdWJsaWNQcm9maWxlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS90eXBlcyc7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyBBdXRoQ29va2llIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIGdldENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmludGVyZmFjZSBVc2VyU3RvcmUge1xuICB1c2VyOiBVc2VyUHJvcHMgfCBudWxsO1xuICBwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbDtcbiAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IGJvb2xlYW47XG4gIHNldFVzZXI6ICh1c2VyOiBVc2VyUHJvcHMgfCBudWxsKSA9PiB2b2lkO1xuICBzZXRQdWJsaWNQcm9maWxlOiAocHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGwpID0+IHZvaWQ7XG4gIGxvZ291dDogKCkgPT4gdm9pZDtcbiAgcmVmcmVzaFB1YmxpY1Rva2VuczogKGNvbmZpZzoge1xuICAgIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzZXRVc2VyQnlUb2tlbklkOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBsb2FkU3RvcmVkVXNlcjogKGNvbmZpZz86IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc3NvVjJFeGNoYW5nZTogKFxuICAgIHNzb1NvdXJjZUlEOiBzdHJpbmcsXG4gICAgand0OiBzdHJpbmcsXG4gICAgZW52PzogRW52aXJvbm1lbnRcbiAgKSA9PiBQcm9taXNlPFNzb1YyRXhjaGFuZ2VSZXNwb25zZT47XG59XG5cbmV4cG9ydCBjb25zdCB1c2VVc2VyU3RvcmUgPSBjcmVhdGU8VXNlclN0b3JlPigpKFxuICBzdWJzY3JpYmVXaXRoU2VsZWN0b3IoKHNldCwgZ2V0KSA9PiAoe1xuICAgIHVzZXI6IG51bGwsXG4gICAgcHVibGljUHJvZmlsZTogbnVsbCxcbiAgICByZWZyZXNoZWRUb2tlbkxvYWRlZDogZmFsc2UsXG5cbiAgICBzZXRVc2VyOiAodXNlcjogVXNlclByb3BzIHwgbnVsbCkgPT4ge1xuICAgICAgc2V0KHsgdXNlciB9KTtcbiAgICB9LFxuXG4gICAgc2V0UHVibGljUHJvZmlsZTogKHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsKSA9PiB7XG4gICAgICBzZXQoeyBwdWJsaWNQcm9maWxlIH0pO1xuICAgIH0sXG5cbiAgICBzZXRVc2VyQnlUb2tlbklkOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1c2VyID0gand0RGVjb2RlPEZpcmViYXNlVXNlcj4oaWRUb2tlbik7XG4gICAgICAgIGNvbnN0IHVzZXJQcm9wczogVXNlclByb3BzID0ge1xuICAgICAgICAgIHVpZDogdXNlci51c2VyX2lkLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiB1c2VyLnNhZmVEaXNwbGF5TmFtZSxcbiAgICAgICAgICBlbWFpbDogdXNlci5lbWFpbCxcbiAgICAgICAgICBwaG90b1VSTDogdXNlci5zYWZlUGhvdG9VUkwsXG4gICAgICAgICAgaGFuZGxlOiB1c2VyLmhhbmRsZSxcbiAgICAgICAgfTtcbiAgICAgICAgc2V0KHsgdXNlcjogdXNlclByb3BzIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGxvZ291dDogKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS5jbGVhclB1YmxpY1Rva2VucygpO1xuICAgICAgICB0b2tlblN0b3JlLmNsZWFyQ3VzdG9tVG9rZW5zKCk7XG4gICAgICAgIHNldCh7IHVzZXI6IG51bGwgfSk7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdhcmVuYS1jb21tZW50cy1sb2dvdXQnKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVmcmVzaFB1YmxpY1Rva2VuczogYXN5bmMgKGNvbmZpZzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcblxuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlZml4ID0gJ2h0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlYXBpcy5jb20vdjEvdG9rZW4/a2V5PSc7XG4gICAgICAgIGNvbnN0IGFwaUtleSA9IGNvbmZpZy5yZWZyZXNoVG9rZW5BcGlLZXk7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3ByZWZpeH0ke2FwaUtleX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICBjb25zdCB7IHNldFVzZXJCeVRva2VuSWQgfSA9IGdldCgpO1xuICAgICAgICBzZXRVc2VyQnlUb2tlbklkKGRhdGEuaWRfdG9rZW4pO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUudXBkYXRlUHVibGljVG9rZW5zKGRhdGEuaWRfdG9rZW4sIGRhdGEucmVmcmVzaF90b2tlbik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgY29uc3QgeyBsb2dvdXQgfSA9IGdldCgpO1xuICAgICAgICBsb2dvdXQoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbG9hZFN0b3JlZFVzZXI6IGFzeW5jIChjb25maWc/OiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IHB1YmxpY0lkVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG4gICAgICBjb25zdCBwdWJsaWNSZWZyZXNoVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcbiAgICAgIGNvbnN0IGN1c3RvbUlkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBjb25zdCBjdXN0b21Vc2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQXV0aENvb2tpZS5DVVNUT01fVVNFUik7XG5cbiAgICAgIGlmICghIWN1c3RvbUlkVG9rZW4gJiYgISFjdXN0b21Vc2VyKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVzZXIgPSBKU09OLnBhcnNlKGN1c3RvbVVzZXIpO1xuXG4gICAgICAgIHNldCh7IHVzZXI6IHBhcnNlZFVzZXIgfSk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVDdXN0b21Ub2tlbihjdXN0b21JZFRva2VuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwdWJsaWNJZFRva2VuKSB7XG4gICAgICAgICAgY29uc3QgeyBzZXRVc2VyQnlUb2tlbklkIH0gPSBnZXQoKTtcbiAgICAgICAgICBzZXRVc2VyQnlUb2tlbklkKHB1YmxpY0lkVG9rZW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHB1YmxpY1JlZnJlc2hUb2tlbiAmJiBjb25maWcpIHtcbiAgICAgICAgICBjb25zdCB7IHJlZnJlc2hQdWJsaWNUb2tlbnMgfSA9IGdldCgpO1xuICAgICAgICAgIGF3YWl0IHJlZnJlc2hQdWJsaWNUb2tlbnMoY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXQoeyByZWZyZXNoZWRUb2tlbkxvYWRlZDogdHJ1ZSB9KTtcbiAgICB9LFxuXG4gICAgc3NvVjJFeGNoYW5nZTogYXN5bmMgKFxuICAgICAgc3NvU291cmNlSUQ6IHN0cmluZyxcbiAgICAgIGp3dDogc3RyaW5nLFxuICAgICAgZW52PzogRW52aXJvbm1lbnRcbiAgICApID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZyhlbnYgPz8gJ3Byb2R1Y3Rpb24nKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZVVybCA9IGNvbmZpZy5wcm9maWxlU2VydmljZVVybDtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9zc28vc291cmNlcy8ke3Nzb1NvdXJjZUlEfS91c2VyYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFNzb1YyRXhjaGFuZ2VSZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwsIHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNpZ25lZFVzZXJEYXRhOiBqd3QgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRVc2VyID0gand0RGVjb2RlPFNzb1VzZXJQcm9wcz4ocmVzcG9uc2UudG9rZW4pO1xuXG4gICAgICAgICAgY29uc3QgeyBzZXRVc2VyLCBzZXRQdWJsaWNQcm9maWxlIH0gPSBnZXQoKTtcblxuICAgICAgICAgIHNldFVzZXIoe1xuICAgICAgICAgICAgdWlkOiBkZWNvZGVkVXNlcj8uc3ViLFxuICAgICAgICAgICAgZW1haWw6IGRlY29kZWRVc2VyPy5lbWFpbCxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBkZWNvZGVkVXNlcj8uZGlzcGxheU5hbWUsXG4gICAgICAgICAgICBwaG90b1VSTDogZGVjb2RlZFVzZXI/LnBob3RvVVJMLFxuICAgICAgICAgICAgaGFuZGxlOiBkZWNvZGVkVXNlcj8uaGFuZGxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2V0UHVibGljUHJvZmlsZSh7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogZGVjb2RlZFVzZXI/LmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgcGhvdG9VUkw6IGRlY29kZWRVc2VyPy5waG90b1VSTCxcbiAgICAgICAgICAgIGhhbmRsZTogZGVjb2RlZFVzZXI/LmhhbmRsZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVDdXN0b21Ub2tlbihyZXNwb25zZS50b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTU08gVjIgRXhjaGFuZ2UgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSxcbiAgfSkpXG4pO1xuIiwiaW1wb3J0IHsgdXNlUHJvZmlsZVNlcnZpY2VzIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcyc7XG5pbXBvcnQgeyB1c2VVc2VyU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdXNlci1zdG9yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnVzZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHVibGljUHJvZmlsZSgpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5wdWJsaWNQcm9maWxlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZnJlc2hlZFRva2VuTG9hZGVkKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnJlZnJlc2hlZFRva2VuTG9hZGVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJBY3Rpb25zKCkge1xuICBjb25zdCBzZXRVc2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFVzZXIpO1xuICBjb25zdCBzZXRQdWJsaWNQcm9maWxlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFB1YmxpY1Byb2ZpbGUpO1xuICBjb25zdCBsb2dvdXQgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUubG9nb3V0KTtcbiAgY29uc3QgcmVmcmVzaFB1YmxpY1Rva2VucyA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoUHVibGljVG9rZW5zKTtcbiAgY29uc3Qgc2V0VXNlckJ5VG9rZW5JZCA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRVc2VyQnlUb2tlbklkKTtcbiAgY29uc3QgbG9hZFN0b3JlZFVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUubG9hZFN0b3JlZFVzZXIpO1xuICBjb25zdCBzc29WMkV4Y2hhbmdlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNzb1YyRXhjaGFuZ2UpO1xuICBcblxuICByZXR1cm4ge1xuICAgIHNldFVzZXIsXG4gICAgc2V0UHVibGljUHJvZmlsZSxcbiAgICBsb2dvdXQsXG4gICAgcmVmcmVzaFB1YmxpY1Rva2VucyxcbiAgICBzZXRVc2VyQnlUb2tlbklkLFxuICAgIGxvYWRTdG9yZWRVc2VyLFxuICAgIHNzb1YyRXhjaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVcGRhdGVQcm9maWxlKCkge1xuICBjb25zdCB7IHVwZGF0ZVB1YmxpY1Byb2ZpbGUgfSA9IHVzZVByb2ZpbGVTZXJ2aWNlcygpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZVB1YmxpY1Byb2ZpbGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyV2l0aFByb2ZpbGUoKSB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUudXNlcik7XG4gIGNvbnN0IHB1YmxpY1Byb2ZpbGUgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucHVibGljUHJvZmlsZSk7XG4gIGNvbnN0IHJlZnJlc2hlZFRva2VuTG9hZGVkID0gdXNlVXNlclN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnJlZnJlc2hlZFRva2VuTG9hZGVkXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB1c2VyLFxuICAgIHB1YmxpY1Byb2ZpbGUsXG4gICAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQsXG4gIH07XG59XG5cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVXNlciwgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdXNlcic7XG5pbXBvcnQgeyB1c2VNdXRhdGlvbiB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyB1c2VQcm9maWxlU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZXJQcm92aWRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKTtcbiAgY29uc3QgeyBzZXRQdWJsaWNQcm9maWxlLCBsb2FkU3RvcmVkVXNlciB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyBnZXRQdWJsaWNQcm9maWxlOiBnZXRQdWJsaWNQcm9maWxlU2VydmljZSB9ID0gdXNlUHJvZmlsZVNlcnZpY2VzKCk7XG4gIGNvbnN0IHsgbXV0YXRlQXN5bmM6IGdldFB1YmxpY1Byb2ZpbGUgfSA9IHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBnZXRQdWJsaWNQcm9maWxlU2VydmljZSxcbiAgfSk7XG5cbiAgY29uc3QgbG9hZFB1YmxpY1Byb2ZpbGUgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKHVzZXI/LnVpZCkge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFB1YmxpY1Byb2ZpbGUodXNlci51aWQpO1xuICAgICAgc2V0UHVibGljUHJvZmlsZShwcm9maWxlKTtcbiAgICB9XG4gIH0sIFt1c2VyPy51aWQsIGdldFB1YmxpY1Byb2ZpbGUsIHNldFB1YmxpY1Byb2ZpbGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvYWRQdWJsaWNQcm9maWxlKCk7XG4gIH0sIFtsb2FkUHVibGljUHJvZmlsZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZFN0b3JlZFVzZXIoY29uZmlnKTtcbiAgfSwgW2NvbmZpZywgbG9hZFN0b3JlZFVzZXJdKTtcblxuICByZXR1cm4gY2hpbGRyZW47XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFuYWx5dGljc1dpZGdldFR5cGUsXG4gIEFuYWx5dGljc0V2ZW50LFxuICBJZGVudGl0eVByb3BzLFxuICBSdWRkZXJDb250ZXh0LFxuICBUcmFja1Byb3BzLFxufSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5pbXBvcnQgeyByZW1vdmVQYXJhbXNGcm9tVXJsIH0gZnJvbSAnLi4vdXRpbHMvdXJsJztcblxuY29uc3QgQU5PTllNT1VTX0lEX0tFWSA9ICdhcmVuYUFub255bW91c0lkJztcblxuY29uc3QgTFNfS0VZUyA9IHtcbiAgYW5vbjogJ3JzX2Fub255bW91c19pZCcsXG4gIGluaXRSZWZlcnJlcjogJ3JzX2luaXRpYWxfcmVmZXJyZXInLFxuICBpbml0RG9tYWluOiAncnNfaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluJyxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRPclNldEFub255bW91c0lkKCk6IHN0cmluZyB7XG4gIGNvbnN0IGV4aXN0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5hbm9uKTtcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gIGNvbnN0IGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5hbm9uLCBpZCk7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXJJbml0aWFsUmVmZXJyZXIoKTogdm9pZCB7XG4gIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIpKSB7XG4gICAgY29uc3QgcmVmID0gZG9jdW1lbnQucmVmZXJyZXIgfHwgJyRkaXJlY3QnO1xuICAgIGNvbnN0IGRvbWFpbiA9IHJlZiAmJiByZWYgIT09ICckZGlyZWN0JyA/IG5ldyBVUkwocmVmKS5ob3N0bmFtZSA6ICcnO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyLCByZWYpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuaW5pdERvbWFpbiwgZG9tYWluKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUNhbXBhaWduKHU6IFVSTCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlzID0gW1xuICAgICd1dG1fc291cmNlJyxcbiAgICAndXRtX21lZGl1bScsXG4gICAgJ3V0bV9jYW1wYWlnbicsXG4gICAgJ3V0bV90ZXJtJyxcbiAgICAndXRtX2NvbnRlbnQnLFxuICBdO1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAga2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgIGNvbnN0IHYgPSB1LnNlYXJjaFBhcmFtcy5nZXQoayk7XG4gICAgaWYgKHYpIG91dFtrXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPyBvdXQgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJ1ZGRlckNvbnRleHQoKTogUnVkZGVyQ29udGV4dCB7XG4gIGNvbnN0IHcgPSB3aW5kb3c7XG4gIGNvbnN0IGQgPSBkb2N1bWVudDtcbiAgY29uc3QgcyA9IHdpbmRvdy5zY3JlZW47XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwody5sb2NhdGlvbi5ocmVmKTtcblxuICByZW1lbWJlckluaXRpYWxSZWZlcnJlcigpO1xuXG4gIGNvbnN0IGluaXRpYWxfcmVmZXJyZXIgPVxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyKSB8fCAnJGRpcmVjdCc7XG4gIGNvbnN0IGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbiA9XG4gICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0RG9tYWluKSB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGNoYW5uZWw6ICd3ZWInLFxuICAgIGFub255bW91c0lkOiBnZXRPclNldEFub255bW91c0lkKCksXG4gICAgbG9jYWxlOiBuYXZpZ2F0b3IubGFuZ3VhZ2UsXG4gICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgIHRpbWV6b25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUsXG4gICAgb3M6IHsgbmFtZTogbmF2aWdhdG9yLnBsYXRmb3JtLCB2ZXJzaW9uOiB1bmRlZmluZWQgfSxcbiAgICBwYWdlOiB7XG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICByZWZlcnJlcjogZC5yZWZlcnJlciB8fCAnJGRpcmVjdCcsXG4gICAgICByZWZlcnJpbmdfZG9tYWluOiBkLnJlZmVycmVyID8gbmV3IFVSTChkLnJlZmVycmVyKS5ob3N0bmFtZSA6ICcnLFxuICAgICAgc2VhcmNoOiB1cmwuc2VhcmNoLFxuICAgICAgdGl0bGU6IGQudGl0bGUsXG4gICAgICB1cmw6IHVybC50b1N0cmluZygpLFxuICAgICAgaW5pdGlhbF9yZWZlcnJlcixcbiAgICAgIGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbixcbiAgICB9LFxuICAgIHNjcmVlbjoge1xuICAgICAgZGVuc2l0eTogKHcuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA/PyAxLFxuICAgICAgaGVpZ2h0OiBzLmhlaWdodCxcbiAgICAgIHdpZHRoOiBzLndpZHRoLFxuICAgICAgaW5uZXJIZWlnaHQ6IHcuaW5uZXJIZWlnaHQsXG4gICAgICBpbm5lcldpZHRoOiB3LmlubmVyV2lkdGgsXG4gICAgfSxcbiAgICBjYW1wYWlnbjogcGFyc2VDYW1wYWlnbih1cmwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRJZGVudGlmaWVyKG9wdGlvbnM6IElkZW50aXR5UHJvcHMgPSB7fSk6IElkZW50aXR5UHJvcHMge1xuICBjb25zdCBpZGVudGlmaWVyOiBJZGVudGl0eVByb3BzID0ge307XG5cbiAgaWYgKG9wdGlvbnMudXNlcklkKSB7XG4gICAgaWRlbnRpZmllci51c2VySWQgPSBvcHRpb25zLnVzZXJJZDtcbiAgfVxuXG4gIGxldCBjdXJyZW50QW5vbnltb3VzSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY3VycmVudEFub255bW91c0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYWNjZXNzIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbm9ueW1vdXNJZCkge1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBvcHRpb25zLmFub255bW91c0lkO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShBTk9OWU1PVVNfSURfS0VZLCBvcHRpb25zLmFub255bW91c0lkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSBhbm9ueW1vdXNJZCB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjdXJyZW50QW5vbnltb3VzSWQpIHtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gY3VycmVudEFub255bW91c0lkO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5ld0Fub255bW91c0lkID0gZ2VuZXJhdGVVVUlEKCk7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IG5ld0Fub255bW91c0lkO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShBTk9OWU1PVVNfSURfS0VZLCBuZXdBbm9ueW1vdXNJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgbmV3IGFub255bW91c0lkIHRvIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXI7XG59XG5cbmZ1bmN0aW9uIGdldENhbm9uaWNhbFVybCgpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxNZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAnbGlua1tyZWw9XCJjYW5vbmljYWxcIl0nXG4gICkgYXMgSFRNTExpbmtFbGVtZW50O1xuICBjb25zdCByYXdVcmwgPSBjYW5vbmljYWxNZXRhPy5ocmVmIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICByZXR1cm4gcmVtb3ZlUGFyYW1zRnJvbVVybChyYXdVcmwpO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudFByb3BlcnRpZXMoXG4gIHdpZGdldFR5cGU6IHN0cmluZyxcbiAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICB3aWRnZXRfdHlwZTogd2lkZ2V0VHlwZSxcbiAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgICBkb21haW46IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxcbiAgICAgIHRpdGxlOiB3aW5kb3cuZG9jdW1lbnQudGl0bGUsXG4gICAgICBjYW5vbmljYWxfdXJsOiBnZXRDYW5vbmljYWxVcmwoKSxcbiAgICAgIHNuaXBwZXRfaWQ6IHdpbmRvdy5fX0FSRU5BX18/LnNuaXBwZXRJZCB8fCBudWxsLFxuICAgICAgLi4ucHJvcGVydGllcyxcbiAgICB9LFxuICAgIGNvbnRleHQ6IGJ1aWxkUnVkZGVyQ29udGV4dCgpLFxuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGludGVncmF0aW9uczogeyBBbGw6IHRydWUgfSxcbiAgICAuLi5nZXRJZGVudGlmaWVyKGlkZW50aXR5KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIEF1dGhvcml6YXRpb246ICdCYXNpYyAnICsgYnRvYShgJHt3cml0ZUtleX06YCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmFseXRpY3Mod3JpdGVLZXk6IHN0cmluZywgZGF0YVBsYW5lVXJsOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBwYWdlOiBhc3luYyAoXG4gICAgICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICAgICAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgICAgIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtkYXRhUGxhbmVVcmx9L3YxL3BhZ2VgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXkpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdHlwZTogJ3BhZ2UnLFxuICAgICAgICAgIC4uLmdldEV2ZW50UHJvcGVydGllcyh3aWRnZXRUeXBlLCBwcm9wZXJ0aWVzLCBpZGVudGl0eSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNlbmQgcGFnZSBldmVudCB0byBSdWRkZXJzdGFjaycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdHJhY2s6IGFzeW5jIChcbiAgICAgIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGUsXG4gICAgICBldmVudDogQW5hbHl0aWNzRXZlbnQsXG4gICAgICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICAgICAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2RhdGFQbGFuZVVybH0vdjEvdHJhY2tgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXkpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgdHlwZTogJ3RyYWNrJyxcbiAgICAgICAgICAuLi5nZXRFdmVudFByb3BlcnRpZXMod2lkZ2V0VHlwZSwgcHJvcGVydGllcywgaWRlbnRpdHkpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzZW5kIHRyYWNrIGV2ZW50IHRvIFJ1ZGRlcnN0YWNrJyk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiByZW1vdmVQYXJhbXNGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICB1cmxPYmouc2VhcmNoID0gJyc7XG5cbiAgICByZXR1cm4gdXJsT2JqLmhyZWY7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgY2xlYXJpbmcgc2VhcmNoIHBhcmFtcyBmcm9tIFVSTDonLCBlcnJvcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRBbmFseXRpY3MgfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3MnO1xuaW1wb3J0IHsgQW5hbHl0aWNzRXZlbnQsIFRyYWNrT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUcmFjayh0cmFja09wdGlvbnM/OiBUcmFja09wdGlvbnMpIHtcbiAgY29uc3QgdHJhY2sgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBldmVudDogQW5hbHl0aWNzRXZlbnQsXG4gICAgICB1c2VySWQ/OiBzdHJpbmcsXG4gICAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD5cbiAgICApID0+IHtcbiAgICAgIGlmICghdHJhY2tPcHRpb25zKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGFuYWx5dGljcyA9IGdldEFuYWx5dGljcyhcbiAgICAgICAgdHJhY2tPcHRpb25zLnJzV3JpdGVLZXksXG4gICAgICAgIHRyYWNrT3B0aW9ucy5yc0RhdGFQbGFuZVVybFxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHJhY2tQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiA9IHtcbiAgICAgICAgc2l0ZV9pZDogdHJhY2tPcHRpb25zLnNpdGVJZCxcbiAgICAgICAgd2lkZ2V0X2lkOiB0cmFja09wdGlvbnMud2lkZ2V0SWQsXG4gICAgICAgIHRyaWdnZXI6IHRyYWNrT3B0aW9ucy50cmlnZ2VyLFxuICAgICAgICAuLi5wcm9wZXJ0aWVzLFxuICAgICAgfTtcblxuICAgICAgYW5hbHl0aWNzLnRyYWNrKFxuICAgICAgICB0cmFja09wdGlvbnMud2lkZ2V0VHlwZSxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRyYWNrUHJvcGVydGllcyxcbiAgICAgICAgdXNlcklkID8geyB1c2VySWQgfSA6IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9LFxuICAgIFt0cmFja09wdGlvbnNdXG4gICk7XG5cbiAgcmV0dXJuIHRyYWNrO1xufVxuIiwiaW1wb3J0IHsgdXNlQXV0aERpYWxvZyB9IGZyb20gJy4uL2NvbnRleHQvYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdXNlcic7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VUb2tlbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdG9rZW5zJztcbmltcG9ydCB7IEFuYWx5dGljc0V2ZW50IH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcbmltcG9ydCB7IHVzZVRyYWNrIH0gZnJvbSAnLi4vaG9va3MvdXNlLXRyYWNrJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXV0aERpYWxvZygpIHtcbiAgY29uc3Qge1xuICAgIGFwcE5hbWUsXG4gICAgYXBwRGVzY3JpcHRpb24sXG4gICAgbGFuZ3VhZ2UsXG4gICAgdHJhY2tPcHRpb25zLFxuICAgIGlzT3BlbixcbiAgICBjbG9zZURpYWxvZyxcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH0gPSB1c2VBdXRoRGlhbG9nKCk7XG4gIGNvbnN0IGZyYW1lQXBwTmFtZSA9IGFwcE5hbWUgfHwgJ0FyZW5hIEFJIENoYXQnO1xuICBjb25zdCBmcmFtZUFwcERlc2NyaXB0aW9uID0gYXBwRGVzY3JpcHRpb24gfHwgJ0FyZW5hIEFJIENoYXQnO1xuICBjb25zdCB7IHNldFVzZXIgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgdXBkYXRlUHVibGljVG9rZW5zIH0gPSB1c2VUb2tlbnMoKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuXG4gIGNvbnN0IHRyYWNrID0gdXNlVHJhY2sodHJhY2tPcHRpb25zKTtcblxuICBjb25zdCBpZnJhbWVVcmwgPSBgJHtjb25maWcuYXV0aElmcmFtZVVybH0vP2FwcC1uYW1lPSR7ZnJhbWVBcHBOYW1lfSZhcHAtZGVzY3JpcHRpb249JHtmcmFtZUFwcERlc2NyaXB0aW9ufSZsYW5ndWFnZT0ke2xhbmd1YWdlID8/ICdlbid9YDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSAobWVzc2FnZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy5zb3VyY2UgIT09ICdhcmVuYS1hdXRoZW50aWNhdGlvbicpIHJldHVybjtcblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2NhbmNlbGVkJykge1xuICAgICAgICBjbG9zZURpYWxvZygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi12aWV3ZWQnKSB7XG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uVmlld2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tc3RhcnRlZCcpIHtcbiAgICAgICAgY29uc3QgeyBhdXRoVHlwZSB9ID0gbWVzc2FnZS5kYXRhPy5wYXlsb2FkIHx8IHt9O1xuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvblN0YXJ0ZWQsIHVuZGVmaW5lZCwge1xuICAgICAgICAgIGF1dGhUeXBlOiBhdXRoVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLWNvbXBsZXRlZCcpIHtcbiAgICAgICAgY29uc3QgeyBpZFRva2VuLCByZWZyZXNoVG9rZW4sIHVzZXIsIGF1dGhUeXBlLCBpc1NpZ251cCB9ID1cbiAgICAgICAgICBtZXNzYWdlLmRhdGE/LnBheWxvYWQgfHwge307XG5cbiAgICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQXV0aGVudGljYXRpb24gY29tcGxldGVkIGJ1dCB1c2VyIGRhdGEgaXMgbWlzc2luZycpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uQ29tcGxldGVkLCB1c2VyLnVpZCwge1xuICAgICAgICAgIGlzX3NpZ251cDogaXNTaWdudXAsXG4gICAgICAgICAgYXV0aF90eXBlOiBhdXRoVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG9uQXV0aENvbXBsZXRlZD8uKHVzZXIpO1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgICAgc2V0VXNlcih1c2VyKTtcbiAgICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gIH0sIFtzZXRVc2VyLCB1cGRhdGVQdWJsaWNUb2tlbnMsIG9uQXV0aENvbXBsZXRlZCwgdHJhY2ssIGNsb3NlRGlhbG9nXSk7XG5cbiAgcmV0dXJuIGlzT3BlbiA/IChcbiAgICA8aWZyYW1lXG4gICAgICBzcmM9e2lmcmFtZVVybH1cbiAgICAgIHRpdGxlPVwiQXJlbmEgQXV0aGVudGljYXRpb25cIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgd2lkdGg6ICcxMDB2dycsXG4gICAgICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgekluZGV4OiA5OTk5OTk5OTk5LFxuICAgICAgfX1cbiAgICA+PC9pZnJhbWU+XG4gICkgOiBudWxsO1xufVxuIiwiaW1wb3J0IHsgRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuXG5jb25zdCBSVURERVJfQU5PTllNT1VTX0lEX1NUT1JBR0VfS0VZID0gJ2FyZW5hLWFuYWx5dGljczpycy1hbm9ueW1vdXMtaWQnO1xuXG50eXBlIFJ1ZGRlcldpbmRvdyA9IFdpbmRvdyAmIHtcbiAgcnVkZGVyYW5hbHl0aWNzPzogeyBnZXRBbm9ueW1vdXNJZD86ICgpID0+IHN0cmluZyB8IG51bGwgfTtcbiAgcnVkZGVyQW5hbHl0aWNzPzogeyBnZXRBbm9ueW1vdXNJZD86ICgpID0+IHN0cmluZyB8IG51bGwgfTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlQW5vbnltb3VzSWQodmFsdWU/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnNlZCA9IHZhbHVlPy50cmltKCk7XG4gIGlmICghcGFyc2VkIHx8IHBhcnNlZCA9PT0gJ251bGwnIHx8IHBhcnNlZCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVkZGVyQW5vbnltb3VzSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcnVkZGVyV2luZG93ID0gd2luZG93IGFzIFJ1ZGRlcldpbmRvdztcbiAgY29uc3QgZnJvbVJ1ZGRlckNsaWVudCA9IHBhcnNlQW5vbnltb3VzSWQoXG4gICAgcnVkZGVyV2luZG93LnJ1ZGRlcmFuYWx5dGljcz8uZ2V0QW5vbnltb3VzSWQ/LigpID8/XG4gICAgICBydWRkZXJXaW5kb3cucnVkZGVyQW5hbHl0aWNzPy5nZXRBbm9ueW1vdXNJZD8uKCksXG4gICk7XG4gIGlmIChmcm9tUnVkZGVyQ2xpZW50KSByZXR1cm4gZnJvbVJ1ZGRlckNsaWVudDtcblxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZUFub255bW91c0lkKFxuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFJVRERFUl9BTk9OWU1PVVNfSURfU1RPUkFHRV9LRVkpLFxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRoU2VydmljZXMoKSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgaWRlbnRpdHlVcmwgPSBjb25maWcuaWRlbnRpdHlTZXJ2aWNlVXJsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldEFub255bW91c0lkZW50aXR5VG9rZW4oKTogUHJvbWlzZTxFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgdXJsID0gYCR7aWRlbnRpdHlVcmx9L2Fub255bW91cy10b2tlbmA7XG4gICAgY29uc3QgYW5vbnltb3VzSWQgPSBnZXRSdWRkZXJBbm9ueW1vdXNJZCgpO1xuXG4gICAgaWYgKCFhbm9ueW1vdXNJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KCdQT1NUJywgdXJsLCB7XG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFub255bW91c0lkIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuLFxuICB9O1xufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQge1xuICBnZXRSdWRkZXJBbm9ueW1vdXNJZCxcbiAgdXNlQXV0aFNlcnZpY2VzLFxufSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3VzZS1hdXRoLXNlcnZpY2VzJztcbmltcG9ydCB7IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIEFub255bW91c1Rva2VuUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCB0b2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS51cGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB7IGdldEFub255bW91c0lkZW50aXR5VG9rZW4gfSA9IHVzZUF1dGhTZXJ2aWNlcygpO1xuICBjb25zdCBoYXNGb3JjZWRSZWZyZXNoSW5EZWJ1Z1JlZiA9IHVzZVJlZihmYWxzZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBydWRkZXJBbm9ueW1vdXNJZCA9IGdldFJ1ZGRlckFub255bW91c0lkKCk7XG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaEFub255bW91c1Rva2VuID1cbiAgICAgICF0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4gfHxcbiAgICAgIChjb25maWcuZGVidWcgJiZcbiAgICAgICAgQm9vbGVhbihydWRkZXJBbm9ueW1vdXNJZCkgJiZcbiAgICAgICAgIWhhc0ZvcmNlZFJlZnJlc2hJbkRlYnVnUmVmLmN1cnJlbnQpO1xuXG4gICAgaWYgKCFzaG91bGRSZWZyZXNoQW5vbnltb3VzVG9rZW4pIHJldHVybjtcblxuICAgIGlmICh0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4pIHtcbiAgICAgIGhhc0ZvcmNlZFJlZnJlc2hJbkRlYnVnUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4oKVxuICAgICAgLnRoZW4oKHRva2VuOiBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKFxuICAgICAgICAgIHRva2VuLmFjY2Vzc190b2tlbixcbiAgICAgICAgICB0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4gPyAnZm9yY2UtcmVmcmVzaC1kZWJ1ZycgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAodG9rZW5zLmFub255bW91cy5pZFRva2VuKSB7XG4gICAgICAgICAgaGFzRm9yY2VkUmVmcmVzaEluRGVidWdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFjdC1zZGstYXV0aF0gZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbiBmYWlsZWQnLCB7XG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0sIFtcbiAgICBjb25maWcuZGVidWcsXG4gICAgdG9rZW5zLmFub255bW91cy5pZFRva2VuLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuLFxuICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4sXG4gIF0pO1xuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbiIsImltcG9ydCB7IEF1dGhEaWFsb2dQcm92aWRlciB9IGZyb20gJy4vYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuaW1wb3J0IHsgUXVlcnlDbGllbnQsIFF1ZXJ5Q2xpZW50UHJvdmlkZXIgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgVXNlclByb3ZpZGVyIH0gZnJvbSAnLi91c2VyLXByb3ZpZGVyJztcbmltcG9ydCB7IENvbmZpZ1Byb3ZpZGVyIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IEF1dGhEaWFsb2cgZnJvbSAnLi4vZGlhbG9nJztcbmltcG9ydCB7IEFub255bW91c1Rva2VuUHJvdmlkZXIgfSBmcm9tICcuL2Fub255bW91cy10b2tlbi1wcm92aWRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBBdXRoUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgcXVlcnlDbGllbnQsXG4gIGVudmlyb25tZW50LFxufToge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBxdWVyeUNsaWVudD86IFF1ZXJ5Q2xpZW50O1xuICBlbnZpcm9ubWVudD86ICdwcm9kdWN0aW9uJyB8ICdkZXZlbG9wbWVudCc7XG59KSB7XG4gIHF1ZXJ5Q2xpZW50ID0gcXVlcnlDbGllbnQgfHwgbmV3IFF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIChcbiAgICA8UXVlcnlDbGllbnRQcm92aWRlciBjbGllbnQ9e3F1ZXJ5Q2xpZW50fT5cbiAgICAgIDxDb25maWdQcm92aWRlciBlbnZpcm9ubWVudD17ZW52aXJvbm1lbnR9PlxuICAgICAgICA8VXNlclByb3ZpZGVyPlxuICAgICAgICAgIDxBdXRoRGlhbG9nUHJvdmlkZXI+XG4gICAgICAgICAgICA8QW5vbnltb3VzVG9rZW5Qcm92aWRlcj5cbiAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICA8QXV0aERpYWxvZyAvPlxuICAgICAgICAgICAgPC9Bbm9ueW1vdXNUb2tlblByb3ZpZGVyPlxuICAgICAgICAgIDwvQXV0aERpYWxvZ1Byb3ZpZGVyPlxuICAgICAgICA8L1VzZXJQcm92aWRlcj5cbiAgICAgIDwvQ29uZmlnUHJvdmlkZXI+XG4gICAgPC9RdWVyeUNsaWVudFByb3ZpZGVyPlxuICApO1xufVxuXG5leHBvcnQgeyB1c2VBdXRoRGlhbG9nIH0gZnJvbSAnLi9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG4iLCJpbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IHVzZVVzZXJTdG9yZSB9IGZyb20gJy4uL3N0b3Jlcyc7XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgZ2V0UnVudGltZUVudmlyb25tZW50IH0gZnJvbSAnLi4vY29uZmlnL3J1bnRpbWUtZW52aXJvbm1lbnQnO1xuXG5mdW5jdGlvbiBnZXRSZWZyZXNoVG9rZW5BcGlLZXkoKTogc3RyaW5nIHtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRSdW50aW1lRW52aXJvbm1lbnQoKTtcbiAgcmV0dXJuIGdldENvbmZpZyhlbnZpcm9ubWVudCkucmVmcmVzaFRva2VuQXBpS2V5O1xufVxuXG5jb25zdCBkZWZhdWx0SGVhZGVycyA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbn07XG5cbmxldCByZWZyZXNoUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVSZWZyZXNoVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChyZWZyZXNoUHJvbWlzZSkge1xuICAgIHJldHVybiByZWZyZXNoUHJvbWlzZTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJTdG9yZSA9IHVzZVVzZXJTdG9yZS5nZXRTdGF0ZSgpO1xuICByZWZyZXNoUHJvbWlzZSA9IHVzZXJTdG9yZVxuICAgIC5yZWZyZXNoUHVibGljVG9rZW5zKHtcbiAgICAgIHJlZnJlc2hUb2tlbkFwaUtleTogZ2V0UmVmcmVzaFRva2VuQXBpS2V5KCksXG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICByZWZyZXNoUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG5cbiAgcmV0dXJuIHJlZnJlc2hQcm9taXNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhdXRoZW50aWNhdGVkRmV0Y2goXG4gIG1ldGhvZDogc3RyaW5nLFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fVxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB0b2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcblxuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICB9XG5cbiAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAuLi5kZWZhdWx0SGVhZGVycyxcbiAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gIH07XG5cbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgcmV0dXJuIGZldGNoKHVybCwgcGFyYW1zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZXNwb25zZShyZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcih7IGVycm9yIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKU09OIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dPbkVycm9yUmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlLCB0ZXh0OiBzdHJpbmcpOiBuZXZlciB7XG4gIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZztcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkPy5lcnJvcnM/LlswXSB8fCB0ZXh0IHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICB9IGNhdGNoIHtcbiAgICBlcnJvck1lc3NhZ2UgPSB0ZXh0IHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRoZW50aWNhdGVkUmVxdWVzdChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgYXN5bmMgZnVuY3Rpb24gYXR0ZW1wdCgpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF1dGhlbnRpY2F0ZWRGZXRjaChtZXRob2QsIHVybCwgb3B0aW9ucyk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiBwYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyByZXF1ZXN0IC0gJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ1VuYXV0aG9yaXplZCcpIGFzIEVycm9yICYgeyBzdGF0dXM/OiBudW1iZXIgfTtcbiAgICAgIGVyci5zdGF0dXMgPSA0MDE7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhyb3dPbkVycm9yUmVzcG9uc2UocmVzcG9uc2UsIHRleHQpO1xuICB9XG5cbiAgY29uc3QgaGFzVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG5cbiAgaWYgKCFoYXNUb2tlbikge1xuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIGF3YWl0IGVuc3VyZVJlZnJlc2hUb2tlbigpO1xuICAgICAgcmV0dXJuIGF3YWl0IGF0dGVtcHQoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgYXR0ZW1wdCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGlzNDAxID1cbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICdzdGF0dXMnIGluIGVycm9yICYmXG4gICAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwMTtcblxuICAgIGlmICghaXM0MDEpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYXV0aG9yaXplZCcpO1xuICAgIH1cblxuICAgIGF3YWl0IGVuc3VyZVJlZnJlc2hUb2tlbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhdHRlbXB0KCk7XG4gICAgfSBjYXRjaCAocmV0cnlFcnJvcikge1xuICAgICAgY29uc3QgcmV0cnlJczQwMSA9XG4gICAgICAgIHJldHJ5RXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAnc3RhdHVzJyBpbiByZXRyeUVycm9yICYmXG4gICAgICAgIChyZXRyeUVycm9yIGFzIEVycm9yICYgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzID09PSA0MDE7XG5cbiAgICAgIGlmIChyZXRyeUlzNDAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hdXRob3JpemVkJyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IHJldHJ5RXJyb3I7XG4gICAgfVxuICB9XG59XG4iXSwibmFtZXMiOlsiQXV0aERpYWxvZ0NvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwidW5kZWZpbmVkIiwiQXV0aERpYWxvZ1Byb3ZpZGVyIiwiY2hpbGRyZW4iLCJpc09wZW4iLCJzZXRJc09wZW4iLCJ1c2VTdGF0ZSIsImFwcE5hbWUiLCJzZXRBcHBOYW1lIiwiYXBwRGVzY3JpcHRpb24iLCJzZXRBcHBEZXNjcmlwdGlvbiIsIm9uQXV0aENvbXBsZXRlZCIsInNldE9uQXV0aENvbXBsZXRlZCIsInRyYWNrT3B0aW9ucyIsInNldFRyYWNrT3B0aW9ucyIsImxhbmd1YWdlIiwic2V0TGFuZ3VhZ2UiLCJfanN4IiwiUHJvdmlkZXIiLCJ2YWx1ZSIsIm9wZW5EaWFsb2ciLCJjbG9zZURpYWxvZyIsIm9uT3BlbkNoYW5nZSIsIm9wZW4iLCJ1c2VBdXRoRGlhbG9nIiwiY29udGV4dCIsInVzZUNvbnRleHQiLCJFcnJvciIsInJ1bnRpbWVFbnZpcm9ubWVudCIsImdldENvbmZpZyIsImVudmlyb25tZW50IiwiaXNEZXYiLCJwcm9maWxlU2VydmljZVVybCIsImlkZW50aXR5U2VydmljZVVybCIsInJlZnJlc2hUb2tlbkFwaUtleSIsImF1dGhJZnJhbWVVcmwiLCJkZWJ1ZyIsIkNvbmZpZ0NvbnRleHQiLCJDb25maWdQcm92aWRlciIsImNvbmZpZyIsInVzZUVmZmVjdCIsInNldFJ1bnRpbWVFbnZpcm9ubWVudCIsInVzZUNvbmZpZyIsImRlZmF1bHRIZWFkZXJzIiwiYXN5bmMiLCJyZXF1ZXN0IiwibWV0aG9kIiwidXJsIiwib3B0aW9ucyIsInJlc3BvbnNlIiwiZmV0Y2giLCJoZWFkZXJzIiwib2siLCJzdGF0dXNUZXh0IiwianNvbiIsIlRva2VuVHlwZSIsIkF1dGhDb29raWUiLCJUT0tFTl9VUERBVEVEX0VWRU5UIiwiZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudCIsInR5cGUiLCJwYXJhbXMiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsImRldGFpbCIsImRlZmF1bHRUb2tlbnMiLCJwdWJsaWMiLCJpZFRva2VuIiwiQ29va2llcyIsImdldCIsIlBVQkxJQ19JRF9UT0tFTiIsInJlZnJlc2hUb2tlbiIsIlBVQkxJQ19SRUZSRVNIX1RPS0VOIiwiYW5vbnltb3VzIiwiQU5PTllNT1VTX0lEX1RPS0VOIiwiZ3Vlc3QiLCJHVUVTVF9JRF9UT0tFTiIsImN1c3RvbSIsIkNVU1RPTV9JRF9UT0tFTiIsInVzZVRva2VuU3RvcmUiLCJjcmVhdGUiLCJzdWJzY3JpYmVXaXRoU2VsZWN0b3IiLCJzZXQiLCJ1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIiLCJzb3VyY2UiLCJ0b2tlbnMiLCJzdGF0ZSIsImV4cGlyZXMiLCJQVUJMSUMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciIsIkFOT05ZTU9VUyIsInVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyIiwiR1VFU1QiLCJ1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciIsIkNVU1RPTSIsImNsZWFyUHVibGljVG9rZW5zSGVscGVyIiwicmVtb3ZlIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIiLCJjbGVhckd1ZXN0VG9rZW5zSGVscGVyIiwiY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIiLCJsb2NhbFN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwiQ1VTVE9NX1VTRVIiLCJnZXRUb2tlbiIsImdldE1vc3RQcml2aWxlZ2VkVG9rZW4iLCJpbmNsdWRlcyIsImdldFJlZnJlc2hUb2tlbiIsInVwZGF0ZVB1YmxpY1Rva2VucyIsInVwZGF0ZUFub255bW91c1Rva2VuIiwidXBkYXRlR3Vlc3RUb2tlbnMiLCJ1cGRhdGVDdXN0b21Ub2tlbiIsImNsZWFyVG9rZW5zIiwiY2xlYXJQdWJsaWNUb2tlbnMiLCJjbGVhckFub255bW91c1Rva2VucyIsImNsZWFyR3Vlc3RUb2tlbnMiLCJjbGVhckN1c3RvbVRva2VucyIsInNpbGVudFVwZGF0ZVB1YmxpY1Rva2VucyIsInNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuIiwic2lsZW50VXBkYXRlR3Vlc3RUb2tlbnMiLCJzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbiIsInNpbGVudENsZWFyUHVibGljVG9rZW5zIiwic2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJzaWxlbnRDbGVhckd1ZXN0VG9rZW5zIiwic2lsZW50Q2xlYXJDdXN0b21Ub2tlbnMiLCJ1c2VUb2tlbkV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZVJlZiIsInVzZVJlZiIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0ciIsImhhbmRsZVRva2VuVXBkYXRlIiwiZXZlbnQiLCJjdXJyZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZSIsInVzZVRva2VucyIsInVzZVRva2VuIiwidXNlVG9rZW5WYWx1ZSIsInVzZVJlZnJlc2hUb2tlbiIsIkFuYWx5dGljc1dpZGdldFR5cGUiLCJBbmFseXRpY3NFdmVudCIsInVzZVByb2ZpbGVTZXJ2aWNlcyIsInRva2VuIiwicmVmcmVzaFB1YmxpY1Rva2VucyIsInVzZVVzZXJBY3Rpb25zIiwicHJvZmlsZVVybCIsImdldFB1YmxpY1Byb2ZpbGUiLCJ1c2VySWQiLCJ1cGRhdGVQdWJsaWNQcm9maWxlIiwiQXV0aG9yaXphdGlvbiIsInBheWxvYWQiLCJ0ZXh0Iiwic3RhdHVzIiwiZXJyb3JzIiwiSlNPTiIsInBhcnNlIiwiY29udGVudFR5cGUiLCJlcnJvciIsImNvbnNvbGUiLCJzZWN1cmVkUmVxdWVzdCIsImJvZHkiLCJzdHJpbmdpZnkiLCJ1c2VVc2VyU3RvcmUiLCJ1c2VyIiwicHVibGljUHJvZmlsZSIsInJlZnJlc2hlZFRva2VuTG9hZGVkIiwic2V0VXNlciIsInNldFB1YmxpY1Byb2ZpbGUiLCJzZXRVc2VyQnlUb2tlbklkIiwiand0RGVjb2RlIiwidXNlclByb3BzIiwidWlkIiwidXNlcl9pZCIsImRpc3BsYXlOYW1lIiwic2FmZURpc3BsYXlOYW1lIiwiZW1haWwiLCJwaG90b1VSTCIsInNhZmVQaG90b1VSTCIsImhhbmRsZSIsImxvZ291dCIsInRva2VuU3RvcmUiLCJnZXRTdGF0ZSIsIkV2ZW50IiwiVVJMU2VhcmNoUGFyYW1zIiwicmVmcmVzaF90b2tlbiIsImdyYW50X3R5cGUiLCJkYXRhIiwiaWRfdG9rZW4iLCJsb2FkU3RvcmVkVXNlciIsInB1YmxpY0lkVG9rZW4iLCJwdWJsaWNSZWZyZXNoVG9rZW4iLCJjdXN0b21JZFRva2VuIiwiZ2V0SXRlbSIsImN1c3RvbVVzZXIiLCJwYXJzZWRVc2VyIiwic3NvVjJFeGNoYW5nZSIsInNzb1NvdXJjZUlEIiwiand0IiwiZW52Iiwic2lnbmVkVXNlckRhdGEiLCJkZWNvZGVkVXNlciIsInN1YiIsInVzZVVzZXIiLCJ1c2VQdWJsaWNQcm9maWxlIiwidXNlUmVmcmVzaGVkVG9rZW5Mb2FkZWQiLCJ1c2VVcGRhdGVQcm9maWxlIiwidXNlVXNlcldpdGhQcm9maWxlIiwiVXNlclByb3ZpZGVyIiwiZ2V0UHVibGljUHJvZmlsZVNlcnZpY2UiLCJtdXRhdGVBc3luYyIsInVzZU11dGF0aW9uIiwibXV0YXRpb25GbiIsImxvYWRQdWJsaWNQcm9maWxlIiwidXNlQ2FsbGJhY2siLCJwcm9maWxlIiwiQU5PTllNT1VTX0lEX0tFWSIsIkxTX0tFWVMiLCJnZXRPclNldEFub255bW91c0lkIiwiZXhpc3RpbmciLCJpZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJzZXRJdGVtIiwicGFyc2VDYW1wYWlnbiIsInUiLCJvdXQiLCJmb3JFYWNoIiwiayIsInYiLCJzZWFyY2hQYXJhbXMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiYnVpbGRSdWRkZXJDb250ZXh0IiwidyIsIndpbmRvdyIsImQiLCJzIiwic2NyZWVuIiwiVVJMIiwibG9jYXRpb24iLCJocmVmIiwicmVmIiwicmVmZXJyZXIiLCJkb21haW4iLCJob3N0bmFtZSIsInJlbWVtYmVySW5pdGlhbFJlZmVycmVyIiwiaW5pdGlhbF9yZWZlcnJlciIsImluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbiIsImNoYW5uZWwiLCJhbm9ueW1vdXNJZCIsImxvY2FsZSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInRpbWV6b25lIiwiSW50bCIsIkRhdGVUaW1lRm9ybWF0IiwicmVzb2x2ZWRPcHRpb25zIiwidGltZVpvbmUiLCJvcyIsIm5hbWUiLCJwbGF0Zm9ybSIsInZlcnNpb24iLCJwYWdlIiwicGF0aCIsInBhdGhuYW1lIiwicmVmZXJyaW5nX2RvbWFpbiIsInNlYXJjaCIsInRpdGxlIiwiZGVuc2l0eSIsImRldmljZVBpeGVsUmF0aW8iLCJoZWlnaHQiLCJ3aWR0aCIsImlubmVySGVpZ2h0IiwiaW5uZXJXaWR0aCIsImNhbXBhaWduIiwiZ2V0SWRlbnRpZmllciIsImlkZW50aWZpZXIiLCJjdXJyZW50QW5vbnltb3VzSWQiLCJ3YXJuIiwibmV3QW5vbnltb3VzSWQiLCJyZXBsYWNlIiwiYyIsInIiLCJnZXRDYW5vbmljYWxVcmwiLCJjYW5vbmljYWxNZXRhIiwicXVlcnlTZWxlY3RvciIsInVybE9iaiIsInJlbW92ZVBhcmFtc0Zyb21VcmwiLCJnZXRFdmVudFByb3BlcnRpZXMiLCJ3aWRnZXRUeXBlIiwicHJvcGVydGllcyIsImlkZW50aXR5Iiwid2lkZ2V0X3R5cGUiLCJjYW5vbmljYWxfdXJsIiwic25pcHBldF9pZCIsIl9fQVJFTkFfXyIsInNuaXBwZXRJZCIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImludGVncmF0aW9ucyIsIkFsbCIsImdldEV2ZW50SGVhZGVycyIsIndyaXRlS2V5IiwiYnRvYSIsInVzZVRyYWNrIiwiYW5hbHl0aWNzIiwicnNXcml0ZUtleSIsImRhdGFQbGFuZVVybCIsInJzRGF0YVBsYW5lVXJsIiwidHJhY2siLCJ0cmFja1Byb3BlcnRpZXMiLCJzaXRlX2lkIiwic2l0ZUlkIiwid2lkZ2V0X2lkIiwid2lkZ2V0SWQiLCJ0cmlnZ2VyIiwiQXV0aERpYWxvZyIsImZyYW1lQXBwTmFtZSIsImZyYW1lQXBwRGVzY3JpcHRpb24iLCJpZnJhbWVVcmwiLCJoYW5kbGVyIiwibWVzc2FnZSIsImF1dGhUeXBlIiwiQXV0aGVudGljYXRpb25TdGFydGVkIiwiaXNTaWdudXAiLCJBdXRoZW50aWNhdGlvbkNvbXBsZXRlZCIsImlzX3NpZ251cCIsImF1dGhfdHlwZSIsIkF1dGhlbnRpY2F0aW9uVmlld2VkIiwic3JjIiwic3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsImxlZnQiLCJ6SW5kZXgiLCJwYXJzZUFub255bW91c0lkIiwicGFyc2VkIiwidHJpbSIsImdldFJ1ZGRlckFub255bW91c0lkIiwicnVkZGVyV2luZG93IiwiZnJvbVJ1ZGRlckNsaWVudCIsInJ1ZGRlcmFuYWx5dGljcyIsImdldEFub255bW91c0lkIiwicnVkZGVyQW5hbHl0aWNzIiwiQW5vbnltb3VzVG9rZW5Qcm92aWRlciIsImdldEFub255bW91c0lkZW50aXR5VG9rZW4iLCJpZGVudGl0eVVybCIsInVzZUF1dGhTZXJ2aWNlcyIsImhhc0ZvcmNlZFJlZnJlc2hJbkRlYnVnUmVmIiwicnVkZGVyQW5vbnltb3VzSWQiLCJCb29sZWFuIiwidGhlbiIsImFjY2Vzc190b2tlbiIsImNhdGNoIiwiQXV0aFByb3ZpZGVyIiwicXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50UHJvdmlkZXIiLCJjbGllbnQiLCJfanN4cyIsImdldFJlZnJlc2hUb2tlbkFwaUtleSIsInJlZnJlc2hQcm9taXNlIiwiZW5zdXJlUmVmcmVzaFRva2VuIiwidXNlclN0b3JlIiwiZmluYWxseSIsImF1dGhlbnRpY2F0ZWRSZXF1ZXN0IiwiYXR0ZW1wdCIsImF1dGhlbnRpY2F0ZWRGZXRjaCIsInBhcnNlUmVzcG9uc2UiLCJlcnIiLCJlcnJvck1lc3NhZ2UiLCJ0aHJvd09uRXJyb3JSZXNwb25zZSIsInJldHJ5RXJyb3IiXSwibWFwcGluZ3MiOiI0WkFnQkEsTUFBTUEsRUFB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