UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

491 lines (490 loc) • 52.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { array: function() { return array; }, blocks: function() { return blocks; }, checkbox: function() { return checkbox; }, code: function() { return code; }, date: function() { return date; }, default: function() { return _default; }, email: function() { return email; }, json: function() { return json; }, number: function() { return number; }, password: function() { return password; }, point: function() { return point; }, radio: function() { return radio; }, relationship: function() { return relationship; }, richText: function() { return richText; }, select: function() { return select; }, text: function() { return text; }, textarea: function() { return textarea; }, upload: function() { return upload; } }); const _canUseDOM = /*#__PURE__*/ _interop_require_default(require("../utilities/canUseDOM")); const _getIDType = require("../utilities/getIDType"); const _isNumber = require("../utilities/isNumber"); const _isValidID = require("../utilities/isValidID"); const _types = require("./config/types"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const text = (value, { config, hasMany, maxLength: fieldMaxLength, maxRows, minLength, minRows, required, t })=>{ let maxLength; if (!required) { if (!value) return true; } if (hasMany === true) { const lengthValidationResult = validateArrayLength(value, { maxRows, minRows, required, t }); if (typeof lengthValidationResult === 'string') return lengthValidationResult; } if (typeof config?.defaultMaxTextLength === 'number') maxLength = config.defaultMaxTextLength; if (typeof fieldMaxLength === 'number') maxLength = fieldMaxLength; const stringsToValidate = Array.isArray(value) ? value : [ value ]; for (const stringValue of stringsToValidate){ const length = stringValue?.length || 0; if (typeof maxLength === 'number' && length > maxLength) { return t('validation:shorterThanMax', { label: t('value'), maxLength, stringValue }); } if (typeof minLength === 'number' && length < minLength) { return t('validation:longerThanMin', { label: t('value'), minLength, stringValue }); } } if (required) { if (!(typeof value === 'string' || Array.isArray(value)) || value?.length === 0) { return t('validation:required'); } } return true; }; const password = (value, { config, maxLength: fieldMaxLength, minLength, payload, required, t })=>{ let maxLength; if (typeof config?.defaultMaxTextLength === 'number') maxLength = config.defaultMaxTextLength; if (typeof fieldMaxLength === 'number') maxLength = fieldMaxLength; if (value && maxLength && value.length > maxLength) { return t('validation:shorterThanMax', { maxLength }); } if (value && minLength && value.length < minLength) { return t('validation:longerThanMin', { minLength }); } if (required && !value) { return t('validation:required'); } return true; }; const email = (value, { required, t })=>{ if (value && !/\S[^\s@]*@\S+\.\S+/.test(value) || !value && required) { return t('validation:emailAddress'); } return true; }; const textarea = (value, { config, maxLength: fieldMaxLength, minLength, payload, required, t })=>{ let maxLength; if (typeof config?.defaultMaxTextLength === 'number') maxLength = config.defaultMaxTextLength; if (typeof fieldMaxLength === 'number') maxLength = fieldMaxLength; if (value && maxLength && value.length > maxLength) { return t('validation:shorterThanMax', { maxLength }); } if (value && minLength && value.length < minLength) { return t('validation:longerThanMin', { minLength }); } if (required && !value) { return t('validation:required'); } return true; }; const code = (value, { required, t })=>{ if (required && value === undefined) { return t('validation:required'); } return true; }; const json = (value, { jsonError, required, t })=>{ if (required && !value) { return t('validation:required'); } if (jsonError !== undefined) { return t('validation:invalidInput'); } return true; }; const checkbox = (value, { required, t })=>{ if (value && typeof value !== 'boolean' || required && typeof value !== 'boolean') { return t('validation:trueOrFalse'); } return true; }; const date = (value, { required, t })=>{ if (value && !isNaN(Date.parse(value.toString()))) { /* eslint-disable-line */ return true; } if (value) { return t('validation:notValidDate', { value }); } if (required) { return t('validation:required'); } return true; }; const richText = async (value, options)=>{ const editor = options?.editor; return await editor.validate(value, options); }; const validateArrayLength = (value, options)=>{ const { maxRows, minRows, required, t } = options; const arrayLength = Array.isArray(value) ? value.length : 0; if (!required && arrayLength === 0) return true; if (minRows && arrayLength < minRows) { return t('validation:requiresAtLeast', { count: minRows, label: t('rows') }); } if (maxRows && arrayLength > maxRows) { return t('validation:requiresNoMoreThan', { count: maxRows, label: t('rows') }); } if (required && !arrayLength) { return t('validation:requiresAtLeast', { count: 1, label: t('row') }); } return true; }; const number = (value, { hasMany, max, maxRows, min, minRows, required, t })=>{ if (hasMany === true) { const lengthValidationResult = validateArrayLength(value, { maxRows, minRows, required, t }); if (typeof lengthValidationResult === 'string') return lengthValidationResult; } if (!value && !(0, _isNumber.isNumber)(value)) { // if no value is present, validate based on required if (required) return t('validation:required'); if (!required) return true; } const numbersToValidate = Array.isArray(value) ? value : [ value ]; for (const number of numbersToValidate){ if (!(0, _isNumber.isNumber)(number)) return t('validation:enterNumber'); const numberValue = parseFloat(number); if (typeof max === 'number' && numberValue > max) { return t('validation:greaterThanMax', { label: t('value'), max, value }); } if (typeof min === 'number' && numberValue < min) { return t('validation:lessThanMin', { label: t('value'), min, value }); } } return true; }; const array = (value, { maxRows, minRows, required, t })=>{ return validateArrayLength(value, { maxRows, minRows, required, t }); }; const blocks = (value, { maxRows, minRows, required, t })=>{ return validateArrayLength(value, { maxRows, minRows, required, t }); }; const validateFilterOptions = async (value, { id, data, filterOptions, payload, relationTo, req, siblingData, t, user })=>{ if (!_canUseDOM.default && typeof filterOptions !== 'undefined' && value) { const options = {}; const falseCollections = []; const collections = typeof relationTo === 'string' ? [ relationTo ] : relationTo; const values = Array.isArray(value) ? value : [ value ]; await Promise.all(collections.map(async (collection)=>{ try { let optionFilter = typeof filterOptions === 'function' ? await filterOptions({ id, data, relationTo: collection, siblingData, user }) : filterOptions; if (optionFilter === true) { optionFilter = null; } const valueIDs = []; values.forEach((val)=>{ if (typeof val === 'object' && val?.value) { valueIDs.push(val.value); } if (typeof val === 'string' || typeof val === 'number') { valueIDs.push(val); } }); if (valueIDs.length > 0) { const findWhere = { and: [ { id: { in: valueIDs } } ] }; if (optionFilter) findWhere.and.push(optionFilter); if (optionFilter === false) { falseCollections.push(optionFilter); } // `req` omitted to prevent transaction errors from aborting the entire transaction const result = await payload.find({ collection, depth: 0, limit: 0, pagination: false, where: findWhere }); options[collection] = result.docs.map((doc)=>doc.id); } else { options[collection] = []; } } catch (err) { req.payload.logger.error({ err, msg: `Error validating filter options for collection ${collection}` }); options[collection] = []; } })); const invalidRelationships = values.filter((val)=>{ let collection; let requestedID; if (typeof relationTo === 'string') { collection = relationTo; if (typeof val === 'string' || typeof val === 'number') { requestedID = val; } } if (Array.isArray(relationTo) && typeof val === 'object' && val?.relationTo) { collection = val.relationTo; requestedID = val.value; } if (falseCollections.find((slug)=>relationTo === slug)) { return true; } return options[collection].indexOf(requestedID) === -1; }); if (invalidRelationships.length > 0) { return invalidRelationships.reduce((err, invalid, i)=>{ return `${err} ${JSON.stringify(invalid)}${invalidRelationships.length === i + 1 ? ',' : ''} `; }, t('validation:invalidSelections')); } return true; } return true; }; const upload = (value, options)=>{ if (!value && options.required) { return options.t('validation:required'); } if (!_canUseDOM.default && typeof value !== 'undefined' && value !== null) { const idField = options?.config?.collections?.find((collection)=>collection.slug === options.relationTo)?.fields?.find((field)=>(0, _types.fieldAffectsData)(field) && field.name === 'id'); const type = (0, _getIDType.getIDType)(idField, options?.payload?.db?.defaultIDType); if (!(0, _isValidID.isValidID)(value, type)) { return options.t('validation:validUploadID'); } } return validateFilterOptions(value, options); }; const relationship = async (value, options)=>{ const { config, maxRows, minRows, payload, relationTo, required, t } = options; if ((!value || Array.isArray(value) && value.length === 0) && required) { return t('validation:required'); } if (Array.isArray(value) && value.length > 0) { if (minRows && value.length < minRows) { return t('validation:lessThanMin', { label: t('rows'), min: minRows, value: value.length }); } if (maxRows && value.length > maxRows) { return t('validation:greaterThanMax', { label: t('rows'), max: maxRows, value: value.length }); } } if (!_canUseDOM.default && typeof value !== 'undefined' && value !== null) { const values = Array.isArray(value) ? value : [ value ]; const invalidRelationships = values.filter((val)=>{ let collectionSlug; let requestedID; if (typeof relationTo === 'string') { collectionSlug = relationTo; // custom id if (val) { requestedID = val; } } if (Array.isArray(relationTo) && typeof val === 'object' && val?.relationTo) { collectionSlug = val.relationTo; requestedID = val.value; } if (requestedID === null) return false; const idField = config?.collections?.find((collection)=>collection.slug === collectionSlug)?.fields?.find((field)=>(0, _types.fieldAffectsData)(field) && field.name === 'id'); const type = (0, _getIDType.getIDType)(idField, payload?.db?.defaultIDType); return !(0, _isValidID.isValidID)(requestedID, type); }); if (invalidRelationships.length > 0) { return `This relationship field has the following invalid relationships: ${invalidRelationships.map((err, invalid)=>{ return `${err} ${JSON.stringify(invalid)}`; }).join(', ')}`; } } return validateFilterOptions(value, options); }; const select = (value, { hasMany, options, required, t })=>{ if (Array.isArray(value) && value.some((input)=>!options.some((option)=>option === input || typeof option !== 'string' && option?.value === input))) { return t('validation:invalidSelection'); } if (typeof value === 'string' && !options.some((option)=>option === value || typeof option !== 'string' && option.value === value)) { return t('validation:invalidSelection'); } if (required && (typeof value === 'undefined' || value === null || hasMany && Array.isArray(value) && value?.length === 0)) { return t('validation:required'); } return true; }; const radio = (value, { options, required, t })=>{ if (value) { const valueMatchesOption = options.some((option)=>option === value || typeof option !== 'string' && option.value === value); return valueMatchesOption || t('validation:invalidSelection'); } return required ? t('validation:required') : true; }; const point = (value = [ '', '' ], { required, t })=>{ const lng = parseFloat(String(value[0])); const lat = parseFloat(String(value[1])); if (required && (value[0] && value[1] && typeof lng !== 'number' && typeof lat !== 'number' || Number.isNaN(lng) || Number.isNaN(lat) || Array.isArray(value) && value.length !== 2)) { return t('validation:requiresTwoNumbers'); } if (value[1] && Number.isNaN(lng) || value[0] && Number.isNaN(lat)) { return t('validation:invalidInput'); } return true; }; const _default = { array, blocks, checkbox, code, date, email, json, number, password, point, radio, relationship, richText, select, text, textarea, upload }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maWVsZHMvdmFsaWRhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSaWNoVGV4dEFkYXB0ZXIgfSBmcm9tICcuLi9leHBvcnRzL3R5cGVzJ1xuaW1wb3J0IHR5cGUge1xuICBBcnJheUZpZWxkLFxuICBCbG9ja0ZpZWxkLFxuICBDaGVja2JveEZpZWxkLFxuICBDb2RlRmllbGQsXG4gIERhdGVGaWVsZCxcbiAgRW1haWxGaWVsZCxcbiAgSlNPTkZpZWxkLFxuICBOdW1iZXJGaWVsZCxcbiAgUG9pbnRGaWVsZCxcbiAgUmFkaW9GaWVsZCxcbiAgUmVsYXRpb25zaGlwRmllbGQsXG4gIFJlbGF0aW9uc2hpcFZhbHVlLFxuICBSaWNoVGV4dEZpZWxkLFxuICBTZWxlY3RGaWVsZCxcbiAgVGV4dEZpZWxkLFxuICBUZXh0YXJlYUZpZWxkLFxuICBVcGxvYWRGaWVsZCxcbiAgVmFsaWRhdGUsXG59IGZyb20gJy4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgY2FuVXNlRE9NIGZyb20gJy4uL3V0aWxpdGllcy9jYW5Vc2VET00nXG5pbXBvcnQgeyBnZXRJRFR5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvZ2V0SURUeXBlJ1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNOdW1iZXInXG5pbXBvcnQgeyBpc1ZhbGlkSUQgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNWYWxpZElEJ1xuaW1wb3J0IHsgZmllbGRBZmZlY3RzRGF0YSB9IGZyb20gJy4vY29uZmlnL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgdGV4dDogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgVGV4dEZpZWxkPiA9IChcbiAgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLFxuICB7IGNvbmZpZywgaGFzTWFueSwgbWF4TGVuZ3RoOiBmaWVsZE1heExlbmd0aCwgbWF4Um93cywgbWluTGVuZ3RoLCBtaW5Sb3dzLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGxldCBtYXhMZW5ndGg6IG51bWJlclxuXG4gIGlmICghcmVxdWlyZWQpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGhhc01hbnkgPT09IHRydWUpIHtcbiAgICBjb25zdCBsZW5ndGhWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVBcnJheUxlbmd0aCh2YWx1ZSwgeyBtYXhSb3dzLCBtaW5Sb3dzLCByZXF1aXJlZCwgdCB9KVxuICAgIGlmICh0eXBlb2YgbGVuZ3RoVmFsaWRhdGlvblJlc3VsdCA9PT0gJ3N0cmluZycpIHJldHVybiBsZW5ndGhWYWxpZGF0aW9uUmVzdWx0XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbmZpZz8uZGVmYXVsdE1heFRleHRMZW5ndGggPT09ICdudW1iZXInKSBtYXhMZW5ndGggPSBjb25maWcuZGVmYXVsdE1heFRleHRMZW5ndGhcbiAgaWYgKHR5cGVvZiBmaWVsZE1heExlbmd0aCA9PT0gJ251bWJlcicpIG1heExlbmd0aCA9IGZpZWxkTWF4TGVuZ3RoXG5cbiAgY29uc3Qgc3RyaW5nc1RvVmFsaWRhdGU6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV1cblxuICBmb3IgKGNvbnN0IHN0cmluZ1ZhbHVlIG9mIHN0cmluZ3NUb1ZhbGlkYXRlKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gc3RyaW5nVmFsdWU/Lmxlbmd0aCB8fCAwXG5cbiAgICBpZiAodHlwZW9mIG1heExlbmd0aCA9PT0gJ251bWJlcicgJiYgbGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpzaG9ydGVyVGhhbk1heCcsIHsgbGFiZWw6IHQoJ3ZhbHVlJyksIG1heExlbmd0aCwgc3RyaW5nVmFsdWUgfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1pbkxlbmd0aCA9PT0gJ251bWJlcicgJiYgbGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpsb25nZXJUaGFuTWluJywgeyBsYWJlbDogdCgndmFsdWUnKSwgbWluTGVuZ3RoLCBzdHJpbmdWYWx1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXF1aXJlZCkge1xuICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHx8IHZhbHVlPy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgcGFzc3dvcmQ6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFRleHRGaWVsZD4gPSAoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHsgY29uZmlnLCBtYXhMZW5ndGg6IGZpZWxkTWF4TGVuZ3RoLCBtaW5MZW5ndGgsIHBheWxvYWQsIHJlcXVpcmVkLCB0IH0sXG4pID0+IHtcbiAgbGV0IG1heExlbmd0aDogbnVtYmVyXG5cbiAgaWYgKHR5cGVvZiBjb25maWc/LmRlZmF1bHRNYXhUZXh0TGVuZ3RoID09PSAnbnVtYmVyJykgbWF4TGVuZ3RoID0gY29uZmlnLmRlZmF1bHRNYXhUZXh0TGVuZ3RoXG4gIGlmICh0eXBlb2YgZmllbGRNYXhMZW5ndGggPT09ICdudW1iZXInKSBtYXhMZW5ndGggPSBmaWVsZE1heExlbmd0aFxuXG4gIGlmICh2YWx1ZSAmJiBtYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246c2hvcnRlclRoYW5NYXgnLCB7IG1heExlbmd0aCB9KVxuICB9XG5cbiAgaWYgKHZhbHVlICYmIG1pbkxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpsb25nZXJUaGFuTWluJywgeyBtaW5MZW5ndGggfSlcbiAgfVxuXG4gIGlmIChyZXF1aXJlZCAmJiAhdmFsdWUpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgZW1haWw6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIEVtYWlsRmllbGQ+ID0gKHZhbHVlOiBzdHJpbmcsIHsgcmVxdWlyZWQsIHQgfSkgPT4ge1xuICBpZiAoKHZhbHVlICYmICEvXFxTW15cXHNAXSpAXFxTK1xcLlxcUysvLnRlc3QodmFsdWUpKSB8fCAoIXZhbHVlICYmIHJlcXVpcmVkKSkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmVtYWlsQWRkcmVzcycpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgdGV4dGFyZWE6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFRleHRhcmVhRmllbGQ+ID0gKFxuICB2YWx1ZTogc3RyaW5nLFxuICB7IGNvbmZpZywgbWF4TGVuZ3RoOiBmaWVsZE1heExlbmd0aCwgbWluTGVuZ3RoLCBwYXlsb2FkLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGxldCBtYXhMZW5ndGg6IG51bWJlclxuXG4gIGlmICh0eXBlb2YgY29uZmlnPy5kZWZhdWx0TWF4VGV4dExlbmd0aCA9PT0gJ251bWJlcicpIG1heExlbmd0aCA9IGNvbmZpZy5kZWZhdWx0TWF4VGV4dExlbmd0aFxuICBpZiAodHlwZW9mIGZpZWxkTWF4TGVuZ3RoID09PSAnbnVtYmVyJykgbWF4TGVuZ3RoID0gZmllbGRNYXhMZW5ndGhcbiAgaWYgKHZhbHVlICYmIG1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpzaG9ydGVyVGhhbk1heCcsIHsgbWF4TGVuZ3RoIH0pXG4gIH1cblxuICBpZiAodmFsdWUgJiYgbWluTGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA8IG1pbkxlbmd0aCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmxvbmdlclRoYW5NaW4nLCB7IG1pbkxlbmd0aCB9KVxuICB9XG5cbiAgaWYgKHJlcXVpcmVkICYmICF2YWx1ZSkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBjb2RlOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBDb2RlRmllbGQ+ID0gKHZhbHVlOiBzdHJpbmcsIHsgcmVxdWlyZWQsIHQgfSkgPT4ge1xuICBpZiAocmVxdWlyZWQgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBqc29uOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBKU09ORmllbGQgJiB7IGpzb25FcnJvcj86IHN0cmluZyB9PiA9IChcbiAgdmFsdWU6IHN0cmluZyxcbiAgeyBqc29uRXJyb3IsIHJlcXVpcmVkLCB0IH0sXG4pID0+IHtcbiAgaWYgKHJlcXVpcmVkICYmICF2YWx1ZSkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgfVxuXG4gIGlmIChqc29uRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmludmFsaWRJbnB1dCcpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgY2hlY2tib3g6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIENoZWNrYm94RmllbGQ+ID0gKFxuICB2YWx1ZTogYm9vbGVhbixcbiAgeyByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGlmICgodmFsdWUgJiYgdHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHx8IChyZXF1aXJlZCAmJiB0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjp0cnVlT3JGYWxzZScpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgZGF0ZTogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgRGF0ZUZpZWxkPiA9ICh2YWx1ZSwgeyByZXF1aXJlZCwgdCB9KSA9PiB7XG4gIGlmICh2YWx1ZSAmJiAhaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZS50b1N0cmluZygpKSkpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1saW5lICovXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICh2YWx1ZSkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOm5vdFZhbGlkRGF0ZScsIHsgdmFsdWUgfSlcbiAgfVxuXG4gIGlmIChyZXF1aXJlZCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCByaWNoVGV4dDogVmFsaWRhdGU8b2JqZWN0LCB1bmtub3duLCBSaWNoVGV4dEZpZWxkLCBSaWNoVGV4dEZpZWxkPiA9IGFzeW5jIChcbiAgdmFsdWUsXG4gIG9wdGlvbnMsXG4pID0+IHtcbiAgY29uc3QgZWRpdG9yOiBSaWNoVGV4dEFkYXB0ZXIgPSBvcHRpb25zPy5lZGl0b3JcblxuICByZXR1cm4gYXdhaXQgZWRpdG9yLnZhbGlkYXRlKHZhbHVlLCBvcHRpb25zKVxufVxuXG5jb25zdCB2YWxpZGF0ZUFycmF5TGVuZ3RoOiBhbnkgPSAoXG4gIHZhbHVlLFxuICBvcHRpb25zOiB7XG4gICAgbWF4Um93cz86IG51bWJlclxuICAgIG1pblJvd3M/OiBudW1iZXJcbiAgICByZXF1aXJlZD86IGJvb2xlYW5cbiAgICB0OiAoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB8IHN0cmluZyB9KSA9PiBzdHJpbmdcbiAgfSxcbikgPT4ge1xuICBjb25zdCB7IG1heFJvd3MsIG1pblJvd3MsIHJlcXVpcmVkLCB0IH0gPSBvcHRpb25zXG5cbiAgY29uc3QgYXJyYXlMZW5ndGggPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA6IDBcblxuICBpZiAoIXJlcXVpcmVkICYmIGFycmF5TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZVxuXG4gIGlmIChtaW5Sb3dzICYmIGFycmF5TGVuZ3RoIDwgbWluUm93cykge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVzQXRMZWFzdCcsIHsgY291bnQ6IG1pblJvd3MsIGxhYmVsOiB0KCdyb3dzJykgfSlcbiAgfVxuXG4gIGlmIChtYXhSb3dzICYmIGFycmF5TGVuZ3RoID4gbWF4Um93cykge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVzTm9Nb3JlVGhhbicsIHsgY291bnQ6IG1heFJvd3MsIGxhYmVsOiB0KCdyb3dzJykgfSlcbiAgfVxuXG4gIGlmIChyZXF1aXJlZCAmJiAhYXJyYXlMZW5ndGgpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlc0F0TGVhc3QnLCB7IGNvdW50OiAxLCBsYWJlbDogdCgncm93JykgfSlcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBudW1iZXI6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIE51bWJlckZpZWxkPiA9IChcbiAgdmFsdWU6IG51bWJlciB8IG51bWJlcltdLFxuICB7IGhhc01hbnksIG1heCwgbWF4Um93cywgbWluLCBtaW5Sb3dzLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGlmIChoYXNNYW55ID09PSB0cnVlKSB7XG4gICAgY29uc3QgbGVuZ3RoVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlQXJyYXlMZW5ndGgodmFsdWUsIHsgbWF4Um93cywgbWluUm93cywgcmVxdWlyZWQsIHQgfSlcbiAgICBpZiAodHlwZW9mIGxlbmd0aFZhbGlkYXRpb25SZXN1bHQgPT09ICdzdHJpbmcnKSByZXR1cm4gbGVuZ3RoVmFsaWRhdGlvblJlc3VsdFxuICB9XG5cbiAgaWYgKCF2YWx1ZSAmJiAhaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgLy8gaWYgbm8gdmFsdWUgaXMgcHJlc2VudCwgdmFsaWRhdGUgYmFzZWQgb24gcmVxdWlyZWRcbiAgICBpZiAocmVxdWlyZWQpIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgICBpZiAoIXJlcXVpcmVkKSByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgbnVtYmVyc1RvVmFsaWRhdGU6IG51bWJlcltdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV1cblxuICBmb3IgKGNvbnN0IG51bWJlciBvZiBudW1iZXJzVG9WYWxpZGF0ZSkge1xuICAgIGlmICghaXNOdW1iZXIobnVtYmVyKSkgcmV0dXJuIHQoJ3ZhbGlkYXRpb246ZW50ZXJOdW1iZXInKVxuXG4gICAgY29uc3QgbnVtYmVyVmFsdWUgPSBwYXJzZUZsb2F0KG51bWJlciBhcyB1bmtub3duIGFzIHN0cmluZylcblxuICAgIGlmICh0eXBlb2YgbWF4ID09PSAnbnVtYmVyJyAmJiBudW1iZXJWYWx1ZSA+IG1heCkge1xuICAgICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246Z3JlYXRlclRoYW5NYXgnLCB7IGxhYmVsOiB0KCd2YWx1ZScpLCBtYXgsIHZhbHVlIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09ICdudW1iZXInICYmIG51bWJlclZhbHVlIDwgbWluKSB7XG4gICAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpsZXNzVGhhbk1pbicsIHsgbGFiZWw6IHQoJ3ZhbHVlJyksIG1pbiwgdmFsdWUgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgYXJyYXk6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIEFycmF5RmllbGQ+ID0gKFxuICB2YWx1ZSxcbiAgeyBtYXhSb3dzLCBtaW5Sb3dzLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIHJldHVybiB2YWxpZGF0ZUFycmF5TGVuZ3RoKHZhbHVlLCB7IG1heFJvd3MsIG1pblJvd3MsIHJlcXVpcmVkLCB0IH0pXG59XG5cbmV4cG9ydCBjb25zdCBibG9ja3M6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIEJsb2NrRmllbGQ+ID0gKFxuICB2YWx1ZSxcbiAgeyBtYXhSb3dzLCBtaW5Sb3dzLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIHJldHVybiB2YWxpZGF0ZUFycmF5TGVuZ3RoKHZhbHVlLCB7IG1heFJvd3MsIG1pblJvd3MsIHJlcXVpcmVkLCB0IH0pXG59XG5cbmNvbnN0IHZhbGlkYXRlRmlsdGVyT3B0aW9uczogVmFsaWRhdGUgPSBhc3luYyAoXG4gIHZhbHVlLFxuICB7IGlkLCBkYXRhLCBmaWx0ZXJPcHRpb25zLCBwYXlsb2FkLCByZWxhdGlvblRvLCByZXEsIHNpYmxpbmdEYXRhLCB0LCB1c2VyIH0sXG4pID0+IHtcbiAgaWYgKCFjYW5Vc2VET00gJiYgdHlwZW9mIGZpbHRlck9wdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlKSB7XG4gICAgY29uc3Qgb3B0aW9uczoge1xuICAgICAgW2NvbGxlY3Rpb246IHN0cmluZ106IChudW1iZXIgfCBzdHJpbmcpW11cbiAgICB9ID0ge31cblxuICAgIGNvbnN0IGZhbHNlQ29sbGVjdGlvbnM6IHN0cmluZ1tdID0gW11cbiAgICBjb25zdCBjb2xsZWN0aW9ucyA9IHR5cGVvZiByZWxhdGlvblRvID09PSAnc3RyaW5nJyA/IFtyZWxhdGlvblRvXSA6IHJlbGF0aW9uVG9cbiAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb2xsZWN0aW9ucy5tYXAoYXN5bmMgKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgb3B0aW9uRmlsdGVyID1cbiAgICAgICAgICAgIHR5cGVvZiBmaWx0ZXJPcHRpb25zID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgID8gYXdhaXQgZmlsdGVyT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICByZWxhdGlvblRvOiBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgc2libGluZ0RhdGEsXG4gICAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogZmlsdGVyT3B0aW9uc1xuXG4gICAgICAgICAgaWYgKG9wdGlvbkZpbHRlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgb3B0aW9uRmlsdGVyID0gbnVsbFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlSURzOiAobnVtYmVyIHwgc3RyaW5nKVtdID0gW11cblxuICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWw/LnZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhbHVlSURzLnB1c2godmFsLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgdmFsdWVJRHMucHVzaCh2YWwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICh2YWx1ZUlEcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5kV2hlcmUgPSB7XG4gICAgICAgICAgICAgIGFuZDogW3sgaWQ6IHsgaW46IHZhbHVlSURzIH0gfV0sXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25GaWx0ZXIpIGZpbmRXaGVyZS5hbmQucHVzaChvcHRpb25GaWx0ZXIpXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25GaWx0ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGZhbHNlQ29sbGVjdGlvbnMucHVzaChvcHRpb25GaWx0ZXIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGByZXFgIG9taXR0ZWQgdG8gcHJldmVudCB0cmFuc2FjdGlvbiBlcnJvcnMgZnJvbSBhYm9ydGluZyB0aGUgZW50aXJlIHRyYW5zYWN0aW9uXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXlsb2FkLmZpbmQoe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgbGltaXQ6IDAsXG4gICAgICAgICAgICAgIHBhZ2luYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICB3aGVyZTogZmluZFdoZXJlLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgb3B0aW9uc1tjb2xsZWN0aW9uXSA9IHJlc3VsdC5kb2NzLm1hcCgoZG9jKSA9PiBkb2MuaWQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnNbY29sbGVjdGlvbl0gPSBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVxLnBheWxvYWQubG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIG1zZzogYEVycm9yIHZhbGlkYXRpbmcgZmlsdGVyIG9wdGlvbnMgZm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufWAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBvcHRpb25zW2NvbGxlY3Rpb25dID0gW11cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgaW52YWxpZFJlbGF0aW9uc2hpcHMgPSB2YWx1ZXMuZmlsdGVyKCh2YWwpID0+IHtcbiAgICAgIGxldCBjb2xsZWN0aW9uOiBzdHJpbmdcbiAgICAgIGxldCByZXF1ZXN0ZWRJRDogbnVtYmVyIHwgc3RyaW5nXG5cbiAgICAgIGlmICh0eXBlb2YgcmVsYXRpb25UbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sbGVjdGlvbiA9IHJlbGF0aW9uVG9cblxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXF1ZXN0ZWRJRCA9IHZhbFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlbGF0aW9uVG8pICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbD8ucmVsYXRpb25Ubykge1xuICAgICAgICBjb2xsZWN0aW9uID0gdmFsLnJlbGF0aW9uVG9cbiAgICAgICAgcmVxdWVzdGVkSUQgPSB2YWwudmFsdWVcbiAgICAgIH1cblxuICAgICAgaWYgKGZhbHNlQ29sbGVjdGlvbnMuZmluZCgoc2x1ZykgPT4gcmVsYXRpb25UbyA9PT0gc2x1ZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wdGlvbnNbY29sbGVjdGlvbl0uaW5kZXhPZihyZXF1ZXN0ZWRJRCkgPT09IC0xXG4gICAgfSlcblxuICAgIGlmIChpbnZhbGlkUmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gaW52YWxpZFJlbGF0aW9uc2hpcHMucmVkdWNlKChlcnIsIGludmFsaWQsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIGAke2Vycn0gJHtKU09OLnN0cmluZ2lmeShpbnZhbGlkKX0ke1xuICAgICAgICAgIGludmFsaWRSZWxhdGlvbnNoaXBzLmxlbmd0aCA9PT0gaSArIDEgPyAnLCcgOiAnJ1xuICAgICAgICB9IGBcbiAgICAgIH0sIHQoJ3ZhbGlkYXRpb246aW52YWxpZFNlbGVjdGlvbnMnKSkgYXMgc3RyaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCB1cGxvYWQ6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFVwbG9hZEZpZWxkPiA9ICh2YWx1ZTogc3RyaW5nLCBvcHRpb25zKSA9PiB7XG4gIGlmICghdmFsdWUgJiYgb3B0aW9ucy5yZXF1aXJlZCkge1xuICAgIHJldHVybiBvcHRpb25zLnQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKCFjYW5Vc2VET00gJiYgdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGlkRmllbGQgPSBvcHRpb25zPy5jb25maWc/LmNvbGxlY3Rpb25zXG4gICAgICA/LmZpbmQoKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uc2x1ZyA9PT0gb3B0aW9ucy5yZWxhdGlvblRvKVxuICAgICAgPy5maWVsZHM/LmZpbmQoKGZpZWxkKSA9PiBmaWVsZEFmZmVjdHNEYXRhKGZpZWxkKSAmJiBmaWVsZC5uYW1lID09PSAnaWQnKVxuXG4gICAgY29uc3QgdHlwZSA9IGdldElEVHlwZShpZEZpZWxkLCBvcHRpb25zPy5wYXlsb2FkPy5kYj8uZGVmYXVsdElEVHlwZSlcblxuICAgIGlmICghaXNWYWxpZElEKHZhbHVlLCB0eXBlKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMudCgndmFsaWRhdGlvbjp2YWxpZFVwbG9hZElEJylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVGaWx0ZXJPcHRpb25zKHZhbHVlLCBvcHRpb25zKVxufVxuXG5leHBvcnQgY29uc3QgcmVsYXRpb25zaGlwOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBSZWxhdGlvbnNoaXBGaWVsZD4gPSBhc3luYyAoXG4gIHZhbHVlOiBSZWxhdGlvbnNoaXBWYWx1ZSxcbiAgb3B0aW9ucyxcbikgPT4ge1xuICBjb25zdCB7IGNvbmZpZywgbWF4Um93cywgbWluUm93cywgcGF5bG9hZCwgcmVsYXRpb25UbywgcmVxdWlyZWQsIHQgfSA9IG9wdGlvbnNcblxuICBpZiAoKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSkgJiYgcmVxdWlyZWQpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgIGlmIChtaW5Sb3dzICYmIHZhbHVlLmxlbmd0aCA8IG1pblJvd3MpIHtcbiAgICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmxlc3NUaGFuTWluJywgeyBsYWJlbDogdCgncm93cycpLCBtaW46IG1pblJvd3MsIHZhbHVlOiB2YWx1ZS5sZW5ndGggfSlcbiAgICB9XG5cbiAgICBpZiAobWF4Um93cyAmJiB2YWx1ZS5sZW5ndGggPiBtYXhSb3dzKSB7XG4gICAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpncmVhdGVyVGhhbk1heCcsIHsgbGFiZWw6IHQoJ3Jvd3MnKSwgbWF4OiBtYXhSb3dzLCB2YWx1ZTogdmFsdWUubGVuZ3RoIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKCFjYW5Vc2VET00gJiYgdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdXG5cbiAgICBjb25zdCBpbnZhbGlkUmVsYXRpb25zaGlwcyA9IHZhbHVlcy5maWx0ZXIoKHZhbCkgPT4ge1xuICAgICAgbGV0IGNvbGxlY3Rpb25TbHVnOiBzdHJpbmdcbiAgICAgIGxldCByZXF1ZXN0ZWRJRFxuXG4gICAgICBpZiAodHlwZW9mIHJlbGF0aW9uVG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbGxlY3Rpb25TbHVnID0gcmVsYXRpb25Ub1xuXG4gICAgICAgIC8vIGN1c3RvbSBpZFxuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgcmVxdWVzdGVkSUQgPSB2YWxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvblRvKSAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWw/LnJlbGF0aW9uVG8pIHtcbiAgICAgICAgY29sbGVjdGlvblNsdWcgPSB2YWwucmVsYXRpb25Ub1xuICAgICAgICByZXF1ZXN0ZWRJRCA9IHZhbC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWVzdGVkSUQgPT09IG51bGwpIHJldHVybiBmYWxzZVxuXG4gICAgICBjb25zdCBpZEZpZWxkID0gY29uZmlnPy5jb2xsZWN0aW9uc1xuICAgICAgICA/LmZpbmQoKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uc2x1ZyA9PT0gY29sbGVjdGlvblNsdWcpXG4gICAgICAgID8uZmllbGRzPy5maW5kKChmaWVsZCkgPT4gZmllbGRBZmZlY3RzRGF0YShmaWVsZCkgJiYgZmllbGQubmFtZSA9PT0gJ2lkJylcblxuICAgICAgY29uc3QgdHlwZSA9IGdldElEVHlwZShpZEZpZWxkLCBwYXlsb2FkPy5kYj8uZGVmYXVsdElEVHlwZSlcblxuICAgICAgcmV0dXJuICFpc1ZhbGlkSUQocmVxdWVzdGVkSUQsIHR5cGUpXG4gICAgfSlcblxuICAgIGlmIChpbnZhbGlkUmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYFRoaXMgcmVsYXRpb25zaGlwIGZpZWxkIGhhcyB0aGUgZm9sbG93aW5nIGludmFsaWQgcmVsYXRpb25zaGlwczogJHtpbnZhbGlkUmVsYXRpb25zaGlwc1xuICAgICAgICAubWFwKChlcnIsIGludmFsaWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYCR7ZXJyfSAke0pTT04uc3RyaW5naWZ5KGludmFsaWQpfWBcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJywgJyl9YFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZUZpbHRlck9wdGlvbnModmFsdWUsIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3Q6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFNlbGVjdEZpZWxkPiA9IChcbiAgdmFsdWUsXG4gIHsgaGFzTWFueSwgb3B0aW9ucywgcmVxdWlyZWQsIHQgfSxcbikgPT4ge1xuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICB2YWx1ZS5zb21lKFxuICAgICAgKGlucHV0KSA9PlxuICAgICAgICAhb3B0aW9ucy5zb21lKFxuICAgICAgICAgIChvcHRpb24pID0+IG9wdGlvbiA9PT0gaW5wdXQgfHwgKHR5cGVvZiBvcHRpb24gIT09ICdzdHJpbmcnICYmIG9wdGlvbj8udmFsdWUgPT09IGlucHV0KSxcbiAgICAgICAgKSxcbiAgICApXG4gICkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmludmFsaWRTZWxlY3Rpb24nKVxuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAhb3B0aW9ucy5zb21lKFxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uID09PSB2YWx1ZSB8fCAodHlwZW9mIG9wdGlvbiAhPT0gJ3N0cmluZycgJiYgb3B0aW9uLnZhbHVlID09PSB2YWx1ZSksXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjppbnZhbGlkU2VsZWN0aW9uJylcbiAgfVxuXG4gIGlmIChcbiAgICByZXF1aXJlZCAmJlxuICAgICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgKGhhc01hbnkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgKHZhbHVlIGFzIFtdKT8ubGVuZ3RoID09PSAwKSlcbiAgKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IHJhZGlvOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBSYWRpb0ZpZWxkPiA9ICh2YWx1ZSwgeyBvcHRpb25zLCByZXF1aXJlZCwgdCB9KSA9PiB7XG4gIGlmICh2YWx1ZSkge1xuICAgIGNvbnN0IHZhbHVlTWF0Y2hlc09wdGlvbiA9IG9wdGlvbnMuc29tZShcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbiA9PT0gdmFsdWUgfHwgKHR5cGVvZiBvcHRpb24gIT09ICdzdHJpbmcnICYmIG9wdGlvbi52YWx1ZSA9PT0gdmFsdWUpLFxuICAgIClcbiAgICByZXR1cm4gdmFsdWVNYXRjaGVzT3B0aW9uIHx8IHQoJ3ZhbGlkYXRpb246aW52YWxpZFNlbGVjdGlvbicpXG4gIH1cblxuICByZXR1cm4gcmVxdWlyZWQgPyB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJykgOiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBwb2ludDogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgUG9pbnRGaWVsZD4gPSAoXG4gIHZhbHVlOiBbbnVtYmVyIHwgc3RyaW5nLCBudW1iZXIgfCBzdHJpbmddID0gWycnLCAnJ10sXG4gIHsgcmVxdWlyZWQsIHQgfSxcbikgPT4ge1xuICBjb25zdCBsbmcgPSBwYXJzZUZsb2F0KFN0cmluZyh2YWx1ZVswXSkpXG4gIGNvbnN0IGxhdCA9IHBhcnNlRmxvYXQoU3RyaW5nKHZhbHVlWzFdKSlcbiAgaWYgKFxuICAgIHJlcXVpcmVkICYmXG4gICAgKCh2YWx1ZVswXSAmJiB2YWx1ZVsxXSAmJiB0eXBlb2YgbG5nICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGF0ICE9PSAnbnVtYmVyJykgfHxcbiAgICAgIE51bWJlci5pc05hTihsbmcpIHx8XG4gICAgICBOdW1iZXIuaXNOYU4obGF0KSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCAhPT0gMikpXG4gICkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVzVHdvTnVtYmVycycpXG4gIH1cblxuICBpZiAoKHZhbHVlWzFdICYmIE51bWJlci5pc05hTihsbmcpKSB8fCAodmFsdWVbMF0gJiYgTnVtYmVyLmlzTmFOKGxhdCkpKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246aW52YWxpZElucHV0JylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYXJyYXksXG4gIGJsb2NrcyxcbiAgY2hlY2tib3gsXG4gIGNvZGUsXG4gIGRhdGUsXG4gIGVtYWlsLFxuICBqc29uLFxuICBudW1iZXIsXG4gIHBhc3N3b3JkLFxuICBwb2ludCxcbiAgcmFkaW8sXG4gIHJlbGF0aW9uc2hpcCxcbiAgcmljaFRleHQsXG4gIHNlbGVjdCxcbiAgdGV4dCxcbiAgdGV4dGFyZWEsXG4gIHVwbG9hZCxcbn1cbiJdLCJuYW1lcyI6WyJhcnJheSIsImJsb2NrcyIsImNoZWNrYm94IiwiY29kZSIsImRhdGUiLCJlbWFpbCIsImpzb24iLCJudW1iZXIiLCJwYXNzd29yZCIsInBvaW50IiwicmFkaW8iLCJyZWxhdGlvbnNoaXAiLCJyaWNoVGV4dCIsInNlbGVjdCIsInRleHQiLCJ0ZXh0YXJlYSIsInVwbG9hZCIsInZhbHVlIiwiY29uZmlnIiwiaGFzTWFueSIsIm1heExlbmd0aCIsImZpZWxkTWF4TGVuZ3RoIiwibWF4Um93cyIsIm1pbkxlbmd0aCIsIm1pblJvd3MiLCJyZXF1aXJlZCIsInQiLCJsZW5ndGhWYWxpZGF0aW9uUmVzdWx0IiwidmFsaWRhdGVBcnJheUxlbmd0aCIsImRlZmF1bHRNYXhUZXh0TGVuZ3RoIiwic3RyaW5nc1RvVmFsaWRhdGUiLCJBcnJheSIsImlzQXJyYXkiLCJzdHJpbmdWYWx1ZSIsImxlbmd0aCIsImxhYmVsIiwicGF5bG9hZCIsInRlc3QiLCJ1bmRlZmluZWQiLCJqc29uRXJyb3IiLCJpc05hTiIsIkRhdGUiLCJwYXJzZSIsInRvU3RyaW5nIiwib3B0aW9ucyIsImVkaXRvciIsInZhbGlkYXRlIiwiYXJyYXlMZW5ndGgiLCJjb3VudCIsIm1heCIsIm1pbiIsImlzTnVtYmVyIiwibnVtYmVyc1RvVmFsaWRhdGUiLCJudW1iZXJWYWx1ZSIsInBhcnNlRmxvYXQiLCJ2YWxpZGF0ZUZpbHRlck9wdGlvbnMiLCJpZCIsImRhdGEiLCJmaWx0ZXJPcHRpb25zIiwicmVsYXRpb25UbyIsInJlcSIsInNpYmxpbmdEYXRhIiwidXNlciIsImNhblVzZURPTSIsImZhbHNlQ29sbGVjdGlvbnMiLCJjb2xsZWN0aW9ucyIsInZhbHVlcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJjb2xsZWN0aW9uIiwib3B0aW9uRmlsdGVyIiwidmFsdWVJRHMiLCJmb3JFYWNoIiwidmFsIiwicHVzaCIsImZpbmRXaGVyZSIsImFuZCIsImluIiwicmVzdWx0IiwiZmluZCIsImRlcHRoIiwibGltaXQiLCJwYWdpbmF0aW9uIiwid2hlcmUiLCJkb2NzIiwiZG9jIiwiZXJyIiwibG9nZ2VyIiwiZXJyb3IiLCJtc2ciLCJpbnZhbGlkUmVsYXRpb25zaGlwcyIsImZpbHRlciIsInJlcXVlc3RlZElEIiwic2x1ZyIsImluZGV4T2YiLCJyZWR1Y2UiLCJpbnZhbGlkIiwiaSIsIkpTT04iLCJzdHJpbmdpZnkiLCJpZEZpZWxkIiwiZmllbGRzIiwiZmllbGQiLCJmaWVsZEFmZmVjdHNEYXRhIiwibmFtZSIsInR5cGUiLCJnZXRJRFR5cGUiLCJkYiIsImRlZmF1bHRJRFR5cGUiLCJpc1ZhbGlkSUQiLCJjb2xsZWN0aW9uU2x1ZyIsImpvaW4iLCJzb21lIiwiaW5wdXQiLCJvcHRpb24iLCJ2YWx1ZU1hdGNoZXNPcHRpb24iLCJsbmciLCJTdHJpbmciLCJsYXQiLCJOdW1iZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBd1BhQSxLQUFLO2VBQUxBOztJQU9BQyxNQUFNO2VBQU5BOztJQTVHQUMsUUFBUTtlQUFSQTs7SUF2QkFDLElBQUk7ZUFBSkE7O0lBa0NBQyxJQUFJO2VBQUpBOztJQXNYYixPQWtCQztlQWxCRDs7SUF2YmFDLEtBQUs7ZUFBTEE7O0lBdUNBQyxJQUFJO2VBQUpBOztJQWtGQUMsTUFBTTtlQUFOQTs7SUFqSkFDLFFBQVE7ZUFBUkE7O0lBd2JBQyxLQUFLO2VBQUxBOztJQVhBQyxLQUFLO2VBQUxB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