velocious 1.0.416 → 1.0.418
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/README.md +37 -2
- package/build/src/background-jobs/store.d.ts +18 -2
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +55 -21
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +113 -35
- package/build/src/database/query/where-combinator.d.ts +18 -0
- package/build/src/database/query/where-combinator.d.ts.map +1 -0
- package/build/src/database/query/where-combinator.js +25 -0
- package/build/src/frontend-model-controller.d.ts +2 -0
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +21 -1
- package/build/src/frontend-models/query.d.ts +6 -0
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +29 -43
- package/build/src/mailer/backends/smtp.d.ts.map +1 -1
- package/build/src/mailer/backends/smtp.js +11 -2
- package/build/src/mailer/base.d.ts +2 -2
- package/build/src/mailer/base.d.ts.map +1 -1
- package/build/src/mailer/base.js +34 -5
- package/build/src/utils/ransack.d.ts +32 -2
- package/build/src/utils/ransack.d.ts.map +1 -1
- package/build/src/utils/ransack.js +306 -75
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,19 +1,34 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import * as inflection from "inflection";
|
|
3
|
+
import { isPlainObject } from "is-plain-object";
|
|
3
4
|
import { resolveFrontendModelClass } from "../frontend-models/model-registry.js";
|
|
4
5
|
/**
|
|
5
6
|
* @typedef {"cont" | "end" | "eq" | "gt" | "gteq" | "in" | "lt" | "lteq" | "not_eq" | "not_in" | "null" | "start"} RansackPredicate
|
|
6
7
|
*/
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {"and" | "or"} RansackCombinator
|
|
10
|
+
*/
|
|
7
11
|
/**
|
|
8
12
|
* @typedef {typeof import("../database/record/index.js").default | typeof import("../frontend-models/base.js").default} RansackModelClass
|
|
9
13
|
*/
|
|
10
14
|
/**
|
|
11
|
-
* @typedef {object}
|
|
15
|
+
* @typedef {object} RansackAttribute
|
|
12
16
|
* @property {string} attributeName - Resolved attribute name.
|
|
13
17
|
* @property {string[]} path - Resolved relationship path.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {object} RansackCondition
|
|
21
|
+
* @property {RansackAttribute[]} attributes - Resolved attributes to test.
|
|
22
|
+
* @property {RansackCombinator} combinator - How multiple attributes are combined.
|
|
14
23
|
* @property {RansackPredicate} predicate - Parsed Ransack predicate.
|
|
15
24
|
* @property {any} value - Normalized value.
|
|
16
25
|
*/
|
|
26
|
+
/**
|
|
27
|
+
* @typedef {object} RansackGroup
|
|
28
|
+
* @property {RansackCombinator} combinator - How entries inside this group are combined.
|
|
29
|
+
* @property {RansackCondition[]} conditions - Conditions in this group.
|
|
30
|
+
* @property {RansackGroup[]} groupings - Nested groups.
|
|
31
|
+
*/
|
|
17
32
|
const supportedPredicates = [
|
|
18
33
|
"not_in",
|
|
19
34
|
"not_eq",
|
|
@@ -33,39 +48,237 @@ const supportedPredicates = [
|
|
|
33
48
|
* @param {Record<string, any>} params - Ransack-style params hash.
|
|
34
49
|
* @returns {RansackCondition[]} - Normalized conditions.
|
|
35
50
|
*/
|
|
51
|
+
// fallow-ignore-next-line unused-export
|
|
36
52
|
export function normalizeRansackParams(modelClass, params) {
|
|
53
|
+
return normalizeRansackGroup(modelClass, params).conditions;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @param {RansackModelClass} modelClass - Model class.
|
|
57
|
+
* @param {Record<string, any>} params - Ransack-style params hash.
|
|
58
|
+
* @returns {RansackGroup} - Normalized group.
|
|
59
|
+
*/
|
|
60
|
+
export function normalizeRansackGroup(modelClass, params) {
|
|
37
61
|
if (!isPlainObject(params)) {
|
|
38
62
|
throw new Error(`ransack params must be a plain object, got: ${typeof params}`);
|
|
39
63
|
}
|
|
40
|
-
/** @type {
|
|
41
|
-
const normalized =
|
|
64
|
+
/** @type {RansackGroup} */
|
|
65
|
+
const normalized = {
|
|
66
|
+
combinator: normalizeRansackCombinator(params.m, "and"),
|
|
67
|
+
conditions: [],
|
|
68
|
+
groupings: []
|
|
69
|
+
};
|
|
42
70
|
for (const [key, rawValue] of Object.entries(params)) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
71
|
+
if (key === "m") {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (key === "c") {
|
|
75
|
+
normalized.conditions.push(...normalizeAdvancedRansackConditions({ modelClass, value: rawValue }));
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (key === "g") {
|
|
79
|
+
normalized.groupings.push(...normalizeAdvancedRansackGroups({ modelClass, value: rawValue }));
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const condition = normalizeSimpleRansackCondition({ key, modelClass, rawValue });
|
|
83
|
+
if (condition)
|
|
84
|
+
normalized.conditions.push(condition);
|
|
85
|
+
}
|
|
86
|
+
return normalized;
|
|
87
|
+
}
|
|
88
|
+
const SKIP_RANSACK_CONDITION = Symbol("skip-ransack-condition");
|
|
89
|
+
/**
|
|
90
|
+
* @param {object} args - Options.
|
|
91
|
+
* @param {string} args.key - Simple Ransack key.
|
|
92
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
93
|
+
* @param {any} args.rawValue - Raw condition value.
|
|
94
|
+
* @returns {RansackCondition | null} - Normalized condition, or null when skipped.
|
|
95
|
+
*/
|
|
96
|
+
function normalizeSimpleRansackCondition({ key, modelClass, rawValue }) {
|
|
97
|
+
const parsedKey = parseRansackKey(key);
|
|
98
|
+
if (!parsedKey) {
|
|
99
|
+
throw new Error(`Unsupported ransack predicate in key: ${key}`);
|
|
100
|
+
}
|
|
101
|
+
const value = normalizeRansackValue({
|
|
102
|
+
predicate: parsedKey.predicate,
|
|
103
|
+
value: rawValue
|
|
104
|
+
});
|
|
105
|
+
if (value === SKIP_RANSACK_CONDITION)
|
|
106
|
+
return null;
|
|
107
|
+
const attributes = resolveRansackAttributes({ modelClass, value: parsedKey.pathValue });
|
|
108
|
+
return {
|
|
109
|
+
attributes,
|
|
110
|
+
combinator: attributes.length > 1 ? "or" : "and",
|
|
111
|
+
predicate: parsedKey.predicate,
|
|
112
|
+
value
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* @param {object} args - Options.
|
|
117
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
118
|
+
* @param {unknown} args.value - Advanced conditions collection.
|
|
119
|
+
* @returns {RansackCondition[]} - Normalized conditions.
|
|
120
|
+
*/
|
|
121
|
+
function normalizeAdvancedRansackConditions({ modelClass, value }) {
|
|
122
|
+
/** @type {RansackCondition[]} */
|
|
123
|
+
const conditions = [];
|
|
124
|
+
for (const entry of normalizeRansackCollection(value, "conditions")) {
|
|
125
|
+
if (!isPlainObject(entry)) {
|
|
126
|
+
throw new Error(`Ransack condition entries must be plain objects, got: ${typeof entry}`);
|
|
127
|
+
}
|
|
128
|
+
const predicateValue = entry.p;
|
|
129
|
+
if (typeof predicateValue !== "string") {
|
|
130
|
+
throw new Error("Ransack condition predicate must be a string");
|
|
131
|
+
}
|
|
132
|
+
if (!supportedPredicates.includes(predicateValue)) {
|
|
133
|
+
throw new Error(`Unsupported ransack predicate in condition: ${predicateValue}`);
|
|
134
|
+
}
|
|
135
|
+
const predicate = /** @type {RansackPredicate} */ (predicateValue);
|
|
136
|
+
const rawValue = advancedRansackConditionValue({ predicate, value: entry.v });
|
|
137
|
+
const normalizedValue = normalizeRansackValue({ predicate, value: rawValue });
|
|
138
|
+
if (normalizedValue === SKIP_RANSACK_CONDITION)
|
|
139
|
+
continue;
|
|
140
|
+
const attributes = resolveRansackAttributesFromAdvancedValue({ modelClass, value: entry.a });
|
|
141
|
+
conditions.push({
|
|
142
|
+
attributes,
|
|
143
|
+
combinator: normalizeRansackCombinator(entry.m, attributes.length > 1 ? "or" : "and"),
|
|
144
|
+
predicate,
|
|
145
|
+
value: normalizedValue
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return conditions;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* @param {object} args - Options.
|
|
152
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
153
|
+
* @param {unknown} args.value - Advanced groups collection.
|
|
154
|
+
* @returns {RansackGroup[]} - Normalized groups.
|
|
155
|
+
*/
|
|
156
|
+
function normalizeAdvancedRansackGroups({ modelClass, value }) {
|
|
157
|
+
/** @type {RansackGroup[]} */
|
|
158
|
+
const groupings = [];
|
|
159
|
+
for (const entry of normalizeRansackCollection(value, "groupings")) {
|
|
160
|
+
if (!isPlainObject(entry)) {
|
|
161
|
+
throw new Error(`Ransack grouping entries must be plain objects, got: ${typeof entry}`);
|
|
46
162
|
}
|
|
47
|
-
|
|
163
|
+
groupings.push(normalizeRansackGroup(modelClass, entry));
|
|
164
|
+
}
|
|
165
|
+
return groupings;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* @param {unknown} value - Candidate combinator.
|
|
169
|
+
* @param {RansackCombinator} defaultValue - Default combinator.
|
|
170
|
+
* @returns {RansackCombinator} - Normalized combinator.
|
|
171
|
+
*/
|
|
172
|
+
function normalizeRansackCombinator(value, defaultValue) {
|
|
173
|
+
if (value === undefined || value === null || value === "")
|
|
174
|
+
return defaultValue;
|
|
175
|
+
if (value === "and" || value === "or")
|
|
176
|
+
return value;
|
|
177
|
+
throw new Error(`Invalid ransack combinator: ${String(value)}`);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* @param {unknown} value - Candidate collection.
|
|
181
|
+
* @param {string} name - Collection name for errors.
|
|
182
|
+
* @returns {unknown[]} - Collection values in stable order.
|
|
183
|
+
*/
|
|
184
|
+
function normalizeRansackCollection(value, name) {
|
|
185
|
+
if (value === undefined || value === null || value === "")
|
|
186
|
+
return [];
|
|
187
|
+
if (Array.isArray(value))
|
|
188
|
+
return value;
|
|
189
|
+
if (isPlainObject(value)) {
|
|
190
|
+
return Object.keys(value)
|
|
191
|
+
.sort((left, right) => {
|
|
192
|
+
const leftNumber = Number(left);
|
|
193
|
+
const rightNumber = Number(right);
|
|
194
|
+
if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) {
|
|
195
|
+
return leftNumber - rightNumber;
|
|
196
|
+
}
|
|
197
|
+
return left.localeCompare(right);
|
|
198
|
+
})
|
|
199
|
+
.map((key) => value[key]);
|
|
200
|
+
}
|
|
201
|
+
throw new Error(`Ransack ${name} must be an array or object, got: ${typeof value}`);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* @param {object} args - Options.
|
|
205
|
+
* @param {RansackPredicate} args.predicate - Parsed predicate.
|
|
206
|
+
* @param {unknown} args.value - Advanced condition value.
|
|
207
|
+
* @returns {unknown} - Value passed to predicate normalization.
|
|
208
|
+
*/
|
|
209
|
+
function advancedRansackConditionValue({ predicate, value }) {
|
|
210
|
+
if (predicate === "in" || predicate === "not_in")
|
|
211
|
+
return value;
|
|
212
|
+
if (Array.isArray(value)) {
|
|
213
|
+
return value.find((entry) => entry !== undefined && entry !== null && entry !== "");
|
|
214
|
+
}
|
|
215
|
+
return value;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* @param {object} args - Options.
|
|
219
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
220
|
+
* @param {unknown} args.value - Advanced attribute value.
|
|
221
|
+
* @returns {RansackAttribute[]} - Resolved attributes.
|
|
222
|
+
*/
|
|
223
|
+
function resolveRansackAttributesFromAdvancedValue({ modelClass, value }) {
|
|
224
|
+
const values = normalizeAdvancedAttributeValues(value);
|
|
225
|
+
/** @type {RansackAttribute[]} */
|
|
226
|
+
const attributes = [];
|
|
227
|
+
for (const attributeValue of values) {
|
|
228
|
+
attributes.push(...resolveRansackAttributes({ modelClass, value: attributeValue }));
|
|
229
|
+
}
|
|
230
|
+
if (attributes.length < 1) {
|
|
231
|
+
throw new Error("Ransack condition must include at least one attribute");
|
|
232
|
+
}
|
|
233
|
+
return attributes;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* @param {unknown} value - Advanced attribute value.
|
|
237
|
+
* @returns {string[]} - Attribute path strings.
|
|
238
|
+
*/
|
|
239
|
+
function normalizeAdvancedAttributeValues(value) {
|
|
240
|
+
if (typeof value === "string")
|
|
241
|
+
return [value];
|
|
242
|
+
if (Array.isArray(value)) {
|
|
243
|
+
return value.map((entry) => normalizeAdvancedAttributeValue(entry));
|
|
244
|
+
}
|
|
245
|
+
if (isPlainObject(value)) {
|
|
246
|
+
return normalizeRansackCollection(value, "attributes").map((entry) => normalizeAdvancedAttributeValue(entry));
|
|
247
|
+
}
|
|
248
|
+
throw new Error(`Ransack condition attributes must be strings, arrays, or objects, got: ${typeof value}`);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* @param {unknown} value - Advanced attribute entry.
|
|
252
|
+
* @returns {string} - Attribute path string.
|
|
253
|
+
*/
|
|
254
|
+
function normalizeAdvancedAttributeValue(value) {
|
|
255
|
+
if (typeof value === "string")
|
|
256
|
+
return value;
|
|
257
|
+
if (isPlainObject(value) && typeof value.name === "string") {
|
|
258
|
+
return value.name;
|
|
259
|
+
}
|
|
260
|
+
throw new Error(`Ransack condition attribute entries must be strings or {name}, got: ${typeof value}`);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* @param {object} args - Options.
|
|
264
|
+
* @param {RansackModelClass} args.modelClass - Model class.
|
|
265
|
+
* @param {string} args.value - Attribute path value.
|
|
266
|
+
* @returns {RansackAttribute[]} - Resolved attributes.
|
|
267
|
+
*/
|
|
268
|
+
function resolveRansackAttributes({ modelClass, value }) {
|
|
269
|
+
return value.split("_or_").map((attributeValue) => {
|
|
270
|
+
const resolvedPath = resolveRansackPath({ modelClass, value: attributeValue });
|
|
48
271
|
const targetModelClass = modelClassAtPath({ modelClass, path: resolvedPath.path });
|
|
49
272
|
const attributeName = resolveAttributeName({ modelClass: targetModelClass, value: resolvedPath.attributeValue });
|
|
50
273
|
if (!attributeName) {
|
|
51
274
|
throw new Error(`Unknown ransack attribute "${resolvedPath.attributeValue}" for ${targetModelClass.name}`);
|
|
52
275
|
}
|
|
53
|
-
|
|
54
|
-
predicate: parsedKey.predicate,
|
|
55
|
-
value: rawValue
|
|
56
|
-
});
|
|
57
|
-
if (value === SKIP_RANSACK_CONDITION)
|
|
58
|
-
continue;
|
|
59
|
-
normalized.push({
|
|
276
|
+
return {
|
|
60
277
|
attributeName,
|
|
61
|
-
path: resolvedPath.path
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
return normalized;
|
|
278
|
+
path: resolvedPath.path
|
|
279
|
+
};
|
|
280
|
+
});
|
|
67
281
|
}
|
|
68
|
-
const SKIP_RANSACK_CONDITION = Symbol("skip-ransack-condition");
|
|
69
282
|
/**
|
|
70
283
|
* @param {object} args - Options.
|
|
71
284
|
* @param {RansackModelClass} args.modelClass - Root model class.
|
|
@@ -205,38 +418,50 @@ function resolveAttributeName({ modelClass, value }) {
|
|
|
205
418
|
*/
|
|
206
419
|
function relationshipEntries(modelClass) {
|
|
207
420
|
if (typeof /** @type {any} */ (modelClass).getRelationshipsMap === "function") {
|
|
208
|
-
|
|
209
|
-
const entries = {};
|
|
210
|
-
const relationshipsMap = /** @type {any} */ (modelClass).getRelationshipsMap();
|
|
211
|
-
for (const relationshipName of Object.keys(relationshipsMap)) {
|
|
212
|
-
const relationship = relationshipsMap[relationshipName];
|
|
213
|
-
if (typeof relationship.isPolymorphic === "function" && relationship.isPolymorphic())
|
|
214
|
-
continue;
|
|
215
|
-
const targetModelClass = relationship.getTargetModelClass();
|
|
216
|
-
if (!targetModelClass)
|
|
217
|
-
continue;
|
|
218
|
-
entries[relationshipName] = {
|
|
219
|
-
targetModelClass
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
return entries;
|
|
421
|
+
return backendRelationshipEntries(modelClass);
|
|
223
422
|
}
|
|
224
423
|
if (typeof /** @type {any} */ (modelClass).relationshipDefinitions === "function" &&
|
|
225
424
|
typeof /** @type {any} */ (modelClass).relationshipModelClasses === "function") {
|
|
226
|
-
|
|
227
|
-
const entries = {};
|
|
228
|
-
const definitions = /** @type {any} */ (modelClass).relationshipDefinitions();
|
|
229
|
-
const relationshipModelClasses = /** @type {any} */ (modelClass).relationshipModelClasses();
|
|
230
|
-
for (const relationshipName of Object.keys(definitions)) {
|
|
231
|
-
const targetModelClass = resolveFrontendModelClass(relationshipModelClasses[relationshipName]);
|
|
232
|
-
if (!targetModelClass)
|
|
233
|
-
continue;
|
|
234
|
-
entries[relationshipName] = { targetModelClass };
|
|
235
|
-
}
|
|
236
|
-
return entries;
|
|
425
|
+
return frontendRelationshipEntries(modelClass);
|
|
237
426
|
}
|
|
238
427
|
return {};
|
|
239
428
|
}
|
|
429
|
+
/**
|
|
430
|
+
* @param {RansackModelClass} modelClass - Backend model class.
|
|
431
|
+
* @returns {Record<string, {targetModelClass: RansackModelClass}>} - Relationship entries keyed by name.
|
|
432
|
+
*/
|
|
433
|
+
function backendRelationshipEntries(modelClass) {
|
|
434
|
+
/** @type {Record<string, {targetModelClass: RansackModelClass}>} */
|
|
435
|
+
const entries = {};
|
|
436
|
+
const relationshipsMap = /** @type {any} */ (modelClass).getRelationshipsMap();
|
|
437
|
+
for (const relationshipName of Object.keys(relationshipsMap)) {
|
|
438
|
+
const relationship = relationshipsMap[relationshipName];
|
|
439
|
+
if (typeof relationship.isPolymorphic === "function" && relationship.isPolymorphic())
|
|
440
|
+
continue;
|
|
441
|
+
const targetModelClass = relationship.getTargetModelClass();
|
|
442
|
+
if (!targetModelClass)
|
|
443
|
+
continue;
|
|
444
|
+
entries[relationshipName] = { targetModelClass };
|
|
445
|
+
}
|
|
446
|
+
return entries;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* @param {RansackModelClass} modelClass - Frontend model class.
|
|
450
|
+
* @returns {Record<string, {targetModelClass: RansackModelClass}>} - Relationship entries keyed by name.
|
|
451
|
+
*/
|
|
452
|
+
function frontendRelationshipEntries(modelClass) {
|
|
453
|
+
/** @type {Record<string, {targetModelClass: RansackModelClass}>} */
|
|
454
|
+
const entries = {};
|
|
455
|
+
const definitions = /** @type {any} */ (modelClass).relationshipDefinitions();
|
|
456
|
+
const relationshipModelClasses = /** @type {any} */ (modelClass).relationshipModelClasses();
|
|
457
|
+
for (const relationshipName of Object.keys(definitions)) {
|
|
458
|
+
const targetModelClass = resolveFrontendModelClass(relationshipModelClasses[relationshipName]);
|
|
459
|
+
if (!targetModelClass)
|
|
460
|
+
continue;
|
|
461
|
+
entries[relationshipName] = { targetModelClass };
|
|
462
|
+
}
|
|
463
|
+
return entries;
|
|
464
|
+
}
|
|
240
465
|
/**
|
|
241
466
|
* @param {RansackModelClass} modelClass - Model class.
|
|
242
467
|
* @returns {Record<string, string>} - Attribute-to-column entries keyed by attribute name.
|
|
@@ -329,38 +554,55 @@ function snakeToCamelSuffix(value) {
|
|
|
329
554
|
*/
|
|
330
555
|
function normalizeRansackValue({ predicate, value }) {
|
|
331
556
|
if (predicate === "null") {
|
|
332
|
-
|
|
333
|
-
if (booleanValue === null)
|
|
334
|
-
return SKIP_RANSACK_CONDITION;
|
|
335
|
-
return booleanValue;
|
|
557
|
+
return normalizeRansackNullValue(value);
|
|
336
558
|
}
|
|
337
559
|
if (predicate === "in" || predicate === "not_in") {
|
|
338
|
-
|
|
339
|
-
if (normalizedArray.length < 1)
|
|
340
|
-
return SKIP_RANSACK_CONDITION;
|
|
341
|
-
return normalizedArray;
|
|
560
|
+
return normalizeRansackListValue(value);
|
|
342
561
|
}
|
|
343
|
-
if (value
|
|
344
|
-
return SKIP_RANSACK_CONDITION;
|
|
345
|
-
if (typeof value === "string" && value.length < 1)
|
|
562
|
+
if (ransackValueIsBlank(value))
|
|
346
563
|
return SKIP_RANSACK_CONDITION;
|
|
347
564
|
return value;
|
|
348
565
|
}
|
|
566
|
+
/**
|
|
567
|
+
* @param {unknown} value - Candidate null predicate value.
|
|
568
|
+
* @returns {boolean | typeof SKIP_RANSACK_CONDITION} - Normalized value.
|
|
569
|
+
*/
|
|
570
|
+
function normalizeRansackNullValue(value) {
|
|
571
|
+
const booleanValue = normalizeRansackBoolean(value);
|
|
572
|
+
return booleanValue === null ? SKIP_RANSACK_CONDITION : booleanValue;
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* @param {unknown} value - Candidate list predicate value.
|
|
576
|
+
* @returns {any[] | typeof SKIP_RANSACK_CONDITION} - Normalized value.
|
|
577
|
+
*/
|
|
578
|
+
function normalizeRansackListValue(value) {
|
|
579
|
+
const normalizedArray = normalizeRansackArray(value);
|
|
580
|
+
return normalizedArray.length < 1 ? SKIP_RANSACK_CONDITION : normalizedArray;
|
|
581
|
+
}
|
|
582
|
+
/** @type {Set<unknown>} */
|
|
583
|
+
const ransackTrueValues = new Set([true, 1, "1", "true"]);
|
|
584
|
+
/** @type {Set<unknown>} */
|
|
585
|
+
const ransackFalseValues = new Set([false, 0, "0", "false"]);
|
|
349
586
|
/**
|
|
350
587
|
* @param {unknown} value - Candidate boolean.
|
|
351
588
|
* @returns {boolean | null} - Normalized boolean or null when blank.
|
|
352
589
|
*/
|
|
353
590
|
function normalizeRansackBoolean(value) {
|
|
354
|
-
if (value
|
|
355
|
-
return value;
|
|
356
|
-
if (value === 1 || value === "1" || value === "true")
|
|
591
|
+
if (ransackTrueValues.has(value))
|
|
357
592
|
return true;
|
|
358
|
-
if (value
|
|
593
|
+
if (ransackFalseValues.has(value))
|
|
359
594
|
return false;
|
|
360
|
-
if (value
|
|
595
|
+
if (ransackValueIsBlank(value))
|
|
361
596
|
return null;
|
|
362
597
|
throw new Error(`Invalid ransack boolean value: ${String(value)}`);
|
|
363
598
|
}
|
|
599
|
+
/**
|
|
600
|
+
* @param {unknown} value - Candidate value.
|
|
601
|
+
* @returns {boolean} - Whether value should be ignored as blank.
|
|
602
|
+
*/
|
|
603
|
+
function ransackValueIsBlank(value) {
|
|
604
|
+
return value === undefined || value === null || value === "";
|
|
605
|
+
}
|
|
364
606
|
/**
|
|
365
607
|
* @param {unknown} value - Candidate array-ish value.
|
|
366
608
|
* @returns {any[]} - Normalized array values.
|
|
@@ -383,7 +625,6 @@ function normalizeRansackArray(value) {
|
|
|
383
625
|
*/
|
|
384
626
|
/**
|
|
385
627
|
* Parses and validates a ransack `s` sort string against model attributes.
|
|
386
|
-
*
|
|
387
628
|
* @param {RansackModelClass} modelClass - Model class for attribute validation.
|
|
388
629
|
* @param {string} sortString - Ransack sort string (e.g., "name asc" or "name asc, createdAt desc").
|
|
389
630
|
* @returns {RansackSort[]} - Validated sort definitions.
|
|
@@ -407,16 +648,6 @@ export function parseRansackSort(modelClass, sortString) {
|
|
|
407
648
|
}
|
|
408
649
|
return sorts;
|
|
409
650
|
}
|
|
410
|
-
/**
|
|
411
|
-
* @param {unknown} value - Candidate object.
|
|
412
|
-
* @returns {value is Record<string, any>} - Whether this is a plain object.
|
|
413
|
-
*/
|
|
414
|
-
function isPlainObject(value) {
|
|
415
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
416
|
-
return false;
|
|
417
|
-
const prototype = Object.getPrototypeOf(value);
|
|
418
|
-
return prototype === Object.prototype || prototype === null;
|
|
419
|
-
}
|
|
420
651
|
/**
|
|
421
652
|
* @param {string[]} values - Input values.
|
|
422
653
|
* @returns {string[]} - Unique values in original order.
|
|
@@ -424,4 +655,4 @@ function isPlainObject(value) {
|
|
|
424
655
|
function uniqunize(values) {
|
|
425
656
|
return Array.from(new Set(values));
|
|
426
657
|
}
|
|
427
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuc2Fjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9yYW5zYWNrLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQTtBQUU5RTs7R0FFRztBQUVIOztHQUVHO0FBRUg7Ozs7OztHQU1HO0FBRUgsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7Q0FDTCxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsTUFBTTtJQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ2pGLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO0lBRXJCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRXRDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDakUsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQTtRQUNqRixNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUNoRixNQUFNLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBQyxDQUFDLENBQUE7UUFFOUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLFlBQVksQ0FBQyxjQUFjLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM1RyxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcscUJBQXFCLENBQUM7WUFDbEMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQzlCLEtBQUssRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQTtRQUVGLElBQUksS0FBSyxLQUFLLHNCQUFzQjtZQUFFLFNBQVE7UUFFOUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNkLGFBQWE7WUFDYixJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUk7WUFDdkIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQzlCLEtBQUs7U0FDTixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQztBQUVELE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUE7QUFFL0Q7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBQztJQUMxQyxJQUFJLGlCQUFpQixHQUFHLFVBQVUsQ0FBQTtJQUVsQyxLQUFLLE1BQU0sZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBRTdFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxnQkFBZ0IsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3JHLENBQUM7UUFFRCxpQkFBaUIsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUE7SUFDbkQsQ0FBQztJQUVELE9BQU8saUJBQWlCLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUM7SUFDN0MsdUJBQXVCO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNmLElBQUksaUJBQWlCLEdBQUcsVUFBVSxDQUFBO0lBQ2xDLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQTtJQUUxQixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxvQkFBb0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE1BQUs7UUFDUCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsc0JBQXNCLENBQUM7WUFDbkMsVUFBVSxFQUFFLGlCQUFpQjtZQUM3QixLQUFLLEVBQUUsY0FBYztTQUN0QixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsS0FBSztZQUFFLE1BQUs7UUFFakIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUNqQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUE7UUFDMUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUE7SUFDdkMsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxPQUFPO1FBQ0wsY0FBYyxFQUFFLGNBQWM7UUFDOUIsSUFBSTtLQUNMLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQztJQUNqRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUE7SUFFcEIsS0FBSyxNQUFNLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFdEUsS0FBSyxNQUFNLFNBQVMsSUFBSSxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTSxjQUFjLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBRW5FLElBQUksY0FBYyxLQUFLLElBQUk7Z0JBQUUsU0FBUTtZQUNyQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxTQUFRO1lBQ3ZDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLGVBQWU7Z0JBQUUsU0FBUTtZQUV4RSxTQUFTLEdBQUc7Z0JBQ1YsZUFBZSxFQUFFLFNBQVMsQ0FBQyxNQUFNO2dCQUNqQyxnQkFBZ0I7Z0JBQ2hCLGNBQWM7Z0JBQ2QsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLGdCQUFnQjthQUNoRCxDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTNCLE9BQU87UUFDTCxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO1FBQzVDLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYztRQUN4QyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO0tBQzdDLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLDBCQUEwQixDQUFDLEtBQUssRUFBRSxTQUFTO0lBQ2xELElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMxQyxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFN0MsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFL0MsSUFBSSxRQUFRLEdBQUcsR0FBRyxJQUFJLFFBQVEsR0FBRyxHQUFHO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFakQsT0FBTyxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ25FLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLGdCQUFnQjtJQUM5QyxPQUFPLFNBQVMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDL0UsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUM7SUFDL0MsS0FBSyxNQUFNLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZGLElBQUkscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxPQUFPLGFBQWEsQ0FBQTtRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQVU7SUFDckMsSUFBSSxPQUFPLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsbUJBQW1CLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDOUUsb0VBQW9FO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUNsQixNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtRQUU5RSxLQUFLLE1BQU0sZ0JBQWdCLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDN0QsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtZQUV2RCxJQUFJLE9BQU8sWUFBWSxDQUFDLGFBQWEsS0FBSyxVQUFVLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRTtnQkFBRSxTQUFRO1lBRTlGLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUE7WUFFM0QsSUFBSSxDQUFDLGdCQUFnQjtnQkFBRSxTQUFRO1lBRS9CLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHO2dCQUMxQixnQkFBZ0I7YUFDakIsQ0FBQTtRQUNILENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsSUFBSSxPQUFPLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsdUJBQXVCLEtBQUssVUFBVTtRQUMvRSxPQUFPLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsd0JBQXdCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDakYsb0VBQW9FO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUNsQixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFDN0UsTUFBTSx3QkFBd0IsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHdCQUF3QixFQUFFLENBQUE7UUFFM0YsS0FBSyxNQUFNLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxNQUFNLGdCQUFnQixHQUFHLHlCQUF5QixDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQTtZQUU5RixJQUFJLENBQUMsZ0JBQWdCO2dCQUFFLFNBQVE7WUFFL0IsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBQyxnQkFBZ0IsRUFBQyxDQUFBO1FBQ2hELENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUE7QUFDWCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxVQUFVO0lBQ2xDLElBQUksT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLCtCQUErQixLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzFGLE9BQU8scUNBQXFDLENBQUMsQ0FBQyxFQUFDLGtCQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLCtCQUErQixFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3BILENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxPQUFPLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxLQUFLLFVBQVU7UUFDekYsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxFQUFFO1FBQ2xELENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDTixNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFBO0lBQzVDLHFDQUFxQztJQUNyQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFFbEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDOUIsS0FBSyxNQUFNLGFBQWEsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN2QyxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVE7Z0JBQUUsU0FBUTtZQUUvQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsYUFBYSxDQUFBO1FBQ3hDLENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sYUFBYSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsYUFBYSxDQUFBO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQztJQUMvRCxPQUFPLFNBQVMsQ0FBQztRQUNmLGFBQWE7UUFDYixVQUFVO1FBQ1YsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDcEMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7S0FDbEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNwQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxlQUFlLENBQUMsR0FBRztJQUMxQixLQUFLLE1BQU0sU0FBUyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQTtRQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBRSxTQUFRO1FBRW5DLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTFELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELENBQUM7UUFFRCxPQUFPO1lBQ0wsU0FBUztZQUNULFNBQVMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUN2RCxDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxTQUFTLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUVqRCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFBRSxTQUFRO1FBRXhDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRS9ELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELENBQUM7UUFFRCxPQUFPO1lBQ0wsU0FBUztZQUNULFNBQVMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUN2RCxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBSztJQUMvQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRWpDLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQy9GLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMscUJBQXFCLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDO0lBQy9DLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRW5ELElBQUksWUFBWSxLQUFLLElBQUk7WUFBRSxPQUFPLHNCQUFzQixDQUFBO1FBRXhELE9BQU8sWUFBWSxDQUFBO0lBQ3JCLENBQUM7SUFFRCxJQUFJLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pELE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBELElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxzQkFBc0IsQ0FBQTtRQUU3RCxPQUFPLGVBQWUsQ0FBQTtJQUN4QixDQUFDO0lBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxzQkFBc0IsQ0FBQTtJQUN4RSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLHNCQUFzQixDQUFBO0lBRWhGLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsdUJBQXVCLENBQUMsS0FBSztJQUNwQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUNuRCxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLEdBQUcsSUFBSSxLQUFLLEtBQUssTUFBTTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ2pFLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssR0FBRyxJQUFJLEtBQUssS0FBSyxPQUFPO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDbkUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUV0RSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ3BFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLEtBQUs7SUFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7SUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMxRixDQUFDO0lBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUVwRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFVBQVU7SUFDckQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUUvRyw0QkFBNEI7SUFDNUIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO0lBRWhCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsQyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFFNUUsSUFBSSxrQkFBa0IsS0FBSyxLQUFLLElBQUksa0JBQWtCLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsa0JBQWtCLFNBQVMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUMxRixDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFDLENBQUMsQ0FBQTtRQUVwRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxlQUFlLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDL0YsQ0FBQztRQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQTtJQUMzRSxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFOUMsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFBO0FBQzdELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxNQUFNO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQge3Jlc29sdmVGcm9udGVuZE1vZGVsQ2xhc3N9IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvbW9kZWwtcmVnaXN0cnkuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtcImNvbnRcIiB8IFwiZW5kXCIgfCBcImVxXCIgfCBcImd0XCIgfCBcImd0ZXFcIiB8IFwiaW5cIiB8IFwibHRcIiB8IFwibHRlcVwiIHwgXCJub3RfZXFcIiB8IFwibm90X2luXCIgfCBcIm51bGxcIiB8IFwic3RhcnRcIn0gUmFuc2Fja1ByZWRpY2F0ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHR5cGVvZiBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvYmFzZS5qc1wiKS5kZWZhdWx0fSBSYW5zYWNrTW9kZWxDbGFzc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFuc2Fja0NvbmRpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBSZXNvbHZlZCBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHBhdGggLSBSZXNvbHZlZCByZWxhdGlvbnNoaXAgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja1ByZWRpY2F0ZX0gcHJlZGljYXRlIC0gUGFyc2VkIFJhbnNhY2sgcHJlZGljYXRlLlxuICogQHByb3BlcnR5IHthbnl9IHZhbHVlIC0gTm9ybWFsaXplZCB2YWx1ZS5cbiAqL1xuXG5jb25zdCBzdXBwb3J0ZWRQcmVkaWNhdGVzID0gW1xuICBcIm5vdF9pblwiLFxuICBcIm5vdF9lcVwiLFxuICBcImd0ZXFcIixcbiAgXCJsdGVxXCIsXG4gIFwic3RhcnRcIixcbiAgXCJjb250XCIsXG4gIFwibnVsbFwiLFxuICBcImVuZFwiLFxuICBcImVxXCIsXG4gIFwiZ3RcIixcbiAgXCJsdFwiLFxuICBcImluXCJcbl1cblxuLyoqXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFJhbnNhY2stc3R5bGUgcGFyYW1zIGhhc2guXG4gKiBAcmV0dXJucyB7UmFuc2Fja0NvbmRpdGlvbltdfSAtIE5vcm1hbGl6ZWQgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tQYXJhbXMobW9kZWxDbGFzcywgcGFyYW1zKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChwYXJhbXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByYW5zYWNrIHBhcmFtcyBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LCBnb3Q6ICR7dHlwZW9mIHBhcmFtc31gKVxuICB9XG5cbiAgLyoqIEB0eXBlIHtSYW5zYWNrQ29uZGl0aW9uW119ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXVxuXG4gIGZvciAoY29uc3QgW2tleSwgcmF3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtcykpIHtcbiAgICBjb25zdCBwYXJzZWRLZXkgPSBwYXJzZVJhbnNhY2tLZXkoa2V5KVxuXG4gICAgaWYgKCFwYXJzZWRLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcmFuc2FjayBwcmVkaWNhdGUgaW4ga2V5OiAke2tleX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVSYW5zYWNrUGF0aCh7bW9kZWxDbGFzcywgdmFsdWU6IHBhcnNlZEtleS5wYXRoVmFsdWV9KVxuICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzQXRQYXRoKHttb2RlbENsYXNzLCBwYXRoOiByZXNvbHZlZFBhdGgucGF0aH0pXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHJlc29sdmVBdHRyaWJ1dGVOYW1lKHttb2RlbENsYXNzOiB0YXJnZXRNb2RlbENsYXNzLCB2YWx1ZTogcmVzb2x2ZWRQYXRoLmF0dHJpYnV0ZVZhbHVlfSlcblxuICAgIGlmICghYXR0cmlidXRlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJhbnNhY2sgYXR0cmlidXRlIFwiJHtyZXNvbHZlZFBhdGguYXR0cmlidXRlVmFsdWV9XCIgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBub3JtYWxpemVSYW5zYWNrVmFsdWUoe1xuICAgICAgcHJlZGljYXRlOiBwYXJzZWRLZXkucHJlZGljYXRlLFxuICAgICAgdmFsdWU6IHJhd1ZhbHVlXG4gICAgfSlcblxuICAgIGlmICh2YWx1ZSA9PT0gU0tJUF9SQU5TQUNLX0NPTkRJVElPTikgY29udGludWVcblxuICAgIG5vcm1hbGl6ZWQucHVzaCh7XG4gICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLnBhdGgsXG4gICAgICBwcmVkaWNhdGU6IHBhcnNlZEtleS5wcmVkaWNhdGUsXG4gICAgICB2YWx1ZVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG5jb25zdCBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OID0gU3ltYm9sKFwic2tpcC1yYW5zYWNrLWNvbmRpdGlvblwiKVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIFJvb3QgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAqIEByZXR1cm5zIHtSYW5zYWNrTW9kZWxDbGFzc30gLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIG1vZGVsQ2xhc3NBdFBhdGgoe21vZGVsQ2xhc3MsIHBhdGh9KSB7XG4gIGxldCBjdXJyZW50TW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgcGF0aCkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcEVudHJpZXMoY3VycmVudE1vZGVsQ2xhc3MpW3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICBpZiAoIXJlbGF0aW9uc2hpcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJhbnNhY2sgcmVsYXRpb25zaGlwIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiIGZvciAke2N1cnJlbnRNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICBjdXJyZW50TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC50YXJnZXRNb2RlbENsYXNzXG4gIH1cblxuICByZXR1cm4gY3VycmVudE1vZGVsQ2xhc3Ncbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBDdXJyZW50IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBSZW1haW5pbmcgcGF0aCB2YWx1ZS5cbiAqIEByZXR1cm5zIHt7YXR0cmlidXRlVmFsdWU6IHN0cmluZywgcGF0aDogc3RyaW5nW119fSAtIFJlc29sdmVkIHJlbGF0aW9uc2hpcCBwYXRoIGFuZCByZW1haW5pbmcgYXR0cmlidXRlIHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmFuc2Fja1BhdGgoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBwYXRoID0gW11cbiAgbGV0IGN1cnJlbnRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICBsZXQgcmVtYWluaW5nVmFsdWUgPSB2YWx1ZVxuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKHJlc29sdmVBdHRyaWJ1dGVOYW1lKHttb2RlbENsYXNzOiBjdXJyZW50TW9kZWxDbGFzcywgdmFsdWU6IHJlbWFpbmluZ1ZhbHVlfSkpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSBmaW5kUmVsYXRpb25zaGlwUHJlZml4KHtcbiAgICAgIG1vZGVsQ2xhc3M6IGN1cnJlbnRNb2RlbENsYXNzLFxuICAgICAgdmFsdWU6IHJlbWFpbmluZ1ZhbHVlXG4gICAgfSlcblxuICAgIGlmICghbWF0Y2gpIGJyZWFrXG5cbiAgICBwYXRoLnB1c2gobWF0Y2gucmVsYXRpb25zaGlwTmFtZSlcbiAgICBjdXJyZW50TW9kZWxDbGFzcyA9IG1hdGNoLnRhcmdldE1vZGVsQ2xhc3NcbiAgICByZW1haW5pbmdWYWx1ZSA9IG1hdGNoLnJlbWFpbmluZ1ZhbHVlXG4gIH1cblxuICBpZiAocmVtYWluaW5nVmFsdWUubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByYW5zYWNrIGtleSBwYXRoOiAke3ZhbHVlfWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZVZhbHVlOiByZW1haW5pbmdWYWx1ZSxcbiAgICBwYXRoXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBDdXJyZW50IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBSZW1haW5pbmcgdmFsdWUgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7e3JlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgcmVtYWluaW5nVmFsdWU6IHN0cmluZywgdGFyZ2V0TW9kZWxDbGFzczogUmFuc2Fja01vZGVsQ2xhc3N9IHwgbnVsbH0gLSBNYXRjaGluZyByZWxhdGlvbnNoaXAgcHJlZml4LlxuICovXG5mdW5jdGlvbiBmaW5kUmVsYXRpb25zaGlwUHJlZml4KHttb2RlbENsYXNzLCB2YWx1ZX0pIHtcbiAgbGV0IGJlc3RNYXRjaCA9IG51bGxcblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMocmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKSkpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpW3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiByZWxhdGlvbnNoaXBDYW5kaWRhdGVzKHJlbGF0aW9uc2hpcE5hbWUpKSB7XG4gICAgICBjb25zdCByZW1haW5pbmdWYWx1ZSA9IHN0cmlwUmVsYXRpb25zaGlwQ2FuZGlkYXRlKHZhbHVlLCBjYW5kaWRhdGUpXG5cbiAgICAgIGlmIChyZW1haW5pbmdWYWx1ZSA9PT0gbnVsbCkgY29udGludWVcbiAgICAgIGlmIChyZW1haW5pbmdWYWx1ZS5sZW5ndGggPCAxKSBjb250aW51ZVxuICAgICAgaWYgKGJlc3RNYXRjaCAmJiBjYW5kaWRhdGUubGVuZ3RoIDw9IGJlc3RNYXRjaC5jYW5kaWRhdGVMZW5ndGgpIGNvbnRpbnVlXG5cbiAgICAgIGJlc3RNYXRjaCA9IHtcbiAgICAgICAgY2FuZGlkYXRlTGVuZ3RoOiBjYW5kaWRhdGUubGVuZ3RoLFxuICAgICAgICByZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgICByZW1haW5pbmdWYWx1ZSxcbiAgICAgICAgdGFyZ2V0TW9kZWxDbGFzczogcmVsYXRpb25zaGlwLnRhcmdldE1vZGVsQ2xhc3NcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWJlc3RNYXRjaCkgcmV0dXJuIG51bGxcblxuICByZXR1cm4ge1xuICAgIHJlbGF0aW9uc2hpcE5hbWU6IGJlc3RNYXRjaC5yZWxhdGlvbnNoaXBOYW1lLFxuICAgIHJlbWFpbmluZ1ZhbHVlOiBiZXN0TWF0Y2gucmVtYWluaW5nVmFsdWUsXG4gICAgdGFyZ2V0TW9kZWxDbGFzczogYmVzdE1hdGNoLnRhcmdldE1vZGVsQ2xhc3NcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvcnRpb24gb2YgYHZhbHVlYCBhZnRlciBgY2FuZGlkYXRlYCB3aGVuIGBjYW5kaWRhdGVgXG4gKiBzaXRzIGF0IGEgcmVsYXRpb25zaGlwLXBhdGggYm91bmRhcnksIG9yIG51bGwgd2hlbiB0aGVyZSdzIG5vXG4gKiBib3VuZGFyeSBtYXRjaC4gVHdvIGJvdW5kYXJ5IGZvcm1zIGFyZSBhY2NlcHRlZDpcbiAqIC0gc25ha2U6IGA8Y2FuZGlkYXRlPl9gIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBwYXRoIChlLmcuXG4gKiAgIGB0YXNrX3Byb2plY3RfaWRgIGFnYWluc3QgY2FuZGlkYXRlIGB0YXNrYCByZXR1cm5zIGBwcm9qZWN0X2lkYCkuXG4gKiAtIGNhbWVsOiBgPGNhbmRpZGF0ZT5gIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIHVwcGVyY2FzZSBsZXR0ZXIsXG4gKiAgIHdoaWNoIG1hcmtzIGEgbmV3IHdvcmQgaW4gY2FtZWxDYXNlIChlLmcuIGB0YXNrUHJvamVjdElkYCBhZ2FpbnN0XG4gKiAgIGNhbmRpZGF0ZSBgdGFza2AgcmV0dXJucyBgcHJvamVjdElkYCB3aXRoIHRoZSBsZWFkaW5nIGBQYFxuICogICBsb3dlcmNhc2VkIHNvIHRoZSByZW1haW5kZXIgc3RheXMgaW4gY2FsbGVyLWZvcm0gZm9yIHRoZSBuZXh0XG4gKiAgIGF0dHJpYnV0ZSAvIHJlbGF0aW9uc2hpcCBtYXRjaCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBSZW1haW5pbmcgcmFuc2FjayBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGNhbmRpZGF0ZSAtIFJlbGF0aW9uc2hpcCBuYW1lIGNhbmRpZGF0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIFJlbWFpbmRlciBhZnRlciB0aGUgY2FuZGlkYXRlLCBvciBudWxsLlxuICovXG5mdW5jdGlvbiBzdHJpcFJlbGF0aW9uc2hpcENhbmRpZGF0ZSh2YWx1ZSwgY2FuZGlkYXRlKSB7XG4gIGlmICh2YWx1ZS5zdGFydHNXaXRoKGAke2NhbmRpZGF0ZX1fYCkpIHtcbiAgICByZXR1cm4gdmFsdWUuc2xpY2UoY2FuZGlkYXRlLmxlbmd0aCArIDEpXG4gIH1cblxuICBpZiAodmFsdWUubGVuZ3RoIDw9IGNhbmRpZGF0ZS5sZW5ndGgpIHJldHVybiBudWxsXG4gIGlmICghdmFsdWUuc3RhcnRzV2l0aChjYW5kaWRhdGUpKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IG5leHRDaGFyID0gdmFsdWUuY2hhckF0KGNhbmRpZGF0ZS5sZW5ndGgpXG5cbiAgaWYgKG5leHRDaGFyIDwgXCJBXCIgfHwgbmV4dENoYXIgPiBcIlpcIikgcmV0dXJuIG51bGxcblxuICByZXR1cm4gbmV4dENoYXIudG9Mb3dlckNhc2UoKSArIHZhbHVlLnNsaWNlKGNhbmRpZGF0ZS5sZW5ndGggKyAxKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gQ2FuZGlkYXRlIHRva2VucyBmb3IgbWF0Y2hpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aW9uc2hpcENhbmRpZGF0ZXMocmVsYXRpb25zaGlwTmFtZSkge1xuICByZXR1cm4gdW5pcXVuaXplKFtyZWxhdGlvbnNoaXBOYW1lLCBpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVsYXRpb25zaGlwTmFtZSldKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBBdHRyaWJ1dGUgY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBSZXNvbHZlZCBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUF0dHJpYnV0ZU5hbWUoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBjb2x1bW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVFbnRyaWVzKG1vZGVsQ2xhc3MpKSkge1xuICAgIGlmIChtYXRjaGVzQXR0cmlidXRlVmFsdWUoe2F0dHJpYnV0ZU5hbWUsIGNvbHVtbk5hbWUsIHZhbHVlfSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7dGFyZ2V0TW9kZWxDbGFzczogUmFuc2Fja01vZGVsQ2xhc3N9Pn0gLSBSZWxhdGlvbnNoaXAgZW50cmllcyBrZXllZCBieSBuYW1lLlxuICovXG5mdW5jdGlvbiByZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLmdldFJlbGF0aW9uc2hpcHNNYXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59ICovXG4gICAgY29uc3QgZW50cmllcyA9IHt9XG4gICAgY29uc3QgcmVsYXRpb25zaGlwc01hcCA9IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMocmVsYXRpb25zaGlwc01hcCkpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcHNNYXBbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgICAgaWYgKHR5cGVvZiByZWxhdGlvbnNoaXAuaXNQb2x5bW9ycGhpYyA9PT0gXCJmdW5jdGlvblwiICYmIHJlbGF0aW9uc2hpcC5pc1BvbHltb3JwaGljKCkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykgY29udGludWVcblxuICAgICAgZW50cmllc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHtcbiAgICAgICAgdGFyZ2V0TW9kZWxDbGFzc1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICBpZiAodHlwZW9mIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwRGVmaW5pdGlvbnMgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB7dGFyZ2V0TW9kZWxDbGFzczogUmFuc2Fja01vZGVsQ2xhc3N9Pn0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0ge31cbiAgICBjb25zdCBkZWZpbml0aW9ucyA9IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwRGVmaW5pdGlvbnMoKVxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcyA9IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKClcblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBPYmplY3Qua2V5cyhkZWZpbml0aW9ucykpIHtcbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZXNvbHZlRnJvbnRlbmRNb2RlbENsYXNzKHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3Nlc1tyZWxhdGlvbnNoaXBOYW1lXSlcblxuICAgICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgICBlbnRyaWVzW3JlbGF0aW9uc2hpcE5hbWVdID0ge3RhcmdldE1vZGVsQ2xhc3N9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNcbiAgfVxuXG4gIHJldHVybiB7fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIEF0dHJpYnV0ZS10by1jb2x1bW4gZW50cmllcyBrZXllZCBieSBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gYXR0cmlidXRlRW50cmllcyhtb2RlbENsYXNzKSB7XG4gIGlmICh0eXBlb2YgLyoqIEB0eXBlIHthbnl9ICovIChtb2RlbENsYXNzKS5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqLyAoKC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpKSlcbiAgfVxuXG4gIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdHlwZW9mIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVzb3VyY2VDb25maWcgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gLyoqIEB0eXBlIHthbnl9ICovIChtb2RlbENsYXNzKS5yZXNvdXJjZUNvbmZpZygpXG4gICAgOiB7fVxuICBjb25zdCBhdHRyaWJ1dGVzID0gcmVzb3VyY2VDb25maWcuYXR0cmlidXRlc1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IGVudHJpZXMgPSB7fVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPT0gXCJzdHJpbmdcIikgY29udGludWVcblxuICAgICAgZW50cmllc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZU5hbWVcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgZW50cmllc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZU5hbWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW50cmllc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY2FuZGlkYXRlIHJlc29sdmVzIHRvIHRoZSBhdHRyaWJ1dGUuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNBdHRyaWJ1dGVWYWx1ZSh7YXR0cmlidXRlTmFtZSwgY29sdW1uTmFtZSwgdmFsdWV9KSB7XG4gIHJldHVybiB1bmlxdW5pemUoW1xuICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgY29sdW1uTmFtZSxcbiAgICBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSksXG4gICAgaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNvbHVtbk5hbWUpXG4gIF0pLmluY2x1ZGVzKHZhbHVlKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBSYW5zYWNrIGtleS5cbiAqIEByZXR1cm5zIHt7cGF0aFZhbHVlOiBzdHJpbmcsIHByZWRpY2F0ZTogUmFuc2Fja1ByZWRpY2F0ZX0gfCBudWxsfSAtIFBhcnNlZCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUmFuc2Fja0tleShrZXkpIHtcbiAgZm9yIChjb25zdCBwcmVkaWNhdGUgb2Ygc3VwcG9ydGVkUHJlZGljYXRlcykge1xuICAgIGNvbnN0IHN1ZmZpeCA9IGBfJHtwcmVkaWNhdGV9YFxuICAgIGlmICgha2V5LmVuZHNXaXRoKHN1ZmZpeCkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBwYXRoVmFsdWUgPSBrZXkuc2xpY2UoMCwga2V5Lmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpXG5cbiAgICBpZiAocGF0aFZhbHVlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByYW5zYWNrIGtleTogJHtrZXl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aFZhbHVlLFxuICAgICAgcHJlZGljYXRlOiAvKiogQHR5cGUge1JhbnNhY2tQcmVkaWNhdGV9ICovIChwcmVkaWNhdGUpXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcmVkaWNhdGUgb2Ygc3VwcG9ydGVkUHJlZGljYXRlcykge1xuICAgIGNvbnN0IGNhbWVsU3VmZml4ID0gc25ha2VUb0NhbWVsU3VmZml4KHByZWRpY2F0ZSlcblxuICAgIGlmICgha2V5LmVuZHNXaXRoKGNhbWVsU3VmZml4KSkgY29udGludWVcblxuICAgIGNvbnN0IHBhdGhWYWx1ZSA9IGtleS5zbGljZSgwLCBrZXkubGVuZ3RoIC0gY2FtZWxTdWZmaXgubGVuZ3RoKVxuXG4gICAgaWYgKHBhdGhWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuc2FjayBrZXk6ICR7a2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhWYWx1ZSxcbiAgICAgIHByZWRpY2F0ZTogLyoqIEB0eXBlIHtSYW5zYWNrUHJlZGljYXRlfSAqLyAocHJlZGljYXRlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gU25ha2UtY2FzZSBwcmVkaWNhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIENhbWVsQ2FzZSBwcmVkaWNhdGUgc3VmZml4IHVzZWQgaW4gcmFuc2FjayBrZXlzLlxuICovXG5mdW5jdGlvbiBzbmFrZVRvQ2FtZWxTdWZmaXgodmFsdWUpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSB2YWx1ZS5zcGxpdChcIl9cIilcblxuICByZXR1cm4gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc2VnbWVudC5zbGljZSgxKSkuam9pbihcIlwiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja1ByZWRpY2F0ZX0gYXJncy5wcmVkaWNhdGUgLSBQYXJzZWQgcHJlZGljYXRlLlxuICogQHBhcmFtIHthbnl9IGFyZ3MudmFsdWUgLSBSYXcgdmFsdWUuXG4gKiBAcmV0dXJucyB7YW55fSAtIE5vcm1hbGl6ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tWYWx1ZSh7cHJlZGljYXRlLCB2YWx1ZX0pIHtcbiAgaWYgKHByZWRpY2F0ZSA9PT0gXCJudWxsXCIpIHtcbiAgICBjb25zdCBib29sZWFuVmFsdWUgPSBub3JtYWxpemVSYW5zYWNrQm9vbGVhbih2YWx1ZSlcblxuICAgIGlmIChib29sZWFuVmFsdWUgPT09IG51bGwpIHJldHVybiBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OXG5cbiAgICByZXR1cm4gYm9vbGVhblZhbHVlXG4gIH1cblxuICBpZiAocHJlZGljYXRlID09PSBcImluXCIgfHwgcHJlZGljYXRlID09PSBcIm5vdF9pblwiKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEFycmF5ID0gbm9ybWFsaXplUmFuc2Fja0FycmF5KHZhbHVlKVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRBcnJheS5sZW5ndGggPCAxKSByZXR1cm4gU0tJUF9SQU5TQUNLX0NPTkRJVElPTlxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRBcnJheVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoIDwgMSkgcmV0dXJuIFNLSVBfUkFOU0FDS19DT05ESVRJT05cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGJvb2xlYW4uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbiB8IG51bGx9IC0gTm9ybWFsaXplZCBib29sZWFuIG9yIG51bGwgd2hlbiBibGFuay5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0Jvb2xlYW4odmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIHZhbHVlXG4gIGlmICh2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gXCIxXCIgfHwgdmFsdWUgPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZVxuICBpZiAodmFsdWUgPT09IDAgfHwgdmFsdWUgPT09IFwiMFwiIHx8IHZhbHVlID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIG51bGxcblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuc2FjayBib29sZWFuIHZhbHVlOiAke1N0cmluZyh2YWx1ZSl9YClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGFycmF5LWlzaCB2YWx1ZS5cbiAqIEByZXR1cm5zIHthbnlbXX0gLSBOb3JtYWxpemVkIGFycmF5IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0FycmF5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5ICE9PSBudWxsICYmIGVudHJ5ICE9PSBcIlwiKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdChcIixcIikubWFwKChlbnRyeSkgPT4gZW50cnkudHJpbSgpKS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5sZW5ndGggPiAwKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiBbXVxuXG4gIHJldHVybiBbdmFsdWVdXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFuc2Fja1NvcnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBSZXNvbHZlZCBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJhc2NcIiB8IFwiZGVzY1wifSBkaXJlY3Rpb24gLSBTb3J0IGRpcmVjdGlvbi5cbiAqL1xuXG4vKipcbiAqIFBhcnNlcyBhbmQgdmFsaWRhdGVzIGEgcmFuc2FjayBgc2Agc29ydCBzdHJpbmcgYWdhaW5zdCBtb2RlbCBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyBmb3IgYXR0cmlidXRlIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gc29ydFN0cmluZyAtIFJhbnNhY2sgc29ydCBzdHJpbmcgKGUuZy4sIFwibmFtZSBhc2NcIiBvciBcIm5hbWUgYXNjLCBjcmVhdGVkQXQgZGVzY1wiKS5cbiAqIEByZXR1cm5zIHtSYW5zYWNrU29ydFtdfSAtIFZhbGlkYXRlZCBzb3J0IGRlZmluaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSYW5zYWNrU29ydChtb2RlbENsYXNzLCBzb3J0U3RyaW5nKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc29ydFN0cmluZy5zcGxpdChcIixcIikubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSkuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG5cbiAgLyoqIEB0eXBlIHtSYW5zYWNrU29ydFtdfSAqL1xuICBjb25zdCBzb3J0cyA9IFtdXG5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XG4gICAgY29uc3QgcGFydHMgPSBzZWdtZW50LnNwbGl0KC9cXHMrLylcbiAgICBjb25zdCBjb2x1bW5DYW5kaWRhdGUgPSBwYXJ0c1swXVxuICAgIGNvbnN0IGRpcmVjdGlvbkNhbmRpZGF0ZSA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1sxXS50b0xvd2VyQ2FzZSgpIDogXCJhc2NcIlxuXG4gICAgaWYgKGRpcmVjdGlvbkNhbmRpZGF0ZSAhPT0gXCJhc2NcIiAmJiBkaXJlY3Rpb25DYW5kaWRhdGUgIT09IFwiZGVzY1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuc2FjayBzb3J0IGRpcmVjdGlvbiBcIiR7ZGlyZWN0aW9uQ2FuZGlkYXRlfVwiIGluOiAke3NlZ21lbnR9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZSA9IHJlc29sdmVBdHRyaWJ1dGVOYW1lKHttb2RlbENsYXNzLCB2YWx1ZTogY29sdW1uQ2FuZGlkYXRlfSlcblxuICAgIGlmICghcmVzb2x2ZWRBdHRyaWJ1dGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYW5zYWNrIHNvcnQgYXR0cmlidXRlIFwiJHtjb2x1bW5DYW5kaWRhdGV9XCIgZm9yICR7bW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuXG4gICAgc29ydHMucHVzaCh7YXR0cmlidXRlOiByZXNvbHZlZEF0dHJpYnV0ZSwgZGlyZWN0aW9uOiBkaXJlY3Rpb25DYW5kaWRhdGV9KVxuICB9XG5cbiAgcmV0dXJuIHNvcnRzXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgYW55Pn0gLSBXaGV0aGVyIHRoaXMgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcblxuICByZXR1cm4gcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvdHlwZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IHZhbHVlcyAtIElucHV0IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBVbmlxdWUgdmFsdWVzIGluIG9yaWdpbmFsIG9yZGVyLlxuICovXG5mdW5jdGlvbiB1bmlxdW5pemUodmFsdWVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSlcbn1cbiJdfQ==
|
|
658
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuc2Fjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9yYW5zYWNrLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDN0MsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sc0NBQXNDLENBQUE7QUFFOUU7O0dBRUc7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUgsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7Q0FDTCxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILHdDQUF3QztBQUN4QyxNQUFNLFVBQVUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLE1BQU07SUFDdkQsT0FBTyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFBO0FBQzdELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxNQUFNO0lBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxPQUFPLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDakYsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixNQUFNLFVBQVUsR0FBRztRQUNqQixVQUFVLEVBQUUsMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDdkQsVUFBVSxFQUFFLEVBQUU7UUFD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QUMsQ0FBQTtRQUMxRixDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFDLENBQUMsQ0FBQTtRQUVwRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxlQUFlLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDL0YsQ0FBQztRQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQTtJQUMzRSxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsTUFBTTtJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tIFwiaXMtcGxhaW4tb2JqZWN0XCJcbmltcG9ydCB7cmVzb2x2ZUZyb250ZW5kTW9kZWxDbGFzc30gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVscy9tb2RlbC1yZWdpc3RyeS5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge1wiY29udFwiIHwgXCJlbmRcIiB8IFwiZXFcIiB8IFwiZ3RcIiB8IFwiZ3RlcVwiIHwgXCJpblwiIHwgXCJsdFwiIHwgXCJsdGVxXCIgfCBcIm5vdF9lcVwiIHwgXCJub3RfaW5cIiB8IFwibnVsbFwiIHwgXCJzdGFydFwifSBSYW5zYWNrUHJlZGljYXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJhbmRcIiB8IFwib3JcIn0gUmFuc2Fja0NvbWJpbmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIikuZGVmYXVsdH0gUmFuc2Fja01vZGVsQ2xhc3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbnNhY2tBdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gUmVzb2x2ZWQgYXR0cmlidXRlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBwYXRoIC0gUmVzb2x2ZWQgcmVsYXRpb25zaGlwIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5zYWNrQ29uZGl0aW9uXG4gKiBAcHJvcGVydHkge1JhbnNhY2tBdHRyaWJ1dGVbXX0gYXR0cmlidXRlcyAtIFJlc29sdmVkIGF0dHJpYnV0ZXMgdG8gdGVzdC5cbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja0NvbWJpbmF0b3J9IGNvbWJpbmF0b3IgLSBIb3cgbXVsdGlwbGUgYXR0cmlidXRlcyBhcmUgY29tYmluZWQuXG4gKiBAcHJvcGVydHkge1JhbnNhY2tQcmVkaWNhdGV9IHByZWRpY2F0ZSAtIFBhcnNlZCBSYW5zYWNrIHByZWRpY2F0ZS5cbiAqIEBwcm9wZXJ0eSB7YW55fSB2YWx1ZSAtIE5vcm1hbGl6ZWQgdmFsdWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5zYWNrR3JvdXBcbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja0NvbWJpbmF0b3J9IGNvbWJpbmF0b3IgLSBIb3cgZW50cmllcyBpbnNpZGUgdGhpcyBncm91cCBhcmUgY29tYmluZWQuXG4gKiBAcHJvcGVydHkge1JhbnNhY2tDb25kaXRpb25bXX0gY29uZGl0aW9ucyAtIENvbmRpdGlvbnMgaW4gdGhpcyBncm91cC5cbiAqIEBwcm9wZXJ0eSB7UmFuc2Fja0dyb3VwW119IGdyb3VwaW5ncyAtIE5lc3RlZCBncm91cHMuXG4gKi9cblxuY29uc3Qgc3VwcG9ydGVkUHJlZGljYXRlcyA9IFtcbiAgXCJub3RfaW5cIixcbiAgXCJub3RfZXFcIixcbiAgXCJndGVxXCIsXG4gIFwibHRlcVwiLFxuICBcInN0YXJ0XCIsXG4gIFwiY29udFwiLFxuICBcIm51bGxcIixcbiAgXCJlbmRcIixcbiAgXCJlcVwiLFxuICBcImd0XCIsXG4gIFwibHRcIixcbiAgXCJpblwiXG5dXG5cbi8qKlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBSYW5zYWNrLXN0eWxlIHBhcmFtcyBoYXNoLlxuICogQHJldHVybnMge1JhbnNhY2tDb25kaXRpb25bXX0gLSBOb3JtYWxpemVkIGNvbmRpdGlvbnMuXG4gKi9cbi8vIGZhbGxvdy1pZ25vcmUtbmV4dC1saW5lIHVudXNlZC1leHBvcnRcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrUGFyYW1zKG1vZGVsQ2xhc3MsIHBhcmFtcykge1xuICByZXR1cm4gbm9ybWFsaXplUmFuc2Fja0dyb3VwKG1vZGVsQ2xhc3MsIHBhcmFtcykuY29uZGl0aW9uc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGFyYW1zIC0gUmFuc2Fjay1zdHlsZSBwYXJhbXMgaGFzaC5cbiAqIEByZXR1cm5zIHtSYW5zYWNrR3JvdXB9IC0gTm9ybWFsaXplZCBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tHcm91cChtb2RlbENsYXNzLCBwYXJhbXMpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcmFtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJhbnNhY2sgcGFyYW1zIG11c3QgYmUgYSBwbGFpbiBvYmplY3QsIGdvdDogJHt0eXBlb2YgcGFyYW1zfWApXG4gIH1cblxuICAvKiogQHR5cGUge1JhbnNhY2tHcm91cH0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICBjb21iaW5hdG9yOiBub3JtYWxpemVSYW5zYWNrQ29tYmluYXRvcihwYXJhbXMubSwgXCJhbmRcIiksXG4gICAgY29uZGl0aW9uczogW10sXG4gICAgZ3JvdXBpbmdzOiBbXVxuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCByYXdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zKSkge1xuICAgIGlmIChrZXkgPT09IFwibVwiKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChrZXkgPT09IFwiY1wiKSB7XG4gICAgICBub3JtYWxpemVkLmNvbmRpdGlvbnMucHVzaCguLi5ub3JtYWxpemVBZHZhbmNlZFJhbnNhY2tDb25kaXRpb25zKHttb2RlbENsYXNzLCB2YWx1ZTogcmF3VmFsdWV9KSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gXCJnXCIpIHtcbiAgICAgIG5vcm1hbGl6ZWQuZ3JvdXBpbmdzLnB1c2goLi4ubm9ybWFsaXplQWR2YW5jZWRSYW5zYWNrR3JvdXBzKHttb2RlbENsYXNzLCB2YWx1ZTogcmF3VmFsdWV9KSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9uID0gbm9ybWFsaXplU2ltcGxlUmFuc2Fja0NvbmRpdGlvbih7a2V5LCBtb2RlbENsYXNzLCByYXdWYWx1ZX0pXG4gICAgaWYgKGNvbmRpdGlvbikgbm9ybWFsaXplZC5jb25kaXRpb25zLnB1c2goY29uZGl0aW9uKVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuY29uc3QgU0tJUF9SQU5TQUNLX0NPTkRJVElPTiA9IFN5bWJvbChcInNraXAtcmFuc2Fjay1jb25kaXRpb25cIilcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5rZXkgLSBTaW1wbGUgUmFuc2FjayBrZXkuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7YW55fSBhcmdzLnJhd1ZhbHVlIC0gUmF3IGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEByZXR1cm5zIHtSYW5zYWNrQ29uZGl0aW9uIHwgbnVsbH0gLSBOb3JtYWxpemVkIGNvbmRpdGlvbiwgb3IgbnVsbCB3aGVuIHNraXBwZWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNpbXBsZVJhbnNhY2tDb25kaXRpb24oe2tleSwgbW9kZWxDbGFzcywgcmF3VmFsdWV9KSB7XG4gIGNvbnN0IHBhcnNlZEtleSA9IHBhcnNlUmFuc2Fja0tleShrZXkpXG5cbiAgaWYgKCFwYXJzZWRLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJhbnNhY2sgcHJlZGljYXRlIGluIGtleTogJHtrZXl9YClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gbm9ybWFsaXplUmFuc2Fja1ZhbHVlKHtcbiAgICBwcmVkaWNhdGU6IHBhcnNlZEtleS5wcmVkaWNhdGUsXG4gICAgdmFsdWU6IHJhd1ZhbHVlXG4gIH0pXG5cbiAgaWYgKHZhbHVlID09PSBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSByZXNvbHZlUmFuc2Fja0F0dHJpYnV0ZXMoe21vZGVsQ2xhc3MsIHZhbHVlOiBwYXJzZWRLZXkucGF0aFZhbHVlfSlcblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZXMsXG4gICAgY29tYmluYXRvcjogYXR0cmlidXRlcy5sZW5ndGggPiAxID8gXCJvclwiIDogXCJhbmRcIixcbiAgICBwcmVkaWNhdGU6IHBhcnNlZEtleS5wcmVkaWNhdGUsXG4gICAgdmFsdWVcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gQWR2YW5jZWQgY29uZGl0aW9ucyBjb2xsZWN0aW9uLlxuICogQHJldHVybnMge1JhbnNhY2tDb25kaXRpb25bXX0gLSBOb3JtYWxpemVkIGNvbmRpdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFkdmFuY2VkUmFuc2Fja0NvbmRpdGlvbnMoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICAvKiogQHR5cGUge1JhbnNhY2tDb25kaXRpb25bXX0gKi9cbiAgY29uc3QgY29uZGl0aW9ucyA9IFtdXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBub3JtYWxpemVSYW5zYWNrQ29sbGVjdGlvbih2YWx1ZSwgXCJjb25kaXRpb25zXCIpKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGVudHJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5zYWNrIGNvbmRpdGlvbiBlbnRyaWVzIG11c3QgYmUgcGxhaW4gb2JqZWN0cywgZ290OiAke3R5cGVvZiBlbnRyeX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHByZWRpY2F0ZVZhbHVlID0gZW50cnkucFxuXG4gICAgaWYgKHR5cGVvZiBwcmVkaWNhdGVWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmFuc2FjayBjb25kaXRpb24gcHJlZGljYXRlIG11c3QgYmUgYSBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBpZiAoIXN1cHBvcnRlZFByZWRpY2F0ZXMuaW5jbHVkZXMocHJlZGljYXRlVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJhbnNhY2sgcHJlZGljYXRlIGluIGNvbmRpdGlvbjogJHtwcmVkaWNhdGVWYWx1ZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHByZWRpY2F0ZSA9IC8qKiBAdHlwZSB7UmFuc2Fja1ByZWRpY2F0ZX0gKi8gKHByZWRpY2F0ZVZhbHVlKVxuICAgIGNvbnN0IHJhd1ZhbHVlID0gYWR2YW5jZWRSYW5zYWNrQ29uZGl0aW9uVmFsdWUoe3ByZWRpY2F0ZSwgdmFsdWU6IGVudHJ5LnZ9KVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZVJhbnNhY2tWYWx1ZSh7cHJlZGljYXRlLCB2YWx1ZTogcmF3VmFsdWV9KVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSA9PT0gU0tJUF9SQU5TQUNLX0NPTkRJVElPTikgY29udGludWVcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSByZXNvbHZlUmFuc2Fja0F0dHJpYnV0ZXNGcm9tQWR2YW5jZWRWYWx1ZSh7bW9kZWxDbGFzcywgdmFsdWU6IGVudHJ5LmF9KVxuXG4gICAgY29uZGl0aW9ucy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBjb21iaW5hdG9yOiBub3JtYWxpemVSYW5zYWNrQ29tYmluYXRvcihlbnRyeS5tLCBhdHRyaWJ1dGVzLmxlbmd0aCA+IDEgPyBcIm9yXCIgOiBcImFuZFwiKSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHZhbHVlOiBub3JtYWxpemVkVmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIEFkdmFuY2VkIGdyb3VwcyBjb2xsZWN0aW9uLlxuICogQHJldHVybnMge1JhbnNhY2tHcm91cFtdfSAtIE5vcm1hbGl6ZWQgZ3JvdXBzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBZHZhbmNlZFJhbnNhY2tHcm91cHMoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICAvKiogQHR5cGUge1JhbnNhY2tHcm91cFtdfSAqL1xuICBjb25zdCBncm91cGluZ3MgPSBbXVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2Ygbm9ybWFsaXplUmFuc2Fja0NvbGxlY3Rpb24odmFsdWUsIFwiZ3JvdXBpbmdzXCIpKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGVudHJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5zYWNrIGdyb3VwaW5nIGVudHJpZXMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLCBnb3Q6ICR7dHlwZW9mIGVudHJ5fWApXG4gICAgfVxuXG4gICAgZ3JvdXBpbmdzLnB1c2gobm9ybWFsaXplUmFuc2Fja0dyb3VwKG1vZGVsQ2xhc3MsIGVudHJ5KSlcbiAgfVxuXG4gIHJldHVybiBncm91cGluZ3Ncbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGNvbWJpbmF0b3IuXG4gKiBAcGFyYW0ge1JhbnNhY2tDb21iaW5hdG9yfSBkZWZhdWx0VmFsdWUgLSBEZWZhdWx0IGNvbWJpbmF0b3IuXG4gKiBAcmV0dXJucyB7UmFuc2Fja0NvbWJpbmF0b3J9IC0gTm9ybWFsaXplZCBjb21iaW5hdG9yLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrQ29tYmluYXRvcih2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gZGVmYXVsdFZhbHVlXG4gIGlmICh2YWx1ZSA9PT0gXCJhbmRcIiB8fCB2YWx1ZSA9PT0gXCJvclwiKSByZXR1cm4gdmFsdWVcblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuc2FjayBjb21iaW5hdG9yOiAke1N0cmluZyh2YWx1ZSl9YClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIENvbGxlY3Rpb24gbmFtZSBmb3IgZXJyb3JzLlxuICogQHJldHVybnMge3Vua25vd25bXX0gLSBDb2xsZWN0aW9uIHZhbHVlcyBpbiBzdGFibGUgb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tDb2xsZWN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gW11cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICAgICAgY29uc3QgbGVmdE51bWJlciA9IE51bWJlcihsZWZ0KVxuICAgICAgICBjb25zdCByaWdodE51bWJlciA9IE51bWJlcihyaWdodClcblxuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGxlZnROdW1iZXIpICYmIE51bWJlci5pc0Zpbml0ZShyaWdodE51bWJlcikpIHtcbiAgICAgICAgICByZXR1cm4gbGVmdE51bWJlciAtIHJpZ2h0TnVtYmVyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0KVxuICAgICAgfSlcbiAgICAgIC5tYXAoKGtleSkgPT4gdmFsdWVba2V5XSlcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgUmFuc2FjayAke25hbWV9IG11c3QgYmUgYW4gYXJyYXkgb3Igb2JqZWN0LCBnb3Q6ICR7dHlwZW9mIHZhbHVlfWApXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrUHJlZGljYXRlfSBhcmdzLnByZWRpY2F0ZSAtIFBhcnNlZCBwcmVkaWNhdGUuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBBZHZhbmNlZCBjb25kaXRpb24gdmFsdWUuXG4gKiBAcmV0dXJucyB7dW5rbm93bn0gLSBWYWx1ZSBwYXNzZWQgdG8gcHJlZGljYXRlIG5vcm1hbGl6YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGFkdmFuY2VkUmFuc2Fja0NvbmRpdGlvblZhbHVlKHtwcmVkaWNhdGUsIHZhbHVlfSkge1xuICBpZiAocHJlZGljYXRlID09PSBcImluXCIgfHwgcHJlZGljYXRlID09PSBcIm5vdF9pblwiKSByZXR1cm4gdmFsdWVcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUuZmluZCgoZW50cnkpID0+IGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkgIT09IG51bGwgJiYgZW50cnkgIT09IFwiXCIpXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy52YWx1ZSAtIEFkdmFuY2VkIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtSYW5zYWNrQXR0cmlidXRlW119IC0gUmVzb2x2ZWQgYXR0cmlidXRlcy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJhbnNhY2tBdHRyaWJ1dGVzRnJvbUFkdmFuY2VkVmFsdWUoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICBjb25zdCB2YWx1ZXMgPSBub3JtYWxpemVBZHZhbmNlZEF0dHJpYnV0ZVZhbHVlcyh2YWx1ZSlcbiAgLyoqIEB0eXBlIHtSYW5zYWNrQXR0cmlidXRlW119ICovXG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXVxuXG4gIGZvciAoY29uc3QgYXR0cmlidXRlVmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgYXR0cmlidXRlcy5wdXNoKC4uLnJlc29sdmVSYW5zYWNrQXR0cmlidXRlcyh7bW9kZWxDbGFzcywgdmFsdWU6IGF0dHJpYnV0ZVZhbHVlfSkpXG4gIH1cblxuICBpZiAoYXR0cmlidXRlcy5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmFuc2FjayBjb25kaXRpb24gbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBhdHRyaWJ1dGVcIilcbiAgfVxuXG4gIHJldHVybiBhdHRyaWJ1dGVzXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIEFkdmFuY2VkIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBBdHRyaWJ1dGUgcGF0aCBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBZHZhbmNlZEF0dHJpYnV0ZVZhbHVlcyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gW3ZhbHVlXVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGVudHJ5KSA9PiBub3JtYWxpemVBZHZhbmNlZEF0dHJpYnV0ZVZhbHVlKGVudHJ5KSlcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBub3JtYWxpemVSYW5zYWNrQ29sbGVjdGlvbih2YWx1ZSwgXCJhdHRyaWJ1dGVzXCIpLm1hcCgoZW50cnkpID0+IG5vcm1hbGl6ZUFkdmFuY2VkQXR0cmlidXRlVmFsdWUoZW50cnkpKVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBSYW5zYWNrIGNvbmRpdGlvbiBhdHRyaWJ1dGVzIG11c3QgYmUgc3RyaW5ncywgYXJyYXlzLCBvciBvYmplY3RzLCBnb3Q6ICR7dHlwZW9mIHZhbHVlfWApXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIEFkdmFuY2VkIGF0dHJpYnV0ZSBlbnRyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQXR0cmlidXRlIHBhdGggc3RyaW5nLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBZHZhbmNlZEF0dHJpYnV0ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZS5uYW1lXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFJhbnNhY2sgY29uZGl0aW9uIGF0dHJpYnV0ZSBlbnRyaWVzIG11c3QgYmUgc3RyaW5ncyBvciB7bmFtZX0sIGdvdDogJHt0eXBlb2YgdmFsdWV9YClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gQXR0cmlidXRlIHBhdGggdmFsdWUuXG4gKiBAcmV0dXJucyB7UmFuc2Fja0F0dHJpYnV0ZVtdfSAtIFJlc29sdmVkIGF0dHJpYnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSYW5zYWNrQXR0cmlidXRlcyh7bW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdChcIl9vcl9cIikubWFwKChhdHRyaWJ1dGVWYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVSYW5zYWNrUGF0aCh7bW9kZWxDbGFzcywgdmFsdWU6IGF0dHJpYnV0ZVZhbHVlfSlcbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gbW9kZWxDbGFzc0F0UGF0aCh7bW9kZWxDbGFzcywgcGF0aDogcmVzb2x2ZWRQYXRoLnBhdGh9KVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSByZXNvbHZlQXR0cmlidXRlTmFtZSh7bW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcywgdmFsdWU6IHJlc29sdmVkUGF0aC5hdHRyaWJ1dGVWYWx1ZX0pXG5cbiAgICBpZiAoIWF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYW5zYWNrIGF0dHJpYnV0ZSBcIiR7cmVzb2x2ZWRQYXRoLmF0dHJpYnV0ZVZhbHVlfVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLnBhdGhcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gYXJncy5tb2RlbENsYXNzIC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MucGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHJldHVybnMge1JhbnNhY2tNb2RlbENsYXNzfSAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gbW9kZWxDbGFzc0F0UGF0aCh7bW9kZWxDbGFzcywgcGF0aH0pIHtcbiAgbGV0IGN1cnJlbnRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuXG4gIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBwYXRoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwRW50cmllcyhjdXJyZW50TW9kZWxDbGFzcylbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGlmICghcmVsYXRpb25zaGlwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmFuc2FjayByZWxhdGlvbnNoaXAgXCIke3JlbGF0aW9uc2hpcE5hbWV9XCIgZm9yICR7Y3VycmVudE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIGN1cnJlbnRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLnRhcmdldE1vZGVsQ2xhc3NcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50TW9kZWxDbGFzc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIEN1cnJlbnQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIFJlbWFpbmluZyBwYXRoIHZhbHVlLlxuICogQHJldHVybnMge3thdHRyaWJ1dGVWYWx1ZTogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXX19IC0gUmVzb2x2ZWQgcmVsYXRpb25zaGlwIHBhdGggYW5kIHJlbWFpbmluZyBhdHRyaWJ1dGUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSYW5zYWNrUGF0aCh7bW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IHBhdGggPSBbXVxuICBsZXQgY3VycmVudE1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzXG4gIGxldCByZW1haW5pbmdWYWx1ZSA9IHZhbHVlXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAocmVzb2x2ZUF0dHJpYnV0ZU5hbWUoe21vZGVsQ2xhc3M6IGN1cnJlbnRNb2RlbENsYXNzLCB2YWx1ZTogcmVtYWluaW5nVmFsdWV9KSkge1xuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaCA9IGZpbmRSZWxhdGlvbnNoaXBQcmVmaXgoe1xuICAgICAgbW9kZWxDbGFzczogY3VycmVudE1vZGVsQ2xhc3MsXG4gICAgICB2YWx1ZTogcmVtYWluaW5nVmFsdWVcbiAgICB9KVxuXG4gICAgaWYgKCFtYXRjaCkgYnJlYWtcblxuICAgIHBhdGgucHVzaChtYXRjaC5yZWxhdGlvbnNoaXBOYW1lKVxuICAgIGN1cnJlbnRNb2RlbENsYXNzID0gbWF0Y2gudGFyZ2V0TW9kZWxDbGFzc1xuICAgIHJlbWFpbmluZ1ZhbHVlID0gbWF0Y2gucmVtYWluaW5nVmFsdWVcbiAgfVxuXG4gIGlmIChyZW1haW5pbmdWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sga2V5IHBhdGg6ICR7dmFsdWV9YClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXR0cmlidXRlVmFsdWU6IHJlbWFpbmluZ1ZhbHVlLFxuICAgIHBhdGhcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIEN1cnJlbnQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIFJlbWFpbmluZyB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHt7cmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCByZW1haW5pbmdWYWx1ZTogc3RyaW5nLCB0YXJnZXRNb2RlbENsYXNzOiBSYW5zYWNrTW9kZWxDbGFzc30gfCBudWxsfSAtIE1hdGNoaW5nIHJlbGF0aW9uc2hpcCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIGZpbmRSZWxhdGlvbnNoaXBQcmVmaXgoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICBsZXQgYmVzdE1hdGNoID0gbnVsbFxuXG4gIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpKSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcEVudHJpZXMobW9kZWxDbGFzcylbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHJlbGF0aW9uc2hpcENhbmRpZGF0ZXMocmVsYXRpb25zaGlwTmFtZSkpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1ZhbHVlID0gc3RyaXBSZWxhdGlvbnNoaXBDYW5kaWRhdGUodmFsdWUsIGNhbmRpZGF0ZSlcblxuICAgICAgaWYgKHJlbWFpbmluZ1ZhbHVlID09PSBudWxsKSBjb250aW51ZVxuICAgICAgaWYgKHJlbWFpbmluZ1ZhbHVlLmxlbmd0aCA8IDEpIGNvbnRpbnVlXG4gICAgICBpZiAoYmVzdE1hdGNoICYmIGNhbmRpZGF0ZS5sZW5ndGggPD0gYmVzdE1hdGNoLmNhbmRpZGF0ZUxlbmd0aCkgY29udGludWVcblxuICAgICAgYmVzdE1hdGNoID0ge1xuICAgICAgICBjYW5kaWRhdGVMZW5ndGg6IGNhbmRpZGF0ZS5sZW5ndGgsXG4gICAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICAgIHJlbWFpbmluZ1ZhbHVlLFxuICAgICAgICB0YXJnZXRNb2RlbENsYXNzOiByZWxhdGlvbnNoaXAudGFyZ2V0TW9kZWxDbGFzc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghYmVzdE1hdGNoKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiB7XG4gICAgcmVsYXRpb25zaGlwTmFtZTogYmVzdE1hdGNoLnJlbGF0aW9uc2hpcE5hbWUsXG4gICAgcmVtYWluaW5nVmFsdWU6IGJlc3RNYXRjaC5yZW1haW5pbmdWYWx1ZSxcbiAgICB0YXJnZXRNb2RlbENsYXNzOiBiZXN0TWF0Y2gudGFyZ2V0TW9kZWxDbGFzc1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiBgdmFsdWVgIGFmdGVyIGBjYW5kaWRhdGVgIHdoZW4gYGNhbmRpZGF0ZWBcbiAqIHNpdHMgYXQgYSByZWxhdGlvbnNoaXAtcGF0aCBib3VuZGFyeSwgb3IgbnVsbCB3aGVuIHRoZXJlJ3Mgbm9cbiAqIGJvdW5kYXJ5IG1hdGNoLiBUd28gYm91bmRhcnkgZm9ybXMgYXJlIGFjY2VwdGVkOlxuICogLSBzbmFrZTogYDxjYW5kaWRhdGU+X2AgZm9sbG93ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHBhdGggKGUuZy5cbiAqICAgYHRhc2tfcHJvamVjdF9pZGAgYWdhaW5zdCBjYW5kaWRhdGUgYHRhc2tgIHJldHVybnMgYHByb2plY3RfaWRgKS5cbiAqIC0gY2FtZWw6IGA8Y2FuZGlkYXRlPmAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gdXBwZXJjYXNlIGxldHRlcixcbiAqICAgd2hpY2ggbWFya3MgYSBuZXcgd29yZCBpbiBjYW1lbENhc2UgKGUuZy4gYHRhc2tQcm9qZWN0SWRgIGFnYWluc3RcbiAqICAgY2FuZGlkYXRlIGB0YXNrYCByZXR1cm5zIGBwcm9qZWN0SWRgIHdpdGggdGhlIGxlYWRpbmcgYFBgXG4gKiAgIGxvd2VyY2FzZWQgc28gdGhlIHJlbWFpbmRlciBzdGF5cyBpbiBjYWxsZXItZm9ybSBmb3IgdGhlIG5leHRcbiAqICAgYXR0cmlidXRlIC8gcmVsYXRpb25zaGlwIG1hdGNoKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFJlbWFpbmluZyByYW5zYWNrIHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gY2FuZGlkYXRlIC0gUmVsYXRpb25zaGlwIG5hbWUgY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gUmVtYWluZGVyIGFmdGVyIHRoZSBjYW5kaWRhdGUsIG9yIG51bGwuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwUmVsYXRpb25zaGlwQ2FuZGlkYXRlKHZhbHVlLCBjYW5kaWRhdGUpIHtcbiAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoYCR7Y2FuZGlkYXRlfV9gKSkge1xuICAgIHJldHVybiB2YWx1ZS5zbGljZShjYW5kaWRhdGUubGVuZ3RoICsgMSlcbiAgfVxuXG4gIGlmICh2YWx1ZS5sZW5ndGggPD0gY2FuZGlkYXRlLmxlbmd0aCkgcmV0dXJuIG51bGxcbiAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKGNhbmRpZGF0ZSkpIHJldHVybiBudWxsXG5cbiAgY29uc3QgbmV4dENoYXIgPSB2YWx1ZS5jaGFyQXQoY2FuZGlkYXRlLmxlbmd0aClcblxuICBpZiAobmV4dENoYXIgPCBcIkFcIiB8fCBuZXh0Q2hhciA+IFwiWlwiKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiBuZXh0Q2hhci50b0xvd2VyQ2FzZSgpICsgdmFsdWUuc2xpY2UoY2FuZGlkYXRlLmxlbmd0aCArIDEpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBDYW5kaWRhdGUgdG9rZW5zIGZvciBtYXRjaGluZy5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpb25zaGlwQ2FuZGlkYXRlcyhyZWxhdGlvbnNoaXBOYW1lKSB7XG4gIHJldHVybiB1bmlxdW5pemUoW3JlbGF0aW9uc2hpcE5hbWUsIGluZmxlY3Rpb24udW5kZXJzY29yZShyZWxhdGlvbnNoaXBOYW1lKV0pXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIEF0dHJpYnV0ZSBjYW5kaWRhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFJlc29sdmVkIGF0dHJpYnV0ZSBuYW1lLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQXR0cmlidXRlTmFtZSh7bW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gIGZvciAoY29uc3QgW2F0dHJpYnV0ZU5hbWUsIGNvbHVtbk5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZUVudHJpZXMobW9kZWxDbGFzcykpKSB7XG4gICAgaWYgKG1hdGNoZXNBdHRyaWJ1dGVWYWx1ZSh7YXR0cmlidXRlTmFtZSwgY29sdW1uTmFtZSwgdmFsdWV9KSkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHt0YXJnZXRNb2RlbENsYXNzOiBSYW5zYWNrTW9kZWxDbGFzc30+fSAtIFJlbGF0aW9uc2hpcCBlbnRyaWVzIGtleWVkIGJ5IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aW9uc2hpcEVudHJpZXMobW9kZWxDbGFzcykge1xuICBpZiAodHlwZW9mIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykuZ2V0UmVsYXRpb25zaGlwc01hcCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGJhY2tlbmRSZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpXG4gIH1cblxuICBpZiAodHlwZW9mIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwRGVmaW5pdGlvbnMgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGZyb250ZW5kUmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKVxuICB9XG5cbiAgcmV0dXJuIHt9XG59XG5cbi8qKlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59IC0gUmVsYXRpb25zaGlwIGVudHJpZXMga2V5ZWQgYnkgbmFtZS5cbiAqL1xuZnVuY3Rpb24gYmFja2VuZFJlbGF0aW9uc2hpcEVudHJpZXMobW9kZWxDbGFzcykge1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHt0YXJnZXRNb2RlbENsYXNzOiBSYW5zYWNrTW9kZWxDbGFzc30+fSAqL1xuICBjb25zdCBlbnRyaWVzID0ge31cbiAgY29uc3QgcmVsYXRpb25zaGlwc01hcCA9IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG5cbiAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIE9iamVjdC5rZXlzKHJlbGF0aW9uc2hpcHNNYXApKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwc01hcFtyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgaWYgKHR5cGVvZiByZWxhdGlvbnNoaXAuaXNQb2x5bW9ycGhpYyA9PT0gXCJmdW5jdGlvblwiICYmIHJlbGF0aW9uc2hpcC5pc1BvbHltb3JwaGljKCkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgZW50cmllc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHt0YXJnZXRNb2RlbENsYXNzfVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59IC0gUmVsYXRpb25zaGlwIGVudHJpZXMga2V5ZWQgYnkgbmFtZS5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRSZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB7dGFyZ2V0TW9kZWxDbGFzczogUmFuc2Fja01vZGVsQ2xhc3N9Pn0gKi9cbiAgY29uc3QgZW50cmllcyA9IHt9XG4gIGNvbnN0IGRlZmluaXRpb25zID0gLyoqIEB0eXBlIHthbnl9ICovIChtb2RlbENsYXNzKS5yZWxhdGlvbnNoaXBEZWZpbml0aW9ucygpXG4gIGNvbnN0IHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcyA9IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKClcblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpKSB7XG4gICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlc29sdmVGcm9udGVuZE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzW3JlbGF0aW9uc2hpcE5hbWVdKVxuXG4gICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgZW50cmllc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHt0YXJnZXRNb2RlbENsYXNzfVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBBdHRyaWJ1dGUtdG8tY29sdW1uIGVudHJpZXMga2V5ZWQgYnkgYXR0cmlidXRlIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGF0dHJpYnV0ZUVudHJpZXMobW9kZWxDbGFzcykge1xuICBpZiAodHlwZW9mIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi8gKCgvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKSkpXG4gIH1cblxuICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLnJlc291cmNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVzb3VyY2VDb25maWcoKVxuICAgIDoge31cbiAgY29uc3QgYXR0cmlidXRlcyA9IHJlc291cmNlQ29uZmlnLmF0dHJpYnV0ZXNcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBlbnRyaWVzID0ge31cblxuICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVzKSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZU5hbWUgIT09IFwic3RyaW5nXCIpIGNvbnRpbnVlXG5cbiAgICAgIGVudHJpZXNbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoYXR0cmlidXRlcykpIHtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGVudHJpZXNbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNhbmRpZGF0ZSByZXNvbHZlcyB0byB0aGUgYXR0cmlidXRlLlxuICovXG5mdW5jdGlvbiBtYXRjaGVzQXR0cmlidXRlVmFsdWUoe2F0dHJpYnV0ZU5hbWUsIGNvbHVtbk5hbWUsIHZhbHVlfSkge1xuICByZXR1cm4gdW5pcXVuaXplKFtcbiAgICBhdHRyaWJ1dGVOYW1lLFxuICAgIGNvbHVtbk5hbWUsXG4gICAgaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpLFxuICAgIGluZmxlY3Rpb24udW5kZXJzY29yZShjb2x1bW5OYW1lKVxuICBdKS5pbmNsdWRlcyh2YWx1ZSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gUmFuc2FjayBrZXkuXG4gKiBAcmV0dXJucyB7e3BhdGhWYWx1ZTogc3RyaW5nLCBwcmVkaWNhdGU6IFJhbnNhY2tQcmVkaWNhdGV9IHwgbnVsbH0gLSBQYXJzZWQga2V5LlxuICovXG5mdW5jdGlvbiBwYXJzZVJhbnNhY2tLZXkoa2V5KSB7XG4gIGZvciAoY29uc3QgcHJlZGljYXRlIG9mIHN1cHBvcnRlZFByZWRpY2F0ZXMpIHtcbiAgICBjb25zdCBzdWZmaXggPSBgXyR7cHJlZGljYXRlfWBcbiAgICBpZiAoIWtleS5lbmRzV2l0aChzdWZmaXgpKSBjb250aW51ZVxuXG4gICAgY29uc3QgcGF0aFZhbHVlID0ga2V5LnNsaWNlKDAsIGtleS5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKVxuXG4gICAgaWYgKHBhdGhWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuc2FjayBrZXk6ICR7a2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhWYWx1ZSxcbiAgICAgIHByZWRpY2F0ZTogLyoqIEB0eXBlIHtSYW5zYWNrUHJlZGljYXRlfSAqLyAocHJlZGljYXRlKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJlZGljYXRlIG9mIHN1cHBvcnRlZFByZWRpY2F0ZXMpIHtcbiAgICBjb25zdCBjYW1lbFN1ZmZpeCA9IHNuYWtlVG9DYW1lbFN1ZmZpeChwcmVkaWNhdGUpXG5cbiAgICBpZiAoIWtleS5lbmRzV2l0aChjYW1lbFN1ZmZpeCkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBwYXRoVmFsdWUgPSBrZXkuc2xpY2UoMCwga2V5Lmxlbmd0aCAtIGNhbWVsU3VmZml4Lmxlbmd0aClcblxuICAgIGlmIChwYXRoVmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sga2V5OiAke2tleX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoVmFsdWUsXG4gICAgICBwcmVkaWNhdGU6IC8qKiBAdHlwZSB7UmFuc2Fja1ByZWRpY2F0ZX0gKi8gKHByZWRpY2F0ZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFNuYWtlLWNhc2UgcHJlZGljYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBDYW1lbENhc2UgcHJlZGljYXRlIHN1ZmZpeCB1c2VkIGluIHJhbnNhY2sga2V5cy5cbiAqL1xuZnVuY3Rpb24gc25ha2VUb0NhbWVsU3VmZml4KHZhbHVlKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gdmFsdWUuc3BsaXQoXCJfXCIpXG5cbiAgcmV0dXJuIHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHNlZ21lbnQuc2xpY2UoMSkpLmpvaW4oXCJcIilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tQcmVkaWNhdGV9IGFyZ3MucHJlZGljYXRlIC0gUGFyc2VkIHByZWRpY2F0ZS5cbiAqIEBwYXJhbSB7YW55fSBhcmdzLnZhbHVlIC0gUmF3IHZhbHVlLlxuICogQHJldHVybnMge2FueX0gLSBOb3JtYWxpemVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrVmFsdWUoe3ByZWRpY2F0ZSwgdmFsdWV9KSB7XG4gIGlmIChwcmVkaWNhdGUgPT09IFwibnVsbFwiKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJhbnNhY2tOdWxsVmFsdWUodmFsdWUpXG4gIH1cblxuICBpZiAocHJlZGljYXRlID09PSBcImluXCIgfHwgcHJlZGljYXRlID09PSBcIm5vdF9pblwiKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJhbnNhY2tMaXN0VmFsdWUodmFsdWUpXG4gIH1cblxuICBpZiAocmFuc2Fja1ZhbHVlSXNCbGFuayh2YWx1ZSkpIHJldHVybiBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBudWxsIHByZWRpY2F0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtib29sZWFuIHwgdHlwZW9mIFNLSVBfUkFOU0FDS19DT05ESVRJT059IC0gTm9ybWFsaXplZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja051bGxWYWx1ZSh2YWx1ZSkge1xuICBjb25zdCBib29sZWFuVmFsdWUgPSBub3JtYWxpemVSYW5zYWNrQm9vbGVhbih2YWx1ZSlcblxuICByZXR1cm4gYm9vbGVhblZhbHVlID09PSBudWxsID8gU0tJUF9SQU5TQUNLX0NPTkRJVElPTiA6IGJvb2xlYW5WYWx1ZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgbGlzdCBwcmVkaWNhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7YW55W10gfCB0eXBlb2YgU0tJUF9SQU5TQUNLX0NPTkRJVElPTn0gLSBOb3JtYWxpemVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrTGlzdFZhbHVlKHZhbHVlKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRBcnJheSA9IG5vcm1hbGl6ZVJhbnNhY2tBcnJheSh2YWx1ZSlcblxuICByZXR1cm4gbm9ybWFsaXplZEFycmF5Lmxlbmd0aCA8IDEgPyBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OIDogbm9ybWFsaXplZEFycmF5XG59XG5cbi8qKiBAdHlwZSB7U2V0PHVua25vd24+fSAqL1xuY29uc3QgcmFuc2Fja1RydWVWYWx1ZXMgPSBuZXcgU2V0KFt0cnVlLCAxLCBcIjFcIiwgXCJ0cnVlXCJdKVxuLyoqIEB0eXBlIHtTZXQ8dW5rbm93bj59ICovXG5jb25zdCByYW5zYWNrRmFsc2VWYWx1ZXMgPSBuZXcgU2V0KFtmYWxzZSwgMCwgXCIwXCIsIFwiZmFsc2VcIl0pXG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBib29sZWFuLlxuICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSAtIE5vcm1hbGl6ZWQgYm9vbGVhbiBvciBudWxsIHdoZW4gYmxhbmsuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tCb29sZWFuKHZhbHVlKSB7XG4gIGlmIChyYW5zYWNrVHJ1ZVZhbHVlcy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZVxuICBpZiAocmFuc2Fja0ZhbHNlVmFsdWVzLmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZVxuICBpZiAocmFuc2Fja1ZhbHVlSXNCbGFuayh2YWx1ZSkpIHJldHVybiBudWxsXG5cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sgYm9vbGVhbiB2YWx1ZTogJHtTdHJpbmcodmFsdWUpfWApXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdmFsdWUgc2hvdWxkIGJlIGlnbm9yZWQgYXMgYmxhbmsuXG4gKi9cbmZ1bmN0aW9uIHJhbnNhY2tWYWx1ZUlzQmxhbmsodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCJcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGFycmF5LWlzaCB2YWx1ZS5cbiAqIEByZXR1cm5zIHthbnlbXX0gLSBOb3JtYWxpemVkIGFycmF5IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0FycmF5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5ICE9PSBudWxsICYmIGVudHJ5ICE9PSBcIlwiKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdChcIixcIikubWFwKChlbnRyeSkgPT4gZW50cnkudHJpbSgpKS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5sZW5ndGggPiAwKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiBbXVxuXG4gIHJldHVybiBbdmFsdWVdXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFuc2Fja1NvcnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBSZXNvbHZlZCBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJhc2NcIiB8IFwiZGVzY1wifSBkaXJlY3Rpb24gLSBTb3J0IGRpcmVjdGlvbi5cbiAqL1xuXG4vKipcbiAqIFBhcnNlcyBhbmQgdmFsaWRhdGVzIGEgcmFuc2FjayBgc2Agc29ydCBzdHJpbmcgYWdhaW5zdCBtb2RlbCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIGZvciBhdHRyaWJ1dGUgdmFsaWRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3J0U3RyaW5nIC0gUmFuc2FjayBzb3J0IHN0cmluZyAoZS5nLiwgXCJuYW1lIGFzY1wiIG9yIFwibmFtZSBhc2MsIGNyZWF0ZWRBdCBkZXNjXCIpLlxuICogQHJldHVybnMge1JhbnNhY2tTb3J0W119IC0gVmFsaWRhdGVkIHNvcnQgZGVmaW5pdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJhbnNhY2tTb3J0KG1vZGVsQ2xhc3MsIHNvcnRTdHJpbmcpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBzb3J0U3RyaW5nLnNwbGl0KFwiLFwiKS5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpKS5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQubGVuZ3RoID4gMClcblxuICAvKiogQHR5cGUge1JhbnNhY2tTb3J0W119ICovXG4gIGNvbnN0IHNvcnRzID0gW11cblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHNlZ21lbnQuc3BsaXQoL1xccysvKVxuICAgIGNvbnN0IGNvbHVtbkNhbmRpZGF0ZSA9IHBhcnRzWzBdXG4gICAgY29uc3QgZGlyZWN0aW9uQ2FuZGlkYXRlID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzWzFdLnRvTG93ZXJDYXNlKCkgOiBcImFzY1wiXG5cbiAgICBpZiAoZGlyZWN0aW9uQ2FuZGlkYXRlICE9PSBcImFzY1wiICYmIGRpcmVjdGlvbkNhbmRpZGF0ZSAhPT0gXCJkZXNjXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByYW5zYWNrIHNvcnQgZGlyZWN0aW9uIFwiJHtkaXJlY3Rpb25DYW5kaWRhdGV9XCIgaW46ICR7c2VnbWVudH1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkQXR0cmlidXRlID0gcmVzb2x2ZUF0dHJpYnV0ZU5hbWUoe21vZGVsQ2xhc3MsIHZhbHVlOiBjb2x1bW5DYW5kaWRhdGV9KVxuXG4gICAgaWYgKCFyZXNvbHZlZEF0dHJpYnV0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJhbnNhY2sgc29ydCBhdHRyaWJ1dGUgXCIke2NvbHVtbkNhbmRpZGF0ZX1cIiBmb3IgJHttb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICBzb3J0cy5wdXNoKHthdHRyaWJ1dGU6IHJlc29sdmVkQXR0cmlidXRlLCBkaXJlY3Rpb246IGRpcmVjdGlvbkNhbmRpZGF0ZX0pXG4gIH1cblxuICByZXR1cm4gc29ydHNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB2YWx1ZXMgLSBJbnB1dCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVW5pcXVlIHZhbHVlcyBpbiBvcmlnaW5hbCBvcmRlci5cbiAqL1xuZnVuY3Rpb24gdW5pcXVuaXplKHZhbHVlcykge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHZhbHVlcykpXG59XG4iXX0=
|