@garrix82/reactgenie-lib 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +22 -0
- package/.github/workflows/publish.yml +20 -0
- package/LICENSE.txt +201 -0
- package/README.md +621 -0
- package/babel.config.js +29 -0
- package/dist/adapters/__tests__/expo-router-adapter.test.d.ts +1 -0
- package/dist/adapters/expo-router-adapter.d.ts +16 -0
- package/dist/adapters/expo-router-adapter.js +521 -0
- package/dist/adapters/navigation-adapter.d.ts +20 -0
- package/dist/adapters/navigation-adapter.js +137 -0
- package/dist/audio-visualizer.d.ts +14 -0
- package/dist/audio-visualizer.js +123 -0
- package/dist/current-selection.d.ts +27 -0
- package/dist/current-selection.js +94 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.js +37 -0
- package/dist/genie/DateTime.d.ts +66 -0
- package/dist/genie/DateTime.js +399 -0
- package/dist/genie/TimeDelta.d.ts +35 -0
- package/dist/genie/TimeDelta.js +169 -0
- package/dist/genie-view-wrapper.d.ts +1 -0
- package/dist/genie-view-wrapper.js +377 -0
- package/dist/hooks/__tests__/useSpeechRecognition.test.d.ts +1 -0
- package/dist/hooks/useSpeechRecognition.d.ts +28 -0
- package/dist/hooks/useSpeechRecognition.js +118 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +469 -0
- package/dist/logger.d.ts +23 -0
- package/dist/logger.js +597 -0
- package/dist/logger.remote.test.d.ts +0 -0
- package/dist/modality-provider-v2.d.ts +28 -0
- package/dist/modality-provider-v2.js +1321 -0
- package/dist/modality-provider.d.ts +22 -0
- package/dist/modality-provider.js +373 -0
- package/dist/native-visibility.d.ts +28 -0
- package/dist/native-visibility.js +50 -0
- package/dist/platform/VoiceRecognitionBar.d.ts +17 -0
- package/dist/platform/VoiceRecognitionBar.js +332 -0
- package/dist/platform/components.d.ts +32 -0
- package/dist/platform/components.js +351 -0
- package/dist/platform/events.d.ts +31 -0
- package/dist/platform/events.js +274 -0
- package/dist/platform/index.d.ts +3 -0
- package/dist/platform/index.js +39 -0
- package/dist/platform/types.d.ts +79 -0
- package/dist/platform/types.js +97 -0
- package/dist/react-decorators.d.ts +87 -0
- package/dist/react-decorators.js +368 -0
- package/dist/shared-store.d.ts +74 -0
- package/dist/shared-store.js +589 -0
- package/dist/speech-recognition/__tests__/speech-recognition-groq-transport.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-native.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-openai-native.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-openai.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-unified-import.test.d.ts +0 -0
- package/dist/speech-recognition/__tests__/speech-recognition-unified.test.d.ts +1 -0
- package/dist/speech-recognition/speech-recognition-groq.d.ts +21 -0
- package/dist/speech-recognition/speech-recognition-groq.js +409 -0
- package/dist/speech-recognition/speech-recognition-mlx.d.ts +15 -0
- package/dist/speech-recognition/speech-recognition-mlx.js +393 -0
- package/dist/speech-recognition/speech-recognition-native.d.ts +24 -0
- package/dist/speech-recognition/speech-recognition-native.js +632 -0
- package/dist/speech-recognition/speech-recognition-openai-native.d.ts +40 -0
- package/dist/speech-recognition/speech-recognition-openai-native.js +653 -0
- package/dist/speech-recognition/speech-recognition-openai.d.ts +39 -0
- package/dist/speech-recognition/speech-recognition-openai.js +718 -0
- package/dist/speech-recognition/speech-recognition-unified.d.ts +93 -0
- package/dist/speech-recognition/speech-recognition-unified.js +589 -0
- package/dist/speech-recognition/utils/groq-transcription.d.ts +41 -0
- package/dist/speech-recognition/utils/groq-transcription.js +382 -0
- package/dist/speech-recognition.d.ts +7 -0
- package/dist/speech-recognition.js +61 -0
- package/dist/voice-pipeline-telemetry.d.ts +26 -0
- package/dist/voice-pipeline-telemetry.js +15 -0
- package/garrix82-reactgenie-lib-1.3.0.tgz +0 -0
- package/metro/index.js +3 -0
- package/metro/with-genie-registry.js +47 -0
- package/package.json +111 -0
- package/scripts/dry-run.js +23 -0
- package/scripts/generate-genie-registry.js +278 -0
- package/scripts/log-file-test.js +51 -0
- package/scripts/parse.js +26 -0
- package/scripts/prompt.js +19 -0
- package/scripts/set-script.js +200 -0
- package/tsconfig.json +36 -0
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createImmutableConstructorParamsSnapshot = createImmutableConstructorParamsSnapshot;
|
|
7
|
+
exports.displayResult = displayResult;
|
|
8
|
+
exports.executeGenieCode = executeGenieCode;
|
|
9
|
+
exports.extractQueryIntentFromAst = extractQueryIntentFromAst;
|
|
10
|
+
exports.resetGenieNavigation = resetGenieNavigation;
|
|
11
|
+
exports.useGenieSelector = exports.useGenieCodeSelector = exports.uiActive = void 0;
|
|
12
|
+
var _modalityProviderV = require("./modality-provider-v2");
|
|
13
|
+
var _reactDecorators = require("./react-decorators");
|
|
14
|
+
var _reactRedux = require("react-redux");
|
|
15
|
+
var _reactgenieDsl = require("@garrix82/reactgenie-dsl");
|
|
16
|
+
var _logger = require("./logger");
|
|
17
|
+
var _errors = require("./errors");
|
|
18
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
19
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
20
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
21
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
22
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
23
|
+
let uiActive = exports.uiActive = true;
|
|
24
|
+
const DEFAULT_RESULT_WINDOW_MAX = 40;
|
|
25
|
+
const DEFAULT_RESULT_WINDOW_TTL_MS = 5 * 60 * 1000;
|
|
26
|
+
function getConstructorParamsFromResultValue(value) {
|
|
27
|
+
if (!value || typeof value._getConstructorParams !== "function") {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return value._getConstructorParams();
|
|
31
|
+
}
|
|
32
|
+
function deepFreezeObject(value) {
|
|
33
|
+
if (!value || typeof value !== "object") {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
Object.freeze(value);
|
|
37
|
+
for (const key of Object.keys(value)) {
|
|
38
|
+
const nested = value[key];
|
|
39
|
+
if (nested && typeof nested === "object" && !Object.isFrozen(nested)) {
|
|
40
|
+
deepFreezeObject(nested);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function cloneDetachedValue(value) {
|
|
46
|
+
try {
|
|
47
|
+
const nativeStructuredClone = globalThis.structuredClone;
|
|
48
|
+
const cloned = typeof nativeStructuredClone === "function" ? nativeStructuredClone(value) : JSON.parse(JSON.stringify(value));
|
|
49
|
+
return deepFreezeObject(cloned);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
_logger.logger.warn("[ReactGenie] Unable to clone constructor params for result window snapshot", error);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function createImmutableConstructorParamsSnapshot(value) {
|
|
56
|
+
const constructorParams = getConstructorParamsFromResultValue(value);
|
|
57
|
+
if (!constructorParams || typeof constructorParams !== "object") {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const snapshot = cloneDetachedValue(constructorParams);
|
|
61
|
+
if (!snapshot || typeof snapshot !== "object") {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return snapshot;
|
|
65
|
+
}
|
|
66
|
+
function ensureResultWindowDefaults(state) {
|
|
67
|
+
// `genieDispatch` starts from a shallow copy of the previous state.
|
|
68
|
+
// Clone mutable result-window containers before writes so we don't mutate
|
|
69
|
+
// references from the previous Redux state snapshot.
|
|
70
|
+
state.resultWindowByRef = state.resultWindowByRef ? _objectSpread({}, state.resultWindowByRef) : {};
|
|
71
|
+
state.resultWindowOrder = state.resultWindowOrder ? [...state.resultWindowOrder] : [];
|
|
72
|
+
if (!state.resultWindowMax || state.resultWindowMax <= 0) {
|
|
73
|
+
state.resultWindowMax = DEFAULT_RESULT_WINDOW_MAX;
|
|
74
|
+
}
|
|
75
|
+
if (!state.resultWindowTtlMs || state.resultWindowTtlMs <= 0) {
|
|
76
|
+
state.resultWindowTtlMs = DEFAULT_RESULT_WINDOW_TTL_MS;
|
|
77
|
+
}
|
|
78
|
+
if (!Number.isFinite(state.resultWindowSequence)) {
|
|
79
|
+
state.resultWindowSequence = 0;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function pruneResultWindow(state, now = Date.now()) {
|
|
83
|
+
ensureResultWindowDefaults(state);
|
|
84
|
+
const minCreatedAt = now - state.resultWindowTtlMs;
|
|
85
|
+
state.resultWindowOrder = state.resultWindowOrder.filter(resultRef => {
|
|
86
|
+
const entry = state.resultWindowByRef[resultRef];
|
|
87
|
+
if (!entry) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (entry.createdAt < minCreatedAt) {
|
|
91
|
+
delete state.resultWindowByRef[resultRef];
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
});
|
|
96
|
+
while (state.resultWindowOrder.length > state.resultWindowMax) {
|
|
97
|
+
const oldestRef = state.resultWindowOrder.shift();
|
|
98
|
+
if (!oldestRef) break;
|
|
99
|
+
delete state.resultWindowByRef[oldestRef];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function putResultWindowEntry(state, entry) {
|
|
103
|
+
ensureResultWindowDefaults(state);
|
|
104
|
+
state.resultWindowSequence += 1;
|
|
105
|
+
const resultRef = `rg-${entry.eventId}-${state.resultWindowSequence}`;
|
|
106
|
+
const createdAt = Date.now();
|
|
107
|
+
const completeEntry = _objectSpread(_objectSpread({}, entry), {}, {
|
|
108
|
+
resultRef,
|
|
109
|
+
createdAt
|
|
110
|
+
});
|
|
111
|
+
state.resultWindowByRef[resultRef] = completeEntry;
|
|
112
|
+
state.resultWindowOrder.push(resultRef);
|
|
113
|
+
pruneResultWindow(state, createdAt);
|
|
114
|
+
return completeEntry;
|
|
115
|
+
}
|
|
116
|
+
function hashString(value) {
|
|
117
|
+
let hash = 0;
|
|
118
|
+
for (let i = 0; i < value.length; i++) {
|
|
119
|
+
hash = (hash << 5) - hash + value.charCodeAt(i);
|
|
120
|
+
hash |= 0;
|
|
121
|
+
}
|
|
122
|
+
return Math.abs(hash).toString(36);
|
|
123
|
+
}
|
|
124
|
+
function accessorFieldToPath(field) {
|
|
125
|
+
if (typeof field === "string") {
|
|
126
|
+
return field;
|
|
127
|
+
}
|
|
128
|
+
if (!field || typeof field !== "object") {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
if (field.type === "access") {
|
|
132
|
+
const parent = accessorFieldToPath(field.parent);
|
|
133
|
+
if (!parent || typeof field.access !== "string") {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
return `${parent}.${field.access}`;
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
function astValueToPrimitive(ast) {
|
|
141
|
+
if (!ast || typeof ast !== "object") return undefined;
|
|
142
|
+
if (ast.type === "string" || ast.type === "int" || ast.type === "float" || ast.type === "boolean") {
|
|
143
|
+
return ast.value;
|
|
144
|
+
}
|
|
145
|
+
if (ast.type === "object") {
|
|
146
|
+
if (ast.objectType === "string" || ast.objectType === "number" || ast.objectType === "float" || ast.objectType === "int" || ast.objectType === "boolean" || ast.objectType === "bool") {
|
|
147
|
+
return ast.value;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
function collectFunctionCalls(ast, calls = []) {
|
|
153
|
+
if (!ast || typeof ast !== "object") {
|
|
154
|
+
return calls;
|
|
155
|
+
}
|
|
156
|
+
if (ast.type === "index") {
|
|
157
|
+
calls.push({
|
|
158
|
+
type: "function_call",
|
|
159
|
+
func_name: "index",
|
|
160
|
+
parameters: [{
|
|
161
|
+
parameter: "index",
|
|
162
|
+
value: {
|
|
163
|
+
type: "int",
|
|
164
|
+
value: ast.index
|
|
165
|
+
}
|
|
166
|
+
}]
|
|
167
|
+
});
|
|
168
|
+
return collectFunctionCalls(ast.parent, calls);
|
|
169
|
+
}
|
|
170
|
+
if (ast.type === "access") {
|
|
171
|
+
if (ast.access && ast.access.type === "function_call") {
|
|
172
|
+
calls.push(ast.access);
|
|
173
|
+
}
|
|
174
|
+
return collectFunctionCalls(ast.parent, calls);
|
|
175
|
+
}
|
|
176
|
+
return calls;
|
|
177
|
+
}
|
|
178
|
+
function getCallParam(call, paramName) {
|
|
179
|
+
if (!call || !Array.isArray(call.parameters)) return undefined;
|
|
180
|
+
const entry = call.parameters.find(param => param.parameter === paramName);
|
|
181
|
+
return entry?.value;
|
|
182
|
+
}
|
|
183
|
+
function extractQueryIntentFromAst(ast) {
|
|
184
|
+
const calls = collectFunctionCalls(ast, []).reverse();
|
|
185
|
+
const ops = [];
|
|
186
|
+
for (const call of calls) {
|
|
187
|
+
const funcName = call?.func_name;
|
|
188
|
+
if (funcName === "matching" || funcName === "contains" || funcName === "equals") {
|
|
189
|
+
const fieldAst = getCallParam(call, "field");
|
|
190
|
+
const valueAst = getCallParam(call, "value");
|
|
191
|
+
const fieldPath = accessorFieldToPath(fieldAst?.field);
|
|
192
|
+
const value = astValueToPrimitive(valueAst);
|
|
193
|
+
if (fieldPath && value !== undefined) {
|
|
194
|
+
ops.push({
|
|
195
|
+
kind: funcName,
|
|
196
|
+
field: fieldPath,
|
|
197
|
+
value
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (funcName === "between") {
|
|
203
|
+
const fieldAst = getCallParam(call, "field");
|
|
204
|
+
const from = astValueToPrimitive(getCallParam(call, "from"));
|
|
205
|
+
const to = astValueToPrimitive(getCallParam(call, "to"));
|
|
206
|
+
const fieldPath = accessorFieldToPath(fieldAst?.field);
|
|
207
|
+
if (fieldPath && (from !== undefined || to !== undefined)) {
|
|
208
|
+
ops.push(_objectSpread(_objectSpread({
|
|
209
|
+
kind: "between",
|
|
210
|
+
field: fieldPath
|
|
211
|
+
}, from !== undefined ? {
|
|
212
|
+
from
|
|
213
|
+
} : {}), to !== undefined ? {
|
|
214
|
+
to
|
|
215
|
+
} : {}));
|
|
216
|
+
}
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (funcName === "sort") {
|
|
220
|
+
const fieldAst = getCallParam(call, "field");
|
|
221
|
+
const ascending = astValueToPrimitive(getCallParam(call, "ascending"));
|
|
222
|
+
const fieldPath = accessorFieldToPath(fieldAst?.field);
|
|
223
|
+
if (fieldPath) {
|
|
224
|
+
ops.push({
|
|
225
|
+
kind: "sort",
|
|
226
|
+
field: fieldPath,
|
|
227
|
+
ascending: ascending === undefined ? true : Boolean(ascending)
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (funcName === "index") {
|
|
233
|
+
const index = astValueToPrimitive(getCallParam(call, "index"));
|
|
234
|
+
if (typeof index === "number") {
|
|
235
|
+
ops.push({
|
|
236
|
+
kind: "index",
|
|
237
|
+
value: index
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (funcName === "length") {
|
|
243
|
+
ops.push({
|
|
244
|
+
kind: "length"
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (ops.length === 0) return null;
|
|
249
|
+
const serialized = JSON.stringify(ops);
|
|
250
|
+
return {
|
|
251
|
+
ops,
|
|
252
|
+
hash: hashString(serialized)
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const useGenieCodeSelector = command => {
|
|
256
|
+
return async state => {
|
|
257
|
+
exports.uiActive = uiActive = false;
|
|
258
|
+
(0, _reactgenieDsl.setSharedState)(state);
|
|
259
|
+
const result = await _modalityProviderV.GenieInterpreter.dslInterpreter.interpret(command);
|
|
260
|
+
// logger.info(`executed result ${result}`);
|
|
261
|
+
// logger.info(`after executing state ${JSON.stringify(state)}`);
|
|
262
|
+
exports.uiActive = uiActive = true;
|
|
263
|
+
return result;
|
|
264
|
+
};
|
|
265
|
+
};
|
|
266
|
+
exports.useGenieCodeSelector = useGenieCodeSelector;
|
|
267
|
+
const shallowEqualWithArray = (left, right) => {
|
|
268
|
+
if (Array.isArray(left) && Array.isArray(right)) {
|
|
269
|
+
if (left.length !== right.length) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
for (let i = 0; i < left.length; i++) {
|
|
273
|
+
if (!shallowEqualWithArray(left[i], right[i])) {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return true;
|
|
278
|
+
} else {
|
|
279
|
+
return (0, _reactRedux.shallowEqual)(left, right);
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
const convertGenieClassToState = obj => {
|
|
283
|
+
if (Array.isArray(obj)) {
|
|
284
|
+
return obj.map(element => convertGenieClassToState(element));
|
|
285
|
+
} else if (obj === null || obj === undefined || obj.constructor === undefined) {
|
|
286
|
+
return obj;
|
|
287
|
+
} else if (obj.constructor.prototype instanceof _reactgenieDsl.GenieObject) {
|
|
288
|
+
if (obj.constructor.prototype instanceof _reactgenieDsl.DataClass) {
|
|
289
|
+
return _objectSpread({
|
|
290
|
+
__genieObjectType: "DataClass",
|
|
291
|
+
__genieObjectClass: obj.constructor.name,
|
|
292
|
+
__genieObjectKey: obj[obj.genieKey]
|
|
293
|
+
}, obj.__getState());
|
|
294
|
+
} else if (obj.constructor.prototype instanceof _reactgenieDsl.HelperClass) {
|
|
295
|
+
return _objectSpread({
|
|
296
|
+
__genieObjectType: "HelperClass",
|
|
297
|
+
__genieObjectClass: obj.constructor.name
|
|
298
|
+
}, obj.localStore);
|
|
299
|
+
}
|
|
300
|
+
throw new Error("Unknown GenieObject type");
|
|
301
|
+
} else {
|
|
302
|
+
return obj;
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
const useGenieSelector = selector => {
|
|
306
|
+
let selectorResult = undefined;
|
|
307
|
+
(0, _reactRedux.useSelector)(state => {
|
|
308
|
+
(0, _reactgenieDsl.setSharedState)(state);
|
|
309
|
+
selectorResult = selector(state);
|
|
310
|
+
return convertGenieClassToState(selectorResult);
|
|
311
|
+
}, shallowEqualWithArray);
|
|
312
|
+
return selectorResult;
|
|
313
|
+
};
|
|
314
|
+
exports.useGenieSelector = useGenieSelector;
|
|
315
|
+
const RESULT_PREVIEW_MAX_LENGTH = 160;
|
|
316
|
+
function truncateText(value, maxLength) {
|
|
317
|
+
if (value.length <= maxLength) {
|
|
318
|
+
return value;
|
|
319
|
+
}
|
|
320
|
+
return `${value.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;
|
|
321
|
+
}
|
|
322
|
+
function createSystemMessage(minimalText, fullText, type = "info", shouldSpeak = false, origin = "system") {
|
|
323
|
+
return {
|
|
324
|
+
minimalText,
|
|
325
|
+
fullText,
|
|
326
|
+
type,
|
|
327
|
+
shouldSpeak,
|
|
328
|
+
origin,
|
|
329
|
+
message: fullText
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
function createUserFacingMessage(error, origin, shouldSpeakByDefault) {
|
|
333
|
+
return {
|
|
334
|
+
minimalText: error.minimalText,
|
|
335
|
+
fullText: error.fullText,
|
|
336
|
+
type: error.type,
|
|
337
|
+
shouldSpeak: error.shouldSpeak ?? shouldSpeakByDefault,
|
|
338
|
+
origin,
|
|
339
|
+
message: error.fullText
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
function safeSerializeValue(value) {
|
|
343
|
+
if (value === null || value === undefined) {
|
|
344
|
+
return "none";
|
|
345
|
+
}
|
|
346
|
+
const serialized = String(value);
|
|
347
|
+
return truncateText(serialized, RESULT_PREVIEW_MAX_LENGTH);
|
|
348
|
+
}
|
|
349
|
+
function buildResultDigest(result, parsed) {
|
|
350
|
+
if (!result || typeof result !== "object") {
|
|
351
|
+
return {
|
|
352
|
+
parsed,
|
|
353
|
+
status: "unknown",
|
|
354
|
+
resultType: "unknown"
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
if (result.type === "array") {
|
|
358
|
+
const values = Array.isArray(result.value) ? result.value : [];
|
|
359
|
+
const first = values.length > 0 ? values[0] : null;
|
|
360
|
+
const firstObjectType = first?.objectType || null;
|
|
361
|
+
const firstPreview = first && first.type === "object" ? safeSerializeValue(first.value) : null;
|
|
362
|
+
return {
|
|
363
|
+
parsed,
|
|
364
|
+
status: "ok",
|
|
365
|
+
resultType: "array",
|
|
366
|
+
count: values.length,
|
|
367
|
+
firstObjectType,
|
|
368
|
+
firstPreview
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
if (result.type === "object") {
|
|
372
|
+
return {
|
|
373
|
+
parsed,
|
|
374
|
+
status: "ok",
|
|
375
|
+
resultType: "object",
|
|
376
|
+
objectType: result.objectType || "unknown",
|
|
377
|
+
preview: safeSerializeValue(result.value)
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
parsed,
|
|
382
|
+
status: "ok",
|
|
383
|
+
resultType: "unknown"
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
async function executeGenieCode(command, options = {}) {
|
|
387
|
+
const sanitized = typeof command === "string" ? command.trim() : "";
|
|
388
|
+
const messageOrigin = options.origin ?? "system";
|
|
389
|
+
const shouldSpeakErrors = Boolean(options.shouldSpeakErrors);
|
|
390
|
+
// logger.info(`executing command : ${sanitized}`);
|
|
391
|
+
|
|
392
|
+
if (!sanitized) {
|
|
393
|
+
(0, _reactgenieDsl.genieDispatch)(() => {
|
|
394
|
+
const reactGenieState = _reactgenieDsl.sharedState;
|
|
395
|
+
reactGenieState.message = createSystemMessage("No actionable command.", "I heard you, but there is no actionable command to run.", "info", shouldSpeakErrors, messageOrigin);
|
|
396
|
+
});
|
|
397
|
+
return {
|
|
398
|
+
success: false,
|
|
399
|
+
results: [new Error("No actionable command")]
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Guard against GenieInterpreter not being initialized
|
|
404
|
+
if (!_modalityProviderV.GenieInterpreter || !_modalityProviderV.GenieInterpreter.dslInterpreter) {
|
|
405
|
+
_logger.logger.error('GenieInterpreter is not initialized');
|
|
406
|
+
(0, _reactgenieDsl.genieDispatch)(() => {
|
|
407
|
+
const reactGenieState = _reactgenieDsl.sharedState;
|
|
408
|
+
reactGenieState.message = createSystemMessage("System not ready.", "System not ready. Please try again.", "error", shouldSpeakErrors, messageOrigin);
|
|
409
|
+
});
|
|
410
|
+
return {
|
|
411
|
+
success: false,
|
|
412
|
+
results: [new Error('GenieInterpreter not initialized')]
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
try {
|
|
416
|
+
const result = await _modalityProviderV.GenieInterpreter.dslInterpreter.interpretSteps(sanitized);
|
|
417
|
+
// console.log(`executed result ${result}`);
|
|
418
|
+
return {
|
|
419
|
+
success: true,
|
|
420
|
+
results: result
|
|
421
|
+
};
|
|
422
|
+
} catch (e) {
|
|
423
|
+
_logger.logger.error('error executing command:', sanitized, e);
|
|
424
|
+
(0, _reactgenieDsl.genieDispatch)(() => {
|
|
425
|
+
const reactGenieState = _reactgenieDsl.sharedState;
|
|
426
|
+
reactGenieState.message = (0, _errors.isGenieUserFacingError)(e) ? createUserFacingMessage(e, messageOrigin, shouldSpeakErrors) : createSystemMessage("I could not process that.", "Sorry, I don't understand...", "error", shouldSpeakErrors, messageOrigin);
|
|
427
|
+
});
|
|
428
|
+
return {
|
|
429
|
+
success: false,
|
|
430
|
+
results: [e]
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
function displayResult(executionResult, transcript, parsed, genieInterfaces) {
|
|
435
|
+
(0, _reactgenieDsl.genieDispatch)(() => {
|
|
436
|
+
let allDisplayingObjects = [];
|
|
437
|
+
let displayingObject = null;
|
|
438
|
+
let displayingObjectType = "";
|
|
439
|
+
const statementResult = executionResult.results[0];
|
|
440
|
+
const statementAst = statementResult?.ast;
|
|
441
|
+
const resultSteps = statementResult["steps"];
|
|
442
|
+
const queryIntent = extractQueryIntentFromAst(statementAst);
|
|
443
|
+
let lastResult = true;
|
|
444
|
+
for (let i = resultSteps.length - 1; i >= 0; i--) {
|
|
445
|
+
if (i != resultSteps.length - 1) {
|
|
446
|
+
lastResult = false;
|
|
447
|
+
}
|
|
448
|
+
const step = resultSteps[i];
|
|
449
|
+
allDisplayingObjects = [];
|
|
450
|
+
// console.log(`last executed step ${JSON.stringify(step)}`);
|
|
451
|
+
const stepResult = step.result;
|
|
452
|
+
if (stepResult.type === "object") {
|
|
453
|
+
allDisplayingObjects.push(stepResult);
|
|
454
|
+
} else if (stepResult.type === "array") {
|
|
455
|
+
for (const element of stepResult.value) {
|
|
456
|
+
allDisplayingObjects.push(element);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
const primaryValue = allDisplayingObjects.length > 0 ? allDisplayingObjects[0].value : null;
|
|
460
|
+
// check if object can be displayed
|
|
461
|
+
if (allDisplayingObjects.length === 1) {
|
|
462
|
+
displayingObjectType = allDisplayingObjects[0].objectType;
|
|
463
|
+
displayingObject = allDisplayingObjects[0];
|
|
464
|
+
if (primaryValue && Object.hasOwn(allDisplayingObjects[0], "value") && Object.hasOwn(primaryValue, "localStore") && allDisplayingObjects[0].value.localStore.__genieObjectType === "HelperClass") {
|
|
465
|
+
displayingObjectType = "undefined";
|
|
466
|
+
displayingObject = null;
|
|
467
|
+
}
|
|
468
|
+
} else if (allDisplayingObjects.length > 1) {
|
|
469
|
+
displayingObjectType = allDisplayingObjects[0].objectType + "[]";
|
|
470
|
+
displayingObject = allDisplayingObjects;
|
|
471
|
+
if (primaryValue && Object.hasOwn(allDisplayingObjects[0], "value") && Object.hasOwn(primaryValue, "localStore") && allDisplayingObjects[0].value.localStore.__genieObjectType === "HelperClass") {
|
|
472
|
+
displayingObjectType = "undefined";
|
|
473
|
+
displayingObject = null;
|
|
474
|
+
}
|
|
475
|
+
} else if (allDisplayingObjects.length === 0) {
|
|
476
|
+
displayingObjectType = "undefined";
|
|
477
|
+
displayingObject = null;
|
|
478
|
+
}
|
|
479
|
+
// if displayingObjectType in the keys of AllGenieObjectInterfaces
|
|
480
|
+
if (_reactDecorators.AllGenieObjectInterfaces.supportedTypes.has(displayingObjectType)) {
|
|
481
|
+
break;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
let cannotdisplay = false;
|
|
485
|
+
let onScreen = true;
|
|
486
|
+
let instantiatedDisplayingObject = null;
|
|
487
|
+
if (displayingObject != null) {
|
|
488
|
+
// if displayingObject is an array
|
|
489
|
+
if (displayingObject instanceof Array) {
|
|
490
|
+
// always display
|
|
491
|
+
onScreen = false;
|
|
492
|
+
instantiatedDisplayingObject = [];
|
|
493
|
+
for (const element of displayingObject) {
|
|
494
|
+
const Instance = (0, _reactDecorators.InstantiateGenieObject)({
|
|
495
|
+
className: element.objectType,
|
|
496
|
+
key: element.value
|
|
497
|
+
});
|
|
498
|
+
if (Instance === undefined) {
|
|
499
|
+
cannotdisplay = true;
|
|
500
|
+
break;
|
|
501
|
+
}
|
|
502
|
+
instantiatedDisplayingObject.push(Instance);
|
|
503
|
+
}
|
|
504
|
+
} else {
|
|
505
|
+
const Instance = (0, _reactDecorators.InstantiateGenieObject)({
|
|
506
|
+
className: displayingObject.objectType,
|
|
507
|
+
key: displayingObject.value
|
|
508
|
+
});
|
|
509
|
+
if (Instance === undefined) cannotdisplay = true;else {
|
|
510
|
+
if (lastResult) {
|
|
511
|
+
// always display
|
|
512
|
+
onScreen = false;
|
|
513
|
+
} else {
|
|
514
|
+
// check if displayingObjects is on screen already
|
|
515
|
+
const targetInterface = genieInterfaces.find(genieInterface => genieInterface.className === Instance.constructor.name && (0, _reactRedux.shallowEqual)(genieInterface.key, Instance._getConstructorParams()));
|
|
516
|
+
if (!targetInterface) {
|
|
517
|
+
onScreen = false;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
instantiatedDisplayingObject = Instance;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
_modalityProviderV.GenieInterpreter.nlParser.respond(transcript, parsed, JSON.stringify(buildResultDigest(
|
|
525
|
+
// now we only display the last result
|
|
526
|
+
executionResult.results[executionResult.results.length - 1].result, parsed))).then(result => {
|
|
527
|
+
console.log(`respond result: ${result}`);
|
|
528
|
+
(0, _reactgenieDsl.genieDispatch)(() => {
|
|
529
|
+
const reactGenieState = _reactgenieDsl.sharedState;
|
|
530
|
+
if (result !== null) {
|
|
531
|
+
reactGenieState.message = _objectSpread(_objectSpread({}, result), {}, {
|
|
532
|
+
origin: "voice",
|
|
533
|
+
message: result.fullText
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
let resultEntry = null;
|
|
537
|
+
if (!cannotdisplay && allDisplayingObjects.length > 0) {
|
|
538
|
+
const orderedConstructorParams = allDisplayingObjects.map(displayingObject => createImmutableConstructorParamsSnapshot(displayingObject.value)).filter(params => params !== null && typeof params === "object");
|
|
539
|
+
if (orderedConstructorParams.length > 0 && displayingObjectType) {
|
|
540
|
+
const predictedEventId = reactGenieState.navStack + 1;
|
|
541
|
+
resultEntry = putResultWindowEntry(reactGenieState, {
|
|
542
|
+
eventId: predictedEventId,
|
|
543
|
+
resultObjectType: displayingObjectType,
|
|
544
|
+
orderedConstructorParams
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
if (!onScreen && !cannotdisplay) {
|
|
549
|
+
reactGenieState.navState = {
|
|
550
|
+
objectViewClassName: _reactDecorators.AllGenieObjectInterfaces.getInterfaces(instantiatedDisplayingObject).viewClassName,
|
|
551
|
+
objectConstructorParams: allDisplayingObjects.length === 1 ? allDisplayingObjects[0].value._getConstructorParams() : {
|
|
552
|
+
elements: allDisplayingObjects.map(displayingObject => displayingObject.value._getConstructorParams())
|
|
553
|
+
},
|
|
554
|
+
queryIntent,
|
|
555
|
+
resultRef: resultEntry?.resultRef ?? null,
|
|
556
|
+
resultObjectType: displayingObjectType || null
|
|
557
|
+
};
|
|
558
|
+
reactGenieState.navStack += 1;
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
}).catch(error => {
|
|
562
|
+
_logger.logger.error('error generating response:', error);
|
|
563
|
+
(0, _reactgenieDsl.genieDispatch)(() => {
|
|
564
|
+
const reactGenieState = _reactgenieDsl.sharedState;
|
|
565
|
+
reactGenieState.message = createSystemMessage("Done.", "Done.", "info", false);
|
|
566
|
+
});
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
// console.log(`after executing state ${JSON.stringify(sharedState)}`);
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Reset navigation state to prevent infinite navigation loops
|
|
575
|
+
* Call this after intercepting and handling navigation in expo-router
|
|
576
|
+
*/
|
|
577
|
+
function resetGenieNavigation() {
|
|
578
|
+
(0, _reactgenieDsl.genieDispatch)(() => {
|
|
579
|
+
const reactGenieState = _reactgenieDsl.sharedState;
|
|
580
|
+
reactGenieState.navState = {
|
|
581
|
+
objectViewClassName: null,
|
|
582
|
+
objectConstructorParams: null,
|
|
583
|
+
queryIntent: null,
|
|
584
|
+
resultRef: null,
|
|
585
|
+
resultObjectType: null
|
|
586
|
+
};
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9kYWxpdHlQcm92aWRlclYiLCJyZXF1aXJlIiwiX3JlYWN0RGVjb3JhdG9ycyIsIl9yZWFjdFJlZHV4IiwiX3JlYWN0Z2VuaWVEc2wiLCJfbG9nZ2VyIiwiX2Vycm9ycyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwidWlBY3RpdmUiLCJleHBvcnRzIiwiREVGQVVMVF9SRVNVTFRfV0lORE9XX01BWCIsIkRFRkFVTFRfUkVTVUxUX1dJTkRPV19UVExfTVMiLCJnZXRDb25zdHJ1Y3RvclBhcmFtc0Zyb21SZXN1bHRWYWx1ZSIsIl9nZXRDb25zdHJ1Y3RvclBhcmFtcyIsImRlZXBGcmVlemVPYmplY3QiLCJmcmVlemUiLCJrZXkiLCJuZXN0ZWQiLCJpc0Zyb3plbiIsImNsb25lRGV0YWNoZWRWYWx1ZSIsIm5hdGl2ZVN0cnVjdHVyZWRDbG9uZSIsImdsb2JhbFRoaXMiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJjbG9uZWQiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlcnJvciIsImxvZ2dlciIsIndhcm4iLCJjcmVhdGVJbW11dGFibGVDb25zdHJ1Y3RvclBhcmFtc1NuYXBzaG90IiwiY29uc3RydWN0b3JQYXJhbXMiLCJzbmFwc2hvdCIsImVuc3VyZVJlc3VsdFdpbmRvd0RlZmF1bHRzIiwic3RhdGUiLCJyZXN1bHRXaW5kb3dCeVJlZiIsInJlc3VsdFdpbmRvd09yZGVyIiwicmVzdWx0V2luZG93TWF4IiwicmVzdWx0V2luZG93VHRsTXMiLCJpc0Zpbml0ZSIsInJlc3VsdFdpbmRvd1NlcXVlbmNlIiwicHJ1bmVSZXN1bHRXaW5kb3ciLCJub3ciLCJEYXRlIiwibWluQ3JlYXRlZEF0IiwicmVzdWx0UmVmIiwiZW50cnkiLCJjcmVhdGVkQXQiLCJvbGRlc3RSZWYiLCJzaGlmdCIsInB1dFJlc3VsdFdpbmRvd0VudHJ5IiwiZXZlbnRJZCIsImNvbXBsZXRlRW50cnkiLCJoYXNoU3RyaW5nIiwiaGFzaCIsImNoYXJDb2RlQXQiLCJNYXRoIiwiYWJzIiwidG9TdHJpbmciLCJhY2Nlc3NvckZpZWxkVG9QYXRoIiwiZmllbGQiLCJ0eXBlIiwicGFyZW50IiwiYWNjZXNzIiwiYXN0VmFsdWVUb1ByaW1pdGl2ZSIsImFzdCIsInVuZGVmaW5lZCIsIm9iamVjdFR5cGUiLCJjb2xsZWN0RnVuY3Rpb25DYWxscyIsImNhbGxzIiwiZnVuY19uYW1lIiwicGFyYW1ldGVycyIsInBhcmFtZXRlciIsImluZGV4IiwiZ2V0Q2FsbFBhcmFtIiwicGFyYW1OYW1lIiwiQXJyYXkiLCJpc0FycmF5IiwiZmluZCIsInBhcmFtIiwiZXh0cmFjdFF1ZXJ5SW50ZW50RnJvbUFzdCIsInJldmVyc2UiLCJvcHMiLCJmdW5jTmFtZSIsImZpZWxkQXN0IiwidmFsdWVBc3QiLCJmaWVsZFBhdGgiLCJraW5kIiwiZnJvbSIsInRvIiwiYXNjZW5kaW5nIiwiQm9vbGVhbiIsInNlcmlhbGl6ZWQiLCJ1c2VHZW5pZUNvZGVTZWxlY3RvciIsImNvbW1hbmQiLCJzZXRTaGFyZWRTdGF0ZSIsInJlc3VsdCIsIkdlbmllSW50ZXJwcmV0ZXIiLCJkc2xJbnRlcnByZXRlciIsImludGVycHJldCIsInNoYWxsb3dFcXVhbFdpdGhBcnJheSIsImxlZnQiLCJyaWdodCIsInNoYWxsb3dFcXVhbCIsImNvbnZlcnRHZW5pZUNsYXNzVG9TdGF0ZSIsIm9iaiIsIm1hcCIsImVsZW1lbnQiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsIkdlbmllT2JqZWN0IiwiRGF0YUNsYXNzIiwiX19nZW5pZU9iamVjdFR5cGUiLCJfX2dlbmllT2JqZWN0Q2xhc3MiLCJuYW1lIiwiX19nZW5pZU9iamVjdEtleSIsImdlbmllS2V5IiwiX19nZXRTdGF0ZSIsIkhlbHBlckNsYXNzIiwibG9jYWxTdG9yZSIsIkVycm9yIiwidXNlR2VuaWVTZWxlY3RvciIsInNlbGVjdG9yIiwic2VsZWN0b3JSZXN1bHQiLCJ1c2VTZWxlY3RvciIsIlJFU1VMVF9QUkVWSUVXX01BWF9MRU5HVEgiLCJ0cnVuY2F0ZVRleHQiLCJtYXhMZW5ndGgiLCJzbGljZSIsIm1heCIsInRyaW1FbmQiLCJjcmVhdGVTeXN0ZW1NZXNzYWdlIiwibWluaW1hbFRleHQiLCJmdWxsVGV4dCIsInNob3VsZFNwZWFrIiwib3JpZ2luIiwibWVzc2FnZSIsImNyZWF0ZVVzZXJGYWNpbmdNZXNzYWdlIiwic2hvdWxkU3BlYWtCeURlZmF1bHQiLCJzYWZlU2VyaWFsaXplVmFsdWUiLCJidWlsZFJlc3VsdERpZ2VzdCIsInBhcnNlZCIsInN0YXR1cyIsInJlc3VsdFR5cGUiLCJ2YWx1ZXMiLCJmaXJzdCIsImZpcnN0T2JqZWN0VHlwZSIsImZpcnN0UHJldmlldyIsImNvdW50IiwicHJldmlldyIsImV4ZWN1dGVHZW5pZUNvZGUiLCJvcHRpb25zIiwic2FuaXRpemVkIiwidHJpbSIsIm1lc3NhZ2VPcmlnaW4iLCJzaG91bGRTcGVha0Vycm9ycyIsImdlbmllRGlzcGF0Y2giLCJyZWFjdEdlbmllU3RhdGUiLCJzaGFyZWRTdGF0ZSIsInN1Y2Nlc3MiLCJyZXN1bHRzIiwiaW50ZXJwcmV0U3RlcHMiLCJpc0dlbmllVXNlckZhY2luZ0Vycm9yIiwiZGlzcGxheVJlc3VsdCIsImV4ZWN1dGlvblJlc3VsdCIsInRyYW5zY3JpcHQiLCJnZW5pZUludGVyZmFjZXMiLCJhbGxEaXNwbGF5aW5nT2JqZWN0cyIsImRpc3BsYXlpbmdPYmplY3QiLCJkaXNwbGF5aW5nT2JqZWN0VHlwZSIsInN0YXRlbWVudFJlc3VsdCIsInN0YXRlbWVudEFzdCIsInJlc3VsdFN0ZXBzIiwicXVlcnlJbnRlbnQiLCJsYXN0UmVzdWx0Iiwic3RlcCIsInN0ZXBSZXN1bHQiLCJwcmltYXJ5VmFsdWUiLCJoYXNPd24iLCJBbGxHZW5pZU9iamVjdEludGVyZmFjZXMiLCJzdXBwb3J0ZWRUeXBlcyIsImhhcyIsImNhbm5vdGRpc3BsYXkiLCJvblNjcmVlbiIsImluc3RhbnRpYXRlZERpc3BsYXlpbmdPYmplY3QiLCJJbnN0YW5jZSIsIkluc3RhbnRpYXRlR2VuaWVPYmplY3QiLCJjbGFzc05hbWUiLCJ0YXJnZXRJbnRlcmZhY2UiLCJnZW5pZUludGVyZmFjZSIsIm5sUGFyc2VyIiwicmVzcG9uZCIsInRoZW4iLCJjb25zb2xlIiwibG9nIiwicmVzdWx0RW50cnkiLCJvcmRlcmVkQ29uc3RydWN0b3JQYXJhbXMiLCJwYXJhbXMiLCJwcmVkaWN0ZWRFdmVudElkIiwibmF2U3RhY2siLCJyZXN1bHRPYmplY3RUeXBlIiwibmF2U3RhdGUiLCJvYmplY3RWaWV3Q2xhc3NOYW1lIiwiZ2V0SW50ZXJmYWNlcyIsInZpZXdDbGFzc05hbWUiLCJvYmplY3RDb25zdHJ1Y3RvclBhcmFtcyIsImVsZW1lbnRzIiwiY2F0Y2giLCJyZXNldEdlbmllTmF2aWdhdGlvbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zaGFyZWQtc3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuaWVJbnRlcnByZXRlciB9IGZyb20gXCIuL21vZGFsaXR5LXByb3ZpZGVyLXYyXCI7XG5pbXBvcnQge1xuICBBbGxHZW5pZU9iamVjdEludGVyZmFjZXMsXG4gIEdlbmllSW50ZXJmYWNlU3BlYyxcbiAgSW5zdGFudGlhdGVHZW5pZU9iamVjdCxcbn0gZnJvbSBcIi4vcmVhY3QtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgc2hhbGxvd0VxdWFsLCB1c2VTZWxlY3RvciB9IGZyb20gXCJyZWFjdC1yZWR1eFwiO1xuaW1wb3J0IHtcbiAgRGF0YUNsYXNzLFxuICBHZW5pZU9iamVjdCxcbiAgSGVscGVyQ2xhc3MsXG4gIHNldFNoYXJlZFN0YXRlLFxufSBmcm9tIFwiQGdhcnJpeDgyL3JlYWN0Z2VuaWUtZHNsXCI7XG5pbXBvcnQgeyBnZW5pZURpc3BhdGNoLCBzaGFyZWRTdGF0ZSB9IGZyb20gXCJAZ2Fycml4ODIvcmVhY3RnZW5pZS1kc2xcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZ2dlclwiO1xuaW1wb3J0IHsgR2VuaWVVc2VyRmFjaW5nRXJyb3IsIGlzR2VuaWVVc2VyRmFjaW5nRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuZXhwb3J0IHR5cGUgUmVhY3RHZW5pZVN0YXRlID0ge1xuICBtZXNzYWdlOiBSZWFjdEdlbmllTWVzc2FnZTtcbiAgbmF2U3RhdGU6IE5hdmlnYXRvclN0YXRlO1xuICBuYXZTdGFjazogbnVtYmVyO1xuICByZXN1bHRXaW5kb3dCeVJlZjogUmVjb3JkPHN0cmluZywgUmVzdWx0V2luZG93RW50cnk+O1xuICByZXN1bHRXaW5kb3dPcmRlcjogc3RyaW5nW107XG4gIHJlc3VsdFdpbmRvd01heDogbnVtYmVyO1xuICByZXN1bHRXaW5kb3dUdGxNczogbnVtYmVyO1xuICByZXN1bHRXaW5kb3dTZXF1ZW5jZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgUmVhY3RHZW5pZU1lc3NhZ2UgPSBBZ2VudFJlc3BvbnNlUGF5bG9hZCAmIHtcbiAgb3JpZ2luOiBcInZvaWNlXCIgfCBcInN5c3RlbVwiO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgUXVlcnlJbnRlbnRPcGVyYXRpb24gPVxuICB8IHtcbiAgICAgIGtpbmQ6IFwibWF0Y2hpbmdcIiB8IFwiY29udGFpbnNcIiB8IFwiZXF1YWxzXCI7XG4gICAgICBmaWVsZDogc3RyaW5nO1xuICAgICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwiYmV0d2VlblwiO1xuICAgICAgZmllbGQ6IHN0cmluZztcbiAgICAgIGZyb20/OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuICAgICAgdG8/OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiBcInNvcnRcIjtcbiAgICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgICBhc2NlbmRpbmc6IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwiaW5kZXhcIjtcbiAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwibGVuZ3RoXCI7XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgUXVlcnlJbnRlbnQgPSB7XG4gIG9wczogUXVlcnlJbnRlbnRPcGVyYXRpb25bXTtcbiAgaGFzaDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgUmVzdWx0V2luZG93RW50cnkgPSB7XG4gIHJlc3VsdFJlZjogc3RyaW5nO1xuICBldmVudElkOiBudW1iZXI7XG4gIHJlc3VsdE9iamVjdFR5cGU6IHN0cmluZztcbiAgb3JkZXJlZENvbnN0cnVjdG9yUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xufTtcblxudHlwZSBBZ2VudFJlc3BvbnNlUGF5bG9hZCA9IHtcbiAgbWluaW1hbFRleHQ6IHN0cmluZztcbiAgZnVsbFRleHQ6IHN0cmluZztcbiAgdHlwZTogXCJpbmZvXCIgfCBcImVycm9yXCIgfCBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiO1xuICBzaG91bGRTcGVhazogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBsZXQgdWlBY3RpdmUgPSB0cnVlO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5hdmlnYXRvclN0YXRlIHtcbiAgb2JqZWN0Vmlld0NsYXNzTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgb2JqZWN0Q29uc3RydWN0b3JQYXJhbXM6IGFueTtcbiAgcXVlcnlJbnRlbnQ/OiBRdWVyeUludGVudCB8IG51bGw7XG4gIHJlc3VsdFJlZj86IHN0cmluZyB8IG51bGw7XG4gIHJlc3VsdE9iamVjdFR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5jb25zdCBERUZBVUxUX1JFU1VMVF9XSU5ET1dfTUFYID0gNDA7XG5jb25zdCBERUZBVUxUX1JFU1VMVF9XSU5ET1dfVFRMX01TID0gNSAqIDYwICogMTAwMDtcblxuZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JQYXJhbXNGcm9tUmVzdWx0VmFsdWUodmFsdWU6IGFueSk6IGFueSB8IG51bGwge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZS5fZ2V0Q29uc3RydWN0b3JQYXJhbXMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB2YWx1ZS5fZ2V0Q29uc3RydWN0b3JQYXJhbXMoKTtcbn1cblxuZnVuY3Rpb24gZGVlcEZyZWV6ZU9iamVjdDxUPih2YWx1ZTogVCk6IFQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBPYmplY3QuZnJlZXplKHZhbHVlKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUgYXMgYW55KSkge1xuICAgIGNvbnN0IG5lc3RlZCA9ICh2YWx1ZSBhcyBhbnkpW2tleV07XG4gICAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSBcIm9iamVjdFwiICYmICFPYmplY3QuaXNGcm96ZW4obmVzdGVkKSkge1xuICAgICAgZGVlcEZyZWV6ZU9iamVjdChuZXN0ZWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsb25lRGV0YWNoZWRWYWx1ZTxUPih2YWx1ZTogVCk6IFQgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBuYXRpdmVTdHJ1Y3R1cmVkQ2xvbmUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZTtcbiAgICBjb25zdCBjbG9uZWQgPVxuICAgICAgdHlwZW9mIG5hdGl2ZVN0cnVjdHVyZWRDbG9uZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gbmF0aXZlU3RydWN0dXJlZENsb25lKHZhbHVlKVxuICAgICAgICA6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICByZXR1cm4gZGVlcEZyZWV6ZU9iamVjdChjbG9uZWQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgXCJbUmVhY3RHZW5pZV0gVW5hYmxlIHRvIGNsb25lIGNvbnN0cnVjdG9yIHBhcmFtcyBmb3IgcmVzdWx0IHdpbmRvdyBzbmFwc2hvdFwiLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW1tdXRhYmxlQ29uc3RydWN0b3JQYXJhbXNTbmFwc2hvdChcbiAgdmFsdWU6IGFueSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsIHtcbiAgY29uc3QgY29uc3RydWN0b3JQYXJhbXMgPSBnZXRDb25zdHJ1Y3RvclBhcmFtc0Zyb21SZXN1bHRWYWx1ZSh2YWx1ZSk7XG4gIGlmICghY29uc3RydWN0b3JQYXJhbXMgfHwgdHlwZW9mIGNvbnN0cnVjdG9yUGFyYW1zICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgc25hcHNob3QgPSBjbG9uZURldGFjaGVkVmFsdWUoY29uc3RydWN0b3JQYXJhbXMpO1xuICBpZiAoIXNuYXBzaG90IHx8IHR5cGVvZiBzbmFwc2hvdCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBzbmFwc2hvdCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5mdW5jdGlvbiBlbnN1cmVSZXN1bHRXaW5kb3dEZWZhdWx0cyhzdGF0ZTogUmVhY3RHZW5pZVN0YXRlKSB7XG4gIC8vIGBnZW5pZURpc3BhdGNoYCBzdGFydHMgZnJvbSBhIHNoYWxsb3cgY29weSBvZiB0aGUgcHJldmlvdXMgc3RhdGUuXG4gIC8vIENsb25lIG11dGFibGUgcmVzdWx0LXdpbmRvdyBjb250YWluZXJzIGJlZm9yZSB3cml0ZXMgc28gd2UgZG9uJ3QgbXV0YXRlXG4gIC8vIHJlZmVyZW5jZXMgZnJvbSB0aGUgcHJldmlvdXMgUmVkdXggc3RhdGUgc25hcHNob3QuXG4gIHN0YXRlLnJlc3VsdFdpbmRvd0J5UmVmID0gc3RhdGUucmVzdWx0V2luZG93QnlSZWZcbiAgICA/IHsgLi4uc3RhdGUucmVzdWx0V2luZG93QnlSZWYgfVxuICAgIDoge307XG4gIHN0YXRlLnJlc3VsdFdpbmRvd09yZGVyID0gc3RhdGUucmVzdWx0V2luZG93T3JkZXJcbiAgICA/IFsuLi5zdGF0ZS5yZXN1bHRXaW5kb3dPcmRlcl1cbiAgICA6IFtdO1xuICBpZiAoIXN0YXRlLnJlc3VsdFdpbmRvd01heCB8fCBzdGF0ZS5yZXN1bHRXaW5kb3dNYXggPD0gMCkge1xuICAgIHN0YXRlLnJlc3VsdFdpbmRvd01heCA9IERFRkFVTFRfUkVTVUxUX1dJTkRPV19NQVg7XG4gIH1cbiAgaWYgKCFzdGF0ZS5yZXN1bHRXaW5kb3dUdGxNcyB8fCBzdGF0ZS5yZXN1bHRXaW5kb3dUdGxNcyA8PSAwKSB7XG4gICAgc3RhdGUucmVzdWx0V2luZG93VHRsTXMgPSBERUZBVUxUX1JFU1VMVF9XSU5ET1dfVFRMX01TO1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHN0YXRlLnJlc3VsdFdpbmRvd1NlcXVlbmNlKSkge1xuICAgIHN0YXRlLnJlc3VsdFdpbmRvd1NlcXVlbmNlID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcnVuZVJlc3VsdFdpbmRvdyhzdGF0ZTogUmVhY3RHZW5pZVN0YXRlLCBub3cgPSBEYXRlLm5vdygpKSB7XG4gIGVuc3VyZVJlc3VsdFdpbmRvd0RlZmF1bHRzKHN0YXRlKTtcbiAgY29uc3QgbWluQ3JlYXRlZEF0ID0gbm93IC0gc3RhdGUucmVzdWx0V2luZG93VHRsTXM7XG4gIHN0YXRlLnJlc3VsdFdpbmRvd09yZGVyID0gc3RhdGUucmVzdWx0V2luZG93T3JkZXIuZmlsdGVyKChyZXN1bHRSZWYpID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IHN0YXRlLnJlc3VsdFdpbmRvd0J5UmVmW3Jlc3VsdFJlZl07XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZW50cnkuY3JlYXRlZEF0IDwgbWluQ3JlYXRlZEF0KSB7XG4gICAgICBkZWxldGUgc3RhdGUucmVzdWx0V2luZG93QnlSZWZbcmVzdWx0UmVmXTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuXG4gIHdoaWxlIChzdGF0ZS5yZXN1bHRXaW5kb3dPcmRlci5sZW5ndGggPiBzdGF0ZS5yZXN1bHRXaW5kb3dNYXgpIHtcbiAgICBjb25zdCBvbGRlc3RSZWYgPSBzdGF0ZS5yZXN1bHRXaW5kb3dPcmRlci5zaGlmdCgpO1xuICAgIGlmICghb2xkZXN0UmVmKSBicmVhaztcbiAgICBkZWxldGUgc3RhdGUucmVzdWx0V2luZG93QnlSZWZbb2xkZXN0UmVmXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXRSZXN1bHRXaW5kb3dFbnRyeShcbiAgc3RhdGU6IFJlYWN0R2VuaWVTdGF0ZSxcbiAgZW50cnk6IE9taXQ8UmVzdWx0V2luZG93RW50cnksIFwicmVzdWx0UmVmXCIgfCBcImNyZWF0ZWRBdFwiPixcbik6IFJlc3VsdFdpbmRvd0VudHJ5IHtcbiAgZW5zdXJlUmVzdWx0V2luZG93RGVmYXVsdHMoc3RhdGUpO1xuICBzdGF0ZS5yZXN1bHRXaW5kb3dTZXF1ZW5jZSArPSAxO1xuICBjb25zdCByZXN1bHRSZWYgPSBgcmctJHtlbnRyeS5ldmVudElkfS0ke3N0YXRlLnJlc3VsdFdpbmRvd1NlcXVlbmNlfWA7XG4gIGNvbnN0IGNyZWF0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IGNvbXBsZXRlRW50cnk6IFJlc3VsdFdpbmRvd0VudHJ5ID0ge1xuICAgIC4uLmVudHJ5LFxuICAgIHJlc3VsdFJlZixcbiAgICBjcmVhdGVkQXQsXG4gIH07XG4gIHN0YXRlLnJlc3VsdFdpbmRvd0J5UmVmW3Jlc3VsdFJlZl0gPSBjb21wbGV0ZUVudHJ5O1xuICBzdGF0ZS5yZXN1bHRXaW5kb3dPcmRlci5wdXNoKHJlc3VsdFJlZik7XG4gIHBydW5lUmVzdWx0V2luZG93KHN0YXRlLCBjcmVhdGVkQXQpO1xuICByZXR1cm4gY29tcGxldGVFbnRyeTtcbn1cblxuZnVuY3Rpb24gaGFzaFN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGhhc2ggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHZhbHVlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwO1xuICB9XG4gIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIGFjY2Vzc29yRmllbGRUb1BhdGgoZmllbGQ6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIGZpZWxkID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9XG4gIGlmICghZmllbGQgfHwgdHlwZW9mIGZpZWxkICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYWNjZXNzXCIpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBhY2Nlc3NvckZpZWxkVG9QYXRoKGZpZWxkLnBhcmVudCk7XG4gICAgaWYgKCFwYXJlbnQgfHwgdHlwZW9mIGZpZWxkLmFjY2VzcyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBgJHtwYXJlbnR9LiR7ZmllbGQuYWNjZXNzfWA7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFzdFZhbHVlVG9QcmltaXRpdmUoYXN0OiBhbnkpOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFhc3QgfHwgdHlwZW9mIGFzdCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGFzdC50eXBlID09PSBcInN0cmluZ1wiIHx8IGFzdC50eXBlID09PSBcImludFwiIHx8IGFzdC50eXBlID09PSBcImZsb2F0XCIgfHwgYXN0LnR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIGFzdC52YWx1ZTtcbiAgfVxuICBpZiAoYXN0LnR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAoXG4gICAgICBhc3Qub2JqZWN0VHlwZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgYXN0Lm9iamVjdFR5cGUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgIGFzdC5vYmplY3RUeXBlID09PSBcImZsb2F0XCIgfHxcbiAgICAgIGFzdC5vYmplY3RUeXBlID09PSBcImludFwiIHx8XG4gICAgICBhc3Qub2JqZWN0VHlwZSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIGFzdC5vYmplY3RUeXBlID09PSBcImJvb2xcIlxuICAgICkge1xuICAgICAgcmV0dXJuIGFzdC52YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEZ1bmN0aW9uQ2FsbHMoYXN0OiBhbnksIGNhbGxzOiBhbnlbXSA9IFtdKTogYW55W10ge1xuICBpZiAoIWFzdCB8fCB0eXBlb2YgYXN0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGNhbGxzO1xuICB9XG5cbiAgaWYgKGFzdC50eXBlID09PSBcImluZGV4XCIpIHtcbiAgICBjYWxscy5wdXNoKHtcbiAgICAgIHR5cGU6IFwiZnVuY3Rpb25fY2FsbFwiLFxuICAgICAgZnVuY19uYW1lOiBcImluZGV4XCIsXG4gICAgICBwYXJhbWV0ZXJzOiBbeyBwYXJhbWV0ZXI6IFwiaW5kZXhcIiwgdmFsdWU6IHsgdHlwZTogXCJpbnRcIiwgdmFsdWU6IGFzdC5pbmRleCB9IH1dLFxuICAgIH0pO1xuICAgIHJldHVybiBjb2xsZWN0RnVuY3Rpb25DYWxscyhhc3QucGFyZW50LCBjYWxscyk7XG4gIH1cblxuICBpZiAoYXN0LnR5cGUgPT09IFwiYWNjZXNzXCIpIHtcbiAgICBpZiAoYXN0LmFjY2VzcyAmJiBhc3QuYWNjZXNzLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICBjYWxscy5wdXNoKGFzdC5hY2Nlc3MpO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdEZ1bmN0aW9uQ2FsbHMoYXN0LnBhcmVudCwgY2FsbHMpO1xuICB9XG5cbiAgcmV0dXJuIGNhbGxzO1xufVxuXG5mdW5jdGlvbiBnZXRDYWxsUGFyYW0oY2FsbDogYW55LCBwYXJhbU5hbWU6IHN0cmluZyk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FsbCB8fCAhQXJyYXkuaXNBcnJheShjYWxsLnBhcmFtZXRlcnMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBlbnRyeSA9IGNhbGwucGFyYW1ldGVycy5maW5kKChwYXJhbTogYW55KSA9PiBwYXJhbS5wYXJhbWV0ZXIgPT09IHBhcmFtTmFtZSk7XG4gIHJldHVybiBlbnRyeT8udmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UXVlcnlJbnRlbnRGcm9tQXN0KGFzdDogYW55KTogUXVlcnlJbnRlbnQgfCBudWxsIHtcbiAgY29uc3QgY2FsbHMgPSBjb2xsZWN0RnVuY3Rpb25DYWxscyhhc3QsIFtdKS5yZXZlcnNlKCk7XG4gIGNvbnN0IG9wczogUXVlcnlJbnRlbnRPcGVyYXRpb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgY2FsbCBvZiBjYWxscykge1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gY2FsbD8uZnVuY19uYW1lO1xuICAgIGlmIChmdW5jTmFtZSA9PT0gXCJtYXRjaGluZ1wiIHx8IGZ1bmNOYW1lID09PSBcImNvbnRhaW5zXCIgfHwgZnVuY05hbWUgPT09IFwiZXF1YWxzXCIpIHtcbiAgICAgIGNvbnN0IGZpZWxkQXN0ID0gZ2V0Q2FsbFBhcmFtKGNhbGwsIFwiZmllbGRcIik7XG4gICAgICBjb25zdCB2YWx1ZUFzdCA9IGdldENhbGxQYXJhbShjYWxsLCBcInZhbHVlXCIpO1xuICAgICAgY29uc3QgZmllbGRQYXRoID0gYWNjZXNzb3JGaWVsZFRvUGF0aChmaWVsZEFzdD8uZmllbGQpO1xuICAgICAgY29uc3QgdmFsdWUgPSBhc3RWYWx1ZVRvUHJpbWl0aXZlKHZhbHVlQXN0KTtcbiAgICAgIGlmIChmaWVsZFBhdGggJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHMucHVzaCh7XG4gICAgICAgICAga2luZDogZnVuY05hbWUsXG4gICAgICAgICAgZmllbGQ6IGZpZWxkUGF0aCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY05hbWUgPT09IFwiYmV0d2VlblwiKSB7XG4gICAgICBjb25zdCBmaWVsZEFzdCA9IGdldENhbGxQYXJhbShjYWxsLCBcImZpZWxkXCIpO1xuICAgICAgY29uc3QgZnJvbSA9IGFzdFZhbHVlVG9QcmltaXRpdmUoZ2V0Q2FsbFBhcmFtKGNhbGwsIFwiZnJvbVwiKSk7XG4gICAgICBjb25zdCB0byA9IGFzdFZhbHVlVG9QcmltaXRpdmUoZ2V0Q2FsbFBhcmFtKGNhbGwsIFwidG9cIikpO1xuICAgICAgY29uc3QgZmllbGRQYXRoID0gYWNjZXNzb3JGaWVsZFRvUGF0aChmaWVsZEFzdD8uZmllbGQpO1xuICAgICAgaWYgKGZpZWxkUGF0aCAmJiAoZnJvbSAhPT0gdW5kZWZpbmVkIHx8IHRvICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG9wcy5wdXNoKHtcbiAgICAgICAgICBraW5kOiBcImJldHdlZW5cIixcbiAgICAgICAgICBmaWVsZDogZmllbGRQYXRoLFxuICAgICAgICAgIC4uLihmcm9tICE9PSB1bmRlZmluZWQgPyB7IGZyb20gfSA6IHt9KSxcbiAgICAgICAgICAuLi4odG8gIT09IHVuZGVmaW5lZCA/IHsgdG8gfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY05hbWUgPT09IFwic29ydFwiKSB7XG4gICAgICBjb25zdCBmaWVsZEFzdCA9IGdldENhbGxQYXJhbShjYWxsLCBcImZpZWxkXCIpO1xuICAgICAgY29uc3QgYXNjZW5kaW5nID0gYXN0VmFsdWVUb1ByaW1pdGl2ZShnZXRDYWxsUGFyYW0oY2FsbCwgXCJhc2NlbmRpbmdcIikpO1xuICAgICAgY29uc3QgZmllbGRQYXRoID0gYWNjZXNzb3JGaWVsZFRvUGF0aChmaWVsZEFzdD8uZmllbGQpO1xuICAgICAgaWYgKGZpZWxkUGF0aCkge1xuICAgICAgICBvcHMucHVzaCh7XG4gICAgICAgICAga2luZDogXCJzb3J0XCIsXG4gICAgICAgICAgZmllbGQ6IGZpZWxkUGF0aCxcbiAgICAgICAgICBhc2NlbmRpbmc6IGFzY2VuZGluZyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IEJvb2xlYW4oYXNjZW5kaW5nKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY05hbWUgPT09IFwiaW5kZXhcIikge1xuICAgICAgY29uc3QgaW5kZXggPSBhc3RWYWx1ZVRvUHJpbWl0aXZlKGdldENhbGxQYXJhbShjYWxsLCBcImluZGV4XCIpKTtcbiAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgb3BzLnB1c2goe1xuICAgICAgICAgIGtpbmQ6IFwiaW5kZXhcIixcbiAgICAgICAgICB2YWx1ZTogaW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGZ1bmNOYW1lID09PSBcImxlbmd0aFwiKSB7XG4gICAgICBvcHMucHVzaCh7IGtpbmQ6IFwibGVuZ3RoXCIgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShvcHMpO1xuICByZXR1cm4ge1xuICAgIG9wcyxcbiAgICBoYXNoOiBoYXNoU3RyaW5nKHNlcmlhbGl6ZWQpLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgdXNlR2VuaWVDb2RlU2VsZWN0b3IgPSAoY29tbWFuZDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBhc3luYyAoc3RhdGU6IGFueSkgPT4ge1xuICAgIHVpQWN0aXZlID0gZmFsc2U7XG4gICAgc2V0U2hhcmVkU3RhdGUoc3RhdGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEdlbmllSW50ZXJwcmV0ZXIuZHNsSW50ZXJwcmV0ZXIuaW50ZXJwcmV0KGNvbW1hbmQpO1xuICAgIC8vIGxvZ2dlci5pbmZvKGBleGVjdXRlZCByZXN1bHQgJHtyZXN1bHR9YCk7XG4gICAgLy8gbG9nZ2VyLmluZm8oYGFmdGVyIGV4ZWN1dGluZyBzdGF0ZSAke0pTT04uc3RyaW5naWZ5KHN0YXRlKX1gKTtcbiAgICB1aUFjdGl2ZSA9IHRydWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbmNvbnN0IHNoYWxsb3dFcXVhbFdpdGhBcnJheSA9IChsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobGVmdCkgJiYgQXJyYXkuaXNBcnJheShyaWdodCkpIHtcbiAgICBpZiAobGVmdC5sZW5ndGggIT09IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlZnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghc2hhbGxvd0VxdWFsV2l0aEFycmF5KGxlZnRbaV0sIHJpZ2h0W2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzaGFsbG93RXF1YWwobGVmdCwgcmlnaHQpO1xuICB9XG59O1xuXG5jb25zdCBjb252ZXJ0R2VuaWVDbGFzc1RvU3RhdGUgPSAob2JqOiBhbnkpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKChlbGVtZW50KSA9PiBjb252ZXJ0R2VuaWVDbGFzc1RvU3RhdGUoZWxlbWVudCkpO1xuICB9IGVsc2UgaWYgKFxuICAgIG9iaiA9PT0gbnVsbCB8fFxuICAgIG9iaiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgb2JqLmNvbnN0cnVjdG9yID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfSBlbHNlIGlmIChvYmouY29uc3RydWN0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuaWVPYmplY3QpIHtcbiAgICBpZiAob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIERhdGFDbGFzcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19nZW5pZU9iamVjdFR5cGU6IFwiRGF0YUNsYXNzXCIsXG4gICAgICAgIF9fZ2VuaWVPYmplY3RDbGFzczogb2JqLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgIF9fZ2VuaWVPYmplY3RLZXk6IG9ialtvYmouZ2VuaWVLZXldLFxuICAgICAgICAuLi5vYmouX19nZXRTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBIZWxwZXJDbGFzcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19nZW5pZU9iamVjdFR5cGU6IFwiSGVscGVyQ2xhc3NcIixcbiAgICAgICAgX19nZW5pZU9iamVjdENsYXNzOiBvYmouY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgLi4ub2JqLmxvY2FsU3RvcmUsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIEdlbmllT2JqZWN0IHR5cGVcIik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVzZUdlbmllU2VsZWN0b3IgPSAoc2VsZWN0b3I6IGFueSkgPT4ge1xuICBsZXQgc2VsZWN0b3JSZXN1bHQ6IGFueSA9IHVuZGVmaW5lZDtcbiAgdXNlU2VsZWN0b3IoKHN0YXRlOiBhbnkpID0+IHtcbiAgICBzZXRTaGFyZWRTdGF0ZShzdGF0ZSk7XG4gICAgc2VsZWN0b3JSZXN1bHQgPSBzZWxlY3RvcihzdGF0ZSk7XG4gICAgcmV0dXJuIGNvbnZlcnRHZW5pZUNsYXNzVG9TdGF0ZShzZWxlY3RvclJlc3VsdCk7XG4gIH0sIHNoYWxsb3dFcXVhbFdpdGhBcnJheSk7XG4gIHJldHVybiBzZWxlY3RvclJlc3VsdDtcbn07XG5cbnR5cGUgR2VuaWVDb2RlUmVzdWx0ID0ge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICByZXN1bHRzOiBhbnlbXTtcbn07XG5cbmNvbnN0IFJFU1VMVF9QUkVWSUVXX01BWF9MRU5HVEggPSAxNjA7XG5cbmZ1bmN0aW9uIHRydW5jYXRlVGV4dCh2YWx1ZTogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZS5sZW5ndGggPD0gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBgJHt2YWx1ZS5zbGljZSgwLCBNYXRoLm1heCgwLCBtYXhMZW5ndGggLSAxKSkudHJpbUVuZCgpfeKApmA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN5c3RlbU1lc3NhZ2UoXG4gIG1pbmltYWxUZXh0OiBzdHJpbmcsXG4gIGZ1bGxUZXh0OiBzdHJpbmcsXG4gIHR5cGU6IEFnZW50UmVzcG9uc2VQYXlsb2FkW1widHlwZVwiXSA9IFwiaW5mb1wiLFxuICBzaG91bGRTcGVhayA9IGZhbHNlLFxuICBvcmlnaW46IFJlYWN0R2VuaWVNZXNzYWdlW1wib3JpZ2luXCJdID0gXCJzeXN0ZW1cIixcbik6IFJlYWN0R2VuaWVNZXNzYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBtaW5pbWFsVGV4dCxcbiAgICBmdWxsVGV4dCxcbiAgICB0eXBlLFxuICAgIHNob3VsZFNwZWFrLFxuICAgIG9yaWdpbixcbiAgICBtZXNzYWdlOiBmdWxsVGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVXNlckZhY2luZ01lc3NhZ2UoXG4gIGVycm9yOiBHZW5pZVVzZXJGYWNpbmdFcnJvcixcbiAgb3JpZ2luOiBSZWFjdEdlbmllTWVzc2FnZVtcIm9yaWdpblwiXSxcbiAgc2hvdWxkU3BlYWtCeURlZmF1bHQ6IGJvb2xlYW4sXG4pOiBSZWFjdEdlbmllTWVzc2FnZSB7XG4gIHJldHVybiB7XG4gICAgbWluaW1hbFRleHQ6IGVycm9yLm1pbmltYWxUZXh0LFxuICAgIGZ1bGxUZXh0OiBlcnJvci5mdWxsVGV4dCxcbiAgICB0eXBlOiBlcnJvci50eXBlLFxuICAgIHNob3VsZFNwZWFrOiBlcnJvci5zaG91bGRTcGVhayA/PyBzaG91bGRTcGVha0J5RGVmYXVsdCxcbiAgICBvcmlnaW4sXG4gICAgbWVzc2FnZTogZXJyb3IuZnVsbFRleHQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNhZmVTZXJpYWxpemVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBTdHJpbmcodmFsdWUpO1xuICByZXR1cm4gdHJ1bmNhdGVUZXh0KHNlcmlhbGl6ZWQsIFJFU1VMVF9QUkVWSUVXX01BWF9MRU5HVEgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlc3VsdERpZ2VzdChyZXN1bHQ6IGFueSwgcGFyc2VkOiBzdHJpbmcpIHtcbiAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJzZWQsXG4gICAgICBzdGF0dXM6IFwidW5rbm93blwiLFxuICAgICAgcmVzdWx0VHlwZTogXCJ1bmtub3duXCIsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXN1bHQudHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheShyZXN1bHQudmFsdWUpID8gcmVzdWx0LnZhbHVlIDogW107XG4gICAgY29uc3QgZmlyc3QgPSB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6IG51bGw7XG4gICAgY29uc3QgZmlyc3RPYmplY3RUeXBlID0gZmlyc3Q/Lm9iamVjdFR5cGUgfHwgbnVsbDtcbiAgICBjb25zdCBmaXJzdFByZXZpZXcgPVxuICAgICAgZmlyc3QgJiYgZmlyc3QudHlwZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IHNhZmVTZXJpYWxpemVWYWx1ZShmaXJzdC52YWx1ZSlcbiAgICAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlZCxcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgcmVzdWx0VHlwZTogXCJhcnJheVwiLFxuICAgICAgY291bnQ6IHZhbHVlcy5sZW5ndGgsXG4gICAgICBmaXJzdE9iamVjdFR5cGUsXG4gICAgICBmaXJzdFByZXZpZXcsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXN1bHQudHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJzZWQsXG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIHJlc3VsdFR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBvYmplY3RUeXBlOiByZXN1bHQub2JqZWN0VHlwZSB8fCBcInVua25vd25cIixcbiAgICAgIHByZXZpZXc6IHNhZmVTZXJpYWxpemVWYWx1ZShyZXN1bHQudmFsdWUpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcnNlZCxcbiAgICBzdGF0dXM6IFwib2tcIixcbiAgICByZXN1bHRUeXBlOiBcInVua25vd25cIixcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVHZW5pZUNvZGUoXG4gIGNvbW1hbmQ6IHVua25vd24sXG4gIG9wdGlvbnM6IHtcbiAgICBvcmlnaW4/OiBSZWFjdEdlbmllTWVzc2FnZVtcIm9yaWdpblwiXTtcbiAgICBzaG91bGRTcGVha0Vycm9ycz86IGJvb2xlYW47XG4gIH0gPSB7fSxcbik6IFByb21pc2U8R2VuaWVDb2RlUmVzdWx0PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkID1cbiAgICAgIHR5cGVvZiBjb21tYW5kID09PSBcInN0cmluZ1wiID8gY29tbWFuZC50cmltKCkgOiBcIlwiO1xuICAgIGNvbnN0IG1lc3NhZ2VPcmlnaW4gPSBvcHRpb25zLm9yaWdpbiA/PyBcInN5c3RlbVwiO1xuICAgIGNvbnN0IHNob3VsZFNwZWFrRXJyb3JzID0gQm9vbGVhbihvcHRpb25zLnNob3VsZFNwZWFrRXJyb3JzKTtcbiAgICAvLyBsb2dnZXIuaW5mbyhgZXhlY3V0aW5nIGNvbW1hbmQgOiAke3Nhbml0aXplZH1gKTtcblxuICAgIGlmICghc2FuaXRpemVkKSB7XG4gICAgICBnZW5pZURpc3BhdGNoKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVhY3RHZW5pZVN0YXRlID0gc2hhcmVkU3RhdGUgYXMgUmVhY3RHZW5pZVN0YXRlO1xuICAgICAgICByZWFjdEdlbmllU3RhdGUubWVzc2FnZSA9IGNyZWF0ZVN5c3RlbU1lc3NhZ2UoXG4gICAgICAgICAgXCJObyBhY3Rpb25hYmxlIGNvbW1hbmQuXCIsXG4gICAgICAgICAgXCJJIGhlYXJkIHlvdSwgYnV0IHRoZXJlIGlzIG5vIGFjdGlvbmFibGUgY29tbWFuZCB0byBydW4uXCIsXG4gICAgICAgICAgXCJpbmZvXCIsXG4gICAgICAgICAgc2hvdWxkU3BlYWtFcnJvcnMsXG4gICAgICAgICAgbWVzc2FnZU9yaWdpbixcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIHJlc3VsdHM6IFtuZXcgRXJyb3IoXCJObyBhY3Rpb25hYmxlIGNvbW1hbmRcIildLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHdWFyZCBhZ2FpbnN0IEdlbmllSW50ZXJwcmV0ZXIgbm90IGJlaW5nIGluaXRpYWxpemVkXG4gICAgaWYgKCFHZW5pZUludGVycHJldGVyIHx8ICFHZW5pZUludGVycHJldGVyLmRzbEludGVycHJldGVyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dlbmllSW50ZXJwcmV0ZXIgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICBnZW5pZURpc3BhdGNoKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVhY3RHZW5pZVN0YXRlID0gc2hhcmVkU3RhdGUgYXMgUmVhY3RHZW5pZVN0YXRlO1xuICAgICAgICByZWFjdEdlbmllU3RhdGUubWVzc2FnZSA9IGNyZWF0ZVN5c3RlbU1lc3NhZ2UoXG4gICAgICAgICAgXCJTeXN0ZW0gbm90IHJlYWR5LlwiLFxuICAgICAgICAgIFwiU3lzdGVtIG5vdCByZWFkeS4gUGxlYXNlIHRyeSBhZ2Fpbi5cIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgc2hvdWxkU3BlYWtFcnJvcnMsXG4gICAgICAgICAgbWVzc2FnZU9yaWdpbixcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIHJlc3VsdHM6IFtuZXcgRXJyb3IoJ0dlbmllSW50ZXJwcmV0ZXIgbm90IGluaXRpYWxpemVkJyldLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgYXdhaXQgR2VuaWVJbnRlcnByZXRlci5kc2xJbnRlcnByZXRlci5pbnRlcnByZXRTdGVwcyhzYW5pdGl6ZWQpO1xuICAgICAgLy8gY29uc29sZS5sb2coYGV4ZWN1dGVkIHJlc3VsdCAke3Jlc3VsdH1gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIHJlc3VsdHM6IHJlc3VsdCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdlcnJvciBleGVjdXRpbmcgY29tbWFuZDonLCBzYW5pdGl6ZWQsIGUpO1xuICAgICAgZ2VuaWVEaXNwYXRjaCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWN0R2VuaWVTdGF0ZSA9IHNoYXJlZFN0YXRlIGFzIFJlYWN0R2VuaWVTdGF0ZTtcbiAgICAgICAgcmVhY3RHZW5pZVN0YXRlLm1lc3NhZ2UgPSBpc0dlbmllVXNlckZhY2luZ0Vycm9yKGUpXG4gICAgICAgICAgPyBjcmVhdGVVc2VyRmFjaW5nTWVzc2FnZShlLCBtZXNzYWdlT3JpZ2luLCBzaG91bGRTcGVha0Vycm9ycylcbiAgICAgICAgICA6IGNyZWF0ZVN5c3RlbU1lc3NhZ2UoXG4gICAgICAgICAgICAgIFwiSSBjb3VsZCBub3QgcHJvY2VzcyB0aGF0LlwiLFxuICAgICAgICAgICAgICBcIlNvcnJ5LCBJIGRvbid0IHVuZGVyc3RhbmQuLi5cIixcbiAgICAgICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgICAgICBzaG91bGRTcGVha0Vycm9ycyxcbiAgICAgICAgICAgICAgbWVzc2FnZU9yaWdpbixcbiAgICAgICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICByZXN1bHRzOiBbZV0sXG4gICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlSZXN1bHQoXG4gIGV4ZWN1dGlvblJlc3VsdDogR2VuaWVDb2RlUmVzdWx0LFxuICB0cmFuc2NyaXB0OiBzdHJpbmcsXG4gIHBhcnNlZDogc3RyaW5nLFxuICBnZW5pZUludGVyZmFjZXM6IEdlbmllSW50ZXJmYWNlU3BlY1tdLFxuKSB7XG4gIGdlbmllRGlzcGF0Y2goKCkgPT4ge1xuICAgIGxldCBhbGxEaXNwbGF5aW5nT2JqZWN0cyA9IFtdO1xuICAgIGxldCBkaXNwbGF5aW5nT2JqZWN0ID0gbnVsbDtcbiAgICBsZXQgZGlzcGxheWluZ09iamVjdFR5cGUgPSBcIlwiO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50UmVzdWx0ID0gZXhlY3V0aW9uUmVzdWx0LnJlc3VsdHNbMF07XG4gICAgY29uc3Qgc3RhdGVtZW50QXN0ID0gc3RhdGVtZW50UmVzdWx0Py5hc3Q7XG4gICAgY29uc3QgcmVzdWx0U3RlcHM6IFt7IGFzdDogYW55OyByZXN1bHQ6IGFueSB9XSA9XG4gICAgICBzdGF0ZW1lbnRSZXN1bHRbXCJzdGVwc1wiXTtcbiAgICBjb25zdCBxdWVyeUludGVudCA9IGV4dHJhY3RRdWVyeUludGVudEZyb21Bc3Qoc3RhdGVtZW50QXN0KTtcbiAgICBsZXQgbGFzdFJlc3VsdCA9IHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gcmVzdWx0U3RlcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChpICE9IHJlc3VsdFN0ZXBzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgbGFzdFJlc3VsdCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RlcCA9IHJlc3VsdFN0ZXBzW2ldO1xuICAgICAgYWxsRGlzcGxheWluZ09iamVjdHMgPSBbXTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBsYXN0IGV4ZWN1dGVkIHN0ZXAgJHtKU09OLnN0cmluZ2lmeShzdGVwKX1gKTtcbiAgICAgIGNvbnN0IHN0ZXBSZXN1bHQgPSBzdGVwLnJlc3VsdDtcbiAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgYWxsRGlzcGxheWluZ09iamVjdHMucHVzaChzdGVwUmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RlcFJlc3VsdC50eXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHN0ZXBSZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICBhbGxEaXNwbGF5aW5nT2JqZWN0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBwcmltYXJ5VmFsdWUgPVxuICAgICAgICBhbGxEaXNwbGF5aW5nT2JqZWN0cy5sZW5ndGggPiAwID8gYWxsRGlzcGxheWluZ09iamVjdHNbMF0udmFsdWUgOiBudWxsO1xuICAgICAgLy8gY2hlY2sgaWYgb2JqZWN0IGNhbiBiZSBkaXNwbGF5ZWRcbiAgICAgIGlmIChhbGxEaXNwbGF5aW5nT2JqZWN0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZGlzcGxheWluZ09iamVjdFR5cGUgPSBhbGxEaXNwbGF5aW5nT2JqZWN0c1swXS5vYmplY3RUeXBlO1xuICAgICAgICBkaXNwbGF5aW5nT2JqZWN0ID0gYWxsRGlzcGxheWluZ09iamVjdHNbMF07XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmltYXJ5VmFsdWUgJiZcbiAgICAgICAgICBPYmplY3QuaGFzT3duKGFsbERpc3BsYXlpbmdPYmplY3RzWzBdLCBcInZhbHVlXCIpICYmXG4gICAgICAgICAgT2JqZWN0Lmhhc093bihwcmltYXJ5VmFsdWUsIFwibG9jYWxTdG9yZVwiKSAmJlxuICAgICAgICAgIGFsbERpc3BsYXlpbmdPYmplY3RzWzBdLnZhbHVlLmxvY2FsU3RvcmUuX19nZW5pZU9iamVjdFR5cGUgPT09XG4gICAgICAgICAgICBcIkhlbHBlckNsYXNzXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGlzcGxheWluZ09iamVjdFR5cGUgPSBcInVuZGVmaW5lZFwiO1xuICAgICAgICAgIGRpc3BsYXlpbmdPYmplY3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFsbERpc3BsYXlpbmdPYmplY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZGlzcGxheWluZ09iamVjdFR5cGUgPSBhbGxEaXNwbGF5aW5nT2JqZWN0c1swXS5vYmplY3RUeXBlICsgXCJbXVwiO1xuICAgICAgICBkaXNwbGF5aW5nT2JqZWN0ID0gYWxsRGlzcGxheWluZ09iamVjdHM7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmltYXJ5VmFsdWUgJiZcbiAgICAgICAgICBPYmplY3QuaGFzT3duKGFsbERpc3BsYXlpbmdPYmplY3RzWzBdLCBcInZhbHVlXCIpICYmXG4gICAgICAgICAgT2JqZWN0Lmhhc093bihwcmltYXJ5VmFsdWUsIFwibG9jYWxTdG9yZVwiKSAmJlxuICAgICAgICAgIGFsbERpc3BsYXlpbmdPYmplY3RzWzBdLnZhbHVlLmxvY2FsU3RvcmUuX19nZW5pZU9iamVjdFR5cGUgPT09XG4gICAgICAgICAgICBcIkhlbHBlckNsYXNzXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGlzcGxheWluZ09iamVjdFR5cGUgPSBcInVuZGVmaW5lZFwiO1xuICAgICAgICAgIGRpc3BsYXlpbmdPYmplY3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFsbERpc3BsYXlpbmdPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkaXNwbGF5aW5nT2JqZWN0VHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgICAgIGRpc3BsYXlpbmdPYmplY3QgPSBudWxsO1xuICAgICAgfVxuICAgICAgLy8gaWYgZGlzcGxheWluZ09iamVjdFR5cGUgaW4gdGhlIGtleXMgb2YgQWxsR2VuaWVPYmplY3RJbnRlcmZhY2VzXG4gICAgICBpZiAoQWxsR2VuaWVPYmplY3RJbnRlcmZhY2VzLnN1cHBvcnRlZFR5cGVzLmhhcyhkaXNwbGF5aW5nT2JqZWN0VHlwZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBjYW5ub3RkaXNwbGF5ID0gZmFsc2U7XG4gICAgbGV0IG9uU2NyZWVuID0gdHJ1ZTtcbiAgICBsZXQgaW5zdGFudGlhdGVkRGlzcGxheWluZ09iamVjdCA9IG51bGw7XG4gICAgaWYgKGRpc3BsYXlpbmdPYmplY3QgIT0gbnVsbCkge1xuICAgICAgLy8gaWYgZGlzcGxheWluZ09iamVjdCBpcyBhbiBhcnJheVxuICAgICAgaWYgKGRpc3BsYXlpbmdPYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAvLyBhbHdheXMgZGlzcGxheVxuICAgICAgICBvblNjcmVlbiA9IGZhbHNlO1xuICAgICAgICBpbnN0YW50aWF0ZWREaXNwbGF5aW5nT2JqZWN0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkaXNwbGF5aW5nT2JqZWN0KSB7XG4gICAgICAgICAgY29uc3QgSW5zdGFuY2UgPSBJbnN0YW50aWF0ZUdlbmllT2JqZWN0KHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogZWxlbWVudC5vYmplY3RUeXBlLFxuICAgICAgICAgICAga2V5OiBlbGVtZW50LnZhbHVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChJbnN0YW5jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYW5ub3RkaXNwbGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnN0YW50aWF0ZWREaXNwbGF5aW5nT2JqZWN0LnB1c2goSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBJbnN0YW5jZSA9IEluc3RhbnRpYXRlR2VuaWVPYmplY3Qoe1xuICAgICAgICAgIGNsYXNzTmFtZTogZGlzcGxheWluZ09iamVjdC5vYmplY3RUeXBlLFxuICAgICAgICAgIGtleTogZGlzcGxheWluZ09iamVjdC52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChJbnN0YW5jZSA9PT0gdW5kZWZpbmVkKSBjYW5ub3RkaXNwbGF5ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGxhc3RSZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGFsd2F5cyBkaXNwbGF5XG4gICAgICAgICAgICBvblNjcmVlbiA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBkaXNwbGF5aW5nT2JqZWN0cyBpcyBvbiBzY3JlZW4gYWxyZWFkeVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SW50ZXJmYWNlID0gZ2VuaWVJbnRlcmZhY2VzLmZpbmQoXG4gICAgICAgICAgICAgIChnZW5pZUludGVyZmFjZSkgPT5cbiAgICAgICAgICAgICAgICBnZW5pZUludGVyZmFjZS5jbGFzc05hbWUgPT09IEluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgJiZcbiAgICAgICAgICAgICAgICBzaGFsbG93RXF1YWwoXG4gICAgICAgICAgICAgICAgICBnZW5pZUludGVyZmFjZS5rZXksXG4gICAgICAgICAgICAgICAgICBJbnN0YW5jZS5fZ2V0Q29uc3RydWN0b3JQYXJhbXMoKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0SW50ZXJmYWNlKSB7XG4gICAgICAgICAgICAgIG9uU2NyZWVuID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5zdGFudGlhdGVkRGlzcGxheWluZ09iamVjdCA9IEluc3RhbmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIEdlbmllSW50ZXJwcmV0ZXIubmxQYXJzZXJcbiAgICAgIC5yZXNwb25kKFxuICAgICAgICB0cmFuc2NyaXB0LFxuICAgICAgICBwYXJzZWQsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGJ1aWxkUmVzdWx0RGlnZXN0KFxuICAgICAgICAgICAgLy8gbm93IHdlIG9ubHkgZGlzcGxheSB0aGUgbGFzdCByZXN1bHRcbiAgICAgICAgICAgIGV4ZWN1dGlvblJlc3VsdC5yZXN1bHRzW2V4ZWN1dGlvblJlc3VsdC5yZXN1bHRzLmxlbmd0aCAtIDFdLnJlc3VsdCxcbiAgICAgICAgICAgIHBhcnNlZCxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgcmVzcG9uZCByZXN1bHQ6ICR7cmVzdWx0fWApO1xuICAgICAgICBnZW5pZURpc3BhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFjdEdlbmllU3RhdGUgPSBzaGFyZWRTdGF0ZSBhcyBSZWFjdEdlbmllU3RhdGU7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVhY3RHZW5pZVN0YXRlLm1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgICAgb3JpZ2luOiBcInZvaWNlXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdC5mdWxsVGV4dCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHJlc3VsdEVudHJ5OiBSZXN1bHRXaW5kb3dFbnRyeSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGlmICghY2Fubm90ZGlzcGxheSAmJiBhbGxEaXNwbGF5aW5nT2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBvcmRlcmVkQ29uc3RydWN0b3JQYXJhbXMgPSBhbGxEaXNwbGF5aW5nT2JqZWN0c1xuICAgICAgICAgICAgICAubWFwKChkaXNwbGF5aW5nT2JqZWN0KSA9PlxuICAgICAgICAgICAgICAgIGNyZWF0ZUltbXV0YWJsZUNvbnN0cnVjdG9yUGFyYW1zU25hcHNob3QoZGlzcGxheWluZ09iamVjdC52YWx1ZSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAocGFyYW1zKTogcGFyYW1zIGlzIFJlY29yZDxzdHJpbmcsIGFueT4gPT5cbiAgICAgICAgICAgICAgICAgIHBhcmFtcyAhPT0gbnVsbCAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAob3JkZXJlZENvbnN0cnVjdG9yUGFyYW1zLmxlbmd0aCA+IDAgJiYgZGlzcGxheWluZ09iamVjdFR5cGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlZGljdGVkRXZlbnRJZCA9IHJlYWN0R2VuaWVTdGF0ZS5uYXZTdGFjayArIDE7XG4gICAgICAgICAgICAgIHJlc3VsdEVudHJ5ID0gcHV0UmVzdWx0V2luZG93RW50cnkocmVhY3RHZW5pZVN0YXRlLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRJZDogcHJlZGljdGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICByZXN1bHRPYmplY3RUeXBlOiBkaXNwbGF5aW5nT2JqZWN0VHlwZSxcbiAgICAgICAgICAgICAgICBvcmRlcmVkQ29uc3RydWN0b3JQYXJhbXMsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghb25TY3JlZW4gJiYgIWNhbm5vdGRpc3BsYXkpIHtcbiAgICAgICAgICAgIHJlYWN0R2VuaWVTdGF0ZS5uYXZTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgb2JqZWN0Vmlld0NsYXNzTmFtZTogQWxsR2VuaWVPYmplY3RJbnRlcmZhY2VzLmdldEludGVyZmFjZXMoXG4gICAgICAgICAgICAgICAgaW5zdGFudGlhdGVkRGlzcGxheWluZ09iamVjdCxcbiAgICAgICAgICAgICAgKS52aWV3Q2xhc3NOYW1lLFxuICAgICAgICAgICAgICBvYmplY3RDb25zdHJ1Y3RvclBhcmFtczpcbiAgICAgICAgICAgICAgICBhbGxEaXNwbGF5aW5nT2JqZWN0cy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgID8gYWxsRGlzcGxheWluZ09iamVjdHNbMF0udmFsdWUuX2dldENvbnN0cnVjdG9yUGFyYW1zKClcbiAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBhbGxEaXNwbGF5aW5nT2JqZWN0cy5tYXAoKGRpc3BsYXlpbmdPYmplY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5aW5nT2JqZWN0LnZhbHVlLl9nZXRDb25zdHJ1Y3RvclBhcmFtcygpLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHF1ZXJ5SW50ZW50LFxuICAgICAgICAgICAgICByZXN1bHRSZWY6IHJlc3VsdEVudHJ5Py5yZXN1bHRSZWYgPz8gbnVsbCxcbiAgICAgICAgICAgICAgcmVzdWx0T2JqZWN0VHlwZTogZGlzcGxheWluZ09iamVjdFR5cGUgfHwgbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFjdEdlbmllU3RhdGUubmF2U3RhY2sgKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdlcnJvciBnZW5lcmF0aW5nIHJlc3BvbnNlOicsIGVycm9yKTtcbiAgICAgICAgZ2VuaWVEaXNwYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhY3RHZW5pZVN0YXRlID0gc2hhcmVkU3RhdGUgYXMgUmVhY3RHZW5pZVN0YXRlO1xuICAgICAgICAgIHJlYWN0R2VuaWVTdGF0ZS5tZXNzYWdlID0gY3JlYXRlU3lzdGVtTWVzc2FnZShcbiAgICAgICAgICAgIFwiRG9uZS5cIixcbiAgICAgICAgICAgIFwiRG9uZS5cIixcbiAgICAgICAgICAgIFwiaW5mb1wiLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIC8vIGNvbnNvbGUubG9nKGBhZnRlciBleGVjdXRpbmcgc3RhdGUgJHtKU09OLnN0cmluZ2lmeShzaGFyZWRTdGF0ZSl9YCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc2V0IG5hdmlnYXRpb24gc3RhdGUgdG8gcHJldmVudCBpbmZpbml0ZSBuYXZpZ2F0aW9uIGxvb3BzXG4gKiBDYWxsIHRoaXMgYWZ0ZXIgaW50ZXJjZXB0aW5nIGFuZCBoYW5kbGluZyBuYXZpZ2F0aW9uIGluIGV4cG8tcm91dGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldEdlbmllTmF2aWdhdGlvbigpIHtcbiAgZ2VuaWVEaXNwYXRjaCgoKSA9PiB7XG4gICAgY29uc3QgcmVhY3RHZW5pZVN0YXRlID0gc2hhcmVkU3RhdGUgYXMgUmVhY3RHZW5pZVN0YXRlO1xuICAgIHJlYWN0R2VuaWVTdGF0ZS5uYXZTdGF0ZSA9IHtcbiAgICAgIG9iamVjdFZpZXdDbGFzc05hbWU6IG51bGwsXG4gICAgICBvYmplY3RDb25zdHJ1Y3RvclBhcmFtczogbnVsbCxcbiAgICAgIHF1ZXJ5SW50ZW50OiBudWxsLFxuICAgICAgcmVzdWx0UmVmOiBudWxsLFxuICAgICAgcmVzdWx0T2JqZWN0VHlwZTogbnVsbCxcbiAgICB9O1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxrQkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZ0JBQUEsR0FBQUQsT0FBQTtBQUtBLElBQUFFLFdBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGNBQUEsR0FBQUgsT0FBQTtBQU9BLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUF3RSxTQUFBTSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFB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LENBQUMsQ0FBQztVQUNKO1FBQ0Y7UUFFQSxJQUFJLENBQUNiLFFBQVEsSUFBSSxDQUFDRCxhQUFhLEVBQUU7VUFDL0J6QixlQUFlLENBQUM0QyxRQUFRLEdBQUc7WUFDekJDLG1CQUFtQixFQUFFdkIseUNBQXdCLENBQUN3QixhQUFhLENBQ3pEbkIsNEJBQ0YsQ0FBQyxDQUFDb0IsYUFBYTtZQUNmQyx1QkFBdUIsRUFDckJ0QyxvQkFBb0IsQ0FBQ2pMLE1BQU0sS0FBSyxDQUFDLEdBQzdCaUwsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMxSyxLQUFLLENBQUNnQixxQkFBcUIsQ0FBQyxDQUFDLEdBQ3JEO2NBQ0VpTSxRQUFRLEVBQUV2QyxvQkFBb0IsQ0FBQzdELEdBQUcsQ0FBRThELGdCQUFnQixJQUNsREEsZ0JBQWdCLENBQUMzSyxLQUFLLENBQUNnQixxQkFBcUIsQ0FBQyxDQUMvQztZQUNGLENBQUM7WUFDUGdLLFdBQVc7WUFDWGhJLFNBQVMsRUFBRXNKLFdBQVcsRUFBRXRKLFNBQVMsSUFBSSxJQUFJO1lBQ3pDMkosZ0JBQWdCLEVBQUUvQixvQkFBb0IsSUFBSTtVQUM1QyxDQUFDO1VBQ0RaLGVBQWUsQ0FBQzBDLFFBQVEsSUFBSSxDQUFDO1FBQy9CO01BQ0YsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQ0RRLEtBQUssQ0FBRXBMLEtBQUssSUFBSztNQUNoQkMsY0FBTSxDQUFDRCxLQUFLLENBQUMsNEJBQTRCLEVBQUVBLEtBQUssQ0FBQztNQUNqRCxJQUFBaUksNEJBQWEsRUFBQyxNQUFNO1FBQ2xCLE1BQU1DLGVBQWUsR0FBR0MsMEJBQThCO1FBQ3RERCxlQUFlLENBQUNyQixPQUFPLEdBQUdMLG1CQUFtQixDQUMzQyxPQUFPLEVBQ1AsT0FBTyxFQUNQLE1BQU0sRUFDTixLQUNGLENBQUM7TUFDSCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7O0lBRUo7RUFDRixDQUFDLENBQUM7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM2RSxvQkFBb0JBLENBQUEsRUFBRztFQUNyQyxJQUFBcEQsNEJBQWEsRUFBQyxNQUFNO0lBQ2xCLE1BQU1DLGVBQWUsR0FBR0MsMEJBQThCO0lBQ3RERCxlQUFlLENBQUM0QyxRQUFRLEdBQUc7TUFDekJDLG1CQUFtQixFQUFFLElBQUk7TUFDekJHLHVCQUF1QixFQUFFLElBQUk7TUFDN0JoQyxXQUFXLEVBQUUsSUFBSTtNQUNqQmhJLFNBQVMsRUFBRSxJQUFJO01BQ2YySixnQkFBZ0IsRUFBRTtJQUNwQixDQUFDO0VBQ0gsQ0FBQyxDQUFDO0FBQ0oiLCJpZ25vcmVMaXN0IjpbXX0=
|