@asgardeo/auth-spa 3.1.5 → 3.3.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/dist/asgardeo-spa.production.esm.js +13 -13
- package/dist/asgardeo-spa.production.esm.js.map +1 -1
- package/dist/asgardeo-spa.production.js +14 -14
- package/dist/asgardeo-spa.production.js.map +1 -1
- package/dist/asgardeo-spa.production.min.js +1 -1
- package/dist/asgardeo-spa.production.min.js.map +1 -1
- package/dist/polyfilled/asgardeo-spa.production.esm.js +14 -14
- package/dist/polyfilled/asgardeo-spa.production.esm.js.map +1 -1
- package/dist/polyfilled/asgardeo-spa.production.js +41 -41
- package/dist/polyfilled/asgardeo-spa.production.js.map +1 -1
- package/dist/polyfilled/asgardeo-spa.production.min.js +1 -1
- package/dist/polyfilled/asgardeo-spa.production.min.js.map +1 -1
- package/dist/src/client.d.ts +2 -1
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +2 -1
- package/dist/src/client.js.map +1 -1
- package/dist/src/clients/main-thread-client.d.ts.map +1 -1
- package/dist/src/clients/main-thread-client.js +2 -1
- package/dist/src/clients/main-thread-client.js.map +1 -1
- package/dist/src/clients/web-worker-client.d.ts.map +1 -1
- package/dist/src/clients/web-worker-client.js +2 -1
- package/dist/src/clients/web-worker-client.js.map +1 -1
- package/dist/src/constants/storage.d.ts +0 -18
- package/dist/src/constants/storage.d.ts.map +1 -1
- package/dist/src/constants/storage.js +0 -19
- package/dist/src/constants/storage.js.map +1 -1
- package/dist/src/helpers/authentication-helper.d.ts.map +1 -1
- package/dist/src/helpers/authentication-helper.js +2 -1
- package/dist/src/helpers/authentication-helper.js.map +1 -1
- package/dist/src/helpers/session-management-helper.d.ts +1 -1
- package/dist/src/helpers/session-management-helper.d.ts.map +1 -1
- package/dist/src/helpers/session-management-helper.js +2 -1
- package/dist/src/helpers/session-management-helper.js.map +1 -1
- package/dist/src/models/client-config.d.ts +12 -3
- package/dist/src/models/client-config.d.ts.map +1 -1
- package/dist/src/models/http-client.js +1 -1
- package/dist/src/models/http-client.js.map +1 -1
- package/dist/src/models/storage.d.ts +39 -0
- package/dist/src/models/storage.d.ts.map +1 -0
- package/dist/src/models/storage.js +40 -0
- package/dist/src/models/storage.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/client.ts +3 -2
- package/src/clients/main-thread-client.ts +4 -7
- package/src/clients/web-worker-client.ts +3 -3
- package/src/constants/storage.ts +0 -19
- package/src/helpers/authentication-helper.ts +2 -2
- package/src/helpers/session-management-helper.ts +2 -2
- package/src/models/client-config.ts +18 -3
- package/src/models/storage.ts +39 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var AsgardeoAuth=function(e){"use strict";function t(e,t,l,i){return new(l||(l=Promise))((function(n,o){function d(e){try{a(i.next(e))}catch(e){o(e)}}function c(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t)}))).then(d,c)}a((i=i.apply(e,t||[])).next())}))}function l(e,t,l,i){return new(l||(l=Promise))((function(n,o){function d(e){try{a(i.next(e))}catch(e){o(e)}}function c(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t)}))).then(d,c)}a((i=i.apply(e,t||[])).next())}))}e.ResponseMode=void 0,function(e){e.formPost="form_post",e.query="query",e.direct="direct"}(e.ResponseMode||(e.ResponseMode={}));e.Stores=void 0,function(e){e.ConfigData="config_data",e.OIDCProviderMetaData="oidc_provider_meta_data",e.SessionData="session_data",e.TemporaryData="temporary_data"}(e.Stores||(e.Stores={}));const i="refresh_token_timer",n=["RS256","RS512","RS384","PS256"],o="code",d="session_state",c="sign_out_url",a="sign_out_success",s="state";var r;!function(e){e.Include="include",e.SameOrigin="same-origin",e.Omit="omit"}(r||(r={}));class u{constructor(e,t,l){this.message=l,this.name=t,this.code=e,Object.setPrototypeOf(this,new.target.prototype)}}class Z{constructor(){}static filterClaimsFromIDTokenPayload(e){const t=Object.assign({},e);null==t||delete t.iss,null==t||delete t.aud,null==t||delete t.exp,null==t||delete t.iat,null==t||delete t.acr,null==t||delete t.amr,null==t||delete t.azp,null==t||delete t.auth_time,null==t||delete t.nonce,null==t||delete t.c_hash,null==t||delete t.at_hash,null==t||delete t.nbf,null==t||delete t.isk,null==t||delete t.sid;const l={};return Object.entries(t).forEach((([e,t])=>{const i=e.split("_").map(((e,t)=>0===t?e:[e[0].toUpperCase(),...e.slice(1)].join(""))).join("");l[i]=t})),l}static getTokenRequestHeaders(){return{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}static generateStateParamForRequestCorrelation(e,t){const l=parseInt(e.split("#")[1]);return t?`${t}_request_${l}`:`request_${l}`}static extractPKCEKeyFromStateParam(e){return`pkce_code_verifier#${parseInt(e.split("request_")[1])}`}}Z.getTenantDomainFromIdTokenPayload=(e,t="@")=>{const l=e.sub.split(t);return l.length>2?l[l.length-1]:""};class b{constructor(e,t){this._dataLayer=e,this._config=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()})),this._cryptoHelper=t}resolveEndpoints(e){return l(this,void 0,void 0,(function*(){const t={},l=yield this._config();return l.endpoints&&Object.keys(l.endpoints).forEach((e=>{const i=e.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));t[i]=(null==l?void 0:l.endpoints)?l.endpoints[e]:""})),Object.assign(Object.assign({},e),t)}))}resolveEndpointsExplicitly(){return l(this,void 0,void 0,(function*(){const e={},t=yield this._config();if(!t.endpoints||!["authorization_endpoint","end_session_endpoint","jwks_uri","check_session_iframe","revocation_endpoint","token_endpoint","issuer","userinfo_endpoint"].every((e=>!!t.endpoints&&Object.keys(t.endpoints).some((t=>t.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`))===e)))))throw new u("JS-AUTH_HELPER-REE-NF01","Required endpoints missing","Some or all of the required endpoints are missing in the object passed to the `endpoints` attribute of the`AuthConfig` object.");return t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:""})),Object.assign({},e)}))}resolveEndpointsByBaseURL(){return l(this,void 0,void 0,(function*(){const e={},t=yield this._config(),l=t.baseUrl;if(!l)throw new u("JS-AUTH_HELPER_REBO-NF01","Base URL not defined.","Base URL is not defined in AuthClient config.");t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:""}));const i={authorization_endpoint:`${l}/oauth2/authorize`,end_session_endpoint:`${l}/oidc/logout`,issuer:`${l}/oauth2/token`,jwks_uri:`${l}/oauth2/jwks`,check_session_iframe:`${l}/oidc/checksession`,revocation_endpoint:`${l}/oauth2/revoke`,token_endpoint:`${l}/oauth2/token`,userinfo_endpoint:`${l}/oauth2/userinfo`};return Object.assign(Object.assign({},i),e)}))}validateIdToken(e){var t;return l(this,void 0,void 0,(function*(){const l=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,i=yield this._config();if(!l||0===l.trim().length)throw new u("JS_AUTH_HELPER-VIT-NF01","JWKS endpoint not found.","No JWKS endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the JWKS endpoint passed to the SDK is empty.");let n;try{n=yield fetch(l,{credentials:i.sendCookiesInRequests?r.Include:r.SameOrigin})}catch(l){throw new u("JS-AUTH_HELPER-VIT-NE02","Request to jwks endpoint failed.",null!=l?l:"The request sent to get the jwks from the server failed.")}if(200!==n.status||!n.ok)throw new u("JS-AUTH_HELPER-VIT-HE03",`Invalid response status received for jwks request (${n.statusText}).`,yield n.json());const o=(yield this._oidcProviderMetaData()).issuer,{keys:d}=yield n.json(),c=yield this._cryptoHelper.getJWKForTheIdToken(e.split(".")[0],d);return this._cryptoHelper.isValidIdToken(e,c,(yield this._config()).clientID,null!=o?o:"",this._cryptoHelper.decodeIDToken(e).sub,(yield this._config()).clockTolerance,null===(t=(yield this._config()).validateIDTokenIssuer)||void 0===t||t)}))}getAuthenticatedUserInfo(e){var t,l,i,n;const o=this._cryptoHelper.decodeIDToken(e),d=Z.getTenantDomainFromIdTokenPayload(o),c=null!==(t=null==o?void 0:o.username)&&void 0!==t?t:"",a=null!==(l=o.given_name)&&void 0!==l?l:"",s=null!==(i=o.family_name)&&void 0!==i?i:"",r=a&&s?`${a} ${s}`:a||s||"",u=null!==(n=o.preferred_username)&&void 0!==n?n:r;return Object.assign({displayName:u,tenantDomain:d,username:c},Z.filterClaimsFromIDTokenPayload(o))}replaceCustomGrantTemplateTags(e,t){var i;return l(this,void 0,void 0,(function*(){let l="openid";const n=yield this._config(),o=yield this._dataLayer.getSessionData(t);return n.scope&&n.scope.length>0&&(n.scope.includes("openid")||n.scope.push("openid"),l=n.scope.join(" ")),e.replace("{{token}}",o.access_token).replace("{{username}}",this.getAuthenticatedUserInfo(o.id_token).username).replace("{{scope}}",l).replace("{{clientID}}",n.clientID).replace("{{clientSecret}}",null!==(i=n.clientSecret)&&void 0!==i?i:"")}))}clearUserSessionData(e){return l(this,void 0,void 0,(function*(){yield this._dataLayer.removeTemporaryData(e),yield this._dataLayer.removeSessionData(e)}))}handleTokenResponse(e,t){return l(this,void 0,void 0,(function*(){if(200!==e.status||!e.ok)throw new u("JS-AUTH_HELPER-HTR-NE01",`Invalid response status received for token request (${e.statusText}).`,yield e.json());const i=yield e.json();if(i.created_at=(new Date).getTime(),(yield this._config()).validateIDToken)return this.validateIdToken(i.id_token).then((()=>l(this,void 0,void 0,(function*(){yield this._dataLayer.setSessionData(i,t);const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return Promise.resolve(e)}))));{const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return yield this._dataLayer.setSessionData(i,t),Promise.resolve(e)}}))}generatePKCEKey(e){var t;return l(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getTemporaryData(e),i=[];Object.keys(l).forEach((e=>{e.startsWith("pkce_code_verifier")&&i.push(e)}));const n=i.sort().pop();return`pkce_code_verifier#${parseInt(null!==(t=null==n?void 0:n.split("#")[1])&&void 0!==t?t:"-1")+1}`}))}}class h{constructor(e){this._cryptoUtils=e}getCodeVerifier(){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.generateRandomBytes(32))}getCodeChallenge(e){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.hashSha256(e))}getJWKForTheIdToken(e,t){const l=JSON.parse(this._cryptoUtils.base64URLDecode(e));for(const e of t)if(l.kid===e.kid)return e;throw new u("JS-CRYPTO_UTIL-GJFTIT-IV01","kid not found.","Failed to find the 'kid' specified in the id_token. 'kid' found in the header : "+l.kid+", Expected values: "+t.map((e=>e.kid)).join(", "))}isValidIdToken(e,t,l,i,o,d,c){return this._cryptoUtils.verifyJwt(e,t,n,l,i,o,d,c).then((e=>e?Promise.resolve(!0):Promise.reject(new u("JS-CRYPTO_HELPER-IVIT-IV01","Invalid ID token.","ID token validation returned false"))))}decodeIDToken(e){try{const t=this._cryptoUtils.base64URLDecode(e.split(".")[1]);return JSON.parse(t)}catch(e){throw new u("JS-CRYPTO_UTIL-DIT-IV01","Decoding ID token failed.",e)}}}class m{constructor(e,t){this._cryptoUtils=t,this._cryptoHelper=new h(t),this._authenticationHelper=new b(e,this._cryptoHelper),this._dataLayer=e,this._config=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURLParams(e,t){var i,n,o;return l(this,void 0,void 0,(function*(){const l=yield this._config(),d=new Map;d.set("response_type","code"),d.set("client_id",l.clientID),l.clientSecret&&l.clientSecret.trim().length>0&&d.set("client_secret",l.clientSecret);let c="openid";l.scope&&l.scope.length>0&&(l.scope.includes("openid")||l.scope.push("openid"),c=l.scope.join(" ")),d.set("scope",c),d.set("redirect_uri",l.signInRedirectURL),l.responseMode&&d.set("response_mode",l.responseMode);const a=yield this._authenticationHelper.generatePKCEKey(t);if(l.enablePKCE){const e=null===(i=this._cryptoHelper)||void 0===i?void 0:i.getCodeVerifier(),l=null===(n=this._cryptoHelper)||void 0===n?void 0:n.getCodeChallenge(e);yield this._dataLayer.setTemporaryDataParameter(a,e,t),d.set("code_challenge_method","S256"),d.set("code_challenge",l)}l.prompt&&d.set("prompt",l.prompt);const s=e;if(s)for(const[e,t]of Object.entries(s))""!=e&&""!=t&&"state"!==e&&d.set(e,t.toString());return d.set("state",Z.generateStateParamForRequestCorrelation(a,s?null===(o=s.state)||void 0===o?void 0:o.toString():"")),d}))}getAuthorizationURL(e,t){return l(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint");if(!l||0===l.trim().length)throw new u("JS-AUTH_CORE-GAU-NF01","No authorization endpoint found.","No authorization endpoint was found in the OIDC provider meta data from the well-known endpoint or the authorization endpoint passed to the SDK is empty.");const i=new URL(l),n=yield this.getAuthorizationURLParams(e,t);for(const[e,t]of n.entries())i.searchParams.append(e,t);return i.toString()}))}requestAccessToken(e,t,i,n,o){return l(this,void 0,void 0,(function*(){const l=(yield this._oidcProviderMetaData()).token_endpoint,d=yield this._config();if(!l||0===l.trim().length)throw new u("JS-AUTH_CORE-RAT1-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");t&&(yield this._dataLayer.setSessionDataParameter("session_state",t,n));const c=new URLSearchParams;c.set("client_id",d.clientID),d.clientSecret&&d.clientSecret.trim().length>0&&c.set("client_secret",d.clientSecret);const a=e;let s;c.set("code",a),c.set("grant_type","authorization_code"),c.set("redirect_uri",d.signInRedirectURL),(null==o?void 0:o.params)&&Object.entries(o.params).forEach((([e,t])=>{c.append(e,t)})),d.enablePKCE&&(c.set("code_verifier",`${yield this._dataLayer.getTemporaryDataParameter(Z.extractPKCEKeyFromStateParam(i),n)}`),yield this._dataLayer.removeTemporaryDataParameter(Z.extractPKCEKeyFromStateParam(i),n));try{s=yield fetch(l,{body:c,credentials:d.sendCookiesInRequests?r.Include:r.SameOrigin,headers:new Headers(Z.getTokenRequestHeaders()),method:"POST"})}catch(l){throw new u("JS-AUTH_CORE-RAT1-NE02","Requesting access token failed",null!=l?l:"The request to get the access token from the server failed.")}if(!s.ok)throw new u("JS-AUTH_CORE-RAT1-HE03",`Requesting access token failed with ${s.statusText}`,yield s.json());return yield this._authenticationHelper.handleTokenResponse(s,n)}))}refreshAccessToken(e){return l(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,l=yield this._config(),i=yield this._dataLayer.getSessionData(e);if(!i.refresh_token)throw new u("JS-AUTH_CORE-RAT2-NF01","No refresh token found.","There was no refresh token found. Asgardeo doesn't return a refresh token if the refresh token grant is not enabled.");if(!t||0===t.trim().length)throw new u("JS-AUTH_CORE-RAT2-NF02","No refresh token endpoint found.","No refresh token endpoint was in the OIDC provider meta data returned by the well-known endpoint or the refresh token endpoint passed to the SDK is empty.");const n=[];let o;n.push(`client_id=${l.clientID}`),n.push(`refresh_token=${i.refresh_token}`),n.push("grant_type=refresh_token"),l.clientSecret&&l.clientSecret.trim().length>0&&n.push(`client_secret=${l.clientSecret}`);try{o=yield fetch(t,{body:n.join("&"),credentials:l.sendCookiesInRequests?r.Include:r.SameOrigin,headers:new Headers(Z.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new u("JS-AUTH_CORE-RAT2-NR03","Refresh access token request failed.",null!=t?t:"The request to refresh the access token failed.")}if(!o.ok)throw new u("JS-AUTH_CORE-RAT2-HE04",`Refreshing access token failed with ${o.statusText}`,yield o.json());return this._authenticationHelper.handleTokenResponse(o,e)}))}revokeAccessToken(e){return l(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,l=yield this._config();if(!t||0===t.trim().length)throw new u("JS-AUTH_CORE-RAT3-NF01","No revoke access token endpoint found.","No revoke access token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the revoke access token endpoint passed to the SDK is empty.");const i=[];let n;i.push(`client_id=${l.clientID}`),i.push(`token=${(yield this._dataLayer.getSessionData(e)).access_token}`),i.push("token_type_hint=access_token");try{n=yield fetch(t,{body:i.join("&"),credentials:l.sendCookiesInRequests?r.Include:r.SameOrigin,headers:new Headers(Z.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new u("JS-AUTH_CORE-RAT3-NE02","The request to revoke access token failed.",null!=t?t:"The request sent to revoke the access token failed.")}if(200!==n.status||!n.ok)throw new u("JS-AUTH_CORE-RAT3-HE03",`Invalid response status received for revoke access token request (${n.statusText}).`,yield n.json());return this._authenticationHelper.clearUserSessionData(e),Promise.resolve(n)}))}requestCustomGrant(e,t){return l(this,void 0,void 0,(function*(){const i=yield this._oidcProviderMetaData(),n=yield this._config();let o;if(o=e.tokenEndpoint&&0!==e.tokenEndpoint.trim().length?e.tokenEndpoint:i.token_endpoint,!o||0===o.trim().length)throw new u("JS-AUTH_CORE-RCG-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");const d=yield Promise.all(Object.entries(e.data).map((([e,i])=>l(this,void 0,void 0,(function*(){const l=yield this._authenticationHelper.replaceCustomGrantTemplateTags(i,t);return`${e}=${l}`})))));let c=Object.assign({},Z.getTokenRequestHeaders());e.attachToken&&(c=Object.assign(Object.assign({},c),{Authorization:`Bearer ${(yield this._dataLayer.getSessionData(t)).access_token}`}));const a={body:d.join("&"),credentials:n.sendCookiesInRequests?r.Include:r.SameOrigin,headers:new Headers(c),method:"POST"};let s;try{s=yield fetch(o,a)}catch(e){throw new u("JS-AUTH_CORE-RCG-NE02","The custom grant request failed.",null!=e?e:"The request sent to get the custom grant failed.")}if(200!==s.status||!s.ok)throw new u("JS-AUTH_CORE-RCG-HE03",`Invalid response status received for the custom grant request. (${s.statusText})`,yield s.json());return e.returnsSession?this._authenticationHelper.handleTokenResponse(s,t):Promise.resolve(yield s.json())}))}getBasicUserInfo(e){return l(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(e),l=this._authenticationHelper.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let i={allowedScopes:t.scope,sessionState:t.session_state};return Object.keys(l).forEach((e=>{void 0!==l[e]&&""!==l[e]&&null!==l[e]||delete l[e]})),i=Object.assign(Object.assign({},i),l),i}))}getDecodedIDToken(e){return l(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData(e)).id_token;return this._cryptoHelper.decodeIDToken(t)}))}getCryptoHelper(){return l(this,void 0,void 0,(function*(){return this._cryptoHelper}))}getIDToken(e){return l(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData(e)).id_token}))}getOIDCProviderMetaData(e){return l(this,void 0,void 0,(function*(){const t=yield this._config();if(!e&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve();const l=t.wellKnownEndpoint;if(l){let e;try{if(e=yield fetch(l),200!==e.status||!e.ok)throw new Error}catch(t){throw new u("JS-AUTH_CORE-GOPMD-HE01","Invalid well-known response","The well known endpoint response has been failed with an error.")}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(yield e.json())),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}if(t.baseUrl){try{yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsByBaseURL())}catch(t){throw new u("JS-AUTH_CORE-GOPMD-IV02","Resolving endpoints failed.",null!=t?t:"Resolving endpoints by base url failed.")}return yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsExplicitly()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}))}getOIDCServiceEndpoints(){var e,t,i,n,o,d,c,a,s,r;return l(this,void 0,void 0,(function*(){const l=yield this._oidcProviderMetaData();return{authorizationEndpoint:null!==(e=l.authorization_endpoint)&&void 0!==e?e:"",checkSessionIframe:null!==(t=l.check_session_iframe)&&void 0!==t?t:"",endSessionEndpoint:null!==(i=l.end_session_endpoint)&&void 0!==i?i:"",introspectionEndpoint:null!==(n=l.introspection_endpoint)&&void 0!==n?n:"",issuer:null!==(o=l.issuer)&&void 0!==o?o:"",jwksUri:null!==(d=l.jwks_uri)&&void 0!==d?d:"",registrationEndpoint:null!==(c=l.registration_endpoint)&&void 0!==c?c:"",revocationEndpoint:null!==(a=l.revocation_endpoint)&&void 0!==a?a:"",tokenEndpoint:null!==(s=l.token_endpoint)&&void 0!==s?s:"",userinfoEndpoint:null!==(r=l.userinfo_endpoint)&&void 0!==r?r:""}}))}getSignOutURL(e){var t,i,n;return l(this,void 0,void 0,(function*(){const l=null===(t=yield this._oidcProviderMetaData())||void 0===t?void 0:t.end_session_endpoint,o=yield this._config();if(!l||0===l.trim().length)throw new u("JS-AUTH_CORE-GSOU-NF01","Sign-out endpoint not found.","No sign-out endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the sign-out endpoint passed to the SDK is empty.");const d=null!==(i=null==o?void 0:o.signOutRedirectURL)&&void 0!==i?i:null==o?void 0:o.signInRedirectURL;if(!d||0===d.trim().length)throw new u("JS-AUTH_CORE-GSOU-NF03","No sign-out redirect URL found.","The sign-out redirect URL cannot be found or the URL passed to the SDK is empty. No sign-in redirect URL has been found either. ");const c=new URLSearchParams;if(c.set("post_logout_redirect_uri",d),o.sendIdTokenInLogoutRequest){const t=null===(n=yield this._dataLayer.getSessionData(e))||void 0===n?void 0:n.id_token;if(!t||0===t.trim().length)throw new u("JS-AUTH_CORE-GSOU-NF02","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");c.set("id_token_hint",t)}else c.set("client_id",o.clientID);return c.set("state","sign_out_success"),`${l}?${c.toString()}`}))}clearUserSessionData(e){return l(this,void 0,void 0,(function*(){yield this._authenticationHelper.clearUserSessionData(e)}))}getAccessToken(e){var t;return l(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.access_token}))}getCreatedAt(e){var t;return l(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.created_at}))}getExpiresIn(e){var t;return l(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.expires_in}))}isAuthenticated(e){return l(this,void 0,void 0,(function*(){const t=Boolean(yield this.getAccessToken(e)),l=yield this.getCreatedAt(e),i=yield this.getExpiresIn(e);if(!i)return!1;const n=1e3*parseInt(i),o=(new Date).getTime();return t&&l+n>o}))}getPKCECode(e,t){return l(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter(Z.extractPKCEKeyFromStateParam(e),t)}))}setPKCECode(e,t,i){return l(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter(Z.extractPKCEKeyFromStateParam(t),e,i)}))}updateConfig(e){return l(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(e),yield this.getOIDCProviderMetaData(!0)}))}}class p{constructor(e,t){this._id=e,this._store=t}setDataInBulk(e,t){var i;return l(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign(Object.assign({},n),t),d=JSON.stringify(o);yield this._store.setData(e,d)}))}setValue(e,t,i){var n;return l(this,void 0,void 0,(function*(){const l=null!==(n=yield this._store.getData(e))&&void 0!==n?n:null,o=l&&JSON.parse(l),d=Object.assign(Object.assign({},o),{[t]:i}),c=JSON.stringify(d);yield this._store.setData(e,c)}))}removeValue(e,t){var i;return l(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign({},n);delete o[t];const d=JSON.stringify(o);yield this._store.setData(e,d)}))}_resolveKey(e,t){return t?`${e}-${this._id}-${t}`:`${e}-${this._id}`}isLocalStorageAvailable(){try{const e="__ASGARDEO_AUTH_CORE_LOCAL_STORAGE_TEST__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}}setConfigData(t){return l(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(e.Stores.ConfigData),t)}))}setOIDCProviderMetaData(t){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}setTemporaryData(t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.TemporaryData,i),t)}))}setSessionData(t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.SessionData,i),t)}))}setCustomData(e,t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e,i),t)}))}getConfigData(){var t;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.ConfigData)))&&void 0!==t?t:null)}))}getOIDCProviderMetaData(){var t;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData)))&&void 0!==t?t:null)}))}getTemporaryData(t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,t)))&&void 0!==i?i:null)}))}getSessionData(t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.SessionData,t)))&&void 0!==i?i:null)}))}getCustomData(e,t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e,t)))&&void 0!==i?i:null)}))}setSessionStatus(e){this.isLocalStorageAvailable()&&localStorage.setItem("asgardeo-session-active",e)}getSessionStatus(){var e;return this.isLocalStorageAvailable()&&null!==(e=localStorage.getItem("asgardeo-session-active"))&&void 0!==e?e:""}removeSessionStatus(){this.isLocalStorageAvailable()&&localStorage.removeItem("asgardeo-session-active")}removeConfigData(){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.ConfigData))}))}removeOIDCProviderMetaData(){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.OIDCProviderMetaData))}))}removeTemporaryData(t){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.TemporaryData,t))}))}removeSessionData(t){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.SessionData,t))}))}getConfigDataParameter(t){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.ConfigData));return l&&JSON.parse(l)[t]}))}getOIDCProviderMetaDataParameter(t){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData));return l&&JSON.parse(l)[t]}))}getTemporaryDataParameter(t,i){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,i));return l&&JSON.parse(l)[t]}))}getSessionDataParameter(t,i){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.SessionData,i));return l&&JSON.parse(l)[t]}))}setConfigDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.ConfigData),t,i)}))}setOIDCProviderMetaDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t,i)}))}setTemporaryDataParameter(t,i,n){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.TemporaryData,n),t,i)}))}setSessionDataParameter(t,i,n){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.SessionData,n),t,i)}))}removeConfigDataParameter(t){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.ConfigData),t)}))}removeOIDCProviderMetaDataParameter(t){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}removeTemporaryDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.TemporaryData,i),t)}))}removeSessionDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.SessionData,i),t)}))}}const G={clockTolerance:300,enablePKCE:!0,responseMode:e.ResponseMode.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0,validateIDTokenIssuer:!0};class X{constructor(){}initialize(e,t,i,n){var o,d,c;return l(this,void 0,void 0,(function*(){const l=e.clientID;X._instanceID?X._instanceID+=1:X._instanceID=0,n&&(X._instanceID=n),this._dataLayer=new p(l?`instance_${X._instanceID}-${l}`:`instance_${X._instanceID}`,t),this._authenticationCore=new m(this._dataLayer,i),X._authenticationCore=new m(this._dataLayer,i),yield this._dataLayer.setConfigData(Object.assign(Object.assign(Object.assign({},G),e),{scope:[...null!==(o=G.scope)&&void 0!==o?o:[],...null!==(c=null===(d=e.scope)||void 0===d?void 0:d.filter((e=>{var t;return!(null===(t=null==G?void 0:G.scope)||void 0===t?void 0:t.includes(e))})))&&void 0!==c?c:[]]}))}))}getDataLayer(){return this._dataLayer}getInstanceID(){return X._instanceID}getAuthorizationURLParams(e,t){return l(this,void 0,void 0,(function*(){const l=Object.assign({},e);return null==l||delete l.forceInit,(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.getAuthorizationURLParams(l,t):this._authenticationCore.getOIDCProviderMetaData(null==e?void 0:e.forceInit).then((()=>this._authenticationCore.getAuthorizationURLParams(l,t)))}))}getAuthorizationURL(e,t){return l(this,void 0,void 0,(function*(){const l=Object.assign({},e);return null==l||delete l.forceInit,(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.getAuthorizationURL(l,t):this._authenticationCore.getOIDCProviderMetaData(null==e?void 0:e.forceInit).then((()=>this._authenticationCore.getAuthorizationURL(l,t)))}))}requestAccessToken(e,t,i,n,o){return l(this,void 0,void 0,(function*(){return(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.requestAccessToken(e,t,i,n,o):this._authenticationCore.getOIDCProviderMetaData(!1).then((()=>this._authenticationCore.requestAccessToken(e,t,i,n,o)))}))}getSignOutURL(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getSignOutURL(e)}))}getOIDCServiceEndpoints(){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getOIDCServiceEndpoints()}))}getDecodedIDToken(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getDecodedIDToken(e)}))}getIDToken(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getIDToken(e)}))}getBasicUserInfo(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getBasicUserInfo(e)}))}getCryptoHelper(){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getCryptoHelper()}))}revokeAccessToken(e){return this._authenticationCore.revokeAccessToken(e)}refreshAccessToken(e){return this._authenticationCore.refreshAccessToken(e)}getAccessToken(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getAccessToken(e)}))}requestCustomGrant(e,t){return this._authenticationCore.requestCustomGrant(e,t)}isAuthenticated(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.isAuthenticated(e)}))}getPKCECode(e,t){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getPKCECode(e,t)}))}setPKCECode(e,t,i){return l(this,void 0,void 0,(function*(){yield this._authenticationCore.setPKCECode(e,t,i)}))}static isSignOutSuccessful(e){const t=new URL(e),l=t.searchParams.get("state"),i=Boolean(t.searchParams.get("error"));return!!l&&"sign_out_success"===l&&!i}static didSignOutFail(e){const t=new URL(e),l=t.searchParams.get("state"),i=Boolean(t.searchParams.get("error"));return!!l&&"sign_out_success"===l&&i}updateConfig(e){return l(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(e)}))}static clearUserSessionData(e){return l(this,void 0,void 0,(function*(){yield this._authenticationCore.clearUserSessionData(e)}))}}function y(e,t,l){var i=void 0===t?null:t,n=function(e,t){var l=atob(e);if(t){for(var i=new Uint8Array(l.length),n=0,o=l.length;n<o;++n)i[n]=l.charCodeAt(n);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return l}(e,void 0!==l&&l),o=n.indexOf("\n",10)+1,d=n.substring(o)+(i?"//# sourceMappingURL="+i:""),c=new Blob([d],{type:"application/javascript"});return URL.createObjectURL(c)}var W,V,I,R,S=(W="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQsbixyKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXtjKHIubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7YyhyLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIG4/dDpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfWMoKHI9ci5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX1mdW5jdGlvbiB0KGUsdCxuLHIpe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e2Moci5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKHIudGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9Yygocj1yLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfXZhciBuOyFmdW5jdGlvbihlKXtlLmZvcm1Qb3N0PSJmb3JtX3Bvc3QiLGUucXVlcnk9InF1ZXJ5IixlLmRpcmVjdD0iZGlyZWN0In0obnx8KG49e30pKTt2YXIgcjshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KHJ8fChyPXt9KSk7Y29uc3QgaT0icmVmcmVzaF90b2tlbl90aW1lciIsbz1bIlJTMjU2IiwiUlM1MTIiLCJSUzM4NCIsIlBTMjU2Il0scz0ic2lnbl9vdXRfdXJsIjt2YXIgYTshZnVuY3Rpb24oZSl7ZS5JbmNsdWRlPSJpbmNsdWRlIixlLlNhbWVPcmlnaW49InNhbWUtb3JpZ2luIixlLk9taXQ9Im9taXQifShhfHwoYT17fSkpO2NsYXNzIGN7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMubWVzc2FnZT1uLHRoaXMubmFtZT10LHRoaXMuY29kZT1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgdXtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtudWxsPT10fHxkZWxldGUgdC5pc3MsbnVsbD09dHx8ZGVsZXRlIHQuYXVkLG51bGw9PXR8fGRlbGV0ZSB0LmV4cCxudWxsPT10fHxkZWxldGUgdC5pYXQsbnVsbD09dHx8ZGVsZXRlIHQuYWNyLG51bGw9PXR8fGRlbGV0ZSB0LmFtcixudWxsPT10fHxkZWxldGUgdC5henAsbnVsbD09dHx8ZGVsZXRlIHQuYXV0aF90aW1lLG51bGw9PXR8fGRlbGV0ZSB0Lm5vbmNlLG51bGw9PXR8fGRlbGV0ZSB0LmNfaGFzaCxudWxsPT10fHxkZWxldGUgdC5hdF9oYXNoLG51bGw9PXR8fGRlbGV0ZSB0Lm5iZixudWxsPT10fHxkZWxldGUgdC5pc2ssbnVsbD09dHx8ZGVsZXRlIHQuc2lkO2NvbnN0IG49e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKChbZSx0XSk9Pntjb25zdCByPWUuc3BsaXQoIl8iKS5tYXAoKChlLHQpPT4wPT09dD9lOltlWzBdLnRvVXBwZXJDYXNlKCksLi4uZS5zbGljZSgxKV0uam9pbigiIikpKS5qb2luKCIiKTtuW3JdPXR9KSksbn1zdGF0aWMgZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpe3JldHVybntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24iLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifX1zdGF0aWMgZ2VuZXJhdGVTdGF0ZVBhcmFtRm9yUmVxdWVzdENvcnJlbGF0aW9uKGUsdCl7Y29uc3Qgbj1wYXJzZUludChlLnNwbGl0KCIjIilbMV0pO3JldHVybiB0P2Ake3R9X3JlcXVlc3RfJHtufWA6YHJlcXVlc3RfJHtufWB9c3RhdGljIGV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSl7cmV0dXJuYHBrY2VfY29kZV92ZXJpZmllciMke3BhcnNlSW50KGUuc3BsaXQoInJlcXVlc3RfIilbMV0pfWB9fXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkPShlLHQ9IkAiKT0+e2NvbnN0IG49ZS5zdWIuc3BsaXQodCk7cmV0dXJuIG4ubGVuZ3RoPjI/bltuLmxlbmd0aC0xXToiIn07Y2xhc3MgbHtjb25zdHJ1Y3RvcihlLG4pe3RoaXMuX2RhdGFMYXllcj1lLHRoaXMuX2NvbmZpZz0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpfSkpLHRoaXMuX2NyeXB0b0hlbHBlcj1ufXJlc29sdmVFbmRwb2ludHMoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXt9LG49eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIG4uZW5kcG9pbnRzJiZPYmplY3Qua2V5cyhuLmVuZHBvaW50cykuZm9yRWFjaCgoZT0+e2NvbnN0IHI9ZS5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTt0W3JdPShudWxsPT1uP3ZvaWQgMDpuLmVuZHBvaW50cyk/bi5lbmRwb2ludHNbZV06IiJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfSkpfXJlc29sdmVFbmRwb2ludHNFeHBsaWNpdGx5KCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXt9LHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXQuZW5kcG9pbnRzfHwhWyJhdXRob3JpemF0aW9uX2VuZHBvaW50IiwiZW5kX3Nlc3Npb25fZW5kcG9pbnQiLCJqd2tzX3VyaSIsImNoZWNrX3Nlc3Npb25faWZyYW1lIiwicmV2b2NhdGlvbl9lbmRwb2ludCIsInRva2VuX2VuZHBvaW50IiwiaXNzdWVyIiwidXNlcmluZm9fZW5kcG9pbnQiXS5ldmVyeSgoZT0+ISF0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLnNvbWUoKHQ9PnQucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk9PT1lKSkpKSl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItUkVFLU5GMDEiLCJSZXF1aXJlZCBlbmRwb2ludHMgbWlzc2luZyIsIlNvbWUgb3IgYWxsIG9mIHRoZSByZXF1aXJlZCBlbmRwb2ludHMgYXJlIG1pc3NpbmcgaW4gdGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIGBlbmRwb2ludHNgIGF0dHJpYnV0ZSBvZiB0aGVgQXV0aENvbmZpZ2Agb2JqZWN0LiIpO3JldHVybiB0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKG49Pntjb25zdCByPW4ucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtyXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW25dOiIifSkpLE9iamVjdC5hc3NpZ24oe30sZSl9KSl9cmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpLG49dC5iYXNlVXJsO2lmKCFuKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUl9SRUJPLU5GMDEiLCJCYXNlIFVSTCBub3QgZGVmaW5lZC4iLCJCYXNlIFVSTCBpcyBub3QgZGVmaW5lZCBpbiBBdXRoQ2xpZW50IGNvbmZpZy4iKTt0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKG49Pntjb25zdCByPW4ucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtyXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW25dOiIifSkpO2NvbnN0IHI9e2F1dGhvcml6YXRpb25fZW5kcG9pbnQ6YCR7bn0vb2F1dGgyL2F1dGhvcml6ZWAsZW5kX3Nlc3Npb25fZW5kcG9pbnQ6YCR7bn0vb2lkYy9sb2dvdXRgLGlzc3VlcjpgJHtufS9vYXV0aDIvdG9rZW5gLGp3a3NfdXJpOmAke259L29hdXRoMi9qd2tzYCxjaGVja19zZXNzaW9uX2lmcmFtZTpgJHtufS9vaWRjL2NoZWNrc2Vzc2lvbmAscmV2b2NhdGlvbl9lbmRwb2ludDpgJHtufS9vYXV0aDIvcmV2b2tlYCx0b2tlbl9lbmRwb2ludDpgJHtufS9vYXV0aDIvdG9rZW5gLHVzZXJpbmZvX2VuZHBvaW50OmAke259L29hdXRoMi91c2VyaW5mb2B9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sciksZSl9KSl9dmFsaWRhdGVJZFRva2VuKGUpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCkpLmp3a3NfdXJpLHI9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTX0FVVEhfSEVMUEVSLVZJVC1ORjAxIiwiSldLUyBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gSldLUyBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBKV0tTIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2xldCBpO3RyeXtpPXlpZWxkIGZldGNoKHQse2NyZWRlbnRpYWxzOnIuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW59KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULU5FMDIiLCJSZXF1ZXN0IHRvIGp3a3MgZW5kcG9pbnQgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIpfWlmKDIwMCE9PWkuc3RhdHVzfHwhaS5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgandrcyByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO2NvbnN0IG89KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLmlzc3Vlcix7a2V5czpzfT15aWVsZCBpLmpzb24oKSx1PXlpZWxkIHRoaXMuX2NyeXB0b0hlbHBlci5nZXRKV0tGb3JUaGVJZFRva2VuKGUuc3BsaXQoIi4iKVswXSxzKTtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmlzVmFsaWRJZFRva2VuKGUsdSwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsaWVudElELG51bGwhPW8/bzoiIix0aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKS5zdWIsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbG9ja1RvbGVyYW5jZSxudWxsPT09KG49KHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW5Jc3N1ZXIpfHx2b2lkIDA9PT1ufHxuKX0pKX1nZXRBdXRoZW50aWNhdGVkVXNlckluZm8oZSl7dmFyIHQsbixyLGk7Y29uc3Qgbz10aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKSxzPXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkKG8pLGE9bnVsbCE9PSh0PW51bGw9PW8/dm9pZCAwOm8udXNlcm5hbWUpJiZ2b2lkIDAhPT10P3Q6IiIsYz1udWxsIT09KG49by5naXZlbl9uYW1lKSYmdm9pZCAwIT09bj9uOiIiLGw9bnVsbCE9PShyPW8uZmFtaWx5X25hbWUpJiZ2b2lkIDAhPT1yP3I6IiIsZD1jJiZsP2Ake2N9ICR7bH1gOmN8fGx8fCIiLGg9bnVsbCE9PShpPW8ucHJlZmVycmVkX3VzZXJuYW1lKSYmdm9pZCAwIT09aT9pOmQ7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2Rpc3BsYXlOYW1lOmgsdGVuYW50RG9tYWluOnMsdXNlcm5hbWU6YX0sdS5maWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQobykpfXJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyhlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IHQ9Im9wZW5pZCI7Y29uc3QgaT15aWVsZCB0aGlzLl9jb25maWcoKSxvPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShuKTtyZXR1cm4gaS5zY29wZSYmaS5zY29wZS5sZW5ndGg+MCYmKGkuc2NvcGUuaW5jbHVkZXMoIm9wZW5pZCIpfHxpLnNjb3BlLnB1c2goIm9wZW5pZCIpLHQ9aS5zY29wZS5qb2luKCIgIikpLGUucmVwbGFjZSgie3t0b2tlbn19IixvLmFjY2Vzc190b2tlbikucmVwbGFjZSgie3t1c2VybmFtZX19Iix0aGlzLmdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhvLmlkX3Rva2VuKS51c2VybmFtZSkucmVwbGFjZSgie3tzY29wZX19Iix0KS5yZXBsYWNlKCJ7e2NsaWVudElEfX0iLGkuY2xpZW50SUQpLnJlcGxhY2UoInt7Y2xpZW50U2VjcmV0fX0iLG51bGwhPT0ocj1pLmNsaWVudFNlY3JldCkmJnZvaWQgMCE9PXI/cjoiIil9KSl9Y2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlVGVtcG9yYXJ5RGF0YShlKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlU2Vzc2lvbkRhdGEoZSl9KSl9aGFuZGxlVG9rZW5SZXNwb25zZShlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoMjAwIT09ZS5zdGF0dXN8fCFlLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUi1IVFItTkUwMSIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0b2tlbiByZXF1ZXN0ICgke2Uuc3RhdHVzVGV4dH0pLmAseWllbGQgZS5qc29uKCkpO2NvbnN0IHI9eWllbGQgZS5qc29uKCk7aWYoci5jcmVhdGVkX2F0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLCh5aWVsZCB0aGlzLl9jb25maWcoKSkudmFsaWRhdGVJRFRva2VuKXJldHVybiB0aGlzLnZhbGlkYXRlSWRUb2tlbihyLmlkX3Rva2VuKS50aGVuKCgoKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShyLG4pO2NvbnN0IGU9e2FjY2Vzc1Rva2VuOnIuYWNjZXNzX3Rva2VuLGNyZWF0ZWRBdDpyLmNyZWF0ZWRfYXQsZXhwaXJlc0luOnIuZXhwaXJlc19pbixpZFRva2VuOnIuaWRfdG9rZW4scmVmcmVzaFRva2VuOnIucmVmcmVzaF90b2tlbixzY29wZTpyLnNjb3BlLHRva2VuVHlwZTpyLnRva2VuX3R5cGV9O3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9KSkpKTt7Y29uc3QgZT17YWNjZXNzVG9rZW46ci5hY2Nlc3NfdG9rZW4sY3JlYXRlZEF0OnIuY3JlYXRlZF9hdCxleHBpcmVzSW46ci5leHBpcmVzX2luLGlkVG9rZW46ci5pZF90b2tlbixyZWZyZXNoVG9rZW46ci5yZWZyZXNoX3Rva2VuLHNjb3BlOnIuc2NvcGUsdG9rZW5UeXBlOnIudG9rZW5fdHlwZX07cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShyLG4pLFByb21pc2UucmVzb2x2ZShlKX19KSl9Z2VuZXJhdGVQS0NFS2V5KGUpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YShlKSxyPVtdO09iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9PntlLnN0YXJ0c1dpdGgoInBrY2VfY29kZV92ZXJpZmllciIpJiZyLnB1c2goZSl9KSk7Y29uc3QgaT1yLnNvcnQoKS5wb3AoKTtyZXR1cm5gcGtjZV9jb2RlX3ZlcmlmaWVyIyR7cGFyc2VJbnQobnVsbCE9PShuPW51bGw9PWk/dm9pZCAwOmkuc3BsaXQoIiMiKVsxXSkmJnZvaWQgMCE9PW4/bjoiLTEiKSsxfWB9KSl9fWNsYXNzIGR7Y29uc3RydWN0b3IoZSl7dGhpcy5fY3J5cHRvVXRpbHM9ZX1nZXRDb2RlVmVyaWZpZXIoKXtyZXR1cm4gdGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRW5jb2RlKHRoaXMuX2NyeXB0b1V0aWxzLmdlbmVyYXRlUmFuZG9tQnl0ZXMoMzIpKX1nZXRDb2RlQ2hhbGxlbmdlKGUpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuaGFzaFNoYTI1NihlKSl9Z2V0SldLRm9yVGhlSWRUb2tlbihlLHQpe2NvbnN0IG49SlNPTi5wYXJzZSh0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxEZWNvZGUoZSkpO2Zvcihjb25zdCBlIG9mIHQpaWYobi5raWQ9PT1lLmtpZClyZXR1cm4gZTt0aHJvdyBuZXcgYygiSlMtQ1JZUFRPX1VUSUwtR0pGVElULUlWMDEiLCJraWQgbm90IGZvdW5kLiIsIkZhaWxlZCB0byBmaW5kIHRoZSAna2lkJyBzcGVjaWZpZWQgaW4gdGhlIGlkX3Rva2VuLiAna2lkJyBmb3VuZCBpbiB0aGUgaGVhZGVyIDogIituLmtpZCsiLCBFeHBlY3RlZCB2YWx1ZXM6ICIrdC5tYXAoKGU9PmUua2lkKSkuam9pbigiLCAiKSl9aXNWYWxpZElkVG9rZW4oZSx0LG4scixpLHMsYSl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLnZlcmlmeUp3dChlLHQsbyxuLHIsaSxzLGEpLnRoZW4oKGU9PmU/UHJvbWlzZS5yZXNvbHZlKCEwKTpQcm9taXNlLnJlamVjdChuZXcgYygiSlMtQ1JZUFRPX0hFTFBFUi1JVklULUlWMDEiLCJJbnZhbGlkIElEIHRva2VuLiIsIklEIHRva2VuIHZhbGlkYXRpb24gcmV0dXJuZWQgZmFsc2UiKSkpKX1kZWNvZGVJRFRva2VuKGUpe3RyeXtjb25zdCB0PXRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlLnNwbGl0KCIuIilbMV0pO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1DUllQVE9fVVRJTC1ESVQtSVYwMSIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19Y2xhc3MgaHtjb25zdHJ1Y3RvcihlLG4pe3RoaXMuX2NyeXB0b1V0aWxzPW4sdGhpcy5fY3J5cHRvSGVscGVyPW5ldyBkKG4pLHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyPW5ldyBsKGUsdGhpcy5fY3J5cHRvSGVscGVyKSx0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbil7dmFyIHIsaSxvO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9jb25maWcoKSxzPW5ldyBNYXA7cy5zZXQoInJlc3BvbnNlX3R5cGUiLCJjb2RlIikscy5zZXQoImNsaWVudF9pZCIsdC5jbGllbnRJRCksdC5jbGllbnRTZWNyZXQmJnQuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmcy5zZXQoImNsaWVudF9zZWNyZXQiLHQuY2xpZW50U2VjcmV0KTtsZXQgYT0ib3BlbmlkIjt0LnNjb3BlJiZ0LnNjb3BlLmxlbmd0aD4wJiYodC5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHQuc2NvcGUucHVzaCgib3BlbmlkIiksYT10LnNjb3BlLmpvaW4oIiAiKSkscy5zZXQoInNjb3BlIixhKSxzLnNldCgicmVkaXJlY3RfdXJpIix0LnNpZ25JblJlZGlyZWN0VVJMKSx0LnJlc3BvbnNlTW9kZSYmcy5zZXQoInJlc3BvbnNlX21vZGUiLHQucmVzcG9uc2VNb2RlKTtjb25zdCBjPXlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmdlbmVyYXRlUEtDRUtleShuKTtpZih0LmVuYWJsZVBLQ0Upe2NvbnN0IGU9bnVsbD09PShyPXRoaXMuX2NyeXB0b0hlbHBlcil8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0Q29kZVZlcmlmaWVyKCksdD1udWxsPT09KGk9dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09aT92b2lkIDA6aS5nZXRDb2RlQ2hhbGxlbmdlKGUpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGMsZSxuKSxzLnNldCgiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwiUzI1NiIpLHMuc2V0KCJjb2RlX2NoYWxsZW5nZSIsdCl9dC5wcm9tcHQmJnMuc2V0KCJwcm9tcHQiLHQucHJvbXB0KTtjb25zdCBsPWU7aWYobClmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKGwpKSIiIT1lJiYiIiE9dCYmInN0YXRlIiE9PWUmJnMuc2V0KGUsdC50b1N0cmluZygpKTtyZXR1cm4gcy5zZXQoInN0YXRlIix1LmdlbmVyYXRlU3RhdGVQYXJhbUZvclJlcXVlc3RDb3JyZWxhdGlvbihjLGw/bnVsbD09PShvPWwuc3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnRvU3RyaW5nKCk6IiIpKSxzfSkpfWdldEF1dGhvcml6YXRpb25VUkwoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iik7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HQVUtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgZm91bmQuIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIGZyb20gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgcj1uZXcgVVJMKHQpLGk9eWllbGQgdGhpcy5nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbik7Zm9yKGNvbnN0W2UsdF1vZiBpLmVudHJpZXMoKSlyLnNlYXJjaFBhcmFtcy5hcHBlbmQoZSx0KTtyZXR1cm4gci50b1N0cmluZygpfSkpfXJlcXVlc3RBY2Nlc3NUb2tlbihlLG4scixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQscz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtTkYwMSIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtuJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhUGFyYW1ldGVyKCJzZXNzaW9uX3N0YXRlIixuLGkpKTtjb25zdCBsPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5zZXQoImNsaWVudF9pZCIscy5jbGllbnRJRCkscy5jbGllbnRTZWNyZXQmJnMuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmbC5zZXQoImNsaWVudF9zZWNyZXQiLHMuY2xpZW50U2VjcmV0KTtjb25zdCBkPWU7bGV0IGg7bC5zZXQoImNvZGUiLGQpLGwuc2V0KCJncmFudF90eXBlIiwiYXV0aG9yaXphdGlvbl9jb2RlIiksbC5zZXQoInJlZGlyZWN0X3VyaSIscy5zaWduSW5SZWRpcmVjdFVSTCksKG51bGw9PW8/dm9pZCAwOm8ucGFyYW1zKSYmT2JqZWN0LmVudHJpZXMoby5wYXJhbXMpLmZvckVhY2goKChbZSx0XSk9PntsLmFwcGVuZChlLHQpfSkpLHMuZW5hYmxlUEtDRSYmKGwuc2V0KCJjb2RlX3ZlcmlmaWVyIixgJHt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0ociksaSl9YCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKHIpLGkpKTt0cnl7aD15aWVsZCBmZXRjaCh0LHtib2R5OmwsY3JlZGVudGlhbHM6cy5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSl9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQxLU5FMDIiLCJSZXF1ZXN0aW5nIGFjY2VzcyB0b2tlbiBmYWlsZWQiLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBhY2Nlc3MgdG9rZW4gZnJvbSB0aGUgc2VydmVyIGZhaWxlZC4iKX1pZighaC5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtSEUwMyIsYFJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCB3aXRoICR7aC5zdGF0dXNUZXh0fWAseWllbGQgaC5qc29uKCkpO3JldHVybiB5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKGgsaSl9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsbj15aWVsZCB0aGlzLl9jb25maWcoKSxyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKTtpZighci5yZWZyZXNoX3Rva2VuKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAxIiwiTm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4iLCJUaGVyZSB3YXMgbm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4gQXNnYXJkZW8gZG9lc24ndCByZXR1cm4gYSByZWZyZXNoIHRva2VuIGlmIHRoZSByZWZyZXNoIHRva2VuIGdyYW50IGlzIG5vdCBlbmFibGVkLiIpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAyIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IHdhcyBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3QgaT1bXTtsZXQgbztpLnB1c2goYGNsaWVudF9pZD0ke24uY2xpZW50SUR9YCksaS5wdXNoKGByZWZyZXNoX3Rva2VuPSR7ci5yZWZyZXNoX3Rva2VufWApLGkucHVzaCgiZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuIiksbi5jbGllbnRTZWNyZXQmJm4uY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmaS5wdXNoKGBjbGllbnRfc2VjcmV0PSR7bi5jbGllbnRTZWNyZXR9YCk7dHJ5e289eWllbGQgZmV0Y2godCx7Ym9keTppLmpvaW4oIiYiKSxjcmVkZW50aWFsczpuLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItTlIwMyIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIpfWlmKCFvLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1IRTA0IixgUmVmcmVzaGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggJHtvLnN0YXR1c1RleHR9YCx5aWVsZCBvLmpzb24oKSk7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UobyxlKX0pKX1yZXZva2VBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLnJldm9jYXRpb25fZW5kcG9pbnQsbj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkYwMSIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IHI9W107bGV0IGk7ci5wdXNoKGBjbGllbnRfaWQ9JHtuLmNsaWVudElEfWApLHIucHVzaChgdG9rZW49JHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5hY2Nlc3NfdG9rZW59YCksci5wdXNoKCJ0b2tlbl90eXBlX2hpbnQ9YWNjZXNzX3Rva2VuIik7dHJ5e2k9eWllbGQgZmV0Y2godCx7Ym9keTpyLmpvaW4oIiYiKSxjcmVkZW50aWFsczpuLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkUwMiIsIlRoZSByZXF1ZXN0IHRvIHJldm9rZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIHJldm9rZSB0aGUgYWNjZXNzIHRva2VuIGZhaWxlZC4iKX1pZigyMDAhPT1pLnN0YXR1c3x8IWkub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQzLUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgcmV2b2tlIGFjY2VzcyB0b2tlbiByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKSxQcm9taXNlLnJlc29sdmUoaSl9KSl9cmVxdWVzdEN1c3RvbUdyYW50KGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCksaT15aWVsZCB0aGlzLl9jb25maWcoKTtsZXQgbztpZihvPWUudG9rZW5FbmRwb2ludCYmMCE9PWUudG9rZW5FbmRwb2ludC50cmltKCkubGVuZ3RoP2UudG9rZW5FbmRwb2ludDpyLnRva2VuX2VuZHBvaW50LCFvfHwwPT09by50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5GMDEiLCJUb2tlbiBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gdG9rZW4gZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgcz15aWVsZCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhlLmRhdGEpLm1hcCgoKFtlLHJdKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKHIsbik7cmV0dXJuYCR7ZX09JHt0fWB9KSkpKSk7bGV0IGw9T2JqZWN0LmFzc2lnbih7fSx1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSk7ZS5hdHRhY2hUb2tlbiYmKGw9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKG4pKS5hY2Nlc3NfdG9rZW59YH0pKTtjb25zdCBkPXtib2R5OnMuam9pbigiJiIpLGNyZWRlbnRpYWxzOmkuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhsKSxtZXRob2Q6IlBPU1QifTtsZXQgaDt0cnl7aD15aWVsZCBmZXRjaChvLGQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5FMDIiLCJUaGUgY3VzdG9tIGdyYW50IHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9ZT9lOiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iKX1pZigyMDAhPT1oLnN0YXR1c3x8IWgub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQ0ctSEUwMyIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0aGUgY3VzdG9tIGdyYW50IHJlcXVlc3QuICgke2guc3RhdHVzVGV4dH0pYCx5aWVsZCBoLmpzb24oKSk7cmV0dXJuIGUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShoLG4pOlByb21pc2UucmVzb2x2ZSh5aWVsZCBoLmpzb24oKSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpLG49dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG51bGw9PXQ/dm9pZCAwOnQuaWRfdG9rZW4pO2xldCByPXthbGxvd2VkU2NvcGVzOnQuc2NvcGUsc2Vzc2lvblN0YXRlOnQuc2Vzc2lvbl9zdGF0ZX07cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGU9Pnt2b2lkIDAhPT1uW2VdJiYiIiE9PW5bZV0mJm51bGwhPT1uW2VdfHxkZWxldGUgbltlXX0pKSxyPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSxuKSxyfSkpfWdldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbjtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4odCl9KSl9Z2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyfSkpfWdldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbn0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWUmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgbj10LndlbGxLbm93bkVuZHBvaW50O2lmKG4pe2xldCBlO3RyeXtpZihlPXlpZWxkIGZldGNoKG4pLDIwMCE9PWUuc3RhdHVzfHwhZS5vayl0aHJvdyBuZXcgRXJyb3J9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HT1BNRC1IRTAxIiwiSW52YWxpZCB3ZWxsLWtub3duIHJlc3BvbnNlIiwiVGhlIHdlbGwga25vd24gZW5kcG9pbnQgcmVzcG9uc2UgaGFzIGJlZW4gZmFpbGVkIHdpdGggYW4gZXJyb3IuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzKHlpZWxkIGUuanNvbigpKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoKX1pZih0LmJhc2VVcmwpe3RyeXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpKX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdPUE1ELUlWMDIiLCJSZXNvbHZpbmcgZW5kcG9pbnRzIGZhaWxlZC4iLG51bGwhPXQ/dDoiUmVzb2x2aW5nIGVuZHBvaW50cyBieSBiYXNlIHVybCBmYWlsZWQuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCl9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSgpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7dmFyIGUsbixyLGksbyxzLGEsYyx1LGw7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCk7cmV0dXJue2F1dGhvcml6YXRpb25FbmRwb2ludDpudWxsIT09KGU9dC5hdXRob3JpemF0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09ZT9lOiIiLGNoZWNrU2Vzc2lvbklmcmFtZTpudWxsIT09KG49dC5jaGVja19zZXNzaW9uX2lmcmFtZSkmJnZvaWQgMCE9PW4/bjoiIixlbmRTZXNzaW9uRW5kcG9pbnQ6bnVsbCE9PShyPXQuZW5kX3Nlc3Npb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1yP3I6IiIsaW50cm9zcGVjdGlvbkVuZHBvaW50Om51bGwhPT0oaT10LmludHJvc3BlY3Rpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1pP2k6IiIsaXNzdWVyOm51bGwhPT0obz10Lmlzc3VlcikmJnZvaWQgMCE9PW8/bzoiIixqd2tzVXJpOm51bGwhPT0ocz10Lmp3a3NfdXJpKSYmdm9pZCAwIT09cz9zOiIiLHJlZ2lzdHJhdGlvbkVuZHBvaW50Om51bGwhPT0oYT10LnJlZ2lzdHJhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWE/YToiIixyZXZvY2F0aW9uRW5kcG9pbnQ6bnVsbCE9PShjPXQucmV2b2NhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWM/YzoiIix0b2tlbkVuZHBvaW50Om51bGwhPT0odT10LnRva2VuX2VuZHBvaW50KSYmdm9pZCAwIT09dT91OiIiLHVzZXJpbmZvRW5kcG9pbnQ6bnVsbCE9PShsPXQudXNlcmluZm9fZW5kcG9pbnQpJiZ2b2lkIDAhPT1sP2w6IiJ9fSkpfWdldFNpZ25PdXRVUkwoZSl7dmFyIG4scixpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsPT09KG49eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZW5kX3Nlc3Npb25fZW5kcG9pbnQsbz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMSIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBzPW51bGwhPT0ocj1udWxsPT1vP3ZvaWQgMDpvLnNpZ25PdXRSZWRpcmVjdFVSTCkmJnZvaWQgMCE9PXI/cjpudWxsPT1vP3ZvaWQgMDpvLnNpZ25JblJlZGlyZWN0VVJMO2lmKCFzfHwwPT09cy50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtR1NPVS1ORjAzIiwiTm8gc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGZvdW5kLiIsIlRoZSBzaWduLW91dCByZWRpcmVjdCBVUkwgY2Fubm90IGJlIGZvdW5kIG9yIHRoZSBVUkwgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIE5vIHNpZ24taW4gcmVkaXJlY3QgVVJMIGhhcyBiZWVuIGZvdW5kIGVpdGhlci4gIik7Y29uc3QgYT1uZXcgVVJMU2VhcmNoUGFyYW1zO2lmKGEuc2V0KCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLHMpLG8uc2VuZElkVG9rZW5JbkxvZ291dFJlcXVlc3Qpe2NvbnN0IHQ9bnVsbD09PShpPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuaWRfdG9rZW47aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7YS5zZXQoImlkX3Rva2VuX2hpbnQiLHQpfWVsc2UgYS5zZXQoImNsaWVudF9pZCIsby5jbGllbnRJRCk7cmV0dXJuIGEuc2V0KCJzdGF0ZSIsInNpZ25fb3V0X3N1Y2Nlc3MiKSxgJHt0fT8ke2EudG9TdHJpbmcoKX1gfSkpfWNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl9KSl9Z2V0QWNjZXNzVG9rZW4oZSl7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uYWNjZXNzX3Rva2VufSkpfWdldENyZWF0ZWRBdChlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jcmVhdGVkX2F0fSkpfWdldEV4cGlyZXNJbihlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5leHBpcmVzX2lufSkpfWlzQXV0aGVudGljYXRlZChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9Qm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKGUpKSxuPXlpZWxkIHRoaXMuZ2V0Q3JlYXRlZEF0KGUpLHI9eWllbGQgdGhpcy5nZXRFeHBpcmVzSW4oZSk7aWYoIXIpcmV0dXJuITE7Y29uc3QgaT0xZTMqcGFyc2VJbnQociksbz0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdCYmbitpPm99KSl9Z2V0UEtDRUNvZGUoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSksbil9KSl9c2V0UEtDRUNvZGUoZSxuLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxlLHIpfSkpfXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKGUpLHlpZWxkIHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApfSkpfX1jbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9zdG9yZT10fXNldERhdGFJbkJ1bGsoZSxuKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCxpPXQmJkpTT04ucGFyc2UodCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSksbikscz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9c2V0VmFsdWUoZSxuLHIpe3ZhciBpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KGk9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PWk/aTpudWxsLG89dCYmSlNPTi5wYXJzZSh0KSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W25dOnJ9KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PXI/cjpudWxsLGk9dCYmSlNPTi5wYXJzZSh0KSxvPU9iamVjdC5hc3NpZ24oe30saSk7ZGVsZXRlIG9bbl07Y29uc3Qgcz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9X3Jlc29sdmVLZXkoZSx0KXtyZXR1cm4gdD9gJHtlfS0ke3RoaXMuX2lkfS0ke3R9YDpgJHtlfS0ke3RoaXMuX2lkfWB9aXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKXt0cnl7Y29uc3QgZT0iX19BU0dBUkRFT19BVVRIX0NPUkVfTE9DQUxfU1RPUkFHRV9URVNUX18iO3JldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLGUpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX1zZXRDb25maWdEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5Db25maWdEYXRhKSxlKX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXNldFRlbXBvcmFyeURhdGEoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSxlKX0pKX1zZXRTZXNzaW9uRGF0YShlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxuKSxlKX0pKX1zZXRDdXN0b21EYXRhKGUsbixyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGUsciksbil9KSl9Z2V0Q29uZmlnRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5UZW1wb3JhcnlEYXRhLGUpKSkmJnZvaWQgMCE9PW4/bjpudWxsKX0pKX1nZXRTZXNzaW9uRGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSkpJiZ2b2lkIDAhPT1uP246bnVsbCl9KSl9Z2V0Q3VzdG9tRGF0YShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShlLG4pKSkmJnZvaWQgMCE9PXI/cjpudWxsKX0pKX1zZXRTZXNzaW9uU3RhdHVzKGUpe3RoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbG9jYWxTdG9yYWdlLnNldEl0ZW0oImFzZ2FyZGVvLXNlc3Npb24tYWN0aXZlIixlKX1nZXRTZXNzaW9uU3RhdHVzKCl7dmFyIGU7cmV0dXJuIHRoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbnVsbCE9PShlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpKSYmdm9pZCAwIT09ZT9lOiIifXJlbW92ZVNlc3Npb25TdGF0dXMoKXt0aGlzLmlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpKX0pKX1yZW1vdmVUZW1wb3JhcnlEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxlKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSl9KSl9Z2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuQ29uZmlnRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuU2Vzc2lvbkRhdGEsbikpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfXNldENvbmZpZ0RhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUsbil9KSl9c2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLG4pfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxpKSxlLG4pfSkpfXNldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUsbixpKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLGkpLGUsbil9KSl9cmVtb3ZlQ29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlRlbXBvcmFyeURhdGEsbiksZSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLG4pLGUpfSkpfX1jb25zdCBwPXtjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6bi5xdWVyeSxzY29wZTpbIm9wZW5pZCJdLHNlbmRDb29raWVzSW5SZXF1ZXN0czohMCx2YWxpZGF0ZUlEVG9rZW46ITAsdmFsaWRhdGVJRFRva2VuSXNzdWVyOiEwfTtjbGFzcyBne2NvbnN0cnVjdG9yKCl7fWluaXRpYWxpemUoZSxuLHIsaSl7dmFyIG8scyxhO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1lLmNsaWVudElEO2cuX2luc3RhbmNlSUQ/Zy5faW5zdGFuY2VJRCs9MTpnLl9pbnN0YW5jZUlEPTAsaSYmKGcuX2luc3RhbmNlSUQ9aSksdGhpcy5fZGF0YUxheWVyPW5ldyBmKHQ/YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH0tJHt0fWA6YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH1gLG4pLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZT1uZXcgaCh0aGlzLl9kYXRhTGF5ZXIsciksZy5fYXV0aGVudGljYXRpb25Db3JlPW5ldyBoKHRoaXMuX2RhdGFMYXllcixyKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSxlKSx7c2NvcGU6Wy4uLm51bGwhPT0obz1wLnNjb3BlKSYmdm9pZCAwIT09bz9vOltdLC4uLm51bGwhPT0oYT1udWxsPT09KHM9ZS5zY29wZSl8fHZvaWQgMD09PXM/dm9pZCAwOnMuZmlsdGVyKChlPT57dmFyIHQ7cmV0dXJuIShudWxsPT09KHQ9bnVsbD09cD92b2lkIDA6cC5zY29wZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuaW5jbHVkZXMoZSkpfSkpKSYmdm9pZCAwIT09YT9hOltdXX0pKX0pKX1nZXREYXRhTGF5ZXIoKXtyZXR1cm4gdGhpcy5fZGF0YUxheWVyfWdldEluc3RhbmNlSUQoKXtyZXR1cm4gZy5faW5zdGFuY2VJRH1nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIG51bGw9PXR8fGRlbGV0ZSB0LmZvcmNlSW5pdCwoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXModCxuKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTFBhcmFtcyh0LG4pKSl9KSl9Z2V0QXV0aG9yaXphdGlvblVSTChlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBudWxsPT10fHxkZWxldGUgdC5mb3JjZUluaXQsKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQsbik6dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENQcm92aWRlck1ldGFEYXRhKG51bGw9PWU/dm9pZCAwOmUuZm9yY2VJbml0KS50aGVuKCgoKT0+dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkwodCxuKSkpfSkpfXJlcXVlc3RBY2Nlc3NUb2tlbihlLG4scixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxuLHIsaSxvKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITEpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEFjY2Vzc1Rva2VuKGUsbixyLGksbykpKX0pKX1nZXRTaWduT3V0VVJMKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRTaWduT3V0VVJMKGUpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSl9Z2V0RGVjb2RlZElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldERlY29kZWRJRFRva2VuKGUpfSkpfWdldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldElEVG9rZW4oZSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QmFzaWNVc2VySW5mbyhlKX0pKX1nZXRDcnlwdG9IZWxwZXIoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0Q3J5cHRvSGVscGVyKCl9KSl9cmV2b2tlQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXZva2VBY2Nlc3NUb2tlbihlKX1yZWZyZXNoQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZWZyZXNoQWNjZXNzVG9rZW4oZSl9Z2V0QWNjZXNzVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEFjY2Vzc1Rva2VuKGUpfSkpfXJlcXVlc3RDdXN0b21HcmFudChlLHQpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEN1c3RvbUdyYW50KGUsdCl9aXNBdXRoZW50aWNhdGVkKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5pc0F1dGhlbnRpY2F0ZWQoZSl9KSl9Z2V0UEtDRUNvZGUoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0UEtDRUNvZGUoZSxuKX0pKX1zZXRQS0NFQ29kZShlLG4scil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuc2V0UEtDRUNvZGUoZSxuLHIpfSkpfXN0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxuPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxyPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIW4mJiJzaWduX291dF9zdWNjZXNzIj09PW4mJiFyfXN0YXRpYyBkaWRTaWduT3V0RmFpbChlKXtjb25zdCB0PW5ldyBVUkwoZSksbj10LnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIikscj1Cb29sZWFuKHQuc2VhcmNoUGFyYW1zLmdldCgiZXJyb3IiKSk7cmV0dXJuISFuJiYic2lnbl9vdXRfc3VjY2VzcyI9PT1uJiZyfXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS51cGRhdGVDb25maWcoZSl9KSl9c3RhdGljIGNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmNsZWFyVXNlclNlc3Npb25EYXRhKGUpfSkpfX1jb25zdCB2PSJpbml0Ijt2YXIgeSxtOyFmdW5jdGlvbihlKXtlLkxvY2FsU3RvcmFnZT0ibG9jYWxTdG9yYWdlIixlLlNlc3Npb25TdG9yYWdlPSJzZXNzaW9uU3RvcmFnZSIsZS5XZWJXb3JrZXI9IndlYldvcmtlciIsZS5Ccm93c2VyTWVtb3J5PSJicm93c2VyTWVtb3J5In0oeXx8KHk9e30pKSxmdW5jdGlvbihlKXtlLlNpZ25Jbj0ic2lnbi1pbiIsZS5TaWduT3V0PSJzaWduLW91dCIsZS5Jbml0aWFsaXplPSJpbml0aWFsaXplIixlLkh0dHBSZXF1ZXN0U3RhcnQ9Imh0dHAtcmVxdWVzdC1zdGFydCIsZS5IdHRwUmVxdWVzdEZpbmlzaD0iaHR0cC1yZXF1ZXN0LWZpbmlzaCIsZS5IdHRwUmVxdWVzdEVycm9yPSJodHRwLXJlcXVlc3QtZXJyb3IiLGUuSHR0cFJlcXVlc3RTdWNjZXNzPSJodHRwLXJlcXVlc3Qtc3VjY2VzcyIsZS5SZXZva2VBY2Nlc3NUb2tlbj0icmV2b2tlLWFjY2Vzcy10b2tlbiIsZS5DdXN0b21HcmFudD0iY3VzdG9tLWdyYW50IixlLlNpZ25PdXRGYWlsZWQ9InNpZ24tb3V0LWZhaWxlZCJ9KG18fChtPXt9KSk7Y29uc3Qgdz0icHJvbXB0Tm9uZVJlcXVlc3RTZW50IixfPSJlcnJvciIsUz0iZXJyb3JfZGVzY3JpcHRpb24iLGI9ImN1c3RvbV9ncmFudF9jb25maWciLGs9IkFjY2VzcyB0b2tlbiBpcyBpbnZhbGlkIjtjbGFzcyBFe2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBnZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpe3JldHVybntibG9iOihudWxsPT1lP3ZvaWQgMDplLmRhdGEpaW5zdGFuY2VvZiBCbG9iP251bGw9PWU/dm9pZCAwOmUuZGF0YTpudWxsLGRhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSxzdWNjZXNzOiEwfX1zdGF0aWMgZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKXtyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS50b0pTT04pJiZkZWxldGUgZS50b0pTT04se2Vycm9yOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMX19fWNsYXNzIFR7Y29uc3RydWN0b3IoKXt9c3RhdGljIHJlbW92ZUF1dGhvcml6YXRpb25Db2RlKCl7Y29uc3QgZT1sb2NhdGlvbi5ocmVmO2hpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLGUucmVwbGFjZSgvXD9jb2RlPS4qJC8sIiIpKX1zdGF0aWMgZ2V0UEtDRShlKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZSkpJiZ2b2lkIDAhPT10P3Q6IiJ9c3RhdGljIHNldFBLQ0UoZSx0KXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGUsdCl9c3RhdGljIHNldFNpZ25PdXRVUkwoZSx0LG4pe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oYCR7c30taW5zdGFuY2VfJHtufS0ke3R9YCxlKX1zdGF0aWMgZ2V0U2lnbk91dFVSTChlLHQpe3ZhciBuO3JldHVybiBudWxsIT09KG49c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShgJHtzfS1pbnN0YW5jZV8ke3R9LSR7ZX1gKSkmJnZvaWQgMCE9PW4/bjoiIn1zdGF0aWMgcmVtb3ZlUEtDRShlKXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGUpfXN0YXRpYyBjYW5Db250aW51ZVNpZ25JbihlLHQpe3JldHVybiEoZSYmIVQuaGFzRXJyb3JJblVSTCgpJiYhVC5oYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwoKSYmIXQpfXN0YXRpYyBpc0luaXRpYWxpemVkU2lsZW50U2lnbkluKCl7cmV0dXJuIFQuaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpfXN0YXRpYyB3YXNTaWduSW5DYWxsZWQoKXtyZXR1cm4hKCFULmhhc0Vycm9ySW5VUkwoKSYmIVQuaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKCl8fHRoaXMuaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpKX1zdGF0aWMgd2FzU2lsZW50U2lnbkluQ2FsbGVkKCl7Y29uc3QgZT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJpbml0aWFsaXplZC1zaWxlbnQtc2lnbi1pbiIpLHQ9ZT9KU09OLnBhcnNlKGUpOm51bGw7cmV0dXJuIEJvb2xlYW4odCl9c3RhdGljIGlzU2lnbk91dFN1Y2Nlc3NmdWwoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKGcuaXNTaWduT3V0U3VjY2Vzc2Z1bCh3aW5kb3cubG9jYXRpb24uaHJlZikpe2NvbnN0IGU9d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXTtyZXR1cm4gaGlzdG9yeS5wdXNoU3RhdGUoe30sZG9jdW1lbnQudGl0bGUsZSkseWllbGQgZy5jbGVhclVzZXJTZXNzaW9uRGF0YSgpLCEwfXJldHVybiExfSkpfXN0YXRpYyBkaWRTaWduT3V0RmFpbCgpe2lmKGcuZGlkU2lnbk91dEZhaWwod2luZG93LmxvY2F0aW9uLmhyZWYpKXtjb25zdCBlPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLHQ9ZS5zZWFyY2hQYXJhbXMuZ2V0KF8pLG49ZS5zZWFyY2hQYXJhbXMuZ2V0KFMpLHI9d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXTtyZXR1cm4gaGlzdG9yeS5wdXNoU3RhdGUoe30sZG9jdW1lbnQudGl0bGUscikse2Rlc2NyaXB0aW9uOm51bGwhPW4/bjoiIixlcnJvcjpudWxsIT10P3Q6IiJ9fXJldHVybiExfXN0YXRpYyBpc1NpbGVudFN0YXRlUHJlc2VudEluVVJMKCl7dmFyIGU7Y29uc3QgdD1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpO3JldHVybiBudWxsIT09KGU9bnVsbD09dD92b2lkIDA6dC5pbmNsdWRlcygic2lnbi1pbi1zaWxlbnRseSIpKSYmdm9pZCAwIT09ZSYmZX1zdGF0aWMgaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKGU9d2luZG93LmxvY2F0aW9uLnNlYXJjaCl7cmV0dXJuL1s/Jl1jb2RlPVteJl0rLy50ZXN0KGUpfXN0YXRpYyBoYXNFcnJvckluVVJMKGU9d2luZG93LmxvY2F0aW9uLmhyZWYpe2NvbnN0IHQ9bmV3IFVSTChlKTtyZXR1cm4hIXQuc2VhcmNoUGFyYW1zLmdldChfKSYmInNpZ25fb3V0X3N1Y2Nlc3MiIT09dC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpfXN0YXRpYyBjYW5TZW5kUHJvbXB0Tm9uZVJlcXVlc3QoKXtjb25zdCBlPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0odyk7cmV0dXJuIShlP0pTT04ucGFyc2UoZSk6bnVsbCl9c3RhdGljIHNldFByb21wdE5vbmVSZXF1ZXN0U2VudChlKXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHcsSlNPTi5zdHJpbmdpZnkoZSkpfXN0YXRpYyB3YWl0VGlsbFBhZ2VSZWRpcmVjdCh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9bnVsbCE9dD90OjNlMzt5aWVsZCBuZXcgUHJvbWlzZSgodD0+c2V0VGltZW91dCh0LDFlMyplKSkpfSkpfX1ULnVudGlsPShlLHQ9NTAwKT0+e2NvbnN0IG49cj0+ZSgpP3IoKTpzZXRUaW1lb3V0KCgoKT0+bihyKSksdCk7cmV0dXJuIG5ldyBQcm9taXNlKG4pfTtjbGFzcyBSe2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9ZSx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCksdGhpcy5fc3BhSGVscGVyPXQsdGhpcy5faW5zdGFuY2VJRD10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRJbnN0YW5jZUlEKCksdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITF9ZW5hYmxlSHR0cEhhbmRsZXIoZSl7KG51bGw9PWU/dm9pZCAwOmUuZW5hYmxlSGFuZGxlcikmJmUuZW5hYmxlSGFuZGxlcigpfWRpc2FibGVIdHRwSGFuZGxlcihlKXsobnVsbD09ZT92b2lkIDA6ZS5kaXNhYmxlSGFuZGxlcikmJmUuZGlzYWJsZUhhbmRsZXIoKX1pbml0aWFsaXplU2Vzc2lvbk1hbmdlcihlLHQsbixyLGkpe3ZhciBvLHMsYTtpLmluaXRpYWxpemUoZS5jbGllbnRJRCxudWxsIT09KG89dC5jaGVja1Nlc3Npb25JZnJhbWUpJiZ2b2lkIDAhPT1vP286IiIsbixudWxsIT09KHM9ZS5jaGVja1Nlc3Npb25JbnRlcnZhbCkmJnZvaWQgMCE9PXM/czozLG51bGwhPT0oYT1lLnNlc3Npb25SZWZyZXNoSW50ZXJ2YWwpJiZ2b2lkIDAhPT1hP2E6MzAwLGUuc2lnbkluUmVkaXJlY3RVUkwscil9cmVxdWVzdEN1c3RvbUdyYW50KHQsbil7dmFyIHIsaSxvO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IHM9ITAsYT0hMTtpZihudWxsPT10P3ZvaWQgMDp0LnRva2VuRW5kcG9pbnQpe3M9ITE7Zm9yKGNvbnN0IGUgb2ZbLi4ubnVsbCE9PShpPW51bGw9PT0ocj15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1pP2k6W10sdC5iYXNlVXJsXSlpZihlJiYobnVsbD09PShvPXQudG9rZW5FbmRwb2ludCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uc3RhcnRzV2l0aChlKSkpe2E9ITA7YnJlYWt9fXJldHVybiB0LnNob3VsZFJlcGxheUFmdGVyUmVmcmVzaCYmdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoYixKU09OLnN0cmluZ2lmeSh0KSksc3x8YT90aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0Q3VzdG9tR3JhbnQodCkudGhlbigocj0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmbih0KSx0LnJldHVybnNTZXNzaW9uPyh0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCkpOnJ9KSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLU1BSU5fVEhSRUFEX0NMSUVOVC1SQ0ctSVYwMSIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIHRva2VuIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpfSkpfWdldEN1c3RvbUdyYW50Q29uZmlnRGF0YSgpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihiKTtyZXR1cm4gZT9KU09OLnBhcnNlKGUpOm51bGx9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dHJ5e3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlZnJlc2hBY2Nlc3NUb2tlbigpO2NvbnN0IGU9eWllbGQgdGhpcy5nZXRDdXN0b21HcmFudENvbmZpZ0RhdGEoKTtyZXR1cm4gZSYmKHlpZWxkIHRoaXMucmVxdWVzdEN1c3RvbUdyYW50KGUsdCkpLHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKX1jYXRjaChlKXtjb25zdCB0PXt0eXBlOiJyZWZyZXNoLWFjY2Vzcy10b2tlbi1lcnJvciJ9O3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCksUHJvbWlzZS5yZWplY3QoZSl9fSkpfXJldHJ5RmFpbGVkUmVxdWVzdHModCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXQuaHR0cENsaWVudCxuPXQucmVxdWVzdENvbmZpZyxyPXQuaXNIdHRwSGFuZGxlckVuYWJsZWQsaT10Lmh0dHBFcnJvckNhbGxiYWNrLG89dC5odHRwRmluaXNoQ2FsbGJhY2s7eWllbGQgVC51bnRpbCgoKCk9PiF0aGlzLl9pc1Rva2VuUmVmcmVzaGluZykpO3RyeXtjb25zdCB0PXlpZWxkIGUucmVxdWVzdChuKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpfWNhdGNoKGUpe3JldHVybiByJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKGUpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdChlKX19KSl9aHR0cFJlcXVlc3QodCxuLHIsaSxvLHMpe3ZhciBhLHU7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgbD0hMTtjb25zdCBkPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7Zm9yKGNvbnN0IGUgb2ZbLi4ubnVsbCE9PShhPXlpZWxkIG51bGw9PWQ/dm9pZCAwOmQucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09YT9hOltdLGQuYmFzZVVybF0paWYoZSYmKG51bGw9PT0odT1udWxsPT1uP3ZvaWQgMDpuLnVybCl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc3RhcnRzV2l0aChlKSkpe2w9ITA7YnJlYWt9cmV0dXJuIGw/dC5yZXF1ZXN0KG4pLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChhPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUsdSxsO2lmKDQwMT09PShudWxsPT09KGU9bnVsbD09YT92b2lkIDA6YS5yZXNwb25zZSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuc3RhdHVzKXx8IShudWxsPT1hP3ZvaWQgMDphLnJlc3BvbnNlKSl7aWYodGhpcy5faXNUb2tlblJlZnJlc2hpbmcpcmV0dXJuIHRoaXMucmV0cnlGYWlsZWRSZXF1ZXN0cyh7ZW5hYmxlUmV0cmlldmluZ1NpZ25PdXRVUkxGcm9tU2Vzc2lvbjpzLGh0dHBDbGllbnQ6dCxodHRwRXJyb3JDYWxsYmFjazppLGh0dHBGaW5pc2hDYWxsYmFjazpvLGlzSHR0cEhhbmRsZXJFbmFibGVkOnIscmVxdWVzdENvbmZpZzpufSk7bGV0IGU7dGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITA7dHJ5e2U9eWllbGQgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4ocyksdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITF9Y2F0Y2goZSl7dGhyb3cgdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITEsciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NvZGU6a30pKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUi1TRTAxIixudWxsIT09KHU9bnVsbD09ZT92b2lkIDA6ZS5uYW1lKSYmdm9pZCAwIT09dT91OiJSZWZyZXNoIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9PShsPW51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSkmJnZvaWQgMCE9PWw/bDoiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmb2xsb3dpbmcgYSA0MDEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiIpfWlmKGUpdHJ5e2NvbnN0IGU9eWllbGQgdC5yZXF1ZXN0KG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9Y2F0Y2goZSl7cmV0dXJuIHImJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLFByb21pc2UucmVqZWN0KGUpfX1yZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShhKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QoYSl9KSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSLUlWMDIiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKX1odHRwUmVxdWVzdEFsbCh0LG4scixpLG8pe3ZhciBzLGEsdTtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2xldCBsPSEwO2NvbnN0IGQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgZSBvZiB0KXtsZXQgdD0hMTtmb3IoY29uc3QgbiBvZlsuLi5udWxsIT09KGE9bnVsbD09PShzPXlpZWxkIGQpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PWE/YTpbXSxkLmJhc2VVcmxdKWlmKG4mJihudWxsPT09KHU9ZS51cmwpfHx2b2lkIDA9PT11P3ZvaWQgMDp1LnN0YXJ0c1dpdGgobikpKXt0PSEwO2JyZWFrfWlmKCF0KXtsPSExO2JyZWFrfX1jb25zdCBoPVtdO2lmKGwpcmV0dXJuIHQuZm9yRWFjaCgoZT0+e2gucHVzaChuLnJlcXVlc3QoZSkpfSkpLChudWxsPT1uP3ZvaWQgMDpuLmFsbCkmJm4uYWxsKGgpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKCh0PT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIHMsYSx1O2lmKDQwMT09PShudWxsPT09KHM9bnVsbD09dD92b2lkIDA6dC5yZXNwb25zZSl8fHZvaWQgMD09PXM/dm9pZCAwOnMuc3RhdHVzKXx8IShudWxsPT10P3ZvaWQgMDp0LnJlc3BvbnNlKSl7bGV0IHM7dHJ5e3M9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Y2F0Y2goZSl7dGhyb3cgciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NvZGU6a30pKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUkEtU0UwMSIsbnVsbCE9PShhPW51bGw9PWU/dm9pZCAwOmUubmFtZSkmJnZvaWQgMCE9PWE/YToiUmVmcmVzaCB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPT0odT1udWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UpJiZ2b2lkIDAhPT11P3U6IkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZm9sbG93aW5nIGEgNDAxIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4iKX1pZihzKXJldHVybiBuLmFsbCYmbi5hbGwoaCkudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QodCl9KSkpKX1yZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QodCl9KSkpKTt0aHJvdyBuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSQS1JVjAyIiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKX0pKX1yZXF1ZXN0QWNjZXNzVG9rZW4odCxuLHIsaSxvLHMpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgYT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2lmKGEuc3RvcmFnZT09PXkuQnJvd3Nlck1lbW9yeSYmYS5lbmFibGVQS0NFJiZuKXtjb25zdCBlPVQuZ2V0UEtDRSh1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0obikpO3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnNldFBLQ0VDb2RlKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxlKX1lbHNlIGEuc3RvcmFnZT09PXkuV2ViV29ya2VyJiZpJiYoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuc2V0UEtDRUNvZGUoaSxudWxsIT1vP286IiIpKTtyZXR1cm4gdD90aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0QWNjZXNzVG9rZW4odCxudWxsIT1uP246IiIsbnVsbCE9bz9vOiIiLHZvaWQgMCxzKS50aGVuKCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLnN0b3JhZ2UhPT15LldlYldvcmtlcj8oVC5zZXRTaWduT3V0VVJMKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldFNpZ25PdXRVUkwoKSxhLmNsaWVudElELHRoaXMuX2luc3RhbmNlSUQpLHRoaXMuX3NwYUhlbHBlciYmKHRoaXMuX3NwYUhlbHBlci5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSx0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSksciYmImZ1bmN0aW9uIj09dHlwZW9mIHImJmEuZW5hYmxlT0lEQ1Nlc3Npb25NYW5hZ2VtZW50JiZyKCkpOnRoaXMuX3NwYUhlbHBlciYmdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1SQVQxLU5GMDEiLCJObyBhdXRob3JpemF0aW9uIGNvZGUuIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlIHdhcyBmb3VuZC4iKSl9KSl9dHJ5U2lnbkluU2lsZW50bHkodCxuLHIsaSxvKXt2YXIgcztyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKFQuaXNJbml0aWFsaXplZFNpbGVudFNpZ25JbigpKXJldHVybiB5aWVsZCByLnJlY2VpdmVQcm9tcHROb25lUmVzcG9uc2UoKSxQcm9taXNlLnJlc29sdmUoe2FsbG93ZWRTY29wZXM6IiIsZGlzcGxheU5hbWU6IiIsZW1haWw6IiIsc2Vzc2lvblN0YXRlOiIiLHN1YjoiIix0ZW5hbnREb21haW46IiIsdXNlcm5hbWU6IiJ9KTtjb25zdCBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJycElGcmFtZSIpLGM9bnVsbD09PShzPW51bGw9PWE/dm9pZCAwOmEuY29udGVudERvY3VtZW50KXx8dm9pZCAwPT09cz92b2lkIDA6cy5nZXRFbGVtZW50QnlJZCgicHJvbXB0Tm9uZUlGcmFtZSIpO3RyeXtjb25zdCBlPXlpZWxkIHQoaSk7Yy5zcmM9ZX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9cmV0dXJuIG5ldyBQcm9taXNlKCgodCxyKT0+e2NvbnN0IGk9c2V0VGltZW91dCgoKCk9Pnt0KCExKX0pLDFlNCkscz1hPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUsYyx1LGw7Y29uc3QgZD1hLmRhdGE7ImNoZWNrX3Nlc3Npb25fc2lnbmVkX291dCI9PShudWxsPT1kP3ZvaWQgMDpkLnR5cGUpJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpLGNsZWFyVGltZW91dChpKSx0KCExKSksImNoZWNrX3Nlc3Npb25fc2lnbmVkX2luIj09KG51bGw9PWQ/dm9pZCAwOmQudHlwZSkmJihudWxsPT09KGU9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jb2RlKSYmbihudWxsPT09KGM9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5jb2RlLG51bGw9PT0odT1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT11P3ZvaWQgMDp1LnNlc3Npb25TdGF0ZSxudWxsPT09KGw9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zdGF0ZSxvKS50aGVuKChlPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpLHQoZSl9KSkuY2F0Y2goKGU9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscykscihlKX0pKS5maW5hbGx5KCgoKT0+e2NsZWFyVGltZW91dChpKX0pKX0pKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KSl9KSl9aGFuZGxlU2lnbkluKHQsbixyKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtpZih5aWVsZCB0KCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7YWxsb3dlZFNjb3BlczoiIixkaXNwbGF5TmFtZToiIixlbWFpbDoiIixzZXNzaW9uU3RhdGU6IiIsc3ViOiIiLHRlbmFudERvbWFpbjoiIix1c2VybmFtZToiIn0pO2lmKGUuc3RvcmFnZSE9PXkuV2ViV29ya2VyJiYoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCkpKXJldHVybiB0aGlzLl9zcGFIZWxwZXIuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksZS5lbmFibGVPSURDU2Vzc2lvbk1hbmFnZW1lbnQmJm4oKSxQcm9taXNlLnJlc29sdmUoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpKTtjb25zdCBpPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXyksbz1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFMpO2lmKGkpe2NvbnN0IGU9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7dGhyb3cgZS5zZWFyY2hQYXJhbXMuZGVsZXRlKF8pLGUuc2VhcmNoUGFyYW1zLmRlbGV0ZShTKSxoaXN0b3J5LnB1c2hTdGF0ZShudWxsLGRvY3VtZW50LnRpdGxlLGUudG9TdHJpbmcoKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1TSS1TRTAxIixpLG51bGwhPW8/bzoiIil9aWYoZS5zdG9yYWdlPT09eS5XZWJXb3JrZXImJnIpe2NvbnN0IGU9eWllbGQgcigpO2lmKGUpcmV0dXJuIGV9fSkpfWF0dGFjaFRva2VuVG9SZXF1ZXN0Q29uZmlnKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT1PYmplY3QuYXNzaWduKHthdHRhY2hUb2tlbjohMH0sdCk7ZS5hdHRhY2hUb2tlbiYmKGUuc2hvdWxkQXR0YWNoSURQQWNjZXNzVG9rZW4/dC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt5aWVsZCB0aGlzLmdldElEUEFjY2Vzc1Rva2VuKCl9YH0pOnQuaGVhZGVycz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5oZWFkZXJzKSx7QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7eWllbGQgdGhpcy5nZXRBY2Nlc3NUb2tlbigpfWB9KSl9KSl9Z2V0QmFzaWNVc2VySW5mbygpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKX0pKX1nZXREZWNvZGVkSURUb2tlbigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERlY29kZWRJRFRva2VuKCl9KSl9Z2V0RGVjb2RlZElEUElEVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREZWNvZGVkSURUb2tlbigpfSkpfWdldENyeXB0b0hlbHBlcigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldENyeXB0b0hlbHBlcigpfSkpfWdldElEVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRJRFRva2VuKCl9KSl9Z2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfWdldEFjY2Vzc1Rva2VuKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QWNjZXNzVG9rZW4oKX0pKX1nZXRJRFBBY2Nlc3NUb2tlbigpe3ZhciB0O3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGw9PT0odD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuYWNjZXNzX3Rva2VufSkpfWdldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9aXNBdXRoZW50aWNhdGVkKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCl9KSl9fWNsYXNzIEF7Y29uc3RydWN0b3IoZSl7dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9ZSx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCl9cmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0KXt2YXIgbixyO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoIShudWxsIT09KHI9bnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnBlcmlvZGljVG9rZW5SZWZyZXNoKSYmdm9pZCAwIT09ciYmcikpcmV0dXJuO2NvbnN0IG89eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7aWYoby5yZWZyZXNoX3Rva2VuKXtjb25zdCBuPXBhcnNlSW50KG8uZXhwaXJlc19pbikscj1zZXRUaW1lb3V0KCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHQucmVmcmVzaEFjY2Vzc1Rva2VuKCl9KSkpLDFlMyoobjw9MTA/bjpuLTEwKSk7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoaSxKU09OLnN0cmluZ2lmeShyKSl9fSkpfWdldFJlZnJlc2hUaW1lb3V0VGltZXIoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpKSk/SlNPTi5wYXJzZSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpKSk6LTF9KSl9Y2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYodClyZXR1cm4gdm9pZCBjbGVhclRpbWVvdXQodCk7Y29uc3QgZT15aWVsZCB0aGlzLmdldFJlZnJlc2hUaW1lb3V0VGltZXIoKTstMSE9PWUmJmNsZWFyVGltZW91dChlKX0pKX19dmFyIEM9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBEKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gUChlKXtpZihlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4sci5nZXQ/cjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVtuXX19KX0pKSx0fXZhciBJPXtleHBvcnRzOnt9fSxPPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxyPTA7cjxuLmxlbmd0aDtyKyspbltyXT1hcmd1bWVudHNbcl07cmV0dXJuIGUuYXBwbHkodCxuKX19LFU9TyxMPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gSChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBNKGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIGooZSl7cmV0dXJuIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PUwuY2FsbChlKX1mdW5jdGlvbiBxKGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlfWZ1bmN0aW9uIE4oZSl7aWYoIltvYmplY3QgT2JqZWN0XSIhPT1MLmNhbGwoZSkpcmV0dXJuITE7dmFyIHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09dHx8dD09PU9iamVjdC5wcm90b3R5cGV9ZnVuY3Rpb24geChlKXtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09TC5jYWxsKGUpfWZ1bmN0aW9uIEsoZSx0KXtpZihudWxsIT1lKWlmKCJvYmplY3QiIT10eXBlb2YgZSYmKGU9W2VdKSxIKGUpKWZvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0LmNhbGwobnVsbCxlW25dLG4sZSk7ZWxzZSBmb3IodmFyIGkgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmdC5jYWxsKG51bGwsZVtpXSxpLGUpfXZhciBCPXtpc0FycmF5OkgsaXNBcnJheUJ1ZmZlcjpqLGlzQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmIU0oZSkmJm51bGwhPT1lLmNvbnN0cnVjdG9yJiYhTShlLmNvbnN0cnVjdG9yKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9LGlzRm9ybURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRm9ybURhdGFdIj09PUwuY2FsbChlKX0saXNBcnJheUJ1ZmZlclZpZXc6ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyhlKTplJiZlLmJ1ZmZlciYmaihlLmJ1ZmZlcil9LGlzU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfSxpc09iamVjdDpxLGlzUGxhaW5PYmplY3Q6Tixpc1VuZGVmaW5lZDpNLGlzRGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1MLmNhbGwoZSl9LGlzRmlsZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBGaWxlXSI9PT1MLmNhbGwoZSl9LGlzQmxvYjpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBCbG9iXSI9PT1MLmNhbGwoZSl9LGlzRnVuY3Rpb246eCxpc1N0cmVhbTpmdW5jdGlvbihlKXtyZXR1cm4gcShlKSYmeChlLnBpcGUpfSxpc1VSTFNlYXJjaFBhcmFtczpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBVUkxTZWFyY2hQYXJhbXNdIj09PUwuY2FsbChlKX0saXNTdGFuZGFyZEJyb3dzZXJFbnY6ZnVuY3Rpb24oKXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuYXZpZ2F0b3J8fCJSZWFjdE5hdGl2ZSIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5hdGl2ZVNjcmlwdCIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5TIiE9PW5hdmlnYXRvci5wcm9kdWN0KSYmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KX0sZm9yRWFjaDpLLG1lcmdlOmZ1bmN0aW9uIGUoKXt2YXIgdD17fTtmdW5jdGlvbiBuKG4scil7Tih0W3JdKSYmTihuKT90W3JdPWUodFtyXSxuKTpOKG4pP3Rbcl09ZSh7fSxuKTpIKG4pP3Rbcl09bi5zbGljZSgpOnRbcl09bn1mb3IodmFyIHI9MCxpPWFyZ3VtZW50cy5sZW5ndGg7cjxpO3IrKylLKGFyZ3VtZW50c1tyXSxuKTtyZXR1cm4gdH0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSyh0LChmdW5jdGlvbih0LHIpe2Vbcl09biYmImZ1bmN0aW9uIj09dHlwZW9mIHQ/VSh0LG4pOnR9KSksZX0sdHJpbTpmdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSxzdHJpcEJPTTpmdW5jdGlvbihlKXtyZXR1cm4gNjUyNzk9PT1lLmNoYXJDb2RlQXQoMCkmJihlPWUuc2xpY2UoMSkpLGV9fSxKPUI7ZnVuY3Rpb24gRihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKS5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKX12YXIgJD1mdW5jdGlvbihlLHQsbil7aWYoIXQpcmV0dXJuIGU7dmFyIHI7aWYobilyPW4odCk7ZWxzZSBpZihKLmlzVVJMU2VhcmNoUGFyYW1zKHQpKXI9dC50b1N0cmluZygpO2Vsc2V7dmFyIGk9W107Si5mb3JFYWNoKHQsKGZ1bmN0aW9uKGUsdCl7bnVsbCE9ZSYmKEouaXNBcnJheShlKT90Kz0iW10iOmU9W2VdLEouZm9yRWFjaChlLChmdW5jdGlvbihlKXtKLmlzRGF0ZShlKT9lPWUudG9JU09TdHJpbmcoKTpKLmlzT2JqZWN0KGUpJiYoZT1KU09OLnN0cmluZ2lmeShlKSksaS5wdXNoKEYodCkrIj0iK0YoZSkpfSkpKX0pKSxyPWkuam9pbigiJiIpfWlmKHIpe3ZhciBvPWUuaW5kZXhPZigiIyIpOy0xIT09byYmKGU9ZS5zbGljZSgwLG8pKSxlKz0oLTE9PT1lLmluZGV4T2YoIj8iKT8iPyI6IiYiKStyfXJldHVybiBlfSxXPUI7ZnVuY3Rpb24geigpe3RoaXMuaGFuZGxlcnM9W119ei5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOiEhbiYmbi5zeW5jaHJvbm91cyxydW5XaGVuOm4/bi5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSx6LnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0sei5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtXLmZvckVhY2godGhpcy5oYW5kbGVycywoZnVuY3Rpb24odCl7bnVsbCE9PXQmJmUodCl9KSl9O3ZhciBZPXosVj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2Z1bmN0aW9uIEcoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBYKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgWj1HLFE9WDtmdW5jdGlvbiBlZShlKXtpZihaPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChaPT09R3x8IVopJiZzZXRUaW1lb3V0KXJldHVybiBaPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gWihlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gWi5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gWi5jYWxsKHRoaXMsZSwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiBWLnNldFRpbWVvdXQmJihaPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBWLmNsZWFyVGltZW91dCYmKFE9Y2xlYXJUaW1lb3V0KTt2YXIgdGUsbmU9W10scmU9ITEsaWU9LTE7ZnVuY3Rpb24gb2UoKXtyZSYmdGUmJihyZT0hMSx0ZS5sZW5ndGg/bmU9dGUuY29uY2F0KG5lKTppZT0tMSxuZS5sZW5ndGgmJnNlKCkpfWZ1bmN0aW9uIHNlKCl7aWYoIXJlKXt2YXIgZT1lZShvZSk7cmU9ITA7Zm9yKHZhciB0PW5lLmxlbmd0aDt0Oyl7Zm9yKHRlPW5lLG5lPVtdOysraWU8dDspdGUmJnRlW2llXS5ydW4oKTtpZT0tMSx0PW5lLmxlbmd0aH10ZT1udWxsLHJlPSExLGZ1bmN0aW9uKGUpe2lmKFE9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoUT09PVh8fCFRKSYmY2xlYXJUaW1lb3V0KXJldHVybiBRPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoZSk7dHJ5e1EoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBRLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gUS5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIGFlKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9YWUucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O2Z1bmN0aW9uIGNlKCl7fXZhciB1ZT1jZSxsZT1jZSxkZT1jZSxoZT1jZSxmZT1jZSxwZT1jZSxnZT1jZTt2YXIgdmU9Vi5wZXJmb3JtYW5jZXx8e30seWU9dmUubm93fHx2ZS5tb3pOb3d8fHZlLm1zTm93fHx2ZS5vTm93fHx2ZS53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciBtZT1uZXcgRGF0ZTt2YXIgd2U9e25leHRUaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07bmUucHVzaChuZXcgYWUoZSx0KSksMSE9PW5lLmxlbmd0aHx8cmV8fGVlKHNlKX0sdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjp1ZSxhZGRMaXN0ZW5lcjpsZSxvbmNlOmRlLG9mZjpoZSxyZW1vdmVMaXN0ZW5lcjpmZSxyZW1vdmVBbGxMaXN0ZW5lcnM6cGUsZW1pdDpnZSxiaW5kaW5nOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9LjAwMSp5ZS5jYWxsKHZlKSxuPU1hdGguZmxvb3IodCkscj1NYXRoLmZsb29yKHQlMSoxZTkpO3JldHVybiBlJiYobi09ZVswXSwoci09ZVsxXSk8MCYmKG4tLSxyKz0xZTkpKSxbbixyXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1tZSkvMWUzfX0sX2U9d2UsU2U9QixiZT1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBlLmNvbmZpZz10LG4mJihlLmNvZGU9biksZS5yZXF1ZXN0PXIsZS5yZXNwb25zZT1pLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sa2U9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9LEVlPWJlLFRlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89bmV3IEVycm9yKGUpO3JldHVybiBFZShvLHQsbixyLGkpfSxSZT1UZSxBZT1CLENlPUFlLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/e3dyaXRlOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgcz1bXTtzLnB1c2goZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHQpKSxBZS5pc051bWJlcihuKSYmcy5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUobikudG9HTVRTdHJpbmcoKSksQWUuaXNTdHJpbmcocikmJnMucHVzaCgicGF0aD0iK3IpLEFlLmlzU3RyaW5nKGkpJiZzLnB1c2goImRvbWFpbj0iK2kpLCEwPT09byYmcy5wdXNoKCJzZWN1cmUiKSxkb2N1bWVudC5jb29raWU9cy5qb2luKCI7ICIpfSxyZWFkOmZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnw7XFxzKikoIitlKyIpPShbXjtdKikiKSk7cmV0dXJuIHQ/ZGVjb2RlVVJJQ29tcG9uZW50KHRbM10pOm51bGx9LHJlbW92ZTpmdW5jdGlvbihlKXt0aGlzLndyaXRlKGUsIiIsRGF0ZS5ub3coKS04NjRlNSl9fTp7d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX0sRGU9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sUGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sSWU9QixPZT1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLFVlPUIsTGU9VWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlLHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiByKGUpe3ZhciByPWU7cmV0dXJuIHQmJihuLnNldEF0dHJpYnV0ZSgiaHJlZiIscikscj1uLmhyZWYpLG4uc2V0QXR0cmlidXRlKCJocmVmIixyKSx7aHJlZjpuLmhyZWYscHJvdG9jb2w6bi5wcm90b2NvbD9uLnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDpuLmhvc3Qsc2VhcmNoOm4uc2VhcmNoP24uc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6bi5oYXNoP24uaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOm4uaG9zdG5hbWUscG9ydDpuLnBvcnQscGF0aG5hbWU6Ii8iPT09bi5wYXRobmFtZS5jaGFyQXQoMCk/bi5wYXRobmFtZToiLyIrbi5wYXRobmFtZX19cmV0dXJuIGU9cih3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24odCl7dmFyIG49VWUuaXNTdHJpbmcodCk/cih0KTp0O3JldHVybiBuLnByb3RvY29sPT09ZS5wcm90b2NvbCYmbi5ob3N0PT09ZS5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiEwfTtmdW5jdGlvbiBIZShlKXt0aGlzLm1lc3NhZ2U9ZX1IZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sSGUucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIE1lPUhlLGplPUIscWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4uY29uZmlnLnZhbGlkYXRlU3RhdHVzO24uc3RhdHVzJiZyJiYhcihuLnN0YXR1cyk/dChSZSgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLG4uY29uZmlnLG51bGwsbi5yZXF1ZXN0LG4pKTplKG4pfSxOZT1DZSx4ZT0kLEtlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJiFEZSh0KT9QZShlLHQpOnR9LEJlPWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPXt9O3JldHVybiBlPyhJZS5mb3JFYWNoKGUuc3BsaXQoIlxuIiksKGZ1bmN0aW9uKGUpe2lmKHI9ZS5pbmRleE9mKCI6IiksdD1JZS50cmltKGUuc3Vic3RyKDAscikpLnRvTG93ZXJDYXNlKCksbj1JZS50cmltKGUuc3Vic3RyKHIrMSkpLHQpe2lmKGlbdF0mJk9lLmluZGV4T2YodCk+PTApcmV0dXJuO2lbdF09InNldC1jb29raWUiPT09dD8oaVt0XT9pW3RdOltdKS5jb25jYXQoW25dKTppW3RdP2lbdF0rIiwgIituOm59fSkpLGkpOml9LEplPUxlLEZlPVRlLCRlPWtlLFdlPU1lLHplPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXt2YXIgcixpPWUuZGF0YSxvPWUuaGVhZGVycyxzPWUucmVzcG9uc2VUeXBlO2Z1bmN0aW9uIGEoKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKHIpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIscil9amUuaXNGb3JtRGF0YShpKSYmZGVsZXRlIG9bIkNvbnRlbnQtVHlwZSJdO3ZhciBjPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciB1PWUuYXV0aC51c2VybmFtZXx8IiIsbD1lLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUuYXV0aC5wYXNzd29yZCkpOiIiO28uQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKHUrIjoiK2wpfXZhciBkPUtlKGUuYmFzZVVSTCxlLnVybCk7ZnVuY3Rpb24gaCgpe2lmKGMpe3ZhciByPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gYz9CZShjLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLGk9e2RhdGE6cyYmInRleHQiIT09cyYmImpzb24iIT09cz9jLnJlc3BvbnNlOmMucmVzcG9uc2VUZXh0LHN0YXR1czpjLnN0YXR1cyxzdGF0dXNUZXh0OmMuc3RhdHVzVGV4dCxoZWFkZXJzOnIsY29uZmlnOmUscmVxdWVzdDpjfTtxZSgoZnVuY3Rpb24oZSl7dChlKSxhKCl9KSwoZnVuY3Rpb24oZSl7bihlKSxhKCl9KSxpKSxjPW51bGx9fWlmKGMub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLHhlKGQsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksYy50aW1lb3V0PWUudGltZW91dCwib25sb2FkZW5kImluIGM/Yy5vbmxvYWRlbmQ9aDpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MmJjQ9PT1jLnJlYWR5U3RhdGUmJigwIT09Yy5zdGF0dXN8fGMucmVzcG9uc2VVUkwmJjA9PT1jLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6IikpJiZzZXRUaW1lb3V0KGgpfSxjLm9uYWJvcnQ9ZnVuY3Rpb24oKXtjJiYobihGZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLGMpKSxjPW51bGwpfSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXtuKEZlKCJOZXR3b3JrIEVycm9yIixlLG51bGwsYykpLGM9bnVsbH0sYy5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgdD1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIscj1lLnRyYW5zaXRpb25hbHx8JGU7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYodD1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLG4oRmUodCxlLHIuY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIixjKSksYz1udWxsfSxqZS5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgZj0oZS53aXRoQ3JlZGVudGlhbHN8fEplKGQpKSYmZS54c3JmQ29va2llTmFtZT9OZS5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDtmJiYob1tlLnhzcmZIZWFkZXJOYW1lXT1mKX0ic2V0UmVxdWVzdEhlYWRlciJpbiBjJiZqZS5mb3JFYWNoKG8sKGZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09aSYmImNvbnRlbnQtdHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/ZGVsZXRlIG9bdF06Yy5zZXRSZXF1ZXN0SGVhZGVyKHQsZSl9KSksamUuaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwoYy53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscykscyYmImpzb24iIT09cyYmKGMucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3MmJmMuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzJiZjLnVwbG9hZCYmYy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKHI9ZnVuY3Rpb24oZSl7YyYmKG4oIWV8fGUmJmUudHlwZT9uZXcgV2UoImNhbmNlbGVkIik6ZSksYy5hYm9ydCgpLGM9bnVsbCl9LGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKHIpLGUuc2lnbmFsJiYoZS5zaWduYWwuYWJvcnRlZD9yKCk6ZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHIpKSksaXx8KGk9bnVsbCksYy5zZW5kKGkpfSkpfSxZZT1CLFZlPWZ1bmN0aW9uKGUsdCl7U2UuZm9yRWFjaChlLChmdW5jdGlvbihuLHIpe3IhPT10JiZyLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPW4sZGVsZXRlIGVbcl0pfSkpfSxHZT1iZSxYZT17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIFplKGUsdCl7IVllLmlzVW5kZWZpbmVkKGUpJiZZZS5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIgUWUsZXQ9e3RyYW5zaXRpb25hbDprZSxhZGFwdGVyOigoInVuZGVmaW5lZCIhPXR5cGVvZiBYTUxIdHRwUmVxdWVzdHx8dm9pZCAwIT09X2UmJiJbb2JqZWN0IHByb2Nlc3NdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChfZSkpJiYoUWU9emUpLFFlKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe3JldHVybiBWZSh0LCJBY2NlcHQiKSxWZSh0LCJDb250ZW50LVR5cGUiKSxZZS5pc0Zvcm1EYXRhKGUpfHxZZS5pc0FycmF5QnVmZmVyKGUpfHxZZS5pc0J1ZmZlcihlKXx8WWUuaXNTdHJlYW0oZSl8fFllLmlzRmlsZShlKXx8WWUuaXNCbG9iKGUpP2U6WWUuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6WWUuaXNVUkxTZWFyY2hQYXJhbXMoZSk/KFplKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpZZS5pc09iamVjdChlKXx8dCYmImFwcGxpY2F0aW9uL2pzb24iPT09dFsiQ29udGVudC1UeXBlIl0/KFplKHQsImFwcGxpY2F0aW9uL2pzb24iKSxmdW5jdGlvbihlLHQsbil7aWYoWWUuaXNTdHJpbmcoZSkpdHJ5e3JldHVybih0fHxKU09OLnBhcnNlKShlKSxZZS50cmltKGUpfWNhdGNoKGUpe2lmKCJTeW50YXhFcnJvciIhPT1lLm5hbWUpdGhyb3cgZX1yZXR1cm4obnx8SlNPTi5zdHJpbmdpZnkpKGUpfShlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRyYW5zaXRpb25hbHx8ZXQudHJhbnNpdGlvbmFsLG49dCYmdC5zaWxlbnRKU09OUGFyc2luZyxyPXQmJnQuZm9yY2VkSlNPTlBhcnNpbmcsaT0hbiYmImpzb24iPT09dGhpcy5yZXNwb25zZVR5cGU7aWYoaXx8ciYmWWUuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChlKXtpZihpKXtpZigiU3ludGF4RXJyb3IiPT09ZS5uYW1lKXRocm93IEdlKGUsdGhpcywiRV9KU09OX1BBUlNFIik7dGhyb3cgZX19cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9fX07WWUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSwoZnVuY3Rpb24oZSl7ZXQuaGVhZGVyc1tlXT17fX0pKSxZZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe2V0LmhlYWRlcnNbZV09WWUubWVyZ2UoWGUpfSkpO3ZhciB0dD1ldCxudD1CLHJ0PXR0LGl0PWZ1bmN0aW9uKGUpe3JldHVybiEoIWV8fCFlLl9fQ0FOQ0VMX18pfSxvdD1CLHN0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzfHxydDtyZXR1cm4gbnQuZm9yRWFjaChuLChmdW5jdGlvbihuKXtlPW4uY2FsbChyLGUsdCl9KSksZX0sYXQ9aXQsY3Q9dHQsdXQ9TWU7ZnVuY3Rpb24gbHQoZSl7aWYoZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksZS5zaWduYWwmJmUuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IHV0KCJjYW5jZWxlZCIpfXZhciBkdD1CLGh0PWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgbj17fTtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGR0LmlzUGxhaW5PYmplY3QoZSkmJmR0LmlzUGxhaW5PYmplY3QodCk/ZHQubWVyZ2UoZSx0KTpkdC5pc1BsYWluT2JqZWN0KHQpP2R0Lm1lcmdlKHt9LHQpOmR0LmlzQXJyYXkodCk/dC5zbGljZSgpOnR9ZnVuY3Rpb24gaShuKXtyZXR1cm4gZHQuaXNVbmRlZmluZWQodFtuXSk/ZHQuaXNVbmRlZmluZWQoZVtuXSk/dm9pZCAwOnIodm9pZCAwLGVbbl0pOnIoZVtuXSx0W25dKX1mdW5jdGlvbiBvKGUpe2lmKCFkdC5pc1VuZGVmaW5lZCh0W2VdKSlyZXR1cm4gcih2b2lkIDAsdFtlXSl9ZnVuY3Rpb24gcyhuKXtyZXR1cm4gZHQuaXNVbmRlZmluZWQodFtuXSk/ZHQuaXNVbmRlZmluZWQoZVtuXSk/dm9pZCAwOnIodm9pZCAwLGVbbl0pOnIodm9pZCAwLHRbbl0pfWZ1bmN0aW9uIGEobil7cmV0dXJuIG4gaW4gdD9yKGVbbl0sdFtuXSk6biBpbiBlP3Iodm9pZCAwLGVbbl0pOnZvaWQgMH12YXIgYz17dXJsOm8sbWV0aG9kOm8sZGF0YTpvLGJhc2VVUkw6cyx0cmFuc2Zvcm1SZXF1ZXN0OnMsdHJhbnNmb3JtUmVzcG9uc2U6cyxwYXJhbXNTZXJpYWxpemVyOnMsdGltZW91dDpzLHRpbWVvdXRNZXNzYWdlOnMsd2l0aENyZWRlbnRpYWxzOnMsYWRhcHRlcjpzLHJlc3BvbnNlVHlwZTpzLHhzcmZDb29raWVOYW1lOnMseHNyZkhlYWRlck5hbWU6cyxvblVwbG9hZFByb2dyZXNzOnMsb25Eb3dubG9hZFByb2dyZXNzOnMsZGVjb21wcmVzczpzLG1heENvbnRlbnRMZW5ndGg6cyxtYXhCb2R5TGVuZ3RoOnMsdHJhbnNwb3J0OnMsaHR0cEFnZW50OnMsaHR0cHNBZ2VudDpzLGNhbmNlbFRva2VuOnMsc29ja2V0UGF0aDpzLHJlc3BvbnNlRW5jb2Rpbmc6cyx2YWxpZGF0ZVN0YXR1czphfTtyZXR1cm4gZHQuZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLChmdW5jdGlvbihlKXt2YXIgdD1jW2VdfHxpLHI9dChlKTtkdC5pc1VuZGVmaW5lZChyKSYmdCE9PWF8fChuW2VdPXIpfSkpLG59LGZ0PSIwLjI2LjEiLHB0PWZ0LGd0PXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXtndFtlXT1mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PT1lfHwiYSIrKHQ8MT8ibiAiOiIgIikrZX19KSk7dmFyIHZ0PXt9O2d0LnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe3JldHVybiJbQXhpb3MgdiIrcHQrIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitlKyInIit0KyhuPyIuICIrbjoiIil9cmV0dXJuIGZ1bmN0aW9uKG4saSxvKXtpZighMT09PWUpdGhyb3cgbmV3IEVycm9yKHIoaSwiIGhhcyBiZWVuIHJlbW92ZWQiKyh0PyIgaW4gIit0OiIiKSkpO3JldHVybiB0JiYhdnRbaV0mJih2dFtpXT0hMCxjb25zb2xlLndhcm4ocihpLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLCFlfHxlKG4saSxvKX19O3ZhciB5dD17YXNzZXJ0T3B0aW9uczpmdW5jdGlvbihlLHQsbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtmb3IodmFyIHI9T2JqZWN0LmtleXMoZSksaT1yLmxlbmd0aDtpLS0gPjA7KXt2YXIgbz1yW2ldLHM9dFtvXTtpZihzKXt2YXIgYT1lW29dLGM9dm9pZCAwPT09YXx8cyhhLG8sZSk7aWYoITAhPT1jKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbiAiK28rIiBtdXN0IGJlICIrYyl9ZWxzZSBpZighMCE9PW4pdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fSx2YWxpZGF0b3JzOmd0fSxtdD1CLHd0PSQsX3Q9WSxTdD1mdW5jdGlvbihlKXtyZXR1cm4gbHQoZSksZS5oZWFkZXJzPWUuaGVhZGVyc3x8e30sZS5kYXRhPXN0LmNhbGwoZSxlLmRhdGEsZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVxdWVzdCksZS5oZWFkZXJzPW90Lm1lcmdlKGUuaGVhZGVycy5jb21tb258fHt9LGUuaGVhZGVyc1tlLm1ldGhvZF18fHt9LGUuaGVhZGVycyksb3QuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSwoZnVuY3Rpb24odCl7ZGVsZXRlIGUuaGVhZGVyc1t0XX0pKSwoZS5hZGFwdGVyfHxjdC5hZGFwdGVyKShlKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gbHQoZSksdC5kYXRhPXN0LmNhbGwoZSx0LmRhdGEsdC5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIGF0KHQpfHwobHQoZSksdCYmdC5yZXNwb25zZSYmKHQucmVzcG9uc2UuZGF0YT1zdC5jYWxsKGUsdC5yZXNwb25zZS5kYXRhLHQucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KHQpfSkpfSxidD1odCxrdD15dCxFdD1rdC52YWxpZGF0b3JzO2Z1bmN0aW9uIFR0KGUpe3RoaXMuZGVmYXVsdHM9ZSx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgX3QscmVzcG9uc2U6bmV3IF90fX1UdC5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZT8odD10fHx7fSkudXJsPWU6dD1lfHx7fSwodD1idCh0aGlzLmRlZmF1bHRzLHQpKS5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBuPXQudHJhbnNpdGlvbmFsO3ZvaWQgMCE9PW4mJmt0LmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6RXQudHJhbnNpdGlvbmFsKEV0LmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOkV0LnRyYW5zaXRpb25hbChFdC5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOkV0LnRyYW5zaXRpb25hbChFdC5ib29sZWFuKX0sITEpO3ZhciByPVtdLGk9ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZS5ydW5XaGVuJiYhMT09PWUucnVuV2hlbih0KXx8KGk9aSYmZS5zeW5jaHJvbm91cyxyLnVuc2hpZnQoZS5mdWxmaWxsZWQsZS5yZWplY3RlZCkpfSkpO3ZhciBvLHM9W107aWYodGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cy5wdXNoKGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpfSkpLCFpKXt2YXIgYT1bU3Qsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYSxyKSxhPWEuY29uY2F0KHMpLG89UHJvbWlzZS5yZXNvbHZlKHQpO2EubGVuZ3RoOylvPW8udGhlbihhLnNoaWZ0KCksYS5zaGlmdCgpKTtyZXR1cm4gb31mb3IodmFyIGM9dDtyLmxlbmd0aDspe3ZhciB1PXIuc2hpZnQoKSxsPXIuc2hpZnQoKTt0cnl7Yz11KGMpfWNhdGNoKGUpe2woZSk7YnJlYWt9fXRyeXtvPVN0KGMpfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX1mb3IoO3MubGVuZ3RoOylvPW8udGhlbihzLnNoaWZ0KCkscy5zaGlmdCgpKTtyZXR1cm4gb30sVHQucHJvdG90eXBlLmdldFVyaT1mdW5jdGlvbihlKXtyZXR1cm4gZT1idCh0aGlzLmRlZmF1bHRzLGUpLHd0KGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LG10LmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLChmdW5jdGlvbihlKXtUdC5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGJ0KG58fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihufHx7fSkuZGF0YX0pKX19KSksbXQuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLChmdW5jdGlvbihlKXtUdC5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLnJlcXVlc3QoYnQocnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6bn0pKX19KSk7dmFyIFJ0PVR0LEF0PU1lO2Z1bmN0aW9uIEN0KGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoImV4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4iKTt2YXIgdDt0aGlzLnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKTt2YXIgbj10aGlzO3RoaXMucHJvbWlzZS50aGVuKChmdW5jdGlvbihlKXtpZihuLl9saXN0ZW5lcnMpe3ZhciB0LHI9bi5fbGlzdGVuZXJzLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kyspbi5fbGlzdGVuZXJzW3RdKGUpO24uX2xpc3RlbmVycz1udWxsfX0pKSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihlKXt2YXIgdCxyPW5ldyBQcm9taXNlKChmdW5jdGlvbihlKXtuLnN1YnNjcmliZShlKSx0PWV9KSkudGhlbihlKTtyZXR1cm4gci5jYW5jZWw9ZnVuY3Rpb24oKXtuLnVuc3Vic2NyaWJlKHQpfSxyfSxlKChmdW5jdGlvbihlKXtuLnJlYXNvbnx8KG4ucmVhc29uPW5ldyBBdChlKSx0KG4ucmVhc29uKSl9KSl9Q3QucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sQ3QucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXt0aGlzLnJlYXNvbj9lKHRoaXMucmVhc29uKTp0aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzLnB1c2goZSk6dGhpcy5fbGlzdGVuZXJzPVtlXX0sQ3QucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7LTEhPT10JiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSxDdC5zb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZSx0PW5ldyBDdCgoZnVuY3Rpb24odCl7ZT10fSkpO3JldHVybnt0b2tlbjp0LGNhbmNlbDplfX07dmFyIER0PUN0LFB0PUIsSXQ9QixPdD1PLFV0PVJ0LEx0PWh0O3ZhciBIdD1mdW5jdGlvbiBlKHQpe3ZhciBuPW5ldyBVdCh0KSxyPU90KFV0LnByb3RvdHlwZS5yZXF1ZXN0LG4pO3JldHVybiBJdC5leHRlbmQocixVdC5wcm90b3R5cGUsbiksSXQuZXh0ZW5kKHIsbiksci5jcmVhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGUoTHQodCxuKSl9LHJ9KHR0KTtIdC5BeGlvcz1VdCxIdC5DYW5jZWw9TWUsSHQuQ2FuY2VsVG9rZW49RHQsSHQuaXNDYW5jZWw9aXQsSHQuVkVSU0lPTj1mdCxIdC5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxIdC5zcHJlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KG51bGwsdCl9fSxIdC5pc0F4aW9zRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIFB0LmlzT2JqZWN0KGUpJiYhMD09PWUuaXNBeGlvc0Vycm9yfSxJLmV4cG9ydHM9SHQsSS5leHBvcnRzLmRlZmF1bHQ9SHQ7dmFyIE10LGp0PUkuZXhwb3J0cztsZXQgcXQ9TXQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmF0dGFjaFRva2VuPSgpPT5Qcm9taXNlLnJlc29sdmUoKSx0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPSgpPT5udWxsLHRoaXMuaW5pdD10aGlzLmluaXQuYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjay5iaW5kKHRoaXMpfXN0YXRpYyBnZXRJbnN0YW5jZSgpe3JldHVybiB0aGlzLmF4aW9zSW5zdGFuY2V8fCh0aGlzLmF4aW9zSW5zdGFuY2U9anQuY3JlYXRlKHt3aXRoQ3JlZGVudGlhbHM6ITB9KSx0aGlzLmNsaWVudEluc3RhbmNlfHwodGhpcy5jbGllbnRJbnN0YW5jZT1uZXcgTXQpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5jbGllbnRJbnN0YW5jZS5yZXF1ZXN0SGFuZGxlcih0KX0pKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKChlPT50aGlzLmNsaWVudEluc3RhbmNlLnN1Y2Nlc3NIYW5kbGVyKGUpKSwoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5lcnJvckhhbmRsZXIoZSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuYWxsPWp0LmFsbCx0aGlzLmF4aW9zSW5zdGFuY2Uuc3ByZWFkPWp0LnNwcmVhZCx0aGlzLmF4aW9zSW5zdGFuY2UuaW5pdD10aGlzLmNsaWVudEluc3RhbmNlLmluaXQsdGhpcy5heGlvc0luc3RhbmNlLmVuYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5lbmFibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0PXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dCx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSx0aGlzLmF4aW9zSW5zdGFuY2V9cmVxdWVzdEhhbmRsZXIodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih5aWVsZCB0aGlzLmF0dGFjaFRva2VuKHQpLG51bGw9PXQ/dm9pZCAwOnQuc2hvdWxkRW5jb2RlVG9Gb3JtRGF0YSl7Y29uc3QgZT1udWxsPT10P3ZvaWQgMDp0LmRhdGEsbj1uZXcgRm9ybURhdGE7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e24uYXBwZW5kKHQsZVt0XSl9KSksdC5kYXRhPW59cmV0dXJuIHQuc3RhcnRUaW1lSW5Ncz0obmV3IERhdGUpLmdldFRpbWUoKSxNdC5pc0hhbmRsZXJFbmFibGVkJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayh0KSx0fSkpfWVycm9ySGFuZGxlcihlKXt0aHJvdyBNdC5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJnRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1zdWNjZXNzSGFuZGxlcihlKXtyZXR1cm4gTXQuaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9aW5pdCh0PSEwLG4pe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7TXQuaXNIYW5kbGVyRW5hYmxlZD10LHRoaXMuYXR0YWNoVG9rZW49bn0pKX1lbmFibGVIYW5kbGVyKCl7TXQuaXNIYW5kbGVyRW5hYmxlZD0hMH1kaXNhYmxlSGFuZGxlcigpe010LmlzSGFuZGxlckVuYWJsZWQ9ITF9ZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dChlPU10LkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQpe010LmlzSGFuZGxlckVuYWJsZWQ9ITEsc2V0VGltZW91dCgoKCk9PntNdC5pc0hhbmRsZXJFbmFibGVkPSEwfSksZSl9c2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9ZX19O3F0LkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ9MWUzLHF0PU10PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aCxzPW88Mz90Om51bGw9PT1yP3I9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pOnI7aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlzPVJlZmxlY3QuZGVjb3JhdGUoZSx0LG4scik7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkoaT1lW2FdKSYmKHM9KG88Mz9pKHMpOm8+Mz9pKHQsbixzKTppKHQsbikpfHxzKTtyZXR1cm4gbz4zJiZzJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHMpLHN9KFtlPT57fV0scXQpO2NsYXNzIE50e2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT1uZXcgTWFwfXNldERhdGEodCxuKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuc2V0KHQsbil9KSl9Z2V0RGF0YSh0KXt2YXIgbixyO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGwhPT0ocj1udWxsPT09KG49dGhpcy5fZGF0YSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZ2V0KHQpKSYmdm9pZCAwIT09cj9yOiJ7fSJ9KSl9cmVtb3ZlRGF0YSh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuZGVsZXRlKHQpfSkpfX12YXIgeHQ9W10sS3Q9W10sQnQ9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksSnQ9ITE7ZnVuY3Rpb24gRnQoKXtKdD0hMDtmb3IodmFyIGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHQ9MCxuPWUubGVuZ3RoO3Q8bjsrK3QpeHRbdF09ZVt0XSxLdFtlLmNoYXJDb2RlQXQodCldPXQ7S3RbIi0iLmNoYXJDb2RlQXQoMCldPTYyLEt0WyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiAkdChlLHQsbil7Zm9yKHZhciByLGksbz1bXSxzPXQ7czxuO3MrPTMpcj0oZVtzXTw8MTYpKyhlW3MrMV08PDgpK2VbcysyXSxvLnB1c2goeHRbKGk9cik+PjE4JjYzXSt4dFtpPj4xMiY2M10reHRbaT4+NiY2M10reHRbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIFd0KGUpe3ZhciB0O0p0fHxGdCgpO2Zvcih2YXIgbj1lLmxlbmd0aCxyPW4lMyxpPSIiLG89W10scz0xNjM4MyxhPTAsYz1uLXI7YTxjO2ErPXMpby5wdXNoKCR0KGUsYSxhK3M+Yz9jOmErcykpO3JldHVybiAxPT09cj8odD1lW24tMV0saSs9eHRbdD4+Ml0saSs9eHRbdDw8NCY2M10saSs9Ij09Iik6Mj09PXImJih0PShlW24tMl08PDgpK2Vbbi0xXSxpKz14dFt0Pj4xMF0saSs9eHRbdD4+NCY2M10saSs9eHRbdDw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiB6dChlLHQsbixyLGkpe3ZhciBvLHMsYT04Kmktci0xLGM9KDE8PGEpLTEsdT1jPj4xLGw9LTcsZD1uP2ktMTowLGg9bj8tMToxLGY9ZVt0K2RdO2ZvcihkKz1oLG89ZiYoMTw8LWwpLTEsZj4+PS1sLGwrPWE7bD4wO289MjU2Km8rZVt0K2RdLGQrPWgsbC09OCk7Zm9yKHM9byYoMTw8LWwpLTEsbz4+PS1sLGwrPXI7bD4wO3M9MjU2KnMrZVt0K2RdLGQrPWgsbC09OCk7aWYoMD09PW8pbz0xLXU7ZWxzZXtpZihvPT09YylyZXR1cm4gcz9OYU46MS8wKihmPy0xOjEpO3MrPU1hdGgucG93KDIsciksby09dX1yZXR1cm4oZj8tMToxKSpzKk1hdGgucG93KDIsby1yKX1mdW5jdGlvbiBZdChlLHQsbixyLGksbyl7dmFyIHMsYSxjLHU9OCpvLWktMSxsPSgxPDx1KS0xLGQ9bD4+MSxoPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZj1yPzA6by0xLHA9cj8xOi0xLGc9dDwwfHwwPT09dCYmMS90PDA/MTowO2Zvcih0PU1hdGguYWJzKHQpLGlzTmFOKHQpfHx0PT09MS8wPyhhPWlzTmFOKHQpPzE6MCxzPWwpOihzPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLHQqKGM9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sYyo9MiksKHQrPXMrZD49MT9oL2M6aCpNYXRoLnBvdygyLDEtZCkpKmM+PTImJihzKyssYy89MikscytkPj1sPyhhPTAscz1sKTpzK2Q+PTE/KGE9KHQqYy0xKSpNYXRoLnBvdygyLGkpLHMrPWQpOihhPXQqTWF0aC5wb3coMixkLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtlW24rZl09MjU1JmEsZis9cCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLHUrPWk7dT4wO2VbbitmXT0yNTUmcyxmKz1wLHMvPTI1Nix1LT04KTtlW24rZi1wXXw9MTI4Kmd9dmFyIFZ0PXt9LnRvU3RyaW5nLEd0PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PVZ0LmNhbGwoZSl9O2VuLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09Vi5UWVBFRF9BUlJBWV9TVVBQT1JUfHxWLlRZUEVEX0FSUkFZX1NVUFBPUlQ7dmFyIFh0PVp0KCk7ZnVuY3Rpb24gWnQoKXtyZXR1cm4gZW4uVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gUXQoZSx0KXtpZihadCgpPHQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9bmV3IFVpbnQ4QXJyYXkodCkpLl9fcHJvdG9fXz1lbi5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgZW4odCkpLGUubGVuZ3RoPXQpLGV9ZnVuY3Rpb24gZW4oZSx0LG4pe2lmKCEoZW4uVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGVuKSlyZXR1cm4gbmV3IGVuKGUsdCxuKTtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIHJuKHRoaXMsZSl9cmV0dXJuIHRuKHRoaXMsZSx0LG4pfWZ1bmN0aW9uIHRuKGUsdCxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKGUsdCxuLHIpe2lmKHQuYnl0ZUxlbmd0aCxuPDB8fHQuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYodC5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7dD12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCxuKTpuZXcgVWludDhBcnJheSh0LG4scik7ZW4uVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189ZW4ucHJvdG90eXBlOmU9b24oZSx0KTtyZXR1cm4gZX0oZSx0LG4scik6InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCxuKXsic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKTtpZighZW4uaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGNuKHQsbiksaT0oZT1RdChlLHIpKS53cml0ZSh0LG4pO2khPT1yJiYoZT1lLnNsaWNlKDAsaSkpO3JldHVybiBlfShlLHQsbik6ZnVuY3Rpb24oZSx0KXtpZihhbih0KSl7dmFyIG49MHxzbih0Lmxlbmd0aCk7cmV0dXJuIDA9PT0oZT1RdChlLG4pKS5sZW5ndGh8fHQuY29weShlLDAsMCxuKSxlfWlmKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gdClyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHwocj10Lmxlbmd0aCkhPXI/UXQoZSwwKTpvbihlLHQpO2lmKCJCdWZmZXIiPT09dC50eXBlJiZHdCh0LmRhdGEpKXJldHVybiBvbihlLHQuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIG5uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gcm4oZSx0KXtpZihubih0KSxlPVF0KGUsdDwwPzA6MHxzbih0KSksIWVuLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjx0OysrbillW25dPTA7cmV0dXJuIGV9ZnVuY3Rpb24gb24oZSx0KXt2YXIgbj10Lmxlbmd0aDwwPzA6MHxzbih0Lmxlbmd0aCk7ZT1RdChlLG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKWVbcl09MjU1JnRbcl07cmV0dXJuIGV9ZnVuY3Rpb24gc24oZSl7aWYoZT49WnQoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrWnQoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gYW4oZSl7cmV0dXJuIShudWxsPT1lfHwhZS5faXNCdWZmZXIpfWZ1bmN0aW9uIGNuKGUsdCl7aWYoYW4oZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciBuPWUubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEhuKGUpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gTW4oZSkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gSG4oZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gdW4oZSx0LG4pe3ZhciByPSExO2lmKCh2b2lkIDA9PT10fHx0PDApJiYodD0wKSx0PnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PSh0Pj4+PTApKXJldHVybiIiO2ZvcihlfHwoZT0idXRmOCIpOzspc3dpdGNoKGUpe2Nhc2UiaGV4IjpyZXR1cm4gRW4odGhpcyx0LG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIF9uKHRoaXMsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gYm4odGhpcyx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGtuKHRoaXMsdCxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIHduKHRoaXMsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFRuKHRoaXMsdCxuKTtkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitlKTtlPShlKyIiKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIGxuKGUsdCxuKXt2YXIgcj1lW3RdO2VbdF09ZVtuXSxlW25dPXJ9ZnVuY3Rpb24gZG4oZSx0LG4scixpKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc/bj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1pPzA6ZS5sZW5ndGgtMSksbjwwJiYobj1lLmxlbmd0aCtuKSxuPj1lLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtuPWUubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFpKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWVuLmZyb20odCxyKSksYW4odCkpcmV0dXJuIDA9PT10Lmxlbmd0aD8tMTpobihlLHQsbixyLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGUsdCxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGUsdCxuKTpobihlLFt0XSxuLHIsaSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gaG4oZSx0LG4scixpKXt2YXIgbyxzPTEsYT1lLmxlbmd0aCxjPXQubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsYy89MixuLz0yfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKGkpe3ZhciBsPS0xO2ZvcihvPW47bzxhO28rKylpZih1KGUsbyk9PT11KHQsLTE9PT1sPzA6by1sKSl7aWYoLTE9PT1sJiYobD1vKSxvLWwrMT09PWMpcmV0dXJuIGwqc31lbHNlLTEhPT1sJiYoby09by1sKSxsPS0xfWVsc2UgZm9yKG4rYz5hJiYobj1hLWMpLG89bjtvPj0wO28tLSl7Zm9yKHZhciBkPSEwLGg9MDtoPGM7aCsrKWlmKHUoZSxvK2gpIT09dSh0LGgpKXtkPSExO2JyZWFrfWlmKGQpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gZm4oZSx0LG4scil7bj1OdW1iZXIobil8fDA7dmFyIGk9ZS5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSk+aSYmKHI9aSk6cj1pO3ZhciBvPXQubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtyPm8vMiYmKHI9by8yKTtmb3IodmFyIHM9MDtzPHI7KytzKXt2YXIgYT1wYXJzZUludCh0LnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO2VbbitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIHBuKGUsdCxuLHIpe3JldHVybiBqbihIbih0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiBnbihlLHQsbixyKXtyZXR1cm4gam4oZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChuKSk7cmV0dXJuIHR9KHQpLGUsbixyKX1mdW5jdGlvbiB2bihlLHQsbixyKXtyZXR1cm4gZ24oZSx0LG4scil9ZnVuY3Rpb24geW4oZSx0LG4scil7cmV0dXJuIGpuKE1uKHQpLGUsbixyKX1mdW5jdGlvbiBtbihlLHQsbixyKXtyZXR1cm4gam4oZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scixpLG89W10scz0wO3M8ZS5sZW5ndGgmJiEoKHQtPTIpPDApOysrcylyPShuPWUuY2hhckNvZGVBdChzKSk+PjgsaT1uJTI1NixvLnB1c2goaSksby5wdXNoKHIpO3JldHVybiBvfSh0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiB3bihlLHQsbil7cmV0dXJuIDA9PT10JiZuPT09ZS5sZW5ndGg/V3QoZSk6V3QoZS5zbGljZSh0LG4pKX1mdW5jdGlvbiBfbihlLHQsbil7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIHI9W10saT10O2k8bjspe3ZhciBvLHMsYSxjLHU9ZVtpXSxsPW51bGwsZD11PjIzOT80OnU+MjIzPzM6dT4xOTE/MjoxO2lmKGkrZDw9bilzd2l0Y2goZCl7Y2FzZSAxOnU8MTI4JiYobD11KTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPWVbaSsxXSkpJiYoYz0oMzEmdSk8PDZ8NjMmbyk+MTI3JiYobD1jKTticmVhaztjYXNlIDM6bz1lW2krMV0scz1lW2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJihjPSgxNSZ1KTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJihjPDU1Mjk2fHxjPjU3MzQzKSYmKGw9Yyk7YnJlYWs7Y2FzZSA0Om89ZVtpKzFdLHM9ZVtpKzJdLGE9ZVtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJihjPSgxNSZ1KTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJmM8MTExNDExMiYmKGw9Yyl9bnVsbD09PWw/KGw9NjU1MzMsZD0xKTpsPjY1NTM1JiYobC09NjU1MzYsci5wdXNoKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCksci5wdXNoKGwpLGkrPWR9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQ8PVNuKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTt2YXIgbj0iIixyPTA7Zm9yKDtyPHQ7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UocixyKz1TbikpO3JldHVybiBufShyKX1lbi5wb29sU2l6ZT04MTkyLGVuLl9hdWdtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fXz1lbi5wcm90b3R5cGUsZX0sZW4uZnJvbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRuKG51bGwsZSx0LG4pfSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoZW4ucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxlbi5fX3Byb3RvX189VWludDhBcnJheSksZW4uYWxsb2M9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbm4odCksdDw9MD9RdChlLHQpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP1F0KGUsdCkuZmlsbChuLHIpOlF0KGUsdCkuZmlsbChuKTpRdChlLHQpfShudWxsLGUsdCxuKX0sZW4uYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHJuKG51bGwsZSl9LGVuLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gcm4obnVsbCxlKX0sZW4uaXNCdWZmZXI9cW4sZW4uY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFhbihlKXx8IWFuKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIG49ZS5sZW5ndGgscj10Lmxlbmd0aCxpPTAsbz1NYXRoLm1pbihuLHIpO2k8bzsrK2kpaWYoZVtpXSE9PXRbaV0pe249ZVtpXSxyPXRbaV07YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSxlbi5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxlbi5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZighR3QoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gZW4uYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09dClmb3IodD0wLG49MDtuPGUubGVuZ3RoOysrbil0Kz1lW25dLmxlbmd0aDt2YXIgcj1lbi5hbGxvY1Vuc2FmZSh0KSxpPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7dmFyIG89ZVtuXTtpZighYW4obykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28uY29weShyLGkpLGkrPW8ubGVuZ3RofXJldHVybiByfSxlbi5ieXRlTGVuZ3RoPWNuLGVuLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsZW4ucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9Milsbih0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc30sZW4ucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NClsbih0aGlzLHQsdCszKSxsbih0aGlzLHQrMSx0KzIpO3JldHVybiB0aGlzfSxlbi5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KWxuKHRoaXMsdCx0KzcpLGxuKHRoaXMsdCsxLHQrNiksbG4odGhpcyx0KzIsdCs1KSxsbih0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxlbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09ZT8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9fbih0aGlzLDAsZSk6dW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlbi5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe2lmKCFhbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09ZW4uY29tcGFyZSh0aGlzLGUpfSxlbi5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciBlPSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYoZT10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxlbi5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQsbixyLGkpe2lmKCFhbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09biYmKG49ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksdDwwfHxuPmUubGVuZ3RofHxyPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI+PWkmJnQ+PW4pcmV0dXJuIDA7aWYocj49aSlyZXR1cm4tMTtpZih0Pj1uKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0ocj4+Pj0wKSxzPShuPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4obyxzKSxjPXRoaXMuc2xpY2UocixpKSx1PWUuc2xpY2UodCxuKSxsPTA7bDxhOysrbClpZihjW2xdIT09dVtsXSl7bz1jW2xdLHM9dVtsXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LGVuLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LG4pfSxlbi5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGRuKHRoaXMsZSx0LG4sITApfSxlbi5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBkbih0aGlzLGUsdCxuLCExKX0sZW4ucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHZvaWQgMD09PXQpcj0idXRmOCIsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1uJiYic3RyaW5nIj09dHlwZW9mIHQpcj10LG49dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKG4pPyhufD0wLHZvaWQgMD09PXImJihyPSJ1dGY4IikpOihyPW4sbj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PW58fG4+aSkmJihuPWkpLGUubGVuZ3RoPjAmJihuPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7cnx8KHI9InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gocil7Y2FzZSJoZXgiOnJldHVybiBmbih0aGlzLGUsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBwbih0aGlzLGUsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gZ24odGhpcyxlLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gdm4odGhpcyxlLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiB5bih0aGlzLGUsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIG1uKHRoaXMsZSx0LG4pO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpO3I9KCIiK3IpLnRvTG93ZXJDYXNlKCksbz0hMH19LGVuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBTbj00MDk2O2Z1bmN0aW9uIGJuKGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgaT10O2k8bjsrK2kpcis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIHJ9ZnVuY3Rpb24ga24oZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBpPXQ7aTxuOysraSlyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbaV0pO3JldHVybiByfWZ1bmN0aW9uIEVuKGUsdCxuKXt2YXIgcj1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghbnx8bjwwfHxuPnIpJiYobj1yKTtmb3IodmFyIGk9IiIsbz10O288bjsrK28paSs9TG4oZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gVG4oZSx0LG4pe2Zvcih2YXIgcj1lLnNsaWNlKHQsbiksaT0iIixvPTA7bzxyLmxlbmd0aDtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocltvXSsyNTYqcltvKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBSbihlLHQsbil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gQW4oZSx0LG4scixpLG8pe2lmKCFhbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5pfHx0PG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gQ24oZSx0LG4scil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtbiwyKTtpPG87KytpKWVbbitpXT0odCYyNTU8PDgqKHI/aToxLWkpKT4+PjgqKHI/aToxLWkpfWZ1bmN0aW9uIERuKGUsdCxuLHIpe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtbiw0KTtpPG87KytpKWVbbitpXT10Pj4+OCoocj9pOjMtaSkmMjU1fWZ1bmN0aW9uIFBuKGUsdCxuLHIsaSxvKXtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gSW4oZSx0LG4scixpKXtyZXR1cm4gaXx8UG4oZSwwLG4sNCksWXQoZSx0LG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24gT24oZSx0LG4scixpKXtyZXR1cm4gaXx8UG4oZSwwLG4sOCksWXQoZSx0LG4sciw1Miw4KSxuKzh9ZW4ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPXIpPDAmJihlPTApOmU+ciYmKGU9ciksKHQ9dm9pZCAwPT09dD9yOn5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSx0PGUmJih0PWUpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQpKG49dGhpcy5zdWJhcnJheShlLHQpKS5fX3Byb3RvX189ZW4ucHJvdG90eXBlO2Vsc2V7dmFyIGk9dC1lO249bmV3IGVuKGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKW5bb109dGhpc1tvK2VdfXJldHVybiBufSxlbi5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFJuKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KXIrPXRoaXNbZStvXSppO3JldHVybiByfSxlbi5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFJuKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZSstLXRdLGk9MTt0PjAmJihpKj0yNTYpOylyKz10aGlzW2UrLS10XSppO3JldHVybiByfSxlbi5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sZW4ucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fSxlbi5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LGVuLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSxlbi5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1tlXSsodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX0sZW4ucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFJuKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KXIrPXRoaXNbZStvXSppO3JldHVybiByPj0oaSo9MTI4KSYmKHItPU1hdGgucG93KDIsOCp0KSkscn0sZW4ucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFJuKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXQsaT0xLG89dGhpc1tlKy0tcl07cj4wJiYoaSo9MjU2KTspbys9dGhpc1tlKy0tcl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqdCkpLG99LGVuLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW2VdPy0xKigyNTUtdGhpc1tlXSsxKTp0aGlzW2VdfSxlbi5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxSbihlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxlbi5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24oZSx0KXt0fHxSbihlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxlbi5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9LGVuLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sZW4ucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsNCx0aGlzLmxlbmd0aCksenQodGhpcyxlLCEwLDIzLDQpfSxlbi5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw0LHRoaXMubGVuZ3RoKSx6dCh0aGlzLGUsITEsMjMsNCl9LGVuLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw4LHRoaXMubGVuZ3RoKSx6dCh0aGlzLGUsITAsNTIsOCl9LGVuLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw4LHRoaXMubGVuZ3RoKSx6dCh0aGlzLGUsITEsNTIsOCl9LGVuLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXsoZT0rZSx0fD0wLG58PTAscil8fEFuKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPG4mJihpKj0yNTYpOyl0aGlzW3Qrb109ZS9pJjI1NTtyZXR1cm4gdCtufSxlbi5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7KGU9K2UsdHw9MCxufD0wLHIpfHxBbih0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBpPW4tMSxvPTE7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtufSxlbi5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxBbih0aGlzLGUsdCwxLDI1NSwwKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSx0aGlzW3RdPTI1NSZlLHQrMX0sZW4ucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsMiw2NTUzNSwwKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6Q24odGhpcyxlLHQsITApLHQrMn0sZW4ucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsMiw2NTUzNSwwKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6Q24odGhpcyxlLHQsITEpLHQrMn0sZW4ucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6RG4odGhpcyxlLHQsITApLHQrNH0sZW4ucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6RG4odGhpcyxlLHQsITEpLHQrNH0sZW4ucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgaT1NYXRoLnBvdygyLDgqbi0xKTtBbih0aGlzLGUsdCxuLGktMSwtaSl9dmFyIG89MCxzPTEsYT0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxuJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvLTFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn0sZW4ucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgaT1NYXRoLnBvdygyLDgqbi0xKTtBbih0aGlzLGUsdCxuLGktMSwtaSl9dmFyIG89bi0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtvXT0yNTUmZTstLW8+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28rMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxlbi5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEFuKHRoaXMsZSx0LDEsMTI3LC0xMjgpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGVuLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpDbih0aGlzLGUsdCwhMCksdCsyfSxlbi5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEFuKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6Q24odGhpcyxlLHQsITEpLHQrMn0sZW4ucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxBbih0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzNdPWU+Pj4yNCk6RG4odGhpcyxlLHQsITApLHQrNH0sZW4ucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxBbih0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6RG4odGhpcyxlLHQsITEpLHQrNH0sZW4ucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEluKHRoaXMsZSx0LCEwLG4pfSxlbi5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSW4odGhpcyxlLHQsITEsbil9LGVuLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gT24odGhpcyxlLHQsITAsbil9LGVuLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gT24odGhpcyxlLHQsITEsbil9LGVuLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxyLW4mJihyPWUubGVuZ3RoLXQrbik7dmFyIGksbz1yLW47aWYodGhpcz09PWUmJm48dCYmdDxyKWZvcihpPW8tMTtpPj0wOy0taSllW2krdF09dGhpc1tpK25dO2Vsc2UgaWYobzwxZTN8fCFlbi5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSllW2krdF09dGhpc1tpK25dO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KG4sbitvKSx0KTtyZXR1cm4gb30sZW4ucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KHI9dCx0PTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIGk9ZS5jaGFyQ29kZUF0KDApO2k8MjU2JiYoZT1pKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWVuLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiBlJiYoZSY9MjU1KTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PXQpcmV0dXJuIHRoaXM7dmFyIG87aWYodD4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCxlfHwoZT0wKSwibnVtYmVyIj09dHlwZW9mIGUpZm9yKG89dDtvPG47KytvKXRoaXNbb109ZTtlbHNle3ZhciBzPWFuKGUpP2U6SG4obmV3IGVuKGUscikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288bi10Oysrbyl0aGlzW28rdF09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgVW49L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gTG4oZSl7cmV0dXJuIGU8MTY/IjAiK2UudG9TdHJpbmcoMTYpOmUudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEhuKGUsdCl7dmFyIG47dD10fHwxLzA7Zm9yKHZhciByPWUubGVuZ3RoLGk9bnVsbCxvPVtdLHM9MDtzPHI7KytzKXtpZigobj1lLmNoYXJDb2RlQXQocykpPjU1Mjk1JiZuPDU3MzQ0KXtpZighaSl7aWYobj41NjMxOSl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHMrMT09PXIpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPW47Y29udGludWV9aWYobjw1NjMyMCl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9bjtjb250aW51ZX1uPTY1NTM2KyhpLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIGkmJih0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwsbjwxMjgpe2lmKCh0LT0xKTwwKWJyZWFrO28ucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKHQtPTIpPDApYnJlYWs7by5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKCh0LT0zKTwwKWJyZWFrO28ucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKHQtPTQpPDApYnJlYWs7by5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBNbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxzO0p0fHxGdCgpO3ZhciBhPWUubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09ZVthLTJdPzI6Ij0iPT09ZVthLTFdPzE6MCxzPW5ldyBCdCgzKmEvNC1vKSxyPW8+MD9hLTQ6YTt2YXIgYz0wO2Zvcih0PTAsbj0wO3Q8cjt0Kz00LG4rPTMpaT1LdFtlLmNoYXJDb2RlQXQodCldPDwxOHxLdFtlLmNoYXJDb2RlQXQodCsxKV08PDEyfEt0W2UuY2hhckNvZGVBdCh0KzIpXTw8NnxLdFtlLmNoYXJDb2RlQXQodCszKV0sc1tjKytdPWk+PjE2JjI1NSxzW2MrK109aT4+OCYyNTUsc1tjKytdPTI1NSZpO3JldHVybiAyPT09bz8oaT1LdFtlLmNoYXJDb2RlQXQodCldPDwyfEt0W2UuY2hhckNvZGVBdCh0KzEpXT4+NCxzW2MrK109MjU1JmkpOjE9PT1vJiYoaT1LdFtlLmNoYXJDb2RlQXQodCldPDwxMHxLdFtlLmNoYXJDb2RlQXQodCsxKV08PDR8S3RbZS5jaGFyQ29kZUF0KHQrMildPj4yLHNbYysrXT1pPj44JjI1NSxzW2MrK109MjU1JmkpLHN9KGZ1bmN0aW9uKGUpe2lmKChlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0/ZS50cmltKCk6ZS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KGUpLnJlcGxhY2UoVW4sIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO2UubGVuZ3RoJTQhPTA7KWUrPSI9IjtyZXR1cm4gZX0oZSkpfWZ1bmN0aW9uIGpuKGUsdCxuLHIpe2Zvcih2YXIgaT0wO2k8ciYmIShpK24+PXQubGVuZ3RofHxpPj1lLmxlbmd0aCk7KytpKXRbaStuXT1lW2ldO3JldHVybiBpfWZ1bmN0aW9uIHFuKGUpe3JldHVybiBudWxsIT1lJiYoISFlLl9pc0J1ZmZlcnx8Tm4oZSl8fGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zbGljZSYmTm4oZS5zbGljZSgwLDApKX0oZSkpfWZ1bmN0aW9uIE5uKGUpe3JldHVybiEhZS5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9dmFyIHhuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJ1ZmZlcjplbixJTlNQRUNUX01BWF9CWVRFUzo1MCxTbG93QnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxlbi5hbGxvYygrZSl9LGlzQnVmZmVyOnFuLGtNYXhMZW5ndGg6WHR9KSxLbj17ZXhwb3J0czp7fX0sQm49e30sSm49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KEpuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxKbi5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoLG49dCU0O2lmKCFuKXJldHVybiBlO3ZhciByPXQsaT00LW4sbz10K2kscz1lbi5hbGxvYyhvKTtmb3Iocy53cml0ZShlKTtpLS07KXMud3JpdGUoIj0iLHIrKyk7cmV0dXJuIHMudG9TdHJpbmcoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KEJuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRm49Sm47ZnVuY3Rpb24gJG4oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxlbi5pc0J1ZmZlcihlKT96bihlLnRvU3RyaW5nKCJiYXNlNjQiKSk6em4oZW4uZnJvbShlLHQpLnRvU3RyaW5nKCJiYXNlNjQiKSl9ZnVuY3Rpb24gV24oZSl7cmV0dXJuIGU9ZS50b1N0cmluZygpLEZuLmRlZmF1bHQoZSkucmVwbGFjZSgvXC0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpfWZ1bmN0aW9uIHpuKGUpe3JldHVybiBlLnJlcGxhY2UoLz0vZywiIikucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKX12YXIgWW4sVm49JG47Vm4uZW5jb2RlPSRuLFZuLmRlY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0idXRmOCIpLGVuLmZyb20oV24oZSksImJhc2U2NCIpLnRvU3RyaW5nKHQpfSxWbi50b0Jhc2U2ND1XbixWbi5mcm9tQmFzZTY0PXpuLFZuLnRvQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiBlbi5mcm9tKFduKGUpLCJiYXNlNjQiKX0sQm4uZGVmYXVsdD1WbiwoWW49S24pLmV4cG9ydHM9Qm4uZGVmYXVsdCxZbi5leHBvcnRzLmRlZmF1bHQ9WW4uZXhwb3J0czt2YXIgR249S24uZXhwb3J0cyxYbj17ZXhwb3J0czp7fX07IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0LG4pe3ZhciByPXt9OyFmdW5jdGlvbihlKXtlLl9fZXNNb2R1bGU9ITAsZS5kaWdlc3RMZW5ndGg9MzIsZS5ibG9ja1NpemU9NjQ7dmFyIHQ9bmV3IFVpbnQzMkFycmF5KFsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdKTtmdW5jdGlvbiBuKGUsbixyLGksbyl7Zm9yKHZhciBzLGEsYyx1LGwsZCxoLGYscCxnLHYseSxtO28+PTY0Oyl7Zm9yKHM9blswXSxhPW5bMV0sYz1uWzJdLHU9blszXSxsPW5bNF0sZD1uWzVdLGg9bls2XSxmPW5bN10sZz0wO2c8MTY7ZysrKXY9aSs0KmcsZVtnXT0oMjU1JnJbdl0pPDwyNHwoMjU1JnJbdisxXSk8PDE2fCgyNTUmclt2KzJdKTw8OHwyNTUmclt2KzNdO2ZvcihnPTE2O2c8NjQ7ZysrKXk9KChwPWVbZy0yXSk+Pj4xN3xwPDwxNSleKHA+Pj4xOXxwPDwxMylecD4+PjEwLG09KChwPWVbZy0xNV0pPj4+N3xwPDwyNSleKHA+Pj4xOHxwPDwxNClecD4+PjMsZVtnXT0oeStlW2ctN118MCkrKG0rZVtnLTE2XXwwKTtmb3IoZz0wO2c8NjQ7ZysrKXk9KCgobD4+PjZ8bDw8MjYpXihsPj4+MTF8bDw8MjEpXihsPj4+MjV8bDw8NykpKyhsJmRefmwmaCl8MCkrKGYrKHRbZ10rZVtnXXwwKXwwKXwwLG09KChzPj4+MnxzPDwzMCleKHM+Pj4xM3xzPDwxOSleKHM+Pj4yMnxzPDwxMCkpKyhzJmFecyZjXmEmYyl8MCxmPWgsaD1kLGQ9bCxsPXUreXwwLHU9YyxjPWEsYT1zLHM9eSttfDA7blswXSs9cyxuWzFdKz1hLG5bMl0rPWMsblszXSs9dSxuWzRdKz1sLG5bNV0rPWQsbls2XSs9aCxuWzddKz1mLGkrPTY0LG8tPTY0fXJldHVybiBpfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZGlnZXN0TGVuZ3RoPWUuZGlnZXN0TGVuZ3RoLHRoaXMuYmxvY2tTaXplPWUuYmxvY2tTaXplLHRoaXMuc3RhdGU9bmV3IEludDMyQXJyYXkoOCksdGhpcy50ZW1wPW5ldyBJbnQzMkFycmF5KDY0KSx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxMjgpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5yZXNldCgpfXJldHVybiB0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlWzBdPTE3NzkwMzM3MDMsdGhpcy5zdGF0ZVsxXT0zMTQ0MTM0Mjc3LHRoaXMuc3RhdGVbMl09MTAxMzkwNDI0Mix0aGlzLnN0YXRlWzNdPTI3NzM0ODA3NjIsdGhpcy5zdGF0ZVs0XT0xMzU5ODkzMTE5LHRoaXMuc3RhdGVbNV09MjYwMDgyMjkyNCx0aGlzLnN0YXRlWzZdPTUyODczNDYzNSx0aGlzLnN0YXRlWzddPTE1NDE0NTkyMjUsdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMSx0aGlzfSx0LnByb3RvdHlwZS5jbGVhbj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5idWZmZXIubGVuZ3RoO2UrKyl0aGlzLmJ1ZmZlcltlXT0wO2ZvcihlPTA7ZTx0aGlzLnRlbXAubGVuZ3RoO2UrKyl0aGlzLnRlbXBbZV09MDt0aGlzLnJlc2V0KCl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQmJih0PWUubGVuZ3RoKSx0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiU0hBMjU2OiBjYW4ndCB1cGRhdGUgYmVjYXVzZSBoYXNoIHdhcyBmaW5pc2hlZC4iKTt2YXIgcj0wO2lmKHRoaXMuYnl0ZXNIYXNoZWQrPXQsdGhpcy5idWZmZXJMZW5ndGg+MCl7Zm9yKDt0aGlzLmJ1ZmZlckxlbmd0aDw2NCYmdD4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW3IrK10sdC0tOzY0PT09dGhpcy5idWZmZXJMZW5ndGgmJihuKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAsNjQpLHRoaXMuYnVmZmVyTGVuZ3RoPTApfWZvcih0Pj02NCYmKHI9bih0aGlzLnRlbXAsdGhpcy5zdGF0ZSxlLHIsdCksdCU9NjQpO3Q+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtyKytdLHQtLTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD10aGlzLmJ5dGVzSGFzaGVkLHI9dGhpcy5idWZmZXJMZW5ndGgsaT10LzUzNjg3MDkxMnwwLG89dDw8MyxzPXQlNjQ8NTY/NjQ6MTI4O3RoaXMuYnVmZmVyW3JdPTEyODtmb3IodmFyIGE9cisxO2E8cy04O2ErKyl0aGlzLmJ1ZmZlclthXT0wO3RoaXMuYnVmZmVyW3MtOF09aT4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltzLTddPWk+Pj4xNiYyNTUsdGhpcy5idWZmZXJbcy02XT1pPj4+OCYyNTUsdGhpcy5idWZmZXJbcy01XT1pPj4+MCYyNTUsdGhpcy5idWZmZXJbcy00XT1vPj4+MjQmMjU1LHRoaXMuYnVmZmVyW3MtM109bz4+PjE2JjI1NSx0aGlzLmJ1ZmZlcltzLTJdPW8+Pj44JjI1NSx0aGlzLmJ1ZmZlcltzLTFdPW8+Pj4wJjI1NSxuKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAscyksdGhpcy5maW5pc2hlZD0hMH1mb3IoYT0wO2E8ODthKyspZVs0KmErMF09dGhpcy5zdGF0ZVthXT4+PjI0JjI1NSxlWzQqYSsxXT10aGlzLnN0YXRlW2FdPj4+MTYmMjU1LGVbNCphKzJdPXRoaXMuc3RhdGVbYV0+Pj44JjI1NSxlWzQqYSszXT10aGlzLnN0YXRlW2FdPj4+MCYyNTU7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuZGlnZXN0TGVuZ3RoKTtyZXR1cm4gdGhpcy5maW5pc2goZSksZX0sdC5wcm90b3R5cGUuX3NhdmVTdGF0ZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PHRoaXMuc3RhdGUubGVuZ3RoO3QrKyllW3RdPXRoaXMuc3RhdGVbdF19LHQucHJvdG90eXBlLl9yZXN0b3JlU3RhdGU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHRoaXMuc3RhdGUubGVuZ3RoO24rKyl0aGlzLnN0YXRlW25dPWVbbl07dGhpcy5ieXRlc0hhc2hlZD10LHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5idWZmZXJMZW5ndGg9MH0sdH0oKTtlLkhhc2g9cjt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5pbm5lcj1uZXcgcix0aGlzLm91dGVyPW5ldyByLHRoaXMuYmxvY2tTaXplPXRoaXMuaW5uZXIuYmxvY2tTaXplLHRoaXMuZGlnZXN0TGVuZ3RoPXRoaXMuaW5uZXIuZGlnZXN0TGVuZ3RoO3ZhciB0PW5ldyBVaW50OEFycmF5KHRoaXMuYmxvY2tTaXplKTtpZihlLmxlbmd0aD50aGlzLmJsb2NrU2l6ZSkobmV3IHIpLnVwZGF0ZShlKS5maW5pc2godCkuY2xlYW4oKTtlbHNlIGZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRbbl09ZVtuXTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXRbbl1ePTU0O3RoaXMuaW5uZXIudXBkYXRlKHQpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXV49MTA2O3RoaXMub3V0ZXIudXBkYXRlKHQpLHRoaXMuaXN0YXRlPW5ldyBVaW50MzJBcnJheSg4KSx0aGlzLm9zdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5pbm5lci5fc2F2ZVN0YXRlKHRoaXMuaXN0YXRlKSx0aGlzLm91dGVyLl9zYXZlU3RhdGUodGhpcy5vc3RhdGUpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT0wfXJldHVybiBlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlubmVyLl9yZXN0b3JlU3RhdGUodGhpcy5pc3RhdGUsdGhpcy5pbm5lci5ibG9ja1NpemUpLHRoaXMub3V0ZXIuX3Jlc3RvcmVTdGF0ZSh0aGlzLm9zdGF0ZSx0aGlzLm91dGVyLmJsb2NrU2l6ZSksdGhpc30sZS5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuaXN0YXRlLmxlbmd0aDtlKyspdGhpcy5vc3RhdGVbZV09dGhpcy5pc3RhdGVbZV09MDt0aGlzLmlubmVyLmNsZWFuKCksdGhpcy5vdXRlci5jbGVhbigpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5uZXIudXBkYXRlKGUpLHRoaXN9LGUucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vdXRlci5maW5pc2hlZD90aGlzLm91dGVyLmZpbmlzaChlKToodGhpcy5pbm5lci5maW5pc2goZSksdGhpcy5vdXRlci51cGRhdGUoZSx0aGlzLmRpZ2VzdExlbmd0aCkuZmluaXNoKGUpKSx0aGlzfSxlLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LGV9KCk7ZnVuY3Rpb24gbyhlKXt2YXIgdD0obmV3IHIpLnVwZGF0ZShlKSxuPXQuZGlnZXN0KCk7cmV0dXJuIHQuY2xlYW4oKSxufWZ1bmN0aW9uIHMoZSx0KXt2YXIgbj1uZXcgaShlKS51cGRhdGUodCkscj1uLmRpZ2VzdCgpO3JldHVybiBuLmNsZWFuKCkscn1mdW5jdGlvbiBhKGUsdCxuLHIpe3ZhciBpPXJbMF07aWYoMD09PWkpdGhyb3cgbmV3IEVycm9yKCJoa2RmOiBjYW5ub3QgZXhwYW5kIG1vcmUiKTt0LnJlc2V0KCksaT4xJiZ0LnVwZGF0ZShlKSxuJiZ0LnVwZGF0ZShuKSx0LnVwZGF0ZShyKSx0LmZpbmlzaChlKSxyWzBdKyt9ZS5ITUFDPWksZS5oYXNoPW8sZS5kZWZhdWx0PW8sZS5obWFjPXM7dmFyIGM9bmV3IFVpbnQ4QXJyYXkoZS5kaWdlc3RMZW5ndGgpO2Z1bmN0aW9uIHUoZSx0LG4scil7dm9pZCAwPT09dCYmKHQ9Yyksdm9pZCAwPT09ciYmKHI9MzIpO2Zvcih2YXIgbz1uZXcgVWludDhBcnJheShbMV0pLHU9cyh0LGUpLGw9bmV3IGkodSksZD1uZXcgVWludDhBcnJheShsLmRpZ2VzdExlbmd0aCksaD1kLmxlbmd0aCxmPW5ldyBVaW50OEFycmF5KHIpLHA9MDtwPHI7cCsrKWg9PT1kLmxlbmd0aCYmKGEoZCxsLG4sbyksaD0wKSxmW3BdPWRbaCsrXTtyZXR1cm4gbC5jbGVhbigpLGQuZmlsbCgwKSxvLmZpbGwoMCksZn1mdW5jdGlvbiBsKGUsdCxuLHIpe2Zvcih2YXIgbz1uZXcgaShlKSxzPW8uZGlnZXN0TGVuZ3RoLGE9bmV3IFVpbnQ4QXJyYXkoNCksYz1uZXcgVWludDhBcnJheShzKSx1PW5ldyBVaW50OEFycmF5KHMpLGw9bmV3IFVpbnQ4QXJyYXkociksZD0wO2QqczxyO2QrKyl7dmFyIGg9ZCsxO2FbMF09aD4+PjI0JjI1NSxhWzFdPWg+Pj4xNiYyNTUsYVsyXT1oPj4+OCYyNTUsYVszXT1oPj4+MCYyNTUsby5yZXNldCgpLG8udXBkYXRlKHQpLG8udXBkYXRlKGEpLG8uZmluaXNoKHUpO2Zvcih2YXIgZj0wO2Y8cztmKyspY1tmXT11W2ZdO2ZvcihmPTI7Zjw9bjtmKyspe28ucmVzZXQoKSxvLnVwZGF0ZSh1KS5maW5pc2godSk7Zm9yKHZhciBwPTA7cDxzO3ArKyljW3BdXj11W3BdfWZvcihmPTA7ZjxzJiZkKnMrZjxyO2YrKylsW2QqcytmXT1jW2ZdfWZvcihkPTA7ZDxzO2QrKyljW2RdPXVbZF09MDtmb3IoZD0wO2Q8NDtkKyspYVtkXT0wO3JldHVybiBvLmNsZWFuKCksbH1lLmhrZGY9dSxlLnBia2RmMj1sfShyKTt2YXIgaT1yLmRlZmF1bHQ7Zm9yKHZhciBvIGluIHIpaVtvXT1yW29dO2UuZXhwb3J0cz1pfSgpfShYbik7dmFyIFpuPUQoWG4uZXhwb3J0cyksUW49Y3J5cHRvO2NvbnN0IGVyPWU9PmUgaW5zdGFuY2VvZiBDcnlwdG9LZXksdHI9bmV3IFRleHRFbmNvZGVyLG5yPW5ldyBUZXh0RGVjb2Rlcjtjb25zdCBycj1lPT57bGV0IHQ9ZTt0IGluc3RhbmNlb2YgVWludDhBcnJheSYmKHQ9bnIuZGVjb2RlKHQpKSx0PXQucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikucmVwbGFjZSgvXHMvZywiIik7dHJ5e3JldHVybihlPT57Y29uc3QgdD1hdG9iKGUpLG49bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKW5bZV09dC5jaGFyQ29kZUF0KGUpO3JldHVybiBufSkodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGlucHV0IHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpfX07Y2xhc3MgaXIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXt2YXIgdDtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0dFTkVSSUMiLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsbnVsbD09PSh0PUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKXx8dm9pZCAwPT09dHx8dC5jYWxsKEVycm9yLHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX0dFTkVSSUMifX1jbGFzcyBvciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKGUsdD0idW5zcGVjaWZpZWQiLG49InVuc3BlY2lmaWVkIil7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEIix0aGlzLmNsYWltPXQsdGhpcy5yZWFzb249bn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCJ9fWNsYXNzIHNyIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoZSx0PSJ1bnNwZWNpZmllZCIsbj0idW5zcGVjaWZpZWQiKXtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KV1RfRVhQSVJFRCIsdGhpcy5jbGFpbT10LHRoaXMucmVhc29uPW59c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1RfRVhQSVJFRCJ9fWNsYXNzIGFyIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn19Y2xhc3MgY3IgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSk9TRV9OT1RfU1VQUE9SVEVEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9fWNsYXNzIHVyIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXU19JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXU19JTlZBTElEIn19Y2xhc3MgbHIgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldUX0lOVkFMSUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldUX0lOVkFMSUQifX1jbGFzcyBkciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV0tTX0lOVkFMSUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19JTlZBTElEIn19Y2xhc3MgaHIgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19OT19NQVRDSElOR19LRVkiLHRoaXMubWVzc2FnZT0ibm8gYXBwbGljYWJsZSBrZXkgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19OT19NQVRDSElOR19LRVkifX1jbGFzcyBmciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMiLHRoaXMubWVzc2FnZT0ibXVsdGlwbGUgbWF0Y2hpbmcga2V5cyBmb3VuZCBpbiB0aGUgSlNPTiBXZWIgS2V5IFNldCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMifX1jbGFzcyBwciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQiLHRoaXMubWVzc2FnZT0ic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEIn19ZnVuY3Rpb24gZ3IoKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgV2ViU29ja2V0UGFpcn1mdW5jdGlvbiB2cihlLHQ9ImFsZ29yaXRobS5uYW1lIil7cmV0dXJuIG5ldyBUeXBlRXJyb3IoYENyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBpdHMgJHt0fSBtdXN0IGJlICR7ZX1gKX1mdW5jdGlvbiB5cihlLHQpe3JldHVybiBlLm5hbWU9PT10fWZ1bmN0aW9uIG1yKGUpe3JldHVybiBwYXJzZUludChlLm5hbWUuc2xpY2UoNCksMTApfWZ1bmN0aW9uIHdyKGUsdCwuLi5uKXtzd2l0Y2godCl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6e2lmKCF5cihlLmFsZ29yaXRobSwiSE1BQyIpKXRocm93IHZyKCJITUFDIik7Y29uc3Qgbj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZihtcihlLmFsZ29yaXRobS5oYXNoKSE9PW4pdGhyb3cgdnIoYFNIQS0ke259YCwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjp7aWYoIXlyKGUuYWxnb3JpdGhtLCJSU0FTU0EtUEtDUzEtdjFfNSIpKXRocm93IHZyKCJSU0FTU0EtUEtDUzEtdjFfNSIpO2NvbnN0IG49cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYobXIoZS5hbGdvcml0aG0uaGFzaCkhPT1uKXRocm93IHZyKGBTSEEtJHtufWAsImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6e2lmKCF5cihlLmFsZ29yaXRobSwiUlNBLVBTUyIpKXRocm93IHZyKCJSU0EtUFNTIik7Y29uc3Qgbj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZihtcihlLmFsZ29yaXRobS5oYXNoKSE9PW4pdGhyb3cgdnIoYFNIQS0ke259YCwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIGdyKCkmJiJFZERTQSI6aWYoIXlyKGUuYWxnb3JpdGhtLCJOT0RFLUVEMjU1MTkiKSl0aHJvdyB2cigiTk9ERS1FRDI1NTE5Iik7YnJlYWs7Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6e2lmKCF5cihlLmFsZ29yaXRobSwiRUNEU0EiKSl0aHJvdyB2cigiRUNEU0EiKTtjb25zdCBuPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIkVTMjU2IjpyZXR1cm4iUC0yNTYiO2Nhc2UiRVMzODQiOnJldHVybiJQLTM4NCI7Y2FzZSJFUzUxMiI6cmV0dXJuIlAtNTIxIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGUiKX19KHQpO2lmKGUuYWxnb3JpdGhtLm5hbWVkQ3VydmUhPT1uKXRocm93IHZyKG4sImFsZ29yaXRobS5uYW1lZEN1cnZlIik7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiIpfSFmdW5jdGlvbihlLHQpe2lmKHQubGVuZ3RoJiYhdC5zb21lKCh0PT5lLnVzYWdlcy5pbmNsdWRlcyh0KSkpKXtsZXQgZT0iQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24sIGl0cyB1c2FnZXMgbXVzdCBpbmNsdWRlICI7aWYodC5sZW5ndGg+Mil7Y29uc3Qgbj10LnBvcCgpO2UrPWBvbmUgb2YgJHt0LmpvaW4oIiwgIil9LCBvciAke259LmB9ZWxzZSAyPT09dC5sZW5ndGg/ZSs9YG9uZSBvZiAke3RbMF19IG9yICR7dFsxXX0uYDplKz1gJHt0WzBdfS5gO3Rocm93IG5ldyBUeXBlRXJyb3IoZSl9fShlLG4pfXZhciBfcj0oZSwuLi50KT0+e2xldCBuPSJLZXkgbXVzdCBiZSAiO2lmKHQubGVuZ3RoPjIpe2NvbnN0IGU9dC5wb3AoKTtuKz1gb25lIG9mIHR5cGUgJHt0LmpvaW4oIiwgIil9LCBvciAke2V9LmB9ZWxzZSAyPT09dC5sZW5ndGg/bis9YG9uZSBvZiB0eXBlICR7dFswXX0gb3IgJHt0WzFdfS5gOm4rPWBvZiB0eXBlICR7dFswXX0uYDtyZXR1cm4gbnVsbD09ZT9uKz1gIFJlY2VpdmVkICR7ZX1gOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLm5hbWU/bis9YCBSZWNlaXZlZCBmdW5jdGlvbiAke2UubmFtZX1gOiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9ZSYmZS5jb25zdHJ1Y3RvciYmZS5jb25zdHJ1Y3Rvci5uYW1lJiYobis9YCBSZWNlaXZlZCBhbiBpbnN0YW5jZSBvZiAke2UuY29uc3RydWN0b3IubmFtZX1gKSxufSxTcj1lPT5lcihlKTtjb25zdCBicj1bIkNyeXB0b0tleSJdO2Z1bmN0aW9uIGtyKGUpe2lmKCJvYmplY3QiIT10eXBlb2YodD1lKXx8bnVsbD09PXR8fCJbb2JqZWN0IE9iamVjdF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXJldHVybiExO3ZhciB0O2lmKG51bGw9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpcmV0dXJuITA7bGV0IG49ZTtmb3IoO251bGwhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobik7KW49T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1ufWNvbnN0IEVyPWFzeW5jIGU9Pnt2YXIgdCxuO2NvbnN0e2FsZ29yaXRobTpyLGtleVVzYWdlczppfT1mdW5jdGlvbihlKXtsZXQgdCxuO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOnN3aXRjaChlLmFsZyl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6dD17bmFtZToiSE1BQyIsaGFzaDpgU0hBLSR7ZS5hbGcuc2xpY2UoLTMpfWB9LG49WyJzaWduIiwidmVyaWZ5Il07YnJlYWs7Y2FzZSJBMTI4Q0JDLUhTMjU2IjpjYXNlIkExOTJDQkMtSFMzODQiOmNhc2UiQTI1NkNCQy1IUzUxMiI6dGhyb3cgbmV3IGNyKGAke2UuYWxnfSBrZXlzIGNhbm5vdCBiZSBpbXBvcnRlZCBhcyBDcnlwdG9LZXkgaW5zdGFuY2VzYCk7Y2FzZSJBMTI4R0NNIjpjYXNlIkExOTJHQ00iOmNhc2UiQTI1NkdDTSI6Y2FzZSJBMTI4R0NNS1ciOmNhc2UiQTE5MkdDTUtXIjpjYXNlIkEyNTZHQ01LVyI6dD17bmFtZToiQUVTLUdDTSJ9LG49WyJlbmNyeXB0IiwiZGVjcnlwdCJdO2JyZWFrO2Nhc2UiQTEyOEtXIjpjYXNlIkExOTJLVyI6Y2FzZSJBMjU2S1ciOnQ9e25hbWU6IkFFUy1LVyJ9LG49WyJ3cmFwS2V5IiwidW53cmFwS2V5Il07YnJlYWs7Y2FzZSJQQkVTMi1IUzI1NitBMTI4S1ciOmNhc2UiUEJFUzItSFMzODQrQTE5MktXIjpjYXNlIlBCRVMyLUhTNTEyK0EyNTZLVyI6dD17bmFtZToiUEJLREYyIn0sbj1bImRlcml2ZUJpdHMiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBjcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJSU0EiOnN3aXRjaChlLmFsZyl7Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6dD17bmFtZToiUlNBLVBTUyIsaGFzaDpgU0hBLSR7ZS5hbGcuc2xpY2UoLTMpfWB9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6dD17bmFtZToiUlNBU1NBLVBLQ1MxLXYxXzUiLGhhc2g6YFNIQS0ke2UuYWxnLnNsaWNlKC0zKX1gfSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlNBLU9BRVAiOmNhc2UiUlNBLU9BRVAtMjU2IjpjYXNlIlJTQS1PQUVQLTM4NCI6Y2FzZSJSU0EtT0FFUC01MTIiOnQ9e25hbWU6IlJTQS1PQUVQIixoYXNoOmBTSEEtJHtwYXJzZUludChlLmFsZy5zbGljZSgtMyksMTApfHwxfWB9LG49ZS5kP1siZGVjcnlwdCIsInVud3JhcEtleSJdOlsiZW5jcnlwdCIsIndyYXBLZXkiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBjcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJFQyI6c3dpdGNoKGUuYWxnKXtjYXNlIkVTMjU2Ijp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0yNTYifSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRVMzODQiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTM4NCJ9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFUzUxMiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtNTIxIn0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVDREgtRVMiOmNhc2UiRUNESC1FUytBMTI4S1ciOmNhc2UiRUNESC1FUytBMTkyS1ciOmNhc2UiRUNESC1FUytBMjU2S1ciOnQ9e25hbWU6IkVDREgiLG5hbWVkQ3VydmU6ZS5jcnZ9LG49ZS5kP1siZGVyaXZlQml0cyJdOltdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGNyKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIGdyKCkmJiJPS1AiOmlmKCJFZERTQSIhPT1lLmFsZyl0aHJvdyBuZXcgY3IoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpO2lmKCJFZDI1NTE5IiE9PWUuY3J2KXRocm93IG5ldyBjcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImNydiIgKFN1YnR5cGUgb2YgS2V5IFBhaXIpIFBhcmFtZXRlciB2YWx1ZScpO3Q9e25hbWU6Ik5PREUtRUQyNTUxOSIsbmFtZWRDdXJ2ZToiTk9ERS1FRDI1NTE5In0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBjcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX1yZXR1cm57YWxnb3JpdGhtOnQsa2V5VXNhZ2VzOm59fShlKSxvPVtyLG51bGwhPT0odD1lLmV4dCkmJnZvaWQgMCE9PXQmJnQsbnVsbCE9PShuPWUua2V5X29wcykmJnZvaWQgMCE9PW4/bjppXTtpZigiUEJLREYyIj09PXIubmFtZSlyZXR1cm4gUW4uc3VidGxlLmltcG9ydEtleSgicmF3IixycihlLmspLC4uLm8pO2NvbnN0IHM9ey4uLmV9O3JldHVybiBkZWxldGUgcy5hbGcsUW4uc3VidGxlLmltcG9ydEtleSgiandrIixzLC4uLm8pfTtjb25zdCBUcj0oZSx0LG4pPT57ZS5zdGFydHNXaXRoKCJIUyIpfHwiZGlyIj09PWV8fGUuc3RhcnRzV2l0aCgiUEJFUzIiKXx8L15BXGR7M30oPzpHQ00pP0tXJC8udGVzdChlKT8oZT0+e2lmKCEoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXtpZighU3IoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihfcihlLC4uLmJyLCJVaW50OEFycmF5IikpO2lmKCJzZWNyZXQiIT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7YnIuam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIHN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3QgYmUgb2YgdHlwZSAic2VjcmV0ImApfX0pKHQpOigoZSx0KT0+e2lmKCFTcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKF9yKGUsLi4uYnIpKTtpZigic2VjcmV0Ij09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2JyLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobXMgbXVzdCBub3QgYmUgb2YgdHlwZSAic2VjcmV0ImApO2lmKCJzaWduIj09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7YnIuam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIHNpZ25pbmcgbXVzdCBiZSBvZiB0eXBlICJwcml2YXRlImApO2lmKCJkZWNyeXB0Ij09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7YnIuam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIGRlY3J5cHRpb24gbXVzdCBiZSBvZiB0eXBlICJwcml2YXRlImApO2lmKGUuYWxnb3JpdGhtJiYidmVyaWZ5Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2JyLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSB2ZXJpZnlpbmcgbXVzdCBiZSBvZiB0eXBlICJwdWJsaWMiYCk7aWYoZS5hbGdvcml0aG0mJiJlbmNyeXB0Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2JyLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBlbmNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHVibGljImApfSkodCxuKX07Y29uc3QgUnI9YXN5bmMoZSx0LG4scik9Pntjb25zdCBpPWF3YWl0IGZ1bmN0aW9uKGUsdCxuKXtpZihlcih0KSlyZXR1cm4gd3IodCxlLG4pLHQ7aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKCFlLnN0YXJ0c1dpdGgoIkhTIikpdGhyb3cgbmV3IFR5cGVFcnJvcihfcih0LC4uLmJyKSk7cmV0dXJuIFFuLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCx7aGFzaDpgU0hBLSR7ZS5zbGljZSgtMyl9YCxuYW1lOiJITUFDIn0sITEsW25dKX10aHJvdyBuZXcgVHlwZUVycm9yKF9yKHQsLi4uYnIsIlVpbnQ4QXJyYXkiKSl9KGUsdCwidmVyaWZ5Iik7KChlLHQpPT57aWYoZS5zdGFydHNXaXRoKCJSUyIpfHxlLnN0YXJ0c1dpdGgoIlBTIikpe2NvbnN0e21vZHVsdXNMZW5ndGg6bn09dC5hbGdvcml0aG07aWYoIm51bWJlciIhPXR5cGVvZiBufHxuPDIwNDgpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlfSByZXF1aXJlcyBrZXkgbW9kdWx1c0xlbmd0aCB0byBiZSAyMDQ4IGJpdHMgb3IgbGFyZ2VyYCl9fSkoZSxpKTtjb25zdCBvPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1gU0hBLSR7ZS5zbGljZSgtMyl9YDtzd2l0Y2goZSl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJITUFDIn07Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOmUuc2xpY2UoLTMpPj4zfTtjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjpyZXR1cm57aGFzaDpuLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZTp0Lm5hbWVkQ3VydmV9O2Nhc2UgZ3IoKSYmIkVkRFNBIjpjb25zdHtuYW1lZEN1cnZlOnJ9PXQ7cmV0dXJue25hbWU6cixuYW1lZEN1cnZlOnJ9O2RlZmF1bHQ6dGhyb3cgbmV3IGNyKGBhbGcgJHtlfSBpcyBub3Qgc3VwcG9ydGVkIGVpdGhlciBieSBKT1NFIG9yIHlvdXIgamF2YXNjcmlwdCBydW50aW1lYCl9fShlLGkuYWxnb3JpdGhtKTt0cnl7cmV0dXJuIGF3YWl0IFFuLnN1YnRsZS52ZXJpZnkobyxpLG4scil9Y2F0Y2goZSl7cmV0dXJuITF9fTthc3luYyBmdW5jdGlvbiBBcihlLHQsbil7dmFyIHI7aWYoIWtyKGUpKXRocm93IG5ldyB1cigiRmxhdHRlbmVkIEpXUyBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKHZvaWQgMD09PWUucHJvdGVjdGVkJiZ2b2lkIDA9PT1lLmhlYWRlcil0aHJvdyBuZXcgdXIoJ0ZsYXR0ZW5lZCBKV1MgbXVzdCBoYXZlIGVpdGhlciBvZiB0aGUgInByb3RlY3RlZCIgb3IgImhlYWRlciIgbWVtYmVycycpO2lmKHZvaWQgMCE9PWUucHJvdGVjdGVkJiYic3RyaW5nIiE9dHlwZW9mIGUucHJvdGVjdGVkKXRocm93IG5ldyB1cigiSldTIFByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDA9PT1lLnBheWxvYWQpdGhyb3cgbmV3IHVyKCJKV1MgUGF5bG9hZCBtaXNzaW5nIik7aWYoInN0cmluZyIhPXR5cGVvZiBlLnNpZ25hdHVyZSl0aHJvdyBuZXcgdXIoIkpXUyBTaWduYXR1cmUgbWlzc2luZyBvciBpbmNvcnJlY3QgdHlwZSIpO2lmKHZvaWQgMCE9PWUuaGVhZGVyJiYha3IoZS5oZWFkZXIpKXRocm93IG5ldyB1cigiSldTIFVucHJvdGVjdGVkIEhlYWRlciBpbmNvcnJlY3QgdHlwZSIpO2xldCBpPXt9O2lmKGUucHJvdGVjdGVkKXtjb25zdCB0PXJyKGUucHJvdGVjdGVkKTt0cnl7aT1KU09OLnBhcnNlKG5yLmRlY29kZSh0KSl9Y2F0Y2goZSl7dGhyb3cgbmV3IHVyKCJKV1MgUHJvdGVjdGVkIEhlYWRlciBpcyBpbnZhbGlkIil9fWlmKCEoKC4uLmUpPT57Y29uc3QgdD1lLmZpbHRlcihCb29sZWFuKTtpZigwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aClyZXR1cm4hMDtsZXQgbjtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PU9iamVjdC5rZXlzKGUpO2lmKG4mJjAhPT1uLnNpemUpZm9yKGNvbnN0IGUgb2YgdCl7aWYobi5oYXMoZSkpcmV0dXJuITE7bi5hZGQoZSl9ZWxzZSBuPW5ldyBTZXQodCl9cmV0dXJuITB9KShpLGUuaGVhZGVyKSl0aHJvdyBuZXcgdXIoIkpXUyBQcm90ZWN0ZWQgYW5kIEpXUyBVbnByb3RlY3RlZCBIZWFkZXIgUGFyYW1ldGVyIG5hbWVzIG11c3QgYmUgZGlzam9pbnQiKTtjb25zdCBvPXsuLi5pLC4uLmUuaGVhZGVyfSxzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodm9pZCAwIT09aS5jcml0JiZ2b2lkIDA9PT1yLmNyaXQpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJyk7aWYoIXJ8fHZvaWQgMD09PXIuY3JpdClyZXR1cm4gbmV3IFNldDtpZighQXJyYXkuaXNBcnJheShyLmNyaXQpfHwwPT09ci5jcml0Lmxlbmd0aHx8ci5jcml0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKSkpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgc3RyaW5ncyB3aGVuIHByZXNlbnQnKTtsZXQgbztvPXZvaWQgMCE9PW4/bmV3IE1hcChbLi4uT2JqZWN0LmVudHJpZXMobiksLi4udC5lbnRyaWVzKCldKTp0O2Zvcihjb25zdCB0IG9mIHIuY3JpdCl7aWYoIW8uaGFzKHQpKXRocm93IG5ldyBjcihgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7dH0iIGlzIG5vdCByZWNvZ25pemVkYCk7aWYodm9pZCAwPT09aVt0XSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7dH0iIGlzIG1pc3NpbmdgKTtpZihvLmdldCh0KSYmdm9pZCAwPT09clt0XSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7dH0iIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZGApfXJldHVybiBuZXcgU2V0KHIuY3JpdCl9KHVyLG5ldyBNYXAoW1siYjY0IiwhMF1dKSxudWxsPT1uP3ZvaWQgMDpuLmNyaXQsaSxvKTtsZXQgYT0hMDtpZihzLmhhcygiYjY0IikmJihhPWkuYjY0LCJib29sZWFuIiE9dHlwZW9mIGEpKXRocm93IG5ldyB1cignVGhlICJiNjQiIChiYXNlNjR1cmwtZW5jb2RlIHBheWxvYWQpIEhlYWRlciBQYXJhbWV0ZXIgbXVzdCBiZSBhIGJvb2xlYW4nKTtjb25zdHthbGc6Y309bztpZigic3RyaW5nIiE9dHlwZW9mIGN8fCFjKXRocm93IG5ldyB1cignSldTICJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbWlzc2luZyBvciBpbnZhbGlkJyk7Y29uc3QgdT1uJiYoKGUsdCk9PntpZih2b2lkIDAhPT10JiYoIUFycmF5LmlzQXJyYXkodCl8fHQuc29tZSgoZT0+InN0cmluZyIhPXR5cGVvZiBlKSkpKXRocm93IG5ldyBUeXBlRXJyb3IoYCIke2V9IiBvcHRpb24gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7aWYodClyZXR1cm4gbmV3IFNldCh0KX0pKCJhbGdvcml0aG1zIixuLmFsZ29yaXRobXMpO2lmKHUmJiF1LmhhcyhjKSl0aHJvdyBuZXcgYXIoJyJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbm90IGFsbG93ZWQnKTtpZihhKXtpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCl0aHJvdyBuZXcgdXIoIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmciKX1lbHNlIGlmKCJzdHJpbmciIT10eXBlb2YgZS5wYXlsb2FkJiYhKGUucGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXRocm93IG5ldyB1cigiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBVaW50OEFycmF5IGluc3RhbmNlIik7bGV0IGw9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PWF3YWl0IHQoaSxlKSxsPSEwKSxUcihjLHQsInZlcmlmeSIpO2NvbnN0IGQ9ZnVuY3Rpb24oLi4uZSl7Y29uc3QgdD1lLnJlZHVjZSgoKGUse2xlbmd0aDp0fSk9PmUrdCksMCksbj1uZXcgVWludDhBcnJheSh0KTtsZXQgcj0wO3JldHVybiBlLmZvckVhY2goKGU9PntuLnNldChlLHIpLHIrPWUubGVuZ3RofSkpLG59KHRyLmVuY29kZShudWxsIT09KHI9ZS5wcm90ZWN0ZWQpJiZ2b2lkIDAhPT1yP3I6IiIpLHRyLmVuY29kZSgiLiIpLCJzdHJpbmciPT10eXBlb2YgZS5wYXlsb2FkP3RyLmVuY29kZShlLnBheWxvYWQpOmUucGF5bG9hZCksaD1ycihlLnNpZ25hdHVyZSk7aWYoIWF3YWl0IFJyKGMsdCxoLGQpKXRocm93IG5ldyBwcjtsZXQgZjtmPWE/cnIoZS5wYXlsb2FkKToic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD90ci5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQ7Y29uc3QgcD17cGF5bG9hZDpmfTtyZXR1cm4gdm9pZCAwIT09ZS5wcm90ZWN0ZWQmJihwLnByb3RlY3RlZEhlYWRlcj1pKSx2b2lkIDAhPT1lLmhlYWRlciYmKHAudW5wcm90ZWN0ZWRIZWFkZXI9ZS5oZWFkZXIpLGw/ey4uLnAsa2V5OnR9OnB9Y29uc3QgQ3I9ODY0MDAsRHI9L14oXGQrfFxkK1wuXGQrKSA/KHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSkkL2k7dmFyIFByPWU9Pntjb25zdCB0PURyLmV4ZWMoZSk7aWYoIXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCB0aW1lIHBlcmlvZCBmb3JtYXQiKTtjb25zdCBuPXBhcnNlRmxvYXQodFsxXSk7c3dpdGNoKHRbMl0udG9Mb3dlckNhc2UoKSl7Y2FzZSJzZWMiOmNhc2Uic2VjcyI6Y2FzZSJzZWNvbmQiOmNhc2Uic2Vjb25kcyI6Y2FzZSJzIjpyZXR1cm4gTWF0aC5yb3VuZChuKTtjYXNlIm1pbnV0ZSI6Y2FzZSJtaW51dGVzIjpjYXNlIm1pbiI6Y2FzZSJtaW5zIjpjYXNlIm0iOnJldHVybiBNYXRoLnJvdW5kKDYwKm4pO2Nhc2UiaG91ciI6Y2FzZSJob3VycyI6Y2FzZSJociI6Y2FzZSJocnMiOmNhc2UiaCI6cmV0dXJuIE1hdGgucm91bmQoMzYwMCpuKTtjYXNlImRheSI6Y2FzZSJkYXlzIjpjYXNlImQiOnJldHVybiBNYXRoLnJvdW5kKG4qQ3IpO2Nhc2Uid2VlayI6Y2FzZSJ3ZWVrcyI6Y2FzZSJ3IjpyZXR1cm4gTWF0aC5yb3VuZCg2MDQ4MDAqbik7ZGVmYXVsdDpyZXR1cm4gTWF0aC5yb3VuZCgzMTU1NzYwMCpuKX19O2NvbnN0IElyPWU9PmUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eYXBwbGljYXRpb25cLy8sIiIpO3ZhciBPcj0oZSx0LG49e30pPT57Y29uc3R7dHlwOnJ9PW47aWYociYmKCJzdHJpbmciIT10eXBlb2YgZS50eXB8fElyKGUudHlwKSE9PUlyKHIpKSl0aHJvdyBuZXcgb3IoJ3VuZXhwZWN0ZWQgInR5cCIgSldUIGhlYWRlciB2YWx1ZScsInR5cCIsImNoZWNrX2ZhaWxlZCIpO2xldCBpO3RyeXtpPUpTT04ucGFyc2UobnIuZGVjb2RlKHQpKX1jYXRjaChlKXt9aWYoIWtyKGkpKXRocm93IG5ldyBscigiSldUIENsYWltcyBTZXQgbXVzdCBiZSBhIHRvcC1sZXZlbCBKU09OIG9iamVjdCIpO2NvbnN0e2lzc3VlcjpvfT1uO2lmKG8mJiEoQXJyYXkuaXNBcnJheShvKT9vOltvXSkuaW5jbHVkZXMoaS5pc3MpKXRocm93IG5ldyBvcigndW5leHBlY3RlZCAiaXNzIiBjbGFpbSB2YWx1ZScsImlzcyIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e3N1YmplY3Q6c309bjtpZihzJiZpLnN1YiE9PXMpdGhyb3cgbmV3IG9yKCd1bmV4cGVjdGVkICJzdWIiIGNsYWltIHZhbHVlJywic3ViIiwiY2hlY2tfZmFpbGVkIik7Y29uc3R7YXVkaWVuY2U6YX09bjtpZihhJiYoYz1pLmF1ZCx1PSJzdHJpbmciPT10eXBlb2YgYT9bYV06YSwhKCJzdHJpbmciPT10eXBlb2YgYz91LmluY2x1ZGVzKGMpOkFycmF5LmlzQXJyYXkoYykmJnUuc29tZShTZXQucHJvdG90eXBlLmhhcy5iaW5kKG5ldyBTZXQoYykpKSkpKXRocm93IG5ldyBvcigndW5leHBlY3RlZCAiYXVkIiBjbGFpbSB2YWx1ZScsImF1ZCIsImNoZWNrX2ZhaWxlZCIpO3ZhciBjLHU7bGV0IGw7c3dpdGNoKHR5cGVvZiBuLmNsb2NrVG9sZXJhbmNlKXtjYXNlInN0cmluZyI6bD1QcihuLmNsb2NrVG9sZXJhbmNlKTticmVhaztjYXNlIm51bWJlciI6bD1uLmNsb2NrVG9sZXJhbmNlO2JyZWFrO2Nhc2UidW5kZWZpbmVkIjpsPTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNsb2NrVG9sZXJhbmNlIG9wdGlvbiB0eXBlIil9Y29uc3R7Y3VycmVudERhdGU6ZH09bixoPShmPWR8fG5ldyBEYXRlLE1hdGguZmxvb3IoZi5nZXRUaW1lKCkvMWUzKSk7dmFyIGY7aWYoKHZvaWQgMCE9PWkuaWF0fHxuLm1heFRva2VuQWdlKSYmIm51bWJlciIhPXR5cGVvZiBpLmlhdCl0aHJvdyBuZXcgb3IoJyJpYXQiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJpYXQiLCJpbnZhbGlkIik7aWYodm9pZCAwIT09aS5uYmYpe2lmKCJudW1iZXIiIT10eXBlb2YgaS5uYmYpdGhyb3cgbmV3IG9yKCcibmJmIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywibmJmIiwiaW52YWxpZCIpO2lmKGkubmJmPmgrbCl0aHJvdyBuZXcgb3IoJyJuYmYiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQnLCJuYmYiLCJjaGVja19mYWlsZWQiKX1pZih2b2lkIDAhPT1pLmV4cCl7aWYoIm51bWJlciIhPXR5cGVvZiBpLmV4cCl0aHJvdyBuZXcgb3IoJyJleHAiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJleHAiLCJpbnZhbGlkIik7aWYoaS5leHA8PWgtbCl0aHJvdyBuZXcgc3IoJyJleHAiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQnLCJleHAiLCJjaGVja19mYWlsZWQiKX1pZihuLm1heFRva2VuQWdlKXtjb25zdCBlPWgtaS5pYXQ7aWYoZS1sPigibnVtYmVyIj09dHlwZW9mIG4ubWF4VG9rZW5BZ2U/bi5tYXhUb2tlbkFnZTpQcihuLm1heFRva2VuQWdlKSkpdGhyb3cgbmV3IHNyKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkICh0b28gZmFyIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpO2lmKGU8MC1sKXRocm93IG5ldyBvcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAoaXQgc2hvdWxkIGJlIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpfXJldHVybiBpfTthc3luYyBmdW5jdGlvbiBVcihlLHQsbil7dmFyIHI7Y29uc3QgaT1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQsbil7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJihlPW5yLmRlY29kZShlKSksInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyB1cigiQ29tcGFjdCBKV1MgbXVzdCBiZSBhIHN0cmluZyBvciBVaW50OEFycmF5Iik7Y29uc3R7MDpyLDE6aSwyOm8sbGVuZ3RoOnN9PWUuc3BsaXQoIi4iKTtpZigzIT09cyl0aHJvdyBuZXcgdXIoIkludmFsaWQgQ29tcGFjdCBKV1MiKTtjb25zdCBhPWF3YWl0IEFyKHtwYXlsb2FkOmkscHJvdGVjdGVkOnIsc2lnbmF0dXJlOm99LHQsbiksYz17cGF5bG9hZDphLnBheWxvYWQscHJvdGVjdGVkSGVhZGVyOmEucHJvdGVjdGVkSGVhZGVyfTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD97Li4uYyxrZXk6YS5rZXl9OmN9KGUsdCxuKTtpZigobnVsbD09PShyPWkucHJvdGVjdGVkSGVhZGVyLmNyaXQpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmluY2x1ZGVzKCJiNjQiKSkmJiExPT09aS5wcm90ZWN0ZWRIZWFkZXIuYjY0KXRocm93IG5ldyBscigiSldUcyBNVVNUIE5PVCB1c2UgdW5lbmNvZGVkIHBheWxvYWQiKTtjb25zdCBvPXtwYXlsb2FkOk9yKGkucHJvdGVjdGVkSGVhZGVyLGkucGF5bG9hZCxuKSxwcm90ZWN0ZWRIZWFkZXI6aS5wcm90ZWN0ZWRIZWFkZXJ9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3suLi5vLGtleTppLmtleX06b31mdW5jdGlvbiBMcihlKXtyZXR1cm4ga3IoZSl9Y2xhc3MgSHJ7Y29uc3RydWN0b3IoZSl7aWYodGhpcy5fY2FjaGVkPW5ldyBXZWFrTWFwLCFmdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZBcnJheS5pc0FycmF5KGUua2V5cykmJmUua2V5cy5ldmVyeShMcil9KGUpKXRocm93IG5ldyBkcigiSlNPTiBXZWIgS2V5IFNldCBtYWxmb3JtZWQiKTt2YXIgdDt0aGlzLl9qd2tzPSh0PWUsImZ1bmN0aW9uIj09dHlwZW9mIHN0cnVjdHVyZWRDbG9uZT9zdHJ1Y3R1cmVkQ2xvbmUodCk6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0KSkpfWFzeW5jIGdldEtleShlLHQpe2NvbnN0e2FsZzpuLGtpZDpyfT17Li4uZSwuLi50LmhlYWRlcn0saT1mdW5jdGlvbihlKXtzd2l0Y2goInN0cmluZyI9PXR5cGVvZiBlJiZlLnNsaWNlKDAsMikpe2Nhc2UiUlMiOmNhc2UiUFMiOnJldHVybiJSU0EiO2Nhc2UiRVMiOnJldHVybiJFQyI7Y2FzZSJFZCI6cmV0dXJuIk9LUCI7ZGVmYXVsdDp0aHJvdyBuZXcgY3IoJ1Vuc3VwcG9ydGVkICJhbGciIHZhbHVlIGZvciBhIEpTT04gV2ViIEtleSBTZXQnKX19KG4pLG89dGhpcy5fandrcy5rZXlzLmZpbHRlcigoZT0+e2xldCB0PWk9PT1lLmt0eTtpZih0JiYic3RyaW5nIj09dHlwZW9mIHImJih0PXI9PT1lLmtpZCksdCYmInN0cmluZyI9PXR5cGVvZiBlLmFsZyYmKHQ9bj09PWUuYWxnKSx0JiYic3RyaW5nIj09dHlwZW9mIGUudXNlJiYodD0ic2lnIj09PWUudXNlKSx0JiZBcnJheS5pc0FycmF5KGUua2V5X29wcykmJih0PWUua2V5X29wcy5pbmNsdWRlcygidmVyaWZ5IikpLHQmJiJFZERTQSI9PT1uJiYodD0iRWQyNTUxOSI9PT1lLmNydnx8IkVkNDQ4Ij09PWUuY3J2KSx0KXN3aXRjaChuKXtjYXNlIkVTMjU2Ijp0PSJQLTI1NiI9PT1lLmNydjticmVhaztjYXNlIkVTMjU2SyI6dD0ic2VjcDI1NmsxIj09PWUuY3J2O2JyZWFrO2Nhc2UiRVMzODQiOnQ9IlAtMzg0Ij09PWUuY3J2O2JyZWFrO2Nhc2UiRVM1MTIiOnQ9IlAtNTIxIj09PWUuY3J2fXJldHVybiB0fSkpLHswOnMsbGVuZ3RoOmF9PW87aWYoMD09PWEpdGhyb3cgbmV3IGhyO2lmKDEhPT1hKXRocm93IG5ldyBmcjtjb25zdCBjPXRoaXMuX2NhY2hlZC5nZXQocyl8fHRoaXMuX2NhY2hlZC5zZXQocyx7fSkuZ2V0KHMpO2lmKHZvaWQgMD09PWNbbl0pe2NvbnN0IGU9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LG4pe2lmKCFrcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJKV0sgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih0fHwodD1lLmFsZyksInN0cmluZyIhPXR5cGVvZiB0fHwhdCl0aHJvdyBuZXcgVHlwZUVycm9yKCciYWxnIiBhcmd1bWVudCBpcyByZXF1aXJlZCB3aGVuICJqd2suYWxnIiBpcyBub3QgcHJlc2VudCcpO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOmlmKCJzdHJpbmciIT10eXBlb2YgZS5rfHwhZS5rKXRocm93IG5ldyBUeXBlRXJyb3IoJ21pc3NpbmcgImsiIChLZXkgVmFsdWUpIFBhcmFtZXRlciB2YWx1ZScpO3JldHVybiBudWxsIT1ufHwobj0hMCE9PWUuZXh0KSxuP0VyKHsuLi5lLGFsZzp0LGV4dDohMX0pOnJyKGUuayk7Y2FzZSJSU0EiOmlmKHZvaWQgMCE9PWUub3RoKXRocm93IG5ldyBjcignUlNBIEpXSyAib3RoIiAoT3RoZXIgUHJpbWVzIEluZm8pIFBhcmFtZXRlciB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkJyk7Y2FzZSJFQyI6Y2FzZSJPS1AiOnJldHVybiBFcih7Li4uZSxhbGc6dH0pO2RlZmF1bHQ6dGhyb3cgbmV3IGNyKCdVbnN1cHBvcnRlZCAia3R5IiAoS2V5IFR5cGUpIFBhcmFtZXRlciB2YWx1ZScpfX0oey4uLnMsZXh0OiEwfSxuKTtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheXx8InB1YmxpYyIhPT1lLnR5cGUpdGhyb3cgbmV3IGRyKCJKU09OIFdlYiBLZXkgU2V0IG1lbWJlcnMgbXVzdCBiZSBwdWJsaWMga2V5cyIpO2Nbbl09ZX1yZXR1cm4gY1tuXX19dmFyIE1yPXtleHBvcnRzOnt9fSxqcj17ZXhwb3J0czp7fX0scXI9UCh4bik7IWZ1bmN0aW9uKGUsdCl7dmFyIG49cXIscj1uLkJ1ZmZlcjtmdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dfWZ1bmN0aW9uIG8oZSx0LG4pe3JldHVybiByKGUsdCxuKX1yLmZyb20mJnIuYWxsb2MmJnIuYWxsb2NVbnNhZmUmJnIuYWxsb2NVbnNhZmVTbG93P2UuZXhwb3J0cz1uOihpKG4sdCksdC5CdWZmZXI9byksby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksaShyLG8pLG8uZnJvbT1mdW5jdGlvbihlLHQsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIoZSx0LG4pfSxvLmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPXIoZSk7cmV0dXJuIHZvaWQgMCE9PXQ/InN0cmluZyI9PXR5cGVvZiBuP2kuZmlsbCh0LG4pOmkuZmlsbCh0KTppLmZpbGwoMCksaX0sby5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByKGUpfSxvLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBuLlNsb3dCdWZmZXIoZSl9fShqcixqci5leHBvcnRzKTt2YXIgTnI9NjU1MzYseHI9NDI5NDk2NzI5NTt2YXIgS3I9anIuZXhwb3J0cy5CdWZmZXIsQnI9Qy5jcnlwdG98fEMubXNDcnlwdG87QnImJkJyLmdldFJhbmRvbVZhbHVlcz9Nci5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoZT54cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigicmVxdWVzdGVkIHRvbyBtYW55IHJhbmRvbSBieXRlcyIpO3ZhciBuPUtyLmFsbG9jVW5zYWZlKGUpO2lmKGU+MClpZihlPk5yKWZvcih2YXIgcj0wO3I8ZTtyKz1OcilCci5nZXRSYW5kb21WYWx1ZXMobi5zbGljZShyLHIrTnIpKTtlbHNlIEJyLmdldFJhbmRvbVZhbHVlcyhuKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gX2UubmV4dFRpY2soKGZ1bmN0aW9uKCl7dChudWxsLG4pfSkpO3JldHVybiBufTpNci5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfTt2YXIgSnI9TXIuZXhwb3J0cztjbGFzcyBGcntiYXNlNjRVUkxFbmNvZGUoZSl7cmV0dXJuIEduLmVuY29kZShlKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpLnJlcGxhY2UoLz0vZywiIil9YmFzZTY0VVJMRGVjb2RlKGUpe3JldHVybiBHbi5kZWNvZGUoZSkudG9TdHJpbmcoKX1oYXNoU2hhMjU2KGUpe3JldHVybiBlbi5mcm9tKFpuKChuZXcgVGV4dEVuY29kZXIpLmVuY29kZShlKSkpfWdlbmVyYXRlUmFuZG9tQnl0ZXMoZSl7cmV0dXJuIEpyKGUpfXZlcmlmeUp3dChlLHQsbixyLGksbyxzLGEpe2NvbnN0IHU9e2FsZ29yaXRobXM6bixhdWRpZW5jZTpyLGNsb2NrVG9sZXJhbmNlOnMsc3ViamVjdDpvfTtyZXR1cm4obnVsbD09YXx8YSkmJih1Lmlzc3Vlcj1pKSxVcihlLChsPXtrZXlzOlt0XX0sSHIucHJvdG90eXBlLmdldEtleS5iaW5kKG5ldyBIcihsKSkpLHUpLnRoZW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoITApKSkuY2F0Y2goKGU9Pnt2YXIgdDtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1DUllQVE8tVVRJTFMtVkotSVYwMSIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUucmVhc29uKSYmdm9pZCAwIT09dD90OkpTT04uc3RyaW5naWZ5KGUpLGAke251bGw9PWU/dm9pZCAwOmUuY29kZX0gJHtudWxsPT1lP3ZvaWQgMDplLmNsYWltfWApKX0pKTt2YXIgbH19KHQ9Pntjb25zdCBuPXNlbGY7bGV0IHI7bi5vbm1lc3NhZ2U9KHtkYXRhOm4scG9ydHM6YX0pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgdSxsLGQsaCxmLHA7Y29uc3QgeT1hWzBdO2lmKG4udHlwZT09PXZ8fHIpc3dpdGNoKG4udHlwZSl7Y2FzZSB2OnRyeXtjb25zdCBhPU9iamVjdC5hc3NpZ24oe30sbi5kYXRhKTtyPXlpZWxkKCh0LG4pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPW5ldyBOdCxpPW5ldyBGcixvPW5ldyBnO3lpZWxkIG8uaW5pdGlhbGl6ZSh0LHIsaSk7Y29uc3Qgcz1uZXcgQShvKSxhPW4obyxzKSxjPW8uZ2V0RGF0YUxheWVyKCksdT1xdC5nZXRJbnN0YW5jZSgpO3JldHVybihudWxsPT11P3ZvaWQgMDp1LmluaXQpJiYoeWllbGQgdS5pbml0KCEwLCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCBhLmF0dGFjaFRva2VuVG9SZXF1ZXN0Q29uZmlnKHQpfSkpKSkpLHtkaXNhYmxlSHR0cEhhbmRsZXI6KCk9PnthLmRpc2FibGVIdHRwSGFuZGxlcih1KX0sZW5hYmxlSHR0cEhhbmRsZXI6KCk9PnthLmVuYWJsZUh0dHBIYW5kbGVyKHUpfSxnZXRBY2Nlc3NUb2tlbjooKT0+YS5nZXRBY2Nlc3NUb2tlbigpLGdldEF1dGhvcml6YXRpb25VUkw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG8uZ2V0QXV0aG9yaXphdGlvblVSTCh0KS50aGVuKCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZTtjb25zdCBuPW51bGwhPT0oZT1uZXcgVVJMKHQpLnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIikpJiZ2b2lkIDAhPT1lP2U6IiIscj15aWVsZCBvLmdldFBLQ0VDb2RlKG4pO3JldHVybnthdXRob3JpemF0aW9uVVJMOnQscGtjZTpyfX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpfSkpLGdldEJhc2ljVXNlckluZm86KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldEJhc2ljVXNlckluZm8oKX0pKSxnZXRDb25maWdEYXRhOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYy5nZXRDb25maWdEYXRhKCl9KSksZ2V0Q3J5cHRvSGVscGVyOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRDcnlwdG9IZWxwZXIoKX0pKSxnZXREZWNvZGVkSURQSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEUElEVG9rZW4oKX0pKSxnZXREZWNvZGVkSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKSxnZXRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRJRFRva2VuKCl9KSksZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHM6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSksZ2V0U2lnbk91dFVSTDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLGh0dHBSZXF1ZXN0OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBhLmh0dHBSZXF1ZXN0KHUsdCl9KSksaHR0cFJlcXVlc3RBbGw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGEuaHR0cFJlcXVlc3RBbGwodCx1KX0pKSxpc0F1dGhlbnRpY2F0ZWQ6KCk9PmEuaXNBdXRoZW50aWNhdGVkKCkscmVmcmVzaEFjY2Vzc1Rva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7cmV0dXJuIHlpZWxkIGEucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfX0pKSxyZXF1ZXN0QWNjZXNzVG9rZW46KHQsbixyLGkpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0QWNjZXNzVG9rZW4odCxuLHZvaWQgMCxyLGkpfSkpLHJlcXVlc3RDdXN0b21HcmFudDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0Q3VzdG9tR3JhbnQodCl9KSkscmV2b2tlQWNjZXNzVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgcy5nZXRSZWZyZXNoVGltZW91dFRpbWVyKCk7cmV0dXJuIG8ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KHMuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KGUpLFByb21pc2UucmVzb2x2ZSghMCkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjazplPT57KG51bGw9PXU/dm9pZCAwOnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaykmJnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrOmU9PnsobnVsbD09dT92b2lkIDA6dS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2spJiZ1LnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s6ZT0+eyhudWxsPT11P3ZvaWQgMDp1LnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKSYmdS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKX0sc2V0U2Vzc2lvblN0YXRlOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIGMuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLHQpfSkpLHNpZ25PdXQ6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBzLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLHN0YXJ0QXV0b1JlZnJlc2hUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cy5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSxzLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoYSl9KSksdXBkYXRlQ29uZmlnOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIG8udXBkYXRlQ29uZmlnKHQpfSkpfX0pKSkoYSx0KSxyLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2socyksci5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soaSksci5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhvKSx5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfYXV0aF91cmwiOnIuZ2V0QXV0aG9yaXphdGlvblVSTChudWxsPT1uP3ZvaWQgMDpuLmRhdGEpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJyZXF1ZXN0X2dldF90b2tlbiI6ci5yZXF1ZXN0QWNjZXNzVG9rZW4obnVsbD09PSh1PW51bGw9PW4/dm9pZCAwOm4uZGF0YSl8fHZvaWQgMD09PXU/dm9pZCAwOnUuY29kZSxudWxsPT09KGw9bnVsbD09bj92b2lkIDA6bi5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zZXNzaW9uU3RhdGUsbnVsbD09PShkPW51bGw9PW4/dm9pZCAwOm4uZGF0YSl8fHZvaWQgMD09PWQ/dm9pZCAwOmQucGtjZSxudWxsPT09KGg9bnVsbD09bj92b2lkIDA6bi5kYXRhKXx8dm9pZCAwPT09aD92b2lkIDA6aC5zdGF0ZSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlImh0dHAtcmVxdWVzdCI6e2NvbnN0IGU9bi5kYXRhLHQ9bnVsbD09ZT92b2lkIDA6ZS5kYXRhO2lmKCEwPT09KG51bGw9PT0ocD1udWxsPT09KGY9bi5kYXRhKXx8dm9pZCAwPT09Zj92b2lkIDA6Zi5kYXRhKXx8dm9pZCAwPT09cD92b2lkIDA6cC5mb3JtRGF0YSkpe2NvbnN0IG49bmV3IEZvcm1EYXRhO2Zvcihjb25zdCBlIGluIHQpImZvcm1EYXRhIiE9PWUmJm4uYXBwZW5kKGUsdFtlXSk7ZS5kYXRhPW59ci5odHRwUmVxdWVzdChlKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrfWNhc2UiaHR0cC1yZXF1ZXN0LWFsbCI6ci5odHRwUmVxdWVzdEFsbChuLmRhdGEpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJzaWduLW91dCI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuc2lnbk91dCgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVxdWVzdC1jdXN0b20tZ3JhbnQiOnIucmVxdWVzdEN1c3RvbUdyYW50KG4uZGF0YSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInJldm9rZS1hY2Nlc3MtdG9rZW4iOnIucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiOnRyeXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtYmFzaWMtdXNlci1pbmZvIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRCYXNpY1VzZXJJbmZvKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtZGVjb2RlZC1pZC10b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0RGVjb2RlZElEVG9rZW4oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1jcnlwdG8taGVscGVyIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRDcnlwdG9IZWxwZXIoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9pZF90b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0SURUb2tlbigpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZW5hYmxlX2h0dHBfaGFuZGxlciI6ci5lbmFibGVIdHRwSGFuZGxlcigpLHkucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpO2JyZWFrO2Nhc2UiZGlzYWJsZV9odHRwX2hhbmRsZXIiOnIuZGlzYWJsZUh0dHBIYW5kbGVyKCkseS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJpc19hdXRoZW50aWNhdGVkIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5pc0F1dGhlbnRpY2F0ZWQoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9zaWduX291dF91cmwiOnRyeXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldFNpZ25PdXRVUkwoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlZnJlc2hfYWNjZXNzLXRva2VuIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5yZWZyZXNoQWNjZXNzVG9rZW4oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInN0YXJ0X2F1dG9fcmVmcmVzaF90b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHIuc3RhcnRBdXRvUmVmcmVzaFRva2VuKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzZXRfc2Vzc2lvbl9zdGF0ZSI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuc2V0U2Vzc2lvblN0YXRlKG51bGw9PW4/dm9pZCAwOm4uZGF0YSkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJ1cGRhdGVfY29uZmlnIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci51cGRhdGVDb25maWcobnVsbD09bj92b2lkIDA6bi5kYXRhKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9jb25maWdfZGF0YSI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0Q29uZmlnRGF0YSgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2RlZmF1bHQ6bnVsbD09eXx8eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IGMoIlNQQS1DTElFTlRfV09SS0VSLU9OTVNHLUlWMDIiLCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQuIixgVGhlIG1lc3NhZ2UgdHlwZSBwcm92aWRlZCwgJHtuLnR5cGV9LCBpcyBpbnZhbGlkLmApKSl9ZWxzZSB5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgYygiU1BBLUNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsIlRoZSB3ZWIgd29ya2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuIiwiVGhlIGluaXRpYWxpemUgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gY2FuIGJlIGNhcnJpZWQgb3V0LiIpKSl9KSk7Y29uc3QgaT0oKT0+e24ucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3Qtc3RhcnQifSl9LG89ZT0+e24ucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LHM9KCk9PntuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LWZpbmlzaCJ9KX19KSgoKGUsdCk9Pm5ldyBSKGUsdCkpKTtyZXR1cm57fX0oKTsKCg==",V=null,I=!1,function(e){return R=R||y(W,V,I),new Worker(R,e)});const g="init",v="sign-out",Y="http-request",K="http-request-all",N="request-custom-grant",f="revoke-access-token",J="request-start",C="request-success",k="request-finish",U="get-oidc-service-endpoints",L="get-basic-user-info",H="get-decoded-id-token",T="get-crypto-helper",F="enable_http_handler",w="disable_http_handler",x="get_auth_url",z="request_get_token",B="is_authenticated",P="get_sign_out_url",M="refresh_access-token",j="refresh-access-token-error",Q="set_session_state",E="start_auto_refresh_token",D="update_config",O="get_id_token",A="check_session_signed_in",_="check_session_signed_out",q="get_config_data",$="set_session_state_from_iframe";var ee;e.Storage=void 0,(ee=e.Storage||(e.Storage={})).LocalStorage="localStorage",ee.SessionStorage="sessionStorage",ee.WebWorker="webWorker",ee.BrowserMemory="browserMemory";const te="token_request_config";var le;e.Hooks=void 0,(le=e.Hooks||(e.Hooks={})).SignIn="sign-in",le.SignOut="sign-out",le.Initialize="initialize",le.HttpRequestStart="http-request-start",le.HttpRequestFinish="http-request-finish",le.HttpRequestError="http-request-error",le.HttpRequestSuccess="http-request-success",le.RevokeAccessToken="revoke-access-token",le.CustomGrant="custom-grant",le.SignOutFailed="sign-out-failed";const ie="rpIFrame",ne="promptNoneIFrame",oe="Y2hlY2tTZXNzaW9u",de="sign-in-silently",ce="initialized-silent-sign-in",ae="promptNoneRequestSent",se="error",re="error_description",ue="custom_grant_config",Ze="state",be="Access token is invalid";class he{constructor(){}static generateSuccessMessage(e){return{blob:(null==e?void 0:e.data)instanceof Blob?null==e?void 0:e.data:null,data:JSON.stringify(null!=e?e:""),success:!0}}static generateFailureMessage(e){return(null==e?void 0:e.toJSON)&&delete e.toJSON,{error:JSON.stringify(null!=e?e:""),success:!1}}}class me{constructor(){}static removeAuthorizationCode(){const e=location.href;history.pushState({},document.title,e.replace(/\?code=.*$/,""))}static getPKCE(e){var t;return null!==(t=sessionStorage.getItem(e))&&void 0!==t?t:""}static setPKCE(e,t){sessionStorage.setItem(e,t)}static setSignOutURL(e,t,l){sessionStorage.setItem(`${c}-instance_${l}-${t}`,e)}static getSignOutURL(e,t){var l;return null!==(l=sessionStorage.getItem(`${c}-instance_${t}-${e}`))&&void 0!==l?l:""}static removePKCE(e){sessionStorage.removeItem(e)}static canContinueSignIn(e,t){return!(e&&!me.hasErrorInURL()&&!me.hasAuthSearchParamsInURL()&&!t)}static isInitializedSilentSignIn(){return me.isSilentStatePresentInURL()}static wasSignInCalled(){return!(!me.hasErrorInURL()&&!me.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const e=sessionStorage.getItem(ce),t=e?JSON.parse(e):null;return Boolean(t)}static isSignOutSuccessful(){return t(this,void 0,void 0,(function*(){if(X.isSignOutSuccessful(window.location.href)){const e=window.location.href.split("?")[0];return history.pushState({},document.title,e),yield X.clearUserSessionData(),!0}return!1}))}static didSignOutFail(){if(X.didSignOutFail(window.location.href)){const e=new URL(window.location.href),t=e.searchParams.get(se),l=e.searchParams.get(re),i=window.location.href.split("?")[0];return history.pushState({},document.title,i),{description:null!=l?l:"",error:null!=t?t:""}}return!1}static isSilentStatePresentInURL(){var e;const t=new URL(window.location.href).searchParams.get("state");return null!==(e=null==t?void 0:t.includes(de))&&void 0!==e&&e}static hasAuthSearchParamsInURL(e=window.location.search){return/[?&]code=[^&]+/.test(e)}static hasErrorInURL(e=window.location.href){const t=new URL(e);return!!t.searchParams.get(se)&&t.searchParams.get(Ze)!==a}static canSendPromptNoneRequest(){const e=sessionStorage.getItem(ae);return!(e?JSON.parse(e):null)}static setPromptNoneRequestSent(e){sessionStorage.setItem(ae,JSON.stringify(e))}static waitTillPageRedirect(e){return t(this,void 0,void 0,(function*(){const t=null!=e?e:3e3;yield new Promise((e=>setTimeout(e,1e3*t)))}))}}me.until=(e,t=500)=>{const l=i=>e()?i():setTimeout((()=>l(i)),t);return new Promise(l)};class pe{constructor(e,t){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer(),this._spaHelper=t,this._instanceID=this._authenticationClient.getInstanceID(),this._isTokenRefreshing=!1}enableHttpHandler(e){(null==e?void 0:e.enableHandler)&&e.enableHandler()}disableHttpHandler(e){(null==e?void 0:e.disableHandler)&&e.disableHandler()}initializeSessionManger(e,t,l,i,n){var o,d,c;n.initialize(e.clientID,null!==(o=t.checkSessionIframe)&&void 0!==o?o:"",l,null!==(d=e.checkSessionInterval)&&void 0!==d?d:3,null!==(c=e.sessionRefreshInterval)&&void 0!==c?c:300,e.signInRedirectURL,i)}requestCustomGrant(e,l){var i,n,o;return t(this,void 0,void 0,(function*(){let d=!0,c=!1;if(null==e?void 0:e.tokenEndpoint){d=!1;for(const t of[...null!==(n=null===(i=yield this._dataLayer.getConfigData())||void 0===i?void 0:i.resourceServerURLs)&&void 0!==n?n:[],e.baseUrl])if(t&&(null===(o=e.tokenEndpoint)||void 0===o?void 0:o.startsWith(t))){c=!0;break}}return e.shouldReplayAfterRefresh&&this._dataLayer.setTemporaryDataParameter(ue,JSON.stringify(e)),d||c?this._authenticationClient.requestCustomGrant(e).then((i=>t(this,void 0,void 0,(function*(){return l&&"function"==typeof l&&l(e),e.returnsSession?(this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()):i})))).catch((e=>Promise.reject(e))):Promise.reject(new u("SPA-MAIN_THREAD_CLIENT-RCG-IV01","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified token endpoint in this request cannot be found among the `resourceServerURLs`"))}))}getCustomGrantConfigData(){return t(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getTemporaryDataParameter(ue);return e?JSON.parse(e):null}))}refreshAccessToken(e){return t(this,void 0,void 0,(function*(){try{yield this._authenticationClient.refreshAccessToken();const t=yield this.getCustomGrantConfigData();return t&&(yield this.requestCustomGrant(t,e)),this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()}catch(e){const t={type:j};return window.postMessage(t),Promise.reject(e)}}))}retryFailedRequests(e){return t(this,void 0,void 0,(function*(){const t=e.httpClient,l=e.requestConfig,i=e.isHttpHandlerEnabled,n=e.httpErrorCallback,o=e.httpFinishCallback;yield me.until((()=>!this._isTokenRefreshing));try{const e=yield t.request(l);return Promise.resolve(e)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}))}httpRequest(e,l,i,n,o,d){var c,a;return t(this,void 0,void 0,(function*(){let s=!1;const r=yield this._dataLayer.getConfigData();for(const e of[...null!==(c=yield null==r?void 0:r.resourceServerURLs)&&void 0!==c?c:[],r.baseUrl])if(e&&(null===(a=null==l?void 0:l.url)||void 0===a?void 0:a.startsWith(e))){s=!0;break}return s?e.request(l).then((e=>Promise.resolve(e))).catch((c=>t(this,void 0,void 0,(function*(){var t,a,s;if(401===(null===(t=null==c?void 0:c.response)||void 0===t?void 0:t.status)||!(null==c?void 0:c.response)){if(this._isTokenRefreshing)return this.retryFailedRequests({enableRetrievingSignOutURLFromSession:d,httpClient:e,httpErrorCallback:n,httpFinishCallback:o,isHttpHandlerEnabled:i,requestConfig:l});let t;this._isTokenRefreshing=!0;try{t=yield this.refreshAccessToken(d),this._isTokenRefreshing=!1}catch(e){throw this._isTokenRefreshing=!1,i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},c),{code:be}))),"function"==typeof o&&o()),new u("SPA-AUTH_HELPER-HR-SE01",null!==(a=null==e?void 0:e.name)&&void 0!==a?a:"Refresh token request failed.",null!==(s=null==e?void 0:e.message)&&void 0!==s?s:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(t)try{const t=yield e.request(l);return Promise.resolve(t)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}return i&&("function"==typeof n&&(yield n(c)),"function"==typeof o&&o()),Promise.reject(c)})))):Promise.reject(new u("SPA-AUTH_HELPER-HR-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`"))}))}httpRequestAll(e,l,i,n,o){var d,c,a;return t(this,void 0,void 0,(function*(){let s=!0;const r=yield this._dataLayer.getConfigData();for(const t of e){let e=!1;for(const l of[...null!==(c=null===(d=yield r)||void 0===d?void 0:d.resourceServerURLs)&&void 0!==c?c:[],r.baseUrl])if(l&&(null===(a=t.url)||void 0===a?void 0:a.startsWith(l))){e=!0;break}if(!e){s=!1;break}}const Z=[];if(s)return e.forEach((e=>{Z.push(l.request(e))})),(null==l?void 0:l.all)&&l.all(Z).then((e=>Promise.resolve(e))).catch((e=>t(this,void 0,void 0,(function*(){var d,c,a;if(401===(null===(d=null==e?void 0:e.response)||void 0===d?void 0:d.status)||!(null==e?void 0:e.response)){let d;try{d=yield this._authenticationClient.refreshAccessToken()}catch(t){throw i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},e),{code:be}))),"function"==typeof o&&o()),new u("SPA-AUTH_HELPER-HRA-SE01",null!==(c=null==t?void 0:t.name)&&void 0!==c?c:"Refresh token request failed.",null!==(a=null==t?void 0:t.message)&&void 0!==a?a:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(d)return l.all&&l.all(Z).then((e=>Promise.resolve(e))).catch((e=>t(this,void 0,void 0,(function*(){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}))))}return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}))));throw new u("SPA-AUTH_HELPER-HRA-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`")}))}requestAccessToken(l,i,n,o,d,c){return t(this,void 0,void 0,(function*(){const a=yield this._dataLayer.getConfigData();if(a.storage===e.Storage.BrowserMemory&&a.enablePKCE&&i){const e=me.getPKCE(Z.extractPKCEKeyFromStateParam(i));yield this._authenticationClient.setPKCECode(Z.extractPKCEKeyFromStateParam(i),e)}else a.storage===e.Storage.WebWorker&&o&&(yield this._authenticationClient.setPKCECode(o,null!=d?d:""));return l?this._authenticationClient.requestAccessToken(l,null!=i?i:"",null!=d?d:"",void 0,c).then((()=>t(this,void 0,void 0,(function*(){return a.storage!==e.Storage.WebWorker?(me.setSignOutURL(yield this._authenticationClient.getSignOutURL(),a.clientID,this._instanceID),this._spaHelper&&(this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this)),n&&"function"==typeof n&&a.enableOIDCSessionManagement&&n()):this._spaHelper&&this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()})))).catch((e=>Promise.reject(e))):Promise.reject(new u("SPA-AUTH_HELPER-RAT1-NF01","No authorization code.","No authorization code was found."))}))}trySignInSilently(e,l,i,n,o){var d;return t(this,void 0,void 0,(function*(){if(me.isInitializedSilentSignIn())return yield i.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const c=document.getElementById(ie),a=null===(d=null==c?void 0:c.contentDocument)||void 0===d?void 0:d.getElementById(ne);try{const t=yield e(n);a.src=t}catch(e){return Promise.reject(e)}return new Promise(((e,i)=>{const n=setTimeout((()=>{e(!1)}),1e4),d=c=>t(this,void 0,void 0,(function*(){var t,a,s,r;const u=c.data;(null==u?void 0:u.type)==_&&(window.removeEventListener("message",d),clearTimeout(n),e(!1)),(null==u?void 0:u.type)==A&&(null===(t=null==u?void 0:u.data)||void 0===t?void 0:t.code)&&l(null===(a=null==u?void 0:u.data)||void 0===a?void 0:a.code,null===(s=null==u?void 0:u.data)||void 0===s?void 0:s.sessionState,null===(r=null==u?void 0:u.data)||void 0===r?void 0:r.state,o).then((t=>{window.removeEventListener("message",d),e(t)})).catch((e=>{window.removeEventListener("message",d),i(e)})).finally((()=>{clearTimeout(n)}))}));window.addEventListener("message",d)}))}))}handleSignIn(l,i,n){return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getConfigData();if(yield l())return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(t.storage!==e.Storage.WebWorker&&(yield this._authenticationClient.isAuthenticated()))return this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this),t.enableOIDCSessionManagement&&i(),Promise.resolve(yield this._authenticationClient.getBasicUserInfo());const o=new URL(window.location.href).searchParams.get(se),d=new URL(window.location.href).searchParams.get(re);if(o){const e=new URL(window.location.href);throw e.searchParams.delete(se),e.searchParams.delete(re),history.pushState(null,document.title,e.toString()),new u("SPA-AUTH_HELPER-SI-SE01",o,null!=d?d:"")}if(t.storage===e.Storage.WebWorker&&n){const e=yield n();if(e)return e}}))}attachTokenToRequestConfig(e){return t(this,void 0,void 0,(function*(){const t=Object.assign({attachToken:!0},e);t.attachToken&&(t.shouldAttachIDPAccessToken?e.headers=Object.assign(Object.assign({},e.headers),{Authorization:`Bearer ${yield this.getIDPAccessToken()}`}):e.headers=Object.assign(Object.assign({},e.headers),{Authorization:`Bearer ${yield this.getAccessToken()}`}))}))}getBasicUserInfo(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getBasicUserInfo()}))}getDecodedIDToken(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getDecodedIDPIDToken(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getCryptoHelper(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getCryptoHelper()}))}getIDToken(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getIDToken()}))}getOIDCServiceEndpoints(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getOIDCServiceEndpoints()}))}getAccessToken(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getAccessToken()}))}getIDPAccessToken(){var e;return t(this,void 0,void 0,(function*(){return null===(e=yield this._dataLayer.getSessionData())||void 0===e?void 0:e.access_token}))}getDataLayer(){return this._dataLayer}isAuthenticated(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.isAuthenticated()}))}}class Ge{constructor(e){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(e){var l,n;return t(this,void 0,void 0,(function*(){if(!(null!==(n=null===(l=yield this._dataLayer.getConfigData())||void 0===l?void 0:l.periodicTokenRefresh)&&void 0!==n&&n))return;const o=yield this._dataLayer.getSessionData();if(o.refresh_token){const l=parseInt(o.expires_in),n=setTimeout((()=>t(this,void 0,void 0,(function*(){yield e.refreshAccessToken()}))),1e3*(l<=10?l:l-10));yield this._dataLayer.setTemporaryDataParameter(i,JSON.stringify(n))}}))}getRefreshTimeoutTimer(){return t(this,void 0,void 0,(function*(){return(yield this._dataLayer.getTemporaryDataParameter(i))?JSON.parse(yield this._dataLayer.getTemporaryDataParameter(i)):-1}))}clearRefreshTokenTimeout(e){return t(this,void 0,void 0,(function*(){if(e)return void clearTimeout(e);const t=yield this.getRefreshTimeoutTimer();-1!==t&&clearTimeout(t)}))}}const Xe=(()=>{let l,i,n,o,c,a,s,r,u,Z,b;const h=(e,t,d,s,r,u,Z)=>{l=e,i=t,n=d,o=s,c=u,a=r,b=Z,o>-1&&m(),a>-1&&(r=setInterval((()=>{y()}),1e3*a))},m=()=>t(void 0,void 0,void 0,(function*(){var e;if(!i||!l||!c)return;const d="opIFrame";const a=document.getElementById(ie);(null===(e=null==a?void 0:a.contentDocument)||void 0===e?void 0:e.getElementById(d)).src=i+"?client_id="+l+"&redirect_uri="+c,r=setInterval((function(){var e;return t(this,void 0,void 0,(function*(){const t=yield n();if(Boolean(l)&&Boolean(t)){const n=`${l} ${t}`,o=document.getElementById(ie),c=(null===(e=null==o?void 0:o.contentDocument)||void 0===e?void 0:e.getElementById(d)).contentWindow;null==c||c.postMessage(n,i)}}))}),1e3*o),G()})),p=()=>{clearInterval(r),clearInterval(undefined)},G=()=>{null===window||void 0===window||window.addEventListener("message",(function(e){var l;return t(this,void 0,void 0,(function*(){const t=i;!t||(null==t?void 0:t.indexOf(e.origin))<0||(null===(l=null==e?void 0:e.data)||void 0===l?void 0:l.type)===$||"unchanged"===e.data||("error"===e.data?window.location.href=yield s():"changed"===e.data&&y())}))}),!1)},y=()=>t(void 0,void 0,void 0,(function*(){var t;const l=document.getElementById(ie),i=null===(t=null==l?void 0:l.contentDocument)||void 0===t?void 0:t.getElementById(ne);if(me.canSendPromptNoneRequest()){me.setPromptNoneRequestSent(!0);const t=e=>{var l,i,n;(null===(l=null==e?void 0:e.data)||void 0===l?void 0:l.type)===$&&(Z(null!==(n=null===(i=null==e?void 0:e.data)||void 0===i?void 0:i.data)&&void 0!==n?n:""),null===window||void 0===window||window.removeEventListener("message",t))};u!==e.Storage.BrowserMemory&&u!==e.Storage.WebWorker||null===window||void 0===window||window.addEventListener("message",t);const l=yield b({prompt:"none",response_mode:"query",state:oe});i.src=l}})),W=l=>t(void 0,void 0,void 0,(function*(){var t,i;const n=new URL(window.location.href).searchParams.get(Ze),o=new URL(window.location.href).searchParams.get(d),c=window.parent.parent;if(null!==n&&(n.includes(oe)||n.includes(de))){const d=new URL(window.location.href).searchParams.get("code");if(null!==d&&0!==d.length){if(n.includes(de)){const e={data:{code:d,sessionState:null!=o?o:"",state:n},type:A};return sessionStorage.setItem(ce,"false"),c.postMessage(e,c.origin),me.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield me.waitTillPageRedirect(),!0}const a=new URL(window.location.href).searchParams.get("session_state");if(u===e.Storage.LocalStorage||u===e.Storage.SessionStorage)l&&(yield l(a));else{const e={data:null!=a?a:"",type:$};null===(i=null===(t=null===window||void 0===window?void 0:window.parent)||void 0===t?void 0:t.parent)||void 0===i||i.postMessage(e)}return me.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield me.waitTillPageRedirect(),!0}{if(n.includes(de)){const e={type:_};return window.parent.parent.postMessage(e,c.origin),me.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield me.waitTillPageRedirect(),!0}me.setPromptNoneRequestSent(!1);const e=yield s();return yield X.clearUserSessionData(),c.location.href=e,window.location.href="about:blank",yield me.waitTillPageRedirect(),!0}}return!1}));return(e,l,i)=>t(void 0,void 0,void 0,(function*(){var t;let n=document.createElement("iframe");n.setAttribute("id",ie),n.style.display="none";let o=!1;n.onload=()=>{var e,t,l,i;n=document.getElementById(ie);const d=null==n?void 0:n.contentDocument,c=null==d?void 0:d.createElement("iframe");c&&(c.setAttribute("id","opIFrame"),c.style.display="none");const a=null==d?void 0:d.createElement("iframe");a&&(a.setAttribute("id",ne),a.style.display="none"),c&&(null===(t=null===(e=null==n?void 0:n.contentDocument)||void 0===e?void 0:e.body)||void 0===t||t.appendChild(c)),a&&(null===(i=null===(l=null==n?void 0:n.contentDocument)||void 0===l?void 0:l.body)||void 0===i||i.appendChild(a)),o=!0},null===(t=null===document||void 0===document?void 0:document.body)||void 0===t||t.appendChild(n),s=e,u=l,Z=i;for(;!1===o;)yield new Promise((e=>setTimeout(e,1)));return{initialize:h,receivePromptNoneResponse:W,reset:p}}))})();var ye="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function We(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Ve(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(l){var i=Object.getOwnPropertyDescriptor(e,l);Object.defineProperty(t,l,i.get?i:{enumerable:!0,get:function(){return e[l]}})})),t}var Ie={exports:{}},Re=function(e,t){return function(){for(var l=new Array(arguments.length),i=0;i<l.length;i++)l[i]=arguments[i];return e.apply(t,l)}},Se=Re,ge=Object.prototype.toString;function ve(e){return Array.isArray(e)}function Ye(e){return void 0===e}function Ke(e){return"[object ArrayBuffer]"===ge.call(e)}function Ne(e){return null!==e&&"object"==typeof e}function fe(e){if("[object Object]"!==ge.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function Je(e){return"[object Function]"===ge.call(e)}function Ce(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),ve(e))for(var l=0,i=e.length;l<i;l++)t.call(null,e[l],l,e);else for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.call(null,e[n],n,e)}var ke={isArray:ve,isArrayBuffer:Ke,isBuffer:function(e){return null!==e&&!Ye(e)&&null!==e.constructor&&!Ye(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){return"[object FormData]"===ge.call(e)},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&Ke(e.buffer)},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e},isObject:Ne,isPlainObject:fe,isUndefined:Ye,isDate:function(e){return"[object Date]"===ge.call(e)},isFile:function(e){return"[object File]"===ge.call(e)},isBlob:function(e){return"[object Blob]"===ge.call(e)},isFunction:Je,isStream:function(e){return Ne(e)&&Je(e.pipe)},isURLSearchParams:function(e){return"[object URLSearchParams]"===ge.call(e)},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:Ce,merge:function e(){var t={};function l(l,i){fe(t[i])&&fe(l)?t[i]=e(t[i],l):fe(l)?t[i]=e({},l):ve(l)?t[i]=l.slice():t[i]=l}for(var i=0,n=arguments.length;i<n;i++)Ce(arguments[i],l);return t},extend:function(e,t,l){return Ce(t,(function(t,i){e[i]=l&&"function"==typeof t?Se(t,l):t})),e},trim:function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e}},Ue=ke;function Le(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var He=function(e,t,l){if(!t)return e;var i;if(l)i=l(t);else if(Ue.isURLSearchParams(t))i=t.toString();else{var n=[];Ue.forEach(t,(function(e,t){null!=e&&(Ue.isArray(e)?t+="[]":e=[e],Ue.forEach(e,(function(e){Ue.isDate(e)?e=e.toISOString():Ue.isObject(e)&&(e=JSON.stringify(e)),n.push(Le(t)+"="+Le(e))})))})),i=n.join("&")}if(i){var o=e.indexOf("#");-1!==o&&(e=e.slice(0,o)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e},Te=ke;function Fe(){this.handlers=[]}Fe.prototype.use=function(e,t,l){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!l&&l.synchronous,runWhen:l?l.runWhen:null}),this.handlers.length-1},Fe.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},Fe.prototype.forEach=function(e){Te.forEach(this.handlers,(function(t){null!==t&&e(t)}))};var we=Fe,xe="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function ze(){throw new Error("setTimeout has not been defined")}function Be(){throw new Error("clearTimeout has not been defined")}var Pe=ze,Me=Be;function je(e){if(Pe===setTimeout)return setTimeout(e,0);if((Pe===ze||!Pe)&&setTimeout)return Pe=setTimeout,setTimeout(e,0);try{return Pe(e,0)}catch(t){try{return Pe.call(null,e,0)}catch(t){return Pe.call(this,e,0)}}}"function"==typeof xe.setTimeout&&(Pe=setTimeout),"function"==typeof xe.clearTimeout&&(Me=clearTimeout);var Qe,Ee=[],De=!1,Oe=-1;function Ae(){De&&Qe&&(De=!1,Qe.length?Ee=Qe.concat(Ee):Oe=-1,Ee.length&&_e())}function _e(){if(!De){var e=je(Ae);De=!0;for(var t=Ee.length;t;){for(Qe=Ee,Ee=[];++Oe<t;)Qe&&Qe[Oe].run();Oe=-1,t=Ee.length}Qe=null,De=!1,function(e){if(Me===clearTimeout)return clearTimeout(e);if((Me===Be||!Me)&&clearTimeout)return Me=clearTimeout,clearTimeout(e);try{Me(e)}catch(t){try{return Me.call(null,e)}catch(t){return Me.call(this,e)}}}(e)}}function qe(e,t){this.fun=e,this.array=t}qe.prototype.run=function(){this.fun.apply(null,this.array)};function $e(){}var et=$e,tt=$e,lt=$e,it=$e,nt=$e,ot=$e,dt=$e;var ct=xe.performance||{},at=ct.now||ct.mozNow||ct.msNow||ct.oNow||ct.webkitNow||function(){return(new Date).getTime()};var st=new Date;var rt={nextTick:function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var l=1;l<arguments.length;l++)t[l-1]=arguments[l];Ee.push(new qe(e,t)),1!==Ee.length||De||je(_e)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:et,addListener:tt,once:lt,off:it,removeListener:nt,removeAllListeners:ot,emit:dt,binding:function(e){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(e){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(e){var t=.001*at.call(ct),l=Math.floor(t),i=Math.floor(t%1*1e9);return e&&(l-=e[0],(i-=e[1])<0&&(l--,i+=1e9)),[l,i]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-st)/1e3}},ut=rt,Zt=ke,bt=function(e,t,l,i,n){return e.config=t,l&&(e.code=l),e.request=i,e.response=n,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},e},ht={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},mt=bt,pt=function(e,t,l,i,n){var o=new Error(e);return mt(o,t,l,i,n)},Gt=pt,Xt=ke,yt=Xt.isStandardBrowserEnv()?{write:function(e,t,l,i,n,o){var d=[];d.push(e+"="+encodeURIComponent(t)),Xt.isNumber(l)&&d.push("expires="+new Date(l).toGMTString()),Xt.isString(i)&&d.push("path="+i),Xt.isString(n)&&d.push("domain="+n),!0===o&&d.push("secure"),document.cookie=d.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}},Wt=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},Vt=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e},It=ke,Rt=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],St=ke,gt=St.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),l=document.createElement("a");function i(e){var i=e;return t&&(l.setAttribute("href",i),i=l.href),l.setAttribute("href",i),{href:l.href,protocol:l.protocol?l.protocol.replace(/:$/,""):"",host:l.host,search:l.search?l.search.replace(/^\?/,""):"",hash:l.hash?l.hash.replace(/^#/,""):"",hostname:l.hostname,port:l.port,pathname:"/"===l.pathname.charAt(0)?l.pathname:"/"+l.pathname}}return e=i(window.location.href),function(t){var l=St.isString(t)?i(t):t;return l.protocol===e.protocol&&l.host===e.host}}():function(){return!0};function vt(e){this.message=e}vt.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},vt.prototype.__CANCEL__=!0;var Yt=vt,Kt=ke,Nt=function(e,t,l){var i=l.config.validateStatus;l.status&&i&&!i(l.status)?t(Gt("Request failed with status code "+l.status,l.config,null,l.request,l)):e(l)},ft=yt,Jt=He,Ct=function(e,t){return e&&!Wt(t)?Vt(e,t):t},kt=function(e){var t,l,i,n={};return e?(It.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=It.trim(e.substr(0,i)).toLowerCase(),l=It.trim(e.substr(i+1)),t){if(n[t]&&Rt.indexOf(t)>=0)return;n[t]="set-cookie"===t?(n[t]?n[t]:[]).concat([l]):n[t]?n[t]+", "+l:l}})),n):n},Ut=gt,Lt=pt,Ht=ht,Tt=Yt,Ft=function(e){return new Promise((function(t,l){var i,n=e.data,o=e.headers,d=e.responseType;function c(){e.cancelToken&&e.cancelToken.unsubscribe(i),e.signal&&e.signal.removeEventListener("abort",i)}Kt.isFormData(n)&&delete o["Content-Type"];var a=new XMLHttpRequest;if(e.auth){var s=e.auth.username||"",r=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.Authorization="Basic "+btoa(s+":"+r)}var u=Ct(e.baseURL,e.url);function Z(){if(a){var i="getAllResponseHeaders"in a?kt(a.getAllResponseHeaders()):null,n={data:d&&"text"!==d&&"json"!==d?a.response:a.responseText,status:a.status,statusText:a.statusText,headers:i,config:e,request:a};Nt((function(e){t(e),c()}),(function(e){l(e),c()}),n),a=null}}if(a.open(e.method.toUpperCase(),Jt(u,e.params,e.paramsSerializer),!0),a.timeout=e.timeout,"onloadend"in a?a.onloadend=Z:a.onreadystatechange=function(){a&&4===a.readyState&&(0!==a.status||a.responseURL&&0===a.responseURL.indexOf("file:"))&&setTimeout(Z)},a.onabort=function(){a&&(l(Lt("Request aborted",e,"ECONNABORTED",a)),a=null)},a.onerror=function(){l(Lt("Network Error",e,null,a)),a=null},a.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",i=e.transitional||Ht;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),l(Lt(t,e,i.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",a)),a=null},Kt.isStandardBrowserEnv()){var b=(e.withCredentials||Ut(u))&&e.xsrfCookieName?ft.read(e.xsrfCookieName):void 0;b&&(o[e.xsrfHeaderName]=b)}"setRequestHeader"in a&&Kt.forEach(o,(function(e,t){void 0===n&&"content-type"===t.toLowerCase()?delete o[t]:a.setRequestHeader(t,e)})),Kt.isUndefined(e.withCredentials)||(a.withCredentials=!!e.withCredentials),d&&"json"!==d&&(a.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&a.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&a.upload&&a.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(i=function(e){a&&(l(!e||e&&e.type?new Tt("canceled"):e),a.abort(),a=null)},e.cancelToken&&e.cancelToken.subscribe(i),e.signal&&(e.signal.aborted?i():e.signal.addEventListener("abort",i))),n||(n=null),a.send(n)}))},wt=ke,xt=function(e,t){Zt.forEach(e,(function(l,i){i!==t&&i.toUpperCase()===t.toUpperCase()&&(e[t]=l,delete e[i])}))},zt=bt,Bt={"Content-Type":"application/x-www-form-urlencoded"};function Pt(e,t){!wt.isUndefined(e)&&wt.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var Mt,jt={transitional:ht,adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==ut&&"[object process]"===Object.prototype.toString.call(ut))&&(Mt=Ft),Mt),transformRequest:[function(e,t){return xt(t,"Accept"),xt(t,"Content-Type"),wt.isFormData(e)||wt.isArrayBuffer(e)||wt.isBuffer(e)||wt.isStream(e)||wt.isFile(e)||wt.isBlob(e)?e:wt.isArrayBufferView(e)?e.buffer:wt.isURLSearchParams(e)?(Pt(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):wt.isObject(e)||t&&"application/json"===t["Content-Type"]?(Pt(t,"application/json"),function(e,t,l){if(wt.isString(e))try{return(t||JSON.parse)(e),wt.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(l||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||jt.transitional,l=t&&t.silentJSONParsing,i=t&&t.forcedJSONParsing,n=!l&&"json"===this.responseType;if(n||i&&wt.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw zt(e,this,"E_JSON_PARSE");throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};wt.forEach(["delete","get","head"],(function(e){jt.headers[e]={}})),wt.forEach(["post","put","patch"],(function(e){jt.headers[e]=wt.merge(Bt)}));var Qt=jt,Et=ke,Dt=Qt,Ot=function(e){return!(!e||!e.__CANCEL__)},At=ke,_t=function(e,t,l){var i=this||Dt;return Et.forEach(l,(function(l){e=l.call(i,e,t)})),e},qt=Ot,$t=Qt,el=Yt;function tl(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new el("canceled")}var ll=ke,il=function(e,t){t=t||{};var l={};function i(e,t){return ll.isPlainObject(e)&&ll.isPlainObject(t)?ll.merge(e,t):ll.isPlainObject(t)?ll.merge({},t):ll.isArray(t)?t.slice():t}function n(l){return ll.isUndefined(t[l])?ll.isUndefined(e[l])?void 0:i(void 0,e[l]):i(e[l],t[l])}function o(e){if(!ll.isUndefined(t[e]))return i(void 0,t[e])}function d(l){return ll.isUndefined(t[l])?ll.isUndefined(e[l])?void 0:i(void 0,e[l]):i(void 0,t[l])}function c(l){return l in t?i(e[l],t[l]):l in e?i(void 0,e[l]):void 0}var a={url:o,method:o,data:o,baseURL:d,transformRequest:d,transformResponse:d,paramsSerializer:d,timeout:d,timeoutMessage:d,withCredentials:d,adapter:d,responseType:d,xsrfCookieName:d,xsrfHeaderName:d,onUploadProgress:d,onDownloadProgress:d,decompress:d,maxContentLength:d,maxBodyLength:d,transport:d,httpAgent:d,httpsAgent:d,cancelToken:d,socketPath:d,responseEncoding:d,validateStatus:c};return ll.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=a[e]||n,i=t(e);ll.isUndefined(i)&&t!==c||(l[e]=i)})),l},nl="0.26.1",ol=nl,dl={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){dl[e]=function(l){return typeof l===e||"a"+(t<1?"n ":" ")+e}}));var cl={};dl.transitional=function(e,t,l){function i(e,t){return"[Axios v"+ol+"] Transitional option '"+e+"'"+t+(l?". "+l:"")}return function(l,n,o){if(!1===e)throw new Error(i(n," has been removed"+(t?" in "+t:"")));return t&&!cl[n]&&(cl[n]=!0,console.warn(i(n," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(l,n,o)}};var al={assertOptions:function(e,t,l){if("object"!=typeof e)throw new TypeError("options must be an object");for(var i=Object.keys(e),n=i.length;n-- >0;){var o=i[n],d=t[o];if(d){var c=e[o],a=void 0===c||d(c,o,e);if(!0!==a)throw new TypeError("option "+o+" must be "+a)}else if(!0!==l)throw Error("Unknown option "+o)}},validators:dl},sl=ke,rl=He,ul=we,Zl=function(e){return tl(e),e.headers=e.headers||{},e.data=_t.call(e,e.data,e.headers,e.transformRequest),e.headers=At.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),At.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||$t.adapter)(e).then((function(t){return tl(e),t.data=_t.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return qt(t)||(tl(e),t&&t.response&&(t.response.data=_t.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))},bl=il,hl=al,ml=hl.validators;function pl(e){this.defaults=e,this.interceptors={request:new ul,response:new ul}}pl.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=bl(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var l=t.transitional;void 0!==l&&hl.assertOptions(l,{silentJSONParsing:ml.transitional(ml.boolean),forcedJSONParsing:ml.transitional(ml.boolean),clarifyTimeoutError:ml.transitional(ml.boolean)},!1);var i=[],n=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(n=n&&e.synchronous,i.unshift(e.fulfilled,e.rejected))}));var o,d=[];if(this.interceptors.response.forEach((function(e){d.push(e.fulfilled,e.rejected)})),!n){var c=[Zl,void 0];for(Array.prototype.unshift.apply(c,i),c=c.concat(d),o=Promise.resolve(t);c.length;)o=o.then(c.shift(),c.shift());return o}for(var a=t;i.length;){var s=i.shift(),r=i.shift();try{a=s(a)}catch(e){r(e);break}}try{o=Zl(a)}catch(e){return Promise.reject(e)}for(;d.length;)o=o.then(d.shift(),d.shift());return o},pl.prototype.getUri=function(e){return e=bl(this.defaults,e),rl(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},sl.forEach(["delete","get","head","options"],(function(e){pl.prototype[e]=function(t,l){return this.request(bl(l||{},{method:e,url:t,data:(l||{}).data}))}})),sl.forEach(["post","put","patch"],(function(e){pl.prototype[e]=function(t,l,i){return this.request(bl(i||{},{method:e,url:t,data:l}))}}));var Gl=pl,Xl=Yt;function yl(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var l=this;this.promise.then((function(e){if(l._listeners){var t,i=l._listeners.length;for(t=0;t<i;t++)l._listeners[t](e);l._listeners=null}})),this.promise.then=function(e){var t,i=new Promise((function(e){l.subscribe(e),t=e})).then(e);return i.cancel=function(){l.unsubscribe(t)},i},e((function(e){l.reason||(l.reason=new Xl(e),t(l.reason))}))}yl.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},yl.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]},yl.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}},yl.source=function(){var e,t=new yl((function(t){e=t}));return{token:t,cancel:e}};var Wl=yl,Vl=ke,Il=ke,Rl=Re,Sl=Gl,gl=il;var vl=function e(t){var l=new Sl(t),i=Rl(Sl.prototype.request,l);return Il.extend(i,Sl.prototype,l),Il.extend(i,l),i.create=function(l){return e(gl(t,l))},i}(Qt);vl.Axios=Sl,vl.Cancel=Yt,vl.CancelToken=Wl,vl.isCancel=Ot,vl.VERSION=nl,vl.all=function(e){return Promise.all(e)},vl.spread=function(e){return function(t){return e.apply(null,t)}},vl.isAxiosError=function(e){return Vl.isObject(e)&&!0===e.isAxiosError},Ie.exports=vl,Ie.exports.default=vl;var Yl,Kl=Ie.exports;let Nl=Yl=class{constructor(){this.attachToken=()=>Promise.resolve(),this.requestStartCallback=()=>null,this.requestSuccessCallback=()=>null,this.requestErrorCallback=()=>null,this.requestFinishCallback=()=>null,this.init=this.init.bind(this),this.setHttpRequestErrorCallback=this.setHttpRequestErrorCallback.bind(this),this.setHttpRequestFinishCallback=this.setHttpRequestFinishCallback.bind(this),this.setHttpRequestStartCallback=this.setHttpRequestStartCallback.bind(this),this.setHttpRequestSuccessCallback=this.setHttpRequestSuccessCallback.bind(this)}static getInstance(){return this.axiosInstance||(this.axiosInstance=Kl.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new Yl),this.axiosInstance.interceptors.request.use((e=>t(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(e)})))),this.axiosInstance.interceptors.response.use((e=>this.clientInstance.successHandler(e)),(e=>this.clientInstance.errorHandler(e))),this.axiosInstance.all=Kl.all,this.axiosInstance.spread=Kl.spread,this.axiosInstance.init=this.clientInstance.init,this.axiosInstance.enableHandler=this.clientInstance.enableHandler,this.axiosInstance.disableHandler=this.clientInstance.disableHandler,this.axiosInstance.disableHandlerWithTimeout=this.clientInstance.disableHandlerWithTimeout,this.axiosInstance.setHttpRequestStartCallback=this.clientInstance.setHttpRequestStartCallback,this.axiosInstance.setHttpRequestSuccessCallback=this.clientInstance.setHttpRequestSuccessCallback,this.axiosInstance.setHttpRequestErrorCallback=this.clientInstance.setHttpRequestErrorCallback,this.axiosInstance.setHttpRequestFinishCallback=this.clientInstance.setHttpRequestFinishCallback),this.axiosInstance}requestHandler(e){return t(this,void 0,void 0,(function*(){if(yield this.attachToken(e),null==e?void 0:e.shouldEncodeToFormData){const t=null==e?void 0:e.data,l=new FormData;Object.keys(t).forEach((e=>{l.append(e,t[e])})),e.data=l}return e.startTimeInMs=(new Date).getTime(),Yl.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(e),e}))}errorHandler(e){throw Yl.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}successHandler(e){return Yl.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}init(e=!0,l){return t(this,void 0,void 0,(function*(){Yl.isHandlerEnabled=e,this.attachToken=l}))}enableHandler(){Yl.isHandlerEnabled=!0}disableHandler(){Yl.isHandlerEnabled=!1}disableHandlerWithTimeout(e=Yl.DEFAULT_HANDLER_DISABLE_TIMEOUT){Yl.isHandlerEnabled=!1,setTimeout((()=>{Yl.isHandlerEnabled=!0}),e)}setHttpRequestStartCallback(e){this.requestStartCallback=e}setHttpRequestSuccessCallback(e){this.requestSuccessCallback=e}setHttpRequestErrorCallback(e){this.requestErrorCallback=e}setHttpRequestFinishCallback(e){this.requestFinishCallback=e}};Nl.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,Nl=Yl=function(e,t,l,i){var n,o=arguments.length,d=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,l):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)d=Reflect.decorate(e,t,l,i);else for(var c=e.length-1;c>=0;c--)(n=e[c])&&(d=(o<3?n(d):o>3?n(t,l,d):n(t,l))||d);return o>3&&d&&Object.defineProperty(t,l,d),d}([e=>{}],Nl);class fl{setData(e,l){return t(this,void 0,void 0,(function*(){localStorage.setItem(e,l)}))}getData(e){var l;return t(this,void 0,void 0,(function*(){return null!==(l=localStorage.getItem(e))&&void 0!==l?l:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){localStorage.removeItem(e)}))}}class Jl{constructor(){this._data=new Map}setData(e,l){return t(this,void 0,void 0,(function*(){this._data.set(e,l)}))}getData(e){var l,i;return t(this,void 0,void 0,(function*(){return null!==(i=null===(l=this._data)||void 0===l?void 0:l.get(e))&&void 0!==i?i:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){this._data.delete(e)}))}}class Cl{setData(e,l){return t(this,void 0,void 0,(function*(){sessionStorage.setItem(e,l)}))}getData(e){var l;return t(this,void 0,void 0,(function*(){return null!==(l=sessionStorage.getItem(e))&&void 0!==l?l:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){sessionStorage.removeItem(e)}))}}var kl=[],Ul=[],Ll="undefined"!=typeof Uint8Array?Uint8Array:Array,Hl=!1;function Tl(){Hl=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,l=e.length;t<l;++t)kl[t]=e[t],Ul[e.charCodeAt(t)]=t;Ul["-".charCodeAt(0)]=62,Ul["_".charCodeAt(0)]=63}function Fl(e,t,l){for(var i,n,o=[],d=t;d<l;d+=3)i=(e[d]<<16)+(e[d+1]<<8)+e[d+2],o.push(kl[(n=i)>>18&63]+kl[n>>12&63]+kl[n>>6&63]+kl[63&n]);return o.join("")}function wl(e){var t;Hl||Tl();for(var l=e.length,i=l%3,n="",o=[],d=16383,c=0,a=l-i;c<a;c+=d)o.push(Fl(e,c,c+d>a?a:c+d));return 1===i?(t=e[l-1],n+=kl[t>>2],n+=kl[t<<4&63],n+="=="):2===i&&(t=(e[l-2]<<8)+e[l-1],n+=kl[t>>10],n+=kl[t>>4&63],n+=kl[t<<2&63],n+="="),o.push(n),o.join("")}function xl(e,t,l,i,n){var o,d,c=8*n-i-1,a=(1<<c)-1,s=a>>1,r=-7,u=l?n-1:0,Z=l?-1:1,b=e[t+u];for(u+=Z,o=b&(1<<-r)-1,b>>=-r,r+=c;r>0;o=256*o+e[t+u],u+=Z,r-=8);for(d=o&(1<<-r)-1,o>>=-r,r+=i;r>0;d=256*d+e[t+u],u+=Z,r-=8);if(0===o)o=1-s;else{if(o===a)return d?NaN:1/0*(b?-1:1);d+=Math.pow(2,i),o-=s}return(b?-1:1)*d*Math.pow(2,o-i)}function zl(e,t,l,i,n,o){var d,c,a,s=8*o-n-1,r=(1<<s)-1,u=r>>1,Z=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,b=i?0:o-1,h=i?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(c=isNaN(t)?1:0,d=r):(d=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-d))<1&&(d--,a*=2),(t+=d+u>=1?Z/a:Z*Math.pow(2,1-u))*a>=2&&(d++,a/=2),d+u>=r?(c=0,d=r):d+u>=1?(c=(t*a-1)*Math.pow(2,n),d+=u):(c=t*Math.pow(2,u-1)*Math.pow(2,n),d=0));n>=8;e[l+b]=255&c,b+=h,c/=256,n-=8);for(d=d<<n|c,s+=n;s>0;e[l+b]=255&d,b+=h,d/=256,s-=8);e[l+b-h]|=128*m}var Bl={}.toString,Pl=Array.isArray||function(e){return"[object Array]"==Bl.call(e)};El.TYPED_ARRAY_SUPPORT=void 0===xe.TYPED_ARRAY_SUPPORT||xe.TYPED_ARRAY_SUPPORT;var Ml=jl();function jl(){return El.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Ql(e,t){if(jl()<t)throw new RangeError("Invalid typed array length");return El.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=El.prototype:(null===e&&(e=new El(t)),e.length=t),e}function El(e,t,l){if(!(El.TYPED_ARRAY_SUPPORT||this instanceof El))return new El(e,t,l);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return Al(this,e)}return Dl(this,e,t,l)}function Dl(e,t,l,i){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,l,i){if(t.byteLength,l<0||t.byteLength<l)throw new RangeError("'offset' is out of bounds");if(t.byteLength<l+(i||0))throw new RangeError("'length' is out of bounds");t=void 0===l&&void 0===i?new Uint8Array(t):void 0===i?new Uint8Array(t,l):new Uint8Array(t,l,i);El.TYPED_ARRAY_SUPPORT?(e=t).__proto__=El.prototype:e=_l(e,t);return e}(e,t,l,i):"string"==typeof t?function(e,t,l){"string"==typeof l&&""!==l||(l="utf8");if(!El.isEncoding(l))throw new TypeError('"encoding" must be a valid string encoding');var i=0|ei(t,l),n=(e=Ql(e,i)).write(t,l);n!==i&&(e=e.slice(0,n));return e}(e,t,l):function(e,t){if($l(t)){var l=0|ql(t.length);return 0===(e=Ql(e,l)).length||t.copy(e,0,0,l),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(i=t.length)!=i?Ql(e,0):_l(e,t);if("Buffer"===t.type&&Pl(t.data))return _l(e,t.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function Ol(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function Al(e,t){if(Ol(t),e=Ql(e,t<0?0:0|ql(t)),!El.TYPED_ARRAY_SUPPORT)for(var l=0;l<t;++l)e[l]=0;return e}function _l(e,t){var l=t.length<0?0:0|ql(t.length);e=Ql(e,l);for(var i=0;i<l;i+=1)e[i]=255&t[i];return e}function ql(e){if(e>=jl())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+jl().toString(16)+" bytes");return 0|e}function $l(e){return!(null==e||!e._isBuffer)}function ei(e,t){if($l(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var l=e.length;if(0===l)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return l;case"utf8":case"utf-8":case void 0:return Yi(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*l;case"hex":return l>>>1;case"base64":return Ki(e).length;default:if(i)return Yi(e).length;t=(""+t).toLowerCase(),i=!0}}function ti(e,t,l){var i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===l||l>this.length)&&(l=this.length),l<=0)return"";if((l>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return pi(this,t,l);case"utf8":case"utf-8":return Zi(this,t,l);case"ascii":return hi(this,t,l);case"latin1":case"binary":return mi(this,t,l);case"base64":return ui(this,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Gi(this,t,l);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function li(e,t,l){var i=e[t];e[t]=e[l],e[l]=i}function ii(e,t,l,i,n){if(0===e.length)return-1;if("string"==typeof l?(i=l,l=0):l>2147483647?l=2147483647:l<-2147483648&&(l=-2147483648),l=+l,isNaN(l)&&(l=n?0:e.length-1),l<0&&(l=e.length+l),l>=e.length){if(n)return-1;l=e.length-1}else if(l<0){if(!n)return-1;l=0}if("string"==typeof t&&(t=El.from(t,i)),$l(t))return 0===t.length?-1:ni(e,t,l,i,n);if("number"==typeof t)return t&=255,El.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,l):Uint8Array.prototype.lastIndexOf.call(e,t,l):ni(e,[t],l,i,n);throw new TypeError("val must be string, number or Buffer")}function ni(e,t,l,i,n){var o,d=1,c=e.length,a=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;d=2,c/=2,a/=2,l/=2}function s(e,t){return 1===d?e[t]:e.readUInt16BE(t*d)}if(n){var r=-1;for(o=l;o<c;o++)if(s(e,o)===s(t,-1===r?0:o-r)){if(-1===r&&(r=o),o-r+1===a)return r*d}else-1!==r&&(o-=o-r),r=-1}else for(l+a>c&&(l=c-a),o=l;o>=0;o--){for(var u=!0,Z=0;Z<a;Z++)if(s(e,o+Z)!==s(t,Z)){u=!1;break}if(u)return o}return-1}function oi(e,t,l,i){l=Number(l)||0;var n=e.length-l;i?(i=Number(i))>n&&(i=n):i=n;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");i>o/2&&(i=o/2);for(var d=0;d<i;++d){var c=parseInt(t.substr(2*d,2),16);if(isNaN(c))return d;e[l+d]=c}return d}function di(e,t,l,i){return Ni(Yi(t,e.length-l),e,l,i)}function ci(e,t,l,i){return Ni(function(e){for(var t=[],l=0;l<e.length;++l)t.push(255&e.charCodeAt(l));return t}(t),e,l,i)}function ai(e,t,l,i){return ci(e,t,l,i)}function si(e,t,l,i){return Ni(Ki(t),e,l,i)}function ri(e,t,l,i){return Ni(function(e,t){for(var l,i,n,o=[],d=0;d<e.length&&!((t-=2)<0);++d)i=(l=e.charCodeAt(d))>>8,n=l%256,o.push(n),o.push(i);return o}(t,e.length-l),e,l,i)}function ui(e,t,l){return 0===t&&l===e.length?wl(e):wl(e.slice(t,l))}function Zi(e,t,l){l=Math.min(e.length,l);for(var i=[],n=t;n<l;){var o,d,c,a,s=e[n],r=null,u=s>239?4:s>223?3:s>191?2:1;if(n+u<=l)switch(u){case 1:s<128&&(r=s);break;case 2:128==(192&(o=e[n+1]))&&(a=(31&s)<<6|63&o)>127&&(r=a);break;case 3:o=e[n+1],d=e[n+2],128==(192&o)&&128==(192&d)&&(a=(15&s)<<12|(63&o)<<6|63&d)>2047&&(a<55296||a>57343)&&(r=a);break;case 4:o=e[n+1],d=e[n+2],c=e[n+3],128==(192&o)&&128==(192&d)&&128==(192&c)&&(a=(15&s)<<18|(63&o)<<12|(63&d)<<6|63&c)>65535&&a<1114112&&(r=a)}null===r?(r=65533,u=1):r>65535&&(r-=65536,i.push(r>>>10&1023|55296),r=56320|1023&r),i.push(r),n+=u}return function(e){var t=e.length;if(t<=bi)return String.fromCharCode.apply(String,e);var l="",i=0;for(;i<t;)l+=String.fromCharCode.apply(String,e.slice(i,i+=bi));return l}(i)}El.poolSize=8192,El._augment=function(e){return e.__proto__=El.prototype,e},El.from=function(e,t,l){return Dl(null,e,t,l)},El.TYPED_ARRAY_SUPPORT&&(El.prototype.__proto__=Uint8Array.prototype,El.__proto__=Uint8Array),El.alloc=function(e,t,l){return function(e,t,l,i){return Ol(t),t<=0?Ql(e,t):void 0!==l?"string"==typeof i?Ql(e,t).fill(l,i):Ql(e,t).fill(l):Ql(e,t)}(null,e,t,l)},El.allocUnsafe=function(e){return Al(null,e)},El.allocUnsafeSlow=function(e){return Al(null,e)},El.isBuffer=fi,El.compare=function(e,t){if(!$l(e)||!$l(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var l=e.length,i=t.length,n=0,o=Math.min(l,i);n<o;++n)if(e[n]!==t[n]){l=e[n],i=t[n];break}return l<i?-1:i<l?1:0},El.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},El.concat=function(e,t){if(!Pl(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return El.alloc(0);var l;if(void 0===t)for(t=0,l=0;l<e.length;++l)t+=e[l].length;var i=El.allocUnsafe(t),n=0;for(l=0;l<e.length;++l){var o=e[l];if(!$l(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(i,n),n+=o.length}return i},El.byteLength=ei,El.prototype._isBuffer=!0,El.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)li(this,t,t+1);return this},El.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)li(this,t,t+3),li(this,t+1,t+2);return this},El.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)li(this,t,t+7),li(this,t+1,t+6),li(this,t+2,t+5),li(this,t+3,t+4);return this},El.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?Zi(this,0,e):ti.apply(this,arguments)},El.prototype.equals=function(e){if(!$l(e))throw new TypeError("Argument must be a Buffer");return this===e||0===El.compare(this,e)},El.prototype.inspect=function(){var e="";return this.length>0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),"<Buffer "+e+">"},El.prototype.compare=function(e,t,l,i,n){if(!$l(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===l&&(l=e?e.length:0),void 0===i&&(i=0),void 0===n&&(n=this.length),t<0||l>e.length||i<0||n>this.length)throw new RangeError("out of range index");if(i>=n&&t>=l)return 0;if(i>=n)return-1;if(t>=l)return 1;if(this===e)return 0;for(var o=(n>>>=0)-(i>>>=0),d=(l>>>=0)-(t>>>=0),c=Math.min(o,d),a=this.slice(i,n),s=e.slice(t,l),r=0;r<c;++r)if(a[r]!==s[r]){o=a[r],d=s[r];break}return o<d?-1:d<o?1:0},El.prototype.includes=function(e,t,l){return-1!==this.indexOf(e,t,l)},El.prototype.indexOf=function(e,t,l){return ii(this,e,t,l,!0)},El.prototype.lastIndexOf=function(e,t,l){return ii(this,e,t,l,!1)},El.prototype.write=function(e,t,l,i){if(void 0===t)i="utf8",l=this.length,t=0;else if(void 0===l&&"string"==typeof t)i=t,l=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(l)?(l|=0,void 0===i&&(i="utf8")):(i=l,l=void 0)}var n=this.length-t;if((void 0===l||l>n)&&(l=n),e.length>0&&(l<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var o=!1;;)switch(i){case"hex":return oi(this,e,t,l);case"utf8":case"utf-8":return di(this,e,t,l);case"ascii":return ci(this,e,t,l);case"latin1":case"binary":return ai(this,e,t,l);case"base64":return si(this,e,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ri(this,e,t,l);default:if(o)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),o=!0}},El.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var bi=4096;function hi(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(127&e[n]);return i}function mi(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(e[n]);return i}function pi(e,t,l){var i=e.length;(!t||t<0)&&(t=0),(!l||l<0||l>i)&&(l=i);for(var n="",o=t;o<l;++o)n+=vi(e[o]);return n}function Gi(e,t,l){for(var i=e.slice(t,l),n="",o=0;o<i.length;o+=2)n+=String.fromCharCode(i[o]+256*i[o+1]);return n}function Xi(e,t,l){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>l)throw new RangeError("Trying to access beyond buffer length")}function yi(e,t,l,i,n,o){if(!$l(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||t<o)throw new RangeError('"value" argument is out of bounds');if(l+i>e.length)throw new RangeError("Index out of range")}function Wi(e,t,l,i){t<0&&(t=65535+t+1);for(var n=0,o=Math.min(e.length-l,2);n<o;++n)e[l+n]=(t&255<<8*(i?n:1-n))>>>8*(i?n:1-n)}function Vi(e,t,l,i){t<0&&(t=4294967295+t+1);for(var n=0,o=Math.min(e.length-l,4);n<o;++n)e[l+n]=t>>>8*(i?n:3-n)&255}function Ii(e,t,l,i,n,o){if(l+i>e.length)throw new RangeError("Index out of range");if(l<0)throw new RangeError("Index out of range")}function Ri(e,t,l,i,n){return n||Ii(e,0,l,4),zl(e,t,l,i,23,4),l+4}function Si(e,t,l,i,n){return n||Ii(e,0,l,8),zl(e,t,l,i,52,8),l+8}El.prototype.slice=function(e,t){var l,i=this.length;if((e=~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),(t=void 0===t?i:~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),t<e&&(t=e),El.TYPED_ARRAY_SUPPORT)(l=this.subarray(e,t)).__proto__=El.prototype;else{var n=t-e;l=new El(n,void 0);for(var o=0;o<n;++o)l[o]=this[o+e]}return l},El.prototype.readUIntLE=function(e,t,l){e|=0,t|=0,l||Xi(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i},El.prototype.readUIntBE=function(e,t,l){e|=0,t|=0,l||Xi(e,t,this.length);for(var i=this[e+--t],n=1;t>0&&(n*=256);)i+=this[e+--t]*n;return i},El.prototype.readUInt8=function(e,t){return t||Xi(e,1,this.length),this[e]},El.prototype.readUInt16LE=function(e,t){return t||Xi(e,2,this.length),this[e]|this[e+1]<<8},El.prototype.readUInt16BE=function(e,t){return t||Xi(e,2,this.length),this[e]<<8|this[e+1]},El.prototype.readUInt32LE=function(e,t){return t||Xi(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},El.prototype.readUInt32BE=function(e,t){return t||Xi(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},El.prototype.readIntLE=function(e,t,l){e|=0,t|=0,l||Xi(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i>=(n*=128)&&(i-=Math.pow(2,8*t)),i},El.prototype.readIntBE=function(e,t,l){e|=0,t|=0,l||Xi(e,t,this.length);for(var i=t,n=1,o=this[e+--i];i>0&&(n*=256);)o+=this[e+--i]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*t)),o},El.prototype.readInt8=function(e,t){return t||Xi(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},El.prototype.readInt16LE=function(e,t){t||Xi(e,2,this.length);var l=this[e]|this[e+1]<<8;return 32768&l?4294901760|l:l},El.prototype.readInt16BE=function(e,t){t||Xi(e,2,this.length);var l=this[e+1]|this[e]<<8;return 32768&l?4294901760|l:l},El.prototype.readInt32LE=function(e,t){return t||Xi(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},El.prototype.readInt32BE=function(e,t){return t||Xi(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},El.prototype.readFloatLE=function(e,t){return t||Xi(e,4,this.length),xl(this,e,!0,23,4)},El.prototype.readFloatBE=function(e,t){return t||Xi(e,4,this.length),xl(this,e,!1,23,4)},El.prototype.readDoubleLE=function(e,t){return t||Xi(e,8,this.length),xl(this,e,!0,52,8)},El.prototype.readDoubleBE=function(e,t){return t||Xi(e,8,this.length),xl(this,e,!1,52,8)},El.prototype.writeUIntLE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||yi(this,e,t,l,Math.pow(2,8*l)-1,0);var n=1,o=0;for(this[t]=255&e;++o<l&&(n*=256);)this[t+o]=e/n&255;return t+l},El.prototype.writeUIntBE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||yi(this,e,t,l,Math.pow(2,8*l)-1,0);var n=l-1,o=1;for(this[t+n]=255&e;--n>=0&&(o*=256);)this[t+n]=e/o&255;return t+l},El.prototype.writeUInt8=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,1,255,0),El.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},El.prototype.writeUInt16LE=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,2,65535,0),El.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Wi(this,e,t,!0),t+2},El.prototype.writeUInt16BE=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,2,65535,0),El.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Wi(this,e,t,!1),t+2},El.prototype.writeUInt32LE=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,4,4294967295,0),El.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):Vi(this,e,t,!0),t+4},El.prototype.writeUInt32BE=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,4,4294967295,0),El.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Vi(this,e,t,!1),t+4},El.prototype.writeIntLE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);yi(this,e,t,l,n-1,-n)}var o=0,d=1,c=0;for(this[t]=255&e;++o<l&&(d*=256);)e<0&&0===c&&0!==this[t+o-1]&&(c=1),this[t+o]=(e/d>>0)-c&255;return t+l},El.prototype.writeIntBE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);yi(this,e,t,l,n-1,-n)}var o=l-1,d=1,c=0;for(this[t+o]=255&e;--o>=0&&(d*=256);)e<0&&0===c&&0!==this[t+o+1]&&(c=1),this[t+o]=(e/d>>0)-c&255;return t+l},El.prototype.writeInt8=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,1,127,-128),El.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},El.prototype.writeInt16LE=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,2,32767,-32768),El.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Wi(this,e,t,!0),t+2},El.prototype.writeInt16BE=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,2,32767,-32768),El.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Wi(this,e,t,!1),t+2},El.prototype.writeInt32LE=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,4,2147483647,-2147483648),El.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):Vi(this,e,t,!0),t+4},El.prototype.writeInt32BE=function(e,t,l){return e=+e,t|=0,l||yi(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),El.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Vi(this,e,t,!1),t+4},El.prototype.writeFloatLE=function(e,t,l){return Ri(this,e,t,!0,l)},El.prototype.writeFloatBE=function(e,t,l){return Ri(this,e,t,!1,l)},El.prototype.writeDoubleLE=function(e,t,l){return Si(this,e,t,!0,l)},El.prototype.writeDoubleBE=function(e,t,l){return Si(this,e,t,!1,l)},El.prototype.copy=function(e,t,l,i){if(l||(l=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<l&&(i=l),i===l)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(l<0||l>=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-l&&(i=e.length-t+l);var n,o=i-l;if(this===e&&l<t&&t<i)for(n=o-1;n>=0;--n)e[n+t]=this[n+l];else if(o<1e3||!El.TYPED_ARRAY_SUPPORT)for(n=0;n<o;++n)e[n+t]=this[n+l];else Uint8Array.prototype.set.call(e,this.subarray(l,l+o),t);return o},El.prototype.fill=function(e,t,l,i){if("string"==typeof e){if("string"==typeof t?(i=t,t=0,l=this.length):"string"==typeof l&&(i=l,l=this.length),1===e.length){var n=e.charCodeAt(0);n<256&&(e=n)}if(void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!El.isEncoding(i))throw new TypeError("Unknown encoding: "+i)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<l)throw new RangeError("Out of range index");if(l<=t)return this;var o;if(t>>>=0,l=void 0===l?this.length:l>>>0,e||(e=0),"number"==typeof e)for(o=t;o<l;++o)this[o]=e;else{var d=$l(e)?e:Yi(new El(e,i).toString()),c=d.length;for(o=0;o<l-t;++o)this[o+t]=d[o%c]}return this};var gi=/[^+\/0-9A-Za-z-_]/g;function vi(e){return e<16?"0"+e.toString(16):e.toString(16)}function Yi(e,t){var l;t=t||1/0;for(var i=e.length,n=null,o=[],d=0;d<i;++d){if((l=e.charCodeAt(d))>55295&&l<57344){if(!n){if(l>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(d+1===i){(t-=3)>-1&&o.push(239,191,189);continue}n=l;continue}if(l<56320){(t-=3)>-1&&o.push(239,191,189),n=l;continue}l=65536+(n-55296<<10|l-56320)}else n&&(t-=3)>-1&&o.push(239,191,189);if(n=null,l<128){if((t-=1)<0)break;o.push(l)}else if(l<2048){if((t-=2)<0)break;o.push(l>>6|192,63&l|128)}else if(l<65536){if((t-=3)<0)break;o.push(l>>12|224,l>>6&63|128,63&l|128)}else{if(!(l<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(l>>18|240,l>>12&63|128,l>>6&63|128,63&l|128)}}return o}function Ki(e){return function(e){var t,l,i,n,o,d;Hl||Tl();var c=e.length;if(c%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===e[c-2]?2:"="===e[c-1]?1:0,d=new Ll(3*c/4-o),i=o>0?c-4:c;var a=0;for(t=0,l=0;t<i;t+=4,l+=3)n=Ul[e.charCodeAt(t)]<<18|Ul[e.charCodeAt(t+1)]<<12|Ul[e.charCodeAt(t+2)]<<6|Ul[e.charCodeAt(t+3)],d[a++]=n>>16&255,d[a++]=n>>8&255,d[a++]=255&n;return 2===o?(n=Ul[e.charCodeAt(t)]<<2|Ul[e.charCodeAt(t+1)]>>4,d[a++]=255&n):1===o&&(n=Ul[e.charCodeAt(t)]<<10|Ul[e.charCodeAt(t+1)]<<4|Ul[e.charCodeAt(t+2)]>>2,d[a++]=n>>8&255,d[a++]=255&n),d}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(gi,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function Ni(e,t,l,i){for(var n=0;n<i&&!(n+l>=t.length||n>=e.length);++n)t[n+l]=e[n];return n}function fi(e){return null!=e&&(!!e._isBuffer||Ji(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&Ji(e.slice(0,0))}(e))}function Ji(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var Ci=Object.freeze({__proto__:null,Buffer:El,INSPECT_MAX_BYTES:50,SlowBuffer:function(e){return+e!=e&&(e=0),El.alloc(+e)},isBuffer:fi,kMaxLength:Ml}),ki={exports:{}},Ui={},Li={};Object.defineProperty(Li,"__esModule",{value:!0}),Li.default=function(e){var t=e.length,l=t%4;if(!l)return e;var i=t,n=4-l,o=t+n,d=El.alloc(o);for(d.write(e);n--;)d.write("=",i++);return d.toString()},Object.defineProperty(Ui,"__esModule",{value:!0});var Hi=Li;function Ti(e,t){return void 0===t&&(t="utf8"),El.isBuffer(e)?wi(e.toString("base64")):wi(El.from(e,t).toString("base64"))}function Fi(e){return e=e.toString(),Hi.default(e).replace(/\-/g,"+").replace(/_/g,"/")}function wi(e){return e.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var xi,zi=Ti;zi.encode=Ti,zi.decode=function(e,t){return void 0===t&&(t="utf8"),El.from(Fi(e),"base64").toString(t)},zi.toBase64=Fi,zi.fromBase64=wi,zi.toBuffer=function(e){return El.from(Fi(e),"base64")},Ui.default=zi,(xi=ki).exports=Ui.default,xi.exports.default=xi.exports;var Bi=ki.exports,Pi={exports:{}};!function(e){!function(t,l){var i={};!function(e){e.__esModule=!0,e.digestLength=32,e.blockSize=64;var t=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function l(e,l,i,n,o){for(var d,c,a,s,r,u,Z,b,h,m,p,G,X;o>=64;){for(d=l[0],c=l[1],a=l[2],s=l[3],r=l[4],u=l[5],Z=l[6],b=l[7],m=0;m<16;m++)p=n+4*m,e[m]=(255&i[p])<<24|(255&i[p+1])<<16|(255&i[p+2])<<8|255&i[p+3];for(m=16;m<64;m++)G=((h=e[m-2])>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,X=((h=e[m-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,e[m]=(G+e[m-7]|0)+(X+e[m-16]|0);for(m=0;m<64;m++)G=(((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+(r&u^~r&Z)|0)+(b+(t[m]+e[m]|0)|0)|0,X=((d>>>2|d<<30)^(d>>>13|d<<19)^(d>>>22|d<<10))+(d&c^d&a^c&a)|0,b=Z,Z=u,u=r,r=s+G|0,s=a,a=c,c=d,d=G+X|0;l[0]+=d,l[1]+=c,l[2]+=a,l[3]+=s,l[4]+=r,l[5]+=u,l[6]+=Z,l[7]+=b,n+=64,o-=64}return n}var i=function(){function t(){this.digestLength=e.digestLength,this.blockSize=e.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return t.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},t.prototype.clean=function(){for(var e=0;e<this.buffer.length;e++)this.buffer[e]=0;for(e=0;e<this.temp.length;e++)this.temp[e]=0;this.reset()},t.prototype.update=function(e,t){if(void 0===t&&(t=e.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var i=0;if(this.bytesHashed+=t,this.bufferLength>0){for(;this.bufferLength<64&&t>0;)this.buffer[this.bufferLength++]=e[i++],t--;64===this.bufferLength&&(l(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(t>=64&&(i=l(this.temp,this.state,e,i,t),t%=64);t>0;)this.buffer[this.bufferLength++]=e[i++],t--;return this},t.prototype.finish=function(e){if(!this.finished){var t=this.bytesHashed,i=this.bufferLength,n=t/536870912|0,o=t<<3,d=t%64<56?64:128;this.buffer[i]=128;for(var c=i+1;c<d-8;c++)this.buffer[c]=0;this.buffer[d-8]=n>>>24&255,this.buffer[d-7]=n>>>16&255,this.buffer[d-6]=n>>>8&255,this.buffer[d-5]=n>>>0&255,this.buffer[d-4]=o>>>24&255,this.buffer[d-3]=o>>>16&255,this.buffer[d-2]=o>>>8&255,this.buffer[d-1]=o>>>0&255,l(this.temp,this.state,this.buffer,0,d),this.finished=!0}for(c=0;c<8;c++)e[4*c+0]=this.state[c]>>>24&255,e[4*c+1]=this.state[c]>>>16&255,e[4*c+2]=this.state[c]>>>8&255,e[4*c+3]=this.state[c]>>>0&255;return this},t.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},t.prototype._saveState=function(e){for(var t=0;t<this.state.length;t++)e[t]=this.state[t]},t.prototype._restoreState=function(e,t){for(var l=0;l<this.state.length;l++)this.state[l]=e[l];this.bytesHashed=t,this.finished=!1,this.bufferLength=0},t}();e.Hash=i;var n=function(){function e(e){this.inner=new i,this.outer=new i,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var t=new Uint8Array(this.blockSize);if(e.length>this.blockSize)(new i).update(e).finish(t).clean();else for(var l=0;l<e.length;l++)t[l]=e[l];for(l=0;l<t.length;l++)t[l]^=54;this.inner.update(t);for(l=0;l<t.length;l++)t[l]^=106;this.outer.update(t),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(l=0;l<t.length;l++)t[l]=0}return e.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},e.prototype.clean=function(){for(var e=0;e<this.istate.length;e++)this.ostate[e]=this.istate[e]=0;this.inner.clean(),this.outer.clean()},e.prototype.update=function(e){return this.inner.update(e),this},e.prototype.finish=function(e){return this.outer.finished?this.outer.finish(e):(this.inner.finish(e),this.outer.update(e,this.digestLength).finish(e)),this},e.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},e}();function o(e){var t=(new i).update(e),l=t.digest();return t.clean(),l}function d(e,t){var l=new n(e).update(t),i=l.digest();return l.clean(),i}function c(e,t,l,i){var n=i[0];if(0===n)throw new Error("hkdf: cannot expand more");t.reset(),n>1&&t.update(e),l&&t.update(l),t.update(i),t.finish(e),i[0]++}e.HMAC=n,e.hash=o,e.default=o,e.hmac=d;var a=new Uint8Array(e.digestLength);function s(e,t,l,i){void 0===t&&(t=a),void 0===i&&(i=32);for(var o=new Uint8Array([1]),s=d(t,e),r=new n(s),u=new Uint8Array(r.digestLength),Z=u.length,b=new Uint8Array(i),h=0;h<i;h++)Z===u.length&&(c(u,r,l,o),Z=0),b[h]=u[Z++];return r.clean(),u.fill(0),o.fill(0),b}function r(e,t,l,i){for(var o=new n(e),d=o.digestLength,c=new Uint8Array(4),a=new Uint8Array(d),s=new Uint8Array(d),r=new Uint8Array(i),u=0;u*d<i;u++){var Z=u+1;c[0]=Z>>>24&255,c[1]=Z>>>16&255,c[2]=Z>>>8&255,c[3]=Z>>>0&255,o.reset(),o.update(t),o.update(c),o.finish(s);for(var b=0;b<d;b++)a[b]=s[b];for(b=2;b<=l;b++){o.reset(),o.update(s).finish(s);for(var h=0;h<d;h++)a[h]^=s[h]}for(b=0;b<d&&u*d+b<i;b++)r[u*d+b]=a[b]}for(u=0;u<d;u++)a[u]=s[u]=0;for(u=0;u<4;u++)c[u]=0;return o.clean(),r}e.hkdf=s,e.pbkdf2=r}(i);var n=i.default;for(var o in i)n[o]=i[o];e.exports=n}()}(Pi);var Mi=We(Pi.exports),ji=crypto;const Qi=e=>e instanceof CryptoKey,Ei=new TextEncoder,Di=new TextDecoder;const Oi=e=>{let t=e;t instanceof Uint8Array&&(t=Di.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return(e=>{const t=atob(e),l=new Uint8Array(t.length);for(let e=0;e<t.length;e++)l[e]=t.charCodeAt(e);return l})(t)}catch(e){throw new TypeError("The input to be decoded is not correctly encoded.")}};class Ai extends Error{constructor(e){var t;super(e),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,null===(t=Error.captureStackTrace)||void 0===t||t.call(Error,this,this.constructor)}static get code(){return"ERR_JOSE_GENERIC"}}class _i extends Ai{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=t,this.reason=l}static get code(){return"ERR_JWT_CLAIM_VALIDATION_FAILED"}}class qi extends Ai{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_EXPIRED",this.claim=t,this.reason=l}static get code(){return"ERR_JWT_EXPIRED"}}class $i extends Ai{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}static get code(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}class en extends Ai{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class tn extends Ai{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}static get code(){return"ERR_JWS_INVALID"}}class ln extends Ai{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}static get code(){return"ERR_JWT_INVALID"}}class nn extends Ai{constructor(){super(...arguments),this.code="ERR_JWKS_INVALID"}static get code(){return"ERR_JWKS_INVALID"}}class on extends Ai{constructor(){super(...arguments),this.code="ERR_JWKS_NO_MATCHING_KEY",this.message="no applicable key found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_NO_MATCHING_KEY"}}class dn extends Ai{constructor(){super(...arguments),this.code="ERR_JWKS_MULTIPLE_MATCHING_KEYS",this.message="multiple matching keys found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_MULTIPLE_MATCHING_KEYS"}}class cn extends Ai{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed"}static get code(){return"ERR_JWS_SIGNATURE_VERIFICATION_FAILED"}}function an(){return"function"==typeof WebSocketPair}function sn(e,t="algorithm.name"){return new TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`)}function rn(e,t){return e.name===t}function un(e){return parseInt(e.name.slice(4),10)}function Zn(e,t,...l){switch(t){case"HS256":case"HS384":case"HS512":{if(!rn(e.algorithm,"HMAC"))throw sn("HMAC");const l=parseInt(t.slice(2),10);if(un(e.algorithm.hash)!==l)throw sn(`SHA-${l}`,"algorithm.hash");break}case"RS256":case"RS384":case"RS512":{if(!rn(e.algorithm,"RSASSA-PKCS1-v1_5"))throw sn("RSASSA-PKCS1-v1_5");const l=parseInt(t.slice(2),10);if(un(e.algorithm.hash)!==l)throw sn(`SHA-${l}`,"algorithm.hash");break}case"PS256":case"PS384":case"PS512":{if(!rn(e.algorithm,"RSA-PSS"))throw sn("RSA-PSS");const l=parseInt(t.slice(2),10);if(un(e.algorithm.hash)!==l)throw sn(`SHA-${l}`,"algorithm.hash");break}case an()&&"EdDSA":if(!rn(e.algorithm,"NODE-ED25519"))throw sn("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":{if(!rn(e.algorithm,"ECDSA"))throw sn("ECDSA");const l=function(e){switch(e){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw new Error("unreachable")}}(t);if(e.algorithm.namedCurve!==l)throw sn(l,"algorithm.namedCurve");break}default:throw new TypeError("CryptoKey does not support this operation")}!function(e,t){if(t.length&&!t.some((t=>e.usages.includes(t)))){let e="CryptoKey does not support this operation, its usages must include ";if(t.length>2){const l=t.pop();e+=`one of ${t.join(", ")}, or ${l}.`}else 2===t.length?e+=`one of ${t[0]} or ${t[1]}.`:e+=`${t[0]}.`;throw new TypeError(e)}}(e,l)}var bn=(e,...t)=>{let l="Key must be ";if(t.length>2){const e=t.pop();l+=`one of type ${t.join(", ")}, or ${e}.`}else 2===t.length?l+=`one of type ${t[0]} or ${t[1]}.`:l+=`of type ${t[0]}.`;return null==e?l+=` Received ${e}`:"function"==typeof e&&e.name?l+=` Received function ${e.name}`:"object"==typeof e&&null!=e&&e.constructor&&e.constructor.name&&(l+=` Received an instance of ${e.constructor.name}`),l},hn=e=>Qi(e);const mn=["CryptoKey"];function pn(e){if("object"!=typeof(t=e)||null===t||"[object Object]"!==Object.prototype.toString.call(e))return!1;var t;if(null===Object.getPrototypeOf(e))return!0;let l=e;for(;null!==Object.getPrototypeOf(l);)l=Object.getPrototypeOf(l);return Object.getPrototypeOf(e)===l}const Gn=async e=>{var t,l;const{algorithm:i,keyUsages:n}=function(e){let t,l;switch(e.kty){case"oct":switch(e.alg){case"HS256":case"HS384":case"HS512":t={name:"HMAC",hash:`SHA-${e.alg.slice(-3)}`},l=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new en(`${e.alg} keys cannot be imported as CryptoKey instances`);case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":t={name:"AES-GCM"},l=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":t={name:"AES-KW"},l=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":t={name:"PBKDF2"},l=["deriveBits"];break;default:throw new en('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(e.alg){case"PS256":case"PS384":case"PS512":t={name:"RSA-PSS",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":t={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":t={name:"RSA-OAEP",hash:`SHA-${parseInt(e.alg.slice(-3),10)||1}`},l=e.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new en('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(e.alg){case"ES256":t={name:"ECDSA",namedCurve:"P-256"},l=e.d?["sign"]:["verify"];break;case"ES384":t={name:"ECDSA",namedCurve:"P-384"},l=e.d?["sign"]:["verify"];break;case"ES512":t={name:"ECDSA",namedCurve:"P-521"},l=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:"ECDH",namedCurve:e.crv},l=e.d?["deriveBits"]:[];break;default:throw new en('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case an()&&"OKP":if("EdDSA"!==e.alg)throw new en('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');if("Ed25519"!==e.crv)throw new en('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value');t={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},l=e.d?["sign"]:["verify"];break;default:throw new en('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:t,keyUsages:l}}(e),o=[i,null!==(t=e.ext)&&void 0!==t&&t,null!==(l=e.key_ops)&&void 0!==l?l:n];if("PBKDF2"===i.name)return ji.subtle.importKey("raw",Oi(e.k),...o);const d={...e};return delete d.alg,ji.subtle.importKey("jwk",d,...o)};const Xn=(e,t,l)=>{e.startsWith("HS")||"dir"===e||e.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(e)?(e=>{if(!(e instanceof Uint8Array)){if(!hn(e))throw new TypeError(bn(e,...mn,"Uint8Array"));if("secret"!==e.type)throw new TypeError(`${mn.join(" or ")} instances for symmetric algorithms must be of type "secret"`)}})(t):((e,t)=>{if(!hn(e))throw new TypeError(bn(e,...mn));if("secret"===e.type)throw new TypeError(`${mn.join(" or ")} instances for asymmetric algorithms must not be of type "secret"`);if("sign"===t&&"public"===e.type)throw new TypeError(`${mn.join(" or ")} instances for asymmetric algorithm signing must be of type "private"`);if("decrypt"===t&&"public"===e.type)throw new TypeError(`${mn.join(" or ")} instances for asymmetric algorithm decryption must be of type "private"`);if(e.algorithm&&"verify"===t&&"private"===e.type)throw new TypeError(`${mn.join(" or ")} instances for asymmetric algorithm verifying must be of type "public"`);if(e.algorithm&&"encrypt"===t&&"private"===e.type)throw new TypeError(`${mn.join(" or ")} instances for asymmetric algorithm encryption must be of type "public"`)})(t,l)};const yn=async(e,t,l,i)=>{const n=await function(e,t,l){if(Qi(t))return Zn(t,e,l),t;if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw new TypeError(bn(t,...mn));return ji.subtle.importKey("raw",t,{hash:`SHA-${e.slice(-3)}`,name:"HMAC"},!1,[l])}throw new TypeError(bn(t,...mn,"Uint8Array"))}(e,t,"verify");((e,t)=>{if(e.startsWith("RS")||e.startsWith("PS")){const{modulusLength:l}=t.algorithm;if("number"!=typeof l||l<2048)throw new TypeError(`${e} requires key modulusLength to be 2048 bits or larger`)}})(e,n);const o=function(e,t){const l=`SHA-${e.slice(-3)}`;switch(e){case"HS256":case"HS384":case"HS512":return{hash:l,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:l,name:"RSA-PSS",saltLength:e.slice(-3)>>3};case"RS256":case"RS384":case"RS512":return{hash:l,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:l,name:"ECDSA",namedCurve:t.namedCurve};case an()&&"EdDSA":const{namedCurve:i}=t;return{name:i,namedCurve:i};default:throw new en(`alg ${e} is not supported either by JOSE or your javascript runtime`)}}(e,n.algorithm);try{return await ji.subtle.verify(o,n,l,i)}catch(e){return!1}};async function Wn(e,t,l){var i;if(!pn(e))throw new tn("Flattened JWS must be an object");if(void 0===e.protected&&void 0===e.header)throw new tn('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==e.protected&&"string"!=typeof e.protected)throw new tn("JWS Protected Header incorrect type");if(void 0===e.payload)throw new tn("JWS Payload missing");if("string"!=typeof e.signature)throw new tn("JWS Signature missing or incorrect type");if(void 0!==e.header&&!pn(e.header))throw new tn("JWS Unprotected Header incorrect type");let n={};if(e.protected){const t=Oi(e.protected);try{n=JSON.parse(Di.decode(t))}catch(e){throw new tn("JWS Protected Header is invalid")}}if(!((...e)=>{const t=e.filter(Boolean);if(0===t.length||1===t.length)return!0;let l;for(const e of t){const t=Object.keys(e);if(l&&0!==l.size)for(const e of t){if(l.has(e))return!1;l.add(e)}else l=new Set(t)}return!0})(n,e.header))throw new tn("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const o={...n,...e.header},d=function(e,t,l,i,n){if(void 0!==n.crit&&void 0===i.crit)throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');if(!i||void 0===i.crit)return new Set;if(!Array.isArray(i.crit)||0===i.crit.length||i.crit.some((e=>"string"!=typeof e||0===e.length)))throw new e('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');let o;o=void 0!==l?new Map([...Object.entries(l),...t.entries()]):t;for(const t of i.crit){if(!o.has(t))throw new en(`Extension Header Parameter "${t}" is not recognized`);if(void 0===n[t])throw new e(`Extension Header Parameter "${t}" is missing`);if(o.get(t)&&void 0===i[t])throw new e(`Extension Header Parameter "${t}" MUST be integrity protected`)}return new Set(i.crit)}(tn,new Map([["b64",!0]]),null==l?void 0:l.crit,n,o);let c=!0;if(d.has("b64")&&(c=n.b64,"boolean"!=typeof c))throw new tn('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:a}=o;if("string"!=typeof a||!a)throw new tn('JWS "alg" (Algorithm) Header Parameter missing or invalid');const s=l&&((e,t)=>{if(void 0!==t&&(!Array.isArray(t)||t.some((e=>"string"!=typeof e))))throw new TypeError(`"${e}" option must be an array of strings`);if(t)return new Set(t)})("algorithms",l.algorithms);if(s&&!s.has(a))throw new $i('"alg" (Algorithm) Header Parameter not allowed');if(c){if("string"!=typeof e.payload)throw new tn("JWS Payload must be a string")}else if("string"!=typeof e.payload&&!(e.payload instanceof Uint8Array))throw new tn("JWS Payload must be a string or an Uint8Array instance");let r=!1;"function"==typeof t&&(t=await t(n,e),r=!0),Xn(a,t,"verify");const u=function(...e){const t=e.reduce(((e,{length:t})=>e+t),0),l=new Uint8Array(t);let i=0;return e.forEach((e=>{l.set(e,i),i+=e.length})),l}(Ei.encode(null!==(i=e.protected)&&void 0!==i?i:""),Ei.encode("."),"string"==typeof e.payload?Ei.encode(e.payload):e.payload),Z=Oi(e.signature);if(!await yn(a,t,Z,u))throw new cn;let b;b=c?Oi(e.payload):"string"==typeof e.payload?Ei.encode(e.payload):e.payload;const h={payload:b};return void 0!==e.protected&&(h.protectedHeader=n),void 0!==e.header&&(h.unprotectedHeader=e.header),r?{...h,key:t}:h}const Vn=86400,In=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var Rn=e=>{const t=In.exec(e);if(!t)throw new TypeError("Invalid time period format");const l=parseFloat(t[1]);switch(t[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(l);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*l);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*l);case"day":case"days":case"d":return Math.round(l*Vn);case"week":case"weeks":case"w":return Math.round(604800*l);default:return Math.round(31557600*l)}};const Sn=e=>e.toLowerCase().replace(/^application\//,"");var gn=(e,t,l={})=>{const{typ:i}=l;if(i&&("string"!=typeof e.typ||Sn(e.typ)!==Sn(i)))throw new _i('unexpected "typ" JWT header value',"typ","check_failed");let n;try{n=JSON.parse(Di.decode(t))}catch(e){}if(!pn(n))throw new ln("JWT Claims Set must be a top-level JSON object");const{issuer:o}=l;if(o&&!(Array.isArray(o)?o:[o]).includes(n.iss))throw new _i('unexpected "iss" claim value',"iss","check_failed");const{subject:d}=l;if(d&&n.sub!==d)throw new _i('unexpected "sub" claim value',"sub","check_failed");const{audience:c}=l;if(c&&(a=n.aud,s="string"==typeof c?[c]:c,!("string"==typeof a?s.includes(a):Array.isArray(a)&&s.some(Set.prototype.has.bind(new Set(a))))))throw new _i('unexpected "aud" claim value',"aud","check_failed");var a,s;let r;switch(typeof l.clockTolerance){case"string":r=Rn(l.clockTolerance);break;case"number":r=l.clockTolerance;break;case"undefined":r=0;break;default:throw new TypeError("Invalid clockTolerance option type")}const{currentDate:u}=l,Z=(b=u||new Date,Math.floor(b.getTime()/1e3));var b;if((void 0!==n.iat||l.maxTokenAge)&&"number"!=typeof n.iat)throw new _i('"iat" claim must be a number',"iat","invalid");if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new _i('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>Z+r)throw new _i('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new _i('"exp" claim must be a number',"exp","invalid");if(n.exp<=Z-r)throw new qi('"exp" claim timestamp check failed',"exp","check_failed")}if(l.maxTokenAge){const e=Z-n.iat;if(e-r>("number"==typeof l.maxTokenAge?l.maxTokenAge:Rn(l.maxTokenAge)))throw new qi('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(e<0-r)throw new _i('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};async function vn(e,t,l){var i;const n=await async function(e,t,l){if(e instanceof Uint8Array&&(e=Di.decode(e)),"string"!=typeof e)throw new tn("Compact JWS must be a string or Uint8Array");const{0:i,1:n,2:o,length:d}=e.split(".");if(3!==d)throw new tn("Invalid Compact JWS");const c=await Wn({payload:n,protected:i,signature:o},t,l),a={payload:c.payload,protectedHeader:c.protectedHeader};return"function"==typeof t?{...a,key:c.key}:a}(e,t,l);if((null===(i=n.protectedHeader.crit)||void 0===i?void 0:i.includes("b64"))&&!1===n.protectedHeader.b64)throw new ln("JWTs MUST NOT use unencoded payload");const o={payload:gn(n.protectedHeader,n.payload,l),protectedHeader:n.protectedHeader};return"function"==typeof t?{...o,key:n.key}:o}function Yn(e){return pn(e)}class Kn{constructor(e){if(this._cached=new WeakMap,!function(e){return e&&"object"==typeof e&&Array.isArray(e.keys)&&e.keys.every(Yn)}(e))throw new nn("JSON Web Key Set malformed");var t;this._jwks=(t=e,"function"==typeof structuredClone?structuredClone(t):JSON.parse(JSON.stringify(t)))}async getKey(e,t){const{alg:l,kid:i}={...e,...t.header},n=function(e){switch("string"==typeof e&&e.slice(0,2)){case"RS":case"PS":return"RSA";case"ES":return"EC";case"Ed":return"OKP";default:throw new en('Unsupported "alg" value for a JSON Web Key Set')}}(l),o=this._jwks.keys.filter((e=>{let t=n===e.kty;if(t&&"string"==typeof i&&(t=i===e.kid),t&&"string"==typeof e.alg&&(t=l===e.alg),t&&"string"==typeof e.use&&(t="sig"===e.use),t&&Array.isArray(e.key_ops)&&(t=e.key_ops.includes("verify")),t&&"EdDSA"===l&&(t="Ed25519"===e.crv||"Ed448"===e.crv),t)switch(l){case"ES256":t="P-256"===e.crv;break;case"ES256K":t="secp256k1"===e.crv;break;case"ES384":t="P-384"===e.crv;break;case"ES512":t="P-521"===e.crv}return t})),{0:d,length:c}=o;if(0===c)throw new on;if(1!==c)throw new dn;const a=this._cached.get(d)||this._cached.set(d,{}).get(d);if(void 0===a[l]){const e=await async function(e,t,l){if(!pn(e))throw new TypeError("JWK must be an object");if(t||(t=e.alg),"string"!=typeof t||!t)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');switch(e.kty){case"oct":if("string"!=typeof e.k||!e.k)throw new TypeError('missing "k" (Key Value) Parameter value');return null!=l||(l=!0!==e.ext),l?Gn({...e,alg:t,ext:!1}):Oi(e.k);case"RSA":if(void 0!==e.oth)throw new en('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return Gn({...e,alg:t});default:throw new en('Unsupported "kty" (Key Type) Parameter value')}}({...d,ext:!0},l);if(e instanceof Uint8Array||"public"!==e.type)throw new nn("JSON Web Key Set members must be public keys");a[l]=e}return a[l]}}var Nn={exports:{}},fn={exports:{}},Jn=Ve(Ci);!function(e,t){var l=Jn,i=l.Buffer;function n(e,t){for(var l in e)t[l]=e[l]}function o(e,t,l){return i(e,t,l)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=l:(n(l,t),t.Buffer=o),o.prototype=Object.create(i.prototype),n(i,o),o.from=function(e,t,l){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,l)},o.alloc=function(e,t,l){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof l?n.fill(t,l):n.fill(t):n.fill(0),n},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return l.SlowBuffer(e)}}(fn,fn.exports);var Cn=65536,kn=4294967295;var Un=fn.exports.Buffer,Ln=ye.crypto||ye.msCrypto;Ln&&Ln.getRandomValues?Nn.exports=function(e,t){if(e>kn)throw new RangeError("requested too many random bytes");var l=Un.allocUnsafe(e);if(e>0)if(e>Cn)for(var i=0;i<e;i+=Cn)Ln.getRandomValues(l.slice(i,i+Cn));else Ln.getRandomValues(l);if("function"==typeof t)return ut.nextTick((function(){t(null,l)}));return l}:Nn.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var Hn=Nn.exports;class Tn{base64URLEncode(e){return Bi.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}base64URLDecode(e){return Bi.decode(e).toString()}hashSha256(e){return El.from(Mi((new TextEncoder).encode(e)))}generateRandomBytes(e){return Hn(e)}verifyJwt(e,t,l,i,n,o,d,c){const a={algorithms:l,audience:i,clockTolerance:d,subject:o};return(null==c||c)&&(a.issuer=n),vn(e,(s={keys:[t]},Kn.prototype.getKey.bind(new Kn(s))),a).then((()=>Promise.resolve(!0))).catch((e=>{var t;return Promise.reject(new u("SPA-CRYPTO-UTILS-VJ-IV01",null!==(t=null==e?void 0:e.reason)&&void 0!==t?t:JSON.stringify(e),`${null==e?void 0:e.code} ${null==e?void 0:e.claim}`))}));var s}}const Fn=(l,i,n)=>t(void 0,void 0,void 0,(function*(){var c;const a=(t=>{switch(t){case e.Storage.LocalStorage:return new fl;case e.Storage.SessionStorage:return new Cl;case e.Storage.BrowserMemory:return new Jl;default:return new Cl}})(i.storage),r=new Tn,u=new X;yield u.initialize(i,a,r,l);const b=new Ge(u),h=u.getDataLayer(),m=yield Xe((()=>t(void 0,void 0,void 0,(function*(){return u.getSignOutURL()}))),null!==(c=i.storage)&&void 0!==c?c:e.Storage.SessionStorage,(e=>h.setSessionDataParameter(d,null!=e?e:""))),p=n(u,b);let G=!1;const y=Nl.getInstance();let W,V,I=!0;(null==y?void 0:y.init)&&(yield y.init(!0,(e=>t(void 0,void 0,void 0,(function*(){yield p.attachTokenToRequestConfig(e)})))));const R=()=>t(void 0,void 0,void 0,(function*(){const e=yield u.getOIDCServiceEndpoints(),l=yield h.getConfigData();p.initializeSessionManger(l,e,(()=>t(void 0,void 0,void 0,(function*(){return(yield u.getBasicUserInfo()).sessionState}))),(e=>t(void 0,void 0,void 0,(function*(){return u.getAuthorizationURL(e)}))),m)})),S=()=>t(void 0,void 0,void 0,(function*(){return yield m.receivePromptNoneResponse((e=>t(void 0,void 0,void 0,(function*(){yield h.setSessionDataParameter(d,null!=e?e:"")}))))})),g=e=>{e.preventSignOutURLUpdate&&(G=!0)},v=(e,l,i,n)=>t(void 0,void 0,void 0,(function*(){return yield p.requestAccessToken(e,l,R,void 0,i,n)})),Y=(l={})=>t(void 0,void 0,void 0,(function*(){const t=yield h.getConfigData(),i=yield u.getAuthorizationURL(Object.assign({prompt:"none",state:de},l)),n=new URL(i);n.searchParams.set("response_mode","query");const o=n.toString();if(t.storage===e.Storage.BrowserMemory&&t.enablePKCE){const e=n.searchParams.get(s);me.setPKCE(Z.extractPKCEKeyFromStateParam(null!=e?e:""),yield u.getPKCECode(null!=e?e:""))}return o}));return{disableHttpHandler:()=>(p.disableHttpHandler(y),I=!1,!0),enableHttpHandler:()=>(p.enableHttpHandler(y),I=!0,!0),getAccessToken:()=>t(void 0,void 0,void 0,(function*(){return p.getAccessToken()})),getBasicUserInfo:()=>t(void 0,void 0,void 0,(function*(){return p.getBasicUserInfo()})),getConfigData:()=>t(void 0,void 0,void 0,(function*(){return yield h.getConfigData()})),getCryptoHelper:()=>t(void 0,void 0,void 0,(function*(){return p.getCryptoHelper()})),getDataLayer:()=>t(void 0,void 0,void 0,(function*(){return p.getDataLayer()})),getDecodedIDToken:()=>t(void 0,void 0,void 0,(function*(){return p.getDecodedIDToken()})),getHttpClient:()=>y,getIDToken:()=>t(void 0,void 0,void 0,(function*(){return p.getIDToken()})),getOIDCServiceEndpoints:()=>t(void 0,void 0,void 0,(function*(){return p.getOIDCServiceEndpoints()})),httpRequest:e=>t(void 0,void 0,void 0,(function*(){return yield p.httpRequest(y,e,I,W,V)})),httpRequestAll:e=>t(void 0,void 0,void 0,(function*(){return yield p.httpRequestAll(e,y,I,W,V)})),isAuthenticated:()=>t(void 0,void 0,void 0,(function*(){return p.isAuthenticated()})),isSessionActive:()=>t(void 0,void 0,void 0,(function*(){return"true"===(yield h.getSessionStatus())})),refreshAccessToken:()=>t(void 0,void 0,void 0,(function*(){try{return yield p.refreshAccessToken(g)}catch(e){return Promise.reject(e)}})),requestCustomGrant:e=>t(void 0,void 0,void 0,(function*(){return yield p.requestCustomGrant(e,g)})),revokeAccessToken:()=>t(void 0,void 0,void 0,(function*(){const e=yield b.getRefreshTimeoutTimer();return u.revokeAccessToken().then((()=>(m.reset(),b.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestErrorCallback:e=>{W=e},setHttpRequestFinishCallback:e=>{(null==y?void 0:y.setHttpRequestFinishCallback)&&y.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==y?void 0:y.setHttpRequestStartCallback)&&y.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==y?void 0:y.setHttpRequestSuccessCallback)&&y.setHttpRequestSuccessCallback(e)},signIn:(l,n,c,a,r)=>t(void 0,void 0,void 0,(function*(){var b,m,G;const X=yield p.handleSignIn(S,R,void 0);if(X)return X;{let p,X,W,V={params:{}};if((null==i?void 0:i.responseMode)===e.ResponseMode.formPost&&n?(p=n,X=null!=c?c:"",W=null!=a?a:""):(p=null!==(b=new URL(window.location.href).searchParams.get(o))&&void 0!==b?b:"",X=null!==(m=new URL(window.location.href).searchParams.get(d))&&void 0!==m?m:"",W=null!==(G=new URL(window.location.href).searchParams.get(s))&&void 0!==G?G:"",me.removeAuthorizationCode()),p&&W){y="true",t(void 0,void 0,void 0,(function*(){yield h.setSessionStatus(y)}));const e=yield h.getTemporaryDataParameter(te);return e&&"string"==typeof e&&(V=JSON.parse(e)),v(p,X,W,V)}return u.getAuthorizationURL(l).then((l=>t(void 0,void 0,void 0,(function*(){if(i.storage===e.Storage.BrowserMemory&&i.enablePKCE){const e=Z.extractPKCEKeyFromStateParam(W);me.setPKCE(e,yield u.getPKCECode(W))}return r&&h.setTemporaryDataParameter(te,JSON.stringify(r)),location.href=l,yield me.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))}var y})),signOut:()=>t(void 0,void 0,void 0,(function*(){return(yield u.isAuthenticated())&&!G?location.href=yield u.getSignOutURL():location.href=me.getSignOutURL(i.clientID,l),b.clearRefreshTokenTimeout(),yield h.removeOIDCProviderMetaData(),yield h.removeTemporaryData(),yield h.removeSessionData(),yield h.removeSessionStatus(),yield me.waitTillPageRedirect(),!0})),trySignInSilently:(e,l)=>t(void 0,void 0,void 0,(function*(){return yield p.trySignInSilently(Y,v,m,e,l)})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){const t=yield h.getConfigData(),l=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},t),e);yield u.updateConfig(i),i.enableOIDCSessionManagement&&l&&(m.reset(),R())}))}})),wn=(l,i,n,c)=>t(void 0,void 0,void 0,(function*(){var a;let r;const b=null!==(a=null==i?void 0:i.requestTimeout)&&void 0!==a?a:6e4;let h=!0,m=!1;const p=(t=>{switch(t){case e.Storage.LocalStorage:return new fl;case e.Storage.SessionStorage:return new Cl;case e.Storage.BrowserMemory:return new Jl;default:return new Cl}})(i.storage),G=new Tn,y=new X;yield y.initialize(i,p,G,l);const W=new Ge(y),V=yield Xe((()=>t(void 0,void 0,void 0,(function*(){const e={type:v};try{return yield S(e)}catch(e){return me.getSignOutURL(i.clientID,l)}}))),i.storage,(e=>j(e))),I=c(y,W),R=new n,S=e=>{const t=new MessageChannel;return R.postMessage(e,[t.port2]),new Promise(((e,l)=>{const i=setTimeout((()=>{l(new u("SPA-WEB_WORKER_CLIENT-COM-TO01","Operation timed out.","No response was received from the web worker for "+b/1e3+" since dispatching the request"))}),b);return t.port1.onmessage=({data:n})=>{if(clearTimeout(i),t.port1.close(),t.port2.close(),null==n?void 0:n.success){const t=(null==n?void 0:n.data)?JSON.parse(null==n?void 0:n.data):null;(null==n?void 0:n.blob)&&(t.data=null==n?void 0:n.blob),e(t)}else l(n.error?JSON.parse(n.error):null)}}))},j=e=>S({data:e,type:Q}),A=()=>S({type:E}),_=()=>t(void 0,void 0,void 0,(function*(){const e=yield ne(),l=yield oe();I.initializeSessionManger(l,e,(()=>t(void 0,void 0,void 0,(function*(){return(yield ce()).sessionState}))),(e=>t(void 0,void 0,void 0,(function*(){return(yield ee(e)).authorizationURL}))),V)})),$=(e={})=>t(void 0,void 0,void 0,(function*(){var t;const l=yield oe(),i={data:Object.assign({prompt:"none",state:de},e),type:x},n=yield S(i),o=Z.extractPKCEKeyFromStateParam(null!==(t=new URL(n.authorizationURL).searchParams.get(s))&&void 0!==t?t:"");n.pkce&&l.enablePKCE&&me.setPKCE(o,n.pkce);const d=n.authorizationURL,c=new URL(d);c.searchParams.set("response_mode","query");return c.toString()})),ee=e=>t(void 0,void 0,void 0,(function*(){const l=yield oe();return S({data:e,type:x}).then((e=>t(void 0,void 0,void 0,(function*(){var t;if(e.pkce&&l.enablePKCE){const l=Z.extractPKCEKeyFromStateParam(null!==(t=new URL(e.authorizationURL).searchParams.get(s))&&void 0!==t?t:"");me.setPKCE(l,e.pkce)}return Promise.resolve(e)}))))})),te=(e,i,n,o)=>t(void 0,void 0,void 0,(function*(){const t=yield oe(),d=Z.extractPKCEKeyFromStateParam(n),c={data:{code:e,pkce:t.enablePKCE?me.getPKCE(d):void 0,sessionState:i,state:n,tokenRequestConfig:o},type:z};return t.enablePKCE&&me.removePKCE(d),S(c).then((e=>S({type:P}).then((i=>(me.setSignOutURL(i,t.clientID,l),t.enableOIDCSessionManagement&&_(),A(),Promise.resolve(e)))).catch((e=>Promise.reject(e))))).catch((e=>Promise.reject(e)))})),le=()=>t(void 0,void 0,void 0,(function*(){return yield V.receivePromptNoneResponse((e=>t(void 0,void 0,void 0,(function*(){return j(e)}))))})),ie=()=>t(void 0,void 0,void 0,(function*(){if(yield ae())return yield A(),i.enableOIDCSessionManagement&&_(),ce()})),ne=()=>S({type:U}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),oe=()=>S({type:q}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),ce=()=>S({type:L}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),ae=()=>S({type:B}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e)));return{disableHttpHandler:()=>S({type:w}).then((()=>(h=!1,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),enableHttpHandler:()=>S({type:F}).then((()=>(h=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),getBasicUserInfo:ce,getConfigData:oe,getCryptoHelper:()=>S({type:T}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDPIDToken:()=>S({type:"get-decoded-idp-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDToken:()=>S({type:H}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getIDToken:()=>S({type:O}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getOIDCServiceEndpoints:ne,httpRequest:e=>{(null==e?void 0:e.data)&&(null==e?void 0:e.data)instanceof FormData&&(e.data=Object.assign(Object.assign({},Object.fromEntries(null==e?void 0:e.data.entries())),{formData:!0}));return S({data:e,type:Y}).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return h&&("function"==typeof r.requestErrorCallback&&(yield r.requestErrorCallback(e)),"function"==typeof r.requestFinishCallback&&r.requestFinishCallback()),Promise.reject(e)}))))},httpRequestAll:e=>S({data:e,type:K}).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return h&&("function"==typeof r.requestErrorCallback&&(yield r.requestErrorCallback(e)),"function"==typeof r.requestFinishCallback&&r.requestFinishCallback()),Promise.reject(e)})))),initialize:()=>{r||(r={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),R.onmessage=({data:e})=>{switch(e.type){case k:(null==r?void 0:r.requestFinishCallback)&&(null==r||r.requestFinishCallback());break;case J:(null==r?void 0:r.requestStartCallback)&&(null==r||r.requestStartCallback());break;case C:(null==r?void 0:r.requestSuccessCallback)&&(null==r||r.requestSuccessCallback(e.data?JSON.parse(e.data):null))}};return S({data:i,type:g}).then((()=>Promise.resolve(!0))).catch((e=>Promise.reject(e)))},isAuthenticated:ae,refreshAccessToken:()=>S({type:M}),requestCustomGrant:e=>S({data:e,type:N}).then((t=>(e.preventSignOutURLUpdate&&(m=!0),Promise.resolve(t)))).catch((e=>Promise.reject(e))),revokeAccessToken:()=>S({type:f}).then((e=>(V.reset(),Promise.resolve(e)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{e&&"function"==typeof e&&(r.requestErrorCallback=e)},setHttpRequestFinishCallback:e=>{e&&"function"==typeof e&&(r.requestFinishCallback=e)},setHttpRequestStartCallback:e=>{e&&"function"==typeof e&&(r.requestStartCallback=e)},setHttpRequestSuccessCallback:e=>{e&&"function"==typeof e&&(r.requestSuccessCallback=e)},signIn:(l,n,c,a,r)=>t(void 0,void 0,void 0,(function*(){var u,Z,b;const h=yield I.handleSignIn(le,_,ie);if(h)return h;{let h,m,p;return(null==i?void 0:i.responseMode)===e.ResponseMode.formPost&&n?(h=n,m=null!=c?c:"",p=null!=a?a:""):(h=null!==(u=new URL(window.location.href).searchParams.get(o))&&void 0!==u?u:"",m=null!==(Z=new URL(window.location.href).searchParams.get(d))&&void 0!==Z?Z:"",p=null!==(b=new URL(window.location.href).searchParams.get(s))&&void 0!==b?b:"",me.removeAuthorizationCode()),h&&p?te(h,m,p,r):ee(l).then((e=>t(void 0,void 0,void 0,(function*(){return location.href=e.authorizationURL,yield me.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((e=>Promise.reject(e)))}})),signOut:()=>new Promise(((e,n)=>{if(!m){return S({type:v}).then((l=>t(void 0,void 0,void 0,(function*(){return window.location.href=l,yield me.waitTillPageRedirect(),e(!0)})))).catch((e=>n(e)))}window.location.href=me.getSignOutURL(i.clientID,l),me.waitTillPageRedirect().then((()=>Promise.resolve(!0)))})),trySignInSilently:(e,l)=>t(void 0,void 0,void 0,(function*(){return yield I.trySignInSilently($,te,V,e,l)})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){const t=yield oe(),l=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},t),e),n={data:i,type:D};yield S(n),i.enableOIDCSessionManagement&&l&&(V.reset(),_())}))}})),xn={autoLogoutOnTokenRefreshError:!0,checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,periodicTokenRefresh:!1,sessionRefreshInterval:300,storage:e.Storage.SessionStorage};class zn{constructor(e){this._authHelper=pe,this._worker=S,this._initialized=!1,this._startedInitialize=!1,this._onSignInCallback=()=>null,this._onSignOutCallback=()=>null,this._onSignOutFailedCallback=()=>null,this._onEndUserSession=()=>null,this._onInitialize=()=>null,this._onCustomGrant=new Map,this._instanceID=e}instantiateAuthHelper(e){this._authHelper=e||pe}instantiateWorker(e){this._worker=e||S}_isInitialized(){return t(this,void 0,void 0,(function*(){if(!this._startedInitialize)return!1;let e=0;for(;!this._initialized;)1e4===e&&console.warn("It is taking longer than usual for the object to be initialized"),yield new Promise((e=>setTimeout(e,1))),e++;return!0}))}_validateMethod(e=!0){return t(this,void 0,void 0,(function*(){return(yield this._isInitialized())?!(e&&!(yield this.isAuthenticated()))||Promise.reject(new u("SPA-AUTH_CLIENT-VM-IV02","The user is not authenticated.","The user must be authenticated first.")):Promise.reject(new u("SPA-AUTH_CLIENT-VM-NF01","The SDK is not initialized.","The SDK must be initialized first."))}))}static getInstance(e){var t,l;return e&&(null===(t=this._instances)||void 0===t?void 0:t.get(e))?this._instances.get(e):!e&&(null===(l=this._instances)||void 0===l?void 0:l.get(0))?this._instances.get(0):e?(this._instances.set(e,new zn(e)),this._instances.get(e)):(this._instances.set(0,new zn(0)),this._instances.get(0))}initialize(l,i,n){var o,d,c,a;return t(this,void 0,void 0,(function*(){this._storage=null!==(o=l.storage)&&void 0!==o?o:e.Storage.SessionStorage,this._initialized=!1,this._startedInitialize=!0,i&&this.instantiateAuthHelper(i),n&&this.instantiateWorker(n);const t=yield null===(d=this._client)||void 0===d?void 0:d.getConfigData();if(this._storage!==e.Storage.WebWorker){const e=l,i=Object.assign({},xn),n=Object.assign(Object.assign({},i),e);return this._client&&(!this._client||t&&0!==(null===(c=Object.keys(t))||void 0===c?void 0:c.length))||(this._client=yield Fn(this._instanceID,n,((e,t)=>new this._authHelper(e,t)))),this._initialized=!0,this._onInitialize&&this._onInitialize(!0),n.autoLogoutOnTokenRefreshError?(window.addEventListener("message",(e=>{var t;(null===(t=null==e?void 0:e.data)||void 0===t?void 0:t.type)===j&&this.signOut()})),Promise.resolve(!0)):Promise.resolve(!0)}if(!this._client||this._client&&(!t||0===(null===(a=Object.keys(t))||void 0===a?void 0:a.length))){const e=l;return this._client=yield wn(this._instanceID,Object.assign(Object.assign({},xn),e),this._worker,((e,t)=>new this._authHelper(e,t))),this._client.initialize().then((()=>(this._onInitialize&&this._onInitialize(!0),this._initialized=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e)))}return Promise.resolve(!0)}))}getBasicUserInfo(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(e=this._client)||void 0===e?void 0:e.getBasicUserInfo()}))}signIn(e,l,i,n,o){var d;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),me.canContinueSignIn(Boolean(null==e?void 0:e.callOnlyOnRedirect),l))return null==e||delete e.callOnlyOnRedirect,null===(d=this._client)||void 0===d?void 0:d.signIn(e,l,i,n,o).then((e=>(this._onSignInCallback&&(e.allowedScopes||e.displayName||e.email||e.username)&&this._onSignInCallback(e),e)))}))}trySignInSilently(e,l){var i;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!me.wasSignInCalled())return null===(i=this._client)||void 0===i?void 0:i.trySignInSilently(e,l).then((e=>{if(this._onSignInCallback&&e){const t=e;(t.allowedScopes||t.displayName||t.email||t.username)&&this._onSignInCallback(t)}return e}))}))}signOut(){var e,l;return t(this,void 0,void 0,(function*(){yield this._validateMethod(!1);return null!==(l=yield null===(e=this._client)||void 0===e?void 0:e.signOut())&&void 0!==l&&l}))}httpRequest(e){var l;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(!1),null===(l=this._client)||void 0===l?void 0:l.httpRequest(e)}))}httpRequestAll(e){var l;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(!1),null===(l=this._client)||void 0===l?void 0:l.httpRequestAll(e)}))}requestCustomGrant(e){var l,i;return t(this,void 0,void 0,(function*(){if(e.signInRequired,yield this._validateMethod(),!e.id)return Promise.reject(new u("SPA-AUTH_CLIENT-RCG-NF01","The custom grant request id not found.","The id attribute of the custom grant config object passed as an argument should have a value."));const t=yield null===(l=this._client)||void 0===l?void 0:l.requestCustomGrant(e),n=this._onCustomGrant.get(e.id);return n&&n(null===(i=this._onCustomGrant)||void 0===i?void 0:i.get(e.id)),t}))}revokeAccessToken(){var e;return t(this,void 0,void 0,(function*(){yield this._validateMethod();const t=yield null===(e=this._client)||void 0===e?void 0:e.revokeAccessToken();return this._onEndUserSession&&(yield this._onEndUserSession(t)),t}))}getOIDCServiceEndpoints(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.getOIDCServiceEndpoints()}))}getHttpClient(){if(this._client){if(this._storage!==e.Storage.WebWorker){return this._client.getHttpClient()}throw new u("SPA-AUTH_CLIENT-GHC-IV01","Http client cannot be returned.","The http client cannot be returned when the storage type is set to webWorker.")}throw new u("SPA-AUTH_CLIENT-GHC-NF02","The SDK is not initialized.","The SDK has not been initialized yet. Initialize the SDK using the initialize method before calling this method.")}getDecodedIDToken(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(e=this._client)||void 0===e?void 0:e.getDecodedIDToken()}))}getCryptoHelper(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(e=this._client)||void 0===e?void 0:e.getCryptoHelper()}))}getIDToken(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(e=this._client)||void 0===e?void 0:e.getIDToken()}))}getAccessToken(){return t(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new u("SPA-AUTH_CLIENT-GAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}getIDPAccessToken(){return t(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new u("SPA-AUTH_CLIENT-GIAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}getDataLayer(){return t(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new u("SPA-AUTH_CLIENT-GDL-IV01","The data layer cannot be returned.","The data layer cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getDataLayer()}))}getConfigData(){var e;return t(this,void 0,void 0,(function*(){return null===(e=this._client)||void 0===e?void 0:e.getConfigData()}))}refreshAccessToken(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(!1),null===(e=this._client)||void 0===e?void 0:e.refreshAccessToken()}))}isAuthenticated(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.isAuthenticated()}))}isSessionActive(){return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new u("SPA-AUTH_CLIENT-ISA-IV01","The active session cannot be returned.","The active session cannot be returned when the storage type is set to webWorker or browserMemory."));const t=this._client;return null==t?void 0:t.isSessionActive()}))}on(l,i,n){var o,d,c,a;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!i||"function"!=typeof i)throw new u("SPA-AUTH_CLIENT-ON-IV02","Invalid callback function.","The provided callback function is invalid.");switch(l){case e.Hooks.SignIn:this._onSignInCallback=i;break;case e.Hooks.SignOut:this._onSignOutCallback=i,(yield me.isSignOutSuccessful())&&this._onSignOutCallback();break;case e.Hooks.RevokeAccessToken:this._onEndUserSession=i;break;case e.Hooks.Initialize:this._onInitialize=i;break;case e.Hooks.HttpRequestError:null===(o=this._client)||void 0===o||o.setHttpRequestErrorCallback(i);break;case e.Hooks.HttpRequestFinish:null===(d=this._client)||void 0===d||d.setHttpRequestFinishCallback(i);break;case e.Hooks.HttpRequestStart:null===(c=this._client)||void 0===c||c.setHttpRequestStartCallback(i);break;case e.Hooks.HttpRequestSuccess:null===(a=this._client)||void 0===a||a.setHttpRequestSuccessCallback(i);break;case e.Hooks.CustomGrant:n&&this._onCustomGrant.set(n,i);break;case e.Hooks.SignOutFailed:{this._onSignOutFailedCallback=i;const e=me.didSignOutFail();e&&this._onSignOutFailedCallback(e);break}default:throw new u("SPA-AUTH_CLIENT-ON-IV01","Invalid hook.","The provided hook is invalid.")}}))}enableHttpHandler(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.enableHttpHandler()}))}disableHttpHandler(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.disableHttpHandler()}))}updateConfig(l){return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===e.Storage.WebWorker){const e=this._client;yield e.updateConfig(l)}else{const e=this._client;yield e.updateConfig(l)}}))}}zn._instances=new Map;class Bn extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}return e.ASGARDEO_SESSION_ACTIVE="asgardeo-session-active",e.AUTHORIZATION_CODE=o,e.AsgardeoAuthClient=X,e.AsgardeoAuthException=u,e.AsgardeoSPAClient=zn,e.AuthenticationHelper=pe,e.AuthenticationUtils=Z,e.CLIENT_ID_TAG="{{clientID}}",e.CLIENT_SECRET_TAG="{{clientSecret}}",e.CryptoHelper=h,e.DataLayer=p,e.MainThreadClient=Fn,e.OIDC_SCOPE="openid",e.PKCE_CODE_VERIFIER="pkce_code_verifier",e.PKCE_SEPARATOR="#",e.REFRESH_TOKEN_TIMER=i,e.SCOPE_TAG="{{scope}}",e.SESSION_STATE=d,e.SIGN_OUT_SUCCESS_PARAM=a,e.SIGN_OUT_URL=c,e.SPAHelper=Ge,e.SPAUtils=me,e.STATE=s,e.SUPPORTED_SIGNATURE_ALGORITHMS=n,e.TOKEN_REQUEST_CONFIG_KEY=te,e.TOKEN_TAG="{{token}}",e.USERNAME_TAG="{{username}}",e.WebWorkerClass=Bn,e.WebWorkerClient=wn,e.workerReceiver=e=>{const l=self;let i;l.onmessage=({data:l,ports:a})=>t(void 0,void 0,void 0,(function*(){var r,Z,b,h,m,p;const G=a[0];if(l.type===g||i)switch(l.type){case g:try{const a=Object.assign({},l.data);i=yield((e,l)=>t(void 0,void 0,void 0,(function*(){const i=new Jl,n=new Tn,o=new X;yield o.initialize(e,i,n);const c=new Ge(o),a=l(o,c),r=o.getDataLayer(),u=Nl.getInstance();return(null==u?void 0:u.init)&&(yield u.init(!0,(e=>t(void 0,void 0,void 0,(function*(){yield a.attachTokenToRequestConfig(e)}))))),{disableHttpHandler:()=>{a.disableHttpHandler(u)},enableHttpHandler:()=>{a.enableHttpHandler(u)},getAccessToken:()=>a.getAccessToken(),getAuthorizationURL:e=>t(void 0,void 0,void 0,(function*(){return o.getAuthorizationURL(e).then((e=>t(void 0,void 0,void 0,(function*(){var t;const l=null!==(t=new URL(e).searchParams.get(s))&&void 0!==t?t:"",i=yield o.getPKCECode(l);return{authorizationURL:e,pkce:i}})))).catch((e=>Promise.reject(e)))})),getBasicUserInfo:()=>t(void 0,void 0,void 0,(function*(){return a.getBasicUserInfo()})),getConfigData:()=>t(void 0,void 0,void 0,(function*(){return r.getConfigData()})),getCryptoHelper:()=>t(void 0,void 0,void 0,(function*(){return a.getCryptoHelper()})),getDecodedIDPIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getDecodedIDPIDToken()})),getDecodedIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getDecodedIDToken()})),getIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getIDToken()})),getOIDCServiceEndpoints:()=>t(void 0,void 0,void 0,(function*(){return a.getOIDCServiceEndpoints()})),getSignOutURL:()=>t(void 0,void 0,void 0,(function*(){return yield o.getSignOutURL()})),httpRequest:e=>t(void 0,void 0,void 0,(function*(){return yield a.httpRequest(u,e)})),httpRequestAll:e=>t(void 0,void 0,void 0,(function*(){return yield a.httpRequestAll(e,u)})),isAuthenticated:()=>a.isAuthenticated(),refreshAccessToken:()=>t(void 0,void 0,void 0,(function*(){try{return yield a.refreshAccessToken()}catch(e){return Promise.reject(e)}})),requestAccessToken:(e,l,i,n)=>t(void 0,void 0,void 0,(function*(){return yield a.requestAccessToken(e,l,void 0,i,n)})),requestCustomGrant:e=>t(void 0,void 0,void 0,(function*(){return yield a.requestCustomGrant(e)})),revokeAccessToken:()=>t(void 0,void 0,void 0,(function*(){const e=yield c.getRefreshTimeoutTimer();return o.revokeAccessToken().then((()=>(c.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestFinishCallback:e=>{(null==u?void 0:u.setHttpRequestFinishCallback)&&u.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==u?void 0:u.setHttpRequestStartCallback)&&u.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==u?void 0:u.setHttpRequestSuccessCallback)&&u.setHttpRequestSuccessCallback(e)},setSessionState:e=>t(void 0,void 0,void 0,(function*(){yield r.setSessionDataParameter(d,e)})),signOut:()=>t(void 0,void 0,void 0,(function*(){return c.clearRefreshTokenTimeout(),yield o.getSignOutURL()})),startAutoRefreshToken:()=>t(void 0,void 0,void 0,(function*(){c.clearRefreshTokenTimeout(),c.refreshAccessTokenAutomatically(a)})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){yield o.updateConfig(e)}))}})))(a,e),i.setHttpRequestFinishCallback(c),i.setHttpRequestStartCallback(n),i.setHttpRequestSuccessCallback(o),G.postMessage(he.generateSuccessMessage())}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case x:i.getAuthorizationURL(null==l?void 0:l.data).then((e=>{G.postMessage(he.generateSuccessMessage(e))})).catch((e=>{G.postMessage(he.generateFailureMessage(e))}));break;case z:i.requestAccessToken(null===(r=null==l?void 0:l.data)||void 0===r?void 0:r.code,null===(Z=null==l?void 0:l.data)||void 0===Z?void 0:Z.sessionState,null===(b=null==l?void 0:l.data)||void 0===b?void 0:b.pkce,null===(h=null==l?void 0:l.data)||void 0===h?void 0:h.state).then((e=>{G.postMessage(he.generateSuccessMessage(e))})).catch((e=>{G.postMessage(he.generateFailureMessage(e))}));break;case Y:{const e=l.data,t=null==e?void 0:e.data;if(!0===(null===(p=null===(m=l.data)||void 0===m?void 0:m.data)||void 0===p?void 0:p.formData)){const l=new FormData;for(const e in t)"formData"!==e&&l.append(e,t[e]);e.data=l}i.httpRequest(e).then((e=>{G.postMessage(he.generateSuccessMessage(e))})).catch((e=>{G.postMessage(he.generateFailureMessage(e))}));break}case K:i.httpRequestAll(l.data).then((e=>{G.postMessage(he.generateSuccessMessage(e))})).catch((e=>{G.postMessage(he.generateFailureMessage(e))}));break;case v:try{G.postMessage(he.generateSuccessMessage(yield i.signOut()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case N:i.requestCustomGrant(l.data).then((e=>{G.postMessage(he.generateSuccessMessage(e))})).catch((e=>{G.postMessage(he.generateFailureMessage(e))}));break;case f:i.revokeAccessToken().then((e=>{G.postMessage(he.generateSuccessMessage(e))})).catch((e=>{G.postMessage(he.generateFailureMessage(e))}));break;case U:try{G.postMessage(he.generateSuccessMessage(yield i.getOIDCServiceEndpoints()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case L:try{G.postMessage(he.generateSuccessMessage(yield i.getBasicUserInfo()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case H:try{G.postMessage(he.generateSuccessMessage(yield i.getDecodedIDToken()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case T:try{G.postMessage(he.generateSuccessMessage(yield i.getCryptoHelper()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case O:try{G.postMessage(he.generateSuccessMessage(yield i.getIDToken()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case F:i.enableHttpHandler(),G.postMessage(he.generateSuccessMessage());break;case w:i.disableHttpHandler(),G.postMessage(he.generateSuccessMessage());break;case B:try{G.postMessage(he.generateSuccessMessage(yield i.isAuthenticated()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case P:try{G.postMessage(he.generateSuccessMessage(yield i.getSignOutURL()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case M:try{G.postMessage(he.generateSuccessMessage(yield i.refreshAccessToken()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case E:try{G.postMessage(he.generateSuccessMessage(i.startAutoRefreshToken()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case Q:try{G.postMessage(he.generateSuccessMessage(yield i.setSessionState(null==l?void 0:l.data)))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case D:try{G.postMessage(he.generateSuccessMessage(yield i.updateConfig(null==l?void 0:l.data)))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;case q:try{G.postMessage(he.generateSuccessMessage(yield i.getConfigData()))}catch(e){G.postMessage(he.generateFailureMessage(e))}break;default:null==G||G.postMessage(he.generateFailureMessage(new u("SPA-CLIENT_WORKER-ONMSG-IV02","The message type is invalid.",`The message type provided, ${l.type}, is invalid.`)))}else G.postMessage(he.generateFailureMessage(new u("SPA-CLIENT_WORKER-ONMSG-NF01","The web worker has not been initialized yet.","The initialize method needs to be called before the specified operation can be carried out.")))}));const n=()=>{l.postMessage({type:J})},o=e=>{l.postMessage({data:JSON.stringify(null!=e?e:""),type:C})},c=()=>{l.postMessage({type:k})}},Object.defineProperty(e,"__esModule",{value:!0}),e}({});
|
|
1
|
+
var AsgardeoAuth=function(e){"use strict";function t(e,t,l,i){return new(l||(l=Promise))((function(n,o){function c(e){try{a(i.next(e))}catch(e){o(e)}}function d(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t)}))).then(c,d)}a((i=i.apply(e,t||[])).next())}))}function l(e,t,l,i){return new(l||(l=Promise))((function(n,o){function c(e){try{a(i.next(e))}catch(e){o(e)}}function d(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t)}))).then(c,d)}a((i=i.apply(e,t||[])).next())}))}e.ResponseMode=void 0,function(e){e.formPost="form_post",e.query="query",e.direct="direct"}(e.ResponseMode||(e.ResponseMode={}));e.Stores=void 0,function(e){e.ConfigData="config_data",e.OIDCProviderMetaData="oidc_provider_meta_data",e.SessionData="session_data",e.TemporaryData="temporary_data"}(e.Stores||(e.Stores={}));const i="refresh_token_timer",n=["RS256","RS512","RS384","PS256"],o="code",c="session_state",d="sign_out_url",a="sign_out_success",s="state";var r;!function(e){e.Include="include",e.SameOrigin="same-origin",e.Omit="omit"}(r||(r={}));class u{constructor(e,t,l){this.message=l,this.name=t,this.code=e,Object.setPrototypeOf(this,new.target.prototype)}}class Z{constructor(){}static filterClaimsFromIDTokenPayload(e){const t=Object.assign({},e);null==t||delete t.iss,null==t||delete t.aud,null==t||delete t.exp,null==t||delete t.iat,null==t||delete t.acr,null==t||delete t.amr,null==t||delete t.azp,null==t||delete t.auth_time,null==t||delete t.nonce,null==t||delete t.c_hash,null==t||delete t.at_hash,null==t||delete t.nbf,null==t||delete t.isk,null==t||delete t.sid;const l={};return Object.entries(t).forEach((([e,t])=>{const i=e.split("_").map(((e,t)=>0===t?e:[e[0].toUpperCase(),...e.slice(1)].join(""))).join("");l[i]=t})),l}static getTokenRequestHeaders(){return{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}static generateStateParamForRequestCorrelation(e,t){const l=parseInt(e.split("#")[1]);return t?`${t}_request_${l}`:`request_${l}`}static extractPKCEKeyFromStateParam(e){return`pkce_code_verifier#${parseInt(e.split("request_")[1])}`}}Z.getTenantDomainFromIdTokenPayload=(e,t="@")=>{const l=e.sub.split(t);return l.length>2?l[l.length-1]:""};class h{constructor(e,t){this._dataLayer=e,this._config=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()})),this._cryptoHelper=t}resolveEndpoints(e){return l(this,void 0,void 0,(function*(){const t={},l=yield this._config();return l.endpoints&&Object.keys(l.endpoints).forEach((e=>{const i=e.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));t[i]=(null==l?void 0:l.endpoints)?l.endpoints[e]:""})),Object.assign(Object.assign({},e),t)}))}resolveEndpointsExplicitly(){return l(this,void 0,void 0,(function*(){const e={},t=yield this._config();if(!t.endpoints||!["authorization_endpoint","end_session_endpoint","jwks_uri","check_session_iframe","revocation_endpoint","token_endpoint","issuer","userinfo_endpoint"].every((e=>!!t.endpoints&&Object.keys(t.endpoints).some((t=>t.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`))===e)))))throw new u("JS-AUTH_HELPER-REE-NF01","Required endpoints missing","Some or all of the required endpoints are missing in the object passed to the `endpoints` attribute of the`AuthConfig` object.");return t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:""})),Object.assign({},e)}))}resolveEndpointsByBaseURL(){return l(this,void 0,void 0,(function*(){const e={},t=yield this._config(),l=t.baseUrl;if(!l)throw new u("JS-AUTH_HELPER_REBO-NF01","Base URL not defined.","Base URL is not defined in AuthClient config.");t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:""}));const i={authorization_endpoint:`${l}/oauth2/authorize`,end_session_endpoint:`${l}/oidc/logout`,issuer:`${l}/oauth2/token`,jwks_uri:`${l}/oauth2/jwks`,check_session_iframe:`${l}/oidc/checksession`,revocation_endpoint:`${l}/oauth2/revoke`,token_endpoint:`${l}/oauth2/token`,userinfo_endpoint:`${l}/oauth2/userinfo`};return Object.assign(Object.assign({},i),e)}))}validateIdToken(e){var t;return l(this,void 0,void 0,(function*(){const l=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,i=yield this._config();if(!l||0===l.trim().length)throw new u("JS_AUTH_HELPER-VIT-NF01","JWKS endpoint not found.","No JWKS endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the JWKS endpoint passed to the SDK is empty.");let n;try{n=yield fetch(l,{credentials:i.sendCookiesInRequests?r.Include:r.SameOrigin})}catch(l){throw new u("JS-AUTH_HELPER-VIT-NE02","Request to jwks endpoint failed.",null!=l?l:"The request sent to get the jwks from the server failed.")}if(200!==n.status||!n.ok)throw new u("JS-AUTH_HELPER-VIT-HE03",`Invalid response status received for jwks request (${n.statusText}).`,yield n.json());const o=(yield this._oidcProviderMetaData()).issuer,{keys:c}=yield n.json(),d=yield this._cryptoHelper.getJWKForTheIdToken(e.split(".")[0],c);return this._cryptoHelper.isValidIdToken(e,d,(yield this._config()).clientID,null!=o?o:"",this._cryptoHelper.decodeIDToken(e).sub,(yield this._config()).clockTolerance,null===(t=(yield this._config()).validateIDTokenIssuer)||void 0===t||t)}))}getAuthenticatedUserInfo(e){var t,l,i,n;const o=this._cryptoHelper.decodeIDToken(e),c=Z.getTenantDomainFromIdTokenPayload(o),d=null!==(t=null==o?void 0:o.username)&&void 0!==t?t:"",a=null!==(l=o.given_name)&&void 0!==l?l:"",s=null!==(i=o.family_name)&&void 0!==i?i:"",r=a&&s?`${a} ${s}`:a||s||"",u=null!==(n=o.preferred_username)&&void 0!==n?n:r;return Object.assign({displayName:u,tenantDomain:c,username:d},Z.filterClaimsFromIDTokenPayload(o))}replaceCustomGrantTemplateTags(e,t){var i;return l(this,void 0,void 0,(function*(){let l="openid";const n=yield this._config(),o=yield this._dataLayer.getSessionData(t);return n.scope&&n.scope.length>0&&(n.scope.includes("openid")||n.scope.push("openid"),l=n.scope.join(" ")),e.replace("{{token}}",o.access_token).replace("{{username}}",this.getAuthenticatedUserInfo(o.id_token).username).replace("{{scope}}",l).replace("{{clientID}}",n.clientID).replace("{{clientSecret}}",null!==(i=n.clientSecret)&&void 0!==i?i:"")}))}clearUserSessionData(e){return l(this,void 0,void 0,(function*(){yield this._dataLayer.removeTemporaryData(e),yield this._dataLayer.removeSessionData(e)}))}handleTokenResponse(e,t){return l(this,void 0,void 0,(function*(){if(200!==e.status||!e.ok)throw new u("JS-AUTH_HELPER-HTR-NE01",`Invalid response status received for token request (${e.statusText}).`,yield e.json());const i=yield e.json();if(i.created_at=(new Date).getTime(),(yield this._config()).validateIDToken)return this.validateIdToken(i.id_token).then((()=>l(this,void 0,void 0,(function*(){yield this._dataLayer.setSessionData(i,t);const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return Promise.resolve(e)}))));{const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return yield this._dataLayer.setSessionData(i,t),Promise.resolve(e)}}))}generatePKCEKey(e){var t;return l(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getTemporaryData(e),i=[];Object.keys(l).forEach((e=>{e.startsWith("pkce_code_verifier")&&i.push(e)}));const n=i.sort().pop();return`pkce_code_verifier#${parseInt(null!==(t=null==n?void 0:n.split("#")[1])&&void 0!==t?t:"-1")+1}`}))}}class b{constructor(e){this._cryptoUtils=e}getCodeVerifier(){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.generateRandomBytes(32))}getCodeChallenge(e){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.hashSha256(e))}getJWKForTheIdToken(e,t){const l=JSON.parse(this._cryptoUtils.base64URLDecode(e));for(const e of t)if(l.kid===e.kid)return e;throw new u("JS-CRYPTO_UTIL-GJFTIT-IV01","kid not found.","Failed to find the 'kid' specified in the id_token. 'kid' found in the header : "+l.kid+", Expected values: "+t.map((e=>e.kid)).join(", "))}isValidIdToken(e,t,l,i,o,c,d){return this._cryptoUtils.verifyJwt(e,t,n,l,i,o,c,d).then((e=>e?Promise.resolve(!0):Promise.reject(new u("JS-CRYPTO_HELPER-IVIT-IV01","Invalid ID token.","ID token validation returned false"))))}decodeIDToken(e){try{const t=this._cryptoUtils.base64URLDecode(e.split(".")[1]);return JSON.parse(t)}catch(e){throw new u("JS-CRYPTO_UTIL-DIT-IV01","Decoding ID token failed.",e)}}}class m{constructor(e,t){this._cryptoUtils=t,this._cryptoHelper=new b(t),this._authenticationHelper=new h(e,this._cryptoHelper),this._dataLayer=e,this._config=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURLParams(e,t){var i,n,o;return l(this,void 0,void 0,(function*(){const l=yield this._config(),c=new Map;c.set("response_type","code"),c.set("client_id",l.clientID),l.clientSecret&&l.clientSecret.trim().length>0&&c.set("client_secret",l.clientSecret);let d="openid";l.scope&&l.scope.length>0&&(l.scope.includes("openid")||l.scope.push("openid"),d=l.scope.join(" ")),c.set("scope",d),c.set("redirect_uri",l.signInRedirectURL),l.responseMode&&c.set("response_mode",l.responseMode);const a=yield this._authenticationHelper.generatePKCEKey(t);if(l.enablePKCE){const e=null===(i=this._cryptoHelper)||void 0===i?void 0:i.getCodeVerifier(),l=null===(n=this._cryptoHelper)||void 0===n?void 0:n.getCodeChallenge(e);yield this._dataLayer.setTemporaryDataParameter(a,e,t),c.set("code_challenge_method","S256"),c.set("code_challenge",l)}l.prompt&&c.set("prompt",l.prompt);const s=e;if(s)for(const[e,t]of Object.entries(s))""!=e&&""!=t&&"state"!==e&&c.set(e,t.toString());return c.set("state",Z.generateStateParamForRequestCorrelation(a,s?null===(o=s.state)||void 0===o?void 0:o.toString():"")),c}))}getAuthorizationURL(e,t){return l(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint");if(!l||0===l.trim().length)throw new u("JS-AUTH_CORE-GAU-NF01","No authorization endpoint found.","No authorization endpoint was found in the OIDC provider meta data from the well-known endpoint or the authorization endpoint passed to the SDK is empty.");const i=new URL(l),n=yield this.getAuthorizationURLParams(e,t);for(const[e,t]of n.entries())i.searchParams.append(e,t);return i.toString()}))}requestAccessToken(e,t,i,n,o){return l(this,void 0,void 0,(function*(){const l=(yield this._oidcProviderMetaData()).token_endpoint,c=yield this._config();if(!l||0===l.trim().length)throw new u("JS-AUTH_CORE-RAT1-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");t&&(yield this._dataLayer.setSessionDataParameter("session_state",t,n));const d=new URLSearchParams;d.set("client_id",c.clientID),c.clientSecret&&c.clientSecret.trim().length>0&&d.set("client_secret",c.clientSecret);const a=e;let s;d.set("code",a),d.set("grant_type","authorization_code"),d.set("redirect_uri",c.signInRedirectURL),(null==o?void 0:o.params)&&Object.entries(o.params).forEach((([e,t])=>{d.append(e,t)})),c.enablePKCE&&(d.set("code_verifier",`${yield this._dataLayer.getTemporaryDataParameter(Z.extractPKCEKeyFromStateParam(i),n)}`),yield this._dataLayer.removeTemporaryDataParameter(Z.extractPKCEKeyFromStateParam(i),n));try{s=yield fetch(l,{body:d,credentials:c.sendCookiesInRequests?r.Include:r.SameOrigin,headers:new Headers(Z.getTokenRequestHeaders()),method:"POST"})}catch(l){throw new u("JS-AUTH_CORE-RAT1-NE02","Requesting access token failed",null!=l?l:"The request to get the access token from the server failed.")}if(!s.ok)throw new u("JS-AUTH_CORE-RAT1-HE03",`Requesting access token failed with ${s.statusText}`,yield s.json());return yield this._authenticationHelper.handleTokenResponse(s,n)}))}refreshAccessToken(e){return l(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,l=yield this._config(),i=yield this._dataLayer.getSessionData(e);if(!i.refresh_token)throw new u("JS-AUTH_CORE-RAT2-NF01","No refresh token found.","There was no refresh token found. Asgardeo doesn't return a refresh token if the refresh token grant is not enabled.");if(!t||0===t.trim().length)throw new u("JS-AUTH_CORE-RAT2-NF02","No refresh token endpoint found.","No refresh token endpoint was in the OIDC provider meta data returned by the well-known endpoint or the refresh token endpoint passed to the SDK is empty.");const n=[];let o;n.push(`client_id=${l.clientID}`),n.push(`refresh_token=${i.refresh_token}`),n.push("grant_type=refresh_token"),l.clientSecret&&l.clientSecret.trim().length>0&&n.push(`client_secret=${l.clientSecret}`);try{o=yield fetch(t,{body:n.join("&"),credentials:l.sendCookiesInRequests?r.Include:r.SameOrigin,headers:new Headers(Z.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new u("JS-AUTH_CORE-RAT2-NR03","Refresh access token request failed.",null!=t?t:"The request to refresh the access token failed.")}if(!o.ok)throw new u("JS-AUTH_CORE-RAT2-HE04",`Refreshing access token failed with ${o.statusText}`,yield o.json());return this._authenticationHelper.handleTokenResponse(o,e)}))}revokeAccessToken(e){return l(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,l=yield this._config();if(!t||0===t.trim().length)throw new u("JS-AUTH_CORE-RAT3-NF01","No revoke access token endpoint found.","No revoke access token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the revoke access token endpoint passed to the SDK is empty.");const i=[];let n;i.push(`client_id=${l.clientID}`),i.push(`token=${(yield this._dataLayer.getSessionData(e)).access_token}`),i.push("token_type_hint=access_token");try{n=yield fetch(t,{body:i.join("&"),credentials:l.sendCookiesInRequests?r.Include:r.SameOrigin,headers:new Headers(Z.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new u("JS-AUTH_CORE-RAT3-NE02","The request to revoke access token failed.",null!=t?t:"The request sent to revoke the access token failed.")}if(200!==n.status||!n.ok)throw new u("JS-AUTH_CORE-RAT3-HE03",`Invalid response status received for revoke access token request (${n.statusText}).`,yield n.json());return this._authenticationHelper.clearUserSessionData(e),Promise.resolve(n)}))}requestCustomGrant(e,t){return l(this,void 0,void 0,(function*(){const i=yield this._oidcProviderMetaData(),n=yield this._config();let o;if(o=e.tokenEndpoint&&0!==e.tokenEndpoint.trim().length?e.tokenEndpoint:i.token_endpoint,!o||0===o.trim().length)throw new u("JS-AUTH_CORE-RCG-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");const c=yield Promise.all(Object.entries(e.data).map((([e,i])=>l(this,void 0,void 0,(function*(){const l=yield this._authenticationHelper.replaceCustomGrantTemplateTags(i,t);return`${e}=${l}`})))));let d=Object.assign({},Z.getTokenRequestHeaders());e.attachToken&&(d=Object.assign(Object.assign({},d),{Authorization:`Bearer ${(yield this._dataLayer.getSessionData(t)).access_token}`}));const a={body:c.join("&"),credentials:n.sendCookiesInRequests?r.Include:r.SameOrigin,headers:new Headers(d),method:"POST"};let s;try{s=yield fetch(o,a)}catch(e){throw new u("JS-AUTH_CORE-RCG-NE02","The custom grant request failed.",null!=e?e:"The request sent to get the custom grant failed.")}if(200!==s.status||!s.ok)throw new u("JS-AUTH_CORE-RCG-HE03",`Invalid response status received for the custom grant request. (${s.statusText})`,yield s.json());return e.returnsSession?this._authenticationHelper.handleTokenResponse(s,t):Promise.resolve(yield s.json())}))}getBasicUserInfo(e){return l(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(e),l=this._authenticationHelper.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let i={allowedScopes:t.scope,sessionState:t.session_state};return Object.keys(l).forEach((e=>{void 0!==l[e]&&""!==l[e]&&null!==l[e]||delete l[e]})),i=Object.assign(Object.assign({},i),l),i}))}getDecodedIDToken(e){return l(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData(e)).id_token;return this._cryptoHelper.decodeIDToken(t)}))}getCryptoHelper(){return l(this,void 0,void 0,(function*(){return this._cryptoHelper}))}getIDToken(e){return l(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData(e)).id_token}))}getOIDCProviderMetaData(e){return l(this,void 0,void 0,(function*(){const t=yield this._config();if(!e&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve();const l=t.wellKnownEndpoint;if(l){let e;try{if(e=yield fetch(l),200!==e.status||!e.ok)throw new Error}catch(t){throw new u("JS-AUTH_CORE-GOPMD-HE01","Invalid well-known response","The well known endpoint response has been failed with an error.")}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(yield e.json())),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}if(t.baseUrl){try{yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsByBaseURL())}catch(t){throw new u("JS-AUTH_CORE-GOPMD-IV02","Resolving endpoints failed.",null!=t?t:"Resolving endpoints by base url failed.")}return yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsExplicitly()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}))}getOIDCServiceEndpoints(){var e,t,i,n,o,c,d,a,s,r;return l(this,void 0,void 0,(function*(){const l=yield this._oidcProviderMetaData();return{authorizationEndpoint:null!==(e=l.authorization_endpoint)&&void 0!==e?e:"",checkSessionIframe:null!==(t=l.check_session_iframe)&&void 0!==t?t:"",endSessionEndpoint:null!==(i=l.end_session_endpoint)&&void 0!==i?i:"",introspectionEndpoint:null!==(n=l.introspection_endpoint)&&void 0!==n?n:"",issuer:null!==(o=l.issuer)&&void 0!==o?o:"",jwksUri:null!==(c=l.jwks_uri)&&void 0!==c?c:"",registrationEndpoint:null!==(d=l.registration_endpoint)&&void 0!==d?d:"",revocationEndpoint:null!==(a=l.revocation_endpoint)&&void 0!==a?a:"",tokenEndpoint:null!==(s=l.token_endpoint)&&void 0!==s?s:"",userinfoEndpoint:null!==(r=l.userinfo_endpoint)&&void 0!==r?r:""}}))}getSignOutURL(e){var t,i,n;return l(this,void 0,void 0,(function*(){const l=null===(t=yield this._oidcProviderMetaData())||void 0===t?void 0:t.end_session_endpoint,o=yield this._config();if(!l||0===l.trim().length)throw new u("JS-AUTH_CORE-GSOU-NF01","Sign-out endpoint not found.","No sign-out endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the sign-out endpoint passed to the SDK is empty.");const c=null!==(i=null==o?void 0:o.signOutRedirectURL)&&void 0!==i?i:null==o?void 0:o.signInRedirectURL;if(!c||0===c.trim().length)throw new u("JS-AUTH_CORE-GSOU-NF03","No sign-out redirect URL found.","The sign-out redirect URL cannot be found or the URL passed to the SDK is empty. No sign-in redirect URL has been found either. ");const d=new URLSearchParams;if(d.set("post_logout_redirect_uri",c),o.sendIdTokenInLogoutRequest){const t=null===(n=yield this._dataLayer.getSessionData(e))||void 0===n?void 0:n.id_token;if(!t||0===t.trim().length)throw new u("JS-AUTH_CORE-GSOU-NF02","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");d.set("id_token_hint",t)}else d.set("client_id",o.clientID);return d.set("state","sign_out_success"),`${l}?${d.toString()}`}))}clearUserSessionData(e){return l(this,void 0,void 0,(function*(){yield this._authenticationHelper.clearUserSessionData(e)}))}getAccessToken(e){var t;return l(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.access_token}))}getCreatedAt(e){var t;return l(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.created_at}))}getExpiresIn(e){var t;return l(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.expires_in}))}isAuthenticated(e){return l(this,void 0,void 0,(function*(){const t=Boolean(yield this.getAccessToken(e)),l=yield this.getCreatedAt(e),i=yield this.getExpiresIn(e);if(!i)return!1;const n=1e3*parseInt(i),o=(new Date).getTime();return t&&l+n>o}))}getPKCECode(e,t){return l(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter(Z.extractPKCEKeyFromStateParam(e),t)}))}setPKCECode(e,t,i){return l(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter(Z.extractPKCEKeyFromStateParam(t),e,i)}))}updateConfig(e){return l(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(e),yield this.getOIDCProviderMetaData(!0)}))}}class p{constructor(e,t){this._id=e,this._store=t}setDataInBulk(e,t){var i;return l(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign(Object.assign({},n),t),c=JSON.stringify(o);yield this._store.setData(e,c)}))}setValue(e,t,i){var n;return l(this,void 0,void 0,(function*(){const l=null!==(n=yield this._store.getData(e))&&void 0!==n?n:null,o=l&&JSON.parse(l),c=Object.assign(Object.assign({},o),{[t]:i}),d=JSON.stringify(c);yield this._store.setData(e,d)}))}removeValue(e,t){var i;return l(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign({},n);delete o[t];const c=JSON.stringify(o);yield this._store.setData(e,c)}))}_resolveKey(e,t){return t?`${e}-${this._id}-${t}`:`${e}-${this._id}`}isLocalStorageAvailable(){try{const e="__ASGARDEO_AUTH_CORE_LOCAL_STORAGE_TEST__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}}setConfigData(t){return l(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(e.Stores.ConfigData),t)}))}setOIDCProviderMetaData(t){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}setTemporaryData(t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.TemporaryData,i),t)}))}setSessionData(t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.SessionData,i),t)}))}setCustomData(e,t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e,i),t)}))}getConfigData(){var t;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.ConfigData)))&&void 0!==t?t:null)}))}getOIDCProviderMetaData(){var t;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData)))&&void 0!==t?t:null)}))}getTemporaryData(t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,t)))&&void 0!==i?i:null)}))}getSessionData(t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.SessionData,t)))&&void 0!==i?i:null)}))}getCustomData(e,t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e,t)))&&void 0!==i?i:null)}))}setSessionStatus(e){this.isLocalStorageAvailable()&&localStorage.setItem("asgardeo-session-active",e)}getSessionStatus(){var e;return this.isLocalStorageAvailable()&&null!==(e=localStorage.getItem("asgardeo-session-active"))&&void 0!==e?e:""}removeSessionStatus(){this.isLocalStorageAvailable()&&localStorage.removeItem("asgardeo-session-active")}removeConfigData(){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.ConfigData))}))}removeOIDCProviderMetaData(){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.OIDCProviderMetaData))}))}removeTemporaryData(t){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.TemporaryData,t))}))}removeSessionData(t){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.SessionData,t))}))}getConfigDataParameter(t){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.ConfigData));return l&&JSON.parse(l)[t]}))}getOIDCProviderMetaDataParameter(t){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData));return l&&JSON.parse(l)[t]}))}getTemporaryDataParameter(t,i){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,i));return l&&JSON.parse(l)[t]}))}getSessionDataParameter(t,i){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.SessionData,i));return l&&JSON.parse(l)[t]}))}setConfigDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.ConfigData),t,i)}))}setOIDCProviderMetaDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t,i)}))}setTemporaryDataParameter(t,i,n){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.TemporaryData,n),t,i)}))}setSessionDataParameter(t,i,n){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.SessionData,n),t,i)}))}removeConfigDataParameter(t){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.ConfigData),t)}))}removeOIDCProviderMetaDataParameter(t){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}removeTemporaryDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.TemporaryData,i),t)}))}removeSessionDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.SessionData,i),t)}))}}const G={clockTolerance:300,enablePKCE:!0,responseMode:e.ResponseMode.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0,validateIDTokenIssuer:!0};class X{constructor(){}initialize(e,t,i,n){var o,c,d;return l(this,void 0,void 0,(function*(){const l=e.clientID;X._instanceID?X._instanceID+=1:X._instanceID=0,n&&(X._instanceID=n),this._dataLayer=new p(l?`instance_${X._instanceID}-${l}`:`instance_${X._instanceID}`,t),this._authenticationCore=new m(this._dataLayer,i),X._authenticationCore=new m(this._dataLayer,i),yield this._dataLayer.setConfigData(Object.assign(Object.assign(Object.assign({},G),e),{scope:[...null!==(o=G.scope)&&void 0!==o?o:[],...null!==(d=null===(c=e.scope)||void 0===c?void 0:c.filter((e=>{var t;return!(null===(t=null==G?void 0:G.scope)||void 0===t?void 0:t.includes(e))})))&&void 0!==d?d:[]]}))}))}getDataLayer(){return this._dataLayer}getInstanceID(){return X._instanceID}getAuthorizationURLParams(e,t){return l(this,void 0,void 0,(function*(){const l=Object.assign({},e);return null==l||delete l.forceInit,(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.getAuthorizationURLParams(l,t):this._authenticationCore.getOIDCProviderMetaData(null==e?void 0:e.forceInit).then((()=>this._authenticationCore.getAuthorizationURLParams(l,t)))}))}getAuthorizationURL(e,t){return l(this,void 0,void 0,(function*(){const l=Object.assign({},e);return null==l||delete l.forceInit,(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.getAuthorizationURL(l,t):this._authenticationCore.getOIDCProviderMetaData(null==e?void 0:e.forceInit).then((()=>this._authenticationCore.getAuthorizationURL(l,t)))}))}requestAccessToken(e,t,i,n,o){return l(this,void 0,void 0,(function*(){return(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.requestAccessToken(e,t,i,n,o):this._authenticationCore.getOIDCProviderMetaData(!1).then((()=>this._authenticationCore.requestAccessToken(e,t,i,n,o)))}))}getSignOutURL(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getSignOutURL(e)}))}getOIDCServiceEndpoints(){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getOIDCServiceEndpoints()}))}getDecodedIDToken(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getDecodedIDToken(e)}))}getIDToken(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getIDToken(e)}))}getBasicUserInfo(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getBasicUserInfo(e)}))}getCryptoHelper(){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getCryptoHelper()}))}revokeAccessToken(e){return this._authenticationCore.revokeAccessToken(e)}refreshAccessToken(e){return this._authenticationCore.refreshAccessToken(e)}getAccessToken(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getAccessToken(e)}))}requestCustomGrant(e,t){return this._authenticationCore.requestCustomGrant(e,t)}isAuthenticated(e){return l(this,void 0,void 0,(function*(){return this._authenticationCore.isAuthenticated(e)}))}getPKCECode(e,t){return l(this,void 0,void 0,(function*(){return this._authenticationCore.getPKCECode(e,t)}))}setPKCECode(e,t,i){return l(this,void 0,void 0,(function*(){yield this._authenticationCore.setPKCECode(e,t,i)}))}static isSignOutSuccessful(e){const t=new URL(e),l=t.searchParams.get("state"),i=Boolean(t.searchParams.get("error"));return!!l&&"sign_out_success"===l&&!i}static didSignOutFail(e){const t=new URL(e),l=t.searchParams.get("state"),i=Boolean(t.searchParams.get("error"));return!!l&&"sign_out_success"===l&&i}updateConfig(e){return l(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(e)}))}static clearUserSessionData(e){return l(this,void 0,void 0,(function*(){yield this._authenticationCore.clearUserSessionData(e)}))}}function y(e,t,l){var i=void 0===t?null:t,n=function(e,t){var l=atob(e);if(t){for(var i=new Uint8Array(l.length),n=0,o=l.length;n<o;++n)i[n]=l.charCodeAt(n);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return l}(e,void 0!==l&&l),o=n.indexOf("\n",10)+1,c=n.substring(o)+(i?"//# sourceMappingURL="+i:""),d=new Blob([c],{type:"application/javascript"});return URL.createObjectURL(d)}var W,V,I,R,S=(W="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQscixuKXtyZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXtjKG4ubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7YyhuLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIHI/dDpuZXcgcigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfWMoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX1mdW5jdGlvbiB0KGUsdCxyLG4pe3JldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e2Mobi5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKG4udGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygcj90Om5ldyByKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9Yygobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfXZhciByOyFmdW5jdGlvbihlKXtlLmZvcm1Qb3N0PSJmb3JtX3Bvc3QiLGUucXVlcnk9InF1ZXJ5IixlLmRpcmVjdD0iZGlyZWN0In0ocnx8KHI9e30pKTt2YXIgbjshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KG58fChuPXt9KSk7Y29uc3QgaT0icmVmcmVzaF90b2tlbl90aW1lciIsbz1bIlJTMjU2IiwiUlM1MTIiLCJSUzM4NCIsIlBTMjU2Il0scz0ic2lnbl9vdXRfdXJsIjt2YXIgYTshZnVuY3Rpb24oZSl7ZS5JbmNsdWRlPSJpbmNsdWRlIixlLlNhbWVPcmlnaW49InNhbWUtb3JpZ2luIixlLk9taXQ9Im9taXQifShhfHwoYT17fSkpO2NsYXNzIGN7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMubWVzc2FnZT1yLHRoaXMubmFtZT10LHRoaXMuY29kZT1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgdXtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtudWxsPT10fHxkZWxldGUgdC5pc3MsbnVsbD09dHx8ZGVsZXRlIHQuYXVkLG51bGw9PXR8fGRlbGV0ZSB0LmV4cCxudWxsPT10fHxkZWxldGUgdC5pYXQsbnVsbD09dHx8ZGVsZXRlIHQuYWNyLG51bGw9PXR8fGRlbGV0ZSB0LmFtcixudWxsPT10fHxkZWxldGUgdC5henAsbnVsbD09dHx8ZGVsZXRlIHQuYXV0aF90aW1lLG51bGw9PXR8fGRlbGV0ZSB0Lm5vbmNlLG51bGw9PXR8fGRlbGV0ZSB0LmNfaGFzaCxudWxsPT10fHxkZWxldGUgdC5hdF9oYXNoLG51bGw9PXR8fGRlbGV0ZSB0Lm5iZixudWxsPT10fHxkZWxldGUgdC5pc2ssbnVsbD09dHx8ZGVsZXRlIHQuc2lkO2NvbnN0IHI9e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKChbZSx0XSk9Pntjb25zdCBuPWUuc3BsaXQoIl8iKS5tYXAoKChlLHQpPT4wPT09dD9lOltlWzBdLnRvVXBwZXJDYXNlKCksLi4uZS5zbGljZSgxKV0uam9pbigiIikpKS5qb2luKCIiKTtyW25dPXR9KSkscn1zdGF0aWMgZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpe3JldHVybntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24iLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifX1zdGF0aWMgZ2VuZXJhdGVTdGF0ZVBhcmFtRm9yUmVxdWVzdENvcnJlbGF0aW9uKGUsdCl7Y29uc3Qgcj1wYXJzZUludChlLnNwbGl0KCIjIilbMV0pO3JldHVybiB0P2Ake3R9X3JlcXVlc3RfJHtyfWA6YHJlcXVlc3RfJHtyfWB9c3RhdGljIGV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSl7cmV0dXJuYHBrY2VfY29kZV92ZXJpZmllciMke3BhcnNlSW50KGUuc3BsaXQoInJlcXVlc3RfIilbMV0pfWB9fXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkPShlLHQ9IkAiKT0+e2NvbnN0IHI9ZS5zdWIuc3BsaXQodCk7cmV0dXJuIHIubGVuZ3RoPjI/cltyLmxlbmd0aC0xXToiIn07Y2xhc3MgbHtjb25zdHJ1Y3RvcihlLHIpe3RoaXMuX2RhdGFMYXllcj1lLHRoaXMuX2NvbmZpZz0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpfSkpLHRoaXMuX2NyeXB0b0hlbHBlcj1yfXJlc29sdmVFbmRwb2ludHMoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXt9LHI9eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIHIuZW5kcG9pbnRzJiZPYmplY3Qua2V5cyhyLmVuZHBvaW50cykuZm9yRWFjaCgoZT0+e2NvbnN0IG49ZS5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTt0W25dPShudWxsPT1yP3ZvaWQgMDpyLmVuZHBvaW50cyk/ci5lbmRwb2ludHNbZV06IiJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfSkpfXJlc29sdmVFbmRwb2ludHNFeHBsaWNpdGx5KCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXt9LHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXQuZW5kcG9pbnRzfHwhWyJhdXRob3JpemF0aW9uX2VuZHBvaW50IiwiZW5kX3Nlc3Npb25fZW5kcG9pbnQiLCJqd2tzX3VyaSIsImNoZWNrX3Nlc3Npb25faWZyYW1lIiwicmV2b2NhdGlvbl9lbmRwb2ludCIsInRva2VuX2VuZHBvaW50IiwiaXNzdWVyIiwidXNlcmluZm9fZW5kcG9pbnQiXS5ldmVyeSgoZT0+ISF0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLnNvbWUoKHQ9PnQucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk9PT1lKSkpKSl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItUkVFLU5GMDEiLCJSZXF1aXJlZCBlbmRwb2ludHMgbWlzc2luZyIsIlNvbWUgb3IgYWxsIG9mIHRoZSByZXF1aXJlZCBlbmRwb2ludHMgYXJlIG1pc3NpbmcgaW4gdGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIGBlbmRwb2ludHNgIGF0dHJpYnV0ZSBvZiB0aGVgQXV0aENvbmZpZ2Agb2JqZWN0LiIpO3JldHVybiB0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKHI9Pntjb25zdCBuPXIucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtuXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW3JdOiIifSkpLE9iamVjdC5hc3NpZ24oe30sZSl9KSl9cmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpLHI9dC5iYXNlVXJsO2lmKCFyKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUl9SRUJPLU5GMDEiLCJCYXNlIFVSTCBub3QgZGVmaW5lZC4iLCJCYXNlIFVSTCBpcyBub3QgZGVmaW5lZCBpbiBBdXRoQ2xpZW50IGNvbmZpZy4iKTt0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKHI9Pntjb25zdCBuPXIucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtuXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW3JdOiIifSkpO2NvbnN0IG49e2F1dGhvcml6YXRpb25fZW5kcG9pbnQ6YCR7cn0vb2F1dGgyL2F1dGhvcml6ZWAsZW5kX3Nlc3Npb25fZW5kcG9pbnQ6YCR7cn0vb2lkYy9sb2dvdXRgLGlzc3VlcjpgJHtyfS9vYXV0aDIvdG9rZW5gLGp3a3NfdXJpOmAke3J9L29hdXRoMi9qd2tzYCxjaGVja19zZXNzaW9uX2lmcmFtZTpgJHtyfS9vaWRjL2NoZWNrc2Vzc2lvbmAscmV2b2NhdGlvbl9lbmRwb2ludDpgJHtyfS9vYXV0aDIvcmV2b2tlYCx0b2tlbl9lbmRwb2ludDpgJHtyfS9vYXV0aDIvdG9rZW5gLHVzZXJpbmZvX2VuZHBvaW50OmAke3J9L29hdXRoMi91c2VyaW5mb2B9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbiksZSl9KSl9dmFsaWRhdGVJZFRva2VuKGUpe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCkpLmp3a3NfdXJpLG49eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTX0FVVEhfSEVMUEVSLVZJVC1ORjAxIiwiSldLUyBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gSldLUyBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBKV0tTIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2xldCBpO3RyeXtpPXlpZWxkIGZldGNoKHQse2NyZWRlbnRpYWxzOm4uc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW59KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULU5FMDIiLCJSZXF1ZXN0IHRvIGp3a3MgZW5kcG9pbnQgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIpfWlmKDIwMCE9PWkuc3RhdHVzfHwhaS5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgandrcyByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO2NvbnN0IG89KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLmlzc3Vlcix7a2V5czpzfT15aWVsZCBpLmpzb24oKSx1PXlpZWxkIHRoaXMuX2NyeXB0b0hlbHBlci5nZXRKV0tGb3JUaGVJZFRva2VuKGUuc3BsaXQoIi4iKVswXSxzKTtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmlzVmFsaWRJZFRva2VuKGUsdSwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsaWVudElELG51bGwhPW8/bzoiIix0aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKS5zdWIsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbG9ja1RvbGVyYW5jZSxudWxsPT09KHI9KHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW5Jc3N1ZXIpfHx2b2lkIDA9PT1yfHxyKX0pKX1nZXRBdXRoZW50aWNhdGVkVXNlckluZm8oZSl7dmFyIHQscixuLGk7Y29uc3Qgbz10aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKSxzPXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkKG8pLGE9bnVsbCE9PSh0PW51bGw9PW8/dm9pZCAwOm8udXNlcm5hbWUpJiZ2b2lkIDAhPT10P3Q6IiIsYz1udWxsIT09KHI9by5naXZlbl9uYW1lKSYmdm9pZCAwIT09cj9yOiIiLGw9bnVsbCE9PShuPW8uZmFtaWx5X25hbWUpJiZ2b2lkIDAhPT1uP246IiIsZD1jJiZsP2Ake2N9ICR7bH1gOmN8fGx8fCIiLGg9bnVsbCE9PShpPW8ucHJlZmVycmVkX3VzZXJuYW1lKSYmdm9pZCAwIT09aT9pOmQ7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2Rpc3BsYXlOYW1lOmgsdGVuYW50RG9tYWluOnMsdXNlcm5hbWU6YX0sdS5maWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQobykpfXJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyhlLHIpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IHQ9Im9wZW5pZCI7Y29uc3QgaT15aWVsZCB0aGlzLl9jb25maWcoKSxvPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShyKTtyZXR1cm4gaS5zY29wZSYmaS5zY29wZS5sZW5ndGg+MCYmKGkuc2NvcGUuaW5jbHVkZXMoIm9wZW5pZCIpfHxpLnNjb3BlLnB1c2goIm9wZW5pZCIpLHQ9aS5zY29wZS5qb2luKCIgIikpLGUucmVwbGFjZSgie3t0b2tlbn19IixvLmFjY2Vzc190b2tlbikucmVwbGFjZSgie3t1c2VybmFtZX19Iix0aGlzLmdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhvLmlkX3Rva2VuKS51c2VybmFtZSkucmVwbGFjZSgie3tzY29wZX19Iix0KS5yZXBsYWNlKCJ7e2NsaWVudElEfX0iLGkuY2xpZW50SUQpLnJlcGxhY2UoInt7Y2xpZW50U2VjcmV0fX0iLG51bGwhPT0obj1pLmNsaWVudFNlY3JldCkmJnZvaWQgMCE9PW4/bjoiIil9KSl9Y2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlVGVtcG9yYXJ5RGF0YShlKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlU2Vzc2lvbkRhdGEoZSl9KSl9aGFuZGxlVG9rZW5SZXNwb25zZShlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoMjAwIT09ZS5zdGF0dXN8fCFlLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUi1IVFItTkUwMSIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0b2tlbiByZXF1ZXN0ICgke2Uuc3RhdHVzVGV4dH0pLmAseWllbGQgZS5qc29uKCkpO2NvbnN0IG49eWllbGQgZS5qc29uKCk7aWYobi5jcmVhdGVkX2F0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLCh5aWVsZCB0aGlzLl9jb25maWcoKSkudmFsaWRhdGVJRFRva2VuKXJldHVybiB0aGlzLnZhbGlkYXRlSWRUb2tlbihuLmlkX3Rva2VuKS50aGVuKCgoKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShuLHIpO2NvbnN0IGU9e2FjY2Vzc1Rva2VuOm4uYWNjZXNzX3Rva2VuLGNyZWF0ZWRBdDpuLmNyZWF0ZWRfYXQsZXhwaXJlc0luOm4uZXhwaXJlc19pbixpZFRva2VuOm4uaWRfdG9rZW4scmVmcmVzaFRva2VuOm4ucmVmcmVzaF90b2tlbixzY29wZTpuLnNjb3BlLHRva2VuVHlwZTpuLnRva2VuX3R5cGV9O3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9KSkpKTt7Y29uc3QgZT17YWNjZXNzVG9rZW46bi5hY2Nlc3NfdG9rZW4sY3JlYXRlZEF0Om4uY3JlYXRlZF9hdCxleHBpcmVzSW46bi5leHBpcmVzX2luLGlkVG9rZW46bi5pZF90b2tlbixyZWZyZXNoVG9rZW46bi5yZWZyZXNoX3Rva2VuLHNjb3BlOm4uc2NvcGUsdG9rZW5UeXBlOm4udG9rZW5fdHlwZX07cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShuLHIpLFByb21pc2UucmVzb2x2ZShlKX19KSl9Z2VuZXJhdGVQS0NFS2V5KGUpe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YShlKSxuPVtdO09iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9PntlLnN0YXJ0c1dpdGgoInBrY2VfY29kZV92ZXJpZmllciIpJiZuLnB1c2goZSl9KSk7Y29uc3QgaT1uLnNvcnQoKS5wb3AoKTtyZXR1cm5gcGtjZV9jb2RlX3ZlcmlmaWVyIyR7cGFyc2VJbnQobnVsbCE9PShyPW51bGw9PWk/dm9pZCAwOmkuc3BsaXQoIiMiKVsxXSkmJnZvaWQgMCE9PXI/cjoiLTEiKSsxfWB9KSl9fWNsYXNzIGR7Y29uc3RydWN0b3IoZSl7dGhpcy5fY3J5cHRvVXRpbHM9ZX1nZXRDb2RlVmVyaWZpZXIoKXtyZXR1cm4gdGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRW5jb2RlKHRoaXMuX2NyeXB0b1V0aWxzLmdlbmVyYXRlUmFuZG9tQnl0ZXMoMzIpKX1nZXRDb2RlQ2hhbGxlbmdlKGUpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuaGFzaFNoYTI1NihlKSl9Z2V0SldLRm9yVGhlSWRUb2tlbihlLHQpe2NvbnN0IHI9SlNPTi5wYXJzZSh0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxEZWNvZGUoZSkpO2Zvcihjb25zdCBlIG9mIHQpaWYoci5raWQ9PT1lLmtpZClyZXR1cm4gZTt0aHJvdyBuZXcgYygiSlMtQ1JZUFRPX1VUSUwtR0pGVElULUlWMDEiLCJraWQgbm90IGZvdW5kLiIsIkZhaWxlZCB0byBmaW5kIHRoZSAna2lkJyBzcGVjaWZpZWQgaW4gdGhlIGlkX3Rva2VuLiAna2lkJyBmb3VuZCBpbiB0aGUgaGVhZGVyIDogIityLmtpZCsiLCBFeHBlY3RlZCB2YWx1ZXM6ICIrdC5tYXAoKGU9PmUua2lkKSkuam9pbigiLCAiKSl9aXNWYWxpZElkVG9rZW4oZSx0LHIsbixpLHMsYSl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLnZlcmlmeUp3dChlLHQsbyxyLG4saSxzLGEpLnRoZW4oKGU9PmU/UHJvbWlzZS5yZXNvbHZlKCEwKTpQcm9taXNlLnJlamVjdChuZXcgYygiSlMtQ1JZUFRPX0hFTFBFUi1JVklULUlWMDEiLCJJbnZhbGlkIElEIHRva2VuLiIsIklEIHRva2VuIHZhbGlkYXRpb24gcmV0dXJuZWQgZmFsc2UiKSkpKX1kZWNvZGVJRFRva2VuKGUpe3RyeXtjb25zdCB0PXRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlLnNwbGl0KCIuIilbMV0pO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1DUllQVE9fVVRJTC1ESVQtSVYwMSIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19Y2xhc3MgaHtjb25zdHJ1Y3RvcihlLHIpe3RoaXMuX2NyeXB0b1V0aWxzPXIsdGhpcy5fY3J5cHRvSGVscGVyPW5ldyBkKHIpLHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyPW5ldyBsKGUsdGhpcy5fY3J5cHRvSGVscGVyKSx0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUscil7dmFyIG4saSxvO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9jb25maWcoKSxzPW5ldyBNYXA7cy5zZXQoInJlc3BvbnNlX3R5cGUiLCJjb2RlIikscy5zZXQoImNsaWVudF9pZCIsdC5jbGllbnRJRCksdC5jbGllbnRTZWNyZXQmJnQuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmcy5zZXQoImNsaWVudF9zZWNyZXQiLHQuY2xpZW50U2VjcmV0KTtsZXQgYT0ib3BlbmlkIjt0LnNjb3BlJiZ0LnNjb3BlLmxlbmd0aD4wJiYodC5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHQuc2NvcGUucHVzaCgib3BlbmlkIiksYT10LnNjb3BlLmpvaW4oIiAiKSkscy5zZXQoInNjb3BlIixhKSxzLnNldCgicmVkaXJlY3RfdXJpIix0LnNpZ25JblJlZGlyZWN0VVJMKSx0LnJlc3BvbnNlTW9kZSYmcy5zZXQoInJlc3BvbnNlX21vZGUiLHQucmVzcG9uc2VNb2RlKTtjb25zdCBjPXlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmdlbmVyYXRlUEtDRUtleShyKTtpZih0LmVuYWJsZVBLQ0Upe2NvbnN0IGU9bnVsbD09PShuPXRoaXMuX2NyeXB0b0hlbHBlcil8fHZvaWQgMD09PW4/dm9pZCAwOm4uZ2V0Q29kZVZlcmlmaWVyKCksdD1udWxsPT09KGk9dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09aT92b2lkIDA6aS5nZXRDb2RlQ2hhbGxlbmdlKGUpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGMsZSxyKSxzLnNldCgiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwiUzI1NiIpLHMuc2V0KCJjb2RlX2NoYWxsZW5nZSIsdCl9dC5wcm9tcHQmJnMuc2V0KCJwcm9tcHQiLHQucHJvbXB0KTtjb25zdCBsPWU7aWYobClmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKGwpKSIiIT1lJiYiIiE9dCYmInN0YXRlIiE9PWUmJnMuc2V0KGUsdC50b1N0cmluZygpKTtyZXR1cm4gcy5zZXQoInN0YXRlIix1LmdlbmVyYXRlU3RhdGVQYXJhbUZvclJlcXVlc3RDb3JyZWxhdGlvbihjLGw/bnVsbD09PShvPWwuc3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnRvU3RyaW5nKCk6IiIpKSxzfSkpfWdldEF1dGhvcml6YXRpb25VUkwoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iik7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HQVUtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgZm91bmQuIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIGZyb20gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgbj1uZXcgVVJMKHQpLGk9eWllbGQgdGhpcy5nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUscik7Zm9yKGNvbnN0W2UsdF1vZiBpLmVudHJpZXMoKSluLnNlYXJjaFBhcmFtcy5hcHBlbmQoZSx0KTtyZXR1cm4gbi50b1N0cmluZygpfSkpfXJlcXVlc3RBY2Nlc3NUb2tlbihlLHIsbixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQscz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtTkYwMSIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtyJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhUGFyYW1ldGVyKCJzZXNzaW9uX3N0YXRlIixyLGkpKTtjb25zdCBsPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5zZXQoImNsaWVudF9pZCIscy5jbGllbnRJRCkscy5jbGllbnRTZWNyZXQmJnMuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmbC5zZXQoImNsaWVudF9zZWNyZXQiLHMuY2xpZW50U2VjcmV0KTtjb25zdCBkPWU7bGV0IGg7bC5zZXQoImNvZGUiLGQpLGwuc2V0KCJncmFudF90eXBlIiwiYXV0aG9yaXphdGlvbl9jb2RlIiksbC5zZXQoInJlZGlyZWN0X3VyaSIscy5zaWduSW5SZWRpcmVjdFVSTCksKG51bGw9PW8/dm9pZCAwOm8ucGFyYW1zKSYmT2JqZWN0LmVudHJpZXMoby5wYXJhbXMpLmZvckVhY2goKChbZSx0XSk9PntsLmFwcGVuZChlLHQpfSkpLHMuZW5hYmxlUEtDRSYmKGwuc2V0KCJjb2RlX3ZlcmlmaWVyIixgJHt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0obiksaSl9YCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKG4pLGkpKTt0cnl7aD15aWVsZCBmZXRjaCh0LHtib2R5OmwsY3JlZGVudGlhbHM6cy5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSl9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQxLU5FMDIiLCJSZXF1ZXN0aW5nIGFjY2VzcyB0b2tlbiBmYWlsZWQiLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBhY2Nlc3MgdG9rZW4gZnJvbSB0aGUgc2VydmVyIGZhaWxlZC4iKX1pZighaC5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtSEUwMyIsYFJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCB3aXRoICR7aC5zdGF0dXNUZXh0fWAseWllbGQgaC5qc29uKCkpO3JldHVybiB5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKGgsaSl9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQscj15aWVsZCB0aGlzLl9jb25maWcoKSxuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKTtpZighbi5yZWZyZXNoX3Rva2VuKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAxIiwiTm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4iLCJUaGVyZSB3YXMgbm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4gQXNnYXJkZW8gZG9lc24ndCByZXR1cm4gYSByZWZyZXNoIHRva2VuIGlmIHRoZSByZWZyZXNoIHRva2VuIGdyYW50IGlzIG5vdCBlbmFibGVkLiIpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAyIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IHdhcyBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3QgaT1bXTtsZXQgbztpLnB1c2goYGNsaWVudF9pZD0ke3IuY2xpZW50SUR9YCksaS5wdXNoKGByZWZyZXNoX3Rva2VuPSR7bi5yZWZyZXNoX3Rva2VufWApLGkucHVzaCgiZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuIiksci5jbGllbnRTZWNyZXQmJnIuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmaS5wdXNoKGBjbGllbnRfc2VjcmV0PSR7ci5jbGllbnRTZWNyZXR9YCk7dHJ5e289eWllbGQgZmV0Y2godCx7Ym9keTppLmpvaW4oIiYiKSxjcmVkZW50aWFsczpyLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItTlIwMyIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIpfWlmKCFvLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1IRTA0IixgUmVmcmVzaGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggJHtvLnN0YXR1c1RleHR9YCx5aWVsZCBvLmpzb24oKSk7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UobyxlKX0pKX1yZXZva2VBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLnJldm9jYXRpb25fZW5kcG9pbnQscj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkYwMSIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IG49W107bGV0IGk7bi5wdXNoKGBjbGllbnRfaWQ9JHtyLmNsaWVudElEfWApLG4ucHVzaChgdG9rZW49JHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5hY2Nlc3NfdG9rZW59YCksbi5wdXNoKCJ0b2tlbl90eXBlX2hpbnQ9YWNjZXNzX3Rva2VuIik7dHJ5e2k9eWllbGQgZmV0Y2godCx7Ym9keTpuLmpvaW4oIiYiKSxjcmVkZW50aWFsczpyLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkUwMiIsIlRoZSByZXF1ZXN0IHRvIHJldm9rZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIHJldm9rZSB0aGUgYWNjZXNzIHRva2VuIGZhaWxlZC4iKX1pZigyMDAhPT1pLnN0YXR1c3x8IWkub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQzLUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgcmV2b2tlIGFjY2VzcyB0b2tlbiByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKSxQcm9taXNlLnJlc29sdmUoaSl9KSl9cmVxdWVzdEN1c3RvbUdyYW50KGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBuPXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCksaT15aWVsZCB0aGlzLl9jb25maWcoKTtsZXQgbztpZihvPWUudG9rZW5FbmRwb2ludCYmMCE9PWUudG9rZW5FbmRwb2ludC50cmltKCkubGVuZ3RoP2UudG9rZW5FbmRwb2ludDpuLnRva2VuX2VuZHBvaW50LCFvfHwwPT09by50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5GMDEiLCJUb2tlbiBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gdG9rZW4gZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgcz15aWVsZCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhlLmRhdGEpLm1hcCgoKFtlLG5dKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKG4scik7cmV0dXJuYCR7ZX09JHt0fWB9KSkpKSk7bGV0IGw9T2JqZWN0LmFzc2lnbih7fSx1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSk7ZS5hdHRhY2hUb2tlbiYmKGw9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKHIpKS5hY2Nlc3NfdG9rZW59YH0pKTtjb25zdCBkPXtib2R5OnMuam9pbigiJiIpLGNyZWRlbnRpYWxzOmkuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhsKSxtZXRob2Q6IlBPU1QifTtsZXQgaDt0cnl7aD15aWVsZCBmZXRjaChvLGQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5FMDIiLCJUaGUgY3VzdG9tIGdyYW50IHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9ZT9lOiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iKX1pZigyMDAhPT1oLnN0YXR1c3x8IWgub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQ0ctSEUwMyIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0aGUgY3VzdG9tIGdyYW50IHJlcXVlc3QuICgke2guc3RhdHVzVGV4dH0pYCx5aWVsZCBoLmpzb24oKSk7cmV0dXJuIGUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShoLHIpOlByb21pc2UucmVzb2x2ZSh5aWVsZCBoLmpzb24oKSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpLHI9dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG51bGw9PXQ/dm9pZCAwOnQuaWRfdG9rZW4pO2xldCBuPXthbGxvd2VkU2NvcGVzOnQuc2NvcGUsc2Vzc2lvblN0YXRlOnQuc2Vzc2lvbl9zdGF0ZX07cmV0dXJuIE9iamVjdC5rZXlzKHIpLmZvckVhY2goKGU9Pnt2b2lkIDAhPT1yW2VdJiYiIiE9PXJbZV0mJm51bGwhPT1yW2VdfHxkZWxldGUgcltlXX0pKSxuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSxyKSxufSkpfWdldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbjtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4odCl9KSl9Z2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyfSkpfWdldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbn0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWUmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgcj10LndlbGxLbm93bkVuZHBvaW50O2lmKHIpe2xldCBlO3RyeXtpZihlPXlpZWxkIGZldGNoKHIpLDIwMCE9PWUuc3RhdHVzfHwhZS5vayl0aHJvdyBuZXcgRXJyb3J9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HT1BNRC1IRTAxIiwiSW52YWxpZCB3ZWxsLWtub3duIHJlc3BvbnNlIiwiVGhlIHdlbGwga25vd24gZW5kcG9pbnQgcmVzcG9uc2UgaGFzIGJlZW4gZmFpbGVkIHdpdGggYW4gZXJyb3IuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzKHlpZWxkIGUuanNvbigpKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoKX1pZih0LmJhc2VVcmwpe3RyeXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpKX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdPUE1ELUlWMDIiLCJSZXNvbHZpbmcgZW5kcG9pbnRzIGZhaWxlZC4iLG51bGwhPXQ/dDoiUmVzb2x2aW5nIGVuZHBvaW50cyBieSBiYXNlIHVybCBmYWlsZWQuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCl9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSgpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7dmFyIGUscixuLGksbyxzLGEsYyx1LGw7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCk7cmV0dXJue2F1dGhvcml6YXRpb25FbmRwb2ludDpudWxsIT09KGU9dC5hdXRob3JpemF0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09ZT9lOiIiLGNoZWNrU2Vzc2lvbklmcmFtZTpudWxsIT09KHI9dC5jaGVja19zZXNzaW9uX2lmcmFtZSkmJnZvaWQgMCE9PXI/cjoiIixlbmRTZXNzaW9uRW5kcG9pbnQ6bnVsbCE9PShuPXQuZW5kX3Nlc3Npb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1uP246IiIsaW50cm9zcGVjdGlvbkVuZHBvaW50Om51bGwhPT0oaT10LmludHJvc3BlY3Rpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1pP2k6IiIsaXNzdWVyOm51bGwhPT0obz10Lmlzc3VlcikmJnZvaWQgMCE9PW8/bzoiIixqd2tzVXJpOm51bGwhPT0ocz10Lmp3a3NfdXJpKSYmdm9pZCAwIT09cz9zOiIiLHJlZ2lzdHJhdGlvbkVuZHBvaW50Om51bGwhPT0oYT10LnJlZ2lzdHJhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWE/YToiIixyZXZvY2F0aW9uRW5kcG9pbnQ6bnVsbCE9PShjPXQucmV2b2NhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWM/YzoiIix0b2tlbkVuZHBvaW50Om51bGwhPT0odT10LnRva2VuX2VuZHBvaW50KSYmdm9pZCAwIT09dT91OiIiLHVzZXJpbmZvRW5kcG9pbnQ6bnVsbCE9PShsPXQudXNlcmluZm9fZW5kcG9pbnQpJiZ2b2lkIDAhPT1sP2w6IiJ9fSkpfWdldFNpZ25PdXRVUkwoZSl7dmFyIHIsbixpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsPT09KHI9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZW5kX3Nlc3Npb25fZW5kcG9pbnQsbz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMSIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBzPW51bGwhPT0obj1udWxsPT1vP3ZvaWQgMDpvLnNpZ25PdXRSZWRpcmVjdFVSTCkmJnZvaWQgMCE9PW4/bjpudWxsPT1vP3ZvaWQgMDpvLnNpZ25JblJlZGlyZWN0VVJMO2lmKCFzfHwwPT09cy50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtR1NPVS1ORjAzIiwiTm8gc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGZvdW5kLiIsIlRoZSBzaWduLW91dCByZWRpcmVjdCBVUkwgY2Fubm90IGJlIGZvdW5kIG9yIHRoZSBVUkwgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIE5vIHNpZ24taW4gcmVkaXJlY3QgVVJMIGhhcyBiZWVuIGZvdW5kIGVpdGhlci4gIik7Y29uc3QgYT1uZXcgVVJMU2VhcmNoUGFyYW1zO2lmKGEuc2V0KCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLHMpLG8uc2VuZElkVG9rZW5JbkxvZ291dFJlcXVlc3Qpe2NvbnN0IHQ9bnVsbD09PShpPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuaWRfdG9rZW47aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7YS5zZXQoImlkX3Rva2VuX2hpbnQiLHQpfWVsc2UgYS5zZXQoImNsaWVudF9pZCIsby5jbGllbnRJRCk7cmV0dXJuIGEuc2V0KCJzdGF0ZSIsInNpZ25fb3V0X3N1Y2Nlc3MiKSxgJHt0fT8ke2EudG9TdHJpbmcoKX1gfSkpfWNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl9KSl9Z2V0QWNjZXNzVG9rZW4oZSl7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PShyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuYWNjZXNzX3Rva2VufSkpfWdldENyZWF0ZWRBdChlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KHI9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5jcmVhdGVkX2F0fSkpfWdldEV4cGlyZXNJbihlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KHI9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5leHBpcmVzX2lufSkpfWlzQXV0aGVudGljYXRlZChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9Qm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKGUpKSxyPXlpZWxkIHRoaXMuZ2V0Q3JlYXRlZEF0KGUpLG49eWllbGQgdGhpcy5nZXRFeHBpcmVzSW4oZSk7aWYoIW4pcmV0dXJuITE7Y29uc3QgaT0xZTMqcGFyc2VJbnQobiksbz0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdCYmcitpPm99KSl9Z2V0UEtDRUNvZGUoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSkscil9KSl9c2V0UEtDRUNvZGUoZSxyLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShyKSxlLG4pfSkpfXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKGUpLHlpZWxkIHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApfSkpfX1jbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9zdG9yZT10fXNldERhdGFJbkJ1bGsoZSxyKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShuPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1uP246bnVsbCxpPXQmJkpTT04ucGFyc2UodCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkscikscz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9c2V0VmFsdWUoZSxyLG4pe3ZhciBpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KGk9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PWk/aTpudWxsLG89dCYmSlNPTi5wYXJzZSh0KSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W3JdOm59KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLHIpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KG49eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PW4/bjpudWxsLGk9dCYmSlNPTi5wYXJzZSh0KSxvPU9iamVjdC5hc3NpZ24oe30saSk7ZGVsZXRlIG9bcl07Y29uc3Qgcz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9X3Jlc29sdmVLZXkoZSx0KXtyZXR1cm4gdD9gJHtlfS0ke3RoaXMuX2lkfS0ke3R9YDpgJHtlfS0ke3RoaXMuX2lkfWB9aXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKXt0cnl7Y29uc3QgZT0iX19BU0dBUkRFT19BVVRIX0NPUkVfTE9DQUxfU1RPUkFHRV9URVNUX18iO3JldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLGUpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX1zZXRDb25maWdEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkobi5Db25maWdEYXRhKSxlKX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KG4uT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXNldFRlbXBvcmFyeURhdGEoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxyKSxlKX0pKX1zZXRTZXNzaW9uRGF0YShlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkobi5TZXNzaW9uRGF0YSxyKSxlKX0pKX1zZXRDdXN0b21EYXRhKGUscixuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGUsbikscil9KSl9Z2V0Q29uZmlnRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShuLk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YShlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0ocj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5UZW1wb3JhcnlEYXRhLGUpKSkmJnZvaWQgMCE9PXI/cjpudWxsKX0pKX1nZXRTZXNzaW9uRGF0YShlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0ocj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5TZXNzaW9uRGF0YSxlKSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCl9KSl9Z2V0Q3VzdG9tRGF0YShlLHIpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShuPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShlLHIpKSkmJnZvaWQgMCE9PW4/bjpudWxsKX0pKX1zZXRTZXNzaW9uU3RhdHVzKGUpe3RoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbG9jYWxTdG9yYWdlLnNldEl0ZW0oImFzZ2FyZGVvLXNlc3Npb24tYWN0aXZlIixlKX1nZXRTZXNzaW9uU3RhdHVzKCl7dmFyIGU7cmV0dXJuIHRoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbnVsbCE9PShlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpKSYmdm9pZCAwIT09ZT9lOiIifXJlbW92ZVNlc3Npb25TdGF0dXMoKXt0aGlzLmlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uT0lEQ1Byb3ZpZGVyTWV0YURhdGEpKX0pKX1yZW1vdmVUZW1wb3JhcnlEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxlKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5TZXNzaW9uRGF0YSxlKSl9KSl9Z2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uQ29uZmlnRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxyKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uU2Vzc2lvbkRhdGEscikpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfXNldENvbmZpZ0RhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpLGUscil9KSl9c2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLHIpfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxyLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxpKSxlLHIpfSkpfXNldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUscixpKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLlNlc3Npb25EYXRhLGkpLGUscil9KSl9cmVtb3ZlQ29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpLGUpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLlRlbXBvcmFyeURhdGEsciksZSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLlNlc3Npb25EYXRhLHIpLGUpfSkpfX1jb25zdCBwPXtjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6ci5xdWVyeSxzY29wZTpbIm9wZW5pZCJdLHNlbmRDb29raWVzSW5SZXF1ZXN0czohMCx2YWxpZGF0ZUlEVG9rZW46ITAsdmFsaWRhdGVJRFRva2VuSXNzdWVyOiEwfTtjbGFzcyBne2NvbnN0cnVjdG9yKCl7fWluaXRpYWxpemUoZSxyLG4saSl7dmFyIG8scyxhO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1lLmNsaWVudElEO2cuX2luc3RhbmNlSUQ/Zy5faW5zdGFuY2VJRCs9MTpnLl9pbnN0YW5jZUlEPTAsaSYmKGcuX2luc3RhbmNlSUQ9aSksdGhpcy5fZGF0YUxheWVyPW5ldyBmKHQ/YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH0tJHt0fWA6YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH1gLHIpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZT1uZXcgaCh0aGlzLl9kYXRhTGF5ZXIsbiksZy5fYXV0aGVudGljYXRpb25Db3JlPW5ldyBoKHRoaXMuX2RhdGFMYXllcixuKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSxlKSx7c2NvcGU6Wy4uLm51bGwhPT0obz1wLnNjb3BlKSYmdm9pZCAwIT09bz9vOltdLC4uLm51bGwhPT0oYT1udWxsPT09KHM9ZS5zY29wZSl8fHZvaWQgMD09PXM/dm9pZCAwOnMuZmlsdGVyKChlPT57dmFyIHQ7cmV0dXJuIShudWxsPT09KHQ9bnVsbD09cD92b2lkIDA6cC5zY29wZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuaW5jbHVkZXMoZSkpfSkpKSYmdm9pZCAwIT09YT9hOltdXX0pKX0pKX1nZXREYXRhTGF5ZXIoKXtyZXR1cm4gdGhpcy5fZGF0YUxheWVyfWdldEluc3RhbmNlSUQoKXtyZXR1cm4gZy5faW5zdGFuY2VJRH1nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIG51bGw9PXR8fGRlbGV0ZSB0LmZvcmNlSW5pdCwoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXModCxyKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTFBhcmFtcyh0LHIpKSl9KSl9Z2V0QXV0aG9yaXphdGlvblVSTChlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBudWxsPT10fHxkZWxldGUgdC5mb3JjZUluaXQsKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQscik6dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENQcm92aWRlck1ldGFEYXRhKG51bGw9PWU/dm9pZCAwOmUuZm9yY2VJbml0KS50aGVuKCgoKT0+dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkwodCxyKSkpfSkpfXJlcXVlc3RBY2Nlc3NUb2tlbihlLHIsbixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxyLG4saSxvKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITEpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEFjY2Vzc1Rva2VuKGUscixuLGksbykpKX0pKX1nZXRTaWduT3V0VVJMKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRTaWduT3V0VVJMKGUpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSl9Z2V0RGVjb2RlZElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldERlY29kZWRJRFRva2VuKGUpfSkpfWdldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldElEVG9rZW4oZSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QmFzaWNVc2VySW5mbyhlKX0pKX1nZXRDcnlwdG9IZWxwZXIoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0Q3J5cHRvSGVscGVyKCl9KSl9cmV2b2tlQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXZva2VBY2Nlc3NUb2tlbihlKX1yZWZyZXNoQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZWZyZXNoQWNjZXNzVG9rZW4oZSl9Z2V0QWNjZXNzVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEFjY2Vzc1Rva2VuKGUpfSkpfXJlcXVlc3RDdXN0b21HcmFudChlLHQpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEN1c3RvbUdyYW50KGUsdCl9aXNBdXRoZW50aWNhdGVkKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5pc0F1dGhlbnRpY2F0ZWQoZSl9KSl9Z2V0UEtDRUNvZGUoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0UEtDRUNvZGUoZSxyKX0pKX1zZXRQS0NFQ29kZShlLHIsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuc2V0UEtDRUNvZGUoZSxyLG4pfSkpfXN0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxyPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxuPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIXImJiJzaWduX291dF9zdWNjZXNzIj09PXImJiFufXN0YXRpYyBkaWRTaWduT3V0RmFpbChlKXtjb25zdCB0PW5ldyBVUkwoZSkscj10LnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIiksbj1Cb29sZWFuKHQuc2VhcmNoUGFyYW1zLmdldCgiZXJyb3IiKSk7cmV0dXJuISFyJiYic2lnbl9vdXRfc3VjY2VzcyI9PT1yJiZufXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS51cGRhdGVDb25maWcoZSl9KSl9c3RhdGljIGNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmNsZWFyVXNlclNlc3Npb25EYXRhKGUpfSkpfX1jb25zdCB2PSJpbml0Ijt2YXIgeTshZnVuY3Rpb24oZSl7ZS5TaWduSW49InNpZ24taW4iLGUuU2lnbk91dD0ic2lnbi1vdXQiLGUuSW5pdGlhbGl6ZT0iaW5pdGlhbGl6ZSIsZS5IdHRwUmVxdWVzdFN0YXJ0PSJodHRwLXJlcXVlc3Qtc3RhcnQiLGUuSHR0cFJlcXVlc3RGaW5pc2g9Imh0dHAtcmVxdWVzdC1maW5pc2giLGUuSHR0cFJlcXVlc3RFcnJvcj0iaHR0cC1yZXF1ZXN0LWVycm9yIixlLkh0dHBSZXF1ZXN0U3VjY2Vzcz0iaHR0cC1yZXF1ZXN0LXN1Y2Nlc3MiLGUuUmV2b2tlQWNjZXNzVG9rZW49InJldm9rZS1hY2Nlc3MtdG9rZW4iLGUuQ3VzdG9tR3JhbnQ9ImN1c3RvbS1ncmFudCIsZS5TaWduT3V0RmFpbGVkPSJzaWduLW91dC1mYWlsZWQifSh5fHwoeT17fSkpO2NvbnN0IG09InByb21wdE5vbmVSZXF1ZXN0U2VudCIsdz0iZXJyb3IiLF89ImVycm9yX2Rlc2NyaXB0aW9uIixTPSJjdXN0b21fZ3JhbnRfY29uZmlnIixiPSJBY2Nlc3MgdG9rZW4gaXMgaW52YWxpZCI7dmFyIEU7IWZ1bmN0aW9uKGUpe2UuTG9jYWxTdG9yYWdlPSJsb2NhbFN0b3JhZ2UiLGUuU2Vzc2lvblN0b3JhZ2U9InNlc3Npb25TdG9yYWdlIixlLldlYldvcmtlcj0id2ViV29ya2VyIixlLkJyb3dzZXJNZW1vcnk9ImJyb3dzZXJNZW1vcnkifShFfHwoRT17fSkpO2NsYXNzIGt7Y29uc3RydWN0b3IoKXt9c3RhdGljIGdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSl7cmV0dXJue2Jsb2I6KG51bGw9PWU/dm9pZCAwOmUuZGF0YSlpbnN0YW5jZW9mIEJsb2I/bnVsbD09ZT92b2lkIDA6ZS5kYXRhOm51bGwsZGF0YTpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHN1Y2Nlc3M6ITB9fXN0YXRpYyBnZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpe3JldHVybihudWxsPT1lP3ZvaWQgMDplLnRvSlNPTikmJmRlbGV0ZSBlLnRvSlNPTix7ZXJyb3I6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSxzdWNjZXNzOiExfX19Y2xhc3MgUntjb25zdHJ1Y3Rvcigpe31zdGF0aWMgcmVtb3ZlQXV0aG9yaXphdGlvbkNvZGUoKXtjb25zdCBlPWxvY2F0aW9uLmhyZWY7aGlzdG9yeS5wdXNoU3RhdGUoe30sZG9jdW1lbnQudGl0bGUsZS5yZXBsYWNlKC9cP2NvZGU9LiokLywiIikpfXN0YXRpYyBnZXRQS0NFKGUpe3ZhciB0O3JldHVybiBudWxsIT09KHQ9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShlKSkmJnZvaWQgMCE9PXQ/dDoiIn1zdGF0aWMgc2V0UEtDRShlLHQpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oZSx0KX1zdGF0aWMgc2V0U2lnbk91dFVSTChlLHQscil7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShgJHtzfS1pbnN0YW5jZV8ke3J9LSR7dH1gLGUpfXN0YXRpYyBnZXRTaWduT3V0VVJMKGUsdCl7dmFyIHI7cmV0dXJuIG51bGwhPT0ocj1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGAke3N9LWluc3RhbmNlXyR7dH0tJHtlfWApKSYmdm9pZCAwIT09cj9yOiIifXN0YXRpYyByZW1vdmVQS0NFKGUpe3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oZSl9c3RhdGljIGNhbkNvbnRpbnVlU2lnbkluKGUsdCl7cmV0dXJuIShlJiYhUi5oYXNFcnJvckluVVJMKCkmJiFSLmhhc0F1dGhTZWFyY2hQYXJhbXNJblVSTCgpJiYhdCl9c3RhdGljIGlzSW5pdGlhbGl6ZWRTaWxlbnRTaWduSW4oKXtyZXR1cm4gUi5pc1NpbGVudFN0YXRlUHJlc2VudEluVVJMKCl9c3RhdGljIHdhc1NpZ25JbkNhbGxlZCgpe3JldHVybiEoIVIuaGFzRXJyb3JJblVSTCgpJiYhUi5oYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwoKXx8dGhpcy5pc1NpbGVudFN0YXRlUHJlc2VudEluVVJMKCkpfXN0YXRpYyB3YXNTaWxlbnRTaWduSW5DYWxsZWQoKXtjb25zdCBlPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImluaXRpYWxpemVkLXNpbGVudC1zaWduLWluIiksdD1lP0pTT04ucGFyc2UoZSk6bnVsbDtyZXR1cm4gQm9vbGVhbih0KX1zdGF0aWMgaXNTaWduT3V0U3VjY2Vzc2Z1bCgpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoZy5pc1NpZ25PdXRTdWNjZXNzZnVsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSl7Y29uc3QgZT13aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgiPyIpWzBdO3JldHVybiBoaXN0b3J5LnB1c2hTdGF0ZSh7fSxkb2N1bWVudC50aXRsZSxlKSx5aWVsZCBnLmNsZWFyVXNlclNlc3Npb25EYXRhKCksITB9cmV0dXJuITF9KSl9c3RhdGljIGRpZFNpZ25PdXRGYWlsKCl7aWYoZy5kaWRTaWduT3V0RmFpbCh3aW5kb3cubG9jYXRpb24uaHJlZikpe2NvbnN0IGU9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZiksdD1lLnNlYXJjaFBhcmFtcy5nZXQodykscj1lLnNlYXJjaFBhcmFtcy5nZXQoXyksbj13aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgiPyIpWzBdO3JldHVybiBoaXN0b3J5LnB1c2hTdGF0ZSh7fSxkb2N1bWVudC50aXRsZSxuKSx7ZGVzY3JpcHRpb246bnVsbCE9cj9yOiIiLGVycm9yOm51bGwhPXQ/dDoiIn19cmV0dXJuITF9c3RhdGljIGlzU2lsZW50U3RhdGVQcmVzZW50SW5VUkwoKXt2YXIgZTtjb25zdCB0PW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIik7cmV0dXJuIG51bGwhPT0oZT1udWxsPT10P3ZvaWQgMDp0LmluY2x1ZGVzKCJzaWduLWluLXNpbGVudGx5IikpJiZ2b2lkIDAhPT1lJiZlfXN0YXRpYyBoYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwoZT13aW5kb3cubG9jYXRpb24uc2VhcmNoKXtyZXR1cm4vWz8mXWNvZGU9W14mXSsvLnRlc3QoZSl9c3RhdGljIGhhc0Vycm9ySW5VUkwoZT13aW5kb3cubG9jYXRpb24uaHJlZil7Y29uc3QgdD1uZXcgVVJMKGUpO3JldHVybiEhdC5zZWFyY2hQYXJhbXMuZ2V0KHcpJiYic2lnbl9vdXRfc3VjY2VzcyIhPT10LnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIil9c3RhdGljIGNhblNlbmRQcm9tcHROb25lUmVxdWVzdCgpe2NvbnN0IGU9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShtKTtyZXR1cm4hKGU/SlNPTi5wYXJzZShlKTpudWxsKX1zdGF0aWMgc2V0UHJvbXB0Tm9uZVJlcXVlc3RTZW50KGUpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0obSxKU09OLnN0cmluZ2lmeShlKSl9c3RhdGljIHdhaXRUaWxsUGFnZVJlZGlyZWN0KHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT1udWxsIT10P3Q6M2UzO3lpZWxkIG5ldyBQcm9taXNlKCh0PT5zZXRUaW1lb3V0KHQsMWUzKmUpKSl9KSl9fVIudW50aWw9KGUsdD01MDApPT57Y29uc3Qgcj1uPT5lKCk/bigpOnNldFRpbWVvdXQoKCgpPT5yKG4pKSx0KTtyZXR1cm4gbmV3IFByb21pc2Uocil9O2NsYXNzIFR7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudD1lLHRoaXMuX2RhdGFMYXllcj10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREYXRhTGF5ZXIoKSx0aGlzLl9zcGFIZWxwZXI9dCx0aGlzLl9pbnN0YW5jZUlEPXRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEluc3RhbmNlSUQoKSx0aGlzLl9pc1Rva2VuUmVmcmVzaGluZz0hMX1lbmFibGVIdHRwSGFuZGxlcihlKXsobnVsbD09ZT92b2lkIDA6ZS5lbmFibGVIYW5kbGVyKSYmZS5lbmFibGVIYW5kbGVyKCl9ZGlzYWJsZUh0dHBIYW5kbGVyKGUpeyhudWxsPT1lP3ZvaWQgMDplLmRpc2FibGVIYW5kbGVyKSYmZS5kaXNhYmxlSGFuZGxlcigpfWluaXRpYWxpemVTZXNzaW9uTWFuZ2VyKGUsdCxyLG4saSl7dmFyIG8scyxhO2kuaW5pdGlhbGl6ZShlLmNsaWVudElELG51bGwhPT0obz10LmNoZWNrU2Vzc2lvbklmcmFtZSkmJnZvaWQgMCE9PW8/bzoiIixyLG51bGwhPT0ocz1lLmNoZWNrU2Vzc2lvbkludGVydmFsKSYmdm9pZCAwIT09cz9zOjMsbnVsbCE9PShhPWUuc2Vzc2lvblJlZnJlc2hJbnRlcnZhbCkmJnZvaWQgMCE9PWE/YTozMDAsZS5zaWduSW5SZWRpcmVjdFVSTCxuKX1yZXF1ZXN0Q3VzdG9tR3JhbnQodCxyKXt2YXIgbixpLG87cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgcz0hMCxhPSExO2lmKG51bGw9PXQ/dm9pZCAwOnQudG9rZW5FbmRwb2ludCl7cz0hMTtmb3IoY29uc3QgZSBvZlsuLi5udWxsIT09KGk9bnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PWk/aTpbXSx0LmJhc2VVcmxdKWlmKGUmJihudWxsPT09KG89dC50b2tlbkVuZHBvaW50KXx8dm9pZCAwPT09bz92b2lkIDA6by5zdGFydHNXaXRoKGUpKSl7YT0hMDticmVha319cmV0dXJuIHQuc2hvdWxkUmVwbGF5QWZ0ZXJSZWZyZXNoJiZ0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihTLEpTT04uc3RyaW5naWZ5KHQpKSxzfHxhP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlcXVlc3RDdXN0b21HcmFudCh0KS50aGVuKChuPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHImJiJmdW5jdGlvbiI9PXR5cGVvZiByJiZyKHQpLHQucmV0dXJuc1Nlc3Npb24/KHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKSk6bn0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyBjKCJTUEEtTUFJTl9USFJFQURfQ0xJRU5ULVJDRy1JVjAxIiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgdG9rZW4gZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSl9Z2V0Q3VzdG9tR3JhbnRDb25maWdEYXRhKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKFMpO3JldHVybiBlP0pTT04ucGFyc2UoZSk6bnVsbH0pKX1yZWZyZXNoQWNjZXNzVG9rZW4odCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVmcmVzaEFjY2Vzc1Rva2VuKCk7Y29uc3QgZT15aWVsZCB0aGlzLmdldEN1c3RvbUdyYW50Q29uZmlnRGF0YSgpO3JldHVybiBlJiYoeWllbGQgdGhpcy5yZXF1ZXN0Q3VzdG9tR3JhbnQoZSx0KSksdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpfWNhdGNoKGUpe2NvbnN0IHQ9e3R5cGU6InJlZnJlc2gtYWNjZXNzLXRva2VuLWVycm9yIn07cmV0dXJuIHdpbmRvdy5wb3N0TWVzc2FnZSh0KSxQcm9taXNlLnJlamVjdChlKX19KSl9cmV0cnlGYWlsZWRSZXF1ZXN0cyh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9dC5odHRwQ2xpZW50LHI9dC5yZXF1ZXN0Q29uZmlnLG49dC5pc0h0dHBIYW5kbGVyRW5hYmxlZCxpPXQuaHR0cEVycm9yQ2FsbGJhY2ssbz10Lmh0dHBGaW5pc2hDYWxsYmFjazt5aWVsZCBSLnVudGlsKCgoKT0+IXRoaXMuX2lzVG9rZW5SZWZyZXNoaW5nKSk7dHJ5e2NvbnN0IHQ9eWllbGQgZS5yZXF1ZXN0KHIpO3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9Y2F0Y2goZSl7cmV0dXJuIG4mJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLFByb21pc2UucmVqZWN0KGUpfX0pKX1odHRwUmVxdWVzdCh0LHIsbixpLG8scyl7dmFyIGEsdTtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2xldCBsPSExO2NvbnN0IGQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgZSBvZlsuLi5udWxsIT09KGE9eWllbGQgbnVsbD09ZD92b2lkIDA6ZC5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1hP2E6W10sZC5iYXNlVXJsXSlpZihlJiYobnVsbD09PSh1PW51bGw9PXI/dm9pZCAwOnIudXJsKXx8dm9pZCAwPT09dT92b2lkIDA6dS5zdGFydHNXaXRoKGUpKSl7bD0hMDticmVha31yZXR1cm4gbD90LnJlcXVlc3QocikudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKGE9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZSx1LGw7aWYoNDAxPT09KG51bGw9PT0oZT1udWxsPT1hP3ZvaWQgMDphLnJlc3BvbnNlKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5zdGF0dXMpfHwhKG51bGw9PWE/dm9pZCAwOmEucmVzcG9uc2UpKXtpZih0aGlzLl9pc1Rva2VuUmVmcmVzaGluZylyZXR1cm4gdGhpcy5yZXRyeUZhaWxlZFJlcXVlc3RzKHtlbmFibGVSZXRyaWV2aW5nU2lnbk91dFVSTEZyb21TZXNzaW9uOnMsaHR0cENsaWVudDp0LGh0dHBFcnJvckNhbGxiYWNrOmksaHR0cEZpbmlzaENhbGxiYWNrOm8saXNIdHRwSGFuZGxlckVuYWJsZWQ6bixyZXF1ZXN0Q29uZmlnOnJ9KTtsZXQgZTt0aGlzLl9pc1Rva2VuUmVmcmVzaGluZz0hMDt0cnl7ZT15aWVsZCB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbihzKSx0aGlzLl9pc1Rva2VuUmVmcmVzaGluZz0hMX1jYXRjaChlKXt0aHJvdyB0aGlzLl9pc1Rva2VuUmVmcmVzaGluZz0hMSxuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Y29kZTpifSkpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSLVNFMDEiLG51bGwhPT0odT1udWxsPT1lP3ZvaWQgMDplLm5hbWUpJiZ2b2lkIDAhPT11P3U6IlJlZnJlc2ggdG9rZW4gcmVxdWVzdCBmYWlsZWQuIixudWxsIT09KGw9bnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlKSYmdm9pZCAwIT09bD9sOiJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGZvbGxvd2luZyBhIDQwMSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIil9aWYoZSl0cnl7Y29uc3QgZT15aWVsZCB0LnJlcXVlc3Qocik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX1jYXRjaChlKXtyZXR1cm4gbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShlKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QoZSl9fXJldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKGEpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdChhKX0pKSkpOlByb21pc2UucmVqZWN0KG5ldyBjKCJTUEEtQVVUSF9IRUxQRVItSFItSVYwMiIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpfSkpfWh0dHBSZXF1ZXN0QWxsKHQscixuLGksbyl7dmFyIHMsYSx1O3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IGw9ITA7Y29uc3QgZD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2Zvcihjb25zdCBlIG9mIHQpe2xldCB0PSExO2Zvcihjb25zdCByIG9mWy4uLm51bGwhPT0oYT1udWxsPT09KHM9eWllbGQgZCl8fHZvaWQgMD09PXM/dm9pZCAwOnMucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09YT9hOltdLGQuYmFzZVVybF0paWYociYmKG51bGw9PT0odT1lLnVybCl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc3RhcnRzV2l0aChyKSkpe3Q9ITA7YnJlYWt9aWYoIXQpe2w9ITE7YnJlYWt9fWNvbnN0IGg9W107aWYobClyZXR1cm4gdC5mb3JFYWNoKChlPT57aC5wdXNoKHIucmVxdWVzdChlKSl9KSksKG51bGw9PXI/dm9pZCAwOnIuYWxsKSYmci5hbGwoaCkudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgcyxhLHU7aWYoNDAxPT09KG51bGw9PT0ocz1udWxsPT10P3ZvaWQgMDp0LnJlc3BvbnNlKXx8dm9pZCAwPT09cz92b2lkIDA6cy5zdGF0dXMpfHwhKG51bGw9PXQ/dm9pZCAwOnQucmVzcG9uc2UpKXtsZXQgczt0cnl7cz15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZWZyZXNoQWNjZXNzVG9rZW4oKX1jYXRjaChlKXt0aHJvdyBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Y29kZTpifSkpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSQS1TRTAxIixudWxsIT09KGE9bnVsbD09ZT92b2lkIDA6ZS5uYW1lKSYmdm9pZCAwIT09YT9hOiJSZWZyZXNoIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9PSh1PW51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSkmJnZvaWQgMCE9PXU/dToiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmb2xsb3dpbmcgYSA0MDEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiIpfWlmKHMpcmV0dXJuIHIuYWxsJiZyLmFsbChoKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgodD0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKHQpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdCh0KX0pKSkpfXJldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKHQpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdCh0KX0pKSkpO3Rocm93IG5ldyBjKCJTUEEtQVVUSF9IRUxQRVItSFJBLUlWMDIiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpfSkpfXJlcXVlc3RBY2Nlc3NUb2tlbih0LHIsbixpLG8scyl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBhPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7aWYoYS5zdG9yYWdlPT09RS5Ccm93c2VyTWVtb3J5JiZhLmVuYWJsZVBLQ0UmJnIpe2NvbnN0IGU9Ui5nZXRQS0NFKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShyKSk7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuc2V0UEtDRUNvZGUodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKHIpLGUpfWVsc2UgYS5zdG9yYWdlPT09RS5XZWJXb3JrZXImJmkmJih5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5zZXRQS0NFQ29kZShpLG51bGwhPW8/bzoiIikpO3JldHVybiB0P3RoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlcXVlc3RBY2Nlc3NUb2tlbih0LG51bGwhPXI/cjoiIixudWxsIT1vP286IiIsdm9pZCAwLHMpLnRoZW4oKCgpPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuc3RvcmFnZSE9PUUuV2ViV29ya2VyPyhSLnNldFNpZ25PdXRVUkwoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0U2lnbk91dFVSTCgpLGEuY2xpZW50SUQsdGhpcy5faW5zdGFuY2VJRCksdGhpcy5fc3BhSGVscGVyJiYodGhpcy5fc3BhSGVscGVyLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpKSxuJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmYS5lbmFibGVPSURDU2Vzc2lvbk1hbmFnZW1lbnQmJm4oKSk6dGhpcy5fc3BhSGVscGVyJiZ0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCl9KSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLUFVVEhfSEVMUEVSLVJBVDEtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gY29kZS4iLCJObyBhdXRob3JpemF0aW9uIGNvZGUgd2FzIGZvdW5kLiIpKX0pKX10cnlTaWduSW5TaWxlbnRseSh0LHIsbixpLG8pe3ZhciBzO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoUi5pc0luaXRpYWxpemVkU2lsZW50U2lnbkluKCkpcmV0dXJuIHlpZWxkIG4ucmVjZWl2ZVByb21wdE5vbmVSZXNwb25zZSgpLFByb21pc2UucmVzb2x2ZSh7YWxsb3dlZFNjb3BlczoiIixkaXNwbGF5TmFtZToiIixlbWFpbDoiIixzZXNzaW9uU3RhdGU6IiIsc3ViOiIiLHRlbmFudERvbWFpbjoiIix1c2VybmFtZToiIn0pO2NvbnN0IGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJwSUZyYW1lIiksYz1udWxsPT09KHM9bnVsbD09YT92b2lkIDA6YS5jb250ZW50RG9jdW1lbnQpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmdldEVsZW1lbnRCeUlkKCJwcm9tcHROb25lSUZyYW1lIik7dHJ5e2NvbnN0IGU9eWllbGQgdChpKTtjLnNyYz1lfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX1yZXR1cm4gbmV3IFByb21pc2UoKCh0LG4pPT57Y29uc3QgaT1zZXRUaW1lb3V0KCgoKT0+e3QoITEpfSksMWU0KSxzPWE9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZSxjLHUsbDtjb25zdCBkPWEuZGF0YTsiY2hlY2tfc2Vzc2lvbl9zaWduZWRfb3V0Ij09KG51bGw9PWQ/dm9pZCAwOmQudHlwZSkmJih3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyksY2xlYXJUaW1lb3V0KGkpLHQoITEpKSwiY2hlY2tfc2Vzc2lvbl9zaWduZWRfaW4iPT0obnVsbD09ZD92b2lkIDA6ZC50eXBlKSYmKG51bGw9PT0oZT1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNvZGUpJiZyKG51bGw9PT0oYz1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT1jP3ZvaWQgMDpjLmNvZGUsbnVsbD09PSh1PW51bGw9PWQ/dm9pZCAwOmQuZGF0YSl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc2Vzc2lvblN0YXRlLG51bGw9PT0obD1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT1sP3ZvaWQgMDpsLnN0YXRlLG8pLnRoZW4oKGU9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyksdChlKX0pKS5jYXRjaCgoZT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKGUpfSkpLmZpbmFsbHkoKCgpPT57Y2xlYXJUaW1lb3V0KGkpfSkpfSkpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKX0pKX0pKX1oYW5kbGVTaWduSW4odCxyLG4pe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2lmKHlpZWxkIHQoKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHthbGxvd2VkU2NvcGVzOiIiLGRpc3BsYXlOYW1lOiIiLGVtYWlsOiIiLHNlc3Npb25TdGF0ZToiIixzdWI6IiIsdGVuYW50RG9tYWluOiIiLHVzZXJuYW1lOiIifSk7aWYoZS5zdG9yYWdlIT09RS5XZWJXb3JrZXImJih5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5pc0F1dGhlbnRpY2F0ZWQoKSkpcmV0dXJuIHRoaXMuX3NwYUhlbHBlci5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSx0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSxlLmVuYWJsZU9JRENTZXNzaW9uTWFuYWdlbWVudCYmcigpLFByb21pc2UucmVzb2x2ZSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCkpO2NvbnN0IGk9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCh3KSxvPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXyk7aWYoaSl7Y29uc3QgZT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTt0aHJvdyBlLnNlYXJjaFBhcmFtcy5kZWxldGUodyksZS5zZWFyY2hQYXJhbXMuZGVsZXRlKF8pLGhpc3RvcnkucHVzaFN0YXRlKG51bGwsZG9jdW1lbnQudGl0bGUsZS50b1N0cmluZygpKSxuZXcgYygiU1BBLUFVVEhfSEVMUEVSLVNJLVNFMDEiLGksbnVsbCE9bz9vOiIiKX1pZihlLnN0b3JhZ2U9PT1FLldlYldvcmtlciYmbil7Y29uc3QgZT15aWVsZCBuKCk7aWYoZSlyZXR1cm4gZX19KSl9YXR0YWNoVG9rZW5Ub1JlcXVlc3RDb25maWcodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPU9iamVjdC5hc3NpZ24oe2F0dGFjaFRva2VuOiEwfSx0KTtlLmF0dGFjaFRva2VuJiYoZS5zaG91bGRBdHRhY2hJRFBBY2Nlc3NUb2tlbj90LmhlYWRlcnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuaGVhZGVycykse0F1dGhvcml6YXRpb246YEJlYXJlciAke3lpZWxkIHRoaXMuZ2V0SURQQWNjZXNzVG9rZW4oKX1gfSk6dC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKCl9YH0pKX0pKX1nZXRCYXNpY1VzZXJJbmZvKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpfSkpfWdldERlY29kZWRJRFRva2VuKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKX1nZXREZWNvZGVkSURQSURUb2tlbigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERlY29kZWRJRFRva2VuKCl9KSl9Z2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0Q3J5cHRvSGVscGVyKCl9KSl9Z2V0SURUb2tlbigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldElEVG9rZW4oKX0pKX1nZXRPSURDU2VydmljZUVuZHBvaW50cygpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSl9Z2V0QWNjZXNzVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRBY2Nlc3NUb2tlbigpfSkpfWdldElEUEFjY2Vzc1Rva2VuKCl7dmFyIHQ7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PSh0PXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5hY2Nlc3NfdG9rZW59KSl9Z2V0RGF0YUxheWVyKCl7cmV0dXJuIHRoaXMuX2RhdGFMYXllcn1pc0F1dGhlbnRpY2F0ZWQoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5pc0F1dGhlbnRpY2F0ZWQoKX0pKX19Y2xhc3MgQXtjb25zdHJ1Y3RvcihlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudD1lLHRoaXMuX2RhdGFMYXllcj10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREYXRhTGF5ZXIoKX1yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHQpe3ZhciByLG47cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZighKG51bGwhPT0obj1udWxsPT09KHI9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIucGVyaW9kaWNUb2tlblJlZnJlc2gpJiZ2b2lkIDAhPT1uJiZuKSlyZXR1cm47Y29uc3Qgbz15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKTtpZihvLnJlZnJlc2hfdG9rZW4pe2NvbnN0IHI9cGFyc2VJbnQoby5leHBpcmVzX2luKSxuPXNldFRpbWVvdXQoKCgpPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdC5yZWZyZXNoQWNjZXNzVG9rZW4oKX0pKSksMWUzKihyPD0xMD9yOnItMTApKTt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpLEpTT04uc3RyaW5naWZ5KG4pKX19KSl9Z2V0UmVmcmVzaFRpbWVvdXRUaW1lcigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGkpKT9KU09OLnBhcnNlKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGkpKTotMX0pKX1jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih0KXJldHVybiB2b2lkIGNsZWFyVGltZW91dCh0KTtjb25zdCBlPXlpZWxkIHRoaXMuZ2V0UmVmcmVzaFRpbWVvdXRUaW1lcigpOy0xIT09ZSYmY2xlYXJUaW1lb3V0KGUpfSkpfX12YXIgQz0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIEQoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRlZmF1bHQiKT9lLmRlZmF1bHQ6ZX1mdW5jdGlvbiBQKGUpe2lmKGUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbihyKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUscik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixuLmdldD9uOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlW3JdfX0pfSkpLHR9dmFyIE8sST17ZXhwb3J0czp7fX0sVT1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19LEw9VSxIPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsTT0oTz1PYmplY3QuY3JlYXRlKG51bGwpLGZ1bmN0aW9uKGUpe3ZhciB0PUguY2FsbChlKTtyZXR1cm4gT1t0XXx8KE9bdF09dC5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpKX0pO2Z1bmN0aW9uIGooZSl7cmV0dXJuIGU9ZS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQpe3JldHVybiBNKHQpPT09ZX19ZnVuY3Rpb24gTihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiB4KGUpe3JldHVybiB2b2lkIDA9PT1lfXZhciBxPWooIkFycmF5QnVmZmVyIik7ZnVuY3Rpb24gQihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9ZnVuY3Rpb24gRihlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX1mdW5jdGlvbiBLKGUpe2lmKCJvYmplY3QiIT09TShlKSlyZXR1cm4hMTt2YXIgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIG51bGw9PT10fHx0PT09T2JqZWN0LnByb3RvdHlwZX12YXIgSj1qKCJEYXRlIiksVz1qKCJGaWxlIiksJD1qKCJCbG9iIiksej1qKCJGaWxlTGlzdCIpO2Z1bmN0aW9uIFYoZSl7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09PUguY2FsbChlKX12YXIgWT1qKCJVUkxTZWFyY2hQYXJhbXMiKTtmdW5jdGlvbiBHKGUsdCl7aWYobnVsbCE9ZSlpZigib2JqZWN0IiE9dHlwZW9mIGUmJihlPVtlXSksTihlKSlmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspdC5jYWxsKG51bGwsZVtyXSxyLGUpO2Vsc2UgZm9yKHZhciBpIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaSkmJnQuY2FsbChudWxsLGVbaV0saSxlKX12YXIgWCxaPShYPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkpLGZ1bmN0aW9uKGUpe3JldHVybiBYJiZlIGluc3RhbmNlb2YgWH0pO3ZhciBRLGVlPWooIkhUTUxGb3JtRWxlbWVudCIpLHRlPShRPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZnVuY3Rpb24oZSx0KXtyZXR1cm4gUS5jYWxsKGUsdCl9KSxyZT17aXNBcnJheTpOLGlzQXJyYXlCdWZmZXI6cSxpc0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJiF4KGUpJiZudWxsIT09ZS5jb25zdHJ1Y3RvciYmIXgoZS5jb25zdHJ1Y3RvcikmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfSxpc0Zvcm1EYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PSJbb2JqZWN0IEZvcm1EYXRhXSI7cmV0dXJuIGUmJigiZnVuY3Rpb24iPT10eXBlb2YgRm9ybURhdGEmJmUgaW5zdGFuY2VvZiBGb3JtRGF0YXx8SC5jYWxsKGUpPT09dHx8VihlLnRvU3RyaW5nKSYmZS50b1N0cmluZygpPT09dCl9LGlzQXJyYXlCdWZmZXJWaWV3OmZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJkFycmF5QnVmZmVyLmlzVmlldz9BcnJheUJ1ZmZlci5pc1ZpZXcoZSk6ZSYmZS5idWZmZXImJnEoZS5idWZmZXIpfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LGlzTnVtYmVyOkIsaXNPYmplY3Q6Rixpc1BsYWluT2JqZWN0OkssaXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4gZSYmMD09PU9iamVjdC5rZXlzKGUpLmxlbmd0aCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LnByb3RvdHlwZX0saXNVbmRlZmluZWQ6eCxpc0RhdGU6Sixpc0ZpbGU6Vyxpc0Jsb2I6JCxpc0Z1bmN0aW9uOlYsaXNTdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIEYoZSkmJlYoZS5waXBlKX0saXNVUkxTZWFyY2hQYXJhbXM6WSxpc1N0YW5kYXJkQnJvd3NlckVudjpmdW5jdGlvbigpe3ZhciBlO3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIG5hdmlnYXRvcnx8IlJlYWN0TmF0aXZlIiE9PShlPW5hdmlnYXRvci5wcm9kdWN0KSYmIk5hdGl2ZVNjcmlwdCIhPT1lJiYiTlMiIT09ZSkmJigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl9LGZvckVhY2g6RyxtZXJnZTpmdW5jdGlvbiBlKCl7dmFyIHQ9e307ZnVuY3Rpb24gcihyLG4pe0sodFtuXSkmJksocik/dFtuXT1lKHRbbl0scik6SyhyKT90W25dPWUoe30scik6TihyKT90W25dPXIuc2xpY2UoKTp0W25dPXJ9Zm9yKHZhciBuPTAsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspRyhhcmd1bWVudHNbbl0scik7cmV0dXJuIHR9LGV4dGVuZDpmdW5jdGlvbihlLHQscil7cmV0dXJuIEcodCwoZnVuY3Rpb24odCxuKXtlW25dPXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0P0wodCxyKTp0fSkpLGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLCIiKX0sc3RyaXBCT006ZnVuY3Rpb24oZSl7cmV0dXJuIDY1Mjc5PT09ZS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSxlfSxpbmhlcml0czpmdW5jdGlvbihlLHQscixuKXtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLG4pLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsciYmT2JqZWN0LmFzc2lnbihlLnByb3RvdHlwZSxyKX0sdG9GbGF0T2JqZWN0OmZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpLG8scyxhPXt9O2lmKHQ9dHx8e30sbnVsbD09ZSlyZXR1cm4gdDtkb3tmb3Iobz0oaT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSkubGVuZ3RoO28tLSA+MDspcz1pW29dLG4mJiFuKHMsZSx0KXx8YVtzXXx8KHRbc109ZVtzXSxhW3NdPSEwKTtlPSExIT09ciYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpfXdoaWxlKGUmJighcnx8cihlLHQpKSYmZSE9PU9iamVjdC5wcm90b3R5cGUpO3JldHVybiB0fSxraW5kT2Y6TSxraW5kT2ZUZXN0OmosZW5kc1dpdGg6ZnVuY3Rpb24oZSx0LHIpe2U9U3RyaW5nKGUpLCh2b2lkIDA9PT1yfHxyPmUubGVuZ3RoKSYmKHI9ZS5sZW5ndGgpLHItPXQubGVuZ3RoO3ZhciBuPWUuaW5kZXhPZih0LHIpO3JldHVybi0xIT09biYmbj09PXJ9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7aWYoTihlKSlyZXR1cm4gZTt2YXIgdD1lLmxlbmd0aDtpZighQih0KSlyZXR1cm4gbnVsbDtmb3IodmFyIHI9bmV3IEFycmF5KHQpO3QtLSA+MDspclt0XT1lW3RdO3JldHVybiByfSxpc1R5cGVkQXJyYXk6Wixpc0ZpbGVMaXN0OnosZm9yRWFjaEVudHJ5OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByLG49KGUmJmVbU3ltYm9sLml0ZXJhdG9yXSkuY2FsbChlKTsocj1uLm5leHQoKSkmJiFyLmRvbmU7KXt2YXIgaT1yLnZhbHVlO3QuY2FsbChlLGlbMF0saVsxXSl9fSxtYXRjaEFsbDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuPVtdO251bGwhPT0ocj1lLmV4ZWModCkpOyluLnB1c2gocik7cmV0dXJuIG59LGlzSFRNTEZvcm06ZWUsaGFzT3duUHJvcGVydHk6dGV9LG5lPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30saWU9W10sb2U9W10sc2U9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksYWU9ITE7ZnVuY3Rpb24gY2UoKXthZT0hMDtmb3IodmFyIGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHQ9MCxyPWUubGVuZ3RoO3Q8cjsrK3QpaWVbdF09ZVt0XSxvZVtlLmNoYXJDb2RlQXQodCldPXQ7b2VbIi0iLmNoYXJDb2RlQXQoMCldPTYyLG9lWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiB1ZShlLHQscil7Zm9yKHZhciBuLGksbz1bXSxzPXQ7czxyO3MrPTMpbj0oZVtzXTw8MTYpKyhlW3MrMV08PDgpK2VbcysyXSxvLnB1c2goaWVbKGk9bik+PjE4JjYzXStpZVtpPj4xMiY2M10raWVbaT4+NiY2M10raWVbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIGxlKGUpe3ZhciB0O2FlfHxjZSgpO2Zvcih2YXIgcj1lLmxlbmd0aCxuPXIlMyxpPSIiLG89W10scz0xNjM4MyxhPTAsYz1yLW47YTxjO2ErPXMpby5wdXNoKHVlKGUsYSxhK3M+Yz9jOmErcykpO3JldHVybiAxPT09bj8odD1lW3ItMV0saSs9aWVbdD4+Ml0saSs9aWVbdDw8NCY2M10saSs9Ij09Iik6Mj09PW4mJih0PShlW3ItMl08PDgpK2Vbci0xXSxpKz1pZVt0Pj4xMF0saSs9aWVbdD4+NCY2M10saSs9aWVbdDw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiBkZShlLHQscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLGM9KDE8PGEpLTEsdT1jPj4xLGw9LTcsZD1yP2ktMTowLGg9cj8tMToxLGY9ZVt0K2RdO2ZvcihkKz1oLG89ZiYoMTw8LWwpLTEsZj4+PS1sLGwrPWE7bD4wO289MjU2Km8rZVt0K2RdLGQrPWgsbC09OCk7Zm9yKHM9byYoMTw8LWwpLTEsbz4+PS1sLGwrPW47bD4wO3M9MjU2KnMrZVt0K2RdLGQrPWgsbC09OCk7aWYoMD09PW8pbz0xLXU7ZWxzZXtpZihvPT09YylyZXR1cm4gcz9OYU46MS8wKihmPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09dX1yZXR1cm4oZj8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiBoZShlLHQscixuLGksbyl7dmFyIHMsYSxjLHU9OCpvLWktMSxsPSgxPDx1KS0xLGQ9bD4+MSxoPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZj1uPzA6by0xLHA9bj8xOi0xLGc9dDwwfHwwPT09dCYmMS90PDA/MTowO2Zvcih0PU1hdGguYWJzKHQpLGlzTmFOKHQpfHx0PT09MS8wPyhhPWlzTmFOKHQpPzE6MCxzPWwpOihzPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLHQqKGM9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sYyo9MiksKHQrPXMrZD49MT9oL2M6aCpNYXRoLnBvdygyLDEtZCkpKmM+PTImJihzKyssYy89MikscytkPj1sPyhhPTAscz1sKTpzK2Q+PTE/KGE9KHQqYy0xKSpNYXRoLnBvdygyLGkpLHMrPWQpOihhPXQqTWF0aC5wb3coMixkLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtlW3IrZl09MjU1JmEsZis9cCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLHUrPWk7dT4wO2VbcitmXT0yNTUmcyxmKz1wLHMvPTI1Nix1LT04KTtlW3IrZi1wXXw9MTI4Kmd9dmFyIGZlPXt9LnRvU3RyaW5nLHBlPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PWZlLmNhbGwoZSl9O21lLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09bmUuVFlQRURfQVJSQVlfU1VQUE9SVHx8bmUuVFlQRURfQVJSQVlfU1VQUE9SVDt2YXIgZ2U9dmUoKTtmdW5jdGlvbiB2ZSgpe3JldHVybiBtZS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiB5ZShlLHQpe2lmKHZlKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gbWUuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT1uZXcgVWludDhBcnJheSh0KSkuX19wcm90b19fPW1lLnByb3RvdHlwZToobnVsbD09PWUmJihlPW5ldyBtZSh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBtZShlLHQscil7aWYoIShtZS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgbWUpKXJldHVybiBuZXcgbWUoZSx0LHIpO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gU2UodGhpcyxlKX1yZXR1cm4gd2UodGhpcyxlLHQscil9ZnVuY3Rpb24gd2UoZSx0LHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24oZSx0LHIsbil7aWYodC5ieXRlTGVuZ3RoLHI8MHx8dC5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZih0LmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTt0PXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0LHIpOm5ldyBVaW50OEFycmF5KHQscixuKTttZS5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPXQpLl9fcHJvdG9fXz1tZS5wcm90b3R5cGU6ZT1iZShlLHQpO3JldHVybiBlfShlLHQscixuKToic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0LHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFtZS5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8UmUodCxyKSxpPShlPXllKGUsbikpLndyaXRlKHQscik7aSE9PW4mJihlPWUuc2xpY2UoMCxpKSk7cmV0dXJuIGV9KGUsdCxyKTpmdW5jdGlvbihlLHQpe2lmKGtlKHQpKXt2YXIgcj0wfEVlKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPXllKGUscikpLmxlbmd0aHx8dC5jb3B5KGUsMCwwLHIpLGV9aWYodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiB0KXJldHVybiJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGh8fChuPXQubGVuZ3RoKSE9bj95ZShlLDApOmJlKGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJnBlKHQuZGF0YSkpcmV0dXJuIGJlKGUsdC5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KGUsdCl9ZnVuY3Rpb24gX2UoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBTZShlLHQpe2lmKF9lKHQpLGU9eWUoZSx0PDA/MDowfEVlKHQpKSwhbWUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPHQ7KytyKWVbcl09MDtyZXR1cm4gZX1mdW5jdGlvbiBiZShlLHQpe3ZhciByPXQubGVuZ3RoPDA/MDowfEVlKHQubGVuZ3RoKTtlPXllKGUscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpZVtuXT0yNTUmdFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBFZShlKXtpZihlPj12ZSgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4Iit2ZSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8ZX1mdW5jdGlvbiBrZShlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9ZnVuY3Rpb24gUmUoZSx0KXtpZihrZShlKSlyZXR1cm4gZS5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyhlKXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gZS5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgZSYmKGU9IiIrZSk7dmFyIHI9ZS5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKHQpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gWmUoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBRZShlKS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBaZShlKS5sZW5ndGg7dD0oIiIrdCkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBUZShlLHQscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBCZSh0aGlzLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gamUodGhpcyx0LHIpO2Nhc2UiYXNjaWkiOnJldHVybiB4ZSh0aGlzLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcWUodGhpcyx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gTWUodGhpcyx0LHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRmUodGhpcyx0LHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gQWUoZSx0LHIpe3ZhciBuPWVbdF07ZVt0XT1lW3JdLGVbcl09bn1mdW5jdGlvbiBDZShlLHQscixuLGkpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDplLmxlbmd0aC0xKSxyPDAmJihyPWUubGVuZ3RoK3IpLHI+PWUubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9ZS5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9bWUuZnJvbSh0LG4pKSxrZSh0KSlyZXR1cm4gMD09PXQubGVuZ3RoPy0xOkRlKGUsdCxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0Jj0yNTUsbWUuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LHIpOkRlKGUsW3RdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBEZShlLHQscixuLGkpe3ZhciBvLHM9MSxhPWUubGVuZ3RoLGM9dC5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYoZS5sZW5ndGg8Mnx8dC5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89MixjLz0yLHIvPTJ9ZnVuY3Rpb24gdShlLHQpe3JldHVybiAxPT09cz9lW3RdOmUucmVhZFVJbnQxNkJFKHQqcyl9aWYoaSl7dmFyIGw9LTE7Zm9yKG89cjtvPGE7bysrKWlmKHUoZSxvKT09PXUodCwtMT09PWw/MDpvLWwpKXtpZigtMT09PWwmJihsPW8pLG8tbCsxPT09YylyZXR1cm4gbCpzfWVsc2UtMSE9PWwmJihvLT1vLWwpLGw9LTF9ZWxzZSBmb3IocitjPmEmJihyPWEtYyksbz1yO28+PTA7by0tKXtmb3IodmFyIGQ9ITAsaD0wO2g8YztoKyspaWYodShlLG8raCkhPT11KHQsaCkpe2Q9ITE7YnJlYWt9aWYoZClyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBQZShlLHQscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT1lLmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtyK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gT2UoZSx0LHIsbil7cmV0dXJuIGV0KFplKHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIEllKGUsdCxyLG4pe3JldHVybiBldChmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7KytyKXQucHVzaCgyNTUmZS5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gdH0odCksZSxyLG4pfWZ1bmN0aW9uIFVlKGUsdCxyLG4pe3JldHVybiBJZShlLHQscixuKX1mdW5jdGlvbiBMZShlLHQscixuKXtyZXR1cm4gZXQoUWUodCksZSxyLG4pfWZ1bmN0aW9uIEhlKGUsdCxyLG4pe3JldHVybiBldChmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGksbz1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKW49KHI9ZS5jaGFyQ29kZUF0KHMpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIE1lKGUsdCxyKXtyZXR1cm4gMD09PXQmJnI9PT1lLmxlbmd0aD9sZShlKTpsZShlLnNsaWNlKHQscikpfWZ1bmN0aW9uIGplKGUsdCxyKXtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPXQ7aTxyOyl7dmFyIG8scyxhLGMsdT1lW2ldLGw9bnVsbCxkPXU+MjM5PzQ6dT4yMjM/Mzp1PjE5MT8yOjE7aWYoaStkPD1yKXN3aXRjaChkKXtjYXNlIDE6dTwxMjgmJihsPXUpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89ZVtpKzFdKSkmJihjPSgzMSZ1KTw8Nnw2MyZvKT4xMjcmJihsPWMpO2JyZWFrO2Nhc2UgMzpvPWVbaSsxXSxzPWVbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKGM9KDE1JnUpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKGM8NTUyOTZ8fGM+NTczNDMpJiYobD1jKTticmVhaztjYXNlIDQ6bz1lW2krMV0scz1lW2krMl0sYT1lW2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKGM9KDE1JnUpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmYzwxMTE0MTEyJiYobD1jKX1udWxsPT09bD8obD02NTUzMyxkPTEpOmw+NjU1MzUmJihsLT02NTUzNixuLnB1c2gobD4+PjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxuLnB1c2gobCksaSs9ZH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9TmUpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUpO3ZhciByPSIiLG49MDtmb3IoO248dDspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZS5zbGljZShuLG4rPU5lKSk7cmV0dXJuIHJ9KG4pfW1lLnBvb2xTaXplPTgxOTIsbWUuX2F1Z21lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19fPW1lLnByb3RvdHlwZSxlfSxtZS5mcm9tPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gd2UobnVsbCxlLHQscil9LG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihtZS5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLG1lLl9fcHJvdG9fXz1VaW50OEFycmF5KSxtZS5hbGxvYz1mdW5jdGlvbihlLHQscil7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBfZSh0KSx0PD0wP3llKGUsdCk6dm9pZCAwIT09cj8ic3RyaW5nIj09dHlwZW9mIG4/eWUoZSx0KS5maWxsKHIsbik6eWUoZSx0KS5maWxsKHIpOnllKGUsdCl9KG51bGwsZSx0LHIpfSxtZS5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtyZXR1cm4gU2UobnVsbCxlKX0sbWUuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe3JldHVybiBTZShudWxsLGUpfSxtZS5pc0J1ZmZlcj10dCxtZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7aWYoIWtlKGUpfHwha2UodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKGU9PT10KXJldHVybiAwO2Zvcih2YXIgcj1lLmxlbmd0aCxuPXQubGVuZ3RoLGk9MCxvPU1hdGgubWluKHIsbik7aTxvOysraSlpZihlW2ldIT09dFtpXSl7cj1lW2ldLG49dFtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LG1lLmlzRW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LG1lLmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFwZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PWUubGVuZ3RoKXJldHVybiBtZS5hbGxvYygwKTt2YXIgcjtpZih2b2lkIDA9PT10KWZvcih0PTAscj0wO3I8ZS5sZW5ndGg7KytyKXQrPWVbcl0ubGVuZ3RoO3ZhciBuPW1lLmFsbG9jVW5zYWZlKHQpLGk9MDtmb3Iocj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbz1lW3JdO2lmKCFrZShvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7by5jb3B5KG4saSksaSs9by5sZW5ndGh9cmV0dXJuIG59LG1lLmJ5dGVMZW5ndGg9UmUsbWUucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxtZS5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz0yKUFlKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfSxtZS5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz00KUFlKHRoaXMsdCx0KzMpLEFlKHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9LG1lLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTgpQWUodGhpcyx0LHQrNyksQWUodGhpcyx0KzEsdCs2KSxBZSh0aGlzLHQrMix0KzUpLEFlKHRoaXMsdCszLHQrNCk7cmV0dXJuIHRoaXN9LG1lLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT1lPyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP2plKHRoaXMsMCxlKTpUZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG1lLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIWtlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PWV8fDA9PT1tZS5jb21wYXJlKHRoaXMsZSl9LG1lLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIGU9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LG1lLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCxyLG4saSl7aWYoIWtlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT10JiYodD0wKSx2b2lkIDA9PT1yJiYocj1lP2UubGVuZ3RoOjApLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPXRoaXMubGVuZ3RoKSx0PDB8fHI+ZS5sZW5ndGh8fG48MHx8aT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobj49aSYmdD49cilyZXR1cm4gMDtpZihuPj1pKXJldHVybi0xO2lmKHQ+PXIpcmV0dXJuIDE7aWYodGhpcz09PWUpcmV0dXJuIDA7Zm9yKHZhciBvPShpPj4+PTApLShuPj4+PTApLHM9KHI+Pj49MCktKHQ+Pj49MCksYT1NYXRoLm1pbihvLHMpLGM9dGhpcy5zbGljZShuLGkpLHU9ZS5zbGljZSh0LHIpLGw9MDtsPGE7KytsKWlmKGNbbF0hPT11W2xdKXtvPWNbbF0scz11W2xdO2JyZWFrfXJldHVybiBvPHM/LTE6czxvPzE6MH0sbWUucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihlLHQscil9LG1lLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gQ2UodGhpcyxlLHQsciwhMCl9LG1lLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlLHQscil7cmV0dXJuIENlKHRoaXMsZSx0LHIsITEpfSxtZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSx0LHIsbil7aWYodm9pZCAwPT09dCluPSJ1dGY4IixyPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKHZvaWQgMD09PXImJiJzdHJpbmciPT10eXBlb2YgdCluPXQscj10aGlzLmxlbmd0aCx0PTA7ZWxzZXtpZighaXNGaW5pdGUodCkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO3R8PTAsaXNGaW5pdGUocik/KHJ8PTAsdm9pZCAwPT09biYmKG49InV0ZjgiKSk6KG49cixyPXZvaWQgMCl9dmFyIGk9dGhpcy5sZW5ndGgtdDtpZigodm9pZCAwPT09cnx8cj5pKSYmKHI9aSksZS5sZW5ndGg+MCYmKHI8MHx8dDwwKXx8dD50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtufHwobj0idXRmOCIpO2Zvcih2YXIgbz0hMTs7KXN3aXRjaChuKXtjYXNlImhleCI6cmV0dXJuIFBlKHRoaXMsZSx0LHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIE9lKHRoaXMsZSx0LHIpO2Nhc2UiYXNjaWkiOnJldHVybiBJZSh0aGlzLGUsdCxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBVZSh0aGlzLGUsdCxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIExlKHRoaXMsZSx0LHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gSGUodGhpcyxlLHQscik7ZGVmYXVsdDppZihvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbik7bj0oIiIrbikudG9Mb3dlckNhc2UoKSxvPSEwfX0sbWUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIE5lPTQwOTY7ZnVuY3Rpb24geGUoZSx0LHIpe3ZhciBuPSIiO3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBpPXQ7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZlW2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBxZShlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGk9dDtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gQmUoZSx0LHIpe3ZhciBuPWUubGVuZ3RoOyghdHx8dDwwKSYmKHQ9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPXQ7bzxyOysrbylpKz1YZShlW29dKTtyZXR1cm4gaX1mdW5jdGlvbiBGZShlLHQscil7Zm9yKHZhciBuPWUuc2xpY2UodCxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEtlKGUsdCxyKXtpZihlJTEhPTB8fGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYoZSt0PnIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBKZShlLHQscixuLGksbyl7aWYoIWtlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZih0Pml8fHQ8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBXZShlLHQscixuKXt0PDAmJih0PTY1NTM1K3QrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbihlLmxlbmd0aC1yLDIpO2k8bzsrK2kpZVtyK2ldPSh0JjI1NTw8OCoobj9pOjEtaSkpPj4+OCoobj9pOjEtaSl9ZnVuY3Rpb24gJGUoZSx0LHIsbil7dDwwJiYodD00Mjk0OTY3Mjk1K3QrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbihlLmxlbmd0aC1yLDQpO2k8bzsrK2kpZVtyK2ldPXQ+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gemUoZSx0LHIsbixpLG8pe2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBWZShlLHQscixuLGkpe3JldHVybiBpfHx6ZShlLDAsciw0KSxoZShlLHQscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBZZShlLHQscixuLGkpe3JldHVybiBpfHx6ZShlLDAsciw4KSxoZShlLHQscixuLDUyLDgpLHIrOH1tZS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKChlPX5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSwodD12b2lkIDA9PT10P246fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLHQ8ZSYmKHQ9ZSksbWUuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1tZS5wcm90b3R5cGU7ZWxzZXt2YXIgaT10LWU7cj1uZXcgbWUoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rZV19cmV0dXJuIHJ9LG1lLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8S2UoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG59LG1lLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8S2UoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlKy0tdF0saT0xO3Q+MCYmKGkqPTI1Nik7KW4rPXRoaXNbZSstLXRdKmk7cmV0dXJuIG59LG1lLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8S2UoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfSxtZS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEtlKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LG1lLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8S2UoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sbWUucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxLZShlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSsxNjc3NzIxNip0aGlzW2UrM119LG1lLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8S2UoZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxtZS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8S2UoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KnQpKSxufSxtZS5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8S2UoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dCxpPTEsbz10aGlzW2UrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW2UrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCp0KSksb30sbWUucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEtlKGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LG1lLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe3R8fEtlKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LG1lLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fEtlKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LG1lLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxLZShlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sbWUucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEtlKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxtZS5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8S2UoZSw0LHRoaXMubGVuZ3RoKSxkZSh0aGlzLGUsITAsMjMsNCl9LG1lLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxLZShlLDQsdGhpcy5sZW5ndGgpLGRlKHRoaXMsZSwhMSwyMyw0KX0sbWUucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxLZShlLDgsdGhpcy5sZW5ndGgpLGRlKHRoaXMsZSwhMCw1Miw4KX0sbWUucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxLZShlLDgsdGhpcy5sZW5ndGgpLGRlKHRoaXMsZSwhMSw1Miw4KX0sbWUucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxyLG4peyhlPStlLHR8PTAscnw9MCxuKXx8SmUodGhpcyxlLHQscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT0xLG89MDtmb3IodGhpc1t0XT0yNTUmZTsrK288ciYmKGkqPTI1Nik7KXRoaXNbdCtvXT1lL2kmMjU1O3JldHVybiB0K3J9LG1lLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQscixuKXsoZT0rZSx0fD0wLHJ8PTAsbil8fEplKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1t0K2ldPTI1NSZlOy0taT49MCYmKG8qPTI1Nik7KXRoaXNbdCtpXT1lL28mMjU1O3JldHVybiB0K3J9LG1lLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fEplKHRoaXMsZSx0LDEsMjU1LDApLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxtZS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxKZSh0aGlzLGUsdCwyLDY1NTM1LDApLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpXZSh0aGlzLGUsdCwhMCksdCsyfSxtZS5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxKZSh0aGlzLGUsdCwyLDY1NTM1LDApLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpXZSh0aGlzLGUsdCwhMSksdCsyfSxtZS5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxKZSh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksbWUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0KzNdPWU+Pj4yNCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCsxXT1lPj4+OCx0aGlzW3RdPTI1NSZlKTokZSh0aGlzLGUsdCwhMCksdCs0fSxtZS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxKZSh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksbWUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTokZSh0aGlzLGUsdCwhMSksdCs0fSxtZS5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbihlLHQscixuKXtpZihlPStlLHR8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO0plKHRoaXMsZSx0LHIsaS0xLC1pKX12YXIgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPHImJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28tMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtyfSxtZS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbihlLHQscixuKXtpZihlPStlLHR8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO0plKHRoaXMsZSx0LHIsaS0xLC1pKX12YXIgbz1yLTEscz0xLGE9MDtmb3IodGhpc1t0K29dPTI1NSZlOy0tbz49MCYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3QrbysxXSYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K3J9LG1lLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8SmUodGhpcyxlLHQsMSwxMjcsLTEyOCksbWUuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksZTwwJiYoZT0yNTUrZSsxKSx0aGlzW3RdPTI1NSZlLHQrMX0sbWUucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxKZSh0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksbWUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOldlKHRoaXMsZSx0LCEwKSx0KzJ9LG1lLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8SmUodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpXZSh0aGlzLGUsdCwhMSksdCsyfSxtZS5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fEplKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksbWUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrM109ZT4+PjI0KTokZSh0aGlzLGUsdCwhMCksdCs0fSxtZS5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fEplKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSksbWUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTokZSh0aGlzLGUsdCwhMSksdCs0fSxtZS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gVmUodGhpcyxlLHQsITAscil9LG1lLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBWZSh0aGlzLGUsdCwhMSxyKX0sbWUucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBZZSh0aGlzLGUsdCwhMCxyKX0sbWUucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBZZSh0aGlzLGUsdCwhMSxyKX0sbWUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09ZS5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PG4tciYmKG49ZS5sZW5ndGgtdCtyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09ZSYmcjx0JiZ0PG4pZm9yKGk9by0xO2k+PTA7LS1pKWVbaSt0XT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IW1lLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKGk9MDtpPG87KytpKWVbaSt0XT10aGlzW2krcl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChlLHRoaXMuc3ViYXJyYXkocixyK28pLHQpO3JldHVybiBvfSxtZS5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbihlLHQscixuKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdD8obj10LHQ9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PWUubGVuZ3RoKXt2YXIgaT1lLmNoYXJDb2RlQXQoMCk7aTwyNTYmJihlPWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhbWUuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIGUmJihlJj0yNTUpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9dClyZXR1cm4gdGhpczt2YXIgbztpZih0Pj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLGV8fChlPTApLCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobz10O288cjsrK28pdGhpc1tvXT1lO2Vsc2V7dmFyIHM9a2UoZSk/ZTpaZShuZXcgbWUoZSxuKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxyLXQ7KytvKXRoaXNbbyt0XT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBHZT0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBYZShlKXtyZXR1cm4gZTwxNj8iMCIrZS50b1N0cmluZygxNik6ZS50b1N0cmluZygxNil9ZnVuY3Rpb24gWmUoZSx0KXt2YXIgcjt0PXR8fDEvMDtmb3IodmFyIG49ZS5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPWUuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKHQtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigodC09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKHQtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIFFlKGUpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdCxyLG4saSxvLHM7YWV8fGNlKCk7dmFyIGE9ZS5sZW5ndGg7aWYoYSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7bz0iPSI9PT1lW2EtMl0/MjoiPSI9PT1lW2EtMV0/MTowLHM9bmV3IHNlKDMqYS80LW8pLG49bz4wP2EtNDphO3ZhciBjPTA7Zm9yKHQ9MCxyPTA7dDxuO3QrPTQscis9MylpPW9lW2UuY2hhckNvZGVBdCh0KV08PDE4fG9lW2UuY2hhckNvZGVBdCh0KzEpXTw8MTJ8b2VbZS5jaGFyQ29kZUF0KHQrMildPDw2fG9lW2UuY2hhckNvZGVBdCh0KzMpXSxzW2MrK109aT4+MTYmMjU1LHNbYysrXT1pPj44JjI1NSxzW2MrK109MjU1Jmk7cmV0dXJuIDI9PT1vPyhpPW9lW2UuY2hhckNvZGVBdCh0KV08PDJ8b2VbZS5jaGFyQ29kZUF0KHQrMSldPj40LHNbYysrXT0yNTUmaSk6MT09PW8mJihpPW9lW2UuY2hhckNvZGVBdCh0KV08PDEwfG9lW2UuY2hhckNvZGVBdCh0KzEpXTw8NHxvZVtlLmNoYXJDb2RlQXQodCsyKV0+PjIsc1tjKytdPWk+PjgmMjU1LHNbYysrXT0yNTUmaSksc30oZnVuY3Rpb24oZSl7aWYoKGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0oZSkucmVwbGFjZShHZSwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7ZS5sZW5ndGglNCE9MDspZSs9Ij0iO3JldHVybiBlfShlKSl9ZnVuY3Rpb24gZXQoZSx0LHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49dC5sZW5ndGh8fGk+PWUubGVuZ3RoKTsrK2kpdFtpK3JdPWVbaV07cmV0dXJuIGl9ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIG51bGwhPWUmJighIWUuX2lzQnVmZmVyfHxydChlKXx8ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUucmVhZEZsb2F0TEUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnNsaWNlJiZydChlLnNsaWNlKDAsMCkpfShlKSl9ZnVuY3Rpb24gcnQoZSl7cmV0dXJuISFlLmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKX12YXIgbnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQnVmZmVyOm1lLElOU1BFQ1RfTUFYX0JZVEVTOjUwLFNsb3dCdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuK2UhPWUmJihlPTApLG1lLmFsbG9jKCtlKX0saXNCdWZmZXI6dHQsa01heExlbmd0aDpnZX0pLGl0PXJlO2Z1bmN0aW9uIG90KGUsdCxyLG4saSl7RXJyb3IuY2FsbCh0aGlzKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9KG5ldyBFcnJvcikuc3RhY2ssdGhpcy5tZXNzYWdlPWUsdGhpcy5uYW1lPSJBeGlvc0Vycm9yIix0JiYodGhpcy5jb2RlPXQpLHImJih0aGlzLmNvbmZpZz1yKSxuJiYodGhpcy5yZXF1ZXN0PW4pLGkmJih0aGlzLnJlc3BvbnNlPWkpfWl0LmluaGVyaXRzKG90LEVycm9yLHt0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fX0pO3ZhciBzdD1vdC5wcm90b3R5cGUsYXQ9e307WyJFUlJfQkFEX09QVElPTl9WQUxVRSIsIkVSUl9CQURfT1BUSU9OIiwiRUNPTk5BQk9SVEVEIiwiRVRJTUVET1VUIiwiRVJSX05FVFdPUksiLCJFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTIiwiRVJSX0RFUFJFQ0FURUQiLCJFUlJfQkFEX1JFU1BPTlNFIiwiRVJSX0JBRF9SRVFVRVNUIiwiRVJSX0NBTkNFTEVEIiwiRVJSX05PVF9TVVBQT1JUIiwiRVJSX0lOVkFMSURfVVJMIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7YXRbZV09e3ZhbHVlOmV9fSkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG90LGF0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoc3QsImlzQXhpb3NFcnJvciIse3ZhbHVlOiEwfSksb3QuZnJvbT1mdW5jdGlvbihlLHQscixuLGksbyl7dmFyIHM9T2JqZWN0LmNyZWF0ZShzdCk7cmV0dXJuIGl0LnRvRmxhdE9iamVjdChlLHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09RXJyb3IucHJvdG90eXBlfSkpLG90LmNhbGwocyxlLm1lc3NhZ2UsdCxyLG4saSkscy5jYXVzZT1lLHMubmFtZT1lLm5hbWUsbyYmT2JqZWN0LmFzc2lnbihzLG8pLHN9O3ZhciBjdD1vdCx1dD0ib2JqZWN0Ij09dHlwZW9mIHNlbGY/c2VsZi5Gb3JtRGF0YTp3aW5kb3cuRm9ybURhdGEsbHQ9cmUsZHQ9Y3QsaHQ9dXQ7ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIGx0LmlzUGxhaW5PYmplY3QoZSl8fGx0LmlzQXJyYXkoZSl9ZnVuY3Rpb24gcHQoZSl7cmV0dXJuIGx0LmVuZHNXaXRoKGUsIltdIik/ZS5zbGljZSgwLC0yKTplfWZ1bmN0aW9uIGd0KGUsdCxyKXtyZXR1cm4gZT9lLmNvbmNhdCh0KS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9cHQoZSksIXImJnQ/IlsiK2UrIl0iOmV9KSkuam9pbihyPyIuIjoiIik6dH12YXIgdnQ9bHQudG9GbGF0T2JqZWN0KGx0LHt9LG51bGwsKGZ1bmN0aW9uKGUpe3JldHVybi9eaXNbQS1aXS8udGVzdChlKX0pKTt2YXIgeXQ9ZnVuY3Rpb24oZSx0LHIpe2lmKCFsdC5pc09iamVjdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QiKTt0PXR8fG5ldyhodHx8Rm9ybURhdGEpO3ZhciBuLGk9KHI9bHQudG9GbGF0T2JqZWN0KHIse21ldGFUb2tlbnM6ITAsZG90czohMSxpbmRleGVzOiExfSwhMSwoZnVuY3Rpb24oZSx0KXtyZXR1cm4hbHQuaXNVbmRlZmluZWQodFtlXSl9KSkpLm1ldGFUb2tlbnMsbz1yLnZpc2l0b3J8fGwscz1yLmRvdHMsYT1yLmluZGV4ZXMsYz0oci5CbG9ifHwidW5kZWZpbmVkIiE9dHlwZW9mIEJsb2ImJkJsb2IpJiYoKG49dCkmJmx0LmlzRnVuY3Rpb24obi5hcHBlbmQpJiYiRm9ybURhdGEiPT09bltTeW1ib2wudG9TdHJpbmdUYWddJiZuW1N5bWJvbC5pdGVyYXRvcl0pO2lmKCFsdC5pc0Z1bmN0aW9uKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gdShlKXtpZihudWxsPT09ZSlyZXR1cm4iIjtpZihsdC5pc0RhdGUoZSkpcmV0dXJuIGUudG9JU09TdHJpbmcoKTtpZighYyYmbHQuaXNCbG9iKGUpKXRocm93IG5ldyBkdCgiQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4iKTtyZXR1cm4gbHQuaXNBcnJheUJ1ZmZlcihlKXx8bHQuaXNUeXBlZEFycmF5KGUpP2MmJiJmdW5jdGlvbiI9PXR5cGVvZiBCbG9iP25ldyBCbG9iKFtlXSk6bWUuZnJvbShlKTplfWZ1bmN0aW9uIGwoZSxyLG4pe3ZhciBvPWU7aWYoZSYmIW4mJiJvYmplY3QiPT10eXBlb2YgZSlpZihsdC5lbmRzV2l0aChyLCJ7fSIpKXI9aT9yOnIuc2xpY2UoMCwtMiksZT1KU09OLnN0cmluZ2lmeShlKTtlbHNlIGlmKGx0LmlzQXJyYXkoZSkmJmZ1bmN0aW9uKGUpe3JldHVybiBsdC5pc0FycmF5KGUpJiYhZS5zb21lKGZ0KX0oZSl8fGx0LmlzRmlsZUxpc3QoZSl8fGx0LmVuZHNXaXRoKHIsIltdIikmJihvPWx0LnRvQXJyYXkoZSkpKXJldHVybiByPXB0KHIpLG8uZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXshbHQuaXNVbmRlZmluZWQoZSkmJm51bGwhPT1lJiZ0LmFwcGVuZCghMD09PWE/Z3QoW3JdLG4scyk6bnVsbD09PWE/cjpyKyJbXSIsdShlKSl9KSksITE7cmV0dXJuISFmdChlKXx8KHQuYXBwZW5kKGd0KG4scixzKSx1KGUpKSwhMSl9dmFyIGQ9W10saD1PYmplY3QuYXNzaWduKHZ0LHtkZWZhdWx0VmlzaXRvcjpsLGNvbnZlcnRWYWx1ZTp1LGlzVmlzaXRhYmxlOmZ0fSk7aWYoIWx0LmlzT2JqZWN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgbXVzdCBiZSBhbiBvYmplY3QiKTtyZXR1cm4gZnVuY3Rpb24gZShyLG4pe2lmKCFsdC5pc1VuZGVmaW5lZChyKSl7aWYoLTEhPT1kLmluZGV4T2YocikpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK24uam9pbigiLiIpKTtkLnB1c2gociksbHQuZm9yRWFjaChyLChmdW5jdGlvbihyLGkpeyEwPT09KCEobHQuaXNVbmRlZmluZWQocil8fG51bGw9PT1yKSYmby5jYWxsKHQscixsdC5pc1N0cmluZyhpKT9pLnRyaW0oKTppLG4saCkpJiZlKHIsbj9uLmNvbmNhdChpKTpbaV0pfSkpLGQucG9wKCl9fShlKSx0fSxtdD15dDtmdW5jdGlvbiB3dChlKXt2YXIgdD17IiEiOiIlMjEiLCInIjoiJTI3IiwiKCI6IiUyOCIsIikiOiIlMjkiLCJ+IjoiJTdFIiwiJTIwIjoiKyIsIiUwMCI6IlwwIn07cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC9bISdcKFwpfl18JTIwfCUwMC9nLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX1mdW5jdGlvbiBfdChlLHQpe3RoaXMuX3BhaXJzPVtdLGUmJm10KGUsdGhpcyx0KX12YXIgU3Q9X3QucHJvdG90eXBlO1N0LmFwcGVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX3BhaXJzLnB1c2goW2UsdF0pfSxTdC50b1N0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1lP2Z1bmN0aW9uKHQpe3JldHVybiBlLmNhbGwodGhpcyx0LHd0KX06d3Q7cmV0dXJuIHRoaXMuX3BhaXJzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQoZVswXSkrIj0iK3QoZVsxXSl9KSwiIikuam9pbigiJiIpfTt2YXIgYnQ9X3QsRXQ9cmUsa3Q9YnQ7ZnVuY3Rpb24gUnQoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIFR0PWZ1bmN0aW9uKGUsdCxyKXtpZighdClyZXR1cm4gZTt2YXIgbj1lLmluZGV4T2YoIiMiKTstMSE9PW4mJihlPWUuc2xpY2UoMCxuKSk7dmFyIGksbz1yJiZyLmVuY29kZXx8UnQscz1yJiZyLnNlcmlhbGl6ZTtyZXR1cm4oaT1zP3ModCxyKTpFdC5pc1VSTFNlYXJjaFBhcmFtcyh0KT90LnRvU3RyaW5nKCk6bmV3IGt0KHQscikudG9TdHJpbmcobykpJiYoZSs9KC0xPT09ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikraSksZX0sQXQ9cmU7ZnVuY3Rpb24gQ3QoKXt0aGlzLmhhbmRsZXJzPVtdfUN0LnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDplLHJlamVjdGVkOnQsc3luY2hyb25vdXM6ISFyJiZyLnN5bmNocm9ub3VzLHJ1bldoZW46cj9yLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9LEN0LnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0sQ3QucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVycyYmKHRoaXMuaGFuZGxlcnM9W10pfSxDdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtBdC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsKGZ1bmN0aW9uKHQpe251bGwhPT10JiZlKHQpfSkpfTt2YXIgRHQ9Q3Q7ZnVuY3Rpb24gUHQoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBPdCgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIEl0PVB0LFV0PU90O2Z1bmN0aW9uIEx0KGUpe2lmKEl0PT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChJdD09PVB0fHwhSXQpJiZzZXRUaW1lb3V0KXJldHVybiBJdD1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIEl0KGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiBJdC5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gSXQuY2FsbCh0aGlzLGUsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgbmUuc2V0VGltZW91dCYmKEl0PXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBuZS5jbGVhclRpbWVvdXQmJihVdD1jbGVhclRpbWVvdXQpO3ZhciBIdCxNdD1bXSxqdD0hMSxOdD0tMTtmdW5jdGlvbiB4dCgpe2p0JiZIdCYmKGp0PSExLEh0Lmxlbmd0aD9NdD1IdC5jb25jYXQoTXQpOk50PS0xLE10Lmxlbmd0aCYmcXQoKSl9ZnVuY3Rpb24gcXQoKXtpZighanQpe3ZhciBlPUx0KHh0KTtqdD0hMDtmb3IodmFyIHQ9TXQubGVuZ3RoO3Q7KXtmb3IoSHQ9TXQsTXQ9W107KytOdDx0OylIdCYmSHRbTnRdLnJ1bigpO050PS0xLHQ9TXQubGVuZ3RofUh0PW51bGwsanQ9ITEsZnVuY3Rpb24oZSl7aWYoVXQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoVXQ9PT1PdHx8IVV0KSYmY2xlYXJUaW1lb3V0KXJldHVybiBVdD1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtVdChlKX1jYXRjaCh0KXt0cnl7cmV0dXJuIFV0LmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gVXQuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBCdChlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fUJ0LnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBGdCgpe312YXIgS3Q9RnQsSnQ9RnQsV3Q9RnQsJHQ9RnQsenQ9RnQsVnQ9RnQsWXQ9RnQ7dmFyIEd0PW5lLnBlcmZvcm1hbmNlfHx7fSxYdD1HdC5ub3d8fEd0Lm1vek5vd3x8R3QubXNOb3d8fEd0Lm9Ob3d8fEd0LndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIFp0PW5ldyBEYXRlO3ZhciBRdD17bmV4dFRpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspdFtyLTFdPWFyZ3VtZW50c1tyXTtNdC5wdXNoKG5ldyBCdChlLHQpKSwxIT09TXQubGVuZ3RofHxqdHx8THQocXQpfSx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOkt0LGFkZExpc3RlbmVyOkp0LG9uY2U6V3Qsb2ZmOiR0LHJlbW92ZUxpc3RlbmVyOnp0LHJlbW92ZUFsbExpc3RlbmVyczpWdCxlbWl0Oll0LGJpbmRpbmc6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxjd2Q6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGNoZGlyOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHVtYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhydGltZTpmdW5jdGlvbihlKXt2YXIgdD0uMDAxKlh0LmNhbGwoR3QpLHI9TWF0aC5mbG9vcih0KSxuPU1hdGguZmxvb3IodCUxKjFlOSk7cmV0dXJuIGUmJihyLT1lWzBdLChuLT1lWzFdKTwwJiYoci0tLG4rPTFlOSkpLFtyLG5dfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLVp0KS8xZTN9fSxlcj1RdCx0cj1yZSxycj1mdW5jdGlvbihlLHQpe3RyLmZvckVhY2goZSwoZnVuY3Rpb24ocixuKXtuIT09dCYmbi50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1yLGRlbGV0ZSBlW25dKX0pKX0sbnI9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9LGlyPXtpc0Jyb3dzZXI6ITAsY2xhc3Nlczp7VVJMU2VhcmNoUGFyYW1zOiJ1bmRlZmluZWQiIT10eXBlb2YgVVJMU2VhcmNoUGFyYW1zP1VSTFNlYXJjaFBhcmFtczpidCxGb3JtRGF0YTpGb3JtRGF0YSxCbG9iOkJsb2J9LHByb3RvY29sczpbImh0dHAiLCJodHRwcyIsImZpbGUiLCJibG9iIiwidXJsIiwiZGF0YSJdfSxvcj1yZSxzcj15dCxhcj1pcixjcj1yZTt2YXIgdXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHIsbixpKXt2YXIgbz1lW2krK107aWYoIl9fcHJvdG9fXyI9PT1vKXJldHVybiEwO3ZhciBzPU51bWJlci5pc0Zpbml0ZSgrbyksYT1pPj1lLmxlbmd0aDtyZXR1cm4gbz0hbyYmY3IuaXNBcnJheShuKT9uLmxlbmd0aDpvLGE/KGNyLmhhc093blByb3BlcnR5KG4sbyk/bltvXT1bbltvXSxyXTpuW29dPXIsIXMpOihuW29dJiZjci5pc09iamVjdChuW29dKXx8KG5bb109W10pLHQoZSxyLG5bb10saSkmJmNyLmlzQXJyYXkobltvXSkmJihuW29dPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbj17fSxpPU9iamVjdC5rZXlzKGUpLG89aS5sZW5ndGg7Zm9yKHQ9MDt0PG87dCsrKW5bcj1pW3RdXT1lW3JdO3JldHVybiBufShuW29dKSksIXMpfWlmKGNyLmlzRm9ybURhdGEoZSkmJmNyLmlzRnVuY3Rpb24oZS5lbnRyaWVzKSl7dmFyIHI9e307cmV0dXJuIGNyLmZvckVhY2hFbnRyeShlLChmdW5jdGlvbihlLG4pe3QoZnVuY3Rpb24oZSl7cmV0dXJuIGNyLm1hdGNoQWxsKC9cdyt8XFsoXHcqKV0vZyxlKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiJbXSI9PT1lWzBdPyIiOmVbMV18fGVbMF19KSl9KGUpLG4sciwwKX0pKSxyfXJldHVybiBudWxsfSxscj1jdCxkcj1yZSxocj1kci5pc1N0YW5kYXJkQnJvd3NlckVudigpP3t3cml0ZTpmdW5jdGlvbihlLHQscixuLGksbyl7dmFyIHM9W107cy5wdXNoKGUrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KSksZHIuaXNOdW1iZXIocikmJnMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHIpLnRvR01UU3RyaW5nKCkpLGRyLmlzU3RyaW5nKG4pJiZzLnB1c2goInBhdGg9IituKSxkci5pc1N0cmluZyhpKSYmcy5wdXNoKCJkb21haW49IitpKSwhMD09PW8mJnMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPXMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrZSsiKT0oW147XSopIikpO3JldHVybiB0P2RlY29kZVVSSUNvbXBvbmVudCh0WzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dGhpcy53cml0ZShlLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319LGZyPWZ1bmN0aW9uKGUpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoZSl9LHByPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/ZS5yZXBsYWNlKC9cLz9cLyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sZ3I9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPSFmcih0KTtyZXR1cm4gZSYmKG58fCExPT09cik/cHIoZSx0KTp0fSx2cj1yZSx5cj1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLG1yPXJlLHdyPW1yLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXt2YXIgZSx0PS8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gbihlKXt2YXIgbj1lO3JldHVybiB0JiYoci5zZXRBdHRyaWJ1dGUoImhyZWYiLG4pLG49ci5ocmVmKSxyLnNldEF0dHJpYnV0ZSgiaHJlZiIsbikse2hyZWY6ci5ocmVmLHByb3RvY29sOnIucHJvdG9jb2w/ci5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6ci5ob3N0LHNlYXJjaDpyLnNlYXJjaD9yLnNlYXJjaC5yZXBsYWNlKC9eXD8vLCIiKToiIixoYXNoOnIuaGFzaD9yLmhhc2gucmVwbGFjZSgvXiMvLCIiKToiIixob3N0bmFtZTpyLmhvc3RuYW1lLHBvcnQ6ci5wb3J0LHBhdGhuYW1lOiIvIj09PXIucGF0aG5hbWUuY2hhckF0KDApP3IucGF0aG5hbWU6Ii8iK3IucGF0aG5hbWV9fXJldHVybiBlPW4od2luZG93LmxvY2F0aW9uLmhyZWYpLGZ1bmN0aW9uKHQpe3ZhciByPW1yLmlzU3RyaW5nKHQpP24odCk6dDtyZXR1cm4gci5wcm90b2NvbD09PWUucHJvdG9jb2wmJnIuaG9zdD09PWUuaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sX3I9Y3Q7ZnVuY3Rpb24gU3IoZSx0LHIpe19yLmNhbGwodGhpcyxudWxsPT1lPyJjYW5jZWxlZCI6ZSxfci5FUlJfQ0FOQ0VMRUQsdCxyKSx0aGlzLm5hbWU9IkNhbmNlbGVkRXJyb3IifXJlLmluaGVyaXRzKFNyLF9yLHtfX0NBTkNFTF9fOiEwfSk7dmFyIGJyPVNyLEVyPXJlLGtyPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztyLnN0YXR1cyYmbiYmIW4oci5zdGF0dXMpP3QobmV3IGxyKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrci5zdGF0dXMsW2xyLkVSUl9CQURfUkVRVUVTVCxsci5FUlJfQkFEX1JFU1BPTlNFXVtNYXRoLmZsb29yKHIuc3RhdHVzLzEwMCktNF0sci5jb25maWcsci5yZXF1ZXN0LHIpKTplKHIpfSxScj1ocixUcj1UdCxBcj1ncixDcj1mdW5jdGlvbihlKXt2YXIgdCxyLG4saT17fTtyZXR1cm4gZT8odnIuZm9yRWFjaChlLnNwbGl0KCJcbiIpLChmdW5jdGlvbihlKXtpZihuPWUuaW5kZXhPZigiOiIpLHQ9dnIudHJpbShlLnNsaWNlKDAsbikpLnRvTG93ZXJDYXNlKCkscj12ci50cmltKGUuc2xpY2UobisxKSksdCl7aWYoaVt0XSYmeXIuaW5kZXhPZih0KT49MClyZXR1cm47aVt0XT0ic2V0LWNvb2tpZSI9PT10PyhpW3RdP2lbdF06W10pLmNvbmNhdChbcl0pOmlbdF0/aVt0XSsiLCAiK3I6cn19KSksaSk6aX0sRHI9d3IsUHI9bnIsT3I9Y3QsSXI9YnIsVXI9ZnVuY3Rpb24oZSl7dmFyIHQ9L14oWy0rXHddezEsMjV9KSg6P1wvXC98OikvLmV4ZWMoZSk7cmV0dXJuIHQmJnRbMV18fCIifSxMcj1pcixIcj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQscil7dmFyIG4saT1lLmRhdGEsbz1lLmhlYWRlcnMscz1lLnJlc3BvbnNlVHlwZSxhPWUud2l0aFhTUkZUb2tlbjtmdW5jdGlvbiBjKCl7ZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShuKSxlLnNpZ25hbCYmZS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLG4pfUVyLmlzRm9ybURhdGEoaSkmJkVyLmlzU3RhbmRhcmRCcm93c2VyRW52KCkmJmRlbGV0ZSBvWyJDb250ZW50LVR5cGUiXTt2YXIgdT1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgbD1lLmF1dGgudXNlcm5hbWV8fCIiLGQ9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtvLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShsKyI6IitkKX12YXIgaD1BcihlLmJhc2VVUkwsZS51cmwsZS5hbGxvd0Fic29sdXRlVXJscyk7ZnVuY3Rpb24gZigpe2lmKHUpe3ZhciBuPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gdT9Dcih1LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLGk9e2RhdGE6cyYmInRleHQiIT09cyYmImpzb24iIT09cz91LnJlc3BvbnNlOnUucmVzcG9uc2VUZXh0LHN0YXR1czp1LnN0YXR1cyxzdGF0dXNUZXh0OnUuc3RhdHVzVGV4dCxoZWFkZXJzOm4sY29uZmlnOmUscmVxdWVzdDp1fTtrcigoZnVuY3Rpb24oZSl7dChlKSxjKCl9KSwoZnVuY3Rpb24oZSl7cihlKSxjKCl9KSxpKSx1PW51bGx9fWlmKHUub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLFRyKGgsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksdS50aW1lb3V0PWUudGltZW91dCwib25sb2FkZW5kImluIHU/dS5vbmxvYWRlbmQ9Zjp1Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3UmJjQ9PT11LnJlYWR5U3RhdGUmJigwIT09dS5zdGF0dXN8fHUucmVzcG9uc2VVUkwmJjA9PT11LnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6IikpJiZzZXRUaW1lb3V0KGYpfSx1Lm9uYWJvcnQ9ZnVuY3Rpb24oKXt1JiYocihuZXcgT3IoIlJlcXVlc3QgYWJvcnRlZCIsT3IuRUNPTk5BQk9SVEVELGUsdSkpLHU9bnVsbCl9LHUub25lcnJvcj1mdW5jdGlvbigpe3IobmV3IE9yKCJOZXR3b3JrIEVycm9yIixPci5FUlJfTkVUV09SSyxlLHUpKSx1PW51bGx9LHUub250aW1lb3V0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS50aW1lb3V0PyJ0aW1lb3V0IG9mICIrZS50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLG49ZS50cmFuc2l0aW9uYWx8fFByO2UudGltZW91dEVycm9yTWVzc2FnZSYmKHQ9ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxyKG5ldyBPcih0LG4uY2xhcmlmeVRpbWVvdXRFcnJvcj9Pci5FVElNRURPVVQ6T3IuRUNPTk5BQk9SVEVELGUsdSkpLHU9bnVsbH0sRXIuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSYmKGEmJkVyLmlzRnVuY3Rpb24oYSkmJihhPWEoZSkpLGF8fCExIT09YSYmRHIoaCkpKXt2YXIgcD1lLnhzcmZIZWFkZXJOYW1lJiZlLnhzcmZDb29raWVOYW1lJiZSci5yZWFkKGUueHNyZkNvb2tpZU5hbWUpO3AmJihvW2UueHNyZkhlYWRlck5hbWVdPXApfSJzZXRSZXF1ZXN0SGVhZGVyImluIHUmJkVyLmZvckVhY2gobywoZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1pJiYiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKT9kZWxldGUgb1t0XTp1LnNldFJlcXVlc3RIZWFkZXIodCxlKX0pKSxFci5pc1VuZGVmaW5lZChlLndpdGhDcmVkZW50aWFscyl8fCh1LndpdGhDcmVkZW50aWFscz0hIWUud2l0aENyZWRlbnRpYWxzKSxzJiYianNvbiIhPT1zJiYodS5yZXNwb25zZVR5cGU9ZS5yZXNwb25zZVR5cGUpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyYmdS5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3MmJnUudXBsb2FkJiZ1LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSwoZS5jYW5jZWxUb2tlbnx8ZS5zaWduYWwpJiYobj1mdW5jdGlvbih0KXt1JiYocighdHx8dC50eXBlP25ldyBJcihudWxsLGUsdSk6dCksdS5hYm9ydCgpLHU9bnVsbCl9LGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG4pLGUuc2lnbmFsJiYoZS5zaWduYWwuYWJvcnRlZD9uKCk6ZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLG4pKSksaXx8ITE9PT1pfHwwPT09aXx8IiI9PT1pfHwoaT1udWxsKTt2YXIgZz1VcihoKTtnJiYtMT09PUxyLnByb3RvY29scy5pbmRleE9mKGcpP3IobmV3IE9yKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK2crIjoiLE9yLkVSUl9CQURfUkVRVUVTVCxlKSk6dS5zZW5kKGkpfSkpfSxNcj1yZSxqcj1ycixOcj1jdCx4cj15dCxxcj1mdW5jdGlvbihlLHQpe3JldHVybiBzcihlLG5ldyBhci5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcyxPYmplY3QuYXNzaWduKHt2aXNpdG9yOmZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBhci5pc05vZGUmJm9yLmlzQnVmZmVyKGUpPyh0aGlzLmFwcGVuZCh0LGUudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6bi5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx0KSl9LEJyPWlyLEZyPXVyLEtyPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gSnIoZSx0KXshTXIuaXNVbmRlZmluZWQoZSkmJk1yLmlzVW5kZWZpbmVkKGVbIkNvbnRlbnQtVHlwZSJdKSYmKGVbIkNvbnRlbnQtVHlwZSJdPXQpfXZhciBXciwkcj17dHJhbnNpdGlvbmFsOm5yLGFkYXB0ZXI6KCgidW5kZWZpbmVkIiE9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0fHx2b2lkIDAhPT1lciYmIltvYmplY3QgcHJvY2Vzc10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVyKSkmJihXcj1IciksV3IpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7anIodCwiQWNjZXB0IiksanIodCwiQ29udGVudC1UeXBlIik7dmFyIHIsbj10JiZ0WyJDb250ZW50LVR5cGUiXXx8IiIsaT1uLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKT4tMSxvPU1yLmlzT2JqZWN0KGUpO2lmKG8mJk1yLmlzSFRNTEZvcm0oZSkmJihlPW5ldyBGb3JtRGF0YShlKSksTXIuaXNGb3JtRGF0YShlKSlyZXR1cm4gaT9KU09OLnN0cmluZ2lmeShGcihlKSk6ZTtpZihNci5pc0FycmF5QnVmZmVyKGUpfHxNci5pc0J1ZmZlcihlKXx8TXIuaXNTdHJlYW0oZSl8fE1yLmlzRmlsZShlKXx8TXIuaXNCbG9iKGUpKXJldHVybiBlO2lmKE1yLmlzQXJyYXlCdWZmZXJWaWV3KGUpKXJldHVybiBlLmJ1ZmZlcjtpZihNci5pc1VSTFNlYXJjaFBhcmFtcyhlKSlyZXR1cm4gSnIodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCk7aWYobyl7aWYoLTEhPT1uLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpKXJldHVybiBxcihlLHRoaXMuZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7aWYoKHI9TXIuaXNGaWxlTGlzdChlKSl8fG4uaW5kZXhPZigibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpPi0xKXt2YXIgcz10aGlzLmVudiYmdGhpcy5lbnYuRm9ybURhdGE7cmV0dXJuIHhyKHI/eyJmaWxlc1tdIjplfTplLHMmJm5ldyBzLHRoaXMuZm9ybVNlcmlhbGl6ZXIpfX1yZXR1cm4gb3x8aT8oSnIodCwiYXBwbGljYXRpb24vanNvbiIpLGZ1bmN0aW9uKGUsdCxyKXtpZihNci5pc1N0cmluZyhlKSl0cnl7cmV0dXJuKHR8fEpTT04ucGFyc2UpKGUpLE1yLnRyaW0oZSl9Y2F0Y2goZSl7aWYoIlN5bnRheEVycm9yIiE9PWUubmFtZSl0aHJvdyBlfXJldHVybihyfHxKU09OLnN0cmluZ2lmeSkoZSl9KGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJhbnNpdGlvbmFsfHwkci50cmFuc2l0aW9uYWwscj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG49Impzb24iPT09dGhpcy5yZXNwb25zZVR5cGU7aWYoZSYmTXIuaXNTdHJpbmcoZSkmJihyJiYhdGhpcy5yZXNwb25zZVR5cGV8fG4pKXt2YXIgaT0hKHQmJnQuc2lsZW50SlNPTlBhcnNpbmcpJiZuO3RyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChlKXtpZihpKXtpZigiU3ludGF4RXJyb3IiPT09ZS5uYW1lKXRocm93IE5yLmZyb20oZSxOci5FUlJfQkFEX1JFU1BPTlNFLHRoaXMsbnVsbCx0aGlzLnJlc3BvbnNlKTt0aHJvdyBlfX19cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSxlbnY6e0Zvcm1EYXRhOkJyLmNsYXNzZXMuRm9ybURhdGEsQmxvYjpCci5jbGFzc2VzLkJsb2J9LHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19fTtNci5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCJdLChmdW5jdGlvbihlKXskci5oZWFkZXJzW2VdPXt9fSkpLE1yLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7JHIuaGVhZGVyc1tlXT1Nci5tZXJnZShLcil9KSk7dmFyIHpyPSRyLFZyPXJlLFlyPXpyLEdyPWZ1bmN0aW9uKGUpe3JldHVybiEoIWV8fCFlLl9fQ0FOQ0VMX18pfSxYcj1yZSxacj1mdW5jdGlvbihlLHQscixuKXt2YXIgaT10aGlzfHxZcjtyZXR1cm4gVnIuZm9yRWFjaChuLChmdW5jdGlvbihuKXtlPW4uY2FsbChpLGUsdCxyKX0pKSxlfSxRcj1Hcixlbj16cix0bj1icixybj1ycjtmdW5jdGlvbiBubihlKXtpZihlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxlLnNpZ25hbCYmZS5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgdG59dmFyIG9uPXJlLHNuPWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgcj17fTtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIG9uLmlzUGxhaW5PYmplY3QoZSkmJm9uLmlzUGxhaW5PYmplY3QodCk/b24ubWVyZ2UoZSx0KTpvbi5pc0VtcHR5T2JqZWN0KHQpP29uLm1lcmdlKHt9LGUpOm9uLmlzUGxhaW5PYmplY3QodCk/b24ubWVyZ2Uoe30sdCk6b24uaXNBcnJheSh0KT90LnNsaWNlKCk6dH1mdW5jdGlvbiBpKHIpe3JldHVybiBvbi5pc1VuZGVmaW5lZCh0W3JdKT9vbi5pc1VuZGVmaW5lZChlW3JdKT92b2lkIDA6bih2b2lkIDAsZVtyXSk6bihlW3JdLHRbcl0pfWZ1bmN0aW9uIG8oZSl7aWYoIW9uLmlzVW5kZWZpbmVkKHRbZV0pKXJldHVybiBuKHZvaWQgMCx0W2VdKX1mdW5jdGlvbiBzKHIpe3JldHVybiBvbi5pc1VuZGVmaW5lZCh0W3JdKT9vbi5pc1VuZGVmaW5lZChlW3JdKT92b2lkIDA6bih2b2lkIDAsZVtyXSk6bih2b2lkIDAsdFtyXSl9ZnVuY3Rpb24gYShyKXtyZXR1cm4gciBpbiB0P24oZVtyXSx0W3JdKTpyIGluIGU/bih2b2lkIDAsZVtyXSk6dm9pZCAwfXZhciBjPXt1cmw6byxtZXRob2Q6byxkYXRhOm8sYmFzZVVSTDpzLHRyYW5zZm9ybVJlcXVlc3Q6cyx0cmFuc2Zvcm1SZXNwb25zZTpzLHBhcmFtc1NlcmlhbGl6ZXI6cyx0aW1lb3V0OnMsdGltZW91dE1lc3NhZ2U6cyx3aXRoQ3JlZGVudGlhbHM6cyx3aXRoWFNSRlRva2VuOnMsYWRhcHRlcjpzLHJlc3BvbnNlVHlwZTpzLHhzcmZDb29raWVOYW1lOnMseHNyZkhlYWRlck5hbWU6cyxvblVwbG9hZFByb2dyZXNzOnMsb25Eb3dubG9hZFByb2dyZXNzOnMsZGVjb21wcmVzczpzLG1heENvbnRlbnRMZW5ndGg6cyxtYXhCb2R5TGVuZ3RoOnMsYmVmb3JlUmVkaXJlY3Q6cyx0cmFuc3BvcnQ6cyxodHRwQWdlbnQ6cyxodHRwc0FnZW50OnMsY2FuY2VsVG9rZW46cyxzb2NrZXRQYXRoOnMscmVzcG9uc2VFbmNvZGluZzpzLHZhbGlkYXRlU3RhdHVzOmF9O3JldHVybiBvbi5mb3JFYWNoKE9iamVjdC5rZXlzKGUpLmNvbmNhdChPYmplY3Qua2V5cyh0KSksKGZ1bmN0aW9uKGUpe3ZhciB0PWNbZV18fGksbj10KGUpO29uLmlzVW5kZWZpbmVkKG4pJiZ0IT09YXx8KHJbZV09bil9KSkscn0sYW49IjAuMzAuMCIsY249YW4sdW49Y3QsbG49e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe2xuW2VdPWZ1bmN0aW9uKHIpe3JldHVybiB0eXBlb2Ygcj09PWV8fCJhIisodDwxPyJuICI6IiAiKStlfX0pKTt2YXIgZG49e307bG4udHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxyKXtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIltBeGlvcyB2IitjbisiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK2UrIiciK3QrKHI/Ii4gIityOiIiKX1yZXR1cm4gZnVuY3Rpb24ocixpLG8pe2lmKCExPT09ZSl0aHJvdyBuZXcgdW4obihpLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSx1bi5FUlJfREVQUkVDQVRFRCk7cmV0dXJuIHQmJiFkbltpXSYmKGRuW2ldPSEwLGNvbnNvbGUud2FybihuKGksIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksIWV8fGUocixpLG8pfX07dmFyIGhuPXthc3NlcnRPcHRpb25zOmZ1bmN0aW9uKGUsdCxyKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IHVuKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iix1bi5FUlJfQkFEX09QVElPTl9WQUxVRSk7Zm9yKHZhciBuPU9iamVjdC5rZXlzKGUpLGk9bi5sZW5ndGg7aS0tID4wOyl7dmFyIG89bltpXSxzPXRbb107aWYocyl7dmFyIGE9ZVtvXSxjPXZvaWQgMD09PWF8fHMoYSxvLGUpO2lmKCEwIT09Yyl0aHJvdyBuZXcgdW4oIm9wdGlvbiAiK28rIiBtdXN0IGJlICIrYyx1bi5FUlJfQkFEX09QVElPTl9WQUxVRSl9ZWxzZSBpZighMCE9PXIpdGhyb3cgbmV3IHVuKCJVbmtub3duIG9wdGlvbiAiK28sdW4uRVJSX0JBRF9PUFRJT04pfX0sdmFsaWRhdG9yczpsbn0sZm49cmUscG49VHQsZ249RHQsdm49ZnVuY3Rpb24oZSl7cmV0dXJuIG5uKGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT1aci5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxudWxsLGUudHJhbnNmb3JtUmVxdWVzdCkscm4oZS5oZWFkZXJzLCJBY2NlcHQiKSxybihlLmhlYWRlcnMsIkNvbnRlbnQtVHlwZSIpLGUuaGVhZGVycz1Yci5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLFhyLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sKGZ1bmN0aW9uKHQpe2RlbGV0ZSBlLmhlYWRlcnNbdF19KSksKGUuYWRhcHRlcnx8ZW4uYWRhcHRlcikoZSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIG5uKGUpLHQuZGF0YT1aci5jYWxsKGUsdC5kYXRhLHQuaGVhZGVycyx0LnN0YXR1cyxlLnRyYW5zZm9ybVJlc3BvbnNlKSx0fSksKGZ1bmN0aW9uKHQpe3JldHVybiBRcih0KXx8KG5uKGUpLHQmJnQucmVzcG9uc2UmJih0LnJlc3BvbnNlLmRhdGE9WnIuY2FsbChlLHQucmVzcG9uc2UuZGF0YSx0LnJlc3BvbnNlLmhlYWRlcnMsdC5yZXNwb25zZS5zdGF0dXMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdCh0KX0pKX0seW49c24sbW49Z3Isd249aG4sX249d24udmFsaWRhdG9ycztmdW5jdGlvbiBTbihlKXt0aGlzLmRlZmF1bHRzPWUsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IGduLHJlc3BvbnNlOm5ldyBnbn19U24ucHJvdG90eXBlLnJlcXVlc3Q9ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGU/KHQ9dHx8e30pLnVybD1lOnQ9ZXx8e30sKHQ9eW4odGhpcy5kZWZhdWx0cyx0KSkubWV0aG9kP3QubWV0aG9kPXQubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/dC5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTp0Lm1ldGhvZD0iZ2V0Ijt2YXIgcj10LnRyYW5zaXRpb25hbDt2b2lkIDAhPT1yJiZ3bi5hc3NlcnRPcHRpb25zKHIse3NpbGVudEpTT05QYXJzaW5nOl9uLnRyYW5zaXRpb25hbChfbi5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpfbi50cmFuc2l0aW9uYWwoX24uYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjpfbi50cmFuc2l0aW9uYWwoX24uYm9vbGVhbil9LCExKTt2YXIgbj10LnBhcmFtc1NlcmlhbGl6ZXI7bnVsbCE9biYmKGZuLmlzRnVuY3Rpb24obik/dC5wYXJhbXNTZXJpYWxpemVyPXtzZXJpYWxpemU6bn06d24uYXNzZXJ0T3B0aW9ucyhuLHtlbmNvZGU6X24uZnVuY3Rpb24sc2VyaWFsaXplOl9uLmZ1bmN0aW9ufSwhMCkpO3ZhciBpPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZS5ydW5XaGVuJiYhMT09PWUucnVuV2hlbih0KXx8KG89byYmZS5zeW5jaHJvbm91cyxpLnVuc2hpZnQoZS5mdWxmaWxsZWQsZS5yZWplY3RlZCkpfSkpO3ZhciBzLGE9W107aWYodGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7YS5wdXNoKGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpfSkpLCFvKXt2YXIgYz1bdm4sdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYyxpKSxjPWMuY29uY2F0KGEpLHM9UHJvbWlzZS5yZXNvbHZlKHQpO2MubGVuZ3RoOylzPXMudGhlbihjLnNoaWZ0KCksYy5zaGlmdCgpKTtyZXR1cm4gc31mb3IodmFyIHU9dDtpLmxlbmd0aDspe3ZhciBsPWkuc2hpZnQoKSxkPWkuc2hpZnQoKTt0cnl7dT1sKHUpfWNhdGNoKGUpe2QoZSk7YnJlYWt9fXRyeXtzPXZuKHUpfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX1mb3IoO2EubGVuZ3RoOylzPXMudGhlbihhLnNoaWZ0KCksYS5zaGlmdCgpKTtyZXR1cm4gc30sU24ucHJvdG90eXBlLmdldFVyaT1mdW5jdGlvbihlKXtlPXluKHRoaXMuZGVmYXVsdHMsZSk7dmFyIHQ9bW4oZS5iYXNlVVJMLGUudXJsLGUuYWxsb3dBYnNvbHV0ZVVybHMpO3JldHVybiBwbih0LGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcil9LGZuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLChmdW5jdGlvbihlKXtTbi5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxyKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHluKHJ8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihyfHx7fSkuZGF0YX0pKX19KSksZm4uZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLChmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3JldHVybiBmdW5jdGlvbihyLG4saSl7cmV0dXJuIHRoaXMucmVxdWVzdCh5bihpfHx7fSx7bWV0aG9kOmUsaGVhZGVyczp0P3siQ29udGVudC1UeXBlIjoibXVsdGlwYXJ0L2Zvcm0tZGF0YSJ9Ont9LHVybDpyLGRhdGE6bn0pKX19U24ucHJvdG90eXBlW2VdPXQoKSxTbi5wcm90b3R5cGVbZSsiRm9ybSJdPXQoITApfSkpO3ZhciBibj1TbixFbj1icjtmdW5jdGlvbiBrbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIHQ7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKChmdW5jdGlvbihlKXt0PWV9KSk7dmFyIHI9dGhpczt0aGlzLnByb21pc2UudGhlbigoZnVuY3Rpb24oZSl7aWYoci5fbGlzdGVuZXJzKXtmb3IodmFyIHQ9ci5fbGlzdGVuZXJzLmxlbmd0aDt0LS0gPjA7KXIuX2xpc3RlbmVyc1t0XShlKTtyLl9saXN0ZW5lcnM9bnVsbH19KSksdGhpcy5wcm9taXNlLnRoZW49ZnVuY3Rpb24oZSl7dmFyIHQsbj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7ci5zdWJzY3JpYmUoZSksdD1lfSkpLnRoZW4oZSk7cmV0dXJuIG4uY2FuY2VsPWZ1bmN0aW9uKCl7ci51bnN1YnNjcmliZSh0KX0sbn0sZSgoZnVuY3Rpb24oZSxuLGkpe3IucmVhc29ufHwoci5yZWFzb249bmV3IEVuKGUsbixpKSx0KHIucmVhc29uKSl9KSl9a24ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sa24ucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXt0aGlzLnJlYXNvbj9lKHRoaXMucmVhc29uKTp0aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzLnB1c2goZSk6dGhpcy5fbGlzdGVuZXJzPVtlXX0sa24ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7LTEhPT10JiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSxrbi5zb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZSx0PW5ldyBrbigoZnVuY3Rpb24odCl7ZT10fSkpO3JldHVybnt0b2tlbjp0LGNhbmNlbDplfX07dmFyIFJuPWtuLFRuPXJlLEFuPXJlLENuPVUsRG49Ym4sUG49c24sT249dXI7dmFyIEluPWZ1bmN0aW9uIGUodCl7dmFyIHI9bmV3IERuKHQpLG49Q24oRG4ucHJvdG90eXBlLnJlcXVlc3Qscik7cmV0dXJuIEFuLmV4dGVuZChuLERuLnByb3RvdHlwZSxyKSxBbi5leHRlbmQobixyKSxuLmNyZWF0ZT1mdW5jdGlvbihyKXtyZXR1cm4gZShQbih0LHIpKX0sbn0oenIpO0luLkF4aW9zPURuLEluLkNhbmNlbGVkRXJyb3I9YnIsSW4uQ2FuY2VsVG9rZW49Um4sSW4uaXNDYW5jZWw9R3IsSW4uVkVSU0lPTj1hbixJbi50b0Zvcm1EYXRhPXl0LEluLkF4aW9zRXJyb3I9Y3QsSW4uQ2FuY2VsPUluLkNhbmNlbGVkRXJyb3IsSW4uYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChlKX0sSW4uc3ByZWFkPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseShudWxsLHQpfX0sSW4uaXNBeGlvc0Vycm9yPWZ1bmN0aW9uKGUpe3JldHVybiBUbi5pc09iamVjdChlKSYmITA9PT1lLmlzQXhpb3NFcnJvcn0sSW4uZm9ybVRvSlNPTj1mdW5jdGlvbihlKXtyZXR1cm4gT24oQW4uaXNIVE1MRm9ybShlKT9uZXcgRm9ybURhdGEoZSk6ZSl9LEkuZXhwb3J0cz1JbixJLmV4cG9ydHMuZGVmYXVsdD1Jbjt2YXIgVW4sTG49SS5leHBvcnRzO2xldCBIbj1Vbj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuYXR0YWNoVG9rZW49KCk9PlByb21pc2UucmVzb2x2ZSgpLHRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5pbml0PXRoaXMuaW5pdC5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLmJpbmQodGhpcyl9c3RhdGljIGdldEluc3RhbmNlKCl7cmV0dXJuIHRoaXMuYXhpb3NJbnN0YW5jZXx8KHRoaXMuYXhpb3NJbnN0YW5jZT1Mbi5jcmVhdGUoe3dpdGhDcmVkZW50aWFsczohMH0pLHRoaXMuY2xpZW50SW5zdGFuY2V8fCh0aGlzLmNsaWVudEluc3RhbmNlPW5ldyBVbiksdGhpcy5heGlvc0luc3RhbmNlLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZSgodD0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLmNsaWVudEluc3RhbmNlLnJlcXVlc3RIYW5kbGVyKHQpfSkpKSksdGhpcy5heGlvc0luc3RhbmNlLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoKGU9PnRoaXMuY2xpZW50SW5zdGFuY2Uuc3VjY2Vzc0hhbmRsZXIoZSkpLChlPT50aGlzLmNsaWVudEluc3RhbmNlLmVycm9ySGFuZGxlcihlKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5hbGw9TG4uYWxsLHRoaXMuYXhpb3NJbnN0YW5jZS5zcHJlYWQ9TG4uc3ByZWFkLHRoaXMuYXhpb3NJbnN0YW5jZS5pbml0PXRoaXMuY2xpZW50SW5zdGFuY2UuaW5pdCx0aGlzLmF4aW9zSW5zdGFuY2UuZW5hYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmVuYWJsZUhhbmRsZXIsdGhpcy5heGlvc0luc3RhbmNlLmRpc2FibGVIYW5kbGVyPXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXIsdGhpcy5heGlvc0luc3RhbmNlLmRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQ9dGhpcy5jbGllbnRJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0LHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2spLHRoaXMuYXhpb3NJbnN0YW5jZX1yZXF1ZXN0SGFuZGxlcih0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKHlpZWxkIHRoaXMuYXR0YWNoVG9rZW4odCksbnVsbD09dD92b2lkIDA6dC5zaG91bGRFbmNvZGVUb0Zvcm1EYXRhKXtjb25zdCBlPW51bGw9PXQ/dm9pZCAwOnQuZGF0YSxyPW5ldyBGb3JtRGF0YTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ci5hcHBlbmQodCxlW3RdKX0pKSx0LmRhdGE9cn1yZXR1cm4gdC5zdGFydFRpbWVJbk1zPShuZXcgRGF0ZSkuZ2V0VGltZSgpLFVuLmlzSGFuZGxlckVuYWJsZWQmJnRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrKHQpLHR9KSl9ZXJyb3JIYW5kbGVyKGUpe3Rocm93IFVuLmlzSGFuZGxlckVuYWJsZWQmJih0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayhlKSx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiZ0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaygpKSxlfXN1Y2Nlc3NIYW5kbGVyKGUpe3JldHVybiBVbi5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrJiZ0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1pbml0KHQ9ITAscil7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtVbi5pc0hhbmRsZXJFbmFibGVkPXQsdGhpcy5hdHRhY2hUb2tlbj1yfSkpfWVuYWJsZUhhbmRsZXIoKXtVbi5pc0hhbmRsZXJFbmFibGVkPSEwfWRpc2FibGVIYW5kbGVyKCl7VW4uaXNIYW5kbGVyRW5hYmxlZD0hMX1kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0KGU9VW4uREVGQVVMVF9IQU5ETEVSX0RJU0FCTEVfVElNRU9VVCl7VW4uaXNIYW5kbGVyRW5hYmxlZD0hMSxzZXRUaW1lb3V0KCgoKT0+e1VuLmlzSGFuZGxlckVuYWJsZWQ9ITB9KSxlKX1zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpe3RoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaz1lfX07SG4uREVGQVVMVF9IQU5ETEVSX0RJU0FCTEVfVElNRU9VVD0xZTMsSG49VW49ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoLHM9bzwzP3Q6bnVsbD09PW4/bj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscik6bjtpZigib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKXM9UmVmbGVjdC5kZWNvcmF0ZShlLHQscixuKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShpPWVbYV0pJiYocz0obzwzP2kocyk6bz4zP2kodCxyLHMpOmkodCxyKSl8fHMpO3JldHVybiBvPjMmJnMmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIscyksc30oW2U9Pnt9XSxIbik7Y2xhc3MgTW57Y29uc3RydWN0b3IoKXt0aGlzLl9kYXRhPW5ldyBNYXB9c2V0RGF0YSh0LHIpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5fZGF0YS5zZXQodCxyKX0pKX1nZXREYXRhKHQpe3ZhciByLG47cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbCE9PShuPW51bGw9PT0ocj10aGlzLl9kYXRhKXx8dm9pZCAwPT09cj92b2lkIDA6ci5nZXQodCkpJiZ2b2lkIDAhPT1uP246Int9In0pKX1yZW1vdmVEYXRhKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5fZGF0YS5kZWxldGUodCl9KSl9fXZhciBqbj17ZXhwb3J0czp7fX0sTm49e30seG49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHhuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx4bi5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoLHI9dCU0O2lmKCFyKXJldHVybiBlO3ZhciBuPXQsaT00LXIsbz10K2kscz1tZS5hbGxvYyhvKTtmb3Iocy53cml0ZShlKTtpLS07KXMud3JpdGUoIj0iLG4rKyk7cmV0dXJuIHMudG9TdHJpbmcoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KE5uLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcW49eG47ZnVuY3Rpb24gQm4oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxtZS5pc0J1ZmZlcihlKT9LbihlLnRvU3RyaW5nKCJiYXNlNjQiKSk6S24obWUuZnJvbShlLHQpLnRvU3RyaW5nKCJiYXNlNjQiKSl9ZnVuY3Rpb24gRm4oZSl7cmV0dXJuIGU9ZS50b1N0cmluZygpLHFuLmRlZmF1bHQoZSkucmVwbGFjZSgvXC0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpfWZ1bmN0aW9uIEtuKGUpe3JldHVybiBlLnJlcGxhY2UoLz0vZywiIikucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKX12YXIgSm4sV249Qm47V24uZW5jb2RlPUJuLFduLmRlY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0idXRmOCIpLG1lLmZyb20oRm4oZSksImJhc2U2NCIpLnRvU3RyaW5nKHQpfSxXbi50b0Jhc2U2ND1GbixXbi5mcm9tQmFzZTY0PUtuLFduLnRvQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiBtZS5mcm9tKEZuKGUpLCJiYXNlNjQiKX0sTm4uZGVmYXVsdD1XbiwoSm49am4pLmV4cG9ydHM9Tm4uZGVmYXVsdCxKbi5leHBvcnRzLmRlZmF1bHQ9Sm4uZXhwb3J0czt2YXIgJG49am4uZXhwb3J0cyx6bj17ZXhwb3J0czp7fX07IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0LHIpe3ZhciBuPXt9OyFmdW5jdGlvbihlKXtlLl9fZXNNb2R1bGU9ITAsZS5kaWdlc3RMZW5ndGg9MzIsZS5ibG9ja1NpemU9NjQ7dmFyIHQ9bmV3IFVpbnQzMkFycmF5KFsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdKTtmdW5jdGlvbiByKGUscixuLGksbyl7Zm9yKHZhciBzLGEsYyx1LGwsZCxoLGYscCxnLHYseSxtO28+PTY0Oyl7Zm9yKHM9clswXSxhPXJbMV0sYz1yWzJdLHU9clszXSxsPXJbNF0sZD1yWzVdLGg9cls2XSxmPXJbN10sZz0wO2c8MTY7ZysrKXY9aSs0KmcsZVtnXT0oMjU1Jm5bdl0pPDwyNHwoMjU1Jm5bdisxXSk8PDE2fCgyNTUmblt2KzJdKTw8OHwyNTUmblt2KzNdO2ZvcihnPTE2O2c8NjQ7ZysrKXk9KChwPWVbZy0yXSk+Pj4xN3xwPDwxNSleKHA+Pj4xOXxwPDwxMylecD4+PjEwLG09KChwPWVbZy0xNV0pPj4+N3xwPDwyNSleKHA+Pj4xOHxwPDwxNClecD4+PjMsZVtnXT0oeStlW2ctN118MCkrKG0rZVtnLTE2XXwwKTtmb3IoZz0wO2c8NjQ7ZysrKXk9KCgobD4+PjZ8bDw8MjYpXihsPj4+MTF8bDw8MjEpXihsPj4+MjV8bDw8NykpKyhsJmRefmwmaCl8MCkrKGYrKHRbZ10rZVtnXXwwKXwwKXwwLG09KChzPj4+MnxzPDwzMCleKHM+Pj4xM3xzPDwxOSleKHM+Pj4yMnxzPDwxMCkpKyhzJmFecyZjXmEmYyl8MCxmPWgsaD1kLGQ9bCxsPXUreXwwLHU9YyxjPWEsYT1zLHM9eSttfDA7clswXSs9cyxyWzFdKz1hLHJbMl0rPWMsclszXSs9dSxyWzRdKz1sLHJbNV0rPWQscls2XSs9aCxyWzddKz1mLGkrPTY0LG8tPTY0fXJldHVybiBpfXZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZGlnZXN0TGVuZ3RoPWUuZGlnZXN0TGVuZ3RoLHRoaXMuYmxvY2tTaXplPWUuYmxvY2tTaXplLHRoaXMuc3RhdGU9bmV3IEludDMyQXJyYXkoOCksdGhpcy50ZW1wPW5ldyBJbnQzMkFycmF5KDY0KSx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxMjgpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5yZXNldCgpfXJldHVybiB0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlWzBdPTE3NzkwMzM3MDMsdGhpcy5zdGF0ZVsxXT0zMTQ0MTM0Mjc3LHRoaXMuc3RhdGVbMl09MTAxMzkwNDI0Mix0aGlzLnN0YXRlWzNdPTI3NzM0ODA3NjIsdGhpcy5zdGF0ZVs0XT0xMzU5ODkzMTE5LHRoaXMuc3RhdGVbNV09MjYwMDgyMjkyNCx0aGlzLnN0YXRlWzZdPTUyODczNDYzNSx0aGlzLnN0YXRlWzddPTE1NDE0NTkyMjUsdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMSx0aGlzfSx0LnByb3RvdHlwZS5jbGVhbj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5idWZmZXIubGVuZ3RoO2UrKyl0aGlzLmJ1ZmZlcltlXT0wO2ZvcihlPTA7ZTx0aGlzLnRlbXAubGVuZ3RoO2UrKyl0aGlzLnRlbXBbZV09MDt0aGlzLnJlc2V0KCl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQmJih0PWUubGVuZ3RoKSx0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiU0hBMjU2OiBjYW4ndCB1cGRhdGUgYmVjYXVzZSBoYXNoIHdhcyBmaW5pc2hlZC4iKTt2YXIgbj0wO2lmKHRoaXMuYnl0ZXNIYXNoZWQrPXQsdGhpcy5idWZmZXJMZW5ndGg+MCl7Zm9yKDt0aGlzLmJ1ZmZlckxlbmd0aDw2NCYmdD4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW24rK10sdC0tOzY0PT09dGhpcy5idWZmZXJMZW5ndGgmJihyKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAsNjQpLHRoaXMuYnVmZmVyTGVuZ3RoPTApfWZvcih0Pj02NCYmKG49cih0aGlzLnRlbXAsdGhpcy5zdGF0ZSxlLG4sdCksdCU9NjQpO3Q+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtuKytdLHQtLTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD10aGlzLmJ5dGVzSGFzaGVkLG49dGhpcy5idWZmZXJMZW5ndGgsaT10LzUzNjg3MDkxMnwwLG89dDw8MyxzPXQlNjQ8NTY/NjQ6MTI4O3RoaXMuYnVmZmVyW25dPTEyODtmb3IodmFyIGE9bisxO2E8cy04O2ErKyl0aGlzLmJ1ZmZlclthXT0wO3RoaXMuYnVmZmVyW3MtOF09aT4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltzLTddPWk+Pj4xNiYyNTUsdGhpcy5idWZmZXJbcy02XT1pPj4+OCYyNTUsdGhpcy5idWZmZXJbcy01XT1pPj4+MCYyNTUsdGhpcy5idWZmZXJbcy00XT1vPj4+MjQmMjU1LHRoaXMuYnVmZmVyW3MtM109bz4+PjE2JjI1NSx0aGlzLmJ1ZmZlcltzLTJdPW8+Pj44JjI1NSx0aGlzLmJ1ZmZlcltzLTFdPW8+Pj4wJjI1NSxyKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAscyksdGhpcy5maW5pc2hlZD0hMH1mb3IoYT0wO2E8ODthKyspZVs0KmErMF09dGhpcy5zdGF0ZVthXT4+PjI0JjI1NSxlWzQqYSsxXT10aGlzLnN0YXRlW2FdPj4+MTYmMjU1LGVbNCphKzJdPXRoaXMuc3RhdGVbYV0+Pj44JjI1NSxlWzQqYSszXT10aGlzLnN0YXRlW2FdPj4+MCYyNTU7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuZGlnZXN0TGVuZ3RoKTtyZXR1cm4gdGhpcy5maW5pc2goZSksZX0sdC5wcm90b3R5cGUuX3NhdmVTdGF0ZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PHRoaXMuc3RhdGUubGVuZ3RoO3QrKyllW3RdPXRoaXMuc3RhdGVbdF19LHQucHJvdG90eXBlLl9yZXN0b3JlU3RhdGU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9MDtyPHRoaXMuc3RhdGUubGVuZ3RoO3IrKyl0aGlzLnN0YXRlW3JdPWVbcl07dGhpcy5ieXRlc0hhc2hlZD10LHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5idWZmZXJMZW5ndGg9MH0sdH0oKTtlLkhhc2g9bjt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5pbm5lcj1uZXcgbix0aGlzLm91dGVyPW5ldyBuLHRoaXMuYmxvY2tTaXplPXRoaXMuaW5uZXIuYmxvY2tTaXplLHRoaXMuZGlnZXN0TGVuZ3RoPXRoaXMuaW5uZXIuZGlnZXN0TGVuZ3RoO3ZhciB0PW5ldyBVaW50OEFycmF5KHRoaXMuYmxvY2tTaXplKTtpZihlLmxlbmd0aD50aGlzLmJsb2NrU2l6ZSkobmV3IG4pLnVwZGF0ZShlKS5maW5pc2godCkuY2xlYW4oKTtlbHNlIGZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXRbcl09ZVtyXTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl1ePTU0O3RoaXMuaW5uZXIudXBkYXRlKHQpO2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXV49MTA2O3RoaXMub3V0ZXIudXBkYXRlKHQpLHRoaXMuaXN0YXRlPW5ldyBVaW50MzJBcnJheSg4KSx0aGlzLm9zdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5pbm5lci5fc2F2ZVN0YXRlKHRoaXMuaXN0YXRlKSx0aGlzLm91dGVyLl9zYXZlU3RhdGUodGhpcy5vc3RhdGUpO2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXT0wfXJldHVybiBlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlubmVyLl9yZXN0b3JlU3RhdGUodGhpcy5pc3RhdGUsdGhpcy5pbm5lci5ibG9ja1NpemUpLHRoaXMub3V0ZXIuX3Jlc3RvcmVTdGF0ZSh0aGlzLm9zdGF0ZSx0aGlzLm91dGVyLmJsb2NrU2l6ZSksdGhpc30sZS5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuaXN0YXRlLmxlbmd0aDtlKyspdGhpcy5vc3RhdGVbZV09dGhpcy5pc3RhdGVbZV09MDt0aGlzLmlubmVyLmNsZWFuKCksdGhpcy5vdXRlci5jbGVhbigpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5uZXIudXBkYXRlKGUpLHRoaXN9LGUucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vdXRlci5maW5pc2hlZD90aGlzLm91dGVyLmZpbmlzaChlKToodGhpcy5pbm5lci5maW5pc2goZSksdGhpcy5vdXRlci51cGRhdGUoZSx0aGlzLmRpZ2VzdExlbmd0aCkuZmluaXNoKGUpKSx0aGlzfSxlLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LGV9KCk7ZnVuY3Rpb24gbyhlKXt2YXIgdD0obmV3IG4pLnVwZGF0ZShlKSxyPXQuZGlnZXN0KCk7cmV0dXJuIHQuY2xlYW4oKSxyfWZ1bmN0aW9uIHMoZSx0KXt2YXIgcj1uZXcgaShlKS51cGRhdGUodCksbj1yLmRpZ2VzdCgpO3JldHVybiByLmNsZWFuKCksbn1mdW5jdGlvbiBhKGUsdCxyLG4pe3ZhciBpPW5bMF07aWYoMD09PWkpdGhyb3cgbmV3IEVycm9yKCJoa2RmOiBjYW5ub3QgZXhwYW5kIG1vcmUiKTt0LnJlc2V0KCksaT4xJiZ0LnVwZGF0ZShlKSxyJiZ0LnVwZGF0ZShyKSx0LnVwZGF0ZShuKSx0LmZpbmlzaChlKSxuWzBdKyt9ZS5ITUFDPWksZS5oYXNoPW8sZS5kZWZhdWx0PW8sZS5obWFjPXM7dmFyIGM9bmV3IFVpbnQ4QXJyYXkoZS5kaWdlc3RMZW5ndGgpO2Z1bmN0aW9uIHUoZSx0LHIsbil7dm9pZCAwPT09dCYmKHQ9Yyksdm9pZCAwPT09biYmKG49MzIpO2Zvcih2YXIgbz1uZXcgVWludDhBcnJheShbMV0pLHU9cyh0LGUpLGw9bmV3IGkodSksZD1uZXcgVWludDhBcnJheShsLmRpZ2VzdExlbmd0aCksaD1kLmxlbmd0aCxmPW5ldyBVaW50OEFycmF5KG4pLHA9MDtwPG47cCsrKWg9PT1kLmxlbmd0aCYmKGEoZCxsLHIsbyksaD0wKSxmW3BdPWRbaCsrXTtyZXR1cm4gbC5jbGVhbigpLGQuZmlsbCgwKSxvLmZpbGwoMCksZn1mdW5jdGlvbiBsKGUsdCxyLG4pe2Zvcih2YXIgbz1uZXcgaShlKSxzPW8uZGlnZXN0TGVuZ3RoLGE9bmV3IFVpbnQ4QXJyYXkoNCksYz1uZXcgVWludDhBcnJheShzKSx1PW5ldyBVaW50OEFycmF5KHMpLGw9bmV3IFVpbnQ4QXJyYXkobiksZD0wO2QqczxuO2QrKyl7dmFyIGg9ZCsxO2FbMF09aD4+PjI0JjI1NSxhWzFdPWg+Pj4xNiYyNTUsYVsyXT1oPj4+OCYyNTUsYVszXT1oPj4+MCYyNTUsby5yZXNldCgpLG8udXBkYXRlKHQpLG8udXBkYXRlKGEpLG8uZmluaXNoKHUpO2Zvcih2YXIgZj0wO2Y8cztmKyspY1tmXT11W2ZdO2ZvcihmPTI7Zjw9cjtmKyspe28ucmVzZXQoKSxvLnVwZGF0ZSh1KS5maW5pc2godSk7Zm9yKHZhciBwPTA7cDxzO3ArKyljW3BdXj11W3BdfWZvcihmPTA7ZjxzJiZkKnMrZjxuO2YrKylsW2QqcytmXT1jW2ZdfWZvcihkPTA7ZDxzO2QrKyljW2RdPXVbZF09MDtmb3IoZD0wO2Q8NDtkKyspYVtkXT0wO3JldHVybiBvLmNsZWFuKCksbH1lLmhrZGY9dSxlLnBia2RmMj1sfShuKTt2YXIgaT1uLmRlZmF1bHQ7Zm9yKHZhciBvIGluIG4paVtvXT1uW29dO2UuZXhwb3J0cz1pfSgpfSh6bik7dmFyIFZuPUQoem4uZXhwb3J0cyksWW49Y3J5cHRvO2NvbnN0IEduPWU9PmUgaW5zdGFuY2VvZiBDcnlwdG9LZXksWG49bmV3IFRleHRFbmNvZGVyLFpuPW5ldyBUZXh0RGVjb2Rlcjtjb25zdCBRbj1lPT57bGV0IHQ9ZTt0IGluc3RhbmNlb2YgVWludDhBcnJheSYmKHQ9Wm4uZGVjb2RlKHQpKSx0PXQucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikucmVwbGFjZSgvXHMvZywiIik7dHJ5e3JldHVybihlPT57Y29uc3QgdD1hdG9iKGUpLHI9bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXJbZV09dC5jaGFyQ29kZUF0KGUpO3JldHVybiByfSkodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGlucHV0IHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpfX07Y2xhc3MgZWkgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXt2YXIgdDtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0dFTkVSSUMiLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsbnVsbD09PSh0PUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKXx8dm9pZCAwPT09dHx8dC5jYWxsKEVycm9yLHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX0dFTkVSSUMifX1jbGFzcyB0aSBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKGUsdD0idW5zcGVjaWZpZWQiLHI9InVuc3BlY2lmaWVkIil7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEIix0aGlzLmNsYWltPXQsdGhpcy5yZWFzb249cn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCJ9fWNsYXNzIHJpIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoZSx0PSJ1bnNwZWNpZmllZCIscj0idW5zcGVjaWZpZWQiKXtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KV1RfRVhQSVJFRCIsdGhpcy5jbGFpbT10LHRoaXMucmVhc29uPXJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1RfRVhQSVJFRCJ9fWNsYXNzIG5pIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn19Y2xhc3MgaWkgZXh0ZW5kcyBlaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSk9TRV9OT1RfU1VQUE9SVEVEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9fWNsYXNzIG9pIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXU19JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXU19JTlZBTElEIn19Y2xhc3Mgc2kgZXh0ZW5kcyBlaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldUX0lOVkFMSUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldUX0lOVkFMSUQifX1jbGFzcyBhaSBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV0tTX0lOVkFMSUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19JTlZBTElEIn19Y2xhc3MgY2kgZXh0ZW5kcyBlaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19OT19NQVRDSElOR19LRVkiLHRoaXMubWVzc2FnZT0ibm8gYXBwbGljYWJsZSBrZXkgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19OT19NQVRDSElOR19LRVkifX1jbGFzcyB1aSBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMiLHRoaXMubWVzc2FnZT0ibXVsdGlwbGUgbWF0Y2hpbmcga2V5cyBmb3VuZCBpbiB0aGUgSlNPTiBXZWIgS2V5IFNldCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMifX1jbGFzcyBsaSBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQiLHRoaXMubWVzc2FnZT0ic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEIn19ZnVuY3Rpb24gZGkoKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgV2ViU29ja2V0UGFpcn1mdW5jdGlvbiBoaShlLHQ9ImFsZ29yaXRobS5uYW1lIil7cmV0dXJuIG5ldyBUeXBlRXJyb3IoYENyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBpdHMgJHt0fSBtdXN0IGJlICR7ZX1gKX1mdW5jdGlvbiBmaShlLHQpe3JldHVybiBlLm5hbWU9PT10fWZ1bmN0aW9uIHBpKGUpe3JldHVybiBwYXJzZUludChlLm5hbWUuc2xpY2UoNCksMTApfWZ1bmN0aW9uIGdpKGUsdCwuLi5yKXtzd2l0Y2godCl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6e2lmKCFmaShlLmFsZ29yaXRobSwiSE1BQyIpKXRocm93IGhpKCJITUFDIik7Y29uc3Qgcj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZihwaShlLmFsZ29yaXRobS5oYXNoKSE9PXIpdGhyb3cgaGkoYFNIQS0ke3J9YCwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjp7aWYoIWZpKGUuYWxnb3JpdGhtLCJSU0FTU0EtUEtDUzEtdjFfNSIpKXRocm93IGhpKCJSU0FTU0EtUEtDUzEtdjFfNSIpO2NvbnN0IHI9cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYocGkoZS5hbGdvcml0aG0uaGFzaCkhPT1yKXRocm93IGhpKGBTSEEtJHtyfWAsImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6e2lmKCFmaShlLmFsZ29yaXRobSwiUlNBLVBTUyIpKXRocm93IGhpKCJSU0EtUFNTIik7Y29uc3Qgcj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZihwaShlLmFsZ29yaXRobS5oYXNoKSE9PXIpdGhyb3cgaGkoYFNIQS0ke3J9YCwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIGRpKCkmJiJFZERTQSI6aWYoIWZpKGUuYWxnb3JpdGhtLCJOT0RFLUVEMjU1MTkiKSl0aHJvdyBoaSgiTk9ERS1FRDI1NTE5Iik7YnJlYWs7Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6e2lmKCFmaShlLmFsZ29yaXRobSwiRUNEU0EiKSl0aHJvdyBoaSgiRUNEU0EiKTtjb25zdCByPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIkVTMjU2IjpyZXR1cm4iUC0yNTYiO2Nhc2UiRVMzODQiOnJldHVybiJQLTM4NCI7Y2FzZSJFUzUxMiI6cmV0dXJuIlAtNTIxIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGUiKX19KHQpO2lmKGUuYWxnb3JpdGhtLm5hbWVkQ3VydmUhPT1yKXRocm93IGhpKHIsImFsZ29yaXRobS5uYW1lZEN1cnZlIik7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiIpfSFmdW5jdGlvbihlLHQpe2lmKHQubGVuZ3RoJiYhdC5zb21lKCh0PT5lLnVzYWdlcy5pbmNsdWRlcyh0KSkpKXtsZXQgZT0iQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24sIGl0cyB1c2FnZXMgbXVzdCBpbmNsdWRlICI7aWYodC5sZW5ndGg+Mil7Y29uc3Qgcj10LnBvcCgpO2UrPWBvbmUgb2YgJHt0LmpvaW4oIiwgIil9LCBvciAke3J9LmB9ZWxzZSAyPT09dC5sZW5ndGg/ZSs9YG9uZSBvZiAke3RbMF19IG9yICR7dFsxXX0uYDplKz1gJHt0WzBdfS5gO3Rocm93IG5ldyBUeXBlRXJyb3IoZSl9fShlLHIpfXZhciB2aT0oZSwuLi50KT0+e2xldCByPSJLZXkgbXVzdCBiZSAiO2lmKHQubGVuZ3RoPjIpe2NvbnN0IGU9dC5wb3AoKTtyKz1gb25lIG9mIHR5cGUgJHt0LmpvaW4oIiwgIil9LCBvciAke2V9LmB9ZWxzZSAyPT09dC5sZW5ndGg/cis9YG9uZSBvZiB0eXBlICR7dFswXX0gb3IgJHt0WzFdfS5gOnIrPWBvZiB0eXBlICR7dFswXX0uYDtyZXR1cm4gbnVsbD09ZT9yKz1gIFJlY2VpdmVkICR7ZX1gOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLm5hbWU/cis9YCBSZWNlaXZlZCBmdW5jdGlvbiAke2UubmFtZX1gOiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9ZSYmZS5jb25zdHJ1Y3RvciYmZS5jb25zdHJ1Y3Rvci5uYW1lJiYocis9YCBSZWNlaXZlZCBhbiBpbnN0YW5jZSBvZiAke2UuY29uc3RydWN0b3IubmFtZX1gKSxyfSx5aT1lPT5HbihlKTtjb25zdCBtaT1bIkNyeXB0b0tleSJdO2Z1bmN0aW9uIHdpKGUpe2lmKCJvYmplY3QiIT10eXBlb2YodD1lKXx8bnVsbD09PXR8fCJbb2JqZWN0IE9iamVjdF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXJldHVybiExO3ZhciB0O2lmKG51bGw9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpcmV0dXJuITA7bGV0IHI9ZTtmb3IoO251bGwhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7KXI9T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1yfWNvbnN0IF9pPWFzeW5jIGU9Pnt2YXIgdCxyO2NvbnN0e2FsZ29yaXRobTpuLGtleVVzYWdlczppfT1mdW5jdGlvbihlKXtsZXQgdCxyO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOnN3aXRjaChlLmFsZyl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6dD17bmFtZToiSE1BQyIsaGFzaDpgU0hBLSR7ZS5hbGcuc2xpY2UoLTMpfWB9LHI9WyJzaWduIiwidmVyaWZ5Il07YnJlYWs7Y2FzZSJBMTI4Q0JDLUhTMjU2IjpjYXNlIkExOTJDQkMtSFMzODQiOmNhc2UiQTI1NkNCQy1IUzUxMiI6dGhyb3cgbmV3IGlpKGAke2UuYWxnfSBrZXlzIGNhbm5vdCBiZSBpbXBvcnRlZCBhcyBDcnlwdG9LZXkgaW5zdGFuY2VzYCk7Y2FzZSJBMTI4R0NNIjpjYXNlIkExOTJHQ00iOmNhc2UiQTI1NkdDTSI6Y2FzZSJBMTI4R0NNS1ciOmNhc2UiQTE5MkdDTUtXIjpjYXNlIkEyNTZHQ01LVyI6dD17bmFtZToiQUVTLUdDTSJ9LHI9WyJlbmNyeXB0IiwiZGVjcnlwdCJdO2JyZWFrO2Nhc2UiQTEyOEtXIjpjYXNlIkExOTJLVyI6Y2FzZSJBMjU2S1ciOnQ9e25hbWU6IkFFUy1LVyJ9LHI9WyJ3cmFwS2V5IiwidW53cmFwS2V5Il07YnJlYWs7Y2FzZSJQQkVTMi1IUzI1NitBMTI4S1ciOmNhc2UiUEJFUzItSFMzODQrQTE5MktXIjpjYXNlIlBCRVMyLUhTNTEyK0EyNTZLVyI6dD17bmFtZToiUEJLREYyIn0scj1bImRlcml2ZUJpdHMiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBpaSgnSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJSU0EiOnN3aXRjaChlLmFsZyl7Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6dD17bmFtZToiUlNBLVBTUyIsaGFzaDpgU0hBLSR7ZS5hbGcuc2xpY2UoLTMpfWB9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6dD17bmFtZToiUlNBU1NBLVBLQ1MxLXYxXzUiLGhhc2g6YFNIQS0ke2UuYWxnLnNsaWNlKC0zKX1gfSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlNBLU9BRVAiOmNhc2UiUlNBLU9BRVAtMjU2IjpjYXNlIlJTQS1PQUVQLTM4NCI6Y2FzZSJSU0EtT0FFUC01MTIiOnQ9e25hbWU6IlJTQS1PQUVQIixoYXNoOmBTSEEtJHtwYXJzZUludChlLmFsZy5zbGljZSgtMyksMTApfHwxfWB9LHI9ZS5kP1siZGVjcnlwdCIsInVud3JhcEtleSJdOlsiZW5jcnlwdCIsIndyYXBLZXkiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBpaSgnSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJFQyI6c3dpdGNoKGUuYWxnKXtjYXNlIkVTMjU2Ijp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0yNTYifSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRVMzODQiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTM4NCJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFUzUxMiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtNTIxIn0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVDREgtRVMiOmNhc2UiRUNESC1FUytBMTI4S1ciOmNhc2UiRUNESC1FUytBMTkyS1ciOmNhc2UiRUNESC1FUytBMjU2S1ciOnQ9e25hbWU6IkVDREgiLG5hbWVkQ3VydmU6ZS5jcnZ9LHI9ZS5kP1siZGVyaXZlQml0cyJdOltdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGlpKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIGRpKCkmJiJPS1AiOmlmKCJFZERTQSIhPT1lLmFsZyl0aHJvdyBuZXcgaWkoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpO2lmKCJFZDI1NTE5IiE9PWUuY3J2KXRocm93IG5ldyBpaSgnSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImNydiIgKFN1YnR5cGUgb2YgS2V5IFBhaXIpIFBhcmFtZXRlciB2YWx1ZScpO3Q9e25hbWU6Ik5PREUtRUQyNTUxOSIsbmFtZWRDdXJ2ZToiTk9ERS1FRDI1NTE5In0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBpaSgnSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX1yZXR1cm57YWxnb3JpdGhtOnQsa2V5VXNhZ2VzOnJ9fShlKSxvPVtuLG51bGwhPT0odD1lLmV4dCkmJnZvaWQgMCE9PXQmJnQsbnVsbCE9PShyPWUua2V5X29wcykmJnZvaWQgMCE9PXI/cjppXTtpZigiUEJLREYyIj09PW4ubmFtZSlyZXR1cm4gWW4uc3VidGxlLmltcG9ydEtleSgicmF3IixRbihlLmspLC4uLm8pO2NvbnN0IHM9ey4uLmV9O3JldHVybiBkZWxldGUgcy5hbGcsWW4uc3VidGxlLmltcG9ydEtleSgiandrIixzLC4uLm8pfTtjb25zdCBTaT0oZSx0LHIpPT57ZS5zdGFydHNXaXRoKCJIUyIpfHwiZGlyIj09PWV8fGUuc3RhcnRzV2l0aCgiUEJFUzIiKXx8L15BXGR7M30oPzpHQ00pP0tXJC8udGVzdChlKT8oZT0+e2lmKCEoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXtpZigheWkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcih2aShlLC4uLm1pLCJVaW50OEFycmF5IikpO2lmKCJzZWNyZXQiIT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7bWkuam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIHN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3QgYmUgb2YgdHlwZSAic2VjcmV0ImApfX0pKHQpOigoZSx0KT0+e2lmKCF5aShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKHZpKGUsLi4ubWkpKTtpZigic2VjcmV0Ij09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke21pLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobXMgbXVzdCBub3QgYmUgb2YgdHlwZSAic2VjcmV0ImApO2lmKCJzaWduIj09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7bWkuam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIHNpZ25pbmcgbXVzdCBiZSBvZiB0eXBlICJwcml2YXRlImApO2lmKCJkZWNyeXB0Ij09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7bWkuam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIGRlY3J5cHRpb24gbXVzdCBiZSBvZiB0eXBlICJwcml2YXRlImApO2lmKGUuYWxnb3JpdGhtJiYidmVyaWZ5Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke21pLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSB2ZXJpZnlpbmcgbXVzdCBiZSBvZiB0eXBlICJwdWJsaWMiYCk7aWYoZS5hbGdvcml0aG0mJiJlbmNyeXB0Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke21pLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBlbmNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHVibGljImApfSkodCxyKX07Y29uc3QgYmk9YXN5bmMoZSx0LHIsbik9Pntjb25zdCBpPWF3YWl0IGZ1bmN0aW9uKGUsdCxyKXtpZihHbih0KSlyZXR1cm4gZ2kodCxlLHIpLHQ7aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKCFlLnN0YXJ0c1dpdGgoIkhTIikpdGhyb3cgbmV3IFR5cGVFcnJvcih2aSh0LC4uLm1pKSk7cmV0dXJuIFluLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCx7aGFzaDpgU0hBLSR7ZS5zbGljZSgtMyl9YCxuYW1lOiJITUFDIn0sITEsW3JdKX10aHJvdyBuZXcgVHlwZUVycm9yKHZpKHQsLi4ubWksIlVpbnQ4QXJyYXkiKSl9KGUsdCwidmVyaWZ5Iik7KChlLHQpPT57aWYoZS5zdGFydHNXaXRoKCJSUyIpfHxlLnN0YXJ0c1dpdGgoIlBTIikpe2NvbnN0e21vZHVsdXNMZW5ndGg6cn09dC5hbGdvcml0aG07aWYoIm51bWJlciIhPXR5cGVvZiByfHxyPDIwNDgpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlfSByZXF1aXJlcyBrZXkgbW9kdWx1c0xlbmd0aCB0byBiZSAyMDQ4IGJpdHMgb3IgbGFyZ2VyYCl9fSkoZSxpKTtjb25zdCBvPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgcj1gU0hBLSR7ZS5zbGljZSgtMyl9YDtzd2l0Y2goZSl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJITUFDIn07Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOmUuc2xpY2UoLTMpPj4zfTtjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjpyZXR1cm57aGFzaDpyLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZTp0Lm5hbWVkQ3VydmV9O2Nhc2UgZGkoKSYmIkVkRFNBIjpjb25zdHtuYW1lZEN1cnZlOm59PXQ7cmV0dXJue25hbWU6bixuYW1lZEN1cnZlOm59O2RlZmF1bHQ6dGhyb3cgbmV3IGlpKGBhbGcgJHtlfSBpcyBub3Qgc3VwcG9ydGVkIGVpdGhlciBieSBKT1NFIG9yIHlvdXIgamF2YXNjcmlwdCBydW50aW1lYCl9fShlLGkuYWxnb3JpdGhtKTt0cnl7cmV0dXJuIGF3YWl0IFluLnN1YnRsZS52ZXJpZnkobyxpLHIsbil9Y2F0Y2goZSl7cmV0dXJuITF9fTthc3luYyBmdW5jdGlvbiBFaShlLHQscil7dmFyIG47aWYoIXdpKGUpKXRocm93IG5ldyBvaSgiRmxhdHRlbmVkIEpXUyBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKHZvaWQgMD09PWUucHJvdGVjdGVkJiZ2b2lkIDA9PT1lLmhlYWRlcil0aHJvdyBuZXcgb2koJ0ZsYXR0ZW5lZCBKV1MgbXVzdCBoYXZlIGVpdGhlciBvZiB0aGUgInByb3RlY3RlZCIgb3IgImhlYWRlciIgbWVtYmVycycpO2lmKHZvaWQgMCE9PWUucHJvdGVjdGVkJiYic3RyaW5nIiE9dHlwZW9mIGUucHJvdGVjdGVkKXRocm93IG5ldyBvaSgiSldTIFByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDA9PT1lLnBheWxvYWQpdGhyb3cgbmV3IG9pKCJKV1MgUGF5bG9hZCBtaXNzaW5nIik7aWYoInN0cmluZyIhPXR5cGVvZiBlLnNpZ25hdHVyZSl0aHJvdyBuZXcgb2koIkpXUyBTaWduYXR1cmUgbWlzc2luZyBvciBpbmNvcnJlY3QgdHlwZSIpO2lmKHZvaWQgMCE9PWUuaGVhZGVyJiYhd2koZS5oZWFkZXIpKXRocm93IG5ldyBvaSgiSldTIFVucHJvdGVjdGVkIEhlYWRlciBpbmNvcnJlY3QgdHlwZSIpO2xldCBpPXt9O2lmKGUucHJvdGVjdGVkKXtjb25zdCB0PVFuKGUucHJvdGVjdGVkKTt0cnl7aT1KU09OLnBhcnNlKFpuLmRlY29kZSh0KSl9Y2F0Y2goZSl7dGhyb3cgbmV3IG9pKCJKV1MgUHJvdGVjdGVkIEhlYWRlciBpcyBpbnZhbGlkIil9fWlmKCEoKC4uLmUpPT57Y29uc3QgdD1lLmZpbHRlcihCb29sZWFuKTtpZigwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aClyZXR1cm4hMDtsZXQgcjtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PU9iamVjdC5rZXlzKGUpO2lmKHImJjAhPT1yLnNpemUpZm9yKGNvbnN0IGUgb2YgdCl7aWYoci5oYXMoZSkpcmV0dXJuITE7ci5hZGQoZSl9ZWxzZSByPW5ldyBTZXQodCl9cmV0dXJuITB9KShpLGUuaGVhZGVyKSl0aHJvdyBuZXcgb2koIkpXUyBQcm90ZWN0ZWQgYW5kIEpXUyBVbnByb3RlY3RlZCBIZWFkZXIgUGFyYW1ldGVyIG5hbWVzIG11c3QgYmUgZGlzam9pbnQiKTtjb25zdCBvPXsuLi5pLC4uLmUuaGVhZGVyfSxzPWZ1bmN0aW9uKGUsdCxyLG4saSl7aWYodm9pZCAwIT09aS5jcml0JiZ2b2lkIDA9PT1uLmNyaXQpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJyk7aWYoIW58fHZvaWQgMD09PW4uY3JpdClyZXR1cm4gbmV3IFNldDtpZighQXJyYXkuaXNBcnJheShuLmNyaXQpfHwwPT09bi5jcml0Lmxlbmd0aHx8bi5jcml0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKSkpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgc3RyaW5ncyB3aGVuIHByZXNlbnQnKTtsZXQgbztvPXZvaWQgMCE9PXI/bmV3IE1hcChbLi4uT2JqZWN0LmVudHJpZXMociksLi4udC5lbnRyaWVzKCldKTp0O2Zvcihjb25zdCB0IG9mIG4uY3JpdCl7aWYoIW8uaGFzKHQpKXRocm93IG5ldyBpaShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7dH0iIGlzIG5vdCByZWNvZ25pemVkYCk7aWYodm9pZCAwPT09aVt0XSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7dH0iIGlzIG1pc3NpbmdgKTtpZihvLmdldCh0KSYmdm9pZCAwPT09blt0XSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7dH0iIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZGApfXJldHVybiBuZXcgU2V0KG4uY3JpdCl9KG9pLG5ldyBNYXAoW1siYjY0IiwhMF1dKSxudWxsPT1yP3ZvaWQgMDpyLmNyaXQsaSxvKTtsZXQgYT0hMDtpZihzLmhhcygiYjY0IikmJihhPWkuYjY0LCJib29sZWFuIiE9dHlwZW9mIGEpKXRocm93IG5ldyBvaSgnVGhlICJiNjQiIChiYXNlNjR1cmwtZW5jb2RlIHBheWxvYWQpIEhlYWRlciBQYXJhbWV0ZXIgbXVzdCBiZSBhIGJvb2xlYW4nKTtjb25zdHthbGc6Y309bztpZigic3RyaW5nIiE9dHlwZW9mIGN8fCFjKXRocm93IG5ldyBvaSgnSldTICJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbWlzc2luZyBvciBpbnZhbGlkJyk7Y29uc3QgdT1yJiYoKGUsdCk9PntpZih2b2lkIDAhPT10JiYoIUFycmF5LmlzQXJyYXkodCl8fHQuc29tZSgoZT0+InN0cmluZyIhPXR5cGVvZiBlKSkpKXRocm93IG5ldyBUeXBlRXJyb3IoYCIke2V9IiBvcHRpb24gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7aWYodClyZXR1cm4gbmV3IFNldCh0KX0pKCJhbGdvcml0aG1zIixyLmFsZ29yaXRobXMpO2lmKHUmJiF1LmhhcyhjKSl0aHJvdyBuZXcgbmkoJyJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbm90IGFsbG93ZWQnKTtpZihhKXtpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCl0aHJvdyBuZXcgb2koIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmciKX1lbHNlIGlmKCJzdHJpbmciIT10eXBlb2YgZS5wYXlsb2FkJiYhKGUucGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXRocm93IG5ldyBvaSgiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBVaW50OEFycmF5IGluc3RhbmNlIik7bGV0IGw9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PWF3YWl0IHQoaSxlKSxsPSEwKSxTaShjLHQsInZlcmlmeSIpO2NvbnN0IGQ9ZnVuY3Rpb24oLi4uZSl7Y29uc3QgdD1lLnJlZHVjZSgoKGUse2xlbmd0aDp0fSk9PmUrdCksMCkscj1uZXcgVWludDhBcnJheSh0KTtsZXQgbj0wO3JldHVybiBlLmZvckVhY2goKGU9PntyLnNldChlLG4pLG4rPWUubGVuZ3RofSkpLHJ9KFhuLmVuY29kZShudWxsIT09KG49ZS5wcm90ZWN0ZWQpJiZ2b2lkIDAhPT1uP246IiIpLFhuLmVuY29kZSgiLiIpLCJzdHJpbmciPT10eXBlb2YgZS5wYXlsb2FkP1huLmVuY29kZShlLnBheWxvYWQpOmUucGF5bG9hZCksaD1RbihlLnNpZ25hdHVyZSk7aWYoIWF3YWl0IGJpKGMsdCxoLGQpKXRocm93IG5ldyBsaTtsZXQgZjtmPWE/UW4oZS5wYXlsb2FkKToic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD9Ybi5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQ7Y29uc3QgcD17cGF5bG9hZDpmfTtyZXR1cm4gdm9pZCAwIT09ZS5wcm90ZWN0ZWQmJihwLnByb3RlY3RlZEhlYWRlcj1pKSx2b2lkIDAhPT1lLmhlYWRlciYmKHAudW5wcm90ZWN0ZWRIZWFkZXI9ZS5oZWFkZXIpLGw/ey4uLnAsa2V5OnR9OnB9Y29uc3Qga2k9ODY0MDAsUmk9L14oXGQrfFxkK1wuXGQrKSA/KHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSkkL2k7dmFyIFRpPWU9Pntjb25zdCB0PVJpLmV4ZWMoZSk7aWYoIXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCB0aW1lIHBlcmlvZCBmb3JtYXQiKTtjb25zdCByPXBhcnNlRmxvYXQodFsxXSk7c3dpdGNoKHRbMl0udG9Mb3dlckNhc2UoKSl7Y2FzZSJzZWMiOmNhc2Uic2VjcyI6Y2FzZSJzZWNvbmQiOmNhc2Uic2Vjb25kcyI6Y2FzZSJzIjpyZXR1cm4gTWF0aC5yb3VuZChyKTtjYXNlIm1pbnV0ZSI6Y2FzZSJtaW51dGVzIjpjYXNlIm1pbiI6Y2FzZSJtaW5zIjpjYXNlIm0iOnJldHVybiBNYXRoLnJvdW5kKDYwKnIpO2Nhc2UiaG91ciI6Y2FzZSJob3VycyI6Y2FzZSJociI6Y2FzZSJocnMiOmNhc2UiaCI6cmV0dXJuIE1hdGgucm91bmQoMzYwMCpyKTtjYXNlImRheSI6Y2FzZSJkYXlzIjpjYXNlImQiOnJldHVybiBNYXRoLnJvdW5kKHIqa2kpO2Nhc2Uid2VlayI6Y2FzZSJ3ZWVrcyI6Y2FzZSJ3IjpyZXR1cm4gTWF0aC5yb3VuZCg2MDQ4MDAqcik7ZGVmYXVsdDpyZXR1cm4gTWF0aC5yb3VuZCgzMTU1NzYwMCpyKX19O2NvbnN0IEFpPWU9PmUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eYXBwbGljYXRpb25cLy8sIiIpO3ZhciBDaT0oZSx0LHI9e30pPT57Y29uc3R7dHlwOm59PXI7aWYobiYmKCJzdHJpbmciIT10eXBlb2YgZS50eXB8fEFpKGUudHlwKSE9PUFpKG4pKSl0aHJvdyBuZXcgdGkoJ3VuZXhwZWN0ZWQgInR5cCIgSldUIGhlYWRlciB2YWx1ZScsInR5cCIsImNoZWNrX2ZhaWxlZCIpO2xldCBpO3RyeXtpPUpTT04ucGFyc2UoWm4uZGVjb2RlKHQpKX1jYXRjaChlKXt9aWYoIXdpKGkpKXRocm93IG5ldyBzaSgiSldUIENsYWltcyBTZXQgbXVzdCBiZSBhIHRvcC1sZXZlbCBKU09OIG9iamVjdCIpO2NvbnN0e2lzc3VlcjpvfT1yO2lmKG8mJiEoQXJyYXkuaXNBcnJheShvKT9vOltvXSkuaW5jbHVkZXMoaS5pc3MpKXRocm93IG5ldyB0aSgndW5leHBlY3RlZCAiaXNzIiBjbGFpbSB2YWx1ZScsImlzcyIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e3N1YmplY3Q6c309cjtpZihzJiZpLnN1YiE9PXMpdGhyb3cgbmV3IHRpKCd1bmV4cGVjdGVkICJzdWIiIGNsYWltIHZhbHVlJywic3ViIiwiY2hlY2tfZmFpbGVkIik7Y29uc3R7YXVkaWVuY2U6YX09cjtpZihhJiYoYz1pLmF1ZCx1PSJzdHJpbmciPT10eXBlb2YgYT9bYV06YSwhKCJzdHJpbmciPT10eXBlb2YgYz91LmluY2x1ZGVzKGMpOkFycmF5LmlzQXJyYXkoYykmJnUuc29tZShTZXQucHJvdG90eXBlLmhhcy5iaW5kKG5ldyBTZXQoYykpKSkpKXRocm93IG5ldyB0aSgndW5leHBlY3RlZCAiYXVkIiBjbGFpbSB2YWx1ZScsImF1ZCIsImNoZWNrX2ZhaWxlZCIpO3ZhciBjLHU7bGV0IGw7c3dpdGNoKHR5cGVvZiByLmNsb2NrVG9sZXJhbmNlKXtjYXNlInN0cmluZyI6bD1UaShyLmNsb2NrVG9sZXJhbmNlKTticmVhaztjYXNlIm51bWJlciI6bD1yLmNsb2NrVG9sZXJhbmNlO2JyZWFrO2Nhc2UidW5kZWZpbmVkIjpsPTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNsb2NrVG9sZXJhbmNlIG9wdGlvbiB0eXBlIil9Y29uc3R7Y3VycmVudERhdGU6ZH09cixoPShmPWR8fG5ldyBEYXRlLE1hdGguZmxvb3IoZi5nZXRUaW1lKCkvMWUzKSk7dmFyIGY7aWYoKHZvaWQgMCE9PWkuaWF0fHxyLm1heFRva2VuQWdlKSYmIm51bWJlciIhPXR5cGVvZiBpLmlhdCl0aHJvdyBuZXcgdGkoJyJpYXQiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJpYXQiLCJpbnZhbGlkIik7aWYodm9pZCAwIT09aS5uYmYpe2lmKCJudW1iZXIiIT10eXBlb2YgaS5uYmYpdGhyb3cgbmV3IHRpKCcibmJmIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywibmJmIiwiaW52YWxpZCIpO2lmKGkubmJmPmgrbCl0aHJvdyBuZXcgdGkoJyJuYmYiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQnLCJuYmYiLCJjaGVja19mYWlsZWQiKX1pZih2b2lkIDAhPT1pLmV4cCl7aWYoIm51bWJlciIhPXR5cGVvZiBpLmV4cCl0aHJvdyBuZXcgdGkoJyJleHAiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJleHAiLCJpbnZhbGlkIik7aWYoaS5leHA8PWgtbCl0aHJvdyBuZXcgcmkoJyJleHAiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQnLCJleHAiLCJjaGVja19mYWlsZWQiKX1pZihyLm1heFRva2VuQWdlKXtjb25zdCBlPWgtaS5pYXQ7aWYoZS1sPigibnVtYmVyIj09dHlwZW9mIHIubWF4VG9rZW5BZ2U/ci5tYXhUb2tlbkFnZTpUaShyLm1heFRva2VuQWdlKSkpdGhyb3cgbmV3IHJpKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkICh0b28gZmFyIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpO2lmKGU8MC1sKXRocm93IG5ldyB0aSgnImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAoaXQgc2hvdWxkIGJlIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpfXJldHVybiBpfTthc3luYyBmdW5jdGlvbiBEaShlLHQscil7dmFyIG47Y29uc3QgaT1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQscil7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJihlPVpuLmRlY29kZShlKSksInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBvaSgiQ29tcGFjdCBKV1MgbXVzdCBiZSBhIHN0cmluZyBvciBVaW50OEFycmF5Iik7Y29uc3R7MDpuLDE6aSwyOm8sbGVuZ3RoOnN9PWUuc3BsaXQoIi4iKTtpZigzIT09cyl0aHJvdyBuZXcgb2koIkludmFsaWQgQ29tcGFjdCBKV1MiKTtjb25zdCBhPWF3YWl0IEVpKHtwYXlsb2FkOmkscHJvdGVjdGVkOm4sc2lnbmF0dXJlOm99LHQsciksYz17cGF5bG9hZDphLnBheWxvYWQscHJvdGVjdGVkSGVhZGVyOmEucHJvdGVjdGVkSGVhZGVyfTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD97Li4uYyxrZXk6YS5rZXl9OmN9KGUsdCxyKTtpZigobnVsbD09PShuPWkucHJvdGVjdGVkSGVhZGVyLmNyaXQpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmluY2x1ZGVzKCJiNjQiKSkmJiExPT09aS5wcm90ZWN0ZWRIZWFkZXIuYjY0KXRocm93IG5ldyBzaSgiSldUcyBNVVNUIE5PVCB1c2UgdW5lbmNvZGVkIHBheWxvYWQiKTtjb25zdCBvPXtwYXlsb2FkOkNpKGkucHJvdGVjdGVkSGVhZGVyLGkucGF5bG9hZCxyKSxwcm90ZWN0ZWRIZWFkZXI6aS5wcm90ZWN0ZWRIZWFkZXJ9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3suLi5vLGtleTppLmtleX06b31mdW5jdGlvbiBQaShlKXtyZXR1cm4gd2koZSl9Y2xhc3MgT2l7Y29uc3RydWN0b3IoZSl7aWYodGhpcy5fY2FjaGVkPW5ldyBXZWFrTWFwLCFmdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZBcnJheS5pc0FycmF5KGUua2V5cykmJmUua2V5cy5ldmVyeShQaSl9KGUpKXRocm93IG5ldyBhaSgiSlNPTiBXZWIgS2V5IFNldCBtYWxmb3JtZWQiKTt2YXIgdDt0aGlzLl9qd2tzPSh0PWUsImZ1bmN0aW9uIj09dHlwZW9mIHN0cnVjdHVyZWRDbG9uZT9zdHJ1Y3R1cmVkQ2xvbmUodCk6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0KSkpfWFzeW5jIGdldEtleShlLHQpe2NvbnN0e2FsZzpyLGtpZDpufT17Li4uZSwuLi50LmhlYWRlcn0saT1mdW5jdGlvbihlKXtzd2l0Y2goInN0cmluZyI9PXR5cGVvZiBlJiZlLnNsaWNlKDAsMikpe2Nhc2UiUlMiOmNhc2UiUFMiOnJldHVybiJSU0EiO2Nhc2UiRVMiOnJldHVybiJFQyI7Y2FzZSJFZCI6cmV0dXJuIk9LUCI7ZGVmYXVsdDp0aHJvdyBuZXcgaWkoJ1Vuc3VwcG9ydGVkICJhbGciIHZhbHVlIGZvciBhIEpTT04gV2ViIEtleSBTZXQnKX19KHIpLG89dGhpcy5fandrcy5rZXlzLmZpbHRlcigoZT0+e2xldCB0PWk9PT1lLmt0eTtpZih0JiYic3RyaW5nIj09dHlwZW9mIG4mJih0PW49PT1lLmtpZCksdCYmInN0cmluZyI9PXR5cGVvZiBlLmFsZyYmKHQ9cj09PWUuYWxnKSx0JiYic3RyaW5nIj09dHlwZW9mIGUudXNlJiYodD0ic2lnIj09PWUudXNlKSx0JiZBcnJheS5pc0FycmF5KGUua2V5X29wcykmJih0PWUua2V5X29wcy5pbmNsdWRlcygidmVyaWZ5IikpLHQmJiJFZERTQSI9PT1yJiYodD0iRWQyNTUxOSI9PT1lLmNydnx8IkVkNDQ4Ij09PWUuY3J2KSx0KXN3aXRjaChyKXtjYXNlIkVTMjU2Ijp0PSJQLTI1NiI9PT1lLmNydjticmVhaztjYXNlIkVTMjU2SyI6dD0ic2VjcDI1NmsxIj09PWUuY3J2O2JyZWFrO2Nhc2UiRVMzODQiOnQ9IlAtMzg0Ij09PWUuY3J2O2JyZWFrO2Nhc2UiRVM1MTIiOnQ9IlAtNTIxIj09PWUuY3J2fXJldHVybiB0fSkpLHswOnMsbGVuZ3RoOmF9PW87aWYoMD09PWEpdGhyb3cgbmV3IGNpO2lmKDEhPT1hKXRocm93IG5ldyB1aTtjb25zdCBjPXRoaXMuX2NhY2hlZC5nZXQocyl8fHRoaXMuX2NhY2hlZC5zZXQocyx7fSkuZ2V0KHMpO2lmKHZvaWQgMD09PWNbcl0pe2NvbnN0IGU9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LHIpe2lmKCF3aShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJKV0sgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih0fHwodD1lLmFsZyksInN0cmluZyIhPXR5cGVvZiB0fHwhdCl0aHJvdyBuZXcgVHlwZUVycm9yKCciYWxnIiBhcmd1bWVudCBpcyByZXF1aXJlZCB3aGVuICJqd2suYWxnIiBpcyBub3QgcHJlc2VudCcpO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOmlmKCJzdHJpbmciIT10eXBlb2YgZS5rfHwhZS5rKXRocm93IG5ldyBUeXBlRXJyb3IoJ21pc3NpbmcgImsiIChLZXkgVmFsdWUpIFBhcmFtZXRlciB2YWx1ZScpO3JldHVybiBudWxsIT1yfHwocj0hMCE9PWUuZXh0KSxyP19pKHsuLi5lLGFsZzp0LGV4dDohMX0pOlFuKGUuayk7Y2FzZSJSU0EiOmlmKHZvaWQgMCE9PWUub3RoKXRocm93IG5ldyBpaSgnUlNBIEpXSyAib3RoIiAoT3RoZXIgUHJpbWVzIEluZm8pIFBhcmFtZXRlciB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkJyk7Y2FzZSJFQyI6Y2FzZSJPS1AiOnJldHVybiBfaSh7Li4uZSxhbGc6dH0pO2RlZmF1bHQ6dGhyb3cgbmV3IGlpKCdVbnN1cHBvcnRlZCAia3R5IiAoS2V5IFR5cGUpIFBhcmFtZXRlciB2YWx1ZScpfX0oey4uLnMsZXh0OiEwfSxyKTtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheXx8InB1YmxpYyIhPT1lLnR5cGUpdGhyb3cgbmV3IGFpKCJKU09OIFdlYiBLZXkgU2V0IG1lbWJlcnMgbXVzdCBiZSBwdWJsaWMga2V5cyIpO2Nbcl09ZX1yZXR1cm4gY1tyXX19dmFyIElpPXtleHBvcnRzOnt9fSxVaT17ZXhwb3J0czp7fX0sTGk9UChudCk7IWZ1bmN0aW9uKGUsdCl7dmFyIHI9TGksbj1yLkJ1ZmZlcjtmdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdfWZ1bmN0aW9uIG8oZSx0LHIpe3JldHVybiBuKGUsdCxyKX1uLmZyb20mJm4uYWxsb2MmJm4uYWxsb2NVbnNhZmUmJm4uYWxsb2NVbnNhZmVTbG93P2UuZXhwb3J0cz1yOihpKHIsdCksdC5CdWZmZXI9byksby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSksaShuLG8pLG8uZnJvbT1mdW5jdGlvbihlLHQscil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIG4oZSx0LHIpfSxvLmFsbG9jPWZ1bmN0aW9uKGUsdCxyKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPW4oZSk7cmV0dXJuIHZvaWQgMCE9PXQ/InN0cmluZyI9PXR5cGVvZiByP2kuZmlsbCh0LHIpOmkuZmlsbCh0KTppLmZpbGwoMCksaX0sby5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBuKGUpfSxvLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByLlNsb3dCdWZmZXIoZSl9fShVaSxVaS5leHBvcnRzKTt2YXIgSGk9NjU1MzYsTWk9NDI5NDk2NzI5NTt2YXIgamk9VWkuZXhwb3J0cy5CdWZmZXIsTmk9Qy5jcnlwdG98fEMubXNDcnlwdG87TmkmJk5pLmdldFJhbmRvbVZhbHVlcz9JaS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoZT5NaSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicmVxdWVzdGVkIHRvbyBtYW55IHJhbmRvbSBieXRlcyIpO3ZhciByPWppLmFsbG9jVW5zYWZlKGUpO2lmKGU+MClpZihlPkhpKWZvcih2YXIgbj0wO248ZTtuKz1IaSlOaS5nZXRSYW5kb21WYWx1ZXMoci5zbGljZShuLG4rSGkpKTtlbHNlIE5pLmdldFJhbmRvbVZhbHVlcyhyKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gZXIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dChudWxsLHIpfSkpO3JldHVybiByfTpJaS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfTt2YXIgeGk9SWkuZXhwb3J0cztjbGFzcyBxaXtiYXNlNjRVUkxFbmNvZGUoZSl7cmV0dXJuICRuLmVuY29kZShlKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpLnJlcGxhY2UoLz0vZywiIil9YmFzZTY0VVJMRGVjb2RlKGUpe3JldHVybiAkbi5kZWNvZGUoZSkudG9TdHJpbmcoKX1oYXNoU2hhMjU2KGUpe3JldHVybiBtZS5mcm9tKFZuKChuZXcgVGV4dEVuY29kZXIpLmVuY29kZShlKSkpfWdlbmVyYXRlUmFuZG9tQnl0ZXMoZSl7cmV0dXJuIHhpKGUpfXZlcmlmeUp3dChlLHQscixuLGksbyxzLGEpe2NvbnN0IHU9e2FsZ29yaXRobXM6cixhdWRpZW5jZTpuLGNsb2NrVG9sZXJhbmNlOnMsc3ViamVjdDpvfTtyZXR1cm4obnVsbD09YXx8YSkmJih1Lmlzc3Vlcj1pKSxEaShlLChsPXtrZXlzOlt0XX0sT2kucHJvdG90eXBlLmdldEtleS5iaW5kKG5ldyBPaShsKSkpLHUpLnRoZW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoITApKSkuY2F0Y2goKGU9Pnt2YXIgdDtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1DUllQVE8tVVRJTFMtVkotSVYwMSIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUucmVhc29uKSYmdm9pZCAwIT09dD90OkpTT04uc3RyaW5naWZ5KGUpLGAke251bGw9PWU/dm9pZCAwOmUuY29kZX0gJHtudWxsPT1lP3ZvaWQgMDplLmNsYWltfWApKX0pKTt2YXIgbH19KHQ9Pntjb25zdCByPXNlbGY7bGV0IG47ci5vbm1lc3NhZ2U9KHtkYXRhOnIscG9ydHM6YX0pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgdSxsLGQsaCxmLHA7Y29uc3QgeT1hWzBdO2lmKHIudHlwZT09PXZ8fG4pc3dpdGNoKHIudHlwZSl7Y2FzZSB2OnRyeXtjb25zdCBhPU9iamVjdC5hc3NpZ24oe30sci5kYXRhKTtuPXlpZWxkKCh0LHIpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBuPW5ldyBNbixpPW5ldyBxaSxvPW5ldyBnO3lpZWxkIG8uaW5pdGlhbGl6ZSh0LG4saSk7Y29uc3Qgcz1uZXcgQShvKSxhPXIobyxzKSxjPW8uZ2V0RGF0YUxheWVyKCksdT1Ibi5nZXRJbnN0YW5jZSgpO3JldHVybihudWxsPT11P3ZvaWQgMDp1LmluaXQpJiYoeWllbGQgdS5pbml0KCEwLCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCBhLmF0dGFjaFRva2VuVG9SZXF1ZXN0Q29uZmlnKHQpfSkpKSkpLHtkaXNhYmxlSHR0cEhhbmRsZXI6KCk9PnthLmRpc2FibGVIdHRwSGFuZGxlcih1KX0sZW5hYmxlSHR0cEhhbmRsZXI6KCk9PnthLmVuYWJsZUh0dHBIYW5kbGVyKHUpfSxnZXRBY2Nlc3NUb2tlbjooKT0+YS5nZXRBY2Nlc3NUb2tlbigpLGdldEF1dGhvcml6YXRpb25VUkw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG8uZ2V0QXV0aG9yaXphdGlvblVSTCh0KS50aGVuKCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZTtjb25zdCByPW51bGwhPT0oZT1uZXcgVVJMKHQpLnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIikpJiZ2b2lkIDAhPT1lP2U6IiIsbj15aWVsZCBvLmdldFBLQ0VDb2RlKHIpO3JldHVybnthdXRob3JpemF0aW9uVVJMOnQscGtjZTpufX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpfSkpLGdldEJhc2ljVXNlckluZm86KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldEJhc2ljVXNlckluZm8oKX0pKSxnZXRDb25maWdEYXRhOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYy5nZXRDb25maWdEYXRhKCl9KSksZ2V0Q3J5cHRvSGVscGVyOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRDcnlwdG9IZWxwZXIoKX0pKSxnZXREZWNvZGVkSURQSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEUElEVG9rZW4oKX0pKSxnZXREZWNvZGVkSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKSxnZXRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRJRFRva2VuKCl9KSksZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHM6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSksZ2V0U2lnbk91dFVSTDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLGh0dHBSZXF1ZXN0OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBhLmh0dHBSZXF1ZXN0KHUsdCl9KSksaHR0cFJlcXVlc3RBbGw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGEuaHR0cFJlcXVlc3RBbGwodCx1KX0pKSxpc0F1dGhlbnRpY2F0ZWQ6KCk9PmEuaXNBdXRoZW50aWNhdGVkKCkscmVmcmVzaEFjY2Vzc1Rva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7cmV0dXJuIHlpZWxkIGEucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfX0pKSxyZXF1ZXN0QWNjZXNzVG9rZW46KHQscixuLGkpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0QWNjZXNzVG9rZW4odCxyLHZvaWQgMCxuLGkpfSkpLHJlcXVlc3RDdXN0b21HcmFudDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0Q3VzdG9tR3JhbnQodCl9KSkscmV2b2tlQWNjZXNzVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgcy5nZXRSZWZyZXNoVGltZW91dFRpbWVyKCk7cmV0dXJuIG8ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KHMuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KGUpLFByb21pc2UucmVzb2x2ZSghMCkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjazplPT57KG51bGw9PXU/dm9pZCAwOnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaykmJnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrOmU9PnsobnVsbD09dT92b2lkIDA6dS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2spJiZ1LnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s6ZT0+eyhudWxsPT11P3ZvaWQgMDp1LnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKSYmdS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKX0sc2V0U2Vzc2lvblN0YXRlOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIGMuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLHQpfSkpLHNpZ25PdXQ6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBzLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLHN0YXJ0QXV0b1JlZnJlc2hUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cy5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSxzLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoYSl9KSksdXBkYXRlQ29uZmlnOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIG8udXBkYXRlQ29uZmlnKHQpfSkpfX0pKSkoYSx0KSxuLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2socyksbi5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soaSksbi5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhvKSx5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfYXV0aF91cmwiOm4uZ2V0QXV0aG9yaXphdGlvblVSTChudWxsPT1yP3ZvaWQgMDpyLmRhdGEpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJyZXF1ZXN0X2dldF90b2tlbiI6bi5yZXF1ZXN0QWNjZXNzVG9rZW4obnVsbD09PSh1PW51bGw9PXI/dm9pZCAwOnIuZGF0YSl8fHZvaWQgMD09PXU/dm9pZCAwOnUuY29kZSxudWxsPT09KGw9bnVsbD09cj92b2lkIDA6ci5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zZXNzaW9uU3RhdGUsbnVsbD09PShkPW51bGw9PXI/dm9pZCAwOnIuZGF0YSl8fHZvaWQgMD09PWQ/dm9pZCAwOmQucGtjZSxudWxsPT09KGg9bnVsbD09cj92b2lkIDA6ci5kYXRhKXx8dm9pZCAwPT09aD92b2lkIDA6aC5zdGF0ZSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlImh0dHAtcmVxdWVzdCI6e2NvbnN0IGU9ci5kYXRhLHQ9bnVsbD09ZT92b2lkIDA6ZS5kYXRhO2lmKCEwPT09KG51bGw9PT0ocD1udWxsPT09KGY9ci5kYXRhKXx8dm9pZCAwPT09Zj92b2lkIDA6Zi5kYXRhKXx8dm9pZCAwPT09cD92b2lkIDA6cC5mb3JtRGF0YSkpe2NvbnN0IHI9bmV3IEZvcm1EYXRhO2Zvcihjb25zdCBlIGluIHQpImZvcm1EYXRhIiE9PWUmJnIuYXBwZW5kKGUsdFtlXSk7ZS5kYXRhPXJ9bi5odHRwUmVxdWVzdChlKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrfWNhc2UiaHR0cC1yZXF1ZXN0LWFsbCI6bi5odHRwUmVxdWVzdEFsbChyLmRhdGEpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJzaWduLW91dCI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uc2lnbk91dCgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVxdWVzdC1jdXN0b20tZ3JhbnQiOm4ucmVxdWVzdEN1c3RvbUdyYW50KHIuZGF0YSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInJldm9rZS1hY2Nlc3MtdG9rZW4iOm4ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiOnRyeXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBuLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtYmFzaWMtdXNlci1pbmZvIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi5nZXRCYXNpY1VzZXJJbmZvKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtZGVjb2RlZC1pZC10b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uZ2V0RGVjb2RlZElEVG9rZW4oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1jcnlwdG8taGVscGVyIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi5nZXRDcnlwdG9IZWxwZXIoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9pZF90b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uZ2V0SURUb2tlbigpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZW5hYmxlX2h0dHBfaGFuZGxlciI6bi5lbmFibGVIdHRwSGFuZGxlcigpLHkucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpO2JyZWFrO2Nhc2UiZGlzYWJsZV9odHRwX2hhbmRsZXIiOm4uZGlzYWJsZUh0dHBIYW5kbGVyKCkseS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJpc19hdXRoZW50aWNhdGVkIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi5pc0F1dGhlbnRpY2F0ZWQoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9zaWduX291dF91cmwiOnRyeXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBuLmdldFNpZ25PdXRVUkwoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlZnJlc2hfYWNjZXNzLXRva2VuIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi5yZWZyZXNoQWNjZXNzVG9rZW4oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInN0YXJ0X2F1dG9fcmVmcmVzaF90b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKG4uc3RhcnRBdXRvUmVmcmVzaFRva2VuKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzZXRfc2Vzc2lvbl9zdGF0ZSI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uc2V0U2Vzc2lvblN0YXRlKG51bGw9PXI/dm9pZCAwOnIuZGF0YSkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJ1cGRhdGVfY29uZmlnIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi51cGRhdGVDb25maWcobnVsbD09cj92b2lkIDA6ci5kYXRhKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9jb25maWdfZGF0YSI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uZ2V0Q29uZmlnRGF0YSgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2RlZmF1bHQ6bnVsbD09eXx8eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IGMoIlNQQS1DTElFTlRfV09SS0VSLU9OTVNHLUlWMDIiLCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQuIixgVGhlIG1lc3NhZ2UgdHlwZSBwcm92aWRlZCwgJHtyLnR5cGV9LCBpcyBpbnZhbGlkLmApKSl9ZWxzZSB5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgYygiU1BBLUNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsIlRoZSB3ZWIgd29ya2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuIiwiVGhlIGluaXRpYWxpemUgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gY2FuIGJlIGNhcnJpZWQgb3V0LiIpKSl9KSk7Y29uc3QgaT0oKT0+e3IucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3Qtc3RhcnQifSl9LG89ZT0+e3IucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LHM9KCk9PntyLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LWZpbmlzaCJ9KX19KSgoKGUsdCk9Pm5ldyBUKGUsdCkpKTtyZXR1cm57fX0oKTsKCg==",V=null,I=!1,function(e){return R=R||y(W,V,I),new Worker(R,e)});const g="init",v="sign-out",Y="http-request",K="http-request-all",J="request-custom-grant",f="revoke-access-token",N="request-start",k="request-success",C="request-finish",L="get-oidc-service-endpoints",H="get-basic-user-info",U="get-decoded-id-token",T="get-crypto-helper",F="enable_http_handler",w="disable_http_handler",x="get_auth_url",z="request_get_token",B="is_authenticated",P="get_sign_out_url",M="refresh_access-token",j="refresh-access-token-error",Q="set_session_state",E="start_auto_refresh_token",D="update_config",O="get_id_token",A="check_session_signed_in",_="check_session_signed_out",q="get_config_data",$="set_session_state_from_iframe",ee="token_request_config";var te;e.Hooks=void 0,(te=e.Hooks||(e.Hooks={})).SignIn="sign-in",te.SignOut="sign-out",te.Initialize="initialize",te.HttpRequestStart="http-request-start",te.HttpRequestFinish="http-request-finish",te.HttpRequestError="http-request-error",te.HttpRequestSuccess="http-request-success",te.RevokeAccessToken="revoke-access-token",te.CustomGrant="custom-grant",te.SignOutFailed="sign-out-failed";const le="rpIFrame",ie="promptNoneIFrame",ne="Y2hlY2tTZXNzaW9u",oe="sign-in-silently",ce="initialized-silent-sign-in",de="promptNoneRequestSent",ae="error",se="error_description",re="custom_grant_config",ue="state",Ze="Access token is invalid";var he;!function(e){e.LocalStorage="localStorage",e.SessionStorage="sessionStorage",e.WebWorker="webWorker",e.BrowserMemory="browserMemory"}(he||(he={}));class be{constructor(){}static generateSuccessMessage(e){return{blob:(null==e?void 0:e.data)instanceof Blob?null==e?void 0:e.data:null,data:JSON.stringify(null!=e?e:""),success:!0}}static generateFailureMessage(e){return(null==e?void 0:e.toJSON)&&delete e.toJSON,{error:JSON.stringify(null!=e?e:""),success:!1}}}class me{constructor(){}static removeAuthorizationCode(){const e=location.href;history.pushState({},document.title,e.replace(/\?code=.*$/,""))}static getPKCE(e){var t;return null!==(t=sessionStorage.getItem(e))&&void 0!==t?t:""}static setPKCE(e,t){sessionStorage.setItem(e,t)}static setSignOutURL(e,t,l){sessionStorage.setItem(`${d}-instance_${l}-${t}`,e)}static getSignOutURL(e,t){var l;return null!==(l=sessionStorage.getItem(`${d}-instance_${t}-${e}`))&&void 0!==l?l:""}static removePKCE(e){sessionStorage.removeItem(e)}static canContinueSignIn(e,t){return!(e&&!me.hasErrorInURL()&&!me.hasAuthSearchParamsInURL()&&!t)}static isInitializedSilentSignIn(){return me.isSilentStatePresentInURL()}static wasSignInCalled(){return!(!me.hasErrorInURL()&&!me.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const e=sessionStorage.getItem(ce),t=e?JSON.parse(e):null;return Boolean(t)}static isSignOutSuccessful(){return t(this,void 0,void 0,(function*(){if(X.isSignOutSuccessful(window.location.href)){const e=window.location.href.split("?")[0];return history.pushState({},document.title,e),yield X.clearUserSessionData(),!0}return!1}))}static didSignOutFail(){if(X.didSignOutFail(window.location.href)){const e=new URL(window.location.href),t=e.searchParams.get(ae),l=e.searchParams.get(se),i=window.location.href.split("?")[0];return history.pushState({},document.title,i),{description:null!=l?l:"",error:null!=t?t:""}}return!1}static isSilentStatePresentInURL(){var e;const t=new URL(window.location.href).searchParams.get("state");return null!==(e=null==t?void 0:t.includes(oe))&&void 0!==e&&e}static hasAuthSearchParamsInURL(e=window.location.search){return/[?&]code=[^&]+/.test(e)}static hasErrorInURL(e=window.location.href){const t=new URL(e);return!!t.searchParams.get(ae)&&t.searchParams.get(ue)!==a}static canSendPromptNoneRequest(){const e=sessionStorage.getItem(de);return!(e?JSON.parse(e):null)}static setPromptNoneRequestSent(e){sessionStorage.setItem(de,JSON.stringify(e))}static waitTillPageRedirect(e){return t(this,void 0,void 0,(function*(){const t=null!=e?e:3e3;yield new Promise((e=>setTimeout(e,1e3*t)))}))}}me.until=(e,t=500)=>{const l=i=>e()?i():setTimeout((()=>l(i)),t);return new Promise(l)};class pe{constructor(e,t){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer(),this._spaHelper=t,this._instanceID=this._authenticationClient.getInstanceID(),this._isTokenRefreshing=!1}enableHttpHandler(e){(null==e?void 0:e.enableHandler)&&e.enableHandler()}disableHttpHandler(e){(null==e?void 0:e.disableHandler)&&e.disableHandler()}initializeSessionManger(e,t,l,i,n){var o,c,d;n.initialize(e.clientID,null!==(o=t.checkSessionIframe)&&void 0!==o?o:"",l,null!==(c=e.checkSessionInterval)&&void 0!==c?c:3,null!==(d=e.sessionRefreshInterval)&&void 0!==d?d:300,e.signInRedirectURL,i)}requestCustomGrant(e,l){var i,n,o;return t(this,void 0,void 0,(function*(){let c=!0,d=!1;if(null==e?void 0:e.tokenEndpoint){c=!1;for(const t of[...null!==(n=null===(i=yield this._dataLayer.getConfigData())||void 0===i?void 0:i.resourceServerURLs)&&void 0!==n?n:[],e.baseUrl])if(t&&(null===(o=e.tokenEndpoint)||void 0===o?void 0:o.startsWith(t))){d=!0;break}}return e.shouldReplayAfterRefresh&&this._dataLayer.setTemporaryDataParameter(re,JSON.stringify(e)),c||d?this._authenticationClient.requestCustomGrant(e).then((i=>t(this,void 0,void 0,(function*(){return l&&"function"==typeof l&&l(e),e.returnsSession?(this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()):i})))).catch((e=>Promise.reject(e))):Promise.reject(new u("SPA-MAIN_THREAD_CLIENT-RCG-IV01","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified token endpoint in this request cannot be found among the `resourceServerURLs`"))}))}getCustomGrantConfigData(){return t(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getTemporaryDataParameter(re);return e?JSON.parse(e):null}))}refreshAccessToken(e){return t(this,void 0,void 0,(function*(){try{yield this._authenticationClient.refreshAccessToken();const t=yield this.getCustomGrantConfigData();return t&&(yield this.requestCustomGrant(t,e)),this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()}catch(e){const t={type:j};return window.postMessage(t),Promise.reject(e)}}))}retryFailedRequests(e){return t(this,void 0,void 0,(function*(){const t=e.httpClient,l=e.requestConfig,i=e.isHttpHandlerEnabled,n=e.httpErrorCallback,o=e.httpFinishCallback;yield me.until((()=>!this._isTokenRefreshing));try{const e=yield t.request(l);return Promise.resolve(e)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}))}httpRequest(e,l,i,n,o,c){var d,a;return t(this,void 0,void 0,(function*(){let s=!1;const r=yield this._dataLayer.getConfigData();for(const e of[...null!==(d=yield null==r?void 0:r.resourceServerURLs)&&void 0!==d?d:[],r.baseUrl])if(e&&(null===(a=null==l?void 0:l.url)||void 0===a?void 0:a.startsWith(e))){s=!0;break}return s?e.request(l).then((e=>Promise.resolve(e))).catch((d=>t(this,void 0,void 0,(function*(){var t,a,s;if(401===(null===(t=null==d?void 0:d.response)||void 0===t?void 0:t.status)||!(null==d?void 0:d.response)){if(this._isTokenRefreshing)return this.retryFailedRequests({enableRetrievingSignOutURLFromSession:c,httpClient:e,httpErrorCallback:n,httpFinishCallback:o,isHttpHandlerEnabled:i,requestConfig:l});let t;this._isTokenRefreshing=!0;try{t=yield this.refreshAccessToken(c),this._isTokenRefreshing=!1}catch(e){throw this._isTokenRefreshing=!1,i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},d),{code:Ze}))),"function"==typeof o&&o()),new u("SPA-AUTH_HELPER-HR-SE01",null!==(a=null==e?void 0:e.name)&&void 0!==a?a:"Refresh token request failed.",null!==(s=null==e?void 0:e.message)&&void 0!==s?s:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(t)try{const t=yield e.request(l);return Promise.resolve(t)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}return i&&("function"==typeof n&&(yield n(d)),"function"==typeof o&&o()),Promise.reject(d)})))):Promise.reject(new u("SPA-AUTH_HELPER-HR-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`"))}))}httpRequestAll(e,l,i,n,o){var c,d,a;return t(this,void 0,void 0,(function*(){let s=!0;const r=yield this._dataLayer.getConfigData();for(const t of e){let e=!1;for(const l of[...null!==(d=null===(c=yield r)||void 0===c?void 0:c.resourceServerURLs)&&void 0!==d?d:[],r.baseUrl])if(l&&(null===(a=t.url)||void 0===a?void 0:a.startsWith(l))){e=!0;break}if(!e){s=!1;break}}const Z=[];if(s)return e.forEach((e=>{Z.push(l.request(e))})),(null==l?void 0:l.all)&&l.all(Z).then((e=>Promise.resolve(e))).catch((e=>t(this,void 0,void 0,(function*(){var c,d,a;if(401===(null===(c=null==e?void 0:e.response)||void 0===c?void 0:c.status)||!(null==e?void 0:e.response)){let c;try{c=yield this._authenticationClient.refreshAccessToken()}catch(t){throw i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},e),{code:Ze}))),"function"==typeof o&&o()),new u("SPA-AUTH_HELPER-HRA-SE01",null!==(d=null==t?void 0:t.name)&&void 0!==d?d:"Refresh token request failed.",null!==(a=null==t?void 0:t.message)&&void 0!==a?a:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(c)return l.all&&l.all(Z).then((e=>Promise.resolve(e))).catch((e=>t(this,void 0,void 0,(function*(){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}))))}return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}))));throw new u("SPA-AUTH_HELPER-HRA-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`")}))}requestAccessToken(e,l,i,n,o,c){return t(this,void 0,void 0,(function*(){const d=yield this._dataLayer.getConfigData();if(d.storage===he.BrowserMemory&&d.enablePKCE&&l){const e=me.getPKCE(Z.extractPKCEKeyFromStateParam(l));yield this._authenticationClient.setPKCECode(Z.extractPKCEKeyFromStateParam(l),e)}else d.storage===he.WebWorker&&n&&(yield this._authenticationClient.setPKCECode(n,null!=o?o:""));return e?this._authenticationClient.requestAccessToken(e,null!=l?l:"",null!=o?o:"",void 0,c).then((()=>t(this,void 0,void 0,(function*(){return d.storage!==he.WebWorker?(me.setSignOutURL(yield this._authenticationClient.getSignOutURL(),d.clientID,this._instanceID),this._spaHelper&&(this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this)),i&&"function"==typeof i&&d.enableOIDCSessionManagement&&i()):this._spaHelper&&this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()})))).catch((e=>Promise.reject(e))):Promise.reject(new u("SPA-AUTH_HELPER-RAT1-NF01","No authorization code.","No authorization code was found."))}))}trySignInSilently(e,l,i,n,o){var c;return t(this,void 0,void 0,(function*(){if(me.isInitializedSilentSignIn())return yield i.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const d=document.getElementById(le),a=null===(c=null==d?void 0:d.contentDocument)||void 0===c?void 0:c.getElementById(ie);try{const t=yield e(n);a.src=t}catch(e){return Promise.reject(e)}return new Promise(((e,i)=>{const n=setTimeout((()=>{e(!1)}),1e4),c=d=>t(this,void 0,void 0,(function*(){var t,a,s,r;const u=d.data;(null==u?void 0:u.type)==_&&(window.removeEventListener("message",c),clearTimeout(n),e(!1)),(null==u?void 0:u.type)==A&&(null===(t=null==u?void 0:u.data)||void 0===t?void 0:t.code)&&l(null===(a=null==u?void 0:u.data)||void 0===a?void 0:a.code,null===(s=null==u?void 0:u.data)||void 0===s?void 0:s.sessionState,null===(r=null==u?void 0:u.data)||void 0===r?void 0:r.state,o).then((t=>{window.removeEventListener("message",c),e(t)})).catch((e=>{window.removeEventListener("message",c),i(e)})).finally((()=>{clearTimeout(n)}))}));window.addEventListener("message",c)}))}))}handleSignIn(e,l,i){return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getConfigData();if(yield e())return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(t.storage!==he.WebWorker&&(yield this._authenticationClient.isAuthenticated()))return this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this),t.enableOIDCSessionManagement&&l(),Promise.resolve(yield this._authenticationClient.getBasicUserInfo());const n=new URL(window.location.href).searchParams.get(ae),o=new URL(window.location.href).searchParams.get(se);if(n){const e=new URL(window.location.href);throw e.searchParams.delete(ae),e.searchParams.delete(se),history.pushState(null,document.title,e.toString()),new u("SPA-AUTH_HELPER-SI-SE01",n,null!=o?o:"")}if(t.storage===he.WebWorker&&i){const e=yield i();if(e)return e}}))}attachTokenToRequestConfig(e){return t(this,void 0,void 0,(function*(){const t=Object.assign({attachToken:!0},e);t.attachToken&&(t.shouldAttachIDPAccessToken?e.headers=Object.assign(Object.assign({},e.headers),{Authorization:`Bearer ${yield this.getIDPAccessToken()}`}):e.headers=Object.assign(Object.assign({},e.headers),{Authorization:`Bearer ${yield this.getAccessToken()}`}))}))}getBasicUserInfo(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getBasicUserInfo()}))}getDecodedIDToken(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getDecodedIDPIDToken(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getCryptoHelper(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getCryptoHelper()}))}getIDToken(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getIDToken()}))}getOIDCServiceEndpoints(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getOIDCServiceEndpoints()}))}getAccessToken(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.getAccessToken()}))}getIDPAccessToken(){var e;return t(this,void 0,void 0,(function*(){return null===(e=yield this._dataLayer.getSessionData())||void 0===e?void 0:e.access_token}))}getDataLayer(){return this._dataLayer}isAuthenticated(){return t(this,void 0,void 0,(function*(){return this._authenticationClient.isAuthenticated()}))}}class Ge{constructor(e){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(e){var l,n;return t(this,void 0,void 0,(function*(){if(!(null!==(n=null===(l=yield this._dataLayer.getConfigData())||void 0===l?void 0:l.periodicTokenRefresh)&&void 0!==n&&n))return;const o=yield this._dataLayer.getSessionData();if(o.refresh_token){const l=parseInt(o.expires_in),n=setTimeout((()=>t(this,void 0,void 0,(function*(){yield e.refreshAccessToken()}))),1e3*(l<=10?l:l-10));yield this._dataLayer.setTemporaryDataParameter(i,JSON.stringify(n))}}))}getRefreshTimeoutTimer(){return t(this,void 0,void 0,(function*(){return(yield this._dataLayer.getTemporaryDataParameter(i))?JSON.parse(yield this._dataLayer.getTemporaryDataParameter(i)):-1}))}clearRefreshTokenTimeout(e){return t(this,void 0,void 0,(function*(){if(e)return void clearTimeout(e);const t=yield this.getRefreshTimeoutTimer();-1!==t&&clearTimeout(t)}))}}const Xe=(()=>{let e,l,i,n,o,d,a,s,r,u,Z;const h=(t,c,a,s,r,u,h)=>{e=t,l=c,i=a,n=s,o=u,d=r,Z=h,n>-1&&b(),d>-1&&(r=setInterval((()=>{G()}),1e3*d))},b=()=>t(void 0,void 0,void 0,(function*(){var c;if(!l||!e||!o)return;const d="opIFrame";const a=document.getElementById(le);(null===(c=null==a?void 0:a.contentDocument)||void 0===c?void 0:c.getElementById(d)).src=l+"?client_id="+e+"&redirect_uri="+o,s=setInterval((function(){var n;return t(this,void 0,void 0,(function*(){const t=yield i();if(Boolean(e)&&Boolean(t)){const i=`${e} ${t}`,o=document.getElementById(le),c=(null===(n=null==o?void 0:o.contentDocument)||void 0===n?void 0:n.getElementById(d)).contentWindow;null==c||c.postMessage(i,l)}}))}),1e3*n),p()})),m=()=>{clearInterval(s),clearInterval(undefined)},p=()=>{null===window||void 0===window||window.addEventListener("message",(function(e){var i;return t(this,void 0,void 0,(function*(){const t=l;!t||(null==t?void 0:t.indexOf(e.origin))<0||(null===(i=null==e?void 0:e.data)||void 0===i?void 0:i.type)===$||"unchanged"===e.data||("error"===e.data?window.location.href=yield a():"changed"===e.data&&G())}))}),!1)},G=()=>t(void 0,void 0,void 0,(function*(){var e;const t=document.getElementById(le),l=null===(e=null==t?void 0:t.contentDocument)||void 0===e?void 0:e.getElementById(ie);if(me.canSendPromptNoneRequest()){me.setPromptNoneRequestSent(!0);const e=t=>{var l,i,n;(null===(l=null==t?void 0:t.data)||void 0===l?void 0:l.type)===$&&(u(null!==(n=null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.data)&&void 0!==n?n:""),null===window||void 0===window||window.removeEventListener("message",e))};r!==he.BrowserMemory&&r!==he.WebWorker||null===window||void 0===window||window.addEventListener("message",e);const t=yield Z({prompt:"none",response_mode:"query",state:ne});l.src=t}})),y=e=>t(void 0,void 0,void 0,(function*(){var t,l;const i=new URL(window.location.href).searchParams.get(ue),n=new URL(window.location.href).searchParams.get(c),o=window.parent.parent;if(null!==i&&(i.includes(ne)||i.includes(oe))){const c=new URL(window.location.href).searchParams.get("code");if(null!==c&&0!==c.length){if(i.includes(oe)){const e={data:{code:c,sessionState:null!=n?n:"",state:i},type:A};return sessionStorage.setItem(ce,"false"),o.postMessage(e,o.origin),me.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield me.waitTillPageRedirect(),!0}const d=new URL(window.location.href).searchParams.get("session_state");if(r===he.LocalStorage||r===he.SessionStorage)e&&(yield e(d));else{const e={data:null!=d?d:"",type:$};null===(l=null===(t=null===window||void 0===window?void 0:window.parent)||void 0===t?void 0:t.parent)||void 0===l||l.postMessage(e)}return me.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield me.waitTillPageRedirect(),!0}{if(i.includes(oe)){const e={type:_};return window.parent.parent.postMessage(e,o.origin),me.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield me.waitTillPageRedirect(),!0}me.setPromptNoneRequestSent(!1);const e=yield a();return yield X.clearUserSessionData(),o.location.href=e,window.location.href="about:blank",yield me.waitTillPageRedirect(),!0}}return!1}));return(e,l,i)=>t(void 0,void 0,void 0,(function*(){var t;let n=document.createElement("iframe");n.setAttribute("id",le),n.style.display="none";let o=!1;n.onload=()=>{var e,t,l,i;n=document.getElementById(le);const c=null==n?void 0:n.contentDocument,d=null==c?void 0:c.createElement("iframe");d&&(d.setAttribute("id","opIFrame"),d.style.display="none");const a=null==c?void 0:c.createElement("iframe");a&&(a.setAttribute("id",ie),a.style.display="none"),d&&(null===(t=null===(e=null==n?void 0:n.contentDocument)||void 0===e?void 0:e.body)||void 0===t||t.appendChild(d)),a&&(null===(i=null===(l=null==n?void 0:n.contentDocument)||void 0===l?void 0:l.body)||void 0===i||i.appendChild(a)),o=!0},null===(t=null===document||void 0===document?void 0:document.body)||void 0===t||t.appendChild(n),a=e,r=l,u=i;for(;!1===o;)yield new Promise((e=>setTimeout(e,1)));return{initialize:h,receivePromptNoneResponse:y,reset:m}}))})();var ye="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function We(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Ve(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(l){var i=Object.getOwnPropertyDescriptor(e,l);Object.defineProperty(t,l,i.get?i:{enumerable:!0,get:function(){return e[l]}})})),t}var Ie,Re={exports:{}},Se=function(e,t){return function(){return e.apply(t,arguments)}},ge=Se,ve=Object.prototype.toString,Ye=(Ie=Object.create(null),function(e){var t=ve.call(e);return Ie[t]||(Ie[t]=t.slice(8,-1).toLowerCase())});function Ke(e){return e=e.toLowerCase(),function(t){return Ye(t)===e}}function Je(e){return Array.isArray(e)}function fe(e){return void 0===e}var Ne=Ke("ArrayBuffer");function ke(e){return"number"==typeof e}function Ce(e){return null!==e&&"object"==typeof e}function Le(e){if("object"!==Ye(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}var He=Ke("Date"),Ue=Ke("File"),Te=Ke("Blob"),Fe=Ke("FileList");function we(e){return"[object Function]"===ve.call(e)}var xe=Ke("URLSearchParams");function ze(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),Je(e))for(var l=0,i=e.length;l<i;l++)t.call(null,e[l],l,e);else for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.call(null,e[n],n,e)}var Be,Pe=(Be="undefined"!=typeof Uint8Array&&Object.getPrototypeOf(Uint8Array),function(e){return Be&&e instanceof Be});var Me,je=Ke("HTMLFormElement"),Qe=(Me=Object.prototype.hasOwnProperty,function(e,t){return Me.call(e,t)}),Ee={isArray:Je,isArrayBuffer:Ne,isBuffer:function(e){return null!==e&&!fe(e)&&null!==e.constructor&&!fe(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){var t="[object FormData]";return e&&("function"==typeof FormData&&e instanceof FormData||ve.call(e)===t||we(e.toString)&&e.toString()===t)},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&Ne(e.buffer)},isString:function(e){return"string"==typeof e},isNumber:ke,isObject:Ce,isPlainObject:Le,isEmptyObject:function(e){return e&&0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype},isUndefined:fe,isDate:He,isFile:Ue,isBlob:Te,isFunction:we,isStream:function(e){return Ce(e)&&we(e.pipe)},isURLSearchParams:xe,isStandardBrowserEnv:function(){var e;return("undefined"==typeof navigator||"ReactNative"!==(e=navigator.product)&&"NativeScript"!==e&&"NS"!==e)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:ze,merge:function e(){var t={};function l(l,i){Le(t[i])&&Le(l)?t[i]=e(t[i],l):Le(l)?t[i]=e({},l):Je(l)?t[i]=l.slice():t[i]=l}for(var i=0,n=arguments.length;i<n;i++)ze(arguments[i],l);return t},extend:function(e,t,l){return ze(t,(function(t,i){e[i]=l&&"function"==typeof t?ge(t,l):t})),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,l,i){e.prototype=Object.create(t.prototype,i),e.prototype.constructor=e,l&&Object.assign(e.prototype,l)},toFlatObject:function(e,t,l,i){var n,o,c,d={};if(t=t||{},null==e)return t;do{for(o=(n=Object.getOwnPropertyNames(e)).length;o-- >0;)c=n[o],i&&!i(c,e,t)||d[c]||(t[c]=e[c],d[c]=!0);e=!1!==l&&Object.getPrototypeOf(e)}while(e&&(!l||l(e,t))&&e!==Object.prototype);return t},kindOf:Ye,kindOfTest:Ke,endsWith:function(e,t,l){e=String(e),(void 0===l||l>e.length)&&(l=e.length),l-=t.length;var i=e.indexOf(t,l);return-1!==i&&i===l},toArray:function(e){if(!e)return null;if(Je(e))return e;var t=e.length;if(!ke(t))return null;for(var l=new Array(t);t-- >0;)l[t]=e[t];return l},isTypedArray:Pe,isFileList:Fe,forEachEntry:function(e,t){for(var l,i=(e&&e[Symbol.iterator]).call(e);(l=i.next())&&!l.done;){var n=l.value;t.call(e,n[0],n[1])}},matchAll:function(e,t){for(var l,i=[];null!==(l=e.exec(t));)i.push(l);return i},isHTMLForm:je,hasOwnProperty:Qe},De="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},Oe=[],Ae=[],_e="undefined"!=typeof Uint8Array?Uint8Array:Array,qe=!1;function $e(){qe=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,l=e.length;t<l;++t)Oe[t]=e[t],Ae[e.charCodeAt(t)]=t;Ae["-".charCodeAt(0)]=62,Ae["_".charCodeAt(0)]=63}function et(e,t,l){for(var i,n,o=[],c=t;c<l;c+=3)i=(e[c]<<16)+(e[c+1]<<8)+e[c+2],o.push(Oe[(n=i)>>18&63]+Oe[n>>12&63]+Oe[n>>6&63]+Oe[63&n]);return o.join("")}function tt(e){var t;qe||$e();for(var l=e.length,i=l%3,n="",o=[],c=16383,d=0,a=l-i;d<a;d+=c)o.push(et(e,d,d+c>a?a:d+c));return 1===i?(t=e[l-1],n+=Oe[t>>2],n+=Oe[t<<4&63],n+="=="):2===i&&(t=(e[l-2]<<8)+e[l-1],n+=Oe[t>>10],n+=Oe[t>>4&63],n+=Oe[t<<2&63],n+="="),o.push(n),o.join("")}function lt(e,t,l,i,n){var o,c,d=8*n-i-1,a=(1<<d)-1,s=a>>1,r=-7,u=l?n-1:0,Z=l?-1:1,h=e[t+u];for(u+=Z,o=h&(1<<-r)-1,h>>=-r,r+=d;r>0;o=256*o+e[t+u],u+=Z,r-=8);for(c=o&(1<<-r)-1,o>>=-r,r+=i;r>0;c=256*c+e[t+u],u+=Z,r-=8);if(0===o)o=1-s;else{if(o===a)return c?NaN:1/0*(h?-1:1);c+=Math.pow(2,i),o-=s}return(h?-1:1)*c*Math.pow(2,o-i)}function it(e,t,l,i,n,o){var c,d,a,s=8*o-n-1,r=(1<<s)-1,u=r>>1,Z=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,h=i?0:o-1,b=i?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(d=isNaN(t)?1:0,c=r):(c=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-c))<1&&(c--,a*=2),(t+=c+u>=1?Z/a:Z*Math.pow(2,1-u))*a>=2&&(c++,a/=2),c+u>=r?(d=0,c=r):c+u>=1?(d=(t*a-1)*Math.pow(2,n),c+=u):(d=t*Math.pow(2,u-1)*Math.pow(2,n),c=0));n>=8;e[l+h]=255&d,h+=b,d/=256,n-=8);for(c=c<<n|d,s+=n;s>0;e[l+h]=255&c,h+=b,c/=256,s-=8);e[l+h-b]|=128*m}var nt={}.toString,ot=Array.isArray||function(e){return"[object Array]"==nt.call(e)};st.TYPED_ARRAY_SUPPORT=void 0===De.TYPED_ARRAY_SUPPORT||De.TYPED_ARRAY_SUPPORT;var ct=dt();function dt(){return st.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function at(e,t){if(dt()<t)throw new RangeError("Invalid typed array length");return st.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=st.prototype:(null===e&&(e=new st(t)),e.length=t),e}function st(e,t,l){if(!(st.TYPED_ARRAY_SUPPORT||this instanceof st))return new st(e,t,l);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return Zt(this,e)}return rt(this,e,t,l)}function rt(e,t,l,i){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,l,i){if(t.byteLength,l<0||t.byteLength<l)throw new RangeError("'offset' is out of bounds");if(t.byteLength<l+(i||0))throw new RangeError("'length' is out of bounds");t=void 0===l&&void 0===i?new Uint8Array(t):void 0===i?new Uint8Array(t,l):new Uint8Array(t,l,i);st.TYPED_ARRAY_SUPPORT?(e=t).__proto__=st.prototype:e=ht(e,t);return e}(e,t,l,i):"string"==typeof t?function(e,t,l){"string"==typeof l&&""!==l||(l="utf8");if(!st.isEncoding(l))throw new TypeError('"encoding" must be a valid string encoding');var i=0|pt(t,l),n=(e=at(e,i)).write(t,l);n!==i&&(e=e.slice(0,n));return e}(e,t,l):function(e,t){if(mt(t)){var l=0|bt(t.length);return 0===(e=at(e,l)).length||t.copy(e,0,0,l),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(i=t.length)!=i?at(e,0):ht(e,t);if("Buffer"===t.type&&ot(t.data))return ht(e,t.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function ut(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function Zt(e,t){if(ut(t),e=at(e,t<0?0:0|bt(t)),!st.TYPED_ARRAY_SUPPORT)for(var l=0;l<t;++l)e[l]=0;return e}function ht(e,t){var l=t.length<0?0:0|bt(t.length);e=at(e,l);for(var i=0;i<l;i+=1)e[i]=255&t[i];return e}function bt(e){if(e>=dt())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+dt().toString(16)+" bytes");return 0|e}function mt(e){return!(null==e||!e._isBuffer)}function pt(e,t){if(mt(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var l=e.length;if(0===l)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return l;case"utf8":case"utf-8":case void 0:return Pt(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*l;case"hex":return l>>>1;case"base64":return Mt(e).length;default:if(i)return Pt(e).length;t=(""+t).toLowerCase(),i=!0}}function Gt(e,t,l){var i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===l||l>this.length)&&(l=this.length),l<=0)return"";if((l>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return kt(this,t,l);case"utf8":case"utf-8":return Kt(this,t,l);case"ascii":return ft(this,t,l);case"latin1":case"binary":return Nt(this,t,l);case"base64":return Yt(this,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ct(this,t,l);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function Xt(e,t,l){var i=e[t];e[t]=e[l],e[l]=i}function yt(e,t,l,i,n){if(0===e.length)return-1;if("string"==typeof l?(i=l,l=0):l>2147483647?l=2147483647:l<-2147483648&&(l=-2147483648),l=+l,isNaN(l)&&(l=n?0:e.length-1),l<0&&(l=e.length+l),l>=e.length){if(n)return-1;l=e.length-1}else if(l<0){if(!n)return-1;l=0}if("string"==typeof t&&(t=st.from(t,i)),mt(t))return 0===t.length?-1:Wt(e,t,l,i,n);if("number"==typeof t)return t&=255,st.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,l):Uint8Array.prototype.lastIndexOf.call(e,t,l):Wt(e,[t],l,i,n);throw new TypeError("val must be string, number or Buffer")}function Wt(e,t,l,i,n){var o,c=1,d=e.length,a=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;c=2,d/=2,a/=2,l/=2}function s(e,t){return 1===c?e[t]:e.readUInt16BE(t*c)}if(n){var r=-1;for(o=l;o<d;o++)if(s(e,o)===s(t,-1===r?0:o-r)){if(-1===r&&(r=o),o-r+1===a)return r*c}else-1!==r&&(o-=o-r),r=-1}else for(l+a>d&&(l=d-a),o=l;o>=0;o--){for(var u=!0,Z=0;Z<a;Z++)if(s(e,o+Z)!==s(t,Z)){u=!1;break}if(u)return o}return-1}function Vt(e,t,l,i){l=Number(l)||0;var n=e.length-l;i?(i=Number(i))>n&&(i=n):i=n;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");i>o/2&&(i=o/2);for(var c=0;c<i;++c){var d=parseInt(t.substr(2*c,2),16);if(isNaN(d))return c;e[l+c]=d}return c}function It(e,t,l,i){return jt(Pt(t,e.length-l),e,l,i)}function Rt(e,t,l,i){return jt(function(e){for(var t=[],l=0;l<e.length;++l)t.push(255&e.charCodeAt(l));return t}(t),e,l,i)}function St(e,t,l,i){return Rt(e,t,l,i)}function gt(e,t,l,i){return jt(Mt(t),e,l,i)}function vt(e,t,l,i){return jt(function(e,t){for(var l,i,n,o=[],c=0;c<e.length&&!((t-=2)<0);++c)i=(l=e.charCodeAt(c))>>8,n=l%256,o.push(n),o.push(i);return o}(t,e.length-l),e,l,i)}function Yt(e,t,l){return 0===t&&l===e.length?tt(e):tt(e.slice(t,l))}function Kt(e,t,l){l=Math.min(e.length,l);for(var i=[],n=t;n<l;){var o,c,d,a,s=e[n],r=null,u=s>239?4:s>223?3:s>191?2:1;if(n+u<=l)switch(u){case 1:s<128&&(r=s);break;case 2:128==(192&(o=e[n+1]))&&(a=(31&s)<<6|63&o)>127&&(r=a);break;case 3:o=e[n+1],c=e[n+2],128==(192&o)&&128==(192&c)&&(a=(15&s)<<12|(63&o)<<6|63&c)>2047&&(a<55296||a>57343)&&(r=a);break;case 4:o=e[n+1],c=e[n+2],d=e[n+3],128==(192&o)&&128==(192&c)&&128==(192&d)&&(a=(15&s)<<18|(63&o)<<12|(63&c)<<6|63&d)>65535&&a<1114112&&(r=a)}null===r?(r=65533,u=1):r>65535&&(r-=65536,i.push(r>>>10&1023|55296),r=56320|1023&r),i.push(r),n+=u}return function(e){var t=e.length;if(t<=Jt)return String.fromCharCode.apply(String,e);var l="",i=0;for(;i<t;)l+=String.fromCharCode.apply(String,e.slice(i,i+=Jt));return l}(i)}st.poolSize=8192,st._augment=function(e){return e.__proto__=st.prototype,e},st.from=function(e,t,l){return rt(null,e,t,l)},st.TYPED_ARRAY_SUPPORT&&(st.prototype.__proto__=Uint8Array.prototype,st.__proto__=Uint8Array),st.alloc=function(e,t,l){return function(e,t,l,i){return ut(t),t<=0?at(e,t):void 0!==l?"string"==typeof i?at(e,t).fill(l,i):at(e,t).fill(l):at(e,t)}(null,e,t,l)},st.allocUnsafe=function(e){return Zt(null,e)},st.allocUnsafeSlow=function(e){return Zt(null,e)},st.isBuffer=Qt,st.compare=function(e,t){if(!mt(e)||!mt(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var l=e.length,i=t.length,n=0,o=Math.min(l,i);n<o;++n)if(e[n]!==t[n]){l=e[n],i=t[n];break}return l<i?-1:i<l?1:0},st.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},st.concat=function(e,t){if(!ot(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return st.alloc(0);var l;if(void 0===t)for(t=0,l=0;l<e.length;++l)t+=e[l].length;var i=st.allocUnsafe(t),n=0;for(l=0;l<e.length;++l){var o=e[l];if(!mt(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(i,n),n+=o.length}return i},st.byteLength=pt,st.prototype._isBuffer=!0,st.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)Xt(this,t,t+1);return this},st.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)Xt(this,t,t+3),Xt(this,t+1,t+2);return this},st.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)Xt(this,t,t+7),Xt(this,t+1,t+6),Xt(this,t+2,t+5),Xt(this,t+3,t+4);return this},st.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?Kt(this,0,e):Gt.apply(this,arguments)},st.prototype.equals=function(e){if(!mt(e))throw new TypeError("Argument must be a Buffer");return this===e||0===st.compare(this,e)},st.prototype.inspect=function(){var e="";return this.length>0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),"<Buffer "+e+">"},st.prototype.compare=function(e,t,l,i,n){if(!mt(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===l&&(l=e?e.length:0),void 0===i&&(i=0),void 0===n&&(n=this.length),t<0||l>e.length||i<0||n>this.length)throw new RangeError("out of range index");if(i>=n&&t>=l)return 0;if(i>=n)return-1;if(t>=l)return 1;if(this===e)return 0;for(var o=(n>>>=0)-(i>>>=0),c=(l>>>=0)-(t>>>=0),d=Math.min(o,c),a=this.slice(i,n),s=e.slice(t,l),r=0;r<d;++r)if(a[r]!==s[r]){o=a[r],c=s[r];break}return o<c?-1:c<o?1:0},st.prototype.includes=function(e,t,l){return-1!==this.indexOf(e,t,l)},st.prototype.indexOf=function(e,t,l){return yt(this,e,t,l,!0)},st.prototype.lastIndexOf=function(e,t,l){return yt(this,e,t,l,!1)},st.prototype.write=function(e,t,l,i){if(void 0===t)i="utf8",l=this.length,t=0;else if(void 0===l&&"string"==typeof t)i=t,l=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(l)?(l|=0,void 0===i&&(i="utf8")):(i=l,l=void 0)}var n=this.length-t;if((void 0===l||l>n)&&(l=n),e.length>0&&(l<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var o=!1;;)switch(i){case"hex":return Vt(this,e,t,l);case"utf8":case"utf-8":return It(this,e,t,l);case"ascii":return Rt(this,e,t,l);case"latin1":case"binary":return St(this,e,t,l);case"base64":return gt(this,e,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return vt(this,e,t,l);default:if(o)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),o=!0}},st.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var Jt=4096;function ft(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(127&e[n]);return i}function Nt(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(e[n]);return i}function kt(e,t,l){var i=e.length;(!t||t<0)&&(t=0),(!l||l<0||l>i)&&(l=i);for(var n="",o=t;o<l;++o)n+=Bt(e[o]);return n}function Ct(e,t,l){for(var i=e.slice(t,l),n="",o=0;o<i.length;o+=2)n+=String.fromCharCode(i[o]+256*i[o+1]);return n}function Lt(e,t,l){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>l)throw new RangeError("Trying to access beyond buffer length")}function Ht(e,t,l,i,n,o){if(!mt(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||t<o)throw new RangeError('"value" argument is out of bounds');if(l+i>e.length)throw new RangeError("Index out of range")}function Ut(e,t,l,i){t<0&&(t=65535+t+1);for(var n=0,o=Math.min(e.length-l,2);n<o;++n)e[l+n]=(t&255<<8*(i?n:1-n))>>>8*(i?n:1-n)}function Tt(e,t,l,i){t<0&&(t=4294967295+t+1);for(var n=0,o=Math.min(e.length-l,4);n<o;++n)e[l+n]=t>>>8*(i?n:3-n)&255}function Ft(e,t,l,i,n,o){if(l+i>e.length)throw new RangeError("Index out of range");if(l<0)throw new RangeError("Index out of range")}function wt(e,t,l,i,n){return n||Ft(e,0,l,4),it(e,t,l,i,23,4),l+4}function xt(e,t,l,i,n){return n||Ft(e,0,l,8),it(e,t,l,i,52,8),l+8}st.prototype.slice=function(e,t){var l,i=this.length;if((e=~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),(t=void 0===t?i:~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),t<e&&(t=e),st.TYPED_ARRAY_SUPPORT)(l=this.subarray(e,t)).__proto__=st.prototype;else{var n=t-e;l=new st(n,void 0);for(var o=0;o<n;++o)l[o]=this[o+e]}return l},st.prototype.readUIntLE=function(e,t,l){e|=0,t|=0,l||Lt(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i},st.prototype.readUIntBE=function(e,t,l){e|=0,t|=0,l||Lt(e,t,this.length);for(var i=this[e+--t],n=1;t>0&&(n*=256);)i+=this[e+--t]*n;return i},st.prototype.readUInt8=function(e,t){return t||Lt(e,1,this.length),this[e]},st.prototype.readUInt16LE=function(e,t){return t||Lt(e,2,this.length),this[e]|this[e+1]<<8},st.prototype.readUInt16BE=function(e,t){return t||Lt(e,2,this.length),this[e]<<8|this[e+1]},st.prototype.readUInt32LE=function(e,t){return t||Lt(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},st.prototype.readUInt32BE=function(e,t){return t||Lt(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},st.prototype.readIntLE=function(e,t,l){e|=0,t|=0,l||Lt(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i>=(n*=128)&&(i-=Math.pow(2,8*t)),i},st.prototype.readIntBE=function(e,t,l){e|=0,t|=0,l||Lt(e,t,this.length);for(var i=t,n=1,o=this[e+--i];i>0&&(n*=256);)o+=this[e+--i]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*t)),o},st.prototype.readInt8=function(e,t){return t||Lt(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},st.prototype.readInt16LE=function(e,t){t||Lt(e,2,this.length);var l=this[e]|this[e+1]<<8;return 32768&l?4294901760|l:l},st.prototype.readInt16BE=function(e,t){t||Lt(e,2,this.length);var l=this[e+1]|this[e]<<8;return 32768&l?4294901760|l:l},st.prototype.readInt32LE=function(e,t){return t||Lt(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},st.prototype.readInt32BE=function(e,t){return t||Lt(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},st.prototype.readFloatLE=function(e,t){return t||Lt(e,4,this.length),lt(this,e,!0,23,4)},st.prototype.readFloatBE=function(e,t){return t||Lt(e,4,this.length),lt(this,e,!1,23,4)},st.prototype.readDoubleLE=function(e,t){return t||Lt(e,8,this.length),lt(this,e,!0,52,8)},st.prototype.readDoubleBE=function(e,t){return t||Lt(e,8,this.length),lt(this,e,!1,52,8)},st.prototype.writeUIntLE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||Ht(this,e,t,l,Math.pow(2,8*l)-1,0);var n=1,o=0;for(this[t]=255&e;++o<l&&(n*=256);)this[t+o]=e/n&255;return t+l},st.prototype.writeUIntBE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||Ht(this,e,t,l,Math.pow(2,8*l)-1,0);var n=l-1,o=1;for(this[t+n]=255&e;--n>=0&&(o*=256);)this[t+n]=e/o&255;return t+l},st.prototype.writeUInt8=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,1,255,0),st.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},st.prototype.writeUInt16LE=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,2,65535,0),st.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Ut(this,e,t,!0),t+2},st.prototype.writeUInt16BE=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,2,65535,0),st.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Ut(this,e,t,!1),t+2},st.prototype.writeUInt32LE=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,4,4294967295,0),st.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):Tt(this,e,t,!0),t+4},st.prototype.writeUInt32BE=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,4,4294967295,0),st.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Tt(this,e,t,!1),t+4},st.prototype.writeIntLE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);Ht(this,e,t,l,n-1,-n)}var o=0,c=1,d=0;for(this[t]=255&e;++o<l&&(c*=256);)e<0&&0===d&&0!==this[t+o-1]&&(d=1),this[t+o]=(e/c>>0)-d&255;return t+l},st.prototype.writeIntBE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);Ht(this,e,t,l,n-1,-n)}var o=l-1,c=1,d=0;for(this[t+o]=255&e;--o>=0&&(c*=256);)e<0&&0===d&&0!==this[t+o+1]&&(d=1),this[t+o]=(e/c>>0)-d&255;return t+l},st.prototype.writeInt8=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,1,127,-128),st.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},st.prototype.writeInt16LE=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,2,32767,-32768),st.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Ut(this,e,t,!0),t+2},st.prototype.writeInt16BE=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,2,32767,-32768),st.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Ut(this,e,t,!1),t+2},st.prototype.writeInt32LE=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,4,2147483647,-2147483648),st.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):Tt(this,e,t,!0),t+4},st.prototype.writeInt32BE=function(e,t,l){return e=+e,t|=0,l||Ht(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),st.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Tt(this,e,t,!1),t+4},st.prototype.writeFloatLE=function(e,t,l){return wt(this,e,t,!0,l)},st.prototype.writeFloatBE=function(e,t,l){return wt(this,e,t,!1,l)},st.prototype.writeDoubleLE=function(e,t,l){return xt(this,e,t,!0,l)},st.prototype.writeDoubleBE=function(e,t,l){return xt(this,e,t,!1,l)},st.prototype.copy=function(e,t,l,i){if(l||(l=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<l&&(i=l),i===l)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(l<0||l>=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-l&&(i=e.length-t+l);var n,o=i-l;if(this===e&&l<t&&t<i)for(n=o-1;n>=0;--n)e[n+t]=this[n+l];else if(o<1e3||!st.TYPED_ARRAY_SUPPORT)for(n=0;n<o;++n)e[n+t]=this[n+l];else Uint8Array.prototype.set.call(e,this.subarray(l,l+o),t);return o},st.prototype.fill=function(e,t,l,i){if("string"==typeof e){if("string"==typeof t?(i=t,t=0,l=this.length):"string"==typeof l&&(i=l,l=this.length),1===e.length){var n=e.charCodeAt(0);n<256&&(e=n)}if(void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!st.isEncoding(i))throw new TypeError("Unknown encoding: "+i)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<l)throw new RangeError("Out of range index");if(l<=t)return this;var o;if(t>>>=0,l=void 0===l?this.length:l>>>0,e||(e=0),"number"==typeof e)for(o=t;o<l;++o)this[o]=e;else{var c=mt(e)?e:Pt(new st(e,i).toString()),d=c.length;for(o=0;o<l-t;++o)this[o+t]=c[o%d]}return this};var zt=/[^+\/0-9A-Za-z-_]/g;function Bt(e){return e<16?"0"+e.toString(16):e.toString(16)}function Pt(e,t){var l;t=t||1/0;for(var i=e.length,n=null,o=[],c=0;c<i;++c){if((l=e.charCodeAt(c))>55295&&l<57344){if(!n){if(l>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(c+1===i){(t-=3)>-1&&o.push(239,191,189);continue}n=l;continue}if(l<56320){(t-=3)>-1&&o.push(239,191,189),n=l;continue}l=65536+(n-55296<<10|l-56320)}else n&&(t-=3)>-1&&o.push(239,191,189);if(n=null,l<128){if((t-=1)<0)break;o.push(l)}else if(l<2048){if((t-=2)<0)break;o.push(l>>6|192,63&l|128)}else if(l<65536){if((t-=3)<0)break;o.push(l>>12|224,l>>6&63|128,63&l|128)}else{if(!(l<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(l>>18|240,l>>12&63|128,l>>6&63|128,63&l|128)}}return o}function Mt(e){return function(e){var t,l,i,n,o,c;qe||$e();var d=e.length;if(d%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===e[d-2]?2:"="===e[d-1]?1:0,c=new _e(3*d/4-o),i=o>0?d-4:d;var a=0;for(t=0,l=0;t<i;t+=4,l+=3)n=Ae[e.charCodeAt(t)]<<18|Ae[e.charCodeAt(t+1)]<<12|Ae[e.charCodeAt(t+2)]<<6|Ae[e.charCodeAt(t+3)],c[a++]=n>>16&255,c[a++]=n>>8&255,c[a++]=255&n;return 2===o?(n=Ae[e.charCodeAt(t)]<<2|Ae[e.charCodeAt(t+1)]>>4,c[a++]=255&n):1===o&&(n=Ae[e.charCodeAt(t)]<<10|Ae[e.charCodeAt(t+1)]<<4|Ae[e.charCodeAt(t+2)]>>2,c[a++]=n>>8&255,c[a++]=255&n),c}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(zt,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function jt(e,t,l,i){for(var n=0;n<i&&!(n+l>=t.length||n>=e.length);++n)t[n+l]=e[n];return n}function Qt(e){return null!=e&&(!!e._isBuffer||Et(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&Et(e.slice(0,0))}(e))}function Et(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var Dt=Object.freeze({__proto__:null,Buffer:st,INSPECT_MAX_BYTES:50,SlowBuffer:function(e){return+e!=e&&(e=0),st.alloc(+e)},isBuffer:Qt,kMaxLength:ct}),Ot=Ee;function At(e,t,l,i,n){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),l&&(this.config=l),i&&(this.request=i),n&&(this.response=n)}Ot.inherits(At,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var _t=At.prototype,qt={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){qt[e]={value:e}})),Object.defineProperties(At,qt),Object.defineProperty(_t,"isAxiosError",{value:!0}),At.from=function(e,t,l,i,n,o){var c=Object.create(_t);return Ot.toFlatObject(e,c,(function(e){return e!==Error.prototype})),At.call(c,e.message,t,l,i,n),c.cause=e,c.name=e.name,o&&Object.assign(c,o),c};var $t=At,el="object"==typeof self?self.FormData:window.FormData,tl=Ee,ll=$t,il=el;function nl(e){return tl.isPlainObject(e)||tl.isArray(e)}function ol(e){return tl.endsWith(e,"[]")?e.slice(0,-2):e}function cl(e,t,l){return e?e.concat(t).map((function(e,t){return e=ol(e),!l&&t?"["+e+"]":e})).join(l?".":""):t}var dl=tl.toFlatObject(tl,{},null,(function(e){return/^is[A-Z]/.test(e)}));var al=function(e,t,l){if(!tl.isObject(e))throw new TypeError("target must be an object");t=t||new(il||FormData);var i,n=(l=tl.toFlatObject(l,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!tl.isUndefined(t[e])}))).metaTokens,o=l.visitor||r,c=l.dots,d=l.indexes,a=(l.Blob||"undefined"!=typeof Blob&&Blob)&&((i=t)&&tl.isFunction(i.append)&&"FormData"===i[Symbol.toStringTag]&&i[Symbol.iterator]);if(!tl.isFunction(o))throw new TypeError("visitor must be a function");function s(e){if(null===e)return"";if(tl.isDate(e))return e.toISOString();if(!a&&tl.isBlob(e))throw new ll("Blob is not supported. Use a Buffer instead.");return tl.isArrayBuffer(e)||tl.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):st.from(e):e}function r(e,l,i){var o=e;if(e&&!i&&"object"==typeof e)if(tl.endsWith(l,"{}"))l=n?l:l.slice(0,-2),e=JSON.stringify(e);else if(tl.isArray(e)&&function(e){return tl.isArray(e)&&!e.some(nl)}(e)||tl.isFileList(e)||tl.endsWith(l,"[]")&&(o=tl.toArray(e)))return l=ol(l),o.forEach((function(e,i){!tl.isUndefined(e)&&null!==e&&t.append(!0===d?cl([l],i,c):null===d?l:l+"[]",s(e))})),!1;return!!nl(e)||(t.append(cl(i,l,c),s(e)),!1)}var u=[],Z=Object.assign(dl,{defaultVisitor:r,convertValue:s,isVisitable:nl});if(!tl.isObject(e))throw new TypeError("data must be an object");return function e(l,i){if(!tl.isUndefined(l)){if(-1!==u.indexOf(l))throw Error("Circular reference detected in "+i.join("."));u.push(l),tl.forEach(l,(function(l,n){!0===(!(tl.isUndefined(l)||null===l)&&o.call(t,l,tl.isString(n)?n.trim():n,i,Z))&&e(l,i?i.concat(n):[n])})),u.pop()}}(e),t},sl=al;function rl(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'\(\)~]|%20|%00/g,(function(e){return t[e]}))}function ul(e,t){this._pairs=[],e&&sl(e,this,t)}var Zl=ul.prototype;Zl.append=function(e,t){this._pairs.push([e,t])},Zl.toString=function(e){var t=e?function(t){return e.call(this,t,rl)}:rl;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var hl=ul,bl=Ee,ml=hl;function pl(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var Gl=function(e,t,l){if(!t)return e;var i=e.indexOf("#");-1!==i&&(e=e.slice(0,i));var n,o=l&&l.encode||pl,c=l&&l.serialize;return(n=c?c(t,l):bl.isURLSearchParams(t)?t.toString():new ml(t,l).toString(o))&&(e+=(-1===e.indexOf("?")?"?":"&")+n),e},Xl=Ee;function yl(){this.handlers=[]}yl.prototype.use=function(e,t,l){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!l&&l.synchronous,runWhen:l?l.runWhen:null}),this.handlers.length-1},yl.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},yl.prototype.clear=function(){this.handlers&&(this.handlers=[])},yl.prototype.forEach=function(e){Xl.forEach(this.handlers,(function(t){null!==t&&e(t)}))};var Wl=yl;function Vl(){throw new Error("setTimeout has not been defined")}function Il(){throw new Error("clearTimeout has not been defined")}var Rl=Vl,Sl=Il;function gl(e){if(Rl===setTimeout)return setTimeout(e,0);if((Rl===Vl||!Rl)&&setTimeout)return Rl=setTimeout,setTimeout(e,0);try{return Rl(e,0)}catch(t){try{return Rl.call(null,e,0)}catch(t){return Rl.call(this,e,0)}}}"function"==typeof De.setTimeout&&(Rl=setTimeout),"function"==typeof De.clearTimeout&&(Sl=clearTimeout);var vl,Yl=[],Kl=!1,Jl=-1;function fl(){Kl&&vl&&(Kl=!1,vl.length?Yl=vl.concat(Yl):Jl=-1,Yl.length&&Nl())}function Nl(){if(!Kl){var e=gl(fl);Kl=!0;for(var t=Yl.length;t;){for(vl=Yl,Yl=[];++Jl<t;)vl&&vl[Jl].run();Jl=-1,t=Yl.length}vl=null,Kl=!1,function(e){if(Sl===clearTimeout)return clearTimeout(e);if((Sl===Il||!Sl)&&clearTimeout)return Sl=clearTimeout,clearTimeout(e);try{Sl(e)}catch(t){try{return Sl.call(null,e)}catch(t){return Sl.call(this,e)}}}(e)}}function kl(e,t){this.fun=e,this.array=t}kl.prototype.run=function(){this.fun.apply(null,this.array)};function Cl(){}var Ll=Cl,Hl=Cl,Ul=Cl,Tl=Cl,Fl=Cl,wl=Cl,xl=Cl;var zl=De.performance||{},Bl=zl.now||zl.mozNow||zl.msNow||zl.oNow||zl.webkitNow||function(){return(new Date).getTime()};var Pl=new Date;var Ml={nextTick:function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var l=1;l<arguments.length;l++)t[l-1]=arguments[l];Yl.push(new kl(e,t)),1!==Yl.length||Kl||gl(Nl)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:Ll,addListener:Hl,once:Ul,off:Tl,removeListener:Fl,removeAllListeners:wl,emit:xl,binding:function(e){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(e){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(e){var t=.001*Bl.call(zl),l=Math.floor(t),i=Math.floor(t%1*1e9);return e&&(l-=e[0],(i-=e[1])<0&&(l--,i+=1e9)),[l,i]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-Pl)/1e3}},jl=Ml,Ql=Ee,El=function(e,t){Ql.forEach(e,(function(l,i){i!==t&&i.toUpperCase()===t.toUpperCase()&&(e[t]=l,delete e[i])}))},Dl={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Ol={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:hl,FormData:FormData,Blob:Blob},protocols:["http","https","file","blob","url","data"]},Al=Ee,_l=al,ql=Ol,$l=Ee;var ei=function(e){function t(e,l,i,n){var o=e[n++];if("__proto__"===o)return!0;var c=Number.isFinite(+o),d=n>=e.length;return o=!o&&$l.isArray(i)?i.length:o,d?($l.hasOwnProperty(i,o)?i[o]=[i[o],l]:i[o]=l,!c):(i[o]&&$l.isObject(i[o])||(i[o]=[]),t(e,l,i[o],n)&&$l.isArray(i[o])&&(i[o]=function(e){var t,l,i={},n=Object.keys(e),o=n.length;for(t=0;t<o;t++)i[l=n[t]]=e[l];return i}(i[o])),!c)}if($l.isFormData(e)&&$l.isFunction(e.entries)){var l={};return $l.forEachEntry(e,(function(e,i){t(function(e){return $l.matchAll(/\w+|\[(\w*)]/g,e).map((function(e){return"[]"===e[0]?"":e[1]||e[0]}))}(e),i,l,0)})),l}return null},ti=$t,li=Ee,ii=li.isStandardBrowserEnv()?{write:function(e,t,l,i,n,o){var c=[];c.push(e+"="+encodeURIComponent(t)),li.isNumber(l)&&c.push("expires="+new Date(l).toGMTString()),li.isString(i)&&c.push("path="+i),li.isString(n)&&c.push("domain="+n),!0===o&&c.push("secure"),document.cookie=c.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}},ni=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},oi=function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e},ci=function(e,t,l){var i=!ni(t);return e&&(i||!1===l)?oi(e,t):t},di=Ee,ai=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],si=Ee,ri=si.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),l=document.createElement("a");function i(e){var i=e;return t&&(l.setAttribute("href",i),i=l.href),l.setAttribute("href",i),{href:l.href,protocol:l.protocol?l.protocol.replace(/:$/,""):"",host:l.host,search:l.search?l.search.replace(/^\?/,""):"",hash:l.hash?l.hash.replace(/^#/,""):"",hostname:l.hostname,port:l.port,pathname:"/"===l.pathname.charAt(0)?l.pathname:"/"+l.pathname}}return e=i(window.location.href),function(t){var l=si.isString(t)?i(t):t;return l.protocol===e.protocol&&l.host===e.host}}():function(){return!0},ui=$t;function Zi(e,t,l){ui.call(this,null==e?"canceled":e,ui.ERR_CANCELED,t,l),this.name="CanceledError"}Ee.inherits(Zi,ui,{__CANCEL__:!0});var hi=Zi,bi=Ee,mi=function(e,t,l){var i=l.config.validateStatus;l.status&&i&&!i(l.status)?t(new ti("Request failed with status code "+l.status,[ti.ERR_BAD_REQUEST,ti.ERR_BAD_RESPONSE][Math.floor(l.status/100)-4],l.config,l.request,l)):e(l)},pi=ii,Gi=Gl,Xi=ci,yi=function(e){var t,l,i,n={};return e?(di.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=di.trim(e.slice(0,i)).toLowerCase(),l=di.trim(e.slice(i+1)),t){if(n[t]&&ai.indexOf(t)>=0)return;n[t]="set-cookie"===t?(n[t]?n[t]:[]).concat([l]):n[t]?n[t]+", "+l:l}})),n):n},Wi=ri,Vi=Dl,Ii=$t,Ri=hi,Si=function(e){var t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""},gi=Ol,vi=function(e){return new Promise((function(t,l){var i,n=e.data,o=e.headers,c=e.responseType,d=e.withXSRFToken;function a(){e.cancelToken&&e.cancelToken.unsubscribe(i),e.signal&&e.signal.removeEventListener("abort",i)}bi.isFormData(n)&&bi.isStandardBrowserEnv()&&delete o["Content-Type"];var s=new XMLHttpRequest;if(e.auth){var r=e.auth.username||"",u=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.Authorization="Basic "+btoa(r+":"+u)}var Z=Xi(e.baseURL,e.url,e.allowAbsoluteUrls);function h(){if(s){var i="getAllResponseHeaders"in s?yi(s.getAllResponseHeaders()):null,n={data:c&&"text"!==c&&"json"!==c?s.response:s.responseText,status:s.status,statusText:s.statusText,headers:i,config:e,request:s};mi((function(e){t(e),a()}),(function(e){l(e),a()}),n),s=null}}if(s.open(e.method.toUpperCase(),Gi(Z,e.params,e.paramsSerializer),!0),s.timeout=e.timeout,"onloadend"in s?s.onloadend=h:s.onreadystatechange=function(){s&&4===s.readyState&&(0!==s.status||s.responseURL&&0===s.responseURL.indexOf("file:"))&&setTimeout(h)},s.onabort=function(){s&&(l(new Ii("Request aborted",Ii.ECONNABORTED,e,s)),s=null)},s.onerror=function(){l(new Ii("Network Error",Ii.ERR_NETWORK,e,s)),s=null},s.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",i=e.transitional||Vi;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),l(new Ii(t,i.clarifyTimeoutError?Ii.ETIMEDOUT:Ii.ECONNABORTED,e,s)),s=null},bi.isStandardBrowserEnv()&&(d&&bi.isFunction(d)&&(d=d(e)),d||!1!==d&&Wi(Z))){var b=e.xsrfHeaderName&&e.xsrfCookieName&&pi.read(e.xsrfCookieName);b&&(o[e.xsrfHeaderName]=b)}"setRequestHeader"in s&&bi.forEach(o,(function(e,t){void 0===n&&"content-type"===t.toLowerCase()?delete o[t]:s.setRequestHeader(t,e)})),bi.isUndefined(e.withCredentials)||(s.withCredentials=!!e.withCredentials),c&&"json"!==c&&(s.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&s.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&s.upload&&s.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(i=function(t){s&&(l(!t||t.type?new Ri(null,e,s):t),s.abort(),s=null)},e.cancelToken&&e.cancelToken.subscribe(i),e.signal&&(e.signal.aborted?i():e.signal.addEventListener("abort",i))),n||!1===n||0===n||""===n||(n=null);var m=Si(Z);m&&-1===gi.protocols.indexOf(m)?l(new Ii("Unsupported protocol "+m+":",Ii.ERR_BAD_REQUEST,e)):s.send(n)}))},Yi=Ee,Ki=El,Ji=$t,fi=al,Ni=function(e,t){return _l(e,new ql.classes.URLSearchParams,Object.assign({visitor:function(e,t,l,i){return ql.isNode&&Al.isBuffer(e)?(this.append(t,e.toString("base64")),!1):i.defaultVisitor.apply(this,arguments)}},t))},ki=Ol,Ci=ei,Li={"Content-Type":"application/x-www-form-urlencoded"};function Hi(e,t){!Yi.isUndefined(e)&&Yi.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var Ui,Ti={transitional:Dl,adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==jl&&"[object process]"===Object.prototype.toString.call(jl))&&(Ui=vi),Ui),transformRequest:[function(e,t){Ki(t,"Accept"),Ki(t,"Content-Type");var l,i=t&&t["Content-Type"]||"",n=i.indexOf("application/json")>-1,o=Yi.isObject(e);if(o&&Yi.isHTMLForm(e)&&(e=new FormData(e)),Yi.isFormData(e))return n?JSON.stringify(Ci(e)):e;if(Yi.isArrayBuffer(e)||Yi.isBuffer(e)||Yi.isStream(e)||Yi.isFile(e)||Yi.isBlob(e))return e;if(Yi.isArrayBufferView(e))return e.buffer;if(Yi.isURLSearchParams(e))return Hi(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();if(o){if(-1!==i.indexOf("application/x-www-form-urlencoded"))return Ni(e,this.formSerializer).toString();if((l=Yi.isFileList(e))||i.indexOf("multipart/form-data")>-1){var c=this.env&&this.env.FormData;return fi(l?{"files[]":e}:e,c&&new c,this.formSerializer)}}return o||n?(Hi(t,"application/json"),function(e,t,l){if(Yi.isString(e))try{return(t||JSON.parse)(e),Yi.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(l||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||Ti.transitional,l=t&&t.forcedJSONParsing,i="json"===this.responseType;if(e&&Yi.isString(e)&&(l&&!this.responseType||i)){var n=!(t&&t.silentJSONParsing)&&i;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw Ji.from(e,Ji.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ki.classes.FormData,Blob:ki.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};Yi.forEach(["delete","get","head"],(function(e){Ti.headers[e]={}})),Yi.forEach(["post","put","patch"],(function(e){Ti.headers[e]=Yi.merge(Li)}));var Fi=Ti,wi=Ee,xi=Fi,zi=function(e){return!(!e||!e.__CANCEL__)},Bi=Ee,Pi=function(e,t,l,i){var n=this||xi;return wi.forEach(i,(function(i){e=i.call(n,e,t,l)})),e},Mi=zi,ji=Fi,Qi=hi,Ei=El;function Di(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Qi}var Oi=Ee,Ai=function(e,t){t=t||{};var l={};function i(e,t){return Oi.isPlainObject(e)&&Oi.isPlainObject(t)?Oi.merge(e,t):Oi.isEmptyObject(t)?Oi.merge({},e):Oi.isPlainObject(t)?Oi.merge({},t):Oi.isArray(t)?t.slice():t}function n(l){return Oi.isUndefined(t[l])?Oi.isUndefined(e[l])?void 0:i(void 0,e[l]):i(e[l],t[l])}function o(e){if(!Oi.isUndefined(t[e]))return i(void 0,t[e])}function c(l){return Oi.isUndefined(t[l])?Oi.isUndefined(e[l])?void 0:i(void 0,e[l]):i(void 0,t[l])}function d(l){return l in t?i(e[l],t[l]):l in e?i(void 0,e[l]):void 0}var a={url:o,method:o,data:o,baseURL:c,transformRequest:c,transformResponse:c,paramsSerializer:c,timeout:c,timeoutMessage:c,withCredentials:c,withXSRFToken:c,adapter:c,responseType:c,xsrfCookieName:c,xsrfHeaderName:c,onUploadProgress:c,onDownloadProgress:c,decompress:c,maxContentLength:c,maxBodyLength:c,beforeRedirect:c,transport:c,httpAgent:c,httpsAgent:c,cancelToken:c,socketPath:c,responseEncoding:c,validateStatus:d};return Oi.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=a[e]||n,i=t(e);Oi.isUndefined(i)&&t!==d||(l[e]=i)})),l},_i="0.30.0",qi=_i,$i=$t,en={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){en[e]=function(l){return typeof l===e||"a"+(t<1?"n ":" ")+e}}));var tn={};en.transitional=function(e,t,l){function i(e,t){return"[Axios v"+qi+"] Transitional option '"+e+"'"+t+(l?". "+l:"")}return function(l,n,o){if(!1===e)throw new $i(i(n," has been removed"+(t?" in "+t:"")),$i.ERR_DEPRECATED);return t&&!tn[n]&&(tn[n]=!0,console.warn(i(n," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(l,n,o)}};var ln={assertOptions:function(e,t,l){if("object"!=typeof e)throw new $i("options must be an object",$i.ERR_BAD_OPTION_VALUE);for(var i=Object.keys(e),n=i.length;n-- >0;){var o=i[n],c=t[o];if(c){var d=e[o],a=void 0===d||c(d,o,e);if(!0!==a)throw new $i("option "+o+" must be "+a,$i.ERR_BAD_OPTION_VALUE)}else if(!0!==l)throw new $i("Unknown option "+o,$i.ERR_BAD_OPTION)}},validators:en},nn=Ee,on=Gl,cn=Wl,dn=function(e){return Di(e),e.headers=e.headers||{},e.data=Pi.call(e,e.data,e.headers,null,e.transformRequest),Ei(e.headers,"Accept"),Ei(e.headers,"Content-Type"),e.headers=Bi.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),Bi.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||ji.adapter)(e).then((function(t){return Di(e),t.data=Pi.call(e,t.data,t.headers,t.status,e.transformResponse),t}),(function(t){return Mi(t)||(Di(e),t&&t.response&&(t.response.data=Pi.call(e,t.response.data,t.response.headers,t.response.status,e.transformResponse))),Promise.reject(t)}))},an=Ai,sn=ci,rn=ln,un=rn.validators;function Zn(e){this.defaults=e,this.interceptors={request:new cn,response:new cn}}Zn.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=an(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var l=t.transitional;void 0!==l&&rn.assertOptions(l,{silentJSONParsing:un.transitional(un.boolean),forcedJSONParsing:un.transitional(un.boolean),clarifyTimeoutError:un.transitional(un.boolean)},!1);var i=t.paramsSerializer;null!=i&&(nn.isFunction(i)?t.paramsSerializer={serialize:i}:rn.assertOptions(i,{encode:un.function,serialize:un.function},!0));var n=[],o=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(o=o&&e.synchronous,n.unshift(e.fulfilled,e.rejected))}));var c,d=[];if(this.interceptors.response.forEach((function(e){d.push(e.fulfilled,e.rejected)})),!o){var a=[dn,void 0];for(Array.prototype.unshift.apply(a,n),a=a.concat(d),c=Promise.resolve(t);a.length;)c=c.then(a.shift(),a.shift());return c}for(var s=t;n.length;){var r=n.shift(),u=n.shift();try{s=r(s)}catch(e){u(e);break}}try{c=dn(s)}catch(e){return Promise.reject(e)}for(;d.length;)c=c.then(d.shift(),d.shift());return c},Zn.prototype.getUri=function(e){e=an(this.defaults,e);var t=sn(e.baseURL,e.url,e.allowAbsoluteUrls);return on(t,e.params,e.paramsSerializer)},nn.forEach(["delete","get","head","options"],(function(e){Zn.prototype[e]=function(t,l){return this.request(an(l||{},{method:e,url:t,data:(l||{}).data}))}})),nn.forEach(["post","put","patch"],(function(e){function t(t){return function(l,i,n){return this.request(an(n||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:l,data:i}))}}Zn.prototype[e]=t(),Zn.prototype[e+"Form"]=t(!0)}));var hn=Zn,bn=hi;function mn(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var l=this;this.promise.then((function(e){if(l._listeners){for(var t=l._listeners.length;t-- >0;)l._listeners[t](e);l._listeners=null}})),this.promise.then=function(e){var t,i=new Promise((function(e){l.subscribe(e),t=e})).then(e);return i.cancel=function(){l.unsubscribe(t)},i},e((function(e,i,n){l.reason||(l.reason=new bn(e,i,n),t(l.reason))}))}mn.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},mn.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]},mn.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}},mn.source=function(){var e,t=new mn((function(t){e=t}));return{token:t,cancel:e}};var pn=mn,Gn=Ee,Xn=Ee,yn=Se,Wn=hn,Vn=Ai,In=ei;var Rn=function e(t){var l=new Wn(t),i=yn(Wn.prototype.request,l);return Xn.extend(i,Wn.prototype,l),Xn.extend(i,l),i.create=function(l){return e(Vn(t,l))},i}(Fi);Rn.Axios=Wn,Rn.CanceledError=hi,Rn.CancelToken=pn,Rn.isCancel=zi,Rn.VERSION=_i,Rn.toFormData=al,Rn.AxiosError=$t,Rn.Cancel=Rn.CanceledError,Rn.all=function(e){return Promise.all(e)},Rn.spread=function(e){return function(t){return e.apply(null,t)}},Rn.isAxiosError=function(e){return Gn.isObject(e)&&!0===e.isAxiosError},Rn.formToJSON=function(e){return In(Xn.isHTMLForm(e)?new FormData(e):e)},Re.exports=Rn,Re.exports.default=Rn;var Sn,gn=Re.exports;let vn=Sn=class{constructor(){this.attachToken=()=>Promise.resolve(),this.requestStartCallback=()=>null,this.requestSuccessCallback=()=>null,this.requestErrorCallback=()=>null,this.requestFinishCallback=()=>null,this.init=this.init.bind(this),this.setHttpRequestErrorCallback=this.setHttpRequestErrorCallback.bind(this),this.setHttpRequestFinishCallback=this.setHttpRequestFinishCallback.bind(this),this.setHttpRequestStartCallback=this.setHttpRequestStartCallback.bind(this),this.setHttpRequestSuccessCallback=this.setHttpRequestSuccessCallback.bind(this)}static getInstance(){return this.axiosInstance||(this.axiosInstance=gn.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new Sn),this.axiosInstance.interceptors.request.use((e=>t(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(e)})))),this.axiosInstance.interceptors.response.use((e=>this.clientInstance.successHandler(e)),(e=>this.clientInstance.errorHandler(e))),this.axiosInstance.all=gn.all,this.axiosInstance.spread=gn.spread,this.axiosInstance.init=this.clientInstance.init,this.axiosInstance.enableHandler=this.clientInstance.enableHandler,this.axiosInstance.disableHandler=this.clientInstance.disableHandler,this.axiosInstance.disableHandlerWithTimeout=this.clientInstance.disableHandlerWithTimeout,this.axiosInstance.setHttpRequestStartCallback=this.clientInstance.setHttpRequestStartCallback,this.axiosInstance.setHttpRequestSuccessCallback=this.clientInstance.setHttpRequestSuccessCallback,this.axiosInstance.setHttpRequestErrorCallback=this.clientInstance.setHttpRequestErrorCallback,this.axiosInstance.setHttpRequestFinishCallback=this.clientInstance.setHttpRequestFinishCallback),this.axiosInstance}requestHandler(e){return t(this,void 0,void 0,(function*(){if(yield this.attachToken(e),null==e?void 0:e.shouldEncodeToFormData){const t=null==e?void 0:e.data,l=new FormData;Object.keys(t).forEach((e=>{l.append(e,t[e])})),e.data=l}return e.startTimeInMs=(new Date).getTime(),Sn.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(e),e}))}errorHandler(e){throw Sn.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}successHandler(e){return Sn.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}init(e=!0,l){return t(this,void 0,void 0,(function*(){Sn.isHandlerEnabled=e,this.attachToken=l}))}enableHandler(){Sn.isHandlerEnabled=!0}disableHandler(){Sn.isHandlerEnabled=!1}disableHandlerWithTimeout(e=Sn.DEFAULT_HANDLER_DISABLE_TIMEOUT){Sn.isHandlerEnabled=!1,setTimeout((()=>{Sn.isHandlerEnabled=!0}),e)}setHttpRequestStartCallback(e){this.requestStartCallback=e}setHttpRequestSuccessCallback(e){this.requestSuccessCallback=e}setHttpRequestErrorCallback(e){this.requestErrorCallback=e}setHttpRequestFinishCallback(e){this.requestFinishCallback=e}};vn.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,vn=Sn=function(e,t,l,i){var n,o=arguments.length,c=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,l):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,l,i);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(c=(o<3?n(c):o>3?n(t,l,c):n(t,l))||c);return o>3&&c&&Object.defineProperty(t,l,c),c}([e=>{}],vn);class Yn{setData(e,l){return t(this,void 0,void 0,(function*(){localStorage.setItem(e,l)}))}getData(e){var l;return t(this,void 0,void 0,(function*(){return null!==(l=localStorage.getItem(e))&&void 0!==l?l:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){localStorage.removeItem(e)}))}}class Kn{constructor(){this._data=new Map}setData(e,l){return t(this,void 0,void 0,(function*(){this._data.set(e,l)}))}getData(e){var l,i;return t(this,void 0,void 0,(function*(){return null!==(i=null===(l=this._data)||void 0===l?void 0:l.get(e))&&void 0!==i?i:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){this._data.delete(e)}))}}class Jn{setData(e,l){return t(this,void 0,void 0,(function*(){sessionStorage.setItem(e,l)}))}getData(e){var l;return t(this,void 0,void 0,(function*(){return null!==(l=sessionStorage.getItem(e))&&void 0!==l?l:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){sessionStorage.removeItem(e)}))}}var fn={exports:{}},Nn={},kn={};Object.defineProperty(kn,"__esModule",{value:!0}),kn.default=function(e){var t=e.length,l=t%4;if(!l)return e;var i=t,n=4-l,o=t+n,c=st.alloc(o);for(c.write(e);n--;)c.write("=",i++);return c.toString()},Object.defineProperty(Nn,"__esModule",{value:!0});var Cn=kn;function Ln(e,t){return void 0===t&&(t="utf8"),st.isBuffer(e)?Un(e.toString("base64")):Un(st.from(e,t).toString("base64"))}function Hn(e){return e=e.toString(),Cn.default(e).replace(/\-/g,"+").replace(/_/g,"/")}function Un(e){return e.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var Tn,Fn=Ln;Fn.encode=Ln,Fn.decode=function(e,t){return void 0===t&&(t="utf8"),st.from(Hn(e),"base64").toString(t)},Fn.toBase64=Hn,Fn.fromBase64=Un,Fn.toBuffer=function(e){return st.from(Hn(e),"base64")},Nn.default=Fn,(Tn=fn).exports=Nn.default,Tn.exports.default=Tn.exports;var wn=fn.exports,xn={exports:{}};!function(e){!function(t,l){var i={};!function(e){e.__esModule=!0,e.digestLength=32,e.blockSize=64;var t=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function l(e,l,i,n,o){for(var c,d,a,s,r,u,Z,h,b,m,p,G,X;o>=64;){for(c=l[0],d=l[1],a=l[2],s=l[3],r=l[4],u=l[5],Z=l[6],h=l[7],m=0;m<16;m++)p=n+4*m,e[m]=(255&i[p])<<24|(255&i[p+1])<<16|(255&i[p+2])<<8|255&i[p+3];for(m=16;m<64;m++)G=((b=e[m-2])>>>17|b<<15)^(b>>>19|b<<13)^b>>>10,X=((b=e[m-15])>>>7|b<<25)^(b>>>18|b<<14)^b>>>3,e[m]=(G+e[m-7]|0)+(X+e[m-16]|0);for(m=0;m<64;m++)G=(((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+(r&u^~r&Z)|0)+(h+(t[m]+e[m]|0)|0)|0,X=((c>>>2|c<<30)^(c>>>13|c<<19)^(c>>>22|c<<10))+(c&d^c&a^d&a)|0,h=Z,Z=u,u=r,r=s+G|0,s=a,a=d,d=c,c=G+X|0;l[0]+=c,l[1]+=d,l[2]+=a,l[3]+=s,l[4]+=r,l[5]+=u,l[6]+=Z,l[7]+=h,n+=64,o-=64}return n}var i=function(){function t(){this.digestLength=e.digestLength,this.blockSize=e.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return t.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},t.prototype.clean=function(){for(var e=0;e<this.buffer.length;e++)this.buffer[e]=0;for(e=0;e<this.temp.length;e++)this.temp[e]=0;this.reset()},t.prototype.update=function(e,t){if(void 0===t&&(t=e.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var i=0;if(this.bytesHashed+=t,this.bufferLength>0){for(;this.bufferLength<64&&t>0;)this.buffer[this.bufferLength++]=e[i++],t--;64===this.bufferLength&&(l(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(t>=64&&(i=l(this.temp,this.state,e,i,t),t%=64);t>0;)this.buffer[this.bufferLength++]=e[i++],t--;return this},t.prototype.finish=function(e){if(!this.finished){var t=this.bytesHashed,i=this.bufferLength,n=t/536870912|0,o=t<<3,c=t%64<56?64:128;this.buffer[i]=128;for(var d=i+1;d<c-8;d++)this.buffer[d]=0;this.buffer[c-8]=n>>>24&255,this.buffer[c-7]=n>>>16&255,this.buffer[c-6]=n>>>8&255,this.buffer[c-5]=n>>>0&255,this.buffer[c-4]=o>>>24&255,this.buffer[c-3]=o>>>16&255,this.buffer[c-2]=o>>>8&255,this.buffer[c-1]=o>>>0&255,l(this.temp,this.state,this.buffer,0,c),this.finished=!0}for(d=0;d<8;d++)e[4*d+0]=this.state[d]>>>24&255,e[4*d+1]=this.state[d]>>>16&255,e[4*d+2]=this.state[d]>>>8&255,e[4*d+3]=this.state[d]>>>0&255;return this},t.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},t.prototype._saveState=function(e){for(var t=0;t<this.state.length;t++)e[t]=this.state[t]},t.prototype._restoreState=function(e,t){for(var l=0;l<this.state.length;l++)this.state[l]=e[l];this.bytesHashed=t,this.finished=!1,this.bufferLength=0},t}();e.Hash=i;var n=function(){function e(e){this.inner=new i,this.outer=new i,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var t=new Uint8Array(this.blockSize);if(e.length>this.blockSize)(new i).update(e).finish(t).clean();else for(var l=0;l<e.length;l++)t[l]=e[l];for(l=0;l<t.length;l++)t[l]^=54;this.inner.update(t);for(l=0;l<t.length;l++)t[l]^=106;this.outer.update(t),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(l=0;l<t.length;l++)t[l]=0}return e.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},e.prototype.clean=function(){for(var e=0;e<this.istate.length;e++)this.ostate[e]=this.istate[e]=0;this.inner.clean(),this.outer.clean()},e.prototype.update=function(e){return this.inner.update(e),this},e.prototype.finish=function(e){return this.outer.finished?this.outer.finish(e):(this.inner.finish(e),this.outer.update(e,this.digestLength).finish(e)),this},e.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},e}();function o(e){var t=(new i).update(e),l=t.digest();return t.clean(),l}function c(e,t){var l=new n(e).update(t),i=l.digest();return l.clean(),i}function d(e,t,l,i){var n=i[0];if(0===n)throw new Error("hkdf: cannot expand more");t.reset(),n>1&&t.update(e),l&&t.update(l),t.update(i),t.finish(e),i[0]++}e.HMAC=n,e.hash=o,e.default=o,e.hmac=c;var a=new Uint8Array(e.digestLength);function s(e,t,l,i){void 0===t&&(t=a),void 0===i&&(i=32);for(var o=new Uint8Array([1]),s=c(t,e),r=new n(s),u=new Uint8Array(r.digestLength),Z=u.length,h=new Uint8Array(i),b=0;b<i;b++)Z===u.length&&(d(u,r,l,o),Z=0),h[b]=u[Z++];return r.clean(),u.fill(0),o.fill(0),h}function r(e,t,l,i){for(var o=new n(e),c=o.digestLength,d=new Uint8Array(4),a=new Uint8Array(c),s=new Uint8Array(c),r=new Uint8Array(i),u=0;u*c<i;u++){var Z=u+1;d[0]=Z>>>24&255,d[1]=Z>>>16&255,d[2]=Z>>>8&255,d[3]=Z>>>0&255,o.reset(),o.update(t),o.update(d),o.finish(s);for(var h=0;h<c;h++)a[h]=s[h];for(h=2;h<=l;h++){o.reset(),o.update(s).finish(s);for(var b=0;b<c;b++)a[b]^=s[b]}for(h=0;h<c&&u*c+h<i;h++)r[u*c+h]=a[h]}for(u=0;u<c;u++)a[u]=s[u]=0;for(u=0;u<4;u++)d[u]=0;return o.clean(),r}e.hkdf=s,e.pbkdf2=r}(i);var n=i.default;for(var o in i)n[o]=i[o];e.exports=n}()}(xn);var zn=We(xn.exports),Bn=crypto;const Pn=e=>e instanceof CryptoKey,Mn=new TextEncoder,jn=new TextDecoder;const Qn=e=>{let t=e;t instanceof Uint8Array&&(t=jn.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return(e=>{const t=atob(e),l=new Uint8Array(t.length);for(let e=0;e<t.length;e++)l[e]=t.charCodeAt(e);return l})(t)}catch(e){throw new TypeError("The input to be decoded is not correctly encoded.")}};class En extends Error{constructor(e){var t;super(e),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,null===(t=Error.captureStackTrace)||void 0===t||t.call(Error,this,this.constructor)}static get code(){return"ERR_JOSE_GENERIC"}}class Dn extends En{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=t,this.reason=l}static get code(){return"ERR_JWT_CLAIM_VALIDATION_FAILED"}}class On extends En{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_EXPIRED",this.claim=t,this.reason=l}static get code(){return"ERR_JWT_EXPIRED"}}class An extends En{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}static get code(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}class _n extends En{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class qn extends En{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}static get code(){return"ERR_JWS_INVALID"}}class $n extends En{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}static get code(){return"ERR_JWT_INVALID"}}class eo extends En{constructor(){super(...arguments),this.code="ERR_JWKS_INVALID"}static get code(){return"ERR_JWKS_INVALID"}}class to extends En{constructor(){super(...arguments),this.code="ERR_JWKS_NO_MATCHING_KEY",this.message="no applicable key found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_NO_MATCHING_KEY"}}class lo extends En{constructor(){super(...arguments),this.code="ERR_JWKS_MULTIPLE_MATCHING_KEYS",this.message="multiple matching keys found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_MULTIPLE_MATCHING_KEYS"}}class io extends En{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed"}static get code(){return"ERR_JWS_SIGNATURE_VERIFICATION_FAILED"}}function no(){return"function"==typeof WebSocketPair}function oo(e,t="algorithm.name"){return new TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`)}function co(e,t){return e.name===t}function ao(e){return parseInt(e.name.slice(4),10)}function so(e,t,...l){switch(t){case"HS256":case"HS384":case"HS512":{if(!co(e.algorithm,"HMAC"))throw oo("HMAC");const l=parseInt(t.slice(2),10);if(ao(e.algorithm.hash)!==l)throw oo(`SHA-${l}`,"algorithm.hash");break}case"RS256":case"RS384":case"RS512":{if(!co(e.algorithm,"RSASSA-PKCS1-v1_5"))throw oo("RSASSA-PKCS1-v1_5");const l=parseInt(t.slice(2),10);if(ao(e.algorithm.hash)!==l)throw oo(`SHA-${l}`,"algorithm.hash");break}case"PS256":case"PS384":case"PS512":{if(!co(e.algorithm,"RSA-PSS"))throw oo("RSA-PSS");const l=parseInt(t.slice(2),10);if(ao(e.algorithm.hash)!==l)throw oo(`SHA-${l}`,"algorithm.hash");break}case no()&&"EdDSA":if(!co(e.algorithm,"NODE-ED25519"))throw oo("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":{if(!co(e.algorithm,"ECDSA"))throw oo("ECDSA");const l=function(e){switch(e){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw new Error("unreachable")}}(t);if(e.algorithm.namedCurve!==l)throw oo(l,"algorithm.namedCurve");break}default:throw new TypeError("CryptoKey does not support this operation")}!function(e,t){if(t.length&&!t.some((t=>e.usages.includes(t)))){let e="CryptoKey does not support this operation, its usages must include ";if(t.length>2){const l=t.pop();e+=`one of ${t.join(", ")}, or ${l}.`}else 2===t.length?e+=`one of ${t[0]} or ${t[1]}.`:e+=`${t[0]}.`;throw new TypeError(e)}}(e,l)}var ro=(e,...t)=>{let l="Key must be ";if(t.length>2){const e=t.pop();l+=`one of type ${t.join(", ")}, or ${e}.`}else 2===t.length?l+=`one of type ${t[0]} or ${t[1]}.`:l+=`of type ${t[0]}.`;return null==e?l+=` Received ${e}`:"function"==typeof e&&e.name?l+=` Received function ${e.name}`:"object"==typeof e&&null!=e&&e.constructor&&e.constructor.name&&(l+=` Received an instance of ${e.constructor.name}`),l},uo=e=>Pn(e);const Zo=["CryptoKey"];function ho(e){if("object"!=typeof(t=e)||null===t||"[object Object]"!==Object.prototype.toString.call(e))return!1;var t;if(null===Object.getPrototypeOf(e))return!0;let l=e;for(;null!==Object.getPrototypeOf(l);)l=Object.getPrototypeOf(l);return Object.getPrototypeOf(e)===l}const bo=async e=>{var t,l;const{algorithm:i,keyUsages:n}=function(e){let t,l;switch(e.kty){case"oct":switch(e.alg){case"HS256":case"HS384":case"HS512":t={name:"HMAC",hash:`SHA-${e.alg.slice(-3)}`},l=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new _n(`${e.alg} keys cannot be imported as CryptoKey instances`);case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":t={name:"AES-GCM"},l=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":t={name:"AES-KW"},l=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":t={name:"PBKDF2"},l=["deriveBits"];break;default:throw new _n('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(e.alg){case"PS256":case"PS384":case"PS512":t={name:"RSA-PSS",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":t={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":t={name:"RSA-OAEP",hash:`SHA-${parseInt(e.alg.slice(-3),10)||1}`},l=e.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new _n('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(e.alg){case"ES256":t={name:"ECDSA",namedCurve:"P-256"},l=e.d?["sign"]:["verify"];break;case"ES384":t={name:"ECDSA",namedCurve:"P-384"},l=e.d?["sign"]:["verify"];break;case"ES512":t={name:"ECDSA",namedCurve:"P-521"},l=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:"ECDH",namedCurve:e.crv},l=e.d?["deriveBits"]:[];break;default:throw new _n('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case no()&&"OKP":if("EdDSA"!==e.alg)throw new _n('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');if("Ed25519"!==e.crv)throw new _n('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value');t={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},l=e.d?["sign"]:["verify"];break;default:throw new _n('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:t,keyUsages:l}}(e),o=[i,null!==(t=e.ext)&&void 0!==t&&t,null!==(l=e.key_ops)&&void 0!==l?l:n];if("PBKDF2"===i.name)return Bn.subtle.importKey("raw",Qn(e.k),...o);const c={...e};return delete c.alg,Bn.subtle.importKey("jwk",c,...o)};const mo=(e,t,l)=>{e.startsWith("HS")||"dir"===e||e.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(e)?(e=>{if(!(e instanceof Uint8Array)){if(!uo(e))throw new TypeError(ro(e,...Zo,"Uint8Array"));if("secret"!==e.type)throw new TypeError(`${Zo.join(" or ")} instances for symmetric algorithms must be of type "secret"`)}})(t):((e,t)=>{if(!uo(e))throw new TypeError(ro(e,...Zo));if("secret"===e.type)throw new TypeError(`${Zo.join(" or ")} instances for asymmetric algorithms must not be of type "secret"`);if("sign"===t&&"public"===e.type)throw new TypeError(`${Zo.join(" or ")} instances for asymmetric algorithm signing must be of type "private"`);if("decrypt"===t&&"public"===e.type)throw new TypeError(`${Zo.join(" or ")} instances for asymmetric algorithm decryption must be of type "private"`);if(e.algorithm&&"verify"===t&&"private"===e.type)throw new TypeError(`${Zo.join(" or ")} instances for asymmetric algorithm verifying must be of type "public"`);if(e.algorithm&&"encrypt"===t&&"private"===e.type)throw new TypeError(`${Zo.join(" or ")} instances for asymmetric algorithm encryption must be of type "public"`)})(t,l)};const po=async(e,t,l,i)=>{const n=await function(e,t,l){if(Pn(t))return so(t,e,l),t;if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw new TypeError(ro(t,...Zo));return Bn.subtle.importKey("raw",t,{hash:`SHA-${e.slice(-3)}`,name:"HMAC"},!1,[l])}throw new TypeError(ro(t,...Zo,"Uint8Array"))}(e,t,"verify");((e,t)=>{if(e.startsWith("RS")||e.startsWith("PS")){const{modulusLength:l}=t.algorithm;if("number"!=typeof l||l<2048)throw new TypeError(`${e} requires key modulusLength to be 2048 bits or larger`)}})(e,n);const o=function(e,t){const l=`SHA-${e.slice(-3)}`;switch(e){case"HS256":case"HS384":case"HS512":return{hash:l,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:l,name:"RSA-PSS",saltLength:e.slice(-3)>>3};case"RS256":case"RS384":case"RS512":return{hash:l,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:l,name:"ECDSA",namedCurve:t.namedCurve};case no()&&"EdDSA":const{namedCurve:i}=t;return{name:i,namedCurve:i};default:throw new _n(`alg ${e} is not supported either by JOSE or your javascript runtime`)}}(e,n.algorithm);try{return await Bn.subtle.verify(o,n,l,i)}catch(e){return!1}};async function Go(e,t,l){var i;if(!ho(e))throw new qn("Flattened JWS must be an object");if(void 0===e.protected&&void 0===e.header)throw new qn('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==e.protected&&"string"!=typeof e.protected)throw new qn("JWS Protected Header incorrect type");if(void 0===e.payload)throw new qn("JWS Payload missing");if("string"!=typeof e.signature)throw new qn("JWS Signature missing or incorrect type");if(void 0!==e.header&&!ho(e.header))throw new qn("JWS Unprotected Header incorrect type");let n={};if(e.protected){const t=Qn(e.protected);try{n=JSON.parse(jn.decode(t))}catch(e){throw new qn("JWS Protected Header is invalid")}}if(!((...e)=>{const t=e.filter(Boolean);if(0===t.length||1===t.length)return!0;let l;for(const e of t){const t=Object.keys(e);if(l&&0!==l.size)for(const e of t){if(l.has(e))return!1;l.add(e)}else l=new Set(t)}return!0})(n,e.header))throw new qn("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const o={...n,...e.header},c=function(e,t,l,i,n){if(void 0!==n.crit&&void 0===i.crit)throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');if(!i||void 0===i.crit)return new Set;if(!Array.isArray(i.crit)||0===i.crit.length||i.crit.some((e=>"string"!=typeof e||0===e.length)))throw new e('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');let o;o=void 0!==l?new Map([...Object.entries(l),...t.entries()]):t;for(const t of i.crit){if(!o.has(t))throw new _n(`Extension Header Parameter "${t}" is not recognized`);if(void 0===n[t])throw new e(`Extension Header Parameter "${t}" is missing`);if(o.get(t)&&void 0===i[t])throw new e(`Extension Header Parameter "${t}" MUST be integrity protected`)}return new Set(i.crit)}(qn,new Map([["b64",!0]]),null==l?void 0:l.crit,n,o);let d=!0;if(c.has("b64")&&(d=n.b64,"boolean"!=typeof d))throw new qn('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:a}=o;if("string"!=typeof a||!a)throw new qn('JWS "alg" (Algorithm) Header Parameter missing or invalid');const s=l&&((e,t)=>{if(void 0!==t&&(!Array.isArray(t)||t.some((e=>"string"!=typeof e))))throw new TypeError(`"${e}" option must be an array of strings`);if(t)return new Set(t)})("algorithms",l.algorithms);if(s&&!s.has(a))throw new An('"alg" (Algorithm) Header Parameter not allowed');if(d){if("string"!=typeof e.payload)throw new qn("JWS Payload must be a string")}else if("string"!=typeof e.payload&&!(e.payload instanceof Uint8Array))throw new qn("JWS Payload must be a string or an Uint8Array instance");let r=!1;"function"==typeof t&&(t=await t(n,e),r=!0),mo(a,t,"verify");const u=function(...e){const t=e.reduce(((e,{length:t})=>e+t),0),l=new Uint8Array(t);let i=0;return e.forEach((e=>{l.set(e,i),i+=e.length})),l}(Mn.encode(null!==(i=e.protected)&&void 0!==i?i:""),Mn.encode("."),"string"==typeof e.payload?Mn.encode(e.payload):e.payload),Z=Qn(e.signature);if(!await po(a,t,Z,u))throw new io;let h;h=d?Qn(e.payload):"string"==typeof e.payload?Mn.encode(e.payload):e.payload;const b={payload:h};return void 0!==e.protected&&(b.protectedHeader=n),void 0!==e.header&&(b.unprotectedHeader=e.header),r?{...b,key:t}:b}const Xo=86400,yo=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var Wo=e=>{const t=yo.exec(e);if(!t)throw new TypeError("Invalid time period format");const l=parseFloat(t[1]);switch(t[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(l);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*l);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*l);case"day":case"days":case"d":return Math.round(l*Xo);case"week":case"weeks":case"w":return Math.round(604800*l);default:return Math.round(31557600*l)}};const Vo=e=>e.toLowerCase().replace(/^application\//,"");var Io=(e,t,l={})=>{const{typ:i}=l;if(i&&("string"!=typeof e.typ||Vo(e.typ)!==Vo(i)))throw new Dn('unexpected "typ" JWT header value',"typ","check_failed");let n;try{n=JSON.parse(jn.decode(t))}catch(e){}if(!ho(n))throw new $n("JWT Claims Set must be a top-level JSON object");const{issuer:o}=l;if(o&&!(Array.isArray(o)?o:[o]).includes(n.iss))throw new Dn('unexpected "iss" claim value',"iss","check_failed");const{subject:c}=l;if(c&&n.sub!==c)throw new Dn('unexpected "sub" claim value',"sub","check_failed");const{audience:d}=l;if(d&&(a=n.aud,s="string"==typeof d?[d]:d,!("string"==typeof a?s.includes(a):Array.isArray(a)&&s.some(Set.prototype.has.bind(new Set(a))))))throw new Dn('unexpected "aud" claim value',"aud","check_failed");var a,s;let r;switch(typeof l.clockTolerance){case"string":r=Wo(l.clockTolerance);break;case"number":r=l.clockTolerance;break;case"undefined":r=0;break;default:throw new TypeError("Invalid clockTolerance option type")}const{currentDate:u}=l,Z=(h=u||new Date,Math.floor(h.getTime()/1e3));var h;if((void 0!==n.iat||l.maxTokenAge)&&"number"!=typeof n.iat)throw new Dn('"iat" claim must be a number',"iat","invalid");if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new Dn('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>Z+r)throw new Dn('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new Dn('"exp" claim must be a number',"exp","invalid");if(n.exp<=Z-r)throw new On('"exp" claim timestamp check failed',"exp","check_failed")}if(l.maxTokenAge){const e=Z-n.iat;if(e-r>("number"==typeof l.maxTokenAge?l.maxTokenAge:Wo(l.maxTokenAge)))throw new On('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(e<0-r)throw new Dn('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};async function Ro(e,t,l){var i;const n=await async function(e,t,l){if(e instanceof Uint8Array&&(e=jn.decode(e)),"string"!=typeof e)throw new qn("Compact JWS must be a string or Uint8Array");const{0:i,1:n,2:o,length:c}=e.split(".");if(3!==c)throw new qn("Invalid Compact JWS");const d=await Go({payload:n,protected:i,signature:o},t,l),a={payload:d.payload,protectedHeader:d.protectedHeader};return"function"==typeof t?{...a,key:d.key}:a}(e,t,l);if((null===(i=n.protectedHeader.crit)||void 0===i?void 0:i.includes("b64"))&&!1===n.protectedHeader.b64)throw new $n("JWTs MUST NOT use unencoded payload");const o={payload:Io(n.protectedHeader,n.payload,l),protectedHeader:n.protectedHeader};return"function"==typeof t?{...o,key:n.key}:o}function So(e){return ho(e)}class go{constructor(e){if(this._cached=new WeakMap,!function(e){return e&&"object"==typeof e&&Array.isArray(e.keys)&&e.keys.every(So)}(e))throw new eo("JSON Web Key Set malformed");var t;this._jwks=(t=e,"function"==typeof structuredClone?structuredClone(t):JSON.parse(JSON.stringify(t)))}async getKey(e,t){const{alg:l,kid:i}={...e,...t.header},n=function(e){switch("string"==typeof e&&e.slice(0,2)){case"RS":case"PS":return"RSA";case"ES":return"EC";case"Ed":return"OKP";default:throw new _n('Unsupported "alg" value for a JSON Web Key Set')}}(l),o=this._jwks.keys.filter((e=>{let t=n===e.kty;if(t&&"string"==typeof i&&(t=i===e.kid),t&&"string"==typeof e.alg&&(t=l===e.alg),t&&"string"==typeof e.use&&(t="sig"===e.use),t&&Array.isArray(e.key_ops)&&(t=e.key_ops.includes("verify")),t&&"EdDSA"===l&&(t="Ed25519"===e.crv||"Ed448"===e.crv),t)switch(l){case"ES256":t="P-256"===e.crv;break;case"ES256K":t="secp256k1"===e.crv;break;case"ES384":t="P-384"===e.crv;break;case"ES512":t="P-521"===e.crv}return t})),{0:c,length:d}=o;if(0===d)throw new to;if(1!==d)throw new lo;const a=this._cached.get(c)||this._cached.set(c,{}).get(c);if(void 0===a[l]){const e=await async function(e,t,l){if(!ho(e))throw new TypeError("JWK must be an object");if(t||(t=e.alg),"string"!=typeof t||!t)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');switch(e.kty){case"oct":if("string"!=typeof e.k||!e.k)throw new TypeError('missing "k" (Key Value) Parameter value');return null!=l||(l=!0!==e.ext),l?bo({...e,alg:t,ext:!1}):Qn(e.k);case"RSA":if(void 0!==e.oth)throw new _n('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return bo({...e,alg:t});default:throw new _n('Unsupported "kty" (Key Type) Parameter value')}}({...c,ext:!0},l);if(e instanceof Uint8Array||"public"!==e.type)throw new eo("JSON Web Key Set members must be public keys");a[l]=e}return a[l]}}var vo={exports:{}},Yo={exports:{}},Ko=Ve(Dt);!function(e,t){var l=Ko,i=l.Buffer;function n(e,t){for(var l in e)t[l]=e[l]}function o(e,t,l){return i(e,t,l)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=l:(n(l,t),t.Buffer=o),o.prototype=Object.create(i.prototype),n(i,o),o.from=function(e,t,l){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,l)},o.alloc=function(e,t,l){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof l?n.fill(t,l):n.fill(t):n.fill(0),n},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return l.SlowBuffer(e)}}(Yo,Yo.exports);var Jo=65536,fo=4294967295;var No=Yo.exports.Buffer,ko=ye.crypto||ye.msCrypto;ko&&ko.getRandomValues?vo.exports=function(e,t){if(e>fo)throw new RangeError("requested too many random bytes");var l=No.allocUnsafe(e);if(e>0)if(e>Jo)for(var i=0;i<e;i+=Jo)ko.getRandomValues(l.slice(i,i+Jo));else ko.getRandomValues(l);if("function"==typeof t)return jl.nextTick((function(){t(null,l)}));return l}:vo.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var Co=vo.exports;class Lo{base64URLEncode(e){return wn.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}base64URLDecode(e){return wn.decode(e).toString()}hashSha256(e){return st.from(zn((new TextEncoder).encode(e)))}generateRandomBytes(e){return Co(e)}verifyJwt(e,t,l,i,n,o,c,d){const a={algorithms:l,audience:i,clockTolerance:c,subject:o};return(null==d||d)&&(a.issuer=n),Ro(e,(s={keys:[t]},go.prototype.getKey.bind(new go(s))),a).then((()=>Promise.resolve(!0))).catch((e=>{var t;return Promise.reject(new u("SPA-CRYPTO-UTILS-VJ-IV01",null!==(t=null==e?void 0:e.reason)&&void 0!==t?t:JSON.stringify(e),`${null==e?void 0:e.code} ${null==e?void 0:e.claim}`))}));var s}}const Ho=(l,i,n)=>t(void 0,void 0,void 0,(function*(){var d;const a=(e=>{switch(e){case he.LocalStorage:return new Yn;case he.SessionStorage:return new Jn;case he.BrowserMemory:return new Kn;default:return new Jn}})(i.storage),r=new Lo,u=new X;yield u.initialize(i,a,r,l);const h=new Ge(u),b=u.getDataLayer(),m=yield Xe((()=>t(void 0,void 0,void 0,(function*(){return u.getSignOutURL()}))),null!==(d=i.storage)&&void 0!==d?d:he.SessionStorage,(e=>b.setSessionDataParameter(c,null!=e?e:""))),p=n(u,h);let G=!1;const y=vn.getInstance();let W,V,I=!0;(null==y?void 0:y.init)&&(yield y.init(!0,(e=>t(void 0,void 0,void 0,(function*(){yield p.attachTokenToRequestConfig(e)})))));const R=()=>t(void 0,void 0,void 0,(function*(){const e=yield u.getOIDCServiceEndpoints(),l=yield b.getConfigData();p.initializeSessionManger(l,e,(()=>t(void 0,void 0,void 0,(function*(){return(yield u.getBasicUserInfo()).sessionState}))),(e=>t(void 0,void 0,void 0,(function*(){return u.getAuthorizationURL(e)}))),m)})),S=()=>t(void 0,void 0,void 0,(function*(){return yield m.receivePromptNoneResponse((e=>t(void 0,void 0,void 0,(function*(){yield b.setSessionDataParameter(c,null!=e?e:"")}))))})),g=e=>{e.preventSignOutURLUpdate&&(G=!0)},v=(e,l,i,n)=>t(void 0,void 0,void 0,(function*(){return yield p.requestAccessToken(e,l,R,void 0,i,n)})),Y=(e={})=>t(void 0,void 0,void 0,(function*(){const t=yield b.getConfigData(),l=yield u.getAuthorizationURL(Object.assign({prompt:"none",state:oe},e)),i=new URL(l);i.searchParams.set("response_mode","query");const n=i.toString();if(t.storage===he.BrowserMemory&&t.enablePKCE){const e=i.searchParams.get(s);me.setPKCE(Z.extractPKCEKeyFromStateParam(null!=e?e:""),yield u.getPKCECode(null!=e?e:""))}return n}));return{disableHttpHandler:()=>(p.disableHttpHandler(y),I=!1,!0),enableHttpHandler:()=>(p.enableHttpHandler(y),I=!0,!0),getAccessToken:()=>t(void 0,void 0,void 0,(function*(){return p.getAccessToken()})),getBasicUserInfo:()=>t(void 0,void 0,void 0,(function*(){return p.getBasicUserInfo()})),getConfigData:()=>t(void 0,void 0,void 0,(function*(){return yield b.getConfigData()})),getCryptoHelper:()=>t(void 0,void 0,void 0,(function*(){return p.getCryptoHelper()})),getDataLayer:()=>t(void 0,void 0,void 0,(function*(){return p.getDataLayer()})),getDecodedIDToken:()=>t(void 0,void 0,void 0,(function*(){return p.getDecodedIDToken()})),getHttpClient:()=>y,getIDToken:()=>t(void 0,void 0,void 0,(function*(){return p.getIDToken()})),getOIDCServiceEndpoints:()=>t(void 0,void 0,void 0,(function*(){return p.getOIDCServiceEndpoints()})),httpRequest:e=>t(void 0,void 0,void 0,(function*(){return yield p.httpRequest(y,e,I,W,V)})),httpRequestAll:e=>t(void 0,void 0,void 0,(function*(){return yield p.httpRequestAll(e,y,I,W,V)})),isAuthenticated:()=>t(void 0,void 0,void 0,(function*(){return p.isAuthenticated()})),isSessionActive:()=>t(void 0,void 0,void 0,(function*(){return"true"===(yield b.getSessionStatus())})),refreshAccessToken:()=>t(void 0,void 0,void 0,(function*(){try{return yield p.refreshAccessToken(g)}catch(e){return Promise.reject(e)}})),requestCustomGrant:e=>t(void 0,void 0,void 0,(function*(){return yield p.requestCustomGrant(e,g)})),revokeAccessToken:()=>t(void 0,void 0,void 0,(function*(){const e=yield h.getRefreshTimeoutTimer();return u.revokeAccessToken().then((()=>(m.reset(),h.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestErrorCallback:e=>{W=e},setHttpRequestFinishCallback:e=>{(null==y?void 0:y.setHttpRequestFinishCallback)&&y.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==y?void 0:y.setHttpRequestStartCallback)&&y.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==y?void 0:y.setHttpRequestSuccessCallback)&&y.setHttpRequestSuccessCallback(e)},signIn:(l,n,d,a,r)=>t(void 0,void 0,void 0,(function*(){var h,m,G;const X=yield p.handleSignIn(S,R,void 0);if(X)return X;{let p,X,W,V={params:{}};if((null==i?void 0:i.responseMode)===e.ResponseMode.formPost&&n?(p=n,X=null!=d?d:"",W=null!=a?a:""):(p=null!==(h=new URL(window.location.href).searchParams.get(o))&&void 0!==h?h:"",X=null!==(m=new URL(window.location.href).searchParams.get(c))&&void 0!==m?m:"",W=null!==(G=new URL(window.location.href).searchParams.get(s))&&void 0!==G?G:"",me.removeAuthorizationCode()),p&&W){y="true",t(void 0,void 0,void 0,(function*(){yield b.setSessionStatus(y)}));const e=yield b.getTemporaryDataParameter(ee);return e&&"string"==typeof e&&(V=JSON.parse(e)),v(p,X,W,V)}return u.getAuthorizationURL(l).then((e=>t(void 0,void 0,void 0,(function*(){if(i.storage===he.BrowserMemory&&i.enablePKCE){const e=Z.extractPKCEKeyFromStateParam(W);me.setPKCE(e,yield u.getPKCECode(W))}return r&&b.setTemporaryDataParameter(ee,JSON.stringify(r)),location.href=e,yield me.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))}var y})),signOut:()=>t(void 0,void 0,void 0,(function*(){return(yield u.isAuthenticated())&&!G?location.href=yield u.getSignOutURL():location.href=me.getSignOutURL(i.clientID,l),h.clearRefreshTokenTimeout(),yield b.removeOIDCProviderMetaData(),yield b.removeTemporaryData(),yield b.removeSessionData(),yield b.removeSessionStatus(),yield me.waitTillPageRedirect(),!0})),trySignInSilently:(e,l)=>t(void 0,void 0,void 0,(function*(){return yield p.trySignInSilently(Y,v,m,e,l)})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){const t=yield b.getConfigData(),l=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},t),e);yield u.updateConfig(i),i.enableOIDCSessionManagement&&l&&(m.reset(),R())}))}})),Uo=(l,i,n,d)=>t(void 0,void 0,void 0,(function*(){var a;let r;const h=null!==(a=null==i?void 0:i.requestTimeout)&&void 0!==a?a:6e4;let b=!0,m=!1;const p=(e=>{switch(e){case he.LocalStorage:return new Yn;case he.SessionStorage:return new Jn;case he.BrowserMemory:return new Kn;default:return new Jn}})(i.storage),G=new Lo,y=new X;yield y.initialize(i,p,G,l);const W=new Ge(y),V=yield Xe((()=>t(void 0,void 0,void 0,(function*(){const e={type:v};try{return yield S(e)}catch(e){return me.getSignOutURL(i.clientID,l)}}))),i.storage,(e=>j(e))),I=d(y,W),R=new n,S=e=>{const t=new MessageChannel;return R.postMessage(e,[t.port2]),new Promise(((e,l)=>{const i=setTimeout((()=>{l(new u("SPA-WEB_WORKER_CLIENT-COM-TO01","Operation timed out.","No response was received from the web worker for "+h/1e3+" since dispatching the request"))}),h);return t.port1.onmessage=({data:n})=>{if(clearTimeout(i),t.port1.close(),t.port2.close(),null==n?void 0:n.success){const t=(null==n?void 0:n.data)?JSON.parse(null==n?void 0:n.data):null;(null==n?void 0:n.blob)&&(t.data=null==n?void 0:n.blob),e(t)}else l(n.error?JSON.parse(n.error):null)}}))},j=e=>S({data:e,type:Q}),A=()=>S({type:E}),_=()=>t(void 0,void 0,void 0,(function*(){const e=yield ne(),l=yield ce();I.initializeSessionManger(l,e,(()=>t(void 0,void 0,void 0,(function*(){return(yield de()).sessionState}))),(e=>t(void 0,void 0,void 0,(function*(){return(yield ee(e)).authorizationURL}))),V)})),$=(e={})=>t(void 0,void 0,void 0,(function*(){var t;const l=yield ce(),i={data:Object.assign({prompt:"none",state:oe},e),type:x},n=yield S(i),o=Z.extractPKCEKeyFromStateParam(null!==(t=new URL(n.authorizationURL).searchParams.get(s))&&void 0!==t?t:"");n.pkce&&l.enablePKCE&&me.setPKCE(o,n.pkce);const c=n.authorizationURL,d=new URL(c);d.searchParams.set("response_mode","query");return d.toString()})),ee=e=>t(void 0,void 0,void 0,(function*(){const l=yield ce();return S({data:e,type:x}).then((e=>t(void 0,void 0,void 0,(function*(){var t;if(e.pkce&&l.enablePKCE){const l=Z.extractPKCEKeyFromStateParam(null!==(t=new URL(e.authorizationURL).searchParams.get(s))&&void 0!==t?t:"");me.setPKCE(l,e.pkce)}return Promise.resolve(e)}))))})),te=(e,i,n,o)=>t(void 0,void 0,void 0,(function*(){const t=yield ce(),c=Z.extractPKCEKeyFromStateParam(n),d={data:{code:e,pkce:t.enablePKCE?me.getPKCE(c):void 0,sessionState:i,state:n,tokenRequestConfig:o},type:z};return t.enablePKCE&&me.removePKCE(c),S(d).then((e=>S({type:P}).then((i=>(me.setSignOutURL(i,t.clientID,l),t.enableOIDCSessionManagement&&_(),A(),Promise.resolve(e)))).catch((e=>Promise.reject(e))))).catch((e=>Promise.reject(e)))})),le=()=>t(void 0,void 0,void 0,(function*(){return yield V.receivePromptNoneResponse((e=>t(void 0,void 0,void 0,(function*(){return j(e)}))))})),ie=()=>t(void 0,void 0,void 0,(function*(){if(yield ae())return yield A(),i.enableOIDCSessionManagement&&_(),de()})),ne=()=>S({type:L}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),ce=()=>S({type:q}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),de=()=>S({type:H}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),ae=()=>S({type:B}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e)));return{disableHttpHandler:()=>S({type:w}).then((()=>(b=!1,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),enableHttpHandler:()=>S({type:F}).then((()=>(b=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),getBasicUserInfo:de,getConfigData:ce,getCryptoHelper:()=>S({type:T}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDPIDToken:()=>S({type:"get-decoded-idp-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDToken:()=>S({type:U}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getIDToken:()=>S({type:O}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getOIDCServiceEndpoints:ne,httpRequest:e=>{(null==e?void 0:e.data)&&(null==e?void 0:e.data)instanceof FormData&&(e.data=Object.assign(Object.assign({},Object.fromEntries(null==e?void 0:e.data.entries())),{formData:!0}));return S({data:e,type:Y}).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return b&&("function"==typeof r.requestErrorCallback&&(yield r.requestErrorCallback(e)),"function"==typeof r.requestFinishCallback&&r.requestFinishCallback()),Promise.reject(e)}))))},httpRequestAll:e=>S({data:e,type:K}).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return b&&("function"==typeof r.requestErrorCallback&&(yield r.requestErrorCallback(e)),"function"==typeof r.requestFinishCallback&&r.requestFinishCallback()),Promise.reject(e)})))),initialize:()=>{r||(r={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),R.onmessage=({data:e})=>{switch(e.type){case C:(null==r?void 0:r.requestFinishCallback)&&(null==r||r.requestFinishCallback());break;case N:(null==r?void 0:r.requestStartCallback)&&(null==r||r.requestStartCallback());break;case k:(null==r?void 0:r.requestSuccessCallback)&&(null==r||r.requestSuccessCallback(e.data?JSON.parse(e.data):null))}};return S({data:i,type:g}).then((()=>Promise.resolve(!0))).catch((e=>Promise.reject(e)))},isAuthenticated:ae,refreshAccessToken:()=>S({type:M}),requestCustomGrant:e=>S({data:e,type:J}).then((t=>(e.preventSignOutURLUpdate&&(m=!0),Promise.resolve(t)))).catch((e=>Promise.reject(e))),revokeAccessToken:()=>S({type:f}).then((e=>(V.reset(),Promise.resolve(e)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{e&&"function"==typeof e&&(r.requestErrorCallback=e)},setHttpRequestFinishCallback:e=>{e&&"function"==typeof e&&(r.requestFinishCallback=e)},setHttpRequestStartCallback:e=>{e&&"function"==typeof e&&(r.requestStartCallback=e)},setHttpRequestSuccessCallback:e=>{e&&"function"==typeof e&&(r.requestSuccessCallback=e)},signIn:(l,n,d,a,r)=>t(void 0,void 0,void 0,(function*(){var u,Z,h;const b=yield I.handleSignIn(le,_,ie);if(b)return b;{let b,m,p;return(null==i?void 0:i.responseMode)===e.ResponseMode.formPost&&n?(b=n,m=null!=d?d:"",p=null!=a?a:""):(b=null!==(u=new URL(window.location.href).searchParams.get(o))&&void 0!==u?u:"",m=null!==(Z=new URL(window.location.href).searchParams.get(c))&&void 0!==Z?Z:"",p=null!==(h=new URL(window.location.href).searchParams.get(s))&&void 0!==h?h:"",me.removeAuthorizationCode()),b&&p?te(b,m,p,r):ee(l).then((e=>t(void 0,void 0,void 0,(function*(){return location.href=e.authorizationURL,yield me.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((e=>Promise.reject(e)))}})),signOut:()=>new Promise(((e,n)=>{if(!m){return S({type:v}).then((l=>t(void 0,void 0,void 0,(function*(){return window.location.href=l,yield me.waitTillPageRedirect(),e(!0)})))).catch((e=>n(e)))}window.location.href=me.getSignOutURL(i.clientID,l),me.waitTillPageRedirect().then((()=>Promise.resolve(!0)))})),trySignInSilently:(e,l)=>t(void 0,void 0,void 0,(function*(){return yield I.trySignInSilently($,te,V,e,l)})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){const t=yield ce(),l=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},t),e),n={data:i,type:D};yield S(n),i.enableOIDCSessionManagement&&l&&(V.reset(),_())}))}})),To={autoLogoutOnTokenRefreshError:!0,checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,periodicTokenRefresh:!1,sessionRefreshInterval:300,storage:he.SessionStorage};class Fo{constructor(e){this._authHelper=pe,this._worker=S,this._initialized=!1,this._startedInitialize=!1,this._onSignInCallback=()=>null,this._onSignOutCallback=()=>null,this._onSignOutFailedCallback=()=>null,this._onEndUserSession=()=>null,this._onInitialize=()=>null,this._onCustomGrant=new Map,this._instanceID=e}instantiateAuthHelper(e){this._authHelper=e||pe}instantiateWorker(e){this._worker=e||S}_isInitialized(){return t(this,void 0,void 0,(function*(){if(!this._startedInitialize)return!1;let e=0;for(;!this._initialized;)1e4===e&&console.warn("It is taking longer than usual for the object to be initialized"),yield new Promise((e=>setTimeout(e,1))),e++;return!0}))}_validateMethod(e=!0){return t(this,void 0,void 0,(function*(){return(yield this._isInitialized())?!(e&&!(yield this.isAuthenticated()))||Promise.reject(new u("SPA-AUTH_CLIENT-VM-IV02","The user is not authenticated.","The user must be authenticated first.")):Promise.reject(new u("SPA-AUTH_CLIENT-VM-NF01","The SDK is not initialized.","The SDK must be initialized first."))}))}static getInstance(e){var t,l;return e&&(null===(t=this._instances)||void 0===t?void 0:t.get(e))?this._instances.get(e):!e&&(null===(l=this._instances)||void 0===l?void 0:l.get(0))?this._instances.get(0):e?(this._instances.set(e,new Fo(e)),this._instances.get(e)):(this._instances.set(0,new Fo(0)),this._instances.get(0))}initialize(e,l,i){var n,o,c,d;return t(this,void 0,void 0,(function*(){this._storage=null!==(n=e.storage)&&void 0!==n?n:he.SessionStorage,this._initialized=!1,this._startedInitialize=!0,l&&this.instantiateAuthHelper(l),i&&this.instantiateWorker(i);const t=yield null===(o=this._client)||void 0===o?void 0:o.getConfigData();if(this._storage!==he.WebWorker){const l=e,i=Object.assign({},To),n=Object.assign(Object.assign({},i),l);return this._client&&(!this._client||t&&0!==(null===(c=Object.keys(t))||void 0===c?void 0:c.length))||(this._client=yield Ho(this._instanceID,n,((e,t)=>new this._authHelper(e,t)))),this._initialized=!0,this._onInitialize&&this._onInitialize(!0),n.autoLogoutOnTokenRefreshError?(window.addEventListener("message",(e=>{var t;(null===(t=null==e?void 0:e.data)||void 0===t?void 0:t.type)===j&&this.signOut()})),Promise.resolve(!0)):Promise.resolve(!0)}if(!this._client||this._client&&(!t||0===(null===(d=Object.keys(t))||void 0===d?void 0:d.length))){const t=e;return this._client=yield Uo(this._instanceID,Object.assign(Object.assign({},To),t),this._worker,((e,t)=>new this._authHelper(e,t))),this._client.initialize().then((()=>(this._onInitialize&&this._onInitialize(!0),this._initialized=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e)))}return Promise.resolve(!0)}))}getBasicUserInfo(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(e=this._client)||void 0===e?void 0:e.getBasicUserInfo()}))}signIn(e,l,i,n,o){var c;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),me.canContinueSignIn(Boolean(null==e?void 0:e.callOnlyOnRedirect),l))return null==e||delete e.callOnlyOnRedirect,null===(c=this._client)||void 0===c?void 0:c.signIn(e,l,i,n,o).then((e=>(this._onSignInCallback&&(e.allowedScopes||e.displayName||e.email||e.username)&&this._onSignInCallback(e),e)))}))}trySignInSilently(e,l){var i;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!me.wasSignInCalled())return null===(i=this._client)||void 0===i?void 0:i.trySignInSilently(e,l).then((e=>{if(this._onSignInCallback&&e){const t=e;(t.allowedScopes||t.displayName||t.email||t.username)&&this._onSignInCallback(t)}return e}))}))}signOut(){var e,l;return t(this,void 0,void 0,(function*(){yield this._validateMethod(!1);return null!==(l=yield null===(e=this._client)||void 0===e?void 0:e.signOut())&&void 0!==l&&l}))}httpRequest(e){var l;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(!1),null===(l=this._client)||void 0===l?void 0:l.httpRequest(e)}))}httpRequestAll(e){var l;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(!1),null===(l=this._client)||void 0===l?void 0:l.httpRequestAll(e)}))}requestCustomGrant(e){var l,i;return t(this,void 0,void 0,(function*(){if(e.signInRequired,yield this._validateMethod(),!e.id)return Promise.reject(new u("SPA-AUTH_CLIENT-RCG-NF01","The custom grant request id not found.","The id attribute of the custom grant config object passed as an argument should have a value."));const t=yield null===(l=this._client)||void 0===l?void 0:l.requestCustomGrant(e),n=this._onCustomGrant.get(e.id);return n&&n(null===(i=this._onCustomGrant)||void 0===i?void 0:i.get(e.id)),t}))}revokeAccessToken(){var e;return t(this,void 0,void 0,(function*(){yield this._validateMethod();const t=yield null===(e=this._client)||void 0===e?void 0:e.revokeAccessToken();return this._onEndUserSession&&(yield this._onEndUserSession(t)),t}))}getOIDCServiceEndpoints(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.getOIDCServiceEndpoints()}))}getHttpClient(){if(this._client){if(this._storage!==he.WebWorker){return this._client.getHttpClient()}throw new u("SPA-AUTH_CLIENT-GHC-IV01","Http client cannot be returned.","The http client cannot be returned when the storage type is set to webWorker.")}throw new u("SPA-AUTH_CLIENT-GHC-NF02","The SDK is not initialized.","The SDK has not been initialized yet. Initialize the SDK using the initialize method before calling this method.")}getDecodedIDToken(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(e=this._client)||void 0===e?void 0:e.getDecodedIDToken()}))}getCryptoHelper(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(e=this._client)||void 0===e?void 0:e.getCryptoHelper()}))}getIDToken(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(e=this._client)||void 0===e?void 0:e.getIDToken()}))}getAccessToken(){return t(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(he.WebWorker,he.BrowserMemory)].includes(this._storage))return Promise.reject(new u("SPA-AUTH_CLIENT-GAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}getIDPAccessToken(){return t(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(he.WebWorker,he.BrowserMemory)].includes(this._storage))return Promise.reject(new u("SPA-AUTH_CLIENT-GIAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}getDataLayer(){return t(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(he.WebWorker,he.BrowserMemory)].includes(this._storage))return Promise.reject(new u("SPA-AUTH_CLIENT-GDL-IV01","The data layer cannot be returned.","The data layer cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getDataLayer()}))}getConfigData(){var e;return t(this,void 0,void 0,(function*(){return null===(e=this._client)||void 0===e?void 0:e.getConfigData()}))}refreshAccessToken(){var e;return t(this,void 0,void 0,(function*(){return yield this._validateMethod(!1),null===(e=this._client)||void 0===e?void 0:e.refreshAccessToken()}))}isAuthenticated(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.isAuthenticated()}))}isSessionActive(){return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage&&[(he.WebWorker,he.BrowserMemory)].includes(this._storage))return Promise.reject(new u("SPA-AUTH_CLIENT-ISA-IV01","The active session cannot be returned.","The active session cannot be returned when the storage type is set to webWorker or browserMemory."));const e=this._client;return null==e?void 0:e.isSessionActive()}))}on(l,i,n){var o,c,d,a;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!i||"function"!=typeof i)throw new u("SPA-AUTH_CLIENT-ON-IV02","Invalid callback function.","The provided callback function is invalid.");switch(l){case e.Hooks.SignIn:this._onSignInCallback=i;break;case e.Hooks.SignOut:this._onSignOutCallback=i,(yield me.isSignOutSuccessful())&&this._onSignOutCallback();break;case e.Hooks.RevokeAccessToken:this._onEndUserSession=i;break;case e.Hooks.Initialize:this._onInitialize=i;break;case e.Hooks.HttpRequestError:null===(o=this._client)||void 0===o||o.setHttpRequestErrorCallback(i);break;case e.Hooks.HttpRequestFinish:null===(c=this._client)||void 0===c||c.setHttpRequestFinishCallback(i);break;case e.Hooks.HttpRequestStart:null===(d=this._client)||void 0===d||d.setHttpRequestStartCallback(i);break;case e.Hooks.HttpRequestSuccess:null===(a=this._client)||void 0===a||a.setHttpRequestSuccessCallback(i);break;case e.Hooks.CustomGrant:n&&this._onCustomGrant.set(n,i);break;case e.Hooks.SignOutFailed:{this._onSignOutFailedCallback=i;const e=me.didSignOutFail();e&&this._onSignOutFailedCallback(e);break}default:throw new u("SPA-AUTH_CLIENT-ON-IV01","Invalid hook.","The provided hook is invalid.")}}))}enableHttpHandler(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.enableHttpHandler()}))}disableHttpHandler(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.disableHttpHandler()}))}updateConfig(e){return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===he.WebWorker){const t=this._client;yield t.updateConfig(e)}else{const t=this._client;yield t.updateConfig(e)}}))}}Fo._instances=new Map;class wo extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}return e.ASGARDEO_SESSION_ACTIVE="asgardeo-session-active",e.AUTHORIZATION_CODE=o,e.AsgardeoAuthClient=X,e.AsgardeoAuthException=u,e.AsgardeoSPAClient=Fo,e.AuthenticationHelper=pe,e.AuthenticationUtils=Z,e.CLIENT_ID_TAG="{{clientID}}",e.CLIENT_SECRET_TAG="{{clientSecret}}",e.CryptoHelper=b,e.DataLayer=p,e.HttpError=gn.AxiosError,e.MainThreadClient=Ho,e.OIDC_SCOPE="openid",e.PKCE_CODE_VERIFIER="pkce_code_verifier",e.PKCE_SEPARATOR="#",e.REFRESH_TOKEN_TIMER=i,e.SCOPE_TAG="{{scope}}",e.SESSION_STATE=c,e.SIGN_OUT_SUCCESS_PARAM=a,e.SIGN_OUT_URL=d,e.SPAHelper=Ge,e.SPAUtils=me,e.STATE=s,e.SUPPORTED_SIGNATURE_ALGORITHMS=n,e.TOKEN_REQUEST_CONFIG_KEY=ee,e.TOKEN_TAG="{{token}}",e.USERNAME_TAG="{{username}}",e.WebWorkerClass=wo,e.WebWorkerClient=Uo,e.workerReceiver=e=>{const l=self;let i;l.onmessage=({data:l,ports:a})=>t(void 0,void 0,void 0,(function*(){var r,Z,h,b,m,p;const G=a[0];if(l.type===g||i)switch(l.type){case g:try{const a=Object.assign({},l.data);i=yield((e,l)=>t(void 0,void 0,void 0,(function*(){const i=new Kn,n=new Lo,o=new X;yield o.initialize(e,i,n);const d=new Ge(o),a=l(o,d),r=o.getDataLayer(),u=vn.getInstance();return(null==u?void 0:u.init)&&(yield u.init(!0,(e=>t(void 0,void 0,void 0,(function*(){yield a.attachTokenToRequestConfig(e)}))))),{disableHttpHandler:()=>{a.disableHttpHandler(u)},enableHttpHandler:()=>{a.enableHttpHandler(u)},getAccessToken:()=>a.getAccessToken(),getAuthorizationURL:e=>t(void 0,void 0,void 0,(function*(){return o.getAuthorizationURL(e).then((e=>t(void 0,void 0,void 0,(function*(){var t;const l=null!==(t=new URL(e).searchParams.get(s))&&void 0!==t?t:"",i=yield o.getPKCECode(l);return{authorizationURL:e,pkce:i}})))).catch((e=>Promise.reject(e)))})),getBasicUserInfo:()=>t(void 0,void 0,void 0,(function*(){return a.getBasicUserInfo()})),getConfigData:()=>t(void 0,void 0,void 0,(function*(){return r.getConfigData()})),getCryptoHelper:()=>t(void 0,void 0,void 0,(function*(){return a.getCryptoHelper()})),getDecodedIDPIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getDecodedIDPIDToken()})),getDecodedIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getDecodedIDToken()})),getIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getIDToken()})),getOIDCServiceEndpoints:()=>t(void 0,void 0,void 0,(function*(){return a.getOIDCServiceEndpoints()})),getSignOutURL:()=>t(void 0,void 0,void 0,(function*(){return yield o.getSignOutURL()})),httpRequest:e=>t(void 0,void 0,void 0,(function*(){return yield a.httpRequest(u,e)})),httpRequestAll:e=>t(void 0,void 0,void 0,(function*(){return yield a.httpRequestAll(e,u)})),isAuthenticated:()=>a.isAuthenticated(),refreshAccessToken:()=>t(void 0,void 0,void 0,(function*(){try{return yield a.refreshAccessToken()}catch(e){return Promise.reject(e)}})),requestAccessToken:(e,l,i,n)=>t(void 0,void 0,void 0,(function*(){return yield a.requestAccessToken(e,l,void 0,i,n)})),requestCustomGrant:e=>t(void 0,void 0,void 0,(function*(){return yield a.requestCustomGrant(e)})),revokeAccessToken:()=>t(void 0,void 0,void 0,(function*(){const e=yield d.getRefreshTimeoutTimer();return o.revokeAccessToken().then((()=>(d.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestFinishCallback:e=>{(null==u?void 0:u.setHttpRequestFinishCallback)&&u.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==u?void 0:u.setHttpRequestStartCallback)&&u.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==u?void 0:u.setHttpRequestSuccessCallback)&&u.setHttpRequestSuccessCallback(e)},setSessionState:e=>t(void 0,void 0,void 0,(function*(){yield r.setSessionDataParameter(c,e)})),signOut:()=>t(void 0,void 0,void 0,(function*(){return d.clearRefreshTokenTimeout(),yield o.getSignOutURL()})),startAutoRefreshToken:()=>t(void 0,void 0,void 0,(function*(){d.clearRefreshTokenTimeout(),d.refreshAccessTokenAutomatically(a)})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){yield o.updateConfig(e)}))}})))(a,e),i.setHttpRequestFinishCallback(d),i.setHttpRequestStartCallback(n),i.setHttpRequestSuccessCallback(o),G.postMessage(be.generateSuccessMessage())}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case x:i.getAuthorizationURL(null==l?void 0:l.data).then((e=>{G.postMessage(be.generateSuccessMessage(e))})).catch((e=>{G.postMessage(be.generateFailureMessage(e))}));break;case z:i.requestAccessToken(null===(r=null==l?void 0:l.data)||void 0===r?void 0:r.code,null===(Z=null==l?void 0:l.data)||void 0===Z?void 0:Z.sessionState,null===(h=null==l?void 0:l.data)||void 0===h?void 0:h.pkce,null===(b=null==l?void 0:l.data)||void 0===b?void 0:b.state).then((e=>{G.postMessage(be.generateSuccessMessage(e))})).catch((e=>{G.postMessage(be.generateFailureMessage(e))}));break;case Y:{const e=l.data,t=null==e?void 0:e.data;if(!0===(null===(p=null===(m=l.data)||void 0===m?void 0:m.data)||void 0===p?void 0:p.formData)){const l=new FormData;for(const e in t)"formData"!==e&&l.append(e,t[e]);e.data=l}i.httpRequest(e).then((e=>{G.postMessage(be.generateSuccessMessage(e))})).catch((e=>{G.postMessage(be.generateFailureMessage(e))}));break}case K:i.httpRequestAll(l.data).then((e=>{G.postMessage(be.generateSuccessMessage(e))})).catch((e=>{G.postMessage(be.generateFailureMessage(e))}));break;case v:try{G.postMessage(be.generateSuccessMessage(yield i.signOut()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case J:i.requestCustomGrant(l.data).then((e=>{G.postMessage(be.generateSuccessMessage(e))})).catch((e=>{G.postMessage(be.generateFailureMessage(e))}));break;case f:i.revokeAccessToken().then((e=>{G.postMessage(be.generateSuccessMessage(e))})).catch((e=>{G.postMessage(be.generateFailureMessage(e))}));break;case L:try{G.postMessage(be.generateSuccessMessage(yield i.getOIDCServiceEndpoints()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case H:try{G.postMessage(be.generateSuccessMessage(yield i.getBasicUserInfo()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case U:try{G.postMessage(be.generateSuccessMessage(yield i.getDecodedIDToken()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case T:try{G.postMessage(be.generateSuccessMessage(yield i.getCryptoHelper()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case O:try{G.postMessage(be.generateSuccessMessage(yield i.getIDToken()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case F:i.enableHttpHandler(),G.postMessage(be.generateSuccessMessage());break;case w:i.disableHttpHandler(),G.postMessage(be.generateSuccessMessage());break;case B:try{G.postMessage(be.generateSuccessMessage(yield i.isAuthenticated()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case P:try{G.postMessage(be.generateSuccessMessage(yield i.getSignOutURL()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case M:try{G.postMessage(be.generateSuccessMessage(yield i.refreshAccessToken()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case E:try{G.postMessage(be.generateSuccessMessage(i.startAutoRefreshToken()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case Q:try{G.postMessage(be.generateSuccessMessage(yield i.setSessionState(null==l?void 0:l.data)))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case D:try{G.postMessage(be.generateSuccessMessage(yield i.updateConfig(null==l?void 0:l.data)))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;case q:try{G.postMessage(be.generateSuccessMessage(yield i.getConfigData()))}catch(e){G.postMessage(be.generateFailureMessage(e))}break;default:null==G||G.postMessage(be.generateFailureMessage(new u("SPA-CLIENT_WORKER-ONMSG-IV02","The message type is invalid.",`The message type provided, ${l.type}, is invalid.`)))}else G.postMessage(be.generateFailureMessage(new u("SPA-CLIENT_WORKER-ONMSG-NF01","The web worker has not been initialized yet.","The initialize method needs to be called before the specified operation can be carried out.")))}));const n=()=>{l.postMessage({type:N})},o=e=>{l.postMessage({data:JSON.stringify(null!=e?e:""),type:k})},d=()=>{l.postMessage({type:C})}},Object.defineProperty(e,"__esModule",{value:!0}),e}({});
|
|
2
2
|
//# sourceMappingURL=asgardeo-spa.production.min.js.map
|