kwikid-forms
Version:
KwikID's JSON Configuration based Forms Renderer and Builder
194 lines • 27.8 kB
JavaScript
import { checkObjectKeyExists, isNotEmptyValue } from "kwikid-toolkit";
/**
* Default when utilityFlags.isEliminateBrowserStorage is not set (undefined).
* Legacy hosts keep localStorage; set the flag to true for reduxData-only reads.
*/
export const DEFAULT_FORMS_ELIMINATE_BROWSER_STORAGE = false;
/**
* Resolution order must match legacy getLanguage() (config-converter.helper):
* lng first, selectedLang last — do not reorder without a breaking-change note.
*/
const DEFAULT_LANGUAGE_KEYS = [
"lng",
"lang",
"Lang",
"language",
"currentLang",
"selectedLang"
];
const STANDARD_LOGICAL_KEYS = ["session_id", "language", "formKey"];
/** Legacy default: localStorage until host sets utilityFlags.isEliminateBrowserStorage. */
export const DEFAULT_FORMS_STORAGE_CONFIG = {
defaultSource: "localStorage",
session_id: { key: "session_id" },
language: {
keys: DEFAULT_LANGUAGE_KEYS,
fallback: "en"
},
formKey: { key: "formKey" }
};
function readLocalStorage(key) {
if (typeof localStorage === "undefined") {
return null;
}
try {
return localStorage.getItem(key);
}
catch (error) {
return null;
}
}
function readReduxDataScalar(reduxData, key) {
const value = reduxData[key];
if (value === undefined || value === null) {
return null;
}
if (typeof value === "string") {
return value;
}
if (typeof value === "number" || typeof value === "boolean") {
return String(value);
}
return null;
}
function readReduxDataObject(reduxData, key) {
const value = reduxData[key];
if (value === undefined || value === null) {
return undefined;
}
if (typeof value === "string") {
try {
return JSON.parse(value);
}
catch (error) {
return value;
}
}
return value;
}
function readLocalStorageObject(key) {
const raw = readLocalStorage(key);
if (raw === null) {
return undefined;
}
try {
return JSON.parse(raw);
}
catch (error) {
return raw;
}
}
function readStorageObject(source, reduxData, key) {
if (source === "reduxData") {
return readReduxDataObject(reduxData, key);
}
return readLocalStorageObject(key);
}
function isFormsStorageKeyConfig(entry) {
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
return false;
}
return (checkObjectKeyExists(entry, "source") ||
checkObjectKeyExists(entry, "key") ||
checkObjectKeyExists(entry, "keys") ||
checkObjectKeyExists(entry, "fallback"));
}
function keyConfigFor(config, logicalKey) {
const entry = config[logicalKey];
if (isFormsStorageKeyConfig(entry)) {
return entry;
}
return undefined;
}
function sourceForKey(config, logicalKey) {
var _a, _b, _c, _d;
return ((_d = (_c = (_b = (_a = keyConfigFor(config, logicalKey)) === null || _a === void 0 ? void 0 : _a.source) !== null && _b !== void 0 ? _b : config.defaultSource) !== null && _c !== void 0 ? _c : DEFAULT_FORMS_STORAGE_CONFIG.defaultSource) !== null && _d !== void 0 ? _d : "localStorage");
}
/**
* Apply utilityFlags.isEliminateBrowserStorage as the single source of truth.
* When true → reduxData; when false/omitted → localStorage (overrides formsStorage.defaultSource).
*/
function normalizeFormsStorageConfigSources(config, source) {
var _a, _b, _c, _d, _e, _f;
const next = Object.assign(Object.assign({}, config), { defaultSource: source });
const mergeStandardKey = (logicalKey, base) => {
const existing = keyConfigFor(config, logicalKey);
next[logicalKey] = Object.assign(Object.assign(Object.assign({}, base), (existing !== null && existing !== void 0 ? existing : {})), { source });
};
mergeStandardKey("session_id", { key: "session_id" });
mergeStandardKey("formKey", { key: "formKey" });
mergeStandardKey("language", {
keys: (_d = (_b = (_a = keyConfigFor(config, "language")) === null || _a === void 0 ? void 0 : _a.keys) !== null && _b !== void 0 ? _b : (_c = DEFAULT_FORMS_STORAGE_CONFIG.language) === null || _c === void 0 ? void 0 : _c.keys) !== null && _d !== void 0 ? _d : DEFAULT_LANGUAGE_KEYS,
fallback: (_f = (_e = keyConfigFor(config, "language")) === null || _e === void 0 ? void 0 : _e.fallback) !== null && _f !== void 0 ? _f : "en"
});
Object.keys(config).forEach((key) => {
if (key === "defaultSource" || STANDARD_LOGICAL_KEYS.includes(key)) {
return;
}
const entry = config[key];
if (isFormsStorageKeyConfig(entry)) {
next[key] = Object.assign(Object.assign({}, entry), { source });
}
});
return next;
}
/** Merge userConfig.formsStorage with defaults; map utilityFlags when present. */
export function resolveFormsStorageConfig(userConfig) {
var _a;
const fromUser = userConfig === null || userConfig === void 0 ? void 0 : userConfig.formsStorage;
const config = Object.assign(Object.assign({}, DEFAULT_FORMS_STORAGE_CONFIG), (fromUser && typeof fromUser === "object" ? fromUser : {}));
const eliminateFlag = (_a = userConfig === null || userConfig === void 0 ? void 0 : userConfig.utilityFlags) === null || _a === void 0 ? void 0 : _a.isEliminateBrowserStorage;
const eliminate = typeof eliminateFlag === "boolean"
? eliminateFlag
: DEFAULT_FORMS_ELIMINATE_BROWSER_STORAGE;
const source = eliminate ? "reduxData" : "localStorage";
return normalizeFormsStorageConfigSources(config, source);
}
/** Resolve a string value for a logical or explicit storage key. */
export function resolveFormsStorageString(logicalKey, reduxData = {}, config) {
var _a, _b, _c, _d;
const resolvedConfig = config !== null && config !== void 0 ? config : DEFAULT_FORMS_STORAGE_CONFIG;
const keyCfg = keyConfigFor(resolvedConfig, logicalKey);
const source = sourceForKey(resolvedConfig, logicalKey);
if ((_a = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.keys) === null || _a === void 0 ? void 0 : _a.length) {
for (const key of keyCfg.keys) {
const value = source === "reduxData"
? readReduxDataScalar(reduxData, key)
: readLocalStorage(key);
if (isNotEmptyValue(value)) {
return value;
}
}
return (_b = keyCfg.fallback) !== null && _b !== void 0 ? _b : null;
}
const storageKey = (_c = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.key) !== null && _c !== void 0 ? _c : logicalKey;
const value = source === "reduxData"
? readReduxDataScalar(reduxData, storageKey)
: readLocalStorage(storageKey);
if (isNotEmptyValue(value)) {
return value;
}
return (_d = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.fallback) !== null && _d !== void 0 ? _d : null;
}
/**
* Resolve a structured value (form config blob, eNachForm, etc.).
* Supports the same logical key / keys[] / key alias config as resolveFormsStorageString.
*/
export function resolveFormsStorageObject(logicalKey, reduxData = {}, config) {
var _a, _b;
const resolvedConfig = config !== null && config !== void 0 ? config : DEFAULT_FORMS_STORAGE_CONFIG;
const keyCfg = keyConfigFor(resolvedConfig, logicalKey);
const source = sourceForKey(resolvedConfig, logicalKey);
if ((_a = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.keys) === null || _a === void 0 ? void 0 : _a.length) {
for (const key of keyCfg.keys) {
const value = readStorageObject(source, reduxData, key);
if (value !== undefined && value !== null) {
return value;
}
}
return undefined;
}
const storageKey = (_b = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.key) !== null && _b !== void 0 ? _b : logicalKey;
return readStorageObject(source, reduxData, storageKey);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXMtc3RvcmFnZS5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9yZW5kZXJlci9oZWxwZXJzL2Zvcm1zLXN0b3JhZ2UuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUt2RTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRyxLQUFLLENBQUM7QUFFN0Q7OztHQUdHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixVQUFVO0lBQ1YsYUFBYTtJQUNiLGNBQWM7Q0FDZixDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFVLENBQUM7QUFnQzdFLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBdUI7SUFDOUQsYUFBYSxFQUFFLGNBQWM7SUFDN0IsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRTtJQUNqQyxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUUscUJBQXFCO1FBQzNCLFFBQVEsRUFBRSxJQUFJO0tBQ2Y7SUFDRCxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO0NBQzVCLENBQUM7QUFFRixTQUFTLGdCQUFnQixDQUFDLEdBQVc7SUFDbkMsSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXLEVBQUU7UUFDdkMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQUk7UUFDRixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDbEM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sSUFBSSxDQUFDO0tBQ2I7QUFDSCxDQUFDO0FBRUQs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LE1BQU0sR0FBSSw0QkFBNEIsQ0FBQztJQUM5RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFeEQsSUFBSSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLDBDQUFFLE1BQU0sRUFBRTtRQUN4QixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtnQkFDekMsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBQ0QsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxHQUFHLG1DQUFJLFVBQVUsQ0FBQztJQUM3QyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNoZWNrT2JqZWN0S2V5RXhpc3RzLCBpc05vdEVtcHR5VmFsdWUgfSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcblxuLyoqIFdoZXJlIGEgY29uZmlndXJlZCBrZXkgc2hvdWxkIGJlIHJlYWQgZnJvbS4gKi9cbmV4cG9ydCB0eXBlIEZvcm1zU3RvcmFnZVNvdXJjZSA9IFwicmVkdXhEYXRhXCIgfCBcImxvY2FsU3RvcmFnZVwiO1xuXG4vKipcbiAqIERlZmF1bHQgd2hlbiB1dGlsaXR5RmxhZ3MuaXNFbGltaW5hdGVCcm93c2VyU3RvcmFnZSBpcyBub3Qgc2V0ICh1bmRlZmluZWQpLlxuICogTGVnYWN5IGhvc3RzIGtlZXAgbG9jYWxTdG9yYWdlOyBzZXQgdGhlIGZsYWcgdG8gdHJ1ZSBmb3IgcmVkdXhEYXRhLW9ubHkgcmVhZHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZPUk1TX0VMSU1JTkFURV9CUk9XU0VSX1NUT1JBR0UgPSBmYWxzZTtcblxuLyoqXG4gKiBSZXNvbHV0aW9uIG9yZGVyIG11c3QgbWF0Y2ggbGVnYWN5IGdldExhbmd1YWdlKCkgKGNvbmZpZy1jb252ZXJ0ZXIuaGVscGVyKTpcbiAqIGxuZyBmaXJzdCwgc2VsZWN0ZWRMYW5nIGxhc3Qg4oCUIGRvIG5vdCByZW9yZGVyIHdpdGhvdXQgYSBicmVha2luZy1jaGFuZ2Ugbm90ZS5cbiAqL1xuY29uc3QgREVGQVVMVF9MQU5HVUFHRV9LRVlTID0gW1xuICBcImxuZ1wiLFxuICBcImxhbmdcIixcbiAgXCJMYW5nXCIsXG4gIFwibGFuZ3VhZ2VcIixcbiAgXCJjdXJyZW50TGFuZ1wiLFxuICBcInNlbGVjdGVkTGFuZ1wiXG5dO1xuXG5jb25zdCBTVEFOREFSRF9MT0dJQ0FMX0tFWVMgPSBbXCJzZXNzaW9uX2lkXCIsIFwibGFuZ3VhZ2VcIiwgXCJmb3JtS2V5XCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1zU3RvcmFnZUtleUNvbmZpZyB7XG4gIC8qKiBPbWl0IHRvIHVzZSBGb3Jtc1N0b3JhZ2VDb25maWcuZGVmYXVsdFNvdXJjZSAob25lIHNvdXJjZSBwZXIgY2xpZW50KS4gKi9cbiAgc291cmNlPzogRm9ybXNTdG9yYWdlU291cmNlO1xuICAvKiogU3RvcmFnZSBrZXkgKGRlZmF1bHRzIHRvIHRoZSBsb2dpY2FsIGlkIHBhc3NlZCB0byByZXNvbHZlKS4gKi9cbiAga2V5Pzogc3RyaW5nO1xuICAvKiogVHJ5IG11bHRpcGxlIGtleXMgaW4gb3JkZXIgKGUuZy4gbGFuZ3VhZ2UpLiAqL1xuICBrZXlzPzogc3RyaW5nW107XG4gIGZhbGxiYWNrPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvc3Qgc3VwcGxpZXMgdmlhIHVzZXJDb25maWcuZm9ybXNTdG9yYWdlLCBvciBkZXJpdmVkIGZyb20gdXRpbGl0eUZsYWdzLlxuICogUGVyLWtleSBgc291cmNlYCBpcyBvcHRpb25hbCDigJQgZmFsbHMgYmFjayB0byBkZWZhdWx0U291cmNlIChzYW1lIGlkZWEgYXMgdG9vbGtpdFxuICogQlJPV1NFUl9TVE9SQUdFOiB7IHR5cGUsIGtleSB9IHdpdGggYSBzaW5nbGUgdHlwZSBmb3IgdGhlIGNsaWVudCkuXG4gKiBFeGFtcGxlIChlbGltaW5hdGUgbW9kZSDigJQgc2V0IHZpYSB1dGlsaXR5RmxhZ3Mgb3IgZGVmYXVsdFNvdXJjZSk6XG4gKiB7XG4gKiAgIFwiZGVmYXVsdFNvdXJjZVwiOiBcInJlZHV4RGF0YVwiLFxuICogICBcInNlc3Npb25faWRcIjogeyBcImtleVwiOiBcInNlc3Npb25faWRcIiB9LFxuICogICBcImxhbmd1YWdlXCI6IHsgXCJrZXlzXCI6IFtcImxuZ1wiLCBcImxhbmdcIiwgXCJzZWxlY3RlZExhbmdcIl0sIFwiZmFsbGJhY2tcIjogXCJlblwiIH0sXG4gKiAgIFwiZm9ybUtleVwiOiB7IFwia2V5XCI6IFwiZm9ybUtleVwiIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3Jtc1N0b3JhZ2VDb25maWcge1xuICBkZWZhdWx0U291cmNlPzogRm9ybXNTdG9yYWdlU291cmNlO1xuICBzZXNzaW9uX2lkPzogRm9ybXNTdG9yYWdlS2V5Q29uZmlnO1xuICBsYW5ndWFnZT86IEZvcm1zU3RvcmFnZUtleUNvbmZpZztcbiAgZm9ybUtleT86IEZvcm1zU3RvcmFnZUtleUNvbmZpZztcbiAgW2xvZ2ljYWxLZXk6IHN0cmluZ106IEZvcm1zU3RvcmFnZUtleUNvbmZpZyB8IEZvcm1zU3RvcmFnZVNvdXJjZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIExlZ2FjeSBkZWZhdWx0OiBsb2NhbFN0b3JhZ2UgdW50aWwgaG9zdCBzZXRzIHV0aWxpdHlGbGFncy5pc0VsaW1pbmF0ZUJyb3dzZXJTdG9yYWdlLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUc6IEZvcm1zU3RvcmFnZUNvbmZpZyA9IHtcbiAgZGVmYXVsdFNvdXJjZTogXCJsb2NhbFN0b3JhZ2VcIixcbiAgc2Vzc2lvbl9pZDogeyBrZXk6IFwic2Vzc2lvbl9pZFwiIH0sXG4gIGxhbmd1YWdlOiB7XG4gICAga2V5czogREVGQVVMVF9MQU5HVUFHRV9LRVlTLFxuICAgIGZhbGxiYWNrOiBcImVuXCJcbiAgfSxcbiAgZm9ybUtleTogeyBrZXk6IFwiZm9ybUtleVwiIH1cbn07XG5cbmZ1bmN0aW9uIHJlYWRMb2NhbFN0b3JhZ2Uoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFJlZHV4RGF0YVNjYWxhcihcbiAgcmVkdXhEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAga2V5OiBzdHJpbmdcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IHJlZHV4RGF0YVtrZXldO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlYWRSZWR1eERhdGFPYmplY3QoXG4gIHJlZHV4RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGtleTogc3RyaW5nXG4pOiB1bmtub3duIHtcbiAgY29uc3QgdmFsdWUgPSByZWR1eERhdGFba2V5XTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRMb2NhbFN0b3JhZ2VPYmplY3Qoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgcmF3ID0gcmVhZExvY2FsU3RvcmFnZShrZXkpO1xuICBpZiAocmF3ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRTdG9yYWdlT2JqZWN0KFxuICBzb3VyY2U6IEZvcm1zU3RvcmFnZVNvdXJjZSxcbiAgcmVkdXhEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAga2V5OiBzdHJpbmdcbik6IHVua25vd24ge1xuICBpZiAoc291cmNlID09PSBcInJlZHV4RGF0YVwiKSB7XG4gICAgcmV0dXJuIHJlYWRSZWR1eERhdGFPYmplY3QocmVkdXhEYXRhLCBrZXkpO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRMb2NhbFN0b3JhZ2VPYmplY3Qoa2V5KTtcbn1cblxuZnVuY3Rpb24gaXNGb3Jtc1N0b3JhZ2VLZXlDb25maWcoZW50cnk6IHVua25vd24pOiBlbnRyeSBpcyBGb3Jtc1N0b3JhZ2VLZXlDb25maWcge1xuICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZW50cnksIFwic291cmNlXCIpIHx8XG4gICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZW50cnksIFwia2V5XCIpIHx8XG4gICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZW50cnksIFwia2V5c1wiKSB8fFxuICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGVudHJ5LCBcImZhbGxiYWNrXCIpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGtleUNvbmZpZ0ZvcihcbiAgY29uZmlnOiBGb3Jtc1N0b3JhZ2VDb25maWcsXG4gIGxvZ2ljYWxLZXk6IHN0cmluZ1xuKTogRm9ybXNTdG9yYWdlS2V5Q29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cnkgPSBjb25maWdbbG9naWNhbEtleV07XG4gIGlmIChpc0Zvcm1zU3RvcmFnZUtleUNvbmZpZyhlbnRyeSkpIHtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc291cmNlRm9yS2V5KFxuICBjb25maWc6IEZvcm1zU3RvcmFnZUNvbmZpZyxcbiAgbG9naWNhbEtleTogc3RyaW5nXG4pOiBGb3Jtc1N0b3JhZ2VTb3VyY2Uge1xuICByZXR1cm4gKFxuICAgIGtleUNvbmZpZ0Zvcihjb25maWcsIGxvZ2ljYWxLZXkpPy5zb3VyY2UgPz9cbiAgICBjb25maWcuZGVmYXVsdFNvdXJjZSA/P1xuICAgIERFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUcuZGVmYXVsdFNvdXJjZSA/P1xuICAgIFwibG9jYWxTdG9yYWdlXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBBcHBseSB1dGlsaXR5RmxhZ3MuaXNFbGltaW5hdGVCcm93c2VyU3RvcmFnZSBhcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC5cbiAqIFdoZW4gdHJ1ZSDihpIgcmVkdXhEYXRhOyB3aGVuIGZhbHNlL29taXR0ZWQg4oaSIGxvY2FsU3RvcmFnZSAob3ZlcnJpZGVzIGZvcm1zU3RvcmFnZS5kZWZhdWx0U291cmNlKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRm9ybXNTdG9yYWdlQ29uZmlnU291cmNlcyhcbiAgY29uZmlnOiBGb3Jtc1N0b3JhZ2VDb25maWcsXG4gIHNvdXJjZTogRm9ybXNTdG9yYWdlU291cmNlXG4pOiBGb3Jtc1N0b3JhZ2VDb25maWcge1xuICBjb25zdCBuZXh0OiBGb3Jtc1N0b3JhZ2VDb25maWcgPSB7XG4gICAgLi4uY29uZmlnLFxuICAgIGRlZmF1bHRTb3VyY2U6IHNvdXJjZVxuICB9O1xuXG4gIGNvbnN0IG1lcmdlU3RhbmRhcmRLZXkgPSAoXG4gICAgbG9naWNhbEtleTogc3RyaW5nLFxuICAgIGJhc2U6IEZvcm1zU3RvcmFnZUtleUNvbmZpZ1xuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGtleUNvbmZpZ0Zvcihjb25maWcsIGxvZ2ljYWxLZXkpO1xuICAgIG5leHRbbG9naWNhbEtleV0gPSB7XG4gICAgICAuLi5iYXNlLFxuICAgICAgLi4uKGV4aXN0aW5nID8/IHt9KSxcbiAgICAgIHNvdXJjZVxuICAgIH07XG4gIH07XG5cbiAgbWVyZ2VTdGFuZGFyZEtleShcInNlc3Npb25faWRcIiwgeyBrZXk6IFwic2Vzc2lvbl9pZFwiIH0pO1xuICBtZXJnZVN0YW5kYXJkS2V5KFwiZm9ybUtleVwiLCB7IGtleTogXCJmb3JtS2V5XCIgfSk7XG4gIG1lcmdlU3RhbmRhcmRLZXkoXCJsYW5ndWFnZVwiLCB7XG4gICAga2V5czpcbiAgICAgIGtleUNvbmZpZ0Zvcihjb25maWcsIFwibGFuZ3VhZ2VcIik/LmtleXMgPz9cbiAgICAgIERFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUcubGFuZ3VhZ2U/LmtleXMgPz9cbiAgICAgIERFRkFVTFRfTEFOR1VBR0VfS0VZUyxcbiAgICBmYWxsYmFjazoga2V5Q29uZmlnRm9yKGNvbmZpZywgXCJsYW5ndWFnZVwiKT8uZmFsbGJhY2sgPz8gXCJlblwiXG4gIH0pO1xuXG4gIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKGtleSA9PT0gXCJkZWZhdWx0U291cmNlXCIgfHwgU1RBTkRBUkRfTE9HSUNBTF9LRVlTLmluY2x1ZGVzKGtleSBhcyBhbnkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW50cnkgPSBjb25maWdba2V5XTtcbiAgICBpZiAoaXNGb3Jtc1N0b3JhZ2VLZXlDb25maWcoZW50cnkpKSB7XG4gICAgICBuZXh0W2tleV0gPSB7IC4uLmVudHJ5LCBzb3VyY2UgfTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBuZXh0O1xufVxuXG4vKiogTWVyZ2UgdXNlckNvbmZpZy5mb3Jtc1N0b3JhZ2Ugd2l0aCBkZWZhdWx0czsgbWFwIHV0aWxpdHlGbGFncyB3aGVuIHByZXNlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZvcm1zU3RvcmFnZUNvbmZpZyh1c2VyQ29uZmlnPzogYW55KTogRm9ybXNTdG9yYWdlQ29uZmlnIHtcbiAgY29uc3QgZnJvbVVzZXIgPSB1c2VyQ29uZmlnPy5mb3Jtc1N0b3JhZ2U7XG4gIGNvbnN0IGNvbmZpZzogRm9ybXNTdG9yYWdlQ29uZmlnID0ge1xuICAgIC4uLkRFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUcsXG4gICAgLi4uKGZyb21Vc2VyICYmIHR5cGVvZiBmcm9tVXNlciA9PT0gXCJvYmplY3RcIiA/IGZyb21Vc2VyIDoge30pXG4gIH07XG5cbiAgY29uc3QgZWxpbWluYXRlRmxhZyA9IHVzZXJDb25maWc/LnV0aWxpdHlGbGFncz8uaXNFbGltaW5hdGVCcm93c2VyU3RvcmFnZTtcbiAgY29uc3QgZWxpbWluYXRlID1cbiAgICB0eXBlb2YgZWxpbWluYXRlRmxhZyA9PT0gXCJib29sZWFuXCJcbiAgICAgID8gZWxpbWluYXRlRmxhZ1xuICAgICAgOiBERUZBVUxUX0ZPUk1TX0VMSU1JTkFURV9CUk9XU0VSX1NUT1JBR0U7XG5cbiAgY29uc3Qgc291cmNlOiBGb3Jtc1N0b3JhZ2VTb3VyY2UgPSBlbGltaW5hdGUgPyBcInJlZHV4RGF0YVwiIDogXCJsb2NhbFN0b3JhZ2VcIjtcblxuICByZXR1cm4gbm9ybWFsaXplRm9ybXNTdG9yYWdlQ29uZmlnU291cmNlcyhjb25maWcsIHNvdXJjZSk7XG59XG5cbi8qKiBSZXNvbHZlIGEgc3RyaW5nIHZhbHVlIGZvciBhIGxvZ2ljYWwgb3IgZXhwbGljaXQgc3RvcmFnZSBrZXkuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZvcm1zU3RvcmFnZVN0cmluZyhcbiAgbG9naWNhbEtleTogc3RyaW5nLFxuICByZWR1eERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gIGNvbmZpZz86IEZvcm1zU3RvcmFnZUNvbmZpZ1xuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gY29uZmlnID8/IERFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUc7XG4gIGNvbnN0IGtleUNmZyA9IGtleUNvbmZpZ0ZvcihyZXNvbHZlZENvbmZpZywgbG9naWNhbEtleSk7XG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUZvcktleShyZXNvbHZlZENvbmZpZywgbG9naWNhbEtleSk7XG5cbiAgaWYgKGtleUNmZz8ua2V5cz8ubGVuZ3RoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5Q2ZnLmtleXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgc291cmNlID09PSBcInJlZHV4RGF0YVwiXG4gICAgICAgICAgPyByZWFkUmVkdXhEYXRhU2NhbGFyKHJlZHV4RGF0YSwga2V5KVxuICAgICAgICAgIDogcmVhZExvY2FsU3RvcmFnZShrZXkpO1xuICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIGFzIHN0cmluZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleUNmZy5mYWxsYmFjayA/PyBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3RvcmFnZUtleSA9IGtleUNmZz8ua2V5ID8/IGxvZ2ljYWxLZXk7XG4gIGNvbnN0IHZhbHVlID1cbiAgICBzb3VyY2UgPT09IFwicmVkdXhEYXRhXCJcbiAgICAgID8gcmVhZFJlZHV4RGF0YVNjYWxhcihyZWR1eERhdGEsIHN0b3JhZ2VLZXkpXG4gICAgICA6IHJlYWRMb2NhbFN0b3JhZ2Uoc3RvcmFnZUtleSk7XG5cbiAgaWYgKGlzTm90RW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIGtleUNmZz8uZmFsbGJhY2sgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgc3RydWN0dXJlZCB2YWx1ZSAoZm9ybSBjb25maWcgYmxvYiwgZU5hY2hGb3JtLCBldGMuKS5cbiAqIFN1cHBvcnRzIHRoZSBzYW1lIGxvZ2ljYWwga2V5IC8ga2V5c1tdIC8ga2V5IGFsaWFzIGNvbmZpZyBhcyByZXNvbHZlRm9ybXNTdG9yYWdlU3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZvcm1zU3RvcmFnZU9iamVjdChcbiAgbG9naWNhbEtleTogc3RyaW5nLFxuICByZWR1eERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gIGNvbmZpZz86IEZvcm1zU3RvcmFnZUNvbmZpZ1xuKTogYW55IHtcbiAgY29uc3QgcmVzb2x2ZWRDb25maWcgPSBjb25maWcgPz8gREVGQVVMVF9GT1JNU19TVE9SQUdFX0NPTkZJRztcbiAgY29uc3Qga2V5Q2ZnID0ga2V5Q29uZmlnRm9yKHJlc29sdmVkQ29uZmlnLCBsb2dpY2FsS2V5KTtcbiAgY29uc3Qgc291cmNlID0gc291cmNlRm9yS2V5KHJlc29sdmVkQ29uZmlnLCBsb2dpY2FsS2V5KTtcblxuICBpZiAoa2V5Q2ZnPy5rZXlzPy5sZW5ndGgpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlDZmcua2V5cykge1xuICAgICAgY29uc3QgdmFsdWUgPSByZWFkU3RvcmFnZU9iamVjdChzb3VyY2UsIHJlZHV4RGF0YSwga2V5KTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHN0b3JhZ2VLZXkgPSBrZXlDZmc/LmtleSA/PyBsb2dpY2FsS2V5O1xuICByZXR1cm4gcmVhZFN0b3JhZ2VPYmplY3Qoc291cmNlLCByZWR1eERhdGEsIHN0b3JhZ2VLZXkpO1xufVxuIl19