@valueflows/vf-graphql-holochain
Version:
GraphQL schema bindings for the Holochain implementation of ValueFlows
210 lines • 53 kB
JavaScript
import Query from "../queries/index.js";
import Mutation from "../mutations/index.js";
import Agent from "./agent.js";
import { getOne } from "../queries/helpers.js";
import { getCollection, getCollectionLinks, getAction } from "../util.js";
import { encodeHashToBase64 } from "@holochain/client";
export const generateResolvers = (cell) => {
const get = async (entryType, id, info) => {
if (!id)
return null;
const isOnlyIdRequested = info.fieldNodes[0].selectionSet?.selections.every(selection => selection.kind === "Field" && selection.name.value === "id");
if (isOnlyIdRequested)
return { id: encodeHashToBase64(id) };
const output = await getOne(cell, entryType, { id: encodeHashToBase64(id) });
return output;
};
const getMany = async (func, fromId, info) => {
if (!fromId)
return null;
const isOnlyIdOrRevisionIdRequested = info.fieldNodes[0].selectionSet?.selections.every(selection => selection.kind === "Field" && (selection.name.value === "id" || selection.name.value === "revisionId"));
if (isOnlyIdOrRevisionIdRequested) {
const links = await getCollectionLinks(cell, func, fromId);
return links.map((link) => {
return {
id: encodeHashToBase64(link.tag),
revisionId: encodeHashToBase64(link.target)
};
});
}
return await getCollection(cell, func, fromId);
};
const getList = async (entryType, list, info) => {
return (await Promise.all((list || [])
.map((address) => get(entryType, address, info))))
.filter((item) => item !== null);
};
const getMeta = async (record) => {
// console.log("getMeta", record)
// return {
// retrievedRevision: {
// id: record.id,
// time: getLastUpdateTime(record.id),
// }
// }
return record.meta;
};
const res = Object.assign({
Query: Query(cell),
Mutation: Mutation(cell),
Agent: Agent(cell),
Agreement: {
meta: async function (record, args, context, info) { return getMeta(record); },
commitments: async function (record, args, context, info) {
return await getMany('get_rea_commitments_for_rea_agreement', record.id, info);
},
economicEvents: async function (record, args, context, info) {
return await getMany('get_rea_economic_events_for_rea_agreement', record.id, info);
},
},
Commitment: {
meta: async function (record, args, context, info) { return getMeta(record); },
outputOf: async function (record, args, context, info) { return get('process', record.outputOf, info); },
inputOf: async function (record, args, context, info) { return get('process', record.inputOf, info); },
receiver: async function (record, args, context, info) { return get('agent', record.receiver, info); },
provider: async function (record, args, context, info) { return get('agent', record.provider, info); },
clauseOf: async function (record, args, context, info) { return get('agreement', record.clauseOf, info); },
plannedWithin: async function (record, args, context, info) { return get('plan', record.plannedWithin, info); },
independentDemandOf: async function (record, args, context, info) { return get('plan', record.independentDemandOf, info); },
fulfilledBy: async function (record, args, context, info) { return getMany('get_fulfilling_economic_events_for_commitment', record.id, info); },
stage: async function (record, args, context, info) { return get('process_specification', record.stage, info); },
satisfies: async function (record, args, context, info) { return get('intent', record.satisfies, info); },
action: function (record, args, context, info) { return getAction(record.action); },
resourceConformsTo: async function (record, args, context, info) { return get('resource_specification', record.resourceConformsTo, info); },
resourceInventoriedAs: async function (record, args, context, info) { return get('economic_resource', record.resourceInventoriedAs, info); },
},
EconomicEvent: {
meta: async function (record, args, context, info) { return getMeta(record); },
resourceInventoriedAs: async function (record, args, context, info) { return get('economic_resource', record.resourceInventoriedAs, info); },
toResourceInventoriedAs: async function (record, args, context, info) { return get('economic_resource', record.toResourceInventoriedAs, info); },
inputOf: async function (record, args, context, info) { return get('economic_event', record.inputOf, info); },
outputOf: async function (record, args, context, info) { return get('economic_event', record.outputOf, info); },
provider: async function (record, args, context, info) { return get('agent', record.provider, info); },
receiver: async function (record, args, context, info) { return get('agent', record.receiver, info); },
fulfills: async function (record, args, context, info) { return getList('commitment', record.fulfills, info); },
satisfies: async function (record, args, context, info) { return getList('intent', record.satisfies, info); },
resourceConformsTo: async function (record, args, context, info) { return get('economic_resource', record.resourceConformsTo, info); },
action: function (record, args, context, info) { return getAction(record.action); },
realizationOf: async function (record, args, context, info) { return get('agreement', record.realizationOf, info); },
},
EconomicResource: {
meta: async function (record, args, context, info) { return getMeta(record); },
containedIn: async function (record, args, context, info) {
return getMany('get_rea_economic_resources_for_rea_economic_resource', record.contained_in, info);
},
contains: async function (record, args, context, info) {
return getMany('get_rea_economic_resources_for_rea_economic_resource', record.id, info);
},
conformsTo: async function (record, args, context, info) { return get('resource_specification', record.conformsTo, info); },
stage: async function (record, args, context, info) { return get('process_specification', record.stage, info); },
state: function (record, args, context, info) { return getAction(record.state); },
unitOfEffort: async function (record, args, context, info) { return get('unit', record.unitOfEffort, info); },
primaryAccountable: async function (record, args, context, info) { return get('agent', record.primaryAccountable, info); },
},
Intent: {
meta: async function (record, args, context, info) { return getMeta(record); },
satisfiedBy: async function (record, args, context, info) {
return getMany('get_satisfying_comitments_for_rea_intent', record.id, info);
},
observedBy: async function (record, args, context, info) {
return getMany('get_satisfying_economic_events_for_rea_intent', record.id, info);
},
provider: async function (record, args, context, info) { return get('agent', record.provider, info); },
receiver: async function (record, args, context, info) { return get('agent', record.receiver, info); },
inputOf: async function (record, args, context, info) { return get('process', record.inputOf, info); },
outputOf: async function (record, args, context, info) { return get('process', record.outputOf, info); },
// publishedIn: async function (record, args, context, info) { return get('proposed_intent', record.publishedIn, info) },
resourceConformsTo: async function (record, args, context, info) { return get('resource_specification', record.resourceConformsTo, info); },
action: function (record, args, context, info) { return getAction(record.action); },
},
Measure: {
hasUnit: async function (record, args, context, info) {
const unit = await get('unit', record.hasUnit, info);
return unit ? unit : null;
},
},
Plan: {
meta: async function (record, args, context, info) { return getMeta(record); },
processes: async function (record, args, context, info) {
return getMany('get_rea_processes_for_rea_plan', record.id, info);
},
independentDemands: async function (record, args, context, info) {
return getMany('get_independent_demands_for_rea_plan', record.id, info);
},
nonProcessCommitments: async function (record, args, context, info) {
return getMany('get_rea_commitments_for_rea_plan', record.id, info);
},
inScopeOf: async function (record, args, context, info) { return getList('agent', record.inScopeOf, info); },
},
Process: {
meta: async function (record, args, context, info) { return getMeta(record); },
observedInputs: async function (record, args, context, info) {
return getMany('get_rea_economic_event_inputs_for_rea_process', record.id, info);
},
observedOutputs: async function (record, args, context, info) {
return getMany('get_rea_economic_event_outputs_for_rea_process', record.id, info);
},
committedInputs: async function (record, args, context, info) {
return getMany('get_inputs_for_rea_process', record.id, info);
},
committedOutputs: async function (record, args, context, info) {
return getMany('get_outputs_for_rea_process', record.id, info);
},
intendedInputs: async function (record, args, context, info) {
return getMany('get_rea_intents_for_rea_process_inputs', record.id, info);
},
intendedOutputs: async function (record, args, context, info) {
return getMany('get_rea_intents_for_rea_process_outputs', record.id, info);
},
basedOn: async function (record, args, context, info) { return get('process_specification', record.basedOn, info); },
plannedWithin: async function (record, args, context, info) { return get('plan', record.plannedWithin, info); },
inScopeOf: async function (record, args, context, info) { return getList('agent', record.inScopeOf, info); }
},
Proposal: {
meta: async function (record, args, context, info) { return getMeta(record); },
publishes: async function (record, args, context, info) { return getList('intent', record.publishes, info); },
reciprocal: async function (record, args, context, info) { return getList('intent', record.reciprocal, info); },
proposedTo: async function (record, args, context, info) { return getList('agent', record.proposedTo, info); },
inScopeOf: async function (record, args, context, info) { return getList('agent', record.inScopeOf, info); },
},
RecipeExchange: {
meta: async function (record, args, context, info) { return getMeta(record); },
recipeClauses: async function (record, args, context, info) {
return getMany('get_rea_recipe_clauses_for_rea_recipe_exchange', record.id, info);
},
recipeReciprocalClauses: async function (record, args, context, info) {
return getMany('get_rea_recipe_reciprocal_clauses_for_rea_recipe_exchange', record.id, info);
},
},
RecipeFlow: {
meta: async function (record, args, context, info) { return getMeta(record); },
recipeInputOf: async function (record, args, context, info) { return get('recipe_process', record.recipeInputOf, info); },
recipeOutputOf: async function (record, args, context, info) { return get('recipe_process', record.recipeOutputOf, info); },
recipeClauseOf: async function (record, args, context, info) { return get('recipe_exchange', record.recipeClauseOf, info); },
recipeReciprocalClauseOf: async function (record, args, context, info) { return get('recipe_exchange', record.recipeReciprocalClauseOf, info); },
resourceConformsTo: async function (record, args, context, info) { return get('resource_specification', record.resourceConformsTo, info); },
stage: async function (record, args, context, info) { return get('process_specification', record.stage, info); },
action: function (record, args, context, info) { return getAction(record.action); },
},
RecipeProcess: {
meta: async function (record, args, context, info) { return getMeta(record); },
recipeInputs: async function (record, args, context, info) {
return getMany('get_rea_recipe_flow_inputs_for_rea_recipe_process', record.id, info);
},
recipeOutputs: async function (record, args, context, info) {
return getMany('get_rea_recipe_flow_outputs_for_rea_recipe_process', record.id, info);
},
processConformsTo: async function (record, args, context, info) { return get('process_specification', record.processConformsTo, info); },
},
ResourceSpecification: {
meta: async function (record, args, context, info) { return getMeta(record); },
// conformingResources: async function (record, args, context, info) {
// return getMany('economic_resource', '', record.id, info)
// },
defaultUnitOfResource: async function (record, args, context, info) { return get('unit', record.defaultUnitOfResource, info); },
defaultUnitOfEffort: async function (record, args, context, info) { return get('unit', record.defaultUnitOfEffort, info); },
},
});
return res;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb2x2ZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLHFCQUFxQixDQUFBO0FBQ3ZDLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFBO0FBQzVDLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQTtBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFJdEQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRTtJQUMzQyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUF3QixFQUFFLEVBQUU7UUFDMUQsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNyQixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQ3ZFLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUMzRSxDQUFDO1FBQ0YsSUFBSSxpQkFBaUI7WUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0UsT0FB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QixFQUFFO1lBQ25CLElBQUksRUFBRSxLQUFLLFdBQVcsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFHLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUEsQ0FBQztZQUMzRSxzRUFBc0U7WUFDdEUsK0RBQStEO1lBQy9ELEtBQUs7WUFDTCxxQkFBcUIsRUFBRSxLQUFLLFdBQVcsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDO1lBQzlILG1CQUFtQixFQUFFLEtBQUssV0FBVyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUM7U0FDN0g7S0FDSixDQUFDLENBQUE7SUFDRixPQUFPLEdBQUcsQ0FBQTtBQUNkLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBRdWVyeSBmcm9tIFwiLi4vcXVlcmllcy9pbmRleC5qc1wiXG5pbXBvcnQgTXV0YXRpb24gZnJvbSBcIi4uL211dGF0aW9ucy9pbmRleC5qc1wiXG5pbXBvcnQgQWdlbnQgZnJvbSBcIi4vYWdlbnQuanNcIlxuaW1wb3J0IHsgZ2V0T25lIH0gZnJvbSBcIi4uL3F1ZXJpZXMvaGVscGVycy5qc1wiXG5pbXBvcnQgeyBnZXRDb2xsZWN0aW9uLCBnZXRDb2xsZWN0aW9uTGlua3MsIGdldEFjdGlvbiB9IGZyb20gXCIuLi91dGlsLmpzXCJcbmltcG9ydCB7IGVuY29kZUhhc2hUb0Jhc2U2NCB9IGZyb20gXCJAaG9sb2NoYWluL2NsaWVudFwiXG5pbXBvcnQgeyBHcmFwaFFMUmVzb2x2ZUluZm8gfSBmcm9tIFwiZ3JhcGhxbFwiO1xuaW1wb3J0IHsgZ2V0TGFzdFVwZGF0ZVRpbWUgfSBmcm9tIFwiLi4vc3RvcmUuanNcIlxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSZXNvbHZlcnMgPSAoY2VsbDogYW55KSA9PiB7XG4gICAgY29uc3QgZ2V0ID0gYXN5bmMgKGVudHJ5VHlwZSwgaWQsIGluZm86IEdyYXBoUUxSZXNvbHZlSW5mbykgPT4ge1xuICAgICAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgaXNPbmx5SWRSZXF1ZXN0ZWQgPSBpbmZvLmZpZWxkTm9kZXNbMF0uc2VsZWN0aW9uU2V0Py5zZWxlY3Rpb25zLmV2ZXJ5KFxuICAgICAgICAgICAgc2VsZWN0aW9uID0+IHNlbGVjdGlvbi5raW5kID09PSBcIkZpZWxkXCIgJiYgc2VsZWN0aW9uLm5hbWUudmFsdWUgPT09IFwiaWRcIlxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNPbmx5SWRSZXF1ZXN0ZWQpIHJldHVybiB7IGlkOiBlbmNvZGVIYXNoVG9CYXNlNjQoaWQpIH07XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGdldE9uZShjZWxsLCBlbnRyeVR5cGUsIHsgaWQ6IGVuY29kZUhhc2hUb0Jhc2U2NChpZCkgfSk7XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIGNvbnN0IGdldE1hbnkgPSBhc3luYyAoZnVuYywgZnJvbUlkLCBpbmZvOiBHcmFwaFFMUmVzb2x2ZUluZm8pID0+IHtcbiAgICAgICAgaWYgKCFmcm9tSWQpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBpc09ubHlJZE9yUmV2aXNpb25JZFJlcXVlc3RlZCA9IGluZm8uZmllbGROb2Rlc1swXS5zZWxlY3Rpb25TZXQ/LnNlbGVjdGlvbnMuZXZlcnkoXG4gICAgICAgICAgICBzZWxlY3Rpb24gPT4gc2VsZWN0aW9uLmtpbmQgPT09IFwiRmllbGRcIiAmJiAoc2VsZWN0aW9uLm5hbWUudmFsdWUgPT09IFwiaWRcIiB8fCBzZWxlY3Rpb24ubmFtZS52YWx1ZSA9PT0gXCJyZXZpc2lvbklkXCIpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpc09ubHlJZE9yUmV2aXNpb25JZFJlcXVlc3RlZCkge1xuICAgICAgICAgICAgY29uc3QgbGlua3MgPSBhd2FpdCBnZXRDb2xsZWN0aW9uTGlua3MoY2VsbCwgZnVuYywgZnJvbUlkKTtcbiAgICAgICAgICAgIHJldHVybiBsaW5rcy5tYXAoKGxpbms6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbmNvZGVIYXNoVG9CYXNlNjQobGluay50YWcpLFxuICAgICAgICAgICAgICAgICAgICByZXZpc2lvbklkOiBlbmNvZGVIYXNoVG9CYXNlNjQobGluay50YXJnZXQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0Q29sbGVjdGlvbihjZWxsLCBmdW5jLCBmcm9tSWQpO1xuICAgIH1cbiAgICBjb25zdCBnZXRMaXN0ID0gYXN5bmMgKGVudHJ5VHlwZSwgbGlzdCwgaW5mbzogR3JhcGhRTFJlc29sdmVJbmZvKSA9PiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgUHJvbWlzZS5hbGwoKGxpc3QgfHwgW10pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGFkZHJlc3MpPT5nZXQoZW50cnlUeXBlLCBhZGRyZXNzLCBpbmZvKSkpKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBudWxsKVxuICAgIH1cblxuICAgIGNvbnN0IGdldE1ldGEgPSBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZ2V0TWV0YVwiLCByZWNvcmQpXG4gICAgICAgIC8vIHJldHVybiB7XG4gICAgICAgIC8vICAgICByZXRyaWV2ZWRSZXZpc2lvbjoge1xuICAgICAgICAvLyAgICAgICAgIGlkOiByZWNvcmQuaWQsXG4gICAgICAgIC8vICAgICAgICAgdGltZTogZ2V0TGFzdFVwZGF0ZVRpbWUocmVjb3JkLmlkKSxcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gcmVjb3JkLm1ldGFcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgUXVlcnk6IFF1ZXJ5KGNlbGwpLFxuICAgICAgICBNdXRhdGlvbjogTXV0YXRpb24oY2VsbCksXG4gICAgICAgIEFnZW50OiBBZ2VudChjZWxsKSxcbiAgICAgICAgQWdyZWVtZW50OiB7XG4gICAgICAgICAgICBtZXRhOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7cmV0dXJuIGdldE1ldGEocmVjb3JkKX0sXG4gICAgICAgICAgICBjb21taXRtZW50czogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZXRNYW55KCdnZXRfcmVhX2NvbW1pdG1lbnRzX2Zvcl9yZWFfYWdyZWVtZW50JywgcmVjb3JkLmlkLCBpbmZvKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVjb25vbWljRXZlbnRzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdldE1hbnkoJ2dldF9yZWFfZWNvbm9taWNfZXZlbnRzX2Zvcl9yZWFfYWdyZWVtZW50JywgcmVjb3JkLmlkLCBpbmZvKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgQ29tbWl0bWVudDoge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0TWV0YShyZWNvcmQpIH0sXG4gICAgICAgICAgICBvdXRwdXRPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwcm9jZXNzJywgcmVjb3JkLm91dHB1dE9mLCBpbmZvKSB9LFxuICAgICAgICAgICAgaW5wdXRPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwcm9jZXNzJywgcmVjb3JkLmlucHV0T2YsIGluZm8pIH0sXG4gICAgICAgICAgICByZWNlaXZlcjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdhZ2VudCcsIHJlY29yZC5yZWNlaXZlciwgaW5mbykgfSxcbiAgICAgICAgICAgIHByb3ZpZGVyOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2FnZW50JywgcmVjb3JkLnByb3ZpZGVyLCBpbmZvKSB9LFxuICAgICAgICAgICAgY2xhdXNlT2Y6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnYWdyZWVtZW50JywgcmVjb3JkLmNsYXVzZU9mLCBpbmZvKSB9LFxuICAgICAgICAgICAgcGxhbm5lZFdpdGhpbjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwbGFuJywgcmVjb3JkLnBsYW5uZWRXaXRoaW4sIGluZm8pIH0sXG4gICAgICAgICAgICBpbmRlcGVuZGVudERlbWFuZE9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3BsYW4nLCByZWNvcmQuaW5kZXBlbmRlbnREZW1hbmRPZiwgaW5mbykgfSxcbiAgICAgICAgICAgIGZ1bGZpbGxlZEJ5OiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRNYW55KCdnZXRfZnVsZmlsbGluZ19lY29ub21pY19ldmVudHNfZm9yX2NvbW1pdG1lbnQnLCByZWNvcmQuaWQsIGluZm8pIH0sXG4gICAgICAgICAgICBzdGFnZTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwcm9jZXNzX3NwZWNpZmljYXRpb24nLCByZWNvcmQuc3RhZ2UsIGluZm8pIH0sXG4gICAgICAgICAgICBzYXRpc2ZpZXM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnaW50ZW50JywgcmVjb3JkLnNhdGlzZmllcywgaW5mbykgfSxcbiAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0QWN0aW9uKHJlY29yZC5hY3Rpb24pIH0sXG4gICAgICAgICAgICByZXNvdXJjZUNvbmZvcm1zVG86IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgncmVzb3VyY2Vfc3BlY2lmaWNhdGlvbicsIHJlY29yZC5yZXNvdXJjZUNvbmZvcm1zVG8sIGluZm8pIH0sXG4gICAgICAgICAgICByZXNvdXJjZUludmVudG9yaWVkQXM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnZWNvbm9taWNfcmVzb3VyY2UnLCByZWNvcmQucmVzb3VyY2VJbnZlbnRvcmllZEFzLCBpbmZvKSB9LFxuICAgICAgICB9LFxuICAgICAgICBFY29ub21pY0V2ZW50OiB7XG4gICAgICAgICAgICBtZXRhOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7cmV0dXJuIGdldE1ldGEocmVjb3JkKX0sXG4gICAgICAgICAgICByZXNvdXJjZUludmVudG9yaWVkQXM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnZWNvbm9taWNfcmVzb3VyY2UnLCByZWNvcmQucmVzb3VyY2VJbnZlbnRvcmllZEFzLCBpbmZvKSB9LFxuICAgICAgICAgICAgdG9SZXNvdXJjZUludmVudG9yaWVkQXM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnZWNvbm9taWNfcmVzb3VyY2UnLCByZWNvcmQudG9SZXNvdXJjZUludmVudG9yaWVkQXMsIGluZm8pIH0sXG4gICAgICAgICAgICBpbnB1dE9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2Vjb25vbWljX2V2ZW50JywgcmVjb3JkLmlucHV0T2YsIGluZm8pIH0sXG4gICAgICAgICAgICBvdXRwdXRPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdlY29ub21pY19ldmVudCcsIHJlY29yZC5vdXRwdXRPZiwgaW5mbykgfSxcbiAgICAgICAgICAgIHByb3ZpZGVyOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2FnZW50JywgcmVjb3JkLnByb3ZpZGVyLCBpbmZvKSB9LFxuICAgICAgICAgICAgcmVjZWl2ZXI6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnYWdlbnQnLCByZWNvcmQucmVjZWl2ZXIsIGluZm8pIH0sXG4gICAgICAgICAgICBmdWxmaWxsczogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0TGlzdCgnY29tbWl0bWVudCcsIHJlY29yZC5mdWxmaWxscywgaW5mbykgfSxcbiAgICAgICAgICAgIHNhdGlzZmllczogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0TGlzdCgnaW50ZW50JywgcmVjb3JkLnNhdGlzZmllcywgaW5mbykgfSxcbiAgICAgICAgICAgIHJlc291cmNlQ29uZm9ybXNUbzogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdlY29ub21pY19yZXNvdXJjZScsIHJlY29yZC5yZXNvdXJjZUNvbmZvcm1zVG8sIGluZm8pIH0sXG4gICAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldEFjdGlvbihyZWNvcmQuYWN0aW9uKSB9LFxuICAgICAgICAgICAgcmVhbGl6YXRpb25PZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdhZ3JlZW1lbnQnLCByZWNvcmQucmVhbGl6YXRpb25PZiwgaW5mbykgfSxcbiAgICAgICAgfSxcbiAgICAgICAgRWNvbm9taWNSZXNvdXJjZToge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge3JldHVybiBnZXRNZXRhKHJlY29yZCl9LFxuICAgICAgICAgICAgY29udGFpbmVkSW46IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3JlYV9lY29ub21pY19yZXNvdXJjZXNfZm9yX3JlYV9lY29ub21pY19yZXNvdXJjZScsIHJlY29yZC5jb250YWluZWRfaW4sIGluZm8pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGFpbnM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3JlYV9lY29ub21pY19yZXNvdXJjZXNfZm9yX3JlYV9lY29ub21pY19yZXNvdXJjZScsIHJlY29yZC5pZCwgaW5mbylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25mb3Jtc1RvOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3Jlc291cmNlX3NwZWNpZmljYXRpb24nLCByZWNvcmQuY29uZm9ybXNUbywgaW5mbykgfSxcbiAgICAgICAgICAgIHN0YWdlOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3Byb2Nlc3Nfc3BlY2lmaWNhdGlvbicsIHJlY29yZC5zdGFnZSwgaW5mbykgfSxcbiAgICAgICAgICAgIHN0YXRlOiBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRBY3Rpb24ocmVjb3JkLnN0YXRlKSB9LFxuICAgICAgICAgICAgdW5pdE9mRWZmb3J0OiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3VuaXQnLCByZWNvcmQudW5pdE9mRWZmb3J0LCBpbmZvKSB9LFxuICAgICAgICAgICAgcHJpbWFyeUFjY291bnRhYmxlOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2FnZW50JywgcmVjb3JkLnByaW1hcnlBY2NvdW50YWJsZSwgaW5mbykgfSxcbiAgICAgICAgfSxcbiAgICAgICAgSW50ZW50OiB7XG4gICAgICAgICAgICBtZXRhOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7cmV0dXJuIGdldE1ldGEocmVjb3JkKX0sXG4gICAgICAgICAgICBzYXRpc2ZpZWRCeTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYW55KCdnZXRfc2F0aXNmeWluZ19jb21pdG1lbnRzX2Zvcl9yZWFfaW50ZW50JywgcmVjb3JkLmlkLCBpbmZvKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9ic2VydmVkQnk6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3NhdGlzZnlpbmdfZWNvbm9taWNfZXZlbnRzX2Zvcl9yZWFfaW50ZW50JywgcmVjb3JkLmlkLCBpbmZvKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb3ZpZGVyOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2FnZW50JywgcmVjb3JkLnByb3ZpZGVyLCBpbmZvKSB9LFxuICAgICAgICAgICAgcmVjZWl2ZXI6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnYWdlbnQnLCByZWNvcmQucmVjZWl2ZXIsIGluZm8pIH0sXG4gICAgICAgICAgICBpbnB1dE9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3Byb2Nlc3MnLCByZWNvcmQuaW5wdXRPZiwgaW5mbykgfSxcbiAgICAgICAgICAgIG91dHB1dE9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3Byb2Nlc3MnLCByZWNvcmQub3V0cHV0T2YsIGluZm8pIH0sXG4gICAgICAgICAgICAvLyBwdWJsaXNoZWRJbjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwcm9wb3NlZF9pbnRlbnQnLCByZWNvcmQucHVibGlzaGVkSW4sIGluZm8pIH0sXG4gICAgICAgICAgICByZXNvdXJjZUNvbmZvcm1zVG86IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgncmVzb3VyY2Vfc3BlY2lmaWNhdGlvbicsIHJlY29yZC5yZXNvdXJjZUNvbmZvcm1zVG8sIGluZm8pIH0sXG4gICAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldEFjdGlvbihyZWNvcmQuYWN0aW9uKSB9LFxuICAgICAgICB9LFxuICAgICAgICBNZWFzdXJlOiB7XG4gICAgICAgICAgICBoYXNVbml0OiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IFxuICAgICAgICAgICAgICAgIGNvbnN0IHVuaXQgPSBhd2FpdCBnZXQoJ3VuaXQnLCByZWNvcmQuaGFzVW5pdCwgaW5mbylcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5pdCA/IHVuaXQgOiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgUGxhbjoge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge3JldHVybiBnZXRNZXRhKHJlY29yZCl9LFxuICAgICAgICAgICAgcHJvY2Vzc2VzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IFxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYW55KCdnZXRfcmVhX3Byb2Nlc3Nlc19mb3JfcmVhX3BsYW4nLCByZWNvcmQuaWQsIGluZm8pIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluZGVwZW5kZW50RGVtYW5kczogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYW55KCdnZXRfaW5kZXBlbmRlbnRfZGVtYW5kc19mb3JfcmVhX3BsYW4nLCByZWNvcmQuaWQsIGluZm8pIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vblByb2Nlc3NDb21taXRtZW50czogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYW55KCdnZXRfcmVhX2NvbW1pdG1lbnRzX2Zvcl9yZWFfcGxhbicsIHJlY29yZC5pZCwgaW5mbykgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5TY29wZU9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRMaXN0KCdhZ2VudCcsIHJlY29yZC5pblNjb3BlT2YsIGluZm8pIH0sXG4gICAgICAgIH0sXG4gICAgICAgIFByb2Nlc3M6IHtcbiAgICAgICAgICAgIG1ldGE6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtyZXR1cm4gZ2V0TWV0YShyZWNvcmQpfSxcbiAgICAgICAgICAgIG9ic2VydmVkSW5wdXRzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9yZWFfZWNvbm9taWNfZXZlbnRfaW5wdXRzX2Zvcl9yZWFfcHJvY2VzcycsIHJlY29yZC5pZCwgaW5mbylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYnNlcnZlZE91dHB1dHM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3JlYV9lY29ub21pY19ldmVudF9vdXRwdXRzX2Zvcl9yZWFfcHJvY2VzcycsIHJlY29yZC5pZCwgaW5mbylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21taXR0ZWRJbnB1dHM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X2lucHV0c19mb3JfcmVhX3Byb2Nlc3MnLCByZWNvcmQuaWQsIGluZm8pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tbWl0dGVkT3V0cHV0czogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYW55KCdnZXRfb3V0cHV0c19mb3JfcmVhX3Byb2Nlc3MnLCByZWNvcmQuaWQsIGluZm8pIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGludGVuZGVkSW5wdXRzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9yZWFfaW50ZW50c19mb3JfcmVhX3Byb2Nlc3NfaW5wdXRzJywgcmVjb3JkLmlkLCBpbmZvKSBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnRlbmRlZE91dHB1dHM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3JlYV9pbnRlbnRzX2Zvcl9yZWFfcHJvY2Vzc19vdXRwdXRzJywgcmVjb3JkLmlkLCBpbmZvKSBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiYXNlZE9uOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3Byb2Nlc3Nfc3BlY2lmaWNhdGlvbicsIHJlY29yZC5iYXNlZE9uLCBpbmZvKSB9LFxuICAgICAgICAgICAgcGxhbm5lZFdpdGhpbjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwbGFuJywgcmVjb3JkLnBsYW5uZWRXaXRoaW4sIGluZm8pIH0sXG4gICAgICAgICAgICBpblNjb3BlT2Y6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldExpc3QoJ2FnZW50JywgcmVjb3JkLmluU2NvcGVPZiwgaW5mbykgfVxuICAgICAgICB9LFxuICAgICAgICBQcm9wb3NhbDoge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge3JldHVybiBnZXRNZXRhKHJlY29yZCl9LFxuICAgICAgICAgICAgcHVibGlzaGVzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRMaXN0KCdpbnRlbnQnLCByZWNvcmQucHVibGlzaGVzLCBpbmZvKSB9LFxuICAgICAgICAgICAgcmVjaXByb2NhbDogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0TGlzdCgnaW50ZW50JywgcmVjb3JkLnJlY2lwcm9jYWwsIGluZm8pIH0sXG4gICAgICAgICAgICBwcm9wb3NlZFRvOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRMaXN0KCdhZ2VudCcsIHJlY29yZC5wcm9wb3NlZFRvLCBpbmZvKSB9LFxuICAgICAgICAgICAgaW5TY29wZU9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRMaXN0KCdhZ2VudCcsIHJlY29yZC5pblNjb3BlT2YsIGluZm8pIH0sXG4gICAgICAgIH0sXG4gICAgICAgIFJlY2lwZUV4Y2hhbmdlOiB7XG4gICAgICAgICAgICBtZXRhOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7cmV0dXJuIGdldE1ldGEocmVjb3JkKX0sXG4gICAgICAgICAgICByZWNpcGVDbGF1c2VzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9yZWFfcmVjaXBlX2NsYXVzZXNfZm9yX3JlYV9yZWNpcGVfZXhjaGFuZ2UnLCByZWNvcmQuaWQsIGluZm8pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVjaXBlUmVjaXByb2NhbENsYXVzZXM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3JlYV9yZWNpcGVfcmVjaXByb2NhbF9jbGF1c2VzX2Zvcl9yZWFfcmVjaXBlX2V4Y2hhbmdlJywgcmVjb3JkLmlkLCBpbmZvKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVjaXBlRmxvdzoge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge3JldHVybiBnZXRNZXRhKHJlY