ngx-schema-forms
Version:
New features: - Ajv schema validator. - Angular forms compatible: Property tree is created using FormGroup, FormArray and FormControl classes. - Array now properly loads initial data from model. - WidgetTyep: WidgetRegistry now supports WidgetType, now wo
303 lines (302 loc) • 24.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { isBlank } from './utils';
/**
* @param {?} message
* @param {?} path
* @return {?}
*/
function formatMessage(message, path) {
return "Parsing error on " + path + ": " + message;
}
/**
* @param {?} message
* @param {?} path
* @return {?}
*/
function schemaError(message, path) {
/** @type {?} */
var mesg = formatMessage(message, path);
throw new Error(mesg);
}
/**
* @param {?} message
* @param {?} path
* @return {?}
*/
function schemaWarning(message, path) {
/** @type {?} */
var mesg = formatMessage(message, path);
throw new Error(mesg);
}
var SchemaPreprocessor = /** @class */ (function () {
function SchemaPreprocessor() {
}
/**
* @param {?} jsonSchema
* @param {?=} path
* @return {?}
*/
SchemaPreprocessor.preprocess = /**
* @param {?} jsonSchema
* @param {?=} path
* @return {?}
*/
function (jsonSchema, path) {
if (path === void 0) { path = '/'; }
jsonSchema = jsonSchema || {};
if (jsonSchema.type === 'object') {
SchemaPreprocessor.checkProperties(jsonSchema, path);
SchemaPreprocessor.checkAndCreateFieldsets(jsonSchema, path);
}
else if (jsonSchema.type === 'array') {
SchemaPreprocessor.checkItems(jsonSchema, path);
}
SchemaPreprocessor.normalizeWidget(jsonSchema);
SchemaPreprocessor.recursiveCheck(jsonSchema, path);
};
/**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
SchemaPreprocessor.checkProperties = /**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
function (jsonSchema, path) {
if (isBlank(jsonSchema.properties)) {
jsonSchema.properties = {};
schemaWarning('Provided json schema does not contain a \'properties\' entry. Output schema will be empty', path);
}
};
/**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
SchemaPreprocessor.checkAndCreateFieldsets = /**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
function (jsonSchema, path) {
if (jsonSchema.fieldsets === undefined) {
if (jsonSchema.order !== undefined) {
SchemaPreprocessor.replaceOrderByFieldsets(jsonSchema);
}
else {
SchemaPreprocessor.createFieldsets(jsonSchema);
}
}
SchemaPreprocessor.checkFieldsUsage(jsonSchema, path);
};
/**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
SchemaPreprocessor.checkFieldsUsage = /**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
function (jsonSchema, path) {
/** @type {?} */
var fieldsId = Object.keys(jsonSchema.properties);
/** @type {?} */
var usedFields = {};
try {
for (var _a = tslib_1.__values(jsonSchema.fieldsets), _b = _a.next(); !_b.done; _b = _a.next()) {
var fieldset = _b.value;
try {
for (var _c = tslib_1.__values(fieldset.fields), _d = _c.next(); !_d.done; _d = _c.next()) {
var fieldId = _d.value;
if (usedFields[fieldId] === undefined) {
usedFields[fieldId] = [];
}
usedFields[fieldId].push(fieldset.id);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_d && !_d.done && (_e = _c.return)) _e.call(_c);
}
finally { if (e_1) throw e_1.error; }
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_b && !_b.done && (_f = _a.return)) _f.call(_a);
}
finally { if (e_2) throw e_2.error; }
}
try {
for (var fieldsId_1 = tslib_1.__values(fieldsId), fieldsId_1_1 = fieldsId_1.next(); !fieldsId_1_1.done; fieldsId_1_1 = fieldsId_1.next()) {
var fieldId = fieldsId_1_1.value;
if (usedFields.hasOwnProperty(fieldId)) {
if (usedFields[fieldId].length > 1) {
schemaError(fieldId + " is referenced by more than one fieldset: " + usedFields[fieldId], path);
}
delete usedFields[fieldId];
}
else if (jsonSchema.required.indexOf(fieldId) > -1) {
schemaError(fieldId + " is a required field but it is not referenced as part of a 'order' or a 'fieldset' property", path);
}
else {
delete jsonSchema[fieldId];
schemaWarning("Removing unreferenced field " + fieldId, path);
}
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (fieldsId_1_1 && !fieldsId_1_1.done && (_g = fieldsId_1.return)) _g.call(fieldsId_1);
}
finally { if (e_3) throw e_3.error; }
}
for (var remainingfieldsId in usedFields) {
if (usedFields.hasOwnProperty(remainingfieldsId)) {
schemaWarning("Referencing non-existent field " + remainingfieldsId + " in one or more fieldsets", path);
}
}
var e_2, _f, e_1, _e, e_3, _g;
};
/**
* @param {?} jsonSchema
* @return {?}
*/
SchemaPreprocessor.createFieldsets = /**
* @param {?} jsonSchema
* @return {?}
*/
function (jsonSchema) {
jsonSchema.order = Object.keys(jsonSchema.properties);
SchemaPreprocessor.replaceOrderByFieldsets(jsonSchema);
};
/**
* @param {?} jsonSchema
* @return {?}
*/
SchemaPreprocessor.replaceOrderByFieldsets = /**
* @param {?} jsonSchema
* @return {?}
*/
function (jsonSchema) {
jsonSchema.fieldsets = [{
id: 'fieldset-default',
title: jsonSchema.title || '',
description: jsonSchema.description || '',
name: jsonSchema.name || '',
fields: jsonSchema.order
}];
delete jsonSchema.order;
};
/**
* @param {?} fieldSchema
* @return {?}
*/
SchemaPreprocessor.normalizeWidget = /**
* @param {?} fieldSchema
* @return {?}
*/
function (fieldSchema) {
/** @type {?} */
var widget = fieldSchema.widget;
if (widget === undefined) {
widget = { 'id': fieldSchema.type };
}
else if (typeof widget === 'string') {
widget = { 'id': widget };
}
fieldSchema.widget = widget;
};
/**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
SchemaPreprocessor.checkItems = /**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
function (jsonSchema, path) {
if (jsonSchema.items === undefined) {
schemaError('No \'items\' property in array', path);
}
};
/**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
SchemaPreprocessor.recursiveCheck = /**
* @param {?} jsonSchema
* @param {?} path
* @return {?}
*/
function (jsonSchema, path) {
if (jsonSchema.type === 'object') {
/*
for (const fieldId in jsonSchema.properties) {
if (jsonSchema.properties.hasOwnProperty(fieldId)) {
const fieldSchema = jsonSchema.properties[fieldId];
SchemaPreprocessor.preprocess(fieldSchema, path + fieldId + '/');
}
}
*/
if (jsonSchema.hasOwnProperty('definitions')) {
for (var fieldId in jsonSchema.definitions) {
if (jsonSchema.definitions.hasOwnProperty(fieldId)) {
/** @type {?} */
var fieldSchema = jsonSchema.definitions[fieldId];
SchemaPreprocessor.removeRecursiveRefProperties(fieldSchema, "#/definitions/" + fieldId);
// formPropertyFactory recursive is used instead
// SchemaPreprocessor.preprocess(fieldSchema, path + fieldId + '/');
}
}
}
} // else if (jsonSchema.type === 'array') {
// formPropertyFactory recursive is used instead
// SchemaPreprocessor.preprocess(jsonSchema.items, path + '*/');
// }
};
/**
* @param {?} jsonSchema
* @param {?} definitionPath
* @return {?}
*/
SchemaPreprocessor.removeRecursiveRefProperties = /**
* @param {?} jsonSchema
* @param {?} definitionPath
* @return {?}
*/
function (jsonSchema, definitionPath) {
// to avoid infinite loop
if (jsonSchema.type === 'object') {
for (var fieldId in jsonSchema.properties) {
if (jsonSchema.properties.hasOwnProperty(fieldId)) {
if (jsonSchema.properties[fieldId].$ref
&& jsonSchema.properties[fieldId].$ref === definitionPath) {
delete jsonSchema.properties[fieldId];
}
else if (jsonSchema.properties[fieldId].type === 'object') {
SchemaPreprocessor.removeRecursiveRefProperties(jsonSchema.properties[fieldId], definitionPath);
}
}
}
}
};
return SchemaPreprocessor;
}());
export { SchemaPreprocessor };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcHJlcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9tb2RlbC9zY2hlbWFwcmVwcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sU0FBUyxDQUFDOzs7Ozs7QUFFaEMsdUJBQXVCLE9BQU8sRUFBRSxJQUFJO0lBQ2xDLE1BQU0sQ0FBQyxzQkFBb0IsSUFBSSxVQUFLLE9BQVMsQ0FBQztDQUMvQzs7Ozs7O0FBRUQscUJBQXFCLE9BQU8sRUFBRSxJQUFJOztJQUNoQyxJQUFNLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDdkI7Ozs7OztBQUVELHVCQUF1QixPQUFPLEVBQUUsSUFBSTs7SUFDbEMsSUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3ZCO0FBR0QsSUFBQTs7Ozs7Ozs7SUFFUyw2QkFBVTs7Ozs7SUFBakIsVUFBa0IsVUFBZSxFQUFFLElBQVU7UUFBVixxQkFBQSxFQUFBLFVBQVU7UUFDM0MsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFFOUIsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckQsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzlEO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFD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QUFDLENBQUMsQ0FBQztnQkFDNUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUk7MkJBQ2xDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUM7d0JBQzVELE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDdkM7b0JBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7d0JBQzVELGtCQUFrQixDQUFDLDRCQUE0QixDQUM3QyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUM5QixjQUFjLENBQ2YsQ0FBQztxQkFDSDtpQkFDRjthQUNGO1NBQ0Y7OzZCQW5LTDtJQXFLQyxDQUFBO0FBcEpELDhCQW9KQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNCbGFua30gZnJvbSAnLi91dGlscyc7XG5cbmZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2UobWVzc2FnZSwgcGF0aCkge1xuICByZXR1cm4gYFBhcnNpbmcgZXJyb3Igb24gJHtwYXRofTogJHttZXNzYWdlfWA7XG59XG5cbmZ1bmN0aW9uIHNjaGVtYUVycm9yKG1lc3NhZ2UsIHBhdGgpOiB2b2lkIHtcbiAgY29uc3QgbWVzZyA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZSwgcGF0aCk7XG4gIHRocm93IG5ldyBFcnJvcihtZXNnKTtcbn1cblxuZnVuY3Rpb24gc2NoZW1hV2FybmluZyhtZXNzYWdlLCBwYXRoKTogdm9pZCB7XG4gIGNvbnN0IG1lc2cgPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2UsIHBhdGgpO1xuICB0aHJvdyBuZXcgRXJyb3IobWVzZyk7XG59XG5cbi8vIFRPRE8gY3JlYXRlIGVycm9yIGNsYXNzZXNcbmV4cG9ydCBjbGFzcyBTY2hlbWFQcmVwcm9jZXNzb3Ige1xuXG4gIHN0YXRpYyBwcmVwcm9jZXNzKGpzb25TY2hlbWE6IGFueSwgcGF0aCA9ICcvJyk6IGFueSB7XG4gICAganNvblNjaGVtYSA9IGpzb25TY2hlbWEgfHwge307XG5cbiAgICBpZiAoanNvblNjaGVtYS50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgU2NoZW1hUHJlcHJvY2Vzc29yLmNoZWNrUHJvcGVydGllcyhqc29uU2NoZW1hLCBwYXRoKTtcbiAgICAgIFNjaGVtYVByZXByb2Nlc3Nvci5jaGVja0FuZENyZWF0ZUZpZWxkc2V0cyhqc29uU2NoZW1hLCBwYXRoKTtcbiAgICB9IGVsc2UgaWYgKGpzb25TY2hlbWEudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgU2NoZW1hUHJlcHJvY2Vzc29yLmNoZWNrSXRlbXMoanNvblNjaGVtYSwgcGF0aCk7XG4gICAgfVxuICAgIFNjaGVtYVByZXByb2Nlc3Nvci5ub3JtYWxpemVXaWRnZXQoanNvblNjaGVtYSk7XG4gICAgU2NoZW1hUHJlcHJvY2Vzc29yLnJlY3Vyc2l2ZUNoZWNrKGpzb25TY2hlbWEsIHBhdGgpO1xuXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjaGVja1Byb3BlcnRpZXMoanNvblNjaGVtYSwgcGF0aDogc3RyaW5nKSB7XG4gICAgaWYgKGlzQmxhbmsoanNvblNjaGVtYS5wcm9wZXJ0aWVzKSkge1xuICAgICAganNvblNjaGVtYS5wcm9wZXJ0aWVzID0ge307XG4gICAgICBzY2hlbWFXYXJuaW5nKCdQcm92aWRlZCBqc29uIHNjaGVtYSBkb2VzIG5vdCBjb250YWluIGEgXFwncHJvcGVydGllc1xcJyBlbnRyeS4gT3V0cHV0IHNjaGVtYSB3aWxsIGJlIGVtcHR5JywgcGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tBbmRDcmVhdGVGaWVsZHNldHMoanNvblNjaGVtYTogYW55LCBwYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoanNvblNjaGVtYS5maWVsZHNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGpzb25TY2hlbWEub3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBTY2hlbWFQcmVwcm9jZXNzb3IucmVwbGFjZU9yZGVyQnlGaWVsZHNldHMoanNvblNjaGVtYSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTY2hlbWFQcmVwcm9jZXNzb3IuY3JlYXRlRmllbGRzZXRzKGpzb25TY2hlbWEpO1xuICAgICAgfVxuICAgIH1cbiAgICBTY2hlbWFQcmVwcm9jZXNzb3IuY2hlY2tGaWVsZHNVc2FnZShqc29uU2NoZW1hLCBwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNoZWNrRmllbGRzVXNhZ2UoanNvblNjaGVtYSwgcGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgZmllbGRzSWQ6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoanNvblNjaGVtYS5wcm9wZXJ0aWVzKTtcbiAgICBjb25zdCB1c2VkRmllbGRzID0ge307XG4gICAgZm9yIChjb25zdCBmaWVsZHNldCBvZiBqc29uU2NoZW1hLmZpZWxkc2V0cykge1xuICAgICAgZm9yIChjb25zdCBmaWVsZElkIG9mIGZpZWxkc2V0LmZpZWxkcykge1xuICAgICAgICBpZiAodXNlZEZpZWxkc1tmaWVsZElkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXNlZEZpZWxkc1tmaWVsZElkXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHVzZWRGaWVsZHNbZmllbGRJZF0ucHVzaChmaWVsZHNldC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWVsZElkIG9mIGZpZWxkc0lkKSB7XG4gICAgICBpZiAodXNlZEZpZWxkcy5oYXNPd25Qcm9wZXJ0eShmaWVsZElkKSkge1xuICAgICAgICBpZiAodXNlZEZpZWxkc1tmaWVsZElkXS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgc2NoZW1hRXJyb3IoYCR7ZmllbGRJZH0gaXMgcmVmZXJlbmNlZCBieSBtb3JlIHRoYW4gb25lIGZpZWxkc2V0OiAke3VzZWRGaWVsZHNbZmllbGRJZF19YCwgcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHVzZWRGaWVsZHNbZmllbGRJZF07XG4gICAgICB9IGVsc2UgaWYgKGpzb25TY2hlbWEucmVxdWlyZWQuaW5kZXhPZihmaWVsZElkKSA+IC0xKSB7XG4gICAgICAgIHNjaGVtYUVycm9yKGAke2ZpZWxkSWR9IGlzIGEgcmVxdWlyZWQgZmllbGQgYnV0IGl0IGlzIG5vdCByZWZlcmVuY2VkIGFzIHBhcnQgb2YgYSAnb3JkZXInIG9yIGEgJ2ZpZWxkc2V0JyBwcm9wZXJ0eWAsIHBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGpzb25TY2hlbWFbZmllbGRJZF07XG4gICAgICAgIHNjaGVtYVdhcm5pbmcoYFJlbW92aW5nIHVucmVmZXJlbmNlZCBmaWVsZCAke2ZpZWxkSWR9YCwgcGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZW1haW5pbmdmaWVsZHNJZCBpbiB1c2VkRmllbGRzKSB7XG4gICAgICBpZiAodXNlZEZpZWxkcy5oYXNPd25Qcm9wZXJ0eShyZW1haW5pbmdmaWVsZHNJZCkpIHtcbiAgICAgICAgc2NoZW1hV2FybmluZyhgUmVmZXJlbmNpbmcgbm9uLWV4aXN0ZW50IGZpZWxkICR7cmVtYWluaW5nZmllbGRzSWR9IGluIG9uZSBvciBtb3JlIGZpZWxkc2V0c2AsIHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUZpZWxkc2V0cyhqc29uU2NoZW1hKSB7XG4gICAganNvblNjaGVtYS5vcmRlciA9IE9iamVjdC5rZXlzKGpzb25TY2hlbWEucHJvcGVydGllcyk7XG4gICAgU2NoZW1hUHJlcHJvY2Vzc29yLnJlcGxhY2VPcmRlckJ5RmllbGRzZXRzKGpzb25TY2hlbWEpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVwbGFjZU9yZGVyQnlGaWVsZHNldHMoanNvblNjaGVtYSkge1xuICAgIGpzb25TY2hlbWEuZmllbGRzZXRzID0gW3tcbiAgICAgIGlkOiAnZmllbGRzZXQtZGVmYXVsdCcsXG4gICAgICB0aXRsZToganNvblNjaGVtYS50aXRsZSB8fCAnJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBqc29uU2NoZW1hLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgbmFtZToganNvblNjaGVtYS5uYW1lIHx8ICcnLFxuICAgICAgZmllbGRzOiBqc29uU2NoZW1hLm9yZGVyXG4gICAgfV07XG4gICAgZGVsZXRlIGpzb25TY2hlbWEub3JkZXI7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBub3JtYWxpemVXaWRnZXQoZmllbGRTY2hlbWE6IGFueSkge1xuICAgIGxldCB3aWRnZXQgPSBmaWVsZFNjaGVtYS53aWRnZXQ7XG4gICAgaWYgKHdpZGdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB3aWRnZXQgPSB7J2lkJzogZmllbGRTY2hlbWEudHlwZX07XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2lkZ2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgd2lkZ2V0ID0geydpZCc6IHdpZGdldH07XG4gICAgfVxuICAgIGZpZWxkU2NoZW1hLndpZGdldCA9IHdpZGdldDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNoZWNrSXRlbXMoanNvblNjaGVtYSwgcGF0aCkge1xuICAgIGlmIChqc29uU2NoZW1hLml0ZW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYUVycm9yKCdObyBcXCdpdGVtc1xcJyBwcm9wZXJ0eSBpbiBhcnJheScsIHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gcmVuYW1lIGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgY29kZSBhY2NvcmRpbmcgdG8gY2hhbmdlXG4gIC8vIFRPRE8gdGVzdCwgdG8gbWFrZSBzdXJlIHJlbW92YWwgb2YgcmVjdXJzaW9uIGNoZWNrcyBkb2VzIG5vdCBicmVhayBhbnl0aGluZ1xuICBwcml2YXRlIHN0YXRpYyByZWN1cnNpdmVDaGVjayhqc29uU2NoZW1hLCBwYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoanNvblNjaGVtYS50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgLypcbiAgICAgIGZvciAoY29uc3QgZmllbGRJZCBpbiBqc29uU2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKGpzb25TY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShmaWVsZElkKSkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0ganNvblNjaGVtYS5wcm9wZXJ0aWVzW2ZpZWxkSWRdO1xuICAgICAgICAgIFNjaGVtYVByZXByb2Nlc3Nvci5wcmVwcm9jZXNzKGZpZWxkU2NoZW1hLCBwYXRoICsgZmllbGRJZCArICcvJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICovXG4gICAgICBpZiAoanNvblNjaGVtYS5oYXNPd25Qcm9wZXJ0eSgnZGVmaW5pdGlvbnMnKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkSWQgaW4ganNvblNjaGVtYS5kZWZpbml0aW9ucykge1xuICAgICAgICAgIGlmIChqc29uU2NoZW1hLmRlZmluaXRpb25zLmhhc093blByb3BlcnR5KGZpZWxkSWQpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IGpzb25TY2hlbWEuZGVmaW5pdGlvbnNbZmllbGRJZF07XG4gICAgICAgICAgICBTY2hlbWFQcmVwcm9jZXNzb3IucmVtb3ZlUmVjdXJzaXZlUmVmUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgZmllbGRTY2hlbWEsXG4gICAgICAgICAgICAgIGAjL2RlZmluaXRpb25zLyR7ZmllbGRJZH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gZm9ybVByb3BlcnR5RmFjdG9yeSByZWN1cnNpdmUgaXMgdXNlZCBpbnN0ZWFkXG4gICAgICAgICAgICAvLyBTY2hlbWFQcmVwcm9jZXNzb3IucHJlcHJvY2VzcyhmaWVsZFNjaGVtYSwgcGF0aCArIGZpZWxkSWQgKyAnLycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0vLyBlbHNlIGlmIChqc29uU2NoZW1hLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgIC8vIGZvcm1Qcm9wZXJ0eUZhY3RvcnkgcmVjdXJzaXZlIGlzIHVzZWQgaW5zdGVhZFxuICAgICAgLy8gU2NoZW1hUHJlcHJvY2Vzc29yLnByZXByb2Nlc3MoanNvblNjaGVtYS5pdGVtcywgcGF0aCArICcqLycpO1xuICAgIC8vIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlbW92ZVJlY3Vyc2l2ZVJlZlByb3BlcnRpZXMoanNvblNjaGVtYSwgZGVmaW5pdGlvblBhdGgpIHtcbiAgICAvLyB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgaWYgKGpzb25TY2hlbWEudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgZmllbGRJZCBpbiBqc29uU2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKGpzb25TY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShmaWVsZElkKSkge1xuICAgICAgICAgIGlmIChqc29uU2NoZW1hLnByb3BlcnRpZXNbZmllbGRJZF0uJHJlZlxuICAgICAgICAgICAgJiYganNvblNjaGVtYS5wcm9wZXJ0aWVzW2ZpZWxkSWRdLiRyZWYgPT09IGRlZmluaXRpb25QYXRoKSB7XG4gICAgICAgICAgICBkZWxldGUganNvblNjaGVtYS5wcm9wZXJ0aWVzW2ZpZWxkSWRdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoanNvblNjaGVtYS5wcm9wZXJ0aWVzW2ZpZWxkSWRdLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBTY2hlbWFQcmVwcm9jZXNzb3IucmVtb3ZlUmVjdXJzaXZlUmVmUHJvcGVydGllcyhcbiAgICAgICAgICAgICAganNvblNjaGVtYS5wcm9wZXJ0aWVzW2ZpZWxkSWRdLFxuICAgICAgICAgICAgICBkZWZpbml0aW9uUGF0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuIl19