@alauda-fe/common
Version:
Alauda frontend team common codes.
157 lines • 22.6 kB
JavaScript
import { getTopWindow, NOT_NOTIFY_ON_ERROR_HEADERS, } from '../core/public-api';
import { getInitUrl, recordInitUrl } from './app-init-url';
import { CALLBACK_API, CODE_KEY, EXTERNAL_REDIRECT_API, ID_TOKEN_KEY, LOGIN_API, LOGOUT_API, REDIRECT_URIS, } from './constants';
import { cleanStorageToken, readStorageToken, refreshStorageAliveRecord, writeStorageToken, } from './storage-token';
let AUTHORIZATION_STATE;
export async function fetchAuthorizationState() {
if (AUTHORIZATION_STATE !== undefined) {
return AUTHORIZATION_STATE;
}
recordInitUrl();
const config = await getAuthConfiguration();
const state = await getExistedToken(config);
const authorizationState = { ...config, ...state };
initAuthorizationState(authorizationState);
return authorizationState;
}
export function getAuthorizationState() {
if (AUTHORIZATION_STATE === undefined) {
throw new Error('AuthorizationState have not been initialized');
}
return AUTHORIZATION_STATE;
}
export function initAuthorizationState(state) {
if (AUTHORIZATION_STATE !== undefined &&
// @ts-expect-error -- webpack specific
!module.hot) {
throw new Error('authorizationState have been initialized');
}
AUTHORIZATION_STATE = state;
}
export function attachAuthorizationHeader() {
const idToken = readStorageToken();
return idToken
? {
Authorization: `Bearer ${idToken}`,
}
: {};
}
export async function logoutAudit() {
return fetch(LOGOUT_API, {
headers: {
...attachAuthorizationHeader(),
...NOT_NOTIFY_ON_ERROR_HEADERS,
},
})
.then(res => res?.json())
.catch(() => null); // logout API 未指定 logout_redirect_url 时 res?.json() 会失败
}
export function logout(returnCurrentPage = false) {
cleanStorageToken();
const logoutUrl = typeof returnCurrentPage === 'string' && returnCurrentPage !== ''
? returnCurrentPage
: dexLogoutUrl(!!returnCurrentPage);
try {
getTopWindow().location.href = logoutUrl;
}
catch {
// should never happen, just for robustness in case of cross-origin iframe
location.href = logoutUrl;
}
}
export function redirectSSOEntry(entry) {
const hasQuery = entry.includes('?');
if (hasQuery) {
const [url, query] = entry.split('?');
return `${EXTERNAL_REDIRECT_API}?redirect_url=${url}&${query}`;
}
return `${EXTERNAL_REDIRECT_API}?redirect_url=${entry}`;
}
function dexLogoutUrl(returnCurrentPage = false) {
const { authUrl } = getAuthorizationState();
return replaceRedirectUrl(authUrl,
// authUrl 中的 redirectUrl 是根路由,根路由二次重定向回 portal 时会丢失 code 导致登录失败
// 如果后期有定制化要求默认首页不是 portal,可以改回之前的方案,使用浏览器导航打开 logoutUrl,然后 dex 重定向到根路由,根路由重定向到默认首页,首页再将 authUrl 中的 redirectUrl 替换为当前 url 跳转到 dex 进行登录;
// 最好环境变量增加默认首页地址或者 dex redirectUrl 直接是正确地址
returnCurrentPage ? location.href : location.origin + '/console-portal');
}
function replaceRedirectUrl(dexUrl, redirectUrl) {
const [path, queryParams] = dexUrl.split('?');
const replacedQueryParams = queryParams
.split('&')
.map(pair => {
const [key, value] = pair.split('=');
return REDIRECT_URIS.has(key)
? `${key}=${encodeURIComponent(redirectUrl)}`
: `${key}=${value}`;
})
.join('&');
return `${path}?${replacedQueryParams}`;
}
async function getAuthConfiguration() {
return fetch(LOGIN_API)
.then(res => res.json())
.then(({ auth_url: authUrl, state, logout_url: logoutUrl, }) => ({
authUrl,
state,
logoutUrl,
}));
}
async function getExistedToken(config) {
try {
return getTokenFromLocal(config);
}
catch {
return {};
}
}
async function getTokenFromLocal(config) {
const { queryParams, hashParams } = getParams();
const code = queryParams[CODE_KEY] || hashParams[CODE_KEY];
const idToken = queryParams[ID_TOKEN_KEY] || hashParams[ID_TOKEN_KEY];
if (!code && !idToken) {
return null;
}
refreshStorageAliveRecord();
return code ? setCookieByCode(code, config.state) : setCookieByToken(idToken);
}
async function setCookieByCode(code, state) {
const queryParams = new URLSearchParams({ code, state });
const tokenResponse = await fetch(`${CALLBACK_API}?${queryParams.toString()}`).then(res => res.json());
return mapTokenResponse(tokenResponse);
}
async function setCookieByToken(idToken) {
const queryParams = new URLSearchParams({ id_token: idToken });
const tokenResponse = await fetch(`${CALLBACK_API}?${queryParams.toString()}`).then(res => res.json());
return mapTokenResponse(tokenResponse);
}
function mapTokenResponse(response) {
const { id_token: idToken, token_type, token_storage, expire_at, issued_at, } = response;
writeStorageToken(idToken);
return {
storageType: token_storage,
tokenType: token_type,
expireAt: expire_at,
issuedAt: issued_at,
};
}
function getParams() {
const initUrl = getInitUrl();
const initLocation = new URL(initUrl);
const queryParams = parseParams(initLocation.search ? initLocation.search.slice(1) : '');
const hashParams = parseParams(initLocation.hash ? initLocation.hash.slice(1) : '');
return { queryParams, hashParams };
}
function parseParams(query) {
if (!query) {
return {};
}
return query.split('&').reduce((acc, param) => {
const [key, value] = param.split('=');
return {
...acc,
[key]: value,
};
}, {});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL2F1dGhvcml6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWiwyQkFBMkIsR0FFNUIsTUFBTSxvQkFBb0IsQ0FBQztBQUc1QixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFDTCxZQUFZLEVBQ1osUUFBUSxFQUNSLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixhQUFhLEdBQ2QsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBbUJ6QixJQUFJLG1CQUF1QyxDQUFDO0FBRTVDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCO0lBQzNDLElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQsYUFBYSxFQUFFLENBQUM7SUFFaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxvQkFBb0IsRUFBRSxDQUFDO0lBRTVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO0lBRW5ELHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFM0MsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsT0FBTyxtQkFBbUIsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEtBQXlCO0lBQzlELElBQ0UsbUJBQW1CLEtBQUssU0FBUztRQUNqQyx1Q0FBdUM7UUFDdkMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUNYLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELG1CQUFtQixHQUFHLEtBQUssQ0FBQztBQUM5QixDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QjtJQUN2QyxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ25DLE9BQU8sT0FBTztRQUNaLENBQUMsQ0FBQztZQUNFLGFBQWEsRUFBRSxVQUFVLE9BQU8sRUFBRTtTQUNuQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXO0lBQy9CLE9BQU8sS0FBSyxDQUFDLFVBQVUsRUFBRTtRQUN2QixPQUFPLEVBQUU7WUFDUCxHQUFHLHlCQUF5QixFQUFFO1lBQzlCLEdBQUcsMkJBQTJCO1NBQy9CO0tBQ0YsQ0FBQztTQUNDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN4QixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyx1REFBdUQ7QUFDL0UsQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNLENBQUMsb0JBQXNDLEtBQUs7SUFDaEUsaUJBQWlCLEVBQUUsQ0FBQztJQUVwQixNQUFNLFNBQVMsR0FDYixPQUFPLGlCQUFpQixLQUFLLFFBQVEsSUFBSSxpQkFBaUIsS0FBSyxFQUFFO1FBQy9ELENBQUMsQ0FBQyxpQkFBaUI7UUFDbkIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV4QyxJQUFJLENBQUM7UUFDSCxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsMEVBQTBFO1FBQzFFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO0lBQzVCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWE7SUFDNUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVyQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sR0FBRyxxQkFBcUIsaUJBQWlCLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0lBRUQsT0FBTyxHQUFHLHFCQUFxQixpQkFBaUIsS0FBSyxFQUFFLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLGlCQUFpQixHQUFHLEtBQUs7SUFDN0MsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLHFCQUFxQixFQUFFLENBQUM7SUFDNUMsT0FBTyxrQkFBa0IsQ0FDdkIsT0FBTztJQUNQLGdFQUFnRTtJQUNoRSx1SUFBdUk7SUFDdkksMkNBQTJDO0lBQzNDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUN4RSxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsTUFBYyxFQUFFLFdBQW1CO0lBQzdELE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5QyxNQUFNLG1CQUFtQixHQUFHLFdBQVc7U0FDcEMsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNWLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUM3QyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFDeEIsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWIsT0FBTyxHQUFHLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0FBQzFDLENBQUM7QUFFRCxLQUFLLFVBQVUsb0JBQW9CO0lBQ2pDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQztTQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDdkIsSUFBSSxDQUNILENBQUMsRUFDQyxRQUFRLEVBQUUsT0FBTyxFQUNqQixLQUFLLEVBQ0wsVUFBVSxFQUFFLFNBQVMsR0FLdEIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNMLE9BQU87UUFDUCxLQUFLO1FBQ0wsU0FBUztLQUNWLENBQUMsQ0FDSCxDQUFDO0FBQ04sQ0FBQztBQUVELEtBQUssVUFBVSxlQUFlLENBQUMsTUFBMEI7SUFDdkQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxFQUF3QixDQUFDO0lBQ2xDLENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLGlCQUFpQixDQUM5QixNQUEwQjtJQUUxQixNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBRWhELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUV0RSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQseUJBQXlCLEVBQUUsQ0FBQztJQUU1QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCxLQUFLLFVBQVUsZUFBZSxDQUFDLElBQVksRUFBRSxLQUFhO0lBQ3hELE1BQU0sV0FBVyxHQUFHLElBQUksZUFBZSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFekQsTUFBTSxhQUFhLEdBQWtCLE1BQU0sS0FBSyxDQUM5QyxHQUFHLFlBQVksSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDNUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUxQixPQUFPLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsT0FBZTtJQUM3QyxNQUFNLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sYUFBYSxHQUFrQixNQUFNLEtBQUssQ0FDOUMsR0FBRyxZQUFZLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQzVDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFFMUIsT0FBTyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxRQUF1QjtJQUMvQyxNQUFNLEVBQ0osUUFBUSxFQUFFLE9BQU8sRUFDakIsVUFBVSxFQUNWLGFBQWEsRUFDYixTQUFTLEVBQ1QsU0FBUyxHQUNWLEdBQUcsUUFBUSxDQUFDO0lBRWIsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFM0IsT0FBTztRQUNMLFdBQVcsRUFBRSxhQUFhO1FBQzFCLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFFBQVEsRUFBRSxTQUFTO0tBQ3BCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxTQUFTO0lBQ2hCLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO0lBRTdCLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRDLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FDN0IsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDeEQsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FDNUIsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDcEQsQ0FBQztJQUVGLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWE7SUFDaEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM1QyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEMsT0FBTztZQUNMLEdBQUcsR0FBRztZQUNOLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSztTQUNiLENBQUM7SUFDSixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZ2V0VG9wV2luZG93LFxuICBOT1RfTk9USUZZX09OX0VSUk9SX0hFQURFUlMsXG4gIFN0cmluZ01hcCxcbn0gZnJvbSAnLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEFjY291bnRJbmZvIH0gZnJvbSAnLi4vcGFnZS1zY2FmZm9sZC9wdWJsaWMtYXBpJztcblxuaW1wb3J0IHsgZ2V0SW5pdFVybCwgcmVjb3JkSW5pdFVybCB9IGZyb20gJy4vYXBwLWluaXQtdXJsJztcbmltcG9ydCB7XG4gIENBTExCQUNLX0FQSSxcbiAgQ09ERV9LRVksXG4gIEVYVEVSTkFMX1JFRElSRUNUX0FQSSxcbiAgSURfVE9LRU5fS0VZLFxuICBMT0dJTl9BUEksXG4gIExPR09VVF9BUEksXG4gIFJFRElSRUNUX1VSSVMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGNsZWFuU3RvcmFnZVRva2VuLFxuICByZWFkU3RvcmFnZVRva2VuLFxuICByZWZyZXNoU3RvcmFnZUFsaXZlUmVjb3JkLFxuICB3cml0ZVN0b3JhZ2VUb2tlbixcbn0gZnJvbSAnLi9zdG9yYWdlLXRva2VuJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpemF0aW9uU3RhdGUge1xuICBleHBpcmVBdD86IHN0cmluZztcbiAgaXNzdWVkQXQ/OiBzdHJpbmc7XG4gIHN0YXRlPzogc3RyaW5nO1xuICBhdXRoVXJsPzogc3RyaW5nO1xuICBsb2dvdXRVcmw/OiBzdHJpbmc7XG4gIGluZm8/OiBBY2NvdW50SW5mbztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblJlc3BvbnNlIHtcbiAgdG9rZW5fc3RvcmFnZTogc3RyaW5nO1xuICB0b2tlbl90eXBlOiBzdHJpbmc7XG4gIGV4cGlyZV9hdDogc3RyaW5nO1xuICBpc3N1ZWRfYXQ6IHN0cmluZztcbiAgaWRfdG9rZW4/OiBzdHJpbmc7XG59XG5cbmxldCBBVVRIT1JJWkFUSU9OX1NUQVRFOiBBdXRob3JpemF0aW9uU3RhdGU7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEF1dGhvcml6YXRpb25TdGF0ZSgpIHtcbiAgaWYgKEFVVEhPUklaQVRJT05fU1RBVEUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBBVVRIT1JJWkFUSU9OX1NUQVRFO1xuICB9XG5cbiAgcmVjb3JkSW5pdFVybCgpO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldEF1dGhDb25maWd1cmF0aW9uKCk7XG5cbiAgY29uc3Qgc3RhdGUgPSBhd2FpdCBnZXRFeGlzdGVkVG9rZW4oY29uZmlnKTtcblxuICBjb25zdCBhdXRob3JpemF0aW9uU3RhdGUgPSB7IC4uLmNvbmZpZywgLi4uc3RhdGUgfTtcblxuICBpbml0QXV0aG9yaXphdGlvblN0YXRlKGF1dGhvcml6YXRpb25TdGF0ZSk7XG5cbiAgcmV0dXJuIGF1dGhvcml6YXRpb25TdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF1dGhvcml6YXRpb25TdGF0ZSgpIHtcbiAgaWYgKEFVVEhPUklaQVRJT05fU1RBVEUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aG9yaXphdGlvblN0YXRlIGhhdmUgbm90IGJlZW4gaW5pdGlhbGl6ZWQnKTtcbiAgfVxuXG4gIHJldHVybiBBVVRIT1JJWkFUSU9OX1NUQVRFO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdEF1dGhvcml6YXRpb25TdGF0ZShzdGF0ZTogQXV0aG9yaXphdGlvblN0YXRlKTogdm9pZCB7XG4gIGlmIChcbiAgICBBVVRIT1JJWkFUSU9OX1NUQVRFICE9PSB1bmRlZmluZWQgJiZcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0tIHdlYnBhY2sgc3BlY2lmaWNcbiAgICAhbW9kdWxlLmhvdFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2F1dGhvcml6YXRpb25TdGF0ZSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQnKTtcbiAgfVxuXG4gIEFVVEhPUklaQVRJT05fU1RBVEUgPSBzdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaEF1dGhvcml6YXRpb25IZWFkZXIoKTogeyBBdXRob3JpemF0aW9uPzogc3RyaW5nIH0ge1xuICBjb25zdCBpZFRva2VuID0gcmVhZFN0b3JhZ2VUb2tlbigpO1xuICByZXR1cm4gaWRUb2tlblxuICAgID8ge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7aWRUb2tlbn1gLFxuICAgICAgfVxuICAgIDoge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dvdXRBdWRpdCgpOiBQcm9taXNlPHsgbG9nb3V0X3JlZGlyZWN0X3VybD86IHN0cmluZyB9PiB7XG4gIHJldHVybiBmZXRjaChMT0dPVVRfQVBJLCB7XG4gICAgaGVhZGVyczoge1xuICAgICAgLi4uYXR0YWNoQXV0aG9yaXphdGlvbkhlYWRlcigpLFxuICAgICAgLi4uTk9UX05PVElGWV9PTl9FUlJPUl9IRUFERVJTLFxuICAgIH0sXG4gIH0pXG4gICAgLnRoZW4ocmVzID0+IHJlcz8uanNvbigpKVxuICAgIC5jYXRjaCgoKSA9PiBudWxsKTsgLy8gbG9nb3V0IEFQSSDmnKrmjIflrpogbG9nb3V0X3JlZGlyZWN0X3VybCDml7YgcmVzPy5qc29uKCkg5Lya5aSx6LSlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2dvdXQocmV0dXJuQ3VycmVudFBhZ2U6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZSkge1xuICBjbGVhblN0b3JhZ2VUb2tlbigpO1xuXG4gIGNvbnN0IGxvZ291dFVybCA9XG4gICAgdHlwZW9mIHJldHVybkN1cnJlbnRQYWdlID09PSAnc3RyaW5nJyAmJiByZXR1cm5DdXJyZW50UGFnZSAhPT0gJydcbiAgICAgID8gcmV0dXJuQ3VycmVudFBhZ2VcbiAgICAgIDogZGV4TG9nb3V0VXJsKCEhcmV0dXJuQ3VycmVudFBhZ2UpO1xuXG4gIHRyeSB7XG4gICAgZ2V0VG9wV2luZG93KCkubG9jYXRpb24uaHJlZiA9IGxvZ291dFVybDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwganVzdCBmb3Igcm9idXN0bmVzcyBpbiBjYXNlIG9mIGNyb3NzLW9yaWdpbiBpZnJhbWVcbiAgICBsb2NhdGlvbi5ocmVmID0gbG9nb3V0VXJsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWRpcmVjdFNTT0VudHJ5KGVudHJ5OiBzdHJpbmcpIHtcbiAgY29uc3QgaGFzUXVlcnkgPSBlbnRyeS5pbmNsdWRlcygnPycpO1xuXG4gIGlmIChoYXNRdWVyeSkge1xuICAgIGNvbnN0IFt1cmwsIHF1ZXJ5XSA9IGVudHJ5LnNwbGl0KCc/Jyk7XG4gICAgcmV0dXJuIGAke0VYVEVSTkFMX1JFRElSRUNUX0FQSX0/cmVkaXJlY3RfdXJsPSR7dXJsfSYke3F1ZXJ5fWA7XG4gIH1cblxuICByZXR1cm4gYCR7RVhURVJOQUxfUkVESVJFQ1RfQVBJfT9yZWRpcmVjdF91cmw9JHtlbnRyeX1gO1xufVxuXG5mdW5jdGlvbiBkZXhMb2dvdXRVcmwocmV0dXJuQ3VycmVudFBhZ2UgPSBmYWxzZSkge1xuICBjb25zdCB7IGF1dGhVcmwgfSA9IGdldEF1dGhvcml6YXRpb25TdGF0ZSgpO1xuICByZXR1cm4gcmVwbGFjZVJlZGlyZWN0VXJsKFxuICAgIGF1dGhVcmwsXG4gICAgLy8gYXV0aFVybCDkuK3nmoQgcmVkaXJlY3RVcmwg5piv5qC56Lev55Sx77yM5qC56Lev55Sx5LqM5qyh6YeN5a6a5ZCR5ZueIHBvcnRhbCDml7bkvJrkuKLlpLEgY29kZSDlr7zoh7TnmbvlvZXlpLHotKVcbiAgICAvLyDlpoLmnpzlkI7mnJ/mnInlrprliLbljJbopoHmsYLpu5jorqTpppbpobXkuI3mmK8gcG9ydGFs77yM5Y+v5Lul5pS55Zue5LmL5YmN55qE5pa55qGI77yM5L2/55So5rWP6KeI5Zmo5a+86Iiq5omT5byAIGxvZ291dFVybO+8jOeEtuWQjiBkZXgg6YeN5a6a5ZCR5Yiw5qC56Lev55Sx77yM5qC56Lev55Sx6YeN5a6a5ZCR5Yiw6buY6K6k6aaW6aG177yM6aaW6aG15YaN5bCGIGF1dGhVcmwg5Lit55qEIHJlZGlyZWN0VXJsIOabv+aNouS4uuW9k+WJjSB1cmwg6Lez6L2s5YiwIGRleCDov5vooYznmbvlvZXvvJtcbiAgICAvLyDmnIDlpb3njq/looPlj5jph4/lop7liqDpu5jorqTpppbpobXlnLDlnYDmiJbogIUgZGV4IHJlZGlyZWN0VXJsIOebtOaOpeaYr+ato+ehruWcsOWdgFxuICAgIHJldHVybkN1cnJlbnRQYWdlID8gbG9jYXRpb24uaHJlZiA6IGxvY2F0aW9uLm9yaWdpbiArICcvY29uc29sZS1wb3J0YWwnLFxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlUmVkaXJlY3RVcmwoZGV4VXJsOiBzdHJpbmcsIHJlZGlyZWN0VXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgW3BhdGgsIHF1ZXJ5UGFyYW1zXSA9IGRleFVybC5zcGxpdCgnPycpO1xuXG4gIGNvbnN0IHJlcGxhY2VkUXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtc1xuICAgIC5zcGxpdCgnJicpXG4gICAgLm1hcChwYWlyID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICAgIHJldHVybiBSRURJUkVDVF9VUklTLmhhcyhrZXkpXG4gICAgICAgID8gYCR7a2V5fT0ke2VuY29kZVVSSUNvbXBvbmVudChyZWRpcmVjdFVybCl9YFxuICAgICAgICA6IGAke2tleX09JHt2YWx1ZX1gO1xuICAgIH0pXG4gICAgLmpvaW4oJyYnKTtcblxuICByZXR1cm4gYCR7cGF0aH0/JHtyZXBsYWNlZFF1ZXJ5UGFyYW1zfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhDb25maWd1cmF0aW9uKCkge1xuICByZXR1cm4gZmV0Y2goTE9HSU5fQVBJKVxuICAgIC50aGVuKHJlcyA9PiByZXMuanNvbigpKVxuICAgIC50aGVuKFxuICAgICAgKHtcbiAgICAgICAgYXV0aF91cmw6IGF1dGhVcmwsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBsb2dvdXRfdXJsOiBsb2dvdXRVcmwsXG4gICAgICB9OiB7XG4gICAgICAgIGF1dGhfdXJsOiBzdHJpbmc7XG4gICAgICAgIHN0YXRlOiBzdHJpbmc7XG4gICAgICAgIGxvZ291dF91cmw6IHN0cmluZztcbiAgICAgIH0pID0+ICh7XG4gICAgICAgIGF1dGhVcmwsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBsb2dvdXRVcmwsXG4gICAgICB9KSxcbiAgICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGVkVG9rZW4oY29uZmlnOiBBdXRob3JpemF0aW9uU3RhdGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0VG9rZW5Gcm9tTG9jYWwoY29uZmlnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9IGFzIEF1dGhvcml6YXRpb25TdGF0ZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRUb2tlbkZyb21Mb2NhbChcbiAgY29uZmlnOiBBdXRob3JpemF0aW9uU3RhdGUsXG4pOiBQcm9taXNlPEF1dGhvcml6YXRpb25TdGF0ZT4ge1xuICBjb25zdCB7IHF1ZXJ5UGFyYW1zLCBoYXNoUGFyYW1zIH0gPSBnZXRQYXJhbXMoKTtcblxuICBjb25zdCBjb2RlID0gcXVlcnlQYXJhbXNbQ09ERV9LRVldIHx8IGhhc2hQYXJhbXNbQ09ERV9LRVldO1xuICBjb25zdCBpZFRva2VuID0gcXVlcnlQYXJhbXNbSURfVE9LRU5fS0VZXSB8fCBoYXNoUGFyYW1zW0lEX1RPS0VOX0tFWV07XG5cbiAgaWYgKCFjb2RlICYmICFpZFRva2VuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWZyZXNoU3RvcmFnZUFsaXZlUmVjb3JkKCk7XG5cbiAgcmV0dXJuIGNvZGUgPyBzZXRDb29raWVCeUNvZGUoY29kZSwgY29uZmlnLnN0YXRlKSA6IHNldENvb2tpZUJ5VG9rZW4oaWRUb2tlbik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldENvb2tpZUJ5Q29kZShjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpIHtcbiAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgY29kZSwgc3RhdGUgfSk7XG5cbiAgY29uc3QgdG9rZW5SZXNwb25zZTogVG9rZW5SZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgIGAke0NBTExCQUNLX0FQSX0/JHtxdWVyeVBhcmFtcy50b1N0cmluZygpfWAsXG4gICkudGhlbihyZXMgPT4gcmVzLmpzb24oKSk7XG5cbiAgcmV0dXJuIG1hcFRva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldENvb2tpZUJ5VG9rZW4oaWRUb2tlbjogc3RyaW5nKSB7XG4gIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGlkX3Rva2VuOiBpZFRva2VuIH0pO1xuXG4gIGNvbnN0IHRva2VuUmVzcG9uc2U6IFRva2VuUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICBgJHtDQUxMQkFDS19BUEl9PyR7cXVlcnlQYXJhbXMudG9TdHJpbmcoKX1gLFxuICApLnRoZW4ocmVzID0+IHJlcy5qc29uKCkpO1xuXG4gIHJldHVybiBtYXBUb2tlblJlc3BvbnNlKHRva2VuUmVzcG9uc2UpO1xufVxuXG5mdW5jdGlvbiBtYXBUb2tlblJlc3BvbnNlKHJlc3BvbnNlOiBUb2tlblJlc3BvbnNlKSB7XG4gIGNvbnN0IHtcbiAgICBpZF90b2tlbjogaWRUb2tlbixcbiAgICB0b2tlbl90eXBlLFxuICAgIHRva2VuX3N0b3JhZ2UsXG4gICAgZXhwaXJlX2F0LFxuICAgIGlzc3VlZF9hdCxcbiAgfSA9IHJlc3BvbnNlO1xuXG4gIHdyaXRlU3RvcmFnZVRva2VuKGlkVG9rZW4pO1xuXG4gIHJldHVybiB7XG4gICAgc3RvcmFnZVR5cGU6IHRva2VuX3N0b3JhZ2UsXG4gICAgdG9rZW5UeXBlOiB0b2tlbl90eXBlLFxuICAgIGV4cGlyZUF0OiBleHBpcmVfYXQsXG4gICAgaXNzdWVkQXQ6IGlzc3VlZF9hdCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyYW1zKCkge1xuICBjb25zdCBpbml0VXJsID0gZ2V0SW5pdFVybCgpO1xuXG4gIGNvbnN0IGluaXRMb2NhdGlvbiA9IG5ldyBVUkwoaW5pdFVybCk7XG5cbiAgY29uc3QgcXVlcnlQYXJhbXMgPSBwYXJzZVBhcmFtcyhcbiAgICBpbml0TG9jYXRpb24uc2VhcmNoID8gaW5pdExvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSA6ICcnLFxuICApO1xuXG4gIGNvbnN0IGhhc2hQYXJhbXMgPSBwYXJzZVBhcmFtcyhcbiAgICBpbml0TG9jYXRpb24uaGFzaCA/IGluaXRMb2NhdGlvbi5oYXNoLnNsaWNlKDEpIDogJycsXG4gICk7XG5cbiAgcmV0dXJuIHsgcXVlcnlQYXJhbXMsIGhhc2hQYXJhbXMgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJhbXMocXVlcnk6IHN0cmluZyk6IFN0cmluZ01hcCB7XG4gIGlmICghcXVlcnkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4gcXVlcnkuc3BsaXQoJyYnKS5yZWR1Y2UoKGFjYywgcGFyYW0pID0+IHtcbiAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYXJhbS5zcGxpdCgnPScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFjYyxcbiAgICAgIFtrZXldOiB2YWx1ZSxcbiAgICB9O1xuICB9LCB7fSk7XG59XG4iXX0=