speckoloo
Version:
Domain entites inspired by Speck
1,571 lines (1,515 loc) • 42.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var cov_2ewyhc2fha = function () {
var path = '/home/henrique/labs/speckoloo/src/factory.js',
hash = '6fe2ea14a1c04c470f6cf8adb44d4cd6677e77d1',
global = new Function('return this')(),
gcv = '__coverage__',
coverageData = {
path: '/home/henrique/labs/speckoloo/src/factory.js',
statementMap: {
'0': {
start: {
line: 6,
column: 29
},
end: {
line: 6,
column: 38
}
},
'1': {
start: {
line: 8,
column: 34
},
end: {
line: 48,
column: 1
}
},
'2': {
start: {
line: 9,
column: 28
},
end: {
line: 16,
column: 5
}
},
'3': {
start: {
line: 11,
column: 40
},
end: {
line: 14,
column: 7
}
},
'4': {
start: {
line: 18,
column: 2
},
end: {
line: 47,
column: 3
}
},
'5': {
start: {
line: 31,
column: 8
},
end: {
line: 31,
column: 49
}
},
'6': {
start: {
line: 33,
column: 8
},
end: {
line: 33,
column: 43
}
},
'7': {
start: {
line: 35,
column: 8
},
end: {
line: 35,
column: 50
}
},
'8': {
start: {
line: 40,
column: 8
},
end: {
line: 40,
column: 49
}
},
'9': {
start: {
line: 42,
column: 8
},
end: {
line: 42,
column: 43
}
},
'10': {
start: {
line: 44,
column: 8
},
end: {
line: 44,
column: 52
}
},
'11': {
start: {
line: 51,
column: 2
},
end: {
line: 53,
column: 3
}
},
'12': {
start: {
line: 52,
column: 4
},
end: {
line: 52,
column: 51
}
},
'13': {
start: {
line: 57,
column: 2
},
end: {
line: 59,
column: 3
}
},
'14': {
start: {
line: 58,
column: 4
},
end: {
line: 58,
column: 10
}
},
'15': {
start: {
line: 61,
column: 2
},
end: {
line: 64,
column: 21
}
},
'16': {
start: {
line: 62,
column: 4
},
end: {
line: 64,
column: 21
}
},
'17': {
start: {
line: 68,
column: 2
},
end: {
line: 94,
column: 5
}
},
'18': {
start: {
line: 71,
column: 29
},
end: {
line: 71,
column: 70
}
},
'19': {
start: {
line: 72,
column: 8
},
end: {
line: 74,
column: 21
}
},
'20': {
start: {
line: 76,
column: 31
},
end: {
line: 80,
column: 9
}
},
'21': {
start: {
line: 77,
column: 19
},
end: {
line: 77,
column: 42
}
},
'22': {
start: {
line: 82,
column: 33
},
end: {
line: 84,
column: 14
}
},
'23': {
start: {
line: 83,
column: 31
},
end: {
line: 83,
column: 72
}
},
'24': {
start: {
line: 86,
column: 8
},
end: {
line: 91,
column: 9
}
},
'25': {
start: {
line: 98,
column: 59
},
end: {
line: 98,
column: 75
}
},
'26': {
start: {
line: 100,
column: 17
},
end: {
line: 100,
column: 51
}
},
'27': {
start: {
line: 102,
column: 24
},
end: {
line: 108,
column: 10
}
},
'28': {
start: {
line: 104,
column: 6
},
end: {
line: 106,
column: 7
}
},
'29': {
start: {
line: 105,
column: 8
},
end: {
line: 105,
column: 66
}
},
'30': {
start: {
line: 107,
column: 6
},
end: {
line: 107,
column: 16
}
},
'31': {
start: {
line: 110,
column: 21
},
end: {
line: 110,
column: 44
}
},
'32': {
start: {
line: 111,
column: 20
},
end: {
line: 111,
column: 84
}
},
'33': {
start: {
line: 113,
column: 18
},
end: {
line: 135,
column: 3
}
},
'34': {
start: {
line: 117,
column: 28
},
end: {
line: 119,
column: 21
}
},
'35': {
start: {
line: 121,
column: 4
},
end: {
line: 121,
column: 57
}
},
'36': {
start: {
line: 123,
column: 24
},
end: {
line: 125,
column: 57
}
},
'37': {
start: {
line: 127,
column: 21
},
end: {
line: 130,
column: 5
}
},
'38': {
start: {
line: 132,
column: 4
},
end: {
line: 134,
column: 6
}
},
'39': {
start: {
line: 137,
column: 2
},
end: {
line: 137,
column: 16
}
}
},
fnMap: {
'0': {
name: '(anonymous_0)',
decl: {
start: {
line: 8,
column: 34
},
end: {
line: 8,
column: 35
}
},
loc: {
start: {
line: 8,
column: 55
},
end: {
line: 48,
column: 1
}
},
line: 8
},
'1': {
name: '(anonymous_1)',
decl: {
start: {
line: 11,
column: 6
},
end: {
line: 11,
column: 7
}
},
loc: {
start: {
line: 11,
column: 40
},
end: {
line: 14,
column: 7
}
},
line: 11
},
'2': {
name: '(anonymous_2)',
decl: {
start: {
line: 24,
column: 13
},
end: {
line: 24,
column: 14
}
},
loc: {
start: {
line: 24,
column: 55
},
end: {
line: 36,
column: 7
}
},
line: 24
},
'3': {
name: '(anonymous_3)',
decl: {
start: {
line: 39,
column: 13
},
end: {
line: 39,
column: 14
}
},
loc: {
start: {
line: 39,
column: 55
},
end: {
line: 45,
column: 7
}
},
line: 39
},
'4': {
name: 'checkContext',
decl: {
start: {
line: 50,
column: 9
},
end: {
line: 50,
column: 21
}
},
loc: {
start: {
line: 50,
column: 40
},
end: {
line: 54,
column: 1
}
},
line: 50
},
'5': {
name: 'nestedFactoryWrapper',
decl: {
start: {
line: 56,
column: 9
},
end: {
line: 56,
column: 29
}
},
loc: {
start: {
line: 56,
column: 40
},
end: {
line: 65,
column: 1
}
},
line: 56
},
'6': {
name: '(anonymous_6)',
decl: {
start: {
line: 61,
column: 9
},
end: {
line: 61,
column: 10
}
},
loc: {
start: {
line: 62,
column: 4
},
end: {
line: 64,
column: 21
}
},
line: 62
},
'7': {
name: 'buildEntityPropertyDescriptors',
decl: {
start: {
line: 67,
column: 9
},
end: {
line: 67,
column: 39
}
},
loc: {
start: {
line: 67,
column: 69
},
end: {
line: 95,
column: 1
}
},
line: 67
},
'8': {
name: '(anonymous_8)',
decl: {
start: {
line: 70,
column: 6
},
end: {
line: 70,
column: 7
}
},
loc: {
start: {
line: 70,
column: 47
},
end: {
line: 92,
column: 7
}
},
line: 70
},
'9': {
name: '(anonymous_9)',
decl: {
start: {
line: 97,
column: 15
},
end: {
line: 97,
column: 16
}
},
loc: {
start: {
line: 97,
column: 35
},
end: {
line: 138,
column: 1
}
},
line: 97
},
'10': {
name: '(anonymous_10)',
decl: {
start: {
line: 103,
column: 12
},
end: {
line: 103,
column: 13
}
},
loc: {
start: {
line: 103,
column: 44
},
end: {
line: 108,
column: 5
}
},
line: 103
},
'11': {
name: '(anonymous_11)',
decl: {
start: {
line: 113,
column: 18
},
end: {
line: 113,
column: 19
}
},
loc: {
start: {
line: 113,
column: 89
},
end: {
line: 135,
column: 3
}
},
line: 113
}
},
branchMap: {
'0': {
loc: {
start: {
line: 24,
column: 23
},
end: {
line: 24,
column: 53
}
},
type: 'default-arg',
locations: [{
start: {
line: 24,
column: 33
},
end: {
line: 24,
column: 53
}
}],
line: 24
},
'1': {
loc: {
start: {
line: 31,
column: 18
},
end: {
line: 31,
column: 49
}
},
type: 'binary-expr',
locations: [{
start: {
line: 31,
column: 18
},
end: {
line: 31,
column: 25
}
}, {
start: {
line: 31,
column: 29
},
end: {
line: 31,
column: 49
}
}],
line: 31
},
'2': {
loc: {
start: {
line: 39,
column: 23
},
end: {
line: 39,
column: 53
}
},
type: 'default-arg',
locations: [{
start: {
line: 39,
column: 33
},
end: {
line: 39,
column: 53
}
}],
line: 39
},
'3': {
loc: {
start: {
line: 40,
column: 18
},
end: {
line: 40,
column: 49
}
},
type: 'binary-expr',
locations: [{
start: {
line: 40,
column: 18
},
end: {
line: 40,
column: 25
}
}, {
start: {
line: 40,
column: 29
},
end: {
line: 40,
column: 49
}
}],
line: 40
},
'4': {
loc: {
start: {
line: 51,
column: 2
},
end: {
line: 53,
column: 3
}
},
type: 'if',
locations: [{
start: {
line: 51,
column: 2
},
end: {
line: 53,
column: 3
}
}, {
start: {
line: 51,
column: 2
},
end: {
line: 53,
column: 3
}
}],
line: 51
},
'5': {
loc: {
start: {
line: 57,
column: 2
},
end: {
line: 59,
column: 3
}
},
type: 'if',
locations: [{
start: {
line: 57,
column: 2
},
end: {
line: 59,
column: 3
}
}, {
start: {
line: 57,
column: 2
},
end: {
line: 59,
column: 3
}
}],
line: 57
},
'6': {
loc: {
start: {
line: 62,
column: 4
},
end: {
line: 64,
column: 21
}
},
type: 'cond-expr',
locations: [{
start: {
line: 63,
column: 8
},
end: {
line: 63,
column: 17
}
}, {
start: {
line: 64,
column: 8
},
end: {
line: 64,
column: 21
}
}],
line: 62
},
'7': {
loc: {
start: {
line: 71,
column: 29
},
end: {
line: 71,
column: 70
}
},
type: 'binary-expr',
locations: [{
start: {
line: 71,
column: 29
},
end: {
line: 71,
column: 58
}
}, {
start: {
line: 71,
column: 62
},
end: {
line: 71,
column: 70
}
}],
line: 71
},
'8': {
loc: {
start: {
line: 72,
column: 27
},
end: {
line: 74,
column: 21
}
},
type: 'cond-expr',
locations: [{
start: {
line: 73,
column: 12
},
end: {
line: 73,
column: 42
}
}, {
start: {
line: 74,
column: 12
},
end: {
line: 74,
column: 21
}
}],
line: 72
},
'9': {
loc: {
start: {
line: 82,
column: 33
},
end: {
line: 84,
column: 14
}
},
type: 'cond-expr',
locations: [{
start: {
line: 83,
column: 12
},
end: {
line: 83,
column: 76
}
}, {
start: {
line: 84,
column: 12
},
end: {
line: 84,
column: 14
}
}],
line: 82
},
'10': {
loc: {
start: {
line: 98,
column: 10
},
end: {
line: 98,
column: 23
}
},
type: 'default-arg',
locations: [{
start: {
line: 98,
column: 21
},
end: {
line: 98,
column: 23
}
}],
line: 98
},
'11': {
loc: {
start: {
line: 98,
column: 25
},
end: {
line: 98,
column: 39
}
},
type: 'default-arg',
locations: [{
start: {
line: 98,
column: 37
},
end: {
line: 98,
column: 39
}
}],
line: 98
},
'12': {
loc: {
start: {
line: 104,
column: 6
},
end: {
line: 106,
column: 7
}
},
type: 'if',
locations: [{
start: {
line: 104,
column: 6
},
end: {
line: 106,
column: 7
}
}, {
start: {
line: 104,
column: 6
},
end: {
line: 106,
column: 7
}
}],
line: 104
},
'13': {
loc: {
start: {
line: 113,
column: 19
},
end: {
line: 113,
column: 28
}
},
type: 'default-arg',
locations: [{
start: {
line: 113,
column: 26
},
end: {
line: 113,
column: 28
}
}],
line: 113
},
'14': {
loc: {
start: {
line: 113,
column: 30
},
end: {
line: 113,
column: 84
}
},
type: 'default-arg',
locations: [{
start: {
line: 113,
column: 59
},
end: {
line: 113,
column: 84
}
}],
line: 113
},
'15': {
loc: {
start: {
line: 113,
column: 32
},
end: {
line: 113,
column: 54
}
},
type: 'default-arg',
locations: [{
start: {
line: 113,
column: 49
},
end: {
line: 113,
column: 54
}
}],
line: 113
},
'16': {
loc: {
start: {
line: 117,
column: 28
},
end: {
line: 119,
column: 21
}
},
type: 'cond-expr',
locations: [{
start: {
line: 118,
column: 8
},
end: {
line: 118,
column: 10
}
}, {
start: {
line: 119,
column: 8
},
end: {
line: 119,
column: 21
}
}],
line: 117
},
'17': {
loc: {
start: {
line: 121,
column: 46
},
end: {
line: 121,
column: 56
}
},
type: 'binary-expr',
locations: [{
start: {
line: 121,
column: 46
},
end: {
line: 121,
column: 50
}
}, {
start: {
line: 121,
column: 54
},
end: {
line: 121,
column: 56
}
}],
line: 121
},
'18': {
loc: {
start: {
line: 123,
column: 24
},
end: {
line: 125,
column: 57
}
},
type: 'cond-expr',
locations: [{
start: {
line: 124,
column: 8
},
end: {
line: 124,
column: 10
}
}, {
start: {
line: 125,
column: 8
},
end: {
line: 125,
column: 57
}
}],
line: 123
}
},
s: {
'0': 0,
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'6': 0,
'7': 0,
'8': 0,
'9': 0,
'10': 0,
'11': 0,
'12': 0,
'13': 0,
'14': 0,
'15': 0,
'16': 0,
'17': 0,
'18': 0,
'19': 0,
'20': 0,
'21': 0,
'22': 0,
'23': 0,
'24': 0,
'25': 0,
'26': 0,
'27': 0,
'28': 0,
'29': 0,
'30': 0,
'31': 0,
'32': 0,
'33': 0,
'34': 0,
'35': 0,
'36': 0,
'37': 0,
'38': 0,
'39': 0
},
f: {
'0': 0,
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'6': 0,
'7': 0,
'8': 0,
'9': 0,
'10': 0,
'11': 0
},
b: {
'0': [0],
'1': [0, 0],
'2': [0],
'3': [0, 0],
'4': [0, 0],
'5': [0, 0],
'6': [0, 0],
'7': [0, 0],
'8': [0, 0],
'9': [0, 0],
'10': [0],
'11': [0],
'12': [0, 0],
'13': [0],
'14': [0],
'15': [0],
'16': [0, 0],
'17': [0, 0],
'18': [0, 0]
},
_coverageSchema: '332fd63041d2c1bcb487cc26dd0d5f7d97098a6c'
},
coverage = global[gcv] || (global[gcv] = {});
if (coverage[path] && coverage[path].hash === hash) {
return coverage[path];
}
coverageData.hash = hash;
return coverage[path] = coverageData;
}();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _common = require('./common');
var _validate = require('./validate');
var _validate2 = _interopRequireDefault(_validate);
var _toJson = require('./to-json');
var _toJson2 = _interopRequireDefault(_toJson);
var _buildSchema = require('./build-schema');
var _buildSchema2 = _interopRequireDefault(_buildSchema);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectEntries(obj) {
var entries = [];
var keys = Object.keys(obj);
for (var k = 0; k < keys.length; ++k) entries.push([keys[k], obj[keys[k]]]);
return entries;
}
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
const DEFAULT_CONTEXT_NAME = (cov_2ewyhc2fha.s[0]++, 'default');
cov_2ewyhc2fha.s[1]++;
const buildPrototypeDescriptors = (schema, methods) => {
cov_2ewyhc2fha.f[0]++;
const methodDescriptors = (cov_2ewyhc2fha.s[2]++, _objectEntries(methods).reduce((acc, [methodName, method]) => {
cov_2ewyhc2fha.f[1]++;
cov_2ewyhc2fha.s[3]++;
return _extends({}, acc, {
[methodName]: { value: method }
});
}, {}));
cov_2ewyhc2fha.s[4]++;
return _extends({}, methodDescriptors, {
$schema: {
value: schema
},
toJSON: {
value: function value(context = (cov_2ewyhc2fha.b[0][0]++, DEFAULT_CONTEXT_NAME)) {
cov_2ewyhc2fha.f[2]++;
cov_2ewyhc2fha.s[5]++;
/**
* Handles the case when calling `JSON.stringify` directly on the entity.
* In this case, `toJSON` is called with an empty string as first argument.
*
* @see { @link https://mzl.la/2hgTyXG }
*/
context = (cov_2ewyhc2fha.b[1][0]++, context) || (cov_2ewyhc2fha.b[1][1]++, DEFAULT_CONTEXT_NAME);
cov_2ewyhc2fha.s[6]++;
checkContext(this.$schema, context);
cov_2ewyhc2fha.s[7]++;
return (0, _toJson2.default)(this.$schema[context], this);
}
},
validate: {
value: function value(context = (cov_2ewyhc2fha.b[2][0]++, DEFAULT_CONTEXT_NAME)) {
cov_2ewyhc2fha.f[3]++;
cov_2ewyhc2fha.s[8]++;
context = (cov_2ewyhc2fha.b[3][0]++, context) || (cov_2ewyhc2fha.b[3][1]++, DEFAULT_CONTEXT_NAME);
cov_2ewyhc2fha.s[9]++;
checkContext(this.$schema, context);
cov_2ewyhc2fha.s[10]++;
return (0, _validate2.default)(this.$schema[context], this);
}
}
});
};
function checkContext(schema, context) {
cov_2ewyhc2fha.f[4]++;
cov_2ewyhc2fha.s[11]++;
if (schema[context] === undefined) {
cov_2ewyhc2fha.b[4][0]++;
cov_2ewyhc2fha.s[12]++;
throw new Error(`Invalid context "${context}"`);
} else {
cov_2ewyhc2fha.b[4][1]++;
}
}
function nestedFactoryWrapper(factory) {
cov_2ewyhc2fha.f[5]++;
cov_2ewyhc2fha.s[13]++;
if (factory === undefined) {
cov_2ewyhc2fha.b[5][0]++;
cov_2ewyhc2fha.s[14]++;
return;
} else {
cov_2ewyhc2fha.b[5][1]++;
}
cov_2ewyhc2fha.s[15]++;
return data => {
cov_2ewyhc2fha.f[6]++;
cov_2ewyhc2fha.s[16]++;
return (0, _common.isUndefinedOrNull)(data) ? (cov_2ewyhc2fha.b[6][0]++, undefined) : (cov_2ewyhc2fha.b[6][1]++, factory(data));
};
}
function buildEntityPropertyDescriptors(allowedData, defaultSchema) {
cov_2ewyhc2fha.f[7]++;
cov_2ewyhc2fha.s[17]++;
return _objectEntries(defaultSchema).reduce((acc, [key, { factory, readOnly }]) => {
cov_2ewyhc2fha.f[8]++;
const finalFactory = (cov_2ewyhc2fha.s[18]++, (cov_2ewyhc2fha.b[7][0]++, nestedFactoryWrapper(factory)) || (cov_2ewyhc2fha.b[7][1]++, _common.identity));
cov_2ewyhc2fha.s[19]++;
allowedData[key] = allowedData[key] ? (cov_2ewyhc2fha.b[8][0]++, finalFactory(allowedData[key])) : (cov_2ewyhc2fha.b[8][1]++, undefined);
const baseDescriptor = (cov_2ewyhc2fha.s[20]++, {
get() {
cov_2ewyhc2fha.s[21]++;
return allowedData[key];
},
enumerable: true,
configurable: true
});
const setterDescriptor = (cov_2ewyhc2fha.s[22]++, !readOnly ? (cov_2ewyhc2fha.b[9][0]++, { set(newValue) {
cov_2ewyhc2fha.s[23]++;
allowedData[key] = finalFactory(newValue);
} }) : (cov_2ewyhc2fha.b[9][1]++, {}));
cov_2ewyhc2fha.s[24]++;
return Object.assign(acc, {
[key]: Object.assign(baseDescriptor, setterDescriptor)
});
}, {});
}
exports.default = schemaDefinition => {
cov_2ewyhc2fha.f[9]++;
var _ref = (cov_2ewyhc2fha.s[25]++, schemaDefinition),
_ref$$methods = _ref.$methods;
const $methods = _ref$$methods === undefined ? (cov_2ewyhc2fha.b[10][0]++, {}) : _ref$$methods;
var _ref$$contexts = _ref.$contexts;
const $contexts = _ref$$contexts === undefined ? (cov_2ewyhc2fha.b[11][0]++, {}) : _ref$$contexts,
definition = _objectWithoutProperties(_ref, ['$methods', '$contexts']);
const schema = (cov_2ewyhc2fha.s[26]++, (0, _buildSchema2.default)(definition, $contexts));
const defaultValues = (cov_2ewyhc2fha.s[27]++, _objectEntries(definition).reduce((acc, [propertyName, def]) => {
cov_2ewyhc2fha.f[10]++;
cov_2ewyhc2fha.s[28]++;
if (def.default) {
cov_2ewyhc2fha.b[12][0]++;
cov_2ewyhc2fha.s[29]++;
return Object.assign(acc, { [propertyName]: def.default });
} else {
cov_2ewyhc2fha.b[12][1]++;
}
cov_2ewyhc2fha.s[30]++;
return acc;
}, {}));
const schemaKeys = (cov_2ewyhc2fha.s[31]++, Object.keys(definition));
const prototype = (cov_2ewyhc2fha.s[32]++, Object.create(null, buildPrototypeDescriptors(schema, $methods)));
cov_2ewyhc2fha.s[33]++;
const factory = (data = (cov_2ewyhc2fha.b[13][0]++, {}), { ignoreDefaults = (cov_2ewyhc2fha.b[15][0]++, false) } = (cov_2ewyhc2fha.b[14][0]++, { ignoreDefaults: false })) => {
cov_2ewyhc2fha.f[11]++;
/**
* The line bellow also covers the case when data is `null`.
*/
const currentDefaults = (cov_2ewyhc2fha.s[34]++, ignoreDefaults ? (cov_2ewyhc2fha.b[16][0]++, {}) : (cov_2ewyhc2fha.b[16][1]++, defaultValues));
cov_2ewyhc2fha.s[35]++;
data = Object.assign({}, currentDefaults, (cov_2ewyhc2fha.b[17][0]++, data) || (cov_2ewyhc2fha.b[17][1]++, {}));
const allowedData = (cov_2ewyhc2fha.s[36]++, Object.keys(data).length === 0 ? (cov_2ewyhc2fha.b[18][0]++, {}) : (cov_2ewyhc2fha.b[18][1]++, (0, _common.omitBy)((0, _common.pick)(data, schemaKeys), _common.isUndefinedOrNull)));
const instance = (cov_2ewyhc2fha.s[37]++, Object.create(prototype, buildEntityPropertyDescriptors(allowedData, schema.default)));
cov_2ewyhc2fha.s[38]++;
return Object.defineProperty(instance, 'constructor', {
value: factory
});
};
cov_2ewyhc2fha.s[39]++;
return factory;
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfQ09OVEVYVF9OQU1FIiwiYnVpbGRQcm90b3R5cGVEZXNjcmlwdG9ycyIsInNjaGVtYSIsIm1ldGhvZHMiLCJtZXRob2REZXNjcmlwdG9ycyIsInJlZHVjZSIsImFjYyIsIm1ldGhvZE5hbWUiLCJtZXRob2QiLCJ2YWx1ZSIsIiRzY2hlbWEiLCJ0b0pTT04iLCJjb250ZXh0IiwiY2hlY2tDb250ZXh0IiwidmFsaWRhdGUiLCJ1bmRlZmluZWQiLCJFcnJvciIsIm5lc3RlZEZhY3RvcnlXcmFwcGVyIiwiZmFjdG9yeSIsImRhdGEiLCJidWlsZEVudGl0eVByb3BlcnR5RGVzY3JpcHRvcnMiLCJhbGxvd2VkRGF0YSIsImRlZmF1bHRTY2hlbWEiLCJrZXkiLCJyZWFkT25seSIsImZpbmFsRmFjdG9yeSIsImJhc2VEZXNjcmlwdG9yIiwiZ2V0IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsInNldHRlckRlc2NyaXB0b3IiLCJzZXQiLCJuZXdWYWx1ZSIsIk9iamVjdCIsImFzc2lnbiIsInNjaGVtYURlZmluaXRpb24iLCIkbWV0aG9kcyIsIiRjb250ZXh0cyIsImRlZmluaXRpb24iLCJkZWZhdWx0VmFsdWVzIiwicHJvcGVydHlOYW1lIiwiZGVmIiwiZGVmYXVsdCIsInNjaGVtYUtleXMiLCJrZXlzIiwicHJvdG90eXBlIiwiY3JlYXRlIiwiaWdub3JlRGVmYXVsdHMiLCJjdXJyZW50RGVmYXVsdHMiLCJsZW5ndGgiLCJpbnN0YW5jZSIsImRlZmluZVByb3BlcnR5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUF3Q2pDLFNBQU9BLE9BQVA7QUFDRCxDIiwiZmlsZSI6ImZhY3RvcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwaWNrLCBvbWl0QnksIGlkZW50aXR5LCBpc1VuZGVmaW5lZE9yTnVsbCB9IGZyb20gJy4vY29tbW9uJ1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUnXG5pbXBvcnQgdG9KU09OIGZyb20gJy4vdG8tanNvbidcbmltcG9ydCBidWlsZFNjaGVtYSBmcm9tICcuL2J1aWxkLXNjaGVtYSdcblxuY29uc3QgREVGQVVMVF9DT05URVhUX05BTUUgPSAnZGVmYXVsdCdcblxuY29uc3QgYnVpbGRQcm90b3R5cGVEZXNjcmlwdG9ycyA9IChzY2hlbWEsIG1ldGhvZHMpID0+IHtcbiAgY29uc3QgbWV0aG9kRGVzY3JpcHRvcnMgPSBPYmplY3QuZW50cmllcyhtZXRob2RzKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoYWNjLCBbIG1ldGhvZE5hbWUsIG1ldGhvZCBdKSA9PiAoe1xuICAgICAgICAuLi5hY2MsXG4gICAgICAgIFttZXRob2ROYW1lXTogeyB2YWx1ZTogbWV0aG9kIH1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5tZXRob2REZXNjcmlwdG9ycyxcbiAgICAkc2NoZW1hOiB7XG4gICAgICB2YWx1ZTogc2NoZW1hXG4gICAgfSxcbiAgICB0b0pTT046IHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiAoY29udGV4dCA9IERFRkFVTFRfQ09OVEVYVF9OQU1FKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIHRoZSBjYXNlIHdoZW4gY2FsbGluZyBgSlNPTi5zdHJpbmdpZnlgIGRpcmVjdGx5IG9uIHRoZSBlbnRpdHkuXG4gICAgICAgICAqIEluIHRoaXMgY2FzZSwgYHRvSlNPTmAgaXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgc3RyaW5nIGFzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHsgQGxpbmsgaHR0cHM6Ly9temwubGEvMmhnVHlYRyB9XG4gICAgICAgICAqL1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCBERUZBVUxUX0NPTlRFWFRfTkFNRVxuXG4gICAgICAgIGNoZWNrQ29udGV4dCh0aGlzLiRzY2hlbWEsIGNvbnRleHQpXG5cbiAgICAgICAgcmV0dXJuIHRvSlNPTih0aGlzLiRzY2hlbWFbY29udGV4dF0sIHRoaXMpXG4gICAgICB9XG4gICAgfSxcbiAgICB2YWxpZGF0ZToge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIChjb250ZXh0ID0gREVGQVVMVF9DT05URVhUX05BTUUpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgREVGQVVMVF9DT05URVhUX05BTUVcblxuICAgICAgICBjaGVja0NvbnRleHQodGhpcy4kc2NoZW1hLCBjb250ZXh0KVxuXG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLiRzY2hlbWFbY29udGV4dF0sIHRoaXMpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ29udGV4dCAoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGlmIChzY2hlbWFbY29udGV4dF0gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250ZXh0IFwiJHtjb250ZXh0fVwiYClcbiAgfVxufVxuXG5mdW5jdGlvbiBuZXN0ZWRGYWN0b3J5V3JhcHBlciAoZmFjdG9yeSkge1xuICBpZiAoZmFjdG9yeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICByZXR1cm4gZGF0YSA9PlxuICAgIGlzVW5kZWZpbmVkT3JOdWxsKGRhdGEpXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBmYWN0b3J5KGRhdGEpXG59XG5cbmZ1bmN0aW9uIGJ1aWxkRW50aXR5UHJvcGVydHlEZXNjcmlwdG9ycyAoYWxsb3dlZERhdGEsIGRlZmF1bHRTY2hlbWEpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRTY2hlbWEpXG4gICAgLnJlZHVjZShcbiAgICAgIChhY2MsIFsga2V5LCB7IGZhY3RvcnksIHJlYWRPbmx5IH0gXSkgPT4ge1xuICAgICAgICBjb25zdCBmaW5hbEZhY3RvcnkgPSBuZXN0ZWRGYWN0b3J5V3JhcHBlcihmYWN0b3J5KSB8fCBpZGVudGl0eVxuICAgICAgICBhbGxvd2VkRGF0YVtrZXldID0gYWxsb3dlZERhdGFba2V5XVxuICAgICAgICAgID8gZmluYWxGYWN0b3J5KGFsbG93ZWREYXRhW2tleV0pXG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCBiYXNlRGVzY3JpcHRvciA9IHtcbiAgICAgICAgICBnZXQgKCkgeyByZXR1cm4gYWxsb3dlZERhdGFba2V5XSB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXR0ZXJEZXNjcmlwdG9yID0gIXJlYWRPbmx5XG4gICAgICAgICAgPyB7IHNldCAobmV3VmFsdWUpIHsgYWxsb3dlZERhdGFba2V5XSA9IGZpbmFsRmFjdG9yeShuZXdWYWx1ZSkgfSB9XG4gICAgICAgICAgOiB7fVxuXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIGFjYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBba2V5XTogT2JqZWN0LmFzc2lnbihiYXNlRGVzY3JpcHRvciwgc2V0dGVyRGVzY3JpcHRvcilcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICB7fVxuICAgIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2NoZW1hRGVmaW5pdGlvbiA9PiB7XG4gIGNvbnN0IHsgJG1ldGhvZHMgPSB7fSwgJGNvbnRleHRzID0ge30sIC4uLmRlZmluaXRpb24gfSA9IHNjaGVtYURlZmluaXRpb25cblxuICBjb25zdCBzY2hlbWEgPSBidWlsZFNjaGVtYShkZWZpbml0aW9uLCAkY29udGV4dHMpXG5cbiAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb24pXG4gICAgLnJlZHVjZSgoYWNjLCBbIHByb3BlcnR5TmFtZSwgZGVmIF0pID0+IHtcbiAgICAgIGlmIChkZWYuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW3Byb3BlcnR5TmFtZV06IGRlZi5kZWZhdWx0IH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwge30pXG5cbiAgY29uc3Qgc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKGRlZmluaXRpb24pXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCwgYnVpbGRQcm90b3R5cGVEZXNjcmlwdG9ycyhzY2hlbWEsICRtZXRob2RzKSlcblxuICBjb25zdCBmYWN0b3J5ID0gKGRhdGEgPSB7fSwgeyBpZ25vcmVEZWZhdWx0cyA9IGZhbHNlIH0gPSB7IGlnbm9yZURlZmF1bHRzOiBmYWxzZSB9KSA9PiB7XG4gICAgLyoqXG4gICAgICogVGhlIGxpbmUgYmVsbG93IGFsc28gY292ZXJzIHRoZSBjYXNlIHdoZW4gZGF0YSBpcyBgbnVsbGAuXG4gICAgICovXG4gICAgY29uc3QgY3VycmVudERlZmF1bHRzID0gaWdub3JlRGVmYXVsdHNcbiAgICAgID8ge31cbiAgICAgIDogZGVmYXVsdFZhbHVlc1xuXG4gICAgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnREZWZhdWx0cywgZGF0YSB8fCB7fSlcblxuICAgIGNvbnN0IGFsbG93ZWREYXRhID0gT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwXG4gICAgICA/IHt9XG4gICAgICA6IG9taXRCeShwaWNrKGRhdGEsIHNjaGVtYUtleXMpLCBpc1VuZGVmaW5lZE9yTnVsbClcblxuICAgIGNvbnN0IGluc3RhbmNlID0gT2JqZWN0LmNyZWF0ZShcbiAgICAgIHByb3RvdHlwZSxcbiAgICAgIGJ1aWxkRW50aXR5UHJvcGVydHlEZXNjcmlwdG9ycyhhbGxvd2VkRGF0YSwgc2NoZW1hLmRlZmF1bHQpXG4gICAgKVxuXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwgJ2NvbnN0cnVjdG9yJywge1xuICAgICAgdmFsdWU6IGZhY3RvcnlcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGZhY3Rvcnlcbn1cbiJdfQ==