angular-odata 0.122.0 → 0.124.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/api.mjs +373 -0
- package/esm2022/lib/cache/cache.mjs +175 -0
- package/{esm2020 → esm2022}/lib/cache/storage.mjs +1 -1
- package/esm2022/lib/client.mjs +252 -0
- package/{esm2020 → esm2022}/lib/helper.mjs +1 -1
- package/{esm2020 → esm2022}/lib/loaders.mjs +1 -1
- package/esm2022/lib/models/collection.mjs +865 -0
- package/esm2022/lib/models/model.mjs +535 -0
- package/esm2022/lib/models/options.mjs +1117 -0
- package/{esm2020 → esm2022}/lib/module.mjs +5 -5
- package/esm2022/lib/resources/path/segments.mjs +124 -0
- package/esm2022/lib/resources/query/builder.mjs +624 -0
- package/esm2022/lib/resources/query/expressions/base.mjs +20 -0
- package/esm2022/lib/resources/query/expressions/compute.mjs +39 -0
- package/esm2022/lib/resources/query/expressions/count.mjs +99 -0
- package/esm2022/lib/resources/query/expressions/expand.mjs +125 -0
- package/esm2022/lib/resources/query/expressions/filter.mjs +161 -0
- package/esm2022/lib/resources/query/expressions/orderby.mjs +56 -0
- package/esm2022/lib/resources/query/expressions/search.mjs +122 -0
- package/esm2022/lib/resources/query/expressions/select.mjs +31 -0
- package/esm2022/lib/resources/query/expressions/syntax.mjs +444 -0
- package/{esm2020 → esm2022}/lib/resources/query/handlers.mjs +1 -1
- package/esm2022/lib/resources/query/options.mjs +115 -0
- package/{esm2020 → esm2022}/lib/resources/request.mjs +1 -1
- package/esm2022/lib/resources/resource.mjs +257 -0
- package/{esm2020 → esm2022}/lib/resources/responses/annotations.mjs +1 -1
- package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +33 -0
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-container.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-enum-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-function-action.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-reference.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-schema.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structural-property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structured-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-type-definition.mjs +1 -1
- package/esm2022/lib/resources/responses/metadata.mjs +547 -0
- package/{esm2020 → esm2022}/lib/resources/responses/response.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/action.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/batch.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/count.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/entity.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/function.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/media.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/navigation-property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/reference.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/value.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/annotation.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/callable.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/element.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/entity-container.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/enum-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/parsers/callable.mjs +1 -1
- package/esm2022/lib/schema/parsers/edm.mjs +99 -0
- package/{esm2020 → esm2022}/lib/schema/parsers/enum-type.mjs +2 -2
- package/esm2022/lib/schema/parsers/structured-type.mjs +502 -0
- package/{esm2020 → esm2022}/lib/schema/schema.mjs +1 -1
- package/esm2022/lib/schema/structured-type.mjs +207 -0
- package/esm2022/lib/services/base.mjs +29 -0
- package/{esm2020 → esm2022}/lib/services/entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/services/factory.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/settings.mjs +1 -1
- package/{esm2020 → esm2022}/lib/types.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/arrays.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/durations.mjs +1 -1
- package/esm2022/lib/utils/enums.mjs +61 -0
- package/{esm2020 → esm2022}/lib/utils/http.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/objects.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/odata.mjs +1 -1
- package/esm2022/lib/utils/types.mjs +136 -0
- package/{fesm2020 → fesm2022}/angular-odata.mjs +544 -373
- package/fesm2022/angular-odata.mjs.map +1 -0
- package/lib/helper.d.ts +1 -1
- package/lib/models/model.d.ts +4 -2
- package/lib/models/options.d.ts +7 -8
- package/lib/resources/path/segments.d.ts +15 -6
- package/lib/resources/query/builder.d.ts +21 -20
- package/lib/resources/query/expressions/base.d.ts +6 -4
- package/lib/resources/query/expressions/compute.d.ts +10 -8
- package/lib/resources/query/expressions/count.d.ts +14 -11
- package/lib/resources/query/expressions/expand.d.ts +23 -19
- package/lib/resources/query/expressions/filter.d.ts +22 -20
- package/lib/resources/query/expressions/orderby.d.ts +12 -9
- package/lib/resources/query/expressions/search.d.ts +12 -9
- package/lib/resources/query/expressions/select.d.ts +9 -7
- package/lib/resources/query/expressions/syntax.d.ts +75 -71
- package/lib/resources/query/handlers.d.ts +2 -2
- package/lib/resources/query/options.d.ts +15 -6
- package/lib/resources/resource.d.ts +2 -2
- package/lib/resources/responses/types.d.ts +3 -3
- package/lib/resources/types/options.d.ts +7 -7
- package/lib/schema/parsers/structured-type.d.ts +8 -5
- package/lib/schema/structured-type.d.ts +2 -1
- package/lib/types.d.ts +15 -15
- package/lib/utils/durations.d.ts +1 -1
- package/lib/utils/enums.d.ts +3 -0
- package/lib/utils/types.d.ts +1 -0
- package/package.json +9 -15
- package/esm2020/lib/api.mjs +0 -373
- package/esm2020/lib/cache/cache.mjs +0 -173
- package/esm2020/lib/client.mjs +0 -252
- package/esm2020/lib/models/collection.mjs +0 -861
- package/esm2020/lib/models/model.mjs +0 -507
- package/esm2020/lib/models/options.mjs +0 -1110
- package/esm2020/lib/resources/path/segments.mjs +0 -124
- package/esm2020/lib/resources/query/builder.mjs +0 -588
- package/esm2020/lib/resources/query/expressions/base.mjs +0 -20
- package/esm2020/lib/resources/query/expressions/compute.mjs +0 -39
- package/esm2020/lib/resources/query/expressions/count.mjs +0 -89
- package/esm2020/lib/resources/query/expressions/expand.mjs +0 -115
- package/esm2020/lib/resources/query/expressions/filter.mjs +0 -161
- package/esm2020/lib/resources/query/expressions/orderby.mjs +0 -56
- package/esm2020/lib/resources/query/expressions/search.mjs +0 -122
- package/esm2020/lib/resources/query/expressions/select.mjs +0 -31
- package/esm2020/lib/resources/query/expressions/syntax.mjs +0 -409
- package/esm2020/lib/resources/query/options.mjs +0 -115
- package/esm2020/lib/resources/resource.mjs +0 -251
- package/esm2020/lib/resources/responses/csdl/csdl-annotation.mjs +0 -33
- package/esm2020/lib/resources/responses/metadata.mjs +0 -547
- package/esm2020/lib/schema/parsers/edm.mjs +0 -104
- package/esm2020/lib/schema/parsers/structured-type.mjs +0 -490
- package/esm2020/lib/schema/structured-type.mjs +0 -202
- package/esm2020/lib/services/base.mjs +0 -29
- package/esm2020/lib/utils/enums.mjs +0 -45
- package/esm2020/lib/utils/types.mjs +0 -133
- package/fesm2015/angular-odata.mjs +0 -11811
- package/fesm2015/angular-odata.mjs.map +0 -1
- package/fesm2020/angular-odata.mjs.map +0 -1
- /package/{esm2020 → esm2022}/angular-odata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/memory.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/handlers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/expressions/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/types.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/metadata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/entity-set.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/parsers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/entity.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/arraybuffers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/dates.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/strings.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/urls.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
import { COMPUTED, DEFAULT_VERSION, DESCRIPTION, LONG_DESCRIPTION, } from '../../constants';
|
|
2
|
-
import { ODataHelper } from '../../helper';
|
|
3
|
-
import { raw } from '../../resources/query';
|
|
4
|
-
import { NONE_PARSER, EdmType, } from '../../types';
|
|
5
|
-
import { Objects, Strings, Types } from '../../utils';
|
|
6
|
-
import { ODataAnnotatable } from '../annotation';
|
|
7
|
-
import { ODataEnumTypeParser } from './enum-type';
|
|
8
|
-
export class ODataEntityTypeKey {
|
|
9
|
-
constructor({ name, alias }) {
|
|
10
|
-
this.name = name;
|
|
11
|
-
this.alias = alias;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
export class ODataReferential {
|
|
15
|
-
constructor({ property, referencedProperty, }) {
|
|
16
|
-
this.property = property;
|
|
17
|
-
this.referencedProperty = referencedProperty;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
export class ODataStructuredTypeFieldParser extends ODataAnnotatable {
|
|
21
|
-
constructor(name, structuredType, field) {
|
|
22
|
-
super(field);
|
|
23
|
-
this.name = name;
|
|
24
|
-
this.structuredType = structuredType;
|
|
25
|
-
this.type = field.type;
|
|
26
|
-
this.parser = NONE_PARSER;
|
|
27
|
-
this.referentials = (field.referentials || []).map((referential) => new ODataReferential(referential));
|
|
28
|
-
this.default = field.default;
|
|
29
|
-
this.maxLength = field.maxLength;
|
|
30
|
-
this.nullable = field.nullable ?? true;
|
|
31
|
-
this.collection = Boolean(field.collection);
|
|
32
|
-
this.navigation = Boolean(field.navigation);
|
|
33
|
-
this.precision = field.precision;
|
|
34
|
-
this.scale = field.scale;
|
|
35
|
-
}
|
|
36
|
-
validate(value, { method, navigation = false, } = {}) {
|
|
37
|
-
let errors;
|
|
38
|
-
if (this.collection && Array.isArray(value)) {
|
|
39
|
-
errors = value.map((v) => this.validate(v, { method, navigation }));
|
|
40
|
-
}
|
|
41
|
-
else if ((this.isStructuredType() &&
|
|
42
|
-
typeof value === 'object' &&
|
|
43
|
-
value !== null) ||
|
|
44
|
-
(this.navigation && value !== undefined)) {
|
|
45
|
-
errors =
|
|
46
|
-
this.structured().validate(value, { method, navigation }) ||
|
|
47
|
-
{};
|
|
48
|
-
}
|
|
49
|
-
else if (this.isEnumType() &&
|
|
50
|
-
(typeof value === 'string' || typeof value === 'number')) {
|
|
51
|
-
errors = this.enum().validate(value, { method, navigation });
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
// IsEdmType
|
|
55
|
-
const computed = this.annotatedValue(COMPUTED);
|
|
56
|
-
errors = [];
|
|
57
|
-
if (!this.nullable &&
|
|
58
|
-
(value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
|
|
59
|
-
!(computed && method === 'create') // Not (Is Computed field and create) ?
|
|
60
|
-
) {
|
|
61
|
-
errors.push(`required`);
|
|
62
|
-
}
|
|
63
|
-
if (this.maxLength !== undefined &&
|
|
64
|
-
typeof value === 'string' &&
|
|
65
|
-
value.length > this.maxLength) {
|
|
66
|
-
errors.push(`maxlength`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
70
|
-
}
|
|
71
|
-
//#region Deserialize
|
|
72
|
-
parse(parser, value, options) {
|
|
73
|
-
const type = options !== undefined && Types.isPlainObject(value)
|
|
74
|
-
? ODataHelper[options?.version || DEFAULT_VERSION].type(value)
|
|
75
|
-
: undefined;
|
|
76
|
-
if (type !== undefined) {
|
|
77
|
-
return parser
|
|
78
|
-
.childParser((c) => c.isTypeOf(type))
|
|
79
|
-
.deserialize(value, options);
|
|
80
|
-
}
|
|
81
|
-
return parser.deserialize(value, options);
|
|
82
|
-
}
|
|
83
|
-
deserialize(value, options) {
|
|
84
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
85
|
-
if (this.parser instanceof ODataStructuredTypeParser) {
|
|
86
|
-
const parser = this.parser;
|
|
87
|
-
return Array.isArray(value)
|
|
88
|
-
? value.map((v) => this.parse(parser, v, parserOptions))
|
|
89
|
-
: this.parse(parser, value, parserOptions);
|
|
90
|
-
}
|
|
91
|
-
return this.parser.deserialize(value, {
|
|
92
|
-
field: this,
|
|
93
|
-
...parserOptions,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
//#endregion
|
|
97
|
-
//#region Serialize
|
|
98
|
-
toJson(parser, value, options) {
|
|
99
|
-
const type = options !== undefined && Types.isPlainObject(value)
|
|
100
|
-
? ODataHelper[options?.version || DEFAULT_VERSION].type(value)
|
|
101
|
-
: undefined;
|
|
102
|
-
if (type !== undefined) {
|
|
103
|
-
return parser
|
|
104
|
-
.childParser((c) => c.isTypeOf(type))
|
|
105
|
-
.serialize(value, options);
|
|
106
|
-
}
|
|
107
|
-
return parser.serialize(value, options);
|
|
108
|
-
}
|
|
109
|
-
serialize(value, options) {
|
|
110
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
111
|
-
if (this.parser instanceof ODataStructuredTypeParser) {
|
|
112
|
-
const parser = this.parser;
|
|
113
|
-
return Array.isArray(value)
|
|
114
|
-
? value.map((v) => this.toJson(parser, v, parserOptions))
|
|
115
|
-
: this.toJson(parser, value, parserOptions);
|
|
116
|
-
}
|
|
117
|
-
return this.parser.serialize(value, {
|
|
118
|
-
field: this,
|
|
119
|
-
...parserOptions,
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
//#endregion
|
|
123
|
-
//#region Encode
|
|
124
|
-
encode(value, options) {
|
|
125
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
126
|
-
return this.parser.encode(value, {
|
|
127
|
-
field: this,
|
|
128
|
-
...parserOptions,
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
//#endregion
|
|
132
|
-
configure({ options, parserForType, findOptionsForType, }) {
|
|
133
|
-
this.parserOptions = options;
|
|
134
|
-
this.parser = parserForType(this.type);
|
|
135
|
-
if (this.default !== undefined) {
|
|
136
|
-
this.default = this.deserialize(this.default, options);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
//#region Json Schema
|
|
140
|
-
// https://json-schema.org/
|
|
141
|
-
toJsonSchema(options = {}) {
|
|
142
|
-
let schema = this.parser instanceof ODataStructuredTypeFieldParser ||
|
|
143
|
-
this.parser instanceof ODataStructuredTypeParser ||
|
|
144
|
-
this.parser instanceof ODataEnumTypeParser
|
|
145
|
-
? this.parser.toJsonSchema(options)
|
|
146
|
-
: { title: this.name, type: 'object' };
|
|
147
|
-
if ([
|
|
148
|
-
EdmType.String,
|
|
149
|
-
EdmType.Date,
|
|
150
|
-
EdmType.TimeOfDay,
|
|
151
|
-
EdmType.DateTimeOffset,
|
|
152
|
-
EdmType.Guid,
|
|
153
|
-
EdmType.Binary,
|
|
154
|
-
].indexOf(this.type) !== -1) {
|
|
155
|
-
schema.type = 'string';
|
|
156
|
-
if (this.type === EdmType.Date)
|
|
157
|
-
schema.format = 'date';
|
|
158
|
-
else if (this.type === EdmType.TimeOfDay)
|
|
159
|
-
schema.format = 'time';
|
|
160
|
-
else if (this.type === EdmType.DateTimeOffset)
|
|
161
|
-
schema.format = 'date-time';
|
|
162
|
-
else if (this.type === EdmType.Guid)
|
|
163
|
-
schema.pattern =
|
|
164
|
-
'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$';
|
|
165
|
-
else if (this.type === EdmType.Binary)
|
|
166
|
-
schema.contentEncoding = 'base64';
|
|
167
|
-
else if (this.type === EdmType.String && this.maxLength)
|
|
168
|
-
schema.maxLength = this.maxLength;
|
|
169
|
-
}
|
|
170
|
-
else if ([
|
|
171
|
-
EdmType.Int64,
|
|
172
|
-
EdmType.Int32,
|
|
173
|
-
EdmType.Int16,
|
|
174
|
-
EdmType.Byte,
|
|
175
|
-
EdmType.SByte,
|
|
176
|
-
].indexOf(this.type) !== -1) {
|
|
177
|
-
//TODO: Range
|
|
178
|
-
schema.type = 'integer';
|
|
179
|
-
}
|
|
180
|
-
else if ([EdmType.Decimal, EdmType.Double].indexOf(this.type) !== -1) {
|
|
181
|
-
schema.type = 'number';
|
|
182
|
-
}
|
|
183
|
-
else if ([EdmType.Boolean].indexOf(this.type) !== -1) {
|
|
184
|
-
schema.type = 'boolean';
|
|
185
|
-
}
|
|
186
|
-
if (this.default)
|
|
187
|
-
schema.default = this.default;
|
|
188
|
-
if (this.nullable)
|
|
189
|
-
schema.type = [schema.type, 'null'];
|
|
190
|
-
if (this.collection)
|
|
191
|
-
schema = {
|
|
192
|
-
type: 'array',
|
|
193
|
-
items: schema,
|
|
194
|
-
additionalItems: false,
|
|
195
|
-
};
|
|
196
|
-
return schema;
|
|
197
|
-
}
|
|
198
|
-
//#endregion
|
|
199
|
-
isKey() {
|
|
200
|
-
return (this.structuredType
|
|
201
|
-
.keys({ include_parents: true })
|
|
202
|
-
?.find((k) => k.name === this.name) !== undefined);
|
|
203
|
-
}
|
|
204
|
-
hasReferentials() {
|
|
205
|
-
return this.referentials.length !== 0;
|
|
206
|
-
}
|
|
207
|
-
isEdmType() {
|
|
208
|
-
return this.type.startsWith('Edm.');
|
|
209
|
-
}
|
|
210
|
-
isEnumType() {
|
|
211
|
-
return this.parser instanceof ODataEnumTypeParser;
|
|
212
|
-
}
|
|
213
|
-
enum() {
|
|
214
|
-
if (!this.isEnumType())
|
|
215
|
-
throw new Error('Field are not EnumType');
|
|
216
|
-
return this.parser;
|
|
217
|
-
}
|
|
218
|
-
isStructuredType() {
|
|
219
|
-
return this.parser instanceof ODataStructuredTypeParser;
|
|
220
|
-
}
|
|
221
|
-
structured() {
|
|
222
|
-
if (!this.isStructuredType())
|
|
223
|
-
throw new Error('Field are not StrucuturedType');
|
|
224
|
-
return this.parser;
|
|
225
|
-
}
|
|
226
|
-
field(name) {
|
|
227
|
-
if (this.isStructuredType())
|
|
228
|
-
return this.parser.field(name);
|
|
229
|
-
throw new Error(`The field ${this.name} is not related to a StructuredType`);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
export class ODataStructuredTypeParser extends ODataAnnotatable {
|
|
233
|
-
constructor(config, namespace, alias) {
|
|
234
|
-
super(config);
|
|
235
|
-
this.children = [];
|
|
236
|
-
this._fields = [];
|
|
237
|
-
this.name = config.name;
|
|
238
|
-
this.base = config.base;
|
|
239
|
-
this.open = config.open || false;
|
|
240
|
-
this.namespace = namespace;
|
|
241
|
-
this.alias = alias;
|
|
242
|
-
if (Array.isArray(config.keys))
|
|
243
|
-
this._keys = config.keys.map((key) => new ODataEntityTypeKey(key));
|
|
244
|
-
Object.entries(config.fields).forEach(([name, config]) => this.addField(name, config));
|
|
245
|
-
}
|
|
246
|
-
addField(name, config) {
|
|
247
|
-
const field = new ODataStructuredTypeFieldParser(name, this, config);
|
|
248
|
-
this._fields.push(field);
|
|
249
|
-
return field;
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Create a nicer looking title.
|
|
253
|
-
* Titleize is meant for creating pretty output.
|
|
254
|
-
* @param term The term of the annotation to find.
|
|
255
|
-
* @returns The titleized string.
|
|
256
|
-
*/
|
|
257
|
-
titleize(term) {
|
|
258
|
-
return (term && this.annotatedValue(term)) || Strings.titleCase(this.name);
|
|
259
|
-
}
|
|
260
|
-
isTypeOf(type) {
|
|
261
|
-
var names = [`${this.namespace}.${this.name}`];
|
|
262
|
-
if (this.alias)
|
|
263
|
-
names.push(`${this.alias}.${this.name}`);
|
|
264
|
-
return names.indexOf(type) !== -1;
|
|
265
|
-
}
|
|
266
|
-
isSubtypeOf(type) {
|
|
267
|
-
if (this.isTypeOf(type))
|
|
268
|
-
return true;
|
|
269
|
-
if (this.parent)
|
|
270
|
-
return this.parent.isSubtypeOf(type);
|
|
271
|
-
return false;
|
|
272
|
-
}
|
|
273
|
-
findChildParser(predicate) {
|
|
274
|
-
if (predicate(this))
|
|
275
|
-
return this;
|
|
276
|
-
let match;
|
|
277
|
-
for (let ch of this.children) {
|
|
278
|
-
match = ch.findChildParser(predicate);
|
|
279
|
-
if (match !== undefined)
|
|
280
|
-
break;
|
|
281
|
-
}
|
|
282
|
-
return match;
|
|
283
|
-
}
|
|
284
|
-
childParser(predicate) {
|
|
285
|
-
return this.findChildParser(predicate) || NONE_PARSER;
|
|
286
|
-
}
|
|
287
|
-
// Deserialize
|
|
288
|
-
deserialize(value, options) {
|
|
289
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
290
|
-
const fields = this.fields({
|
|
291
|
-
include_navigation: true,
|
|
292
|
-
include_parents: true,
|
|
293
|
-
}).filter((f) => f.name in value && value[f.name] !== undefined && value[f.name] !== null);
|
|
294
|
-
return {
|
|
295
|
-
...value,
|
|
296
|
-
...fields.reduce((acc, f) => ({
|
|
297
|
-
...acc,
|
|
298
|
-
[f.name]: f.deserialize(value[f.name], parserOptions),
|
|
299
|
-
}), {}),
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
// Serialize
|
|
303
|
-
serialize(value, options) {
|
|
304
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
305
|
-
const fields = this.fields({
|
|
306
|
-
include_navigation: true,
|
|
307
|
-
include_parents: true,
|
|
308
|
-
}).filter((f) => f.name in value &&
|
|
309
|
-
value[f.name] !== undefined &&
|
|
310
|
-
value[f.name] !== null);
|
|
311
|
-
return {
|
|
312
|
-
...value,
|
|
313
|
-
...fields.reduce((acc, f) => ({
|
|
314
|
-
...acc,
|
|
315
|
-
[f.name]: f.serialize(value[f.name], parserOptions),
|
|
316
|
-
}), {}),
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
// Encode
|
|
320
|
-
encode(value, options) {
|
|
321
|
-
const parserOptions = { ...this.parserOptions, ...options };
|
|
322
|
-
return raw(JSON.stringify(this.serialize(value, parserOptions)));
|
|
323
|
-
}
|
|
324
|
-
configure({ options, parserForType, findOptionsForType, }) {
|
|
325
|
-
this.parserOptions = options;
|
|
326
|
-
if (this.base) {
|
|
327
|
-
const parent = parserForType(this.base);
|
|
328
|
-
parent.children.push(this);
|
|
329
|
-
this.parent = parent;
|
|
330
|
-
}
|
|
331
|
-
this._fields.forEach((f) => f.configure({ options, parserForType, findOptionsForType }));
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Returns all fields of the structured type.
|
|
335
|
-
* @param include_navigation Include navigation properties in the result.
|
|
336
|
-
* @param include_parents Include the parent types in the result.
|
|
337
|
-
* @returns All fields of the structured type.
|
|
338
|
-
*/
|
|
339
|
-
fields({ include_navigation, include_parents, }) {
|
|
340
|
-
return [
|
|
341
|
-
...(include_parents && this.parent !== undefined
|
|
342
|
-
? this.parent.fields({ include_parents, include_navigation })
|
|
343
|
-
: []),
|
|
344
|
-
...this._fields.filter((field) => include_navigation || !field.navigation),
|
|
345
|
-
];
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Returns the keys of the structured type.
|
|
349
|
-
* @param include_parents Include the parent fields
|
|
350
|
-
* @returns The keys of the structured type
|
|
351
|
-
*/
|
|
352
|
-
keys({ include_parents, }) {
|
|
353
|
-
return [
|
|
354
|
-
...(include_parents && this.parent !== undefined
|
|
355
|
-
? this.parent.keys({ include_parents })
|
|
356
|
-
: []),
|
|
357
|
-
...(this._keys || []),
|
|
358
|
-
];
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* Find the field parser for the given field name.
|
|
362
|
-
* @param name Name of the field
|
|
363
|
-
* @returns The field parser
|
|
364
|
-
*/
|
|
365
|
-
field(name) {
|
|
366
|
-
let field = this.fields({
|
|
367
|
-
include_parents: true,
|
|
368
|
-
include_navigation: true,
|
|
369
|
-
}).find((field) => field.name === name);
|
|
370
|
-
//Throw error if not found
|
|
371
|
-
if (field === undefined)
|
|
372
|
-
throw new Error(`${this.name} has no field named ${String(name)}`);
|
|
373
|
-
return field;
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Picks the fields from attributes.
|
|
377
|
-
* @param attrs
|
|
378
|
-
* @param include_parents Include the parent fields
|
|
379
|
-
* @param include_navigation Include the navigation fields
|
|
380
|
-
* @param include_etag Include the etag field
|
|
381
|
-
* @returns The picked fields
|
|
382
|
-
*/
|
|
383
|
-
pick(attrs, { include_parents = true, include_navigation = false, include_etag = true, options, } = {}) {
|
|
384
|
-
const parserOptions = options || this.parserOptions;
|
|
385
|
-
const names = this.fields({ include_parents, include_navigation }).map((f) => f.name);
|
|
386
|
-
return Object.keys(attrs)
|
|
387
|
-
.filter((key) => names.indexOf(key) !== -1 ||
|
|
388
|
-
(key ==
|
|
389
|
-
ODataHelper[parserOptions?.version || DEFAULT_VERSION].ODATA_ETAG &&
|
|
390
|
-
include_etag))
|
|
391
|
-
.reduce((acc, key) => Object.assign(acc, { [key]: attrs[key] }), {});
|
|
392
|
-
}
|
|
393
|
-
resolveKey(value, { resolve = true, single = true, } = {}) {
|
|
394
|
-
const keyTypes = this.keys({ include_parents: true });
|
|
395
|
-
const key = new Map();
|
|
396
|
-
for (var kt of keyTypes) {
|
|
397
|
-
let v = value;
|
|
398
|
-
let structured = this;
|
|
399
|
-
let field;
|
|
400
|
-
for (let name of kt.name.split('/')) {
|
|
401
|
-
if (structured === undefined)
|
|
402
|
-
break;
|
|
403
|
-
field = structured
|
|
404
|
-
.fields({ include_navigation: false, include_parents: true })
|
|
405
|
-
.find((f) => f.name === name);
|
|
406
|
-
if (field !== undefined) {
|
|
407
|
-
v = Types.isPlainObject(v) ? v[field.name] : v;
|
|
408
|
-
structured = field.isStructuredType()
|
|
409
|
-
? field.structured()
|
|
410
|
-
: undefined;
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
if (field !== undefined && v !== undefined) {
|
|
414
|
-
key.set(kt.alias || field.name, field.encode(v));
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
if (key.size === 0)
|
|
418
|
-
return undefined;
|
|
419
|
-
return resolve
|
|
420
|
-
? Objects.resolveKey(key, { single })
|
|
421
|
-
: Object.fromEntries(key);
|
|
422
|
-
}
|
|
423
|
-
defaults() {
|
|
424
|
-
let fields = this.fields({
|
|
425
|
-
include_navigation: false,
|
|
426
|
-
include_parents: true,
|
|
427
|
-
}).filter((f) => f.default !== undefined || f.isStructuredType());
|
|
428
|
-
return {
|
|
429
|
-
...fields.reduce((acc, f) => {
|
|
430
|
-
let value = f.isStructuredType()
|
|
431
|
-
? f.structured().defaults()
|
|
432
|
-
: f.default;
|
|
433
|
-
return Types.isEmpty(value) ? acc : { ...acc, [f.name]: value };
|
|
434
|
-
}, {}),
|
|
435
|
-
};
|
|
436
|
-
}
|
|
437
|
-
// Json Schema
|
|
438
|
-
toJsonSchema(options = {}) {
|
|
439
|
-
let schema = {
|
|
440
|
-
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
441
|
-
$id: `${this.namespace}.${this.name}`,
|
|
442
|
-
title: this.titleize(DESCRIPTION),
|
|
443
|
-
description: this.annotatedValue(LONG_DESCRIPTION),
|
|
444
|
-
type: 'object',
|
|
445
|
-
properties: {},
|
|
446
|
-
required: [],
|
|
447
|
-
};
|
|
448
|
-
const fields = this.fields({
|
|
449
|
-
include_navigation: true,
|
|
450
|
-
include_parents: true,
|
|
451
|
-
}).filter((f) => (!f.navigation || (options.expand && f.name in options.expand)) &&
|
|
452
|
-
(!options.select || options.select.indexOf(f.name) !== -1));
|
|
453
|
-
schema.properties = Object.assign({}, schema.properties, fields
|
|
454
|
-
.map((f) => {
|
|
455
|
-
let expand = options.expand && f.name in options.expand
|
|
456
|
-
? options.expand[f.name]
|
|
457
|
-
: undefined;
|
|
458
|
-
let schema = f.toJsonSchema(expand);
|
|
459
|
-
if (options.custom && f.name in options.custom)
|
|
460
|
-
schema = options.custom[f.name](schema, f);
|
|
461
|
-
return { [f.name]: schema };
|
|
462
|
-
})
|
|
463
|
-
.reduce((acc, v) => Object.assign(acc, v), {}));
|
|
464
|
-
schema.required = [
|
|
465
|
-
...schema.required,
|
|
466
|
-
...fields
|
|
467
|
-
.filter((f) => options.required && f.name in options.required
|
|
468
|
-
? options.required[f.name]
|
|
469
|
-
: !f.nullable)
|
|
470
|
-
.map((f) => f.name),
|
|
471
|
-
];
|
|
472
|
-
return schema;
|
|
473
|
-
}
|
|
474
|
-
validate(attrs, { method, navigation = false, } = {}) {
|
|
475
|
-
const errors = {};
|
|
476
|
-
const fields = this.fields({
|
|
477
|
-
include_navigation: true,
|
|
478
|
-
include_parents: true,
|
|
479
|
-
}).filter((f) => !f.navigation || navigation);
|
|
480
|
-
for (var field of fields) {
|
|
481
|
-
const value = attrs[field.name];
|
|
482
|
-
const errs = field.validate(value, { method, navigation });
|
|
483
|
-
if (errs !== undefined) {
|
|
484
|
-
errors[field.name] = errs;
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9wYXJzZXJzL3N0cnVjdHVyZWQtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixXQUFXLEVBQ1gsZ0JBQWdCLEdBQ2pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUMsT0FBTyxFQUNMLFdBQVcsRUFPWCxPQUFPLEdBQ1IsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFtQmxELE1BQU0sT0FBTyxrQkFBa0I7SUFHN0IsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQW9DO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBWSxFQUNWLFFBQVEsRUFDUixrQkFBa0IsR0FJbkI7UUFDQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLDhCQUNYLFNBQVEsZ0JBQWdCO0lBaUJ4QixZQUNFLElBQVksRUFDWixjQUE4QyxFQUM5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TFRfVkVSU0lPTixcbiAgREVTQ1JJUFRJT04sXG4gIExPTkdfREVTQ1JJUFRJT04sXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUhlbHBlciB9IGZyb20gJy4uLy4uL2hlbHBlcic7XG5pbXBvcnQgeyByYXcgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvcXVlcnknO1xuaW1wb3J0IHtcbiAgTk9ORV9QQVJTRVIsXG4gIFBhcnNlck9wdGlvbnMsXG4gIFBhcnNlcixcbiAgU3RydWN0dXJlZFR5cGVDb25maWcsXG4gIFN0cnVjdHVyZWRUeXBlRmllbGRDb25maWcsXG4gIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zLFxuICBGaWVsZFBhcnNlcixcbiAgRWRtVHlwZSxcbn0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgT2JqZWN0cywgU3RyaW5ncywgVHlwZXMgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YUFubm90YXRhYmxlIH0gZnJvbSAnLi4vYW5ub3RhdGlvbic7XG5pbXBvcnQgeyBPRGF0YUVudW1UeXBlUGFyc2VyIH0gZnJvbSAnLi9lbnVtLXR5cGUnO1xuXG4vLyBKU09OIFNDSEVNQVxudHlwZSBKc29uU2NoZW1hU2VsZWN0PFQ+ID0gQXJyYXk8a2V5b2YgVD47XG50eXBlIEpzb25TY2hlbWFDdXN0b208VD4gPSB7XG4gIFtQIGluIGtleW9mIFRdPzogKFxuICAgIHNjaGVtYTogYW55LFxuICAgIGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8VFtQXT5cbiAgKSA9PiBhbnk7XG59O1xudHlwZSBKc29uU2NoZW1hRXhwYW5kPFQ+ID0geyBbUCBpbiBrZXlvZiBUXT86IEpzb25TY2hlbWFPcHRpb25zPFRbUF0+IH07XG50eXBlIEpzb25TY2hlbWFSZXF1aXJlZDxUPiA9IHsgW1AgaW4ga2V5b2YgVF0/OiBib29sZWFuIH07XG5leHBvcnQgdHlwZSBKc29uU2NoZW1hT3B0aW9uczxUPiA9IHtcbiAgc2VsZWN0PzogSnNvblNjaGVtYVNlbGVjdDxUPjtcbiAgY3VzdG9tPzogSnNvblNjaGVtYUN1c3RvbTxUPjtcbiAgZXhwYW5kPzogSnNvblNjaGVtYUV4cGFuZDxUPjtcbiAgcmVxdWlyZWQ/OiBKc29uU2NoZW1hUmVxdWlyZWQ8VD47XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFFbnRpdHlUeXBlS2V5IHtcbiAgbmFtZTogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgY29uc3RydWN0b3IoeyBuYW1lLCBhbGlhcyB9OiB7IG5hbWU6IHN0cmluZzsgYWxpYXM/OiBzdHJpbmcgfSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVJlZmVyZW50aWFsIHtcbiAgcHJvcGVydHk6IHN0cmluZztcbiAgcmVmZXJlbmNlZFByb3BlcnR5OiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwcm9wZXJ0eSxcbiAgICByZWZlcmVuY2VkUHJvcGVydHksXG4gIH06IHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIHJlZmVyZW5jZWRQcm9wZXJ0eTogc3RyaW5nO1xuICB9KSB7XG4gICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIHRoaXMucmVmZXJlbmNlZFByb3BlcnR5ID0gcmVmZXJlbmNlZFByb3BlcnR5O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8VD5cbiAgZXh0ZW5kcyBPRGF0YUFubm90YXRhYmxlXG4gIGltcGxlbWVudHMgRmllbGRQYXJzZXI8VD5cbntcbiAgbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0cnVjdHVyZWRUeXBlOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT47XG4gIHR5cGU6IHN0cmluZyB8IEVkbVR5cGU7XG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI8VD47XG4gIGNvbGxlY3Rpb246IGJvb2xlYW47XG4gIG5hdmlnYXRpb246IGJvb2xlYW47XG4gIG51bGxhYmxlPzogYm9vbGVhbjtcbiAgZGVmYXVsdD86IGFueTtcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyIHwgJ3ZhcmlhYmxlJztcbiAgcmVmZXJlbnRpYWxzOiBPRGF0YVJlZmVyZW50aWFsW107XG4gIHBhcnNlck9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdHJ1Y3R1cmVkVHlwZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+LFxuICAgIGZpZWxkOiBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnXG4gICkge1xuICAgIHN1cGVyKGZpZWxkKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RydWN0dXJlZFR5cGUgPSBzdHJ1Y3R1cmVkVHlwZTtcbiAgICB0aGlzLnR5cGUgPSBmaWVsZC50eXBlO1xuICAgIHRoaXMucGFyc2VyID0gTk9ORV9QQVJTRVI7XG4gICAgdGhpcy5yZWZlcmVudGlhbHMgPSAoZmllbGQucmVmZXJlbnRpYWxzIHx8IFtdKS5tYXAoXG4gICAgICAocmVmZXJlbnRpYWwpID0+IG5ldyBPRGF0YVJlZmVyZW50aWFsKHJlZmVyZW50aWFsKVxuICAgICk7XG4gICAgdGhpcy5kZWZhdWx0ID0gZmllbGQuZGVmYXVsdDtcbiAgICB0aGlzLm1heExlbmd0aCA9IGZpZWxkLm1heExlbmd0aDtcbiAgICB0aGlzLm51bGxhYmxlID0gZmllbGQubnVsbGFibGUgPz8gdHJ1ZTtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBCb29sZWFuKGZpZWxkLmNvbGxlY3Rpb24pO1xuICAgIHRoaXMubmF2aWdhdGlvbiA9IEJvb2xlYW4oZmllbGQubmF2aWdhdGlvbik7XG4gICAgdGhpcy5wcmVjaXNpb24gPSBmaWVsZC5wcmVjaXNpb247XG4gICAgdGhpcy5zY2FsZSA9IGZpZWxkLnNjYWxlO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6XG4gICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXVxuICAgIHwgc3RyaW5nW11cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGVycm9ycztcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBlcnJvcnMgPSB2YWx1ZS5tYXAoKHYpID0+IHRoaXMudmFsaWRhdGUodiwgeyBtZXRob2QsIG5hdmlnYXRpb24gfSkpIGFzIHtcbiAgICAgICAgW25hbWU6IHN0cmluZ106IGFueVtdO1xuICAgICAgfVtdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAodGhpcy5pc1N0cnVjdHVyZWRUeXBlKCkgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB2YWx1ZSAhPT0gbnVsbCkgfHxcbiAgICAgICh0aGlzLm5hdmlnYXRpb24gJiYgdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIGVycm9ycyA9XG4gICAgICAgIHRoaXMuc3RydWN0dXJlZCgpLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fFxuICAgICAgICAoe30gYXMgeyBbbmFtZTogc3RyaW5nXTogYW55W10gfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuaXNFbnVtVHlwZSgpICYmXG4gICAgICAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKVxuICAgICkge1xuICAgICAgZXJyb3JzID0gdGhpcy5lbnVtKCkudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJc0VkbVR5cGVcbiAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5hbm5vdGF0ZWRWYWx1ZTxib29sZWFuPihDT01QVVRFRCk7XG4gICAgICBlcnJvcnMgPSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMubnVsbGFibGUgJiZcbiAgICAgICAgKHZhbHVlID09PSBudWxsIHx8ICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG1ldGhvZCAhPT0gJ21vZGlmeScpKSAmJiAvLyBJcyBudWxsIG9yIHVuZGVmaW5lZCB3aXRob3V0IHBhdGNoP1xuICAgICAgICAhKGNvbXB1dGVkICYmIG1ldGhvZCA9PT0gJ2NyZWF0ZScpIC8vIE5vdCAoSXMgQ29tcHV0ZWQgZmllbGQgYW5kIGNyZWF0ZSkgP1xuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGByZXF1aXJlZGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdmFsdWUubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaChgbWF4bGVuZ3RoYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8jcmVnaW9uIERlc2VyaWFsaXplXG4gIHByaXZhdGUgcGFyc2UoXG4gICAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+LFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9ucz86IFBhcnNlck9wdGlvbnNcbiAgKTogYW55IHtcbiAgICBjb25zdCB0eXBlID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBUeXBlcy5pc1BsYWluT2JqZWN0KHZhbHVlKVxuICAgICAgICA/IE9EYXRhSGVscGVyW29wdGlvbnM/LnZlcnNpb24gfHwgREVGQVVMVF9WRVJTSU9OXS50eXBlKHZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcGFyc2VyXG4gICAgICAgIC5jaGlsZFBhcnNlcigoYykgPT4gYy5pc1R5cGVPZih0eXBlKSlcbiAgICAgICAgLmRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlci5kZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IFQge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMucGFyc2VyT3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIGlmICh0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXIpIHtcbiAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD47XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS5tYXAoKHYpID0+IHRoaXMucGFyc2UocGFyc2VyLCB2LCBwYXJzZXJPcHRpb25zKSlcbiAgICAgICAgOiB0aGlzLnBhcnNlKHBhcnNlciwgdmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIHtcbiAgICAgIGZpZWxkOiB0aGlzLFxuICAgICAgLi4ucGFyc2VyT3B0aW9ucyxcbiAgICB9IGFzIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2VyaWFsaXplXG4gIHByaXZhdGUgdG9Kc29uKFxuICAgIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPixcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zXG4gICk6IGFueSB7XG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgVHlwZXMuaXNQbGFpbk9iamVjdCh2YWx1ZSlcbiAgICAgICAgPyBPRGF0YUhlbHBlcltvcHRpb25zPy52ZXJzaW9uIHx8IERFRkFVTFRfVkVSU0lPTl0udHlwZSh2YWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBhcnNlclxuICAgICAgICAuY2hpbGRQYXJzZXIoKGMpID0+IGMuaXNUeXBlT2YodHlwZSkpXG4gICAgICAgIC5zZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBzZXJpYWxpemUodmFsdWU6IFQsIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0geyAuLi50aGlzLnBhcnNlck9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICBpZiAodGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyKSB7XG4gICAgICBjb25zdCBwYXJzZXIgPSB0aGlzLnBhcnNlciBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+O1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgID8gKHZhbHVlIGFzIGFueVtdKS5tYXAoKHYpID0+IHRoaXMudG9Kc29uKHBhcnNlciwgdiwgcGFyc2VyT3B0aW9ucykpXG4gICAgICAgIDogdGhpcy50b0pzb24ocGFyc2VyLCB2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlci5zZXJpYWxpemUodmFsdWUsIHtcbiAgICAgIGZpZWxkOiB0aGlzLFxuICAgICAgLi4ucGFyc2VyT3B0aW9ucyxcbiAgICB9IGFzIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRW5jb2RlXG4gIGVuY29kZSh2YWx1ZTogVCwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMucGFyc2VyT3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5lbmNvZGUodmFsdWUsIHtcbiAgICAgIGZpZWxkOiB0aGlzLFxuICAgICAgLi4ucGFyc2VyT3B0aW9ucyxcbiAgICB9IGFzIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBjb25maWd1cmUoe1xuICAgIG9wdGlvbnMsXG4gICAgcGFyc2VyRm9yVHlwZSxcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gIH06IHtcbiAgICBvcHRpb25zOiBQYXJzZXJPcHRpb25zO1xuICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IFBhcnNlcjxhbnk+O1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gYW55O1xuICB9KSB7XG4gICAgdGhpcy5wYXJzZXJPcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnBhcnNlciA9IHBhcnNlckZvclR5cGUodGhpcy50eXBlKTtcbiAgICBpZiAodGhpcy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGVmYXVsdCA9IHRoaXMuZGVzZXJpYWxpemUodGhpcy5kZWZhdWx0LCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvLyNyZWdpb24gSnNvbiBTY2hlbWFcbiAgLy8gaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvXG4gIHRvSnNvblNjaGVtYShvcHRpb25zOiBKc29uU2NoZW1hT3B0aW9uczxUPiA9IHt9KSB7XG4gICAgbGV0IHNjaGVtYTogYW55ID1cbiAgICAgIHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyIHx8XG4gICAgICB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXIgfHxcbiAgICAgIHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFFbnVtVHlwZVBhcnNlclxuICAgICAgICA/IHRoaXMucGFyc2VyLnRvSnNvblNjaGVtYShvcHRpb25zKVxuICAgICAgICA6ICh7IHRpdGxlOiB0aGlzLm5hbWUsIHR5cGU6ICdvYmplY3QnIH0gYXMgYW55KTtcblxuICAgIGlmIChcbiAgICAgIFtcbiAgICAgICAgRWRtVHlwZS5TdHJpbmcsXG4gICAgICAgIEVkbVR5cGUuRGF0ZSxcbiAgICAgICAgRWRtVHlwZS5UaW1lT2ZEYXksXG4gICAgICAgIEVkbVR5cGUuRGF0ZVRpbWVPZmZzZXQsXG4gICAgICAgIEVkbVR5cGUuR3VpZCxcbiAgICAgICAgRWRtVHlwZS5CaW5hcnksXG4gICAgICBdLmluZGV4T2YodGhpcy50eXBlIGFzIEVkbVR5cGUpICE9PSAtMVxuICAgICkge1xuICAgICAgc2NoZW1hLnR5cGUgPSAnc3RyaW5nJztcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IEVkbVR5cGUuRGF0ZSkgc2NoZW1hLmZvcm1hdCA9ICdkYXRlJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gRWRtVHlwZS5UaW1lT2ZEYXkpIHNjaGVtYS5mb3JtYXQgPSAndGltZSc7XG4gICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09IEVkbVR5cGUuRGF0ZVRpbWVPZmZzZXQpXG4gICAgICAgIHNjaGVtYS5mb3JtYXQgPSAnZGF0ZS10aW1lJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gRWRtVHlwZS5HdWlkKVxuICAgICAgICBzY2hlbWEucGF0dGVybiA9XG4gICAgICAgICAgJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gRWRtVHlwZS5CaW5hcnkpIHNjaGVtYS5jb250ZW50RW5jb2RpbmcgPSAnYmFzZTY0JztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gRWRtVHlwZS5TdHJpbmcgJiYgdGhpcy5tYXhMZW5ndGgpXG4gICAgICAgIHNjaGVtYS5tYXhMZW5ndGggPSB0aGlzLm1heExlbmd0aDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgW1xuICAgICAgICBFZG1UeXBlLkludDY0LFxuICAgICAgICBFZG1UeXBlLkludDMyLFxuICAgICAgICBFZG1UeXBlLkludDE2LFxuICAgICAgICBFZG1UeXBlLkJ5dGUsXG4gICAgICAgIEVkbVR5cGUuU0J5dGUsXG4gICAgICBdLmluZGV4T2YodGhpcy50eXBlIGFzIEVkbVR5cGUpICE9PSAtMVxuICAgICkge1xuICAgICAgLy9UT0RPOiBSYW5nZVxuICAgICAgc2NoZW1hLnR5cGUgPSAnaW50ZWdlcic7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIFtFZG1UeXBlLkRlY2ltYWwsIEVkbVR5cGUuRG91YmxlXS5pbmRleE9mKHRoaXMudHlwZSBhcyBFZG1UeXBlKSAhPT0gLTFcbiAgICApIHtcbiAgICAgIHNjaGVtYS50eXBlID0gJ251bWJlcic7XG4gICAgfSBlbHNlIGlmIChbRWRtVHlwZS5Cb29sZWFuXS5pbmRleE9mKHRoaXMudHlwZSBhcyBFZG1UeXBlKSAhPT0gLTEpIHtcbiAgICAgIHNjaGVtYS50eXBlID0gJ2Jvb2xlYW4nO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWZhdWx0KSBzY2hlbWEuZGVmYXVsdCA9IHRoaXMuZGVmYXVsdDtcbiAgICBpZiAodGhpcy5udWxsYWJsZSkgc2NoZW1hLnR5cGUgPSBbc2NoZW1hLnR5cGUsICdudWxsJ107XG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbilcbiAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgaXRlbXM6IHNjaGVtYSxcbiAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgIH07XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBpc0tleSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdHJ1Y3R1cmVkVHlwZVxuICAgICAgICAua2V5cyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICA/LmZpbmQoKGspID0+IGsubmFtZSA9PT0gdGhpcy5uYW1lKSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIGhhc1JlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVudGlhbHMubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgaXNFZG1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUuc3RhcnRzV2l0aCgnRWRtLicpO1xuICB9XG5cbiAgaXNFbnVtVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YUVudW1UeXBlUGFyc2VyO1xuICB9XG5cbiAgZW51bSgpIHtcbiAgICBpZiAoIXRoaXMuaXNFbnVtVHlwZSgpKSB0aHJvdyBuZXcgRXJyb3IoJ0ZpZWxkIGFyZSBub3QgRW51bVR5cGUnKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgYXMgT0RhdGFFbnVtVHlwZVBhcnNlcjxUPjtcbiAgfVxuXG4gIGlzU3RydWN0dXJlZFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjtcbiAgfVxuXG4gIHN0cnVjdHVyZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmllbGQgYXJlIG5vdCBTdHJ1Y3V0dXJlZFR5cGUnKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPjtcbiAgfVxuXG4gIGZpZWxkPEY+KG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSlcbiAgICAgIHJldHVybiAodGhpcy5wYXJzZXIgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPikuZmllbGQ8Rj4oXG4gICAgICAgIG5hbWUgYXMga2V5b2YgVFxuICAgICAgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIGZpZWxkICR7dGhpcy5uYW1lfSBpcyBub3QgcmVsYXRlZCB0byBhIFN0cnVjdHVyZWRUeXBlYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD5cbiAgZXh0ZW5kcyBPRGF0YUFubm90YXRhYmxlXG4gIGltcGxlbWVudHMgUGFyc2VyPFQ+XG57XG4gIG5hbWU6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIG9wZW46IGJvb2xlYW47XG4gIGNoaWxkcmVuOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT5bXSA9IFtdO1xuICBhbGlhcz86IHN0cmluZztcbiAgYmFzZT86IHN0cmluZztcbiAgcGFyZW50PzogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+O1xuICBwcml2YXRlIF9rZXlzPzogT0RhdGFFbnRpdHlUeXBlS2V5W107XG4gIHByaXZhdGUgX2ZpZWxkczogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT5bXSA9IFtdO1xuICBwYXJzZXJPcHRpb25zPzogUGFyc2VyT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb25maWc6IFN0cnVjdHVyZWRUeXBlQ29uZmlnPFQ+LFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5iYXNlID0gY29uZmlnLmJhc2U7XG4gICAgdGhpcy5vcGVuID0gY29uZmlnLm9wZW4gfHwgZmFsc2U7XG4gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5rZXlzKSlcbiAgICAgIHRoaXMuX2tleXMgPSBjb25maWcua2V5cy5tYXAoKGtleSkgPT4gbmV3IE9EYXRhRW50aXR5VHlwZUtleShrZXkpKTtcbiAgICBPYmplY3QuZW50cmllczxTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnPihcbiAgICAgIGNvbmZpZy5maWVsZHMgYXMgeyBbUCBpbiBrZXlvZiBUXTogU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyB9XG4gICAgKS5mb3JFYWNoKChbbmFtZSwgY29uZmlnXSkgPT4gdGhpcy5hZGRGaWVsZChuYW1lLCBjb25maWcpKTtcbiAgfVxuXG4gIGFkZEZpZWxkPEY+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjb25maWc6IFN0cnVjdHVyZWRUeXBlRmllbGRDb25maWdcbiAgKTogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+IHtcbiAgICBjb25zdCBmaWVsZCA9IG5ldyBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj4obmFtZSwgdGhpcywgY29uZmlnKTtcbiAgICB0aGlzLl9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5pY2VyIGxvb2tpbmcgdGl0bGUuXG4gICAqIFRpdGxlaXplIGlzIG1lYW50IGZvciBjcmVhdGluZyBwcmV0dHkgb3V0cHV0LlxuICAgKiBAcGFyYW0gdGVybSBUaGUgdGVybSBvZiB0aGUgYW5ub3RhdGlvbiB0byBmaW5kLlxuICAgKiBAcmV0dXJucyBUaGUgdGl0bGVpemVkIHN0cmluZy5cbiAgICovXG4gIHRpdGxlaXplKHRlcm0/OiBzdHJpbmcgfCBSZWdFeHApOiBzdHJpbmcge1xuICAgIHJldHVybiAodGVybSAmJiB0aGlzLmFubm90YXRlZFZhbHVlKHRlcm0pKSB8fCBTdHJpbmdzLnRpdGxlQ2FzZSh0aGlzLm5hbWUpO1xuICB9XG5cbiAgaXNUeXBlT2YodHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIG5hbWVzID0gW2Ake3RoaXMubmFtZXNwYWNlfS4ke3RoaXMubmFtZX1gXTtcbiAgICBpZiAodGhpcy5hbGlhcykgbmFtZXMucHVzaChgJHt0aGlzLmFsaWFzfS4ke3RoaXMubmFtZX1gKTtcbiAgICByZXR1cm4gbmFtZXMuaW5kZXhPZih0eXBlKSAhPT0gLTE7XG4gIH1cblxuICBpc1N1YnR5cGVPZih0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1R5cGVPZih0eXBlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuaXNTdWJ0eXBlT2YodHlwZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZmluZENoaWxkUGFyc2VyKFxuICAgIHByZWRpY2F0ZTogKHA6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PikgPT4gYm9vbGVhblxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChwcmVkaWNhdGUodGhpcykpIHJldHVybiB0aGlzO1xuICAgIGxldCBtYXRjaDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IGNoIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIG1hdGNoID0gY2guZmluZENoaWxkUGFyc2VyKHByZWRpY2F0ZSk7XG4gICAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIGNoaWxkUGFyc2VyKFxuICAgIHByZWRpY2F0ZTogKHA6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PikgPT4gYm9vbGVhblxuICApOiBQYXJzZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZENoaWxkUGFyc2VyKHByZWRpY2F0ZSkgfHwgTk9ORV9QQVJTRVI7XG4gIH1cblxuICAvLyBEZXNlcmlhbGl6ZVxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IFQge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMucGFyc2VyT3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgZi5uYW1lIGluIHZhbHVlICYmIHZhbHVlW2YubmFtZV0gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZVtmLm5hbWVdICE9PSBudWxsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICAuLi5maWVsZHMucmVkdWNlKFxuICAgICAgICAoYWNjLCBmKSA9PiAoe1xuICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICBbZi5uYW1lXTogZi5kZXNlcmlhbGl6ZSh2YWx1ZVtmLm5hbWVdLCBwYXJzZXJPcHRpb25zKSxcbiAgICAgICAgfSksXG4gICAgICAgIHt9XG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICAvLyBTZXJpYWxpemVcbiAgc2VyaWFsaXplKHZhbHVlOiBQYXJ0aWFsPFQ+LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IHsgLi4udGhpcy5wYXJzZXJPcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pLmZpbHRlcihcbiAgICAgIChmKSA9PlxuICAgICAgICBmLm5hbWUgaW4gdmFsdWUgJiZcbiAgICAgICAgKHZhbHVlIGFzIGFueSlbZi5uYW1lXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICh2YWx1ZSBhcyBhbnkpW2YubmFtZV0gIT09IG51bGxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIC4uLmZpZWxkcy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGYpID0+ICh7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIFtmLm5hbWVdOiBmLnNlcmlhbGl6ZSgodmFsdWUgYXMgYW55KVtmLm5hbWVdLCBwYXJzZXJPcHRpb25zKSxcbiAgICAgICAgfSksXG4gICAgICAgIHt9XG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICAvLyBFbmNvZGVcbiAgZW5jb2RlKHZhbHVlOiBULCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IHsgLi4udGhpcy5wYXJzZXJPcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgcmV0dXJuIHJhdyhKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucykpKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgb3B0aW9ucyxcbiAgICBwYXJzZXJGb3JUeXBlLFxuICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgfToge1xuICAgIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG4gICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gUGFyc2VyPGFueT47XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBhbnk7XG4gIH0pIHtcbiAgICB0aGlzLnBhcnNlck9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGlmICh0aGlzLmJhc2UpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHBhcnNlckZvclR5cGUodGhpcy5iYXNlKSBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT47XG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICB0aGlzLl9maWVsZHMuZm9yRWFjaCgoZikgPT5cbiAgICAgIGYuY29uZmlndXJlKHsgb3B0aW9ucywgcGFyc2VyRm9yVHlwZSwgZmluZE9wdGlvbnNGb3JUeXBlIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBmaWVsZHMgb2YgdGhlIHN0cnVjdHVyZWQgdHlwZS5cbiAgICogQHBhcmFtIGluY2x1ZGVfbmF2aWdhdGlvbiBJbmNsdWRlIG5hdmlnYXRpb24gcHJvcGVydGllcyBpbiB0aGUgcmVzdWx0LlxuICAgKiBAcGFyYW0gaW5jbHVkZV9wYXJlbnRzIEluY2x1ZGUgdGhlIHBhcmVudCB0eXBlcyBpbiB0aGUgcmVzdWx0LlxuICAgKiBAcmV0dXJucyBBbGwgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmVkIHR5cGUuXG4gICAqL1xuICBmaWVsZHMoe1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICBpbmNsdWRlX3BhcmVudHMsXG4gIH06IHtcbiAgICBpbmNsdWRlX3BhcmVudHM6IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBib29sZWFuO1xuICB9KTogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihpbmNsdWRlX3BhcmVudHMgJiYgdGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMucGFyZW50LmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50cywgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pXG4gICAgICAgIDogW10pLFxuICAgICAgLi4udGhpcy5fZmllbGRzLmZpbHRlcihcbiAgICAgICAgKGZpZWxkKSA9PiBpbmNsdWRlX25hdmlnYXRpb24gfHwgIWZpZWxkLm5hdmlnYXRpb25cbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSBzdHJ1Y3R1cmVkIHR5cGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlX3BhcmVudHMgSW5jbHVkZSB0aGUgcGFyZW50IGZpZWxkc1xuICAgKiBAcmV0dXJucyBUaGUga2V5cyBvZiB0aGUgc3RydWN0dXJlZCB0eXBlXG4gICAqL1xuICBrZXlzKHtcbiAgICBpbmNsdWRlX3BhcmVudHMsXG4gIH06IHtcbiAgICBpbmNsdWRlX3BhcmVudHM6IGJvb2xlYW47XG4gIH0pOiBPRGF0YUVudGl0eVR5cGVLZXlbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihpbmNsdWRlX3BhcmVudHMgJiYgdGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMucGFyZW50LmtleXMoeyBpbmNsdWRlX3BhcmVudHMgfSlcbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4odGhpcy5fa2V5cyB8fCBbXSksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBmaWVsZCBwYXJzZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgcGFyc2VyXG4gICAqL1xuICBmaWVsZDxGPihuYW1lOiBrZXlvZiBUKTogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+IHtcbiAgICBsZXQgZmllbGQgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgfSkuZmluZCgoZmllbGQ6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxGPikgPT4gZmllbGQubmFtZSA9PT0gbmFtZSk7XG4gICAgLy9UaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5hbWV9IGhhcyBubyBmaWVsZCBuYW1lZCAke1N0cmluZyhuYW1lKX1gKTtcbiAgICByZXR1cm4gZmllbGQ7XG4gIH1cblxuICAvKipcbiAgICogUGlja3MgdGhlIGZpZWxkcyBmcm9tIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSBhdHRyc1xuICAgKiBAcGFyYW0gaW5jbHVkZV9wYXJlbnRzIEluY2x1ZGUgdGhlIHBhcmVudCBmaWVsZHNcbiAgICogQHBhcmFtIGluY2x1ZGVfbmF2aWdhdGlvbiBJbmNsdWRlIHRoZSBuYXZpZ2F0aW9uIGZpZWxkc1xuICAgKiBAcGFyYW0gaW5jbHVkZV9ldGFnIEluY2x1ZGUgdGhlIGV0YWcgZmllbGRcbiAgICogQHJldHVybnMgVGhlIHBpY2tlZCBmaWVsZHNcbiAgICovXG4gIHBpY2soXG4gICAgYXR0cnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIGluY2x1ZGVfcGFyZW50cyA9IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfZXRhZyA9IHRydWUsXG4gICAgICBvcHRpb25zLFxuICAgIH06IHtcbiAgICAgIGluY2x1ZGVfcGFyZW50cz86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9ldGFnPzogYm9vbGVhbjtcbiAgICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICAgIH0gPSB7fVxuICApOiBQYXJ0aWFsPFQ+IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLnBhcnNlck9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSB0aGlzLmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50cywgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pLm1hcChcbiAgICAgIChmKSA9PiBmLm5hbWVcbiAgICApO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhhdHRycylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChrZXkpID0+XG4gICAgICAgICAgbmFtZXMuaW5kZXhPZihrZXkpICE9PSAtMSB8fFxuICAgICAgICAgIChrZXkgPT1cbiAgICAgICAgICAgIE9EYXRhSGVscGVyW3BhcnNlck9wdGlvbnM/LnZlcnNpb24gfHwgREVGQVVMVF9WRVJTSU9OXS5PREFUQV9FVEFHICYmXG4gICAgICAgICAgICBpbmNsdWRlX2V0YWcpXG4gICAgICApXG4gICAgICAucmVkdWNlKChhY2MsIGtleSkgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2tleV06IGF0dHJzW2tleV0gfSksIHt9KTtcbiAgfVxuXG4gIHJlc29sdmVLZXkoXG4gICAgdmFsdWU6IGFueSxcbiAgICB7XG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICAgIHNpbmdsZSA9IHRydWUsXG4gICAgfTogeyByZXNvbHZlPzogYm9vbGVhbjsgc2luZ2xlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogYW55IHtcbiAgICBjb25zdCBrZXlUeXBlcyA9IHRoaXMua2V5cyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KTtcbiAgICBjb25zdCBrZXkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGZvciAodmFyIGt0IG9mIGtleVR5cGVzKSB7XG4gICAgICBsZXQgdiA9IHZhbHVlIGFzIGFueTtcbiAgICAgIGxldCBzdHJ1Y3R1cmVkID0gdGhpcyBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmllbGQ6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChsZXQgbmFtZSBvZiBrdC5uYW1lLnNwbGl0KCcvJykpIHtcbiAgICAgICAgaWYgKHN0cnVjdHVyZWQgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgIGZpZWxkID0gc3RydWN0dXJlZFxuICAgICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLCBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgICAuZmluZCgoZjogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT4pID0+IGYubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdiA9IFR5cGVzLmlzUGxhaW5PYmplY3QodikgPyB2W2ZpZWxkLm5hbWVdIDogdjtcbiAgICAgICAgICBzdHJ1Y3R1cmVkID0gZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICAgICAgICA/IGZpZWxkLnN0cnVjdHVyZWQoKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkICYmIHYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZXkuc2V0KGt0LmFsaWFzIHx8IGZpZWxkLm5hbWUsIGZpZWxkLmVuY29kZSh2KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZXkuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkoa2V5LCB7IHNpbmdsZSB9KVxuICAgICAgOiBPYmplY3QuZnJvbUVudHJpZXMoa2V5KTtcbiAgfVxuXG4gIGRlZmF1bHRzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBsZXQgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoKGYpID0+IGYuZGVmYXVsdCAhPT0gdW5kZWZpbmVkIHx8IGYuaXNTdHJ1Y3R1cmVkVHlwZSgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmllbGRzLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTogYW55ID0gZi5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICAgICAgICA/IGYuc3RydWN0dXJlZCgpLmRlZmF1bHRzKClcbiAgICAgICAgICA6IGYuZGVmYXVsdDtcbiAgICAgICAgcmV0dXJuIFR5cGVzLmlzRW1wdHkodmFsdWUpID8gYWNjIDogeyAuLi5hY2MsIFtmLm5hbWVdOiB2YWx1ZSB9O1xuICAgICAgfSwge30pLFxuICAgIH07XG4gIH1cblxuICAvLyBKc29uIFNjaGVtYVxuICB0b0pzb25TY2hlbWEob3B0aW9uczogSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGxldCBzY2hlbWE6IGFueSA9IHtcbiAgICAgICRzY2hlbWE6ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMnLFxuICAgICAgJGlkOiBgJHt0aGlzLm5hbWVzcGFjZX0uJHt0aGlzLm5hbWV9YCxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlaXplKERFU0NSSVBUSU9OKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmFubm90YXRlZFZhbHVlKExPTkdfREVTQ1JJUFRJT04pLFxuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgKCFmLm5hdmlnYXRpb24gfHwgKG9wdGlvbnMuZXhwYW5kICYmIGYubmFtZSBpbiBvcHRpb25zLmV4cGFuZCkpICYmXG4gICAgICAgICghb3B0aW9ucy5zZWxlY3QgfHwgKDxzdHJpbmdbXT5vcHRpb25zLnNlbGVjdCkuaW5kZXhPZihmLm5hbWUpICE9PSAtMSlcbiAgICApO1xuICAgIHNjaGVtYS5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgc2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICBmaWVsZHNcbiAgICAgICAgLm1hcCgoZikgPT4ge1xuICAgICAgICAgIGxldCBleHBhbmQgPVxuICAgICAgICAgICAgb3B0aW9ucy5leHBhbmQgJiYgZi5uYW1lIGluIG9wdGlvbnMuZXhwYW5kXG4gICAgICAgICAgICAgID8gKG9wdGlvbnMuZXhwYW5kIGFzIGFueSlbZi5uYW1lXVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBsZXQgc2NoZW1hID0gZi50b0pzb25TY2hlbWEoZXhwYW5kKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jdXN0b20gJiYgZi5uYW1lIGluIG9wdGlvbnMuY3VzdG9tKVxuICAgICAgICAgICAgc2NoZW1hID0gKFxuICAgICAgICAgICAgICBvcHRpb25zLmN1c3RvbVtmLm5hbWUgYXMga2V5b2YgVF0gYXMgKFxuICAgICAgICAgICAgICAgIHNjaGVtYTogYW55LFxuICAgICAgICAgICAgICAgIGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PlxuICAgICAgICAgICAgICApID0+IGFueVxuICAgICAgICAgICAgKShzY2hlbWEsIGYpO1xuICAgICAgICAgIHJldHVybiB7IFtmLm5hbWVdOiBzY2hlbWEgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCB2KSA9PiBPYmplY3QuYXNzaWduKGFjYywgdiksIHt9KVxuICAgICk7XG4gICAgc2NoZW1hLnJlcXVpcmVkID0gW1xuICAgICAgLi4uc2NoZW1hLnJlcXVpcmVkLFxuICAgICAgLi4uZmllbGRzXG4gICAgICAgIC5maWx0ZXIoKGYpID0+XG4gICAgICAgICAgb3B0aW9ucy5yZXF1aXJlZCAmJiBmLm5hbWUgaW4gb3B0aW9ucy5yZXF1aXJlZFxuICAgICAgICAgICAgPyBvcHRpb25zLnJlcXVpcmVkW2YubmFtZSBhcyBrZXlvZiBUXVxuICAgICAgICAgICAgOiAhZi5udWxsYWJsZVxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGYpID0+IGYubmFtZSksXG4gICAgXTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgYXR0cnM6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgY3JlYXRlPzogYm9vbGVhbjtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXJyb3JzID0ge30gYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pLmZpbHRlcigoZikgPT4gIWYubmF2aWdhdGlvbiB8fCBuYXZpZ2F0aW9uKTtcbiAgICBmb3IgKHZhciBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXR0cnNbZmllbGQubmFtZSBhcyBrZXlvZiBUXTtcbiAgICAgIGNvbnN0IGVycnMgPSBmaWVsZC52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgICBpZiAoZXJycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yc1tmaWVsZC5uYW1lXSA9IGVycnM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|