payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
454 lines (453 loc) • 49.2 kB
JavaScript
/* eslint-disable no-param-reassign */ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "promise", {
enumerable: true,
get: function() {
return promise;
}
});
const _types = require("../../config/types");
const _getDefaultValue = /*#__PURE__*/ _interop_require_default(require("../../getDefaultValue"));
const _relationshipPopulationPromise = /*#__PURE__*/ _interop_require_default(require("./relationshipPopulationPromise"));
const _traverseFields = require("./traverseFields");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const promise = async ({ collection, context, currentDepth, depth, doc, fallbackLocale, field, fieldPromises, findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc, triggerAccessControl = true, triggerHooks = true })=>{
if ((0, _types.fieldAffectsData)(field) && field.hidden && typeof siblingDoc[field.name] !== 'undefined' && !showHiddenFields) {
delete siblingDoc[field.name];
}
const shouldHoistLocalizedValue = flattenLocales && (0, _types.fieldAffectsData)(field) && typeof siblingDoc[field.name] === 'object' && siblingDoc[field.name] !== null && field.localized && locale !== 'all' && req.payload.config.localization;
if (shouldHoistLocalizedValue) {
// replace actual value with localized value before sanitizing
// { [locale]: fields } -> fields
const value = siblingDoc[field.name][locale];
let hoistedValue = value;
if (fallbackLocale && fallbackLocale !== locale) {
const fallbackValue = siblingDoc[field.name][fallbackLocale];
const isNullOrUndefined = typeof value === 'undefined' || value === null;
if (fallbackValue) {
switch(field.type){
case 'text':
case 'textarea':
{
if (value === '' || isNullOrUndefined) {
hoistedValue = fallbackValue;
}
break;
}
default:
{
if (isNullOrUndefined) {
hoistedValue = fallbackValue;
}
break;
}
}
}
}
siblingDoc[field.name] = hoistedValue;
}
// Sanitize outgoing field value
switch(field.type){
case 'group':
{
// Fill groups with empty objects so fields with hooks within groups can populate
// themselves virtually as necessary
if (typeof siblingDoc[field.name] === 'undefined') {
siblingDoc[field.name] = {};
}
break;
}
case 'tabs':
{
field.tabs.forEach((tab)=>{
if ((0, _types.tabHasName)(tab) && (typeof siblingDoc[tab.name] === 'undefined' || siblingDoc[tab.name] === null)) {
siblingDoc[tab.name] = {};
}
});
break;
}
case 'richText':
{
const editor = field?.editor;
// This is run here AND in the GraphQL Resolver
if (editor?.populationPromise) {
const populationPromise = editor.populationPromise({
context,
currentDepth,
depth,
field,
findMany,
flattenLocales,
overrideAccess,
populationPromises,
req,
showHiddenFields,
siblingDoc
});
if (populationPromise) {
populationPromises.push(populationPromise);
}
}
// This is only run here, independent of depth
if (editor?.afterReadPromise) {
const afterReadPromise = editor?.afterReadPromise({
field,
incomingEditorState: siblingDoc[field.name],
siblingDoc
});
if (afterReadPromise) {
populationPromises.push(afterReadPromise);
}
}
break;
}
case 'point':
{
const pointDoc = siblingDoc[field.name];
if (Array.isArray(pointDoc?.coordinates) && pointDoc.coordinates.length === 2) {
siblingDoc[field.name] = pointDoc.coordinates;
} else {
siblingDoc[field.name] = undefined;
}
break;
}
default:
{
break;
}
}
if ((0, _types.fieldAffectsData)(field)) {
// Execute hooks
if (triggerHooks && field.hooks?.afterRead) {
await field.hooks.afterRead.reduce(async (priorHook, currentHook)=>{
await priorHook;
const shouldRunHookOnAllLocales = field.localized && (locale === 'all' || !flattenLocales) && typeof siblingDoc[field.name] === 'object';
if (shouldRunHookOnAllLocales) {
const hookPromises = Object.entries(siblingDoc[field.name]).map(([locale, value])=>(async ()=>{
const hookedValue = await currentHook({
collection,
context,
data: doc,
field,
global,
operation: 'read',
originalDoc: doc,
req,
siblingData: siblingDoc,
value
});
if (hookedValue !== undefined) {
siblingDoc[field.name][locale] = hookedValue;
}
})());
await Promise.all(hookPromises);
} else {
const hookedValue = await currentHook({
collection,
context,
data: doc,
field,
findMany,
global,
operation: 'read',
originalDoc: doc,
req,
siblingData: siblingDoc,
value: siblingDoc[field.name]
});
if (hookedValue !== undefined) {
siblingDoc[field.name] = hookedValue;
}
}
}, Promise.resolve());
}
// Execute access control
let allowDefaultValue = true;
if (triggerAccessControl && field.access && field.access.read) {
const result = overrideAccess ? true : await field.access.read({
id: doc.id,
data: doc,
doc,
req,
siblingData: siblingDoc
});
if (!result) {
allowDefaultValue = false;
delete siblingDoc[field.name];
}
}
// Set defaultValue on the field for globals being returned without being first created
// or collection documents created prior to having a default
if (allowDefaultValue && typeof siblingDoc[field.name] === 'undefined' && typeof field.defaultValue !== 'undefined') {
siblingDoc[field.name] = await (0, _getDefaultValue.default)({
defaultValue: field.defaultValue,
locale,
user: req.user,
value: siblingDoc[field.name]
});
}
if (field.type === 'relationship' || field.type === 'upload') {
populationPromises.push((0, _relationshipPopulationPromise.default)({
currentDepth,
depth,
fallbackLocale,
field,
locale,
overrideAccess,
req,
showHiddenFields,
siblingDoc
}));
}
}
switch(field.type){
case 'group':
{
let groupDoc = siblingDoc[field.name];
if (typeof siblingDoc[field.name] !== 'object') groupDoc = {};
(0, _traverseFields.traverseFields)({
collection,
context,
currentDepth,
depth,
doc,
fallbackLocale,
fieldPromises,
fields: field.fields,
findMany,
flattenLocales,
global,
locale,
overrideAccess,
populationPromises,
req,
showHiddenFields,
siblingDoc: groupDoc,
triggerAccessControl,
triggerHooks
});
break;
}
case 'array':
{
const rows = siblingDoc[field.name];
if (Array.isArray(rows)) {
rows.forEach((row)=>{
(0, _traverseFields.traverseFields)({
collection,
context,
currentDepth,
depth,
doc,
fallbackLocale,
fieldPromises,
fields: field.fields,
findMany,
flattenLocales,
global,
locale,
overrideAccess,
populationPromises,
req,
showHiddenFields,
siblingDoc: row || {},
triggerAccessControl,
triggerHooks
});
});
} else if (!shouldHoistLocalizedValue && typeof rows === 'object' && rows !== null) {
Object.values(rows).forEach((localeRows)=>{
if (Array.isArray(localeRows)) {
localeRows.forEach((row)=>{
(0, _traverseFields.traverseFields)({
collection,
context,
currentDepth,
depth,
doc,
fallbackLocale,
fieldPromises,
fields: field.fields,
findMany,
flattenLocales,
global,
locale,
overrideAccess,
populationPromises,
req,
showHiddenFields,
siblingDoc: row || {},
triggerAccessControl,
triggerHooks
});
});
}
});
} else {
siblingDoc[field.name] = [];
}
break;
}
case 'blocks':
{
const rows = siblingDoc[field.name];
if (Array.isArray(rows)) {
rows.forEach((row)=>{
const block = field.blocks.find((blockType)=>blockType.slug === row.blockType);
if (block) {
(0, _traverseFields.traverseFields)({
collection,
context,
currentDepth,
depth,
doc,
fallbackLocale,
fieldPromises,
fields: block.fields,
findMany,
flattenLocales,
global,
locale,
overrideAccess,
populationPromises,
req,
showHiddenFields,
siblingDoc: row || {},
triggerAccessControl,
triggerHooks
});
}
});
} else if (!shouldHoistLocalizedValue && typeof rows === 'object' && rows !== null) {
Object.values(rows).forEach((localeRows)=>{
if (Array.isArray(localeRows)) {
localeRows.forEach((row)=>{
const block = field.blocks.find((blockType)=>blockType.slug === row.blockType);
if (block) {
(0, _traverseFields.traverseFields)({
collection,
context,
currentDepth,
depth,
doc,
fallbackLocale,
fieldPromises,
fields: block.fields,
findMany,
flattenLocales,
global,
locale,
overrideAccess,
populationPromises,
req,
showHiddenFields,
siblingDoc: row || {},
triggerAccessControl,
triggerHooks
});
}
});
}
});
} else {
siblingDoc[field.name] = [];
}
break;
}
case 'row':
case 'collapsible':
{
(0, _traverseFields.traverseFields)({
collection,
context,
currentDepth,
depth,
doc,
fallbackLocale,
fieldPromises,
fields: field.fields,
findMany,
flattenLocales,
global,
locale,
overrideAccess,
populationPromises,
req,
showHiddenFields,
siblingDoc,
triggerAccessControl,
triggerHooks
});
break;
}
case 'tab':
{
let tabDoc = siblingDoc;
if ((0, _types.tabHasName)(field)) {
tabDoc = siblingDoc[field.name];
if (typeof siblingDoc[field.name] !== 'object') tabDoc = {};
}
(0, _traverseFields.traverseFields)({
collection,
context,
currentDepth,
depth,
doc,
fallbackLocale,
fieldPromises,
fields: field.fields,
findMany,
flattenLocales,
global,
locale,
overrideAccess,
populationPromises,
req,
showHiddenFields,
siblingDoc: tabDoc,
triggerAccessControl,
triggerHooks
});
break;
}
case 'tabs':
{
(0, _traverseFields.traverseFields)({
collection,
context,
currentDepth,
depth,
doc,
fallbackLocale,
fieldPromises,
fields: field.tabs.map((tab)=>({
...tab,
type: 'tab'
})),
findMany,
flattenLocales,
global,
locale,
overrideAccess,
populationPromises,
req,
showHiddenFields,
siblingDoc,
triggerAccessControl,
triggerHooks
});
break;
}
default:
{
break;
}
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWVsZHMvaG9va3MvYWZ0ZXJSZWFkL3Byb21pc2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB0eXBlIHsgUmljaFRleHRBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9maWVsZC10eXBlcy9SaWNoVGV4dC90eXBlcydcbmltcG9ydCB0eXBlIHsgU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2NvbGxlY3Rpb25zL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgUGF5bG9hZFJlcXVlc3QsIFJlcXVlc3RDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vZXhwcmVzcy90eXBlcydcbmltcG9ydCB0eXBlIHsgU2FuaXRpemVkR2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vZ2xvYmFscy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEZpZWxkLCBUYWJBc0ZpZWxkIH0gZnJvbSAnLi4vLi4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhLCB0YWJIYXNOYW1lIH0gZnJvbSAnLi4vLi4vY29uZmlnL3R5cGVzJ1xuaW1wb3J0IGdldFZhbHVlV2l0aERlZmF1bHQgZnJvbSAnLi4vLi4vZ2V0RGVmYXVsdFZhbHVlJ1xuaW1wb3J0IHJlbGF0aW9uc2hpcFBvcHVsYXRpb25Qcm9taXNlIGZyb20gJy4vcmVsYXRpb25zaGlwUG9wdWxhdGlvblByb21pc2UnXG5pbXBvcnQgeyB0cmF2ZXJzZUZpZWxkcyB9IGZyb20gJy4vdHJhdmVyc2VGaWVsZHMnXG5cbnR5cGUgQXJncyA9IHtcbiAgY29sbGVjdGlvbjogU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyB8IG51bGxcbiAgY29udGV4dDogUmVxdWVzdENvbnRleHRcbiAgY3VycmVudERlcHRoOiBudW1iZXJcbiAgZGVwdGg6IG51bWJlclxuICBkb2M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGZhbGxiYWNrTG9jYWxlOiBudWxsIHwgc3RyaW5nXG4gIGZpZWxkOiBGaWVsZCB8IFRhYkFzRmllbGRcbiAgZmllbGRQcm9taXNlczogUHJvbWlzZTx2b2lkPltdXG4gIGZpbmRNYW55OiBib29sZWFuXG4gIGZsYXR0ZW5Mb2NhbGVzOiBib29sZWFuXG4gIGdsb2JhbDogU2FuaXRpemVkR2xvYmFsQ29uZmlnIHwgbnVsbFxuICBsb2NhbGU6IG51bGwgfCBzdHJpbmdcbiAgb3ZlcnJpZGVBY2Nlc3M6IGJvb2xlYW5cbiAgcG9wdWxhdGlvblByb21pc2VzOiBQcm9taXNlPHZvaWQ+W11cbiAgcmVxOiBQYXlsb2FkUmVxdWVzdFxuICBzaG93SGlkZGVuRmllbGRzOiBib29sZWFuXG4gIHNpYmxpbmdEb2M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHRyaWdnZXJBY2Nlc3NDb250cm9sPzogYm9vbGVhblxuICB0cmlnZ2VySG9va3M/OiBib29sZWFuXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgYWN0aW9ucywgaW4gb3JkZXI6XG4vLyAtIFJlbW92ZSBoaWRkZW4gZmllbGRzIGZyb20gcmVzcG9uc2Vcbi8vIC0gRmxhdHRlbiBsb2NhbGVzIGludG8gcmVxdWVzdGVkIGxvY2FsZVxuLy8gLSBTYW5pdGl6ZSBvdXRnb2luZyBkYXRhIChwb2ludCBmaWVsZCwgZXRjLilcbi8vIC0gRXhlY3V0ZSBmaWVsZCBob29rc1xuLy8gLSBFeGVjdXRlIHJlYWQgYWNjZXNzIGNvbnRyb2xcbi8vIC0gUG9wdWxhdGUgcmVsYXRpb25zaGlwc1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZSA9IGFzeW5jICh7XG4gIGNvbGxlY3Rpb24sXG4gIGNvbnRleHQsXG4gIGN1cnJlbnREZXB0aCxcbiAgZGVwdGgsXG4gIGRvYyxcbiAgZmFsbGJhY2tMb2NhbGUsXG4gIGZpZWxkLFxuICBmaWVsZFByb21pc2VzLFxuICBmaW5kTWFueSxcbiAgZmxhdHRlbkxvY2FsZXMsXG4gIGdsb2JhbCxcbiAgbG9jYWxlLFxuICBvdmVycmlkZUFjY2VzcyxcbiAgcG9wdWxhdGlvblByb21pc2VzLFxuICByZXEsXG4gIHNob3dIaWRkZW5GaWVsZHMsXG4gIHNpYmxpbmdEb2MsXG4gIHRyaWdnZXJBY2Nlc3NDb250cm9sID0gdHJ1ZSxcbiAgdHJpZ2dlckhvb2tzID0gdHJ1ZSxcbn06IEFyZ3MpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYgKFxuICAgIGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmXG4gICAgZmllbGQuaGlkZGVuICYmXG4gICAgdHlwZW9mIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gIT09ICd1bmRlZmluZWQnICYmXG4gICAgIXNob3dIaWRkZW5GaWVsZHNcbiAgKSB7XG4gICAgZGVsZXRlIHNpYmxpbmdEb2NbZmllbGQubmFtZV1cbiAgfVxuXG4gIGNvbnN0IHNob3VsZEhvaXN0TG9jYWxpemVkVmFsdWUgPVxuICAgIGZsYXR0ZW5Mb2NhbGVzICYmXG4gICAgZmllbGRBZmZlY3RzRGF0YShmaWVsZCkgJiZcbiAgICB0eXBlb2Ygc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9PT0gJ29iamVjdCcgJiZcbiAgICBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdICE9PSBudWxsICYmXG4gICAgZmllbGQubG9jYWxpemVkICYmXG4gICAgbG9jYWxlICE9PSAnYWxsJyAmJlxuICAgIHJlcS5wYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb25cblxuICBpZiAoc2hvdWxkSG9pc3RMb2NhbGl6ZWRWYWx1ZSkge1xuICAgIC8vIHJlcGxhY2UgYWN0dWFsIHZhbHVlIHdpdGggbG9jYWxpemVkIHZhbHVlIGJlZm9yZSBzYW5pdGl6aW5nXG4gICAgLy8geyBbbG9jYWxlXTogZmllbGRzIH0gLT4gZmllbGRzXG4gICAgY29uc3QgdmFsdWUgPSBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdW2xvY2FsZV1cblxuICAgIGxldCBob2lzdGVkVmFsdWUgPSB2YWx1ZVxuXG4gICAgaWYgKGZhbGxiYWNrTG9jYWxlICYmIGZhbGxiYWNrTG9jYWxlICE9PSBsb2NhbGUpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrVmFsdWUgPSBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdW2ZhbGxiYWNrTG9jYWxlXVxuICAgICAgY29uc3QgaXNOdWxsT3JVbmRlZmluZWQgPSB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHZhbHVlID09PSBudWxsXG5cbiAgICAgIGlmIChmYWxsYmFja1ZhbHVlKSB7XG4gICAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgIGNhc2UgJ3RleHRhcmVhJzoge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCBpc051bGxPclVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBob2lzdGVkVmFsdWUgPSBmYWxsYmFja1ZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBob2lzdGVkVmFsdWUgPSBmYWxsYmFja1ZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPSBob2lzdGVkVmFsdWVcbiAgfVxuXG4gIC8vIFNhbml0aXplIG91dGdvaW5nIGZpZWxkIHZhbHVlXG4gIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgIGNhc2UgJ2dyb3VwJzoge1xuICAgICAgLy8gRmlsbCBncm91cHMgd2l0aCBlbXB0eSBvYmplY3RzIHNvIGZpZWxkcyB3aXRoIGhvb2tzIHdpdGhpbiBncm91cHMgY2FuIHBvcHVsYXRlXG4gICAgICAvLyB0aGVtc2VsdmVzIHZpcnR1YWxseSBhcyBuZWNlc3NhcnlcbiAgICAgIGlmICh0eXBlb2Ygc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9IHt9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ3RhYnMnOiB7XG4gICAgICBmaWVsZC50YWJzLmZvckVhY2goKHRhYikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGFiSGFzTmFtZSh0YWIpICYmXG4gICAgICAgICAgKHR5cGVvZiBzaWJsaW5nRG9jW3RhYi5uYW1lXSA9PT0gJ3VuZGVmaW5lZCcgfHwgc2libGluZ0RvY1t0YWIubmFtZV0gPT09IG51bGwpXG4gICAgICAgICkge1xuICAgICAgICAgIHNpYmxpbmdEb2NbdGFiLm5hbWVdID0ge31cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjYXNlICdyaWNoVGV4dCc6IHtcbiAgICAgIGNvbnN0IGVkaXRvcjogUmljaFRleHRBZGFwdGVyID0gZmllbGQ/LmVkaXRvclxuICAgICAgLy8gVGhpcyBpcyBydW4gaGVyZSBBTkQgaW4gdGhlIEdyYXBoUUwgUmVzb2x2ZXJcbiAgICAgIGlmIChlZGl0b3I/LnBvcHVsYXRpb25Qcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IHBvcHVsYXRpb25Qcm9taXNlID0gZWRpdG9yLnBvcHVsYXRpb25Qcm9taXNlKHtcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBmaW5kTWFueSxcbiAgICAgICAgICBmbGF0dGVuTG9jYWxlcyxcbiAgICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMsXG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgICAgc2libGluZ0RvYyxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAocG9wdWxhdGlvblByb21pc2UpIHtcbiAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMucHVzaChwb3B1bGF0aW9uUHJvbWlzZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGlzIG9ubHkgcnVuIGhlcmUsIGluZGVwZW5kZW50IG9mIGRlcHRoXG4gICAgICBpZiAoZWRpdG9yPy5hZnRlclJlYWRQcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyUmVhZFByb21pc2UgPSBlZGl0b3I/LmFmdGVyUmVhZFByb21pc2Uoe1xuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGluY29taW5nRWRpdG9yU3RhdGU6IHNpYmxpbmdEb2NbZmllbGQubmFtZV0gYXMgb2JqZWN0LFxuICAgICAgICAgIHNpYmxpbmdEb2MsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGFmdGVyUmVhZFByb21pc2UpIHtcbiAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMucHVzaChhZnRlclJlYWRQcm9taXNlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY2FzZSAncG9pbnQnOiB7XG4gICAgICBjb25zdCBwb2ludERvYyA9IHNpYmxpbmdEb2NbZmllbGQubmFtZV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBvaW50RG9jPy5jb29yZGluYXRlcykgJiYgcG9pbnREb2MuY29vcmRpbmF0ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPSBwb2ludERvYy5jb29yZGluYXRlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpKSB7XG4gICAgLy8gRXhlY3V0ZSBob29rc1xuICAgIGlmICh0cmlnZ2VySG9va3MgJiYgZmllbGQuaG9va3M/LmFmdGVyUmVhZCkge1xuICAgICAgYXdhaXQgZmllbGQuaG9va3MuYWZ0ZXJSZWFkLnJlZHVjZShhc3luYyAocHJpb3JIb29rLCBjdXJyZW50SG9vaykgPT4ge1xuICAgICAgICBhd2FpdCBwcmlvckhvb2tcblxuICAgICAgICBjb25zdCBzaG91bGRSdW5Ib29rT25BbGxMb2NhbGVzID1cbiAgICAgICAgICBmaWVsZC5sb2NhbGl6ZWQgJiZcbiAgICAgICAgICAobG9jYWxlID09PSAnYWxsJyB8fCAhZmxhdHRlbkxvY2FsZXMpICYmXG4gICAgICAgICAgdHlwZW9mIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPT09ICdvYmplY3QnXG5cbiAgICAgICAgaWYgKHNob3VsZFJ1bkhvb2tPbkFsbExvY2FsZXMpIHtcbiAgICAgICAgICBjb25zdCBob29rUHJvbWlzZXMgPSBPYmplY3QuZW50cmllcyhzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdKS5tYXAoKFtsb2NhbGUsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGhvb2tlZFZhbHVlID0gYXdhaXQgY3VycmVudEhvb2soe1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICBkYXRhOiBkb2MsXG4gICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ3JlYWQnLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRG9jOiBkb2MsXG4gICAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICAgIHNpYmxpbmdEYXRhOiBzaWJsaW5nRG9jLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIGlmIChob29rZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2libGluZ0RvY1tmaWVsZC5uYW1lXVtsb2NhbGVdID0gaG9va2VkVmFsdWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChob29rUHJvbWlzZXMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaG9va2VkVmFsdWUgPSBhd2FpdCBjdXJyZW50SG9vayh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGRhdGE6IGRvYyxcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgZmluZE1hbnksXG4gICAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgICBvcGVyYXRpb246ICdyZWFkJyxcbiAgICAgICAgICAgIG9yaWdpbmFsRG9jOiBkb2MsXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICBzaWJsaW5nRGF0YTogc2libGluZ0RvYyxcbiAgICAgICAgICAgIHZhbHVlOiBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoaG9va2VkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9IGhvb2tlZFZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIGFjY2VzcyBjb250cm9sXG4gICAgbGV0IGFsbG93RGVmYXVsdFZhbHVlID0gdHJ1ZVxuICAgIGlmICh0cmlnZ2VyQWNjZXNzQ29udHJvbCAmJiBmaWVsZC5hY2Nlc3MgJiYgZmllbGQuYWNjZXNzLnJlYWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG92ZXJyaWRlQWNjZXNzXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGF3YWl0IGZpZWxkLmFjY2Vzcy5yZWFkKHtcbiAgICAgICAgICAgIGlkOiBkb2MuaWQgYXMgbnVtYmVyIHwgc3RyaW5nLFxuICAgICAgICAgICAgZGF0YTogZG9jLFxuICAgICAgICAgICAgZG9jLFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgc2libGluZ0RhdGE6IHNpYmxpbmdEb2MsXG4gICAgICAgICAgfSlcblxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgYWxsb3dEZWZhdWx0VmFsdWUgPSBmYWxzZVxuICAgICAgICBkZWxldGUgc2libGluZ0RvY1tmaWVsZC5uYW1lXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0VmFsdWUgb24gdGhlIGZpZWxkIGZvciBnbG9iYWxzIGJlaW5nIHJldHVybmVkIHdpdGhvdXQgYmVpbmcgZmlyc3QgY3JlYXRlZFxuICAgIC8vIG9yIGNvbGxlY3Rpb24gZG9jdW1lbnRzIGNyZWF0ZWQgcHJpb3IgdG8gaGF2aW5nIGEgZGVmYXVsdFxuICAgIGlmIChcbiAgICAgIGFsbG93RGVmYXVsdFZhbHVlICYmXG4gICAgICB0eXBlb2Ygc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBmaWVsZC5kZWZhdWx0VmFsdWUgIT09ICd1bmRlZmluZWQnXG4gICAgKSB7XG4gICAgICBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdID0gYXdhaXQgZ2V0VmFsdWVXaXRoRGVmYXVsdCh7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZmllbGQuZGVmYXVsdFZhbHVlLFxuICAgICAgICBsb2NhbGUsXG4gICAgICAgIHVzZXI6IHJlcS51c2VyLFxuICAgICAgICB2YWx1ZTogc2libGluZ0RvY1tmaWVsZC5uYW1lXSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGZpZWxkLnR5cGUgPT09ICdyZWxhdGlvbnNoaXAnIHx8IGZpZWxkLnR5cGUgPT09ICd1cGxvYWQnKSB7XG4gICAgICBwb3B1bGF0aW9uUHJvbWlzZXMucHVzaChcbiAgICAgICAgcmVsYXRpb25zaGlwUG9wdWxhdGlvblByb21pc2Uoe1xuICAgICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgICAgc2libGluZ0RvYyxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgY2FzZSAnZ3JvdXAnOiB7XG4gICAgICBsZXQgZ3JvdXBEb2MgPSBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICBpZiAodHlwZW9mIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gIT09ICdvYmplY3QnKSBncm91cERvYyA9IHt9XG5cbiAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgZG9jLFxuICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgZmllbGRQcm9taXNlcyxcbiAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHMsXG4gICAgICAgIGZpbmRNYW55LFxuICAgICAgICBmbGF0dGVuTG9jYWxlcyxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBsb2NhbGUsXG4gICAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMsXG4gICAgICAgIHJlcSxcbiAgICAgICAgc2hvd0hpZGRlbkZpZWxkcyxcbiAgICAgICAgc2libGluZ0RvYzogZ3JvdXBEb2MsXG4gICAgICAgIHRyaWdnZXJBY2Nlc3NDb250cm9sLFxuICAgICAgICB0cmlnZ2VySG9va3MsXG4gICAgICB9KVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgJ2FycmF5Jzoge1xuICAgICAgY29uc3Qgcm93cyA9IHNpYmxpbmdEb2NbZmllbGQubmFtZV1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93cykpIHtcbiAgICAgICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICB0cmF2ZXJzZUZpZWxkcyh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgZG9jLFxuICAgICAgICAgICAgZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgICAgICBmaWVsZFByb21pc2VzLFxuICAgICAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHMsXG4gICAgICAgICAgICBmaW5kTWFueSxcbiAgICAgICAgICAgIGZsYXR0ZW5Mb2NhbGVzLFxuICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMsXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICBzaG93SGlkZGVuRmllbGRzLFxuICAgICAgICAgICAgc2libGluZ0RvYzogcm93IHx8IHt9LFxuICAgICAgICAgICAgdHJpZ2dlckFjY2Vzc0NvbnRyb2wsXG4gICAgICAgICAgICB0cmlnZ2VySG9va3MsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZEhvaXN0TG9jYWxpemVkVmFsdWUgJiYgdHlwZW9mIHJvd3MgPT09ICdvYmplY3QnICYmIHJvd3MgIT09IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhyb3dzKS5mb3JFYWNoKChsb2NhbGVSb3dzKSA9PiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobG9jYWxlUm93cykpIHtcbiAgICAgICAgICAgIGxvY2FsZVJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgICAgIGRvYyxcbiAgICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICAgICAgICBmaWVsZFByb21pc2VzLFxuICAgICAgICAgICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgICAgICAgICAgIGZpbmRNYW55LFxuICAgICAgICAgICAgICAgIGZsYXR0ZW5Mb2NhbGVzLFxuICAgICAgICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgICAgICAgICAgcG9wdWxhdGlvblByb21pc2VzLFxuICAgICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgICAgICBzaG93SGlkZGVuRmllbGRzLFxuICAgICAgICAgICAgICAgIHNpYmxpbmdEb2M6IHJvdyB8fCB7fSxcbiAgICAgICAgICAgICAgICB0cmlnZ2VyQWNjZXNzQ29udHJvbCxcbiAgICAgICAgICAgICAgICB0cmlnZ2VySG9va3MsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPSBbXVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjYXNlICdibG9ja3MnOiB7XG4gICAgICBjb25zdCByb3dzID0gc2libGluZ0RvY1tmaWVsZC5uYW1lXVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dzKSkge1xuICAgICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IGJsb2NrID0gZmllbGQuYmxvY2tzLmZpbmQoKGJsb2NrVHlwZSkgPT4gYmxvY2tUeXBlLnNsdWcgPT09IHJvdy5ibG9ja1R5cGUpXG5cbiAgICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgICAgZG9jLFxuICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICAgICAgZmllbGRQcm9taXNlcyxcbiAgICAgICAgICAgICAgZmllbGRzOiBibG9jay5maWVsZHMsXG4gICAgICAgICAgICAgIGZpbmRNYW55LFxuICAgICAgICAgICAgICBmbGF0dGVuTG9jYWxlcyxcbiAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMsXG4gICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgICAgc2hvd0hpZGRlbkZpZWxkcyxcbiAgICAgICAgICAgICAgc2libGluZ0RvYzogcm93IHx8IHt9LFxuICAgICAgICAgICAgICB0cmlnZ2VyQWNjZXNzQ29udHJvbCxcbiAgICAgICAgICAgICAgdHJpZ2dlckhvb2tzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRIb2lzdExvY2FsaXplZFZhbHVlICYmIHR5cGVvZiByb3dzID09PSAnb2JqZWN0JyAmJiByb3dzICE9PSBudWxsKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXMocm93cykuZm9yRWFjaCgobG9jYWxlUm93cykgPT4ge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxvY2FsZVJvd3MpKSB7XG4gICAgICAgICAgICBsb2NhbGVSb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBibG9jayA9IGZpZWxkLmJsb2Nrcy5maW5kKChibG9ja1R5cGUpID0+IGJsb2NrVHlwZS5zbHVnID09PSByb3cuYmxvY2tUeXBlKVxuXG4gICAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICAgICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgICAgICAgICBkb2MsXG4gICAgICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICAgICAgICAgIGZpZWxkUHJvbWlzZXMsXG4gICAgICAgICAgICAgICAgICBmaWVsZHM6IGJsb2NrLmZpZWxkcyxcbiAgICAgICAgICAgICAgICAgIGZpbmRNYW55LFxuICAgICAgICAgICAgICAgICAgZmxhdHRlbkxvY2FsZXMsXG4gICAgICAgICAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb25Qcm9taXNlcyxcbiAgICAgICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgICAgICAgICAgICBzaWJsaW5nRG9jOiByb3cgfHwge30sXG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyQWNjZXNzQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJIb29rcyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPSBbXVxuICAgICAgfVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgJ3Jvdyc6XG4gICAgY2FzZSAnY29sbGFwc2libGUnOiB7XG4gICAgICB0cmF2ZXJzZUZpZWxkcyh7XG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGRvYyxcbiAgICAgICAgZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgIGZpZWxkUHJvbWlzZXMsXG4gICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgICBmaW5kTWFueSxcbiAgICAgICAgZmxhdHRlbkxvY2FsZXMsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgcG9wdWxhdGlvblByb21pc2VzLFxuICAgICAgICByZXEsXG4gICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgIHNpYmxpbmdEb2MsXG4gICAgICAgIHRyaWdnZXJBY2Nlc3NDb250cm9sLFxuICAgICAgICB0cmlnZ2VySG9va3MsXG4gICAgICB9KVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgJ3RhYic6IHtcbiAgICAgIGxldCB0YWJEb2MgPSBzaWJsaW5nRG9jXG4gICAgICBpZiAodGFiSGFzTmFtZShmaWVsZCkpIHtcbiAgICAgICAgdGFiRG9jID0gc2libGluZ0RvY1tmaWVsZC5uYW1lXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICBpZiAodHlwZW9mIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gIT09ICdvYmplY3QnKSB0YWJEb2MgPSB7fVxuICAgICAgfVxuXG4gICAgICB0cmF2ZXJzZUZpZWxkcyh7XG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGRvYyxcbiAgICAgICAgZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgIGZpZWxkUHJvbWlzZXMsXG4gICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgICBmaW5kTWFueSxcbiAgICAgICAgZmxhdHRlbkxvY2FsZXMsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgcG9wdWxhdGlvblByb21pc2VzLFxuICAgICAgICByZXEsXG4gICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgIHNpYmxpbmdEb2M6IHRhYkRvYyxcbiAgICAgICAgdHJpZ2dlckFjY2Vzc0NvbnRyb2wsXG4gICAgICAgIHRyaWdnZXJIb29rcyxcbiAgICAgIH0pXG5cbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY2FzZSAndGFicyc6IHtcbiAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgZG9jLFxuICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgZmllbGRQcm9taXNlcyxcbiAgICAgICAgZmllbGRzOiBmaWVsZC50YWJzLm1hcCgodGFiKSA9PiAoeyAuLi50YWIsIHR5cGU6ICd0YWInIH0pKSxcbiAgICAgICAgZmluZE1hbnksXG4gICAgICAgIGZsYXR0ZW5Mb2NhbGVzLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgIHBvcHVsYXRpb25Qcm9taXNlcyxcbiAgICAgICAgcmVxLFxuICAgICAgICBzaG93SGlkZGVuRmllbGRzLFxuICAgICAgICBzaWJsaW5nRG9jLFxuICAgICAgICB0cmlnZ2VyQWNjZXNzQ29udHJvbCxcbiAgICAgICAgdHJpZ2dlckhvb2tzLFxuICAgICAgfSlcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJwcm9taXNlIiwiY29sbGVjdGlvbiIsImNvbnRleHQiLCJjdXJyZW50RGVwdGgiLCJkZXB0aCIsImRvYyIsImZhbGxiYWNrTG9jYWxlIiwiZmllbGQiLCJmaWVsZFByb21pc2VzIiwiZmluZE1hbnkiLCJmbGF0dGVuTG9jYWxlcyIsImdsb2JhbCIsImxvY2FsZSIsIm92ZXJyaWRlQWNjZXNzIiwicG9wdWxhdGlvblByb21pc2VzIiwicmVxIiwic2hvd0hpZGRlbkZpZWxkcyIsInNpYmxpbmdEb2MiLCJ0cmlnZ2VyQWNjZXNzQ29udHJvbCIsInRyaWdnZXJIb29rcyIsImZpZWxkQWZmZWN0c0RhdGEiLCJoaWRkZW4iLCJuYW1lIiwic2hvdWxkSG9pc3RMb2NhbGl6ZWRWYWx1ZSIsImxvY2FsaXplZCIsInBheWxvYWQiLCJjb25maWciLCJsb2NhbGl6YXRpb24iLCJ2YWx1ZSIsImhvaXN0ZWRWYWx1ZSIsImZhbGxiYWNrVmFsdWUiLCJpc051bGxPclVuZGVmaW5lZCIsInR5cGUiLCJ0YWJzIiwiZm9yRWFjaCIsInRhYiIsInRhYkhhc05hbWUiLCJlZGl0b3IiLCJwb3B1bGF0aW9uUHJvbWlzZSIsInB1c2giLCJhZnRlclJlYWRQcm9taXNlIiwiaW5jb21pbmdFZGl0b3JTdGF0ZSIsInBvaW50RG9jIiwiQXJyYXkiLCJpc0FycmF5IiwiY29vcmRpbmF0ZXMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJob29rcyIsImFmdGVyUmVhZCIsInJlZHVjZSIsInByaW9ySG9vayIsImN1cnJlbnRIb29rIiwic2hvdWxkUnVuSG9va09uQWxsTG9jYWxlcyIsImhvb2tQcm9taXNlcyIsIk9iamVjdCIsImVudHJpZXMiLCJtYXAiLCJob29rZWRWYWx1ZSIsImRhdGEiLCJvcGVyYXRpb24iLCJvcmlnaW5hbERvYyIsInNpYmxpbmdEYXRhIiwiUHJvbWlzZSIsImFsbCIsInJlc29sdmUiLCJhbGxvd0RlZmF1bHRWYWx1ZSIsImFjY2VzcyIsInJlYWQiLCJyZXN1bHQiLCJpZCIsImRlZmF1bHRWYWx1ZSIsImdldFZhbHVlV2l0aERlZmF1bHQiLCJ1c2VyIiwicmVsYXRpb25zaGlwUG9wdWxhdGlvblByb21pc2UiLCJncm91cERvYyIsInRyYXZlcnNlRmllbGRzIiwiZmllbGRzIiwicm93cyIsInJvdyIsInZhbHVlcyIsImxvY2FsZVJvd3MiLCJibG9jayIsImJsb2NrcyIsImZpbmQiLCJibG9ja1R5cGUiLCJzbHVnIiwidGFiRG9jIl0sIm1hcHBpbmdzIjoiQUFBQSxvQ0FBb0M7Ozs7K0JBMEN2QkE7OztlQUFBQTs7O3VCQW5DZ0M7d0VBQ2I7c0ZBQ1U7Z0NBQ1g7Ozs7OztBQWdDeEIsTUFBTUEsVUFBVSxPQUFPLEVBQzVCQyxVQUFVLEVBQ1ZDLE9BQU8sRUFDUEMsWUFBWSxFQUNaQyxLQUFLLEVBQ0xDLEdBQUcsRUFDSEMsY0FBYyxFQUNkQyxLQUFLLEVBQ0xDLGFBQWEsRUFDYkMsUUFBUSxFQUNSQyxjQUFjLEVBQ2RDLE1BQU0sRUFDTkMsTUFBTSxFQUNOQyxjQUFjLEVBQ2RDLGtCQUFrQixFQUNsQkMsR0FBRyxFQUNIQyxnQkFBZ0IsRUFDaEJDLFVBQVUsRUFDVkMsdUJBQXVCLElBQUksRUFDM0JDLGVBQWUsSUFBSSxFQUNkO0lBQ0wsSUFDRUMsSUFBQUEsdUJBQWdCLEVBQUNiLFVBQ2pCQSxNQUFN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