@rfprodz/client-util-eliza 1.0.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.
Files changed (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +89 -0
  3. package/esm2020/index.mjs +5 -0
  4. package/esm2020/lib/client-util-eliza.module.mjs +19 -0
  5. package/esm2020/lib/config/data.config.mjs +37 -0
  6. package/esm2020/lib/config/eliza.config.mjs +7 -0
  7. package/esm2020/lib/config/finals.config.mjs +22 -0
  8. package/esm2020/lib/config/index.mjs +2 -0
  9. package/esm2020/lib/config/initials.config.mjs +20 -0
  10. package/esm2020/lib/config/keywords.config.mjs +921 -0
  11. package/esm2020/lib/config/post-transforms.config.mjs +19 -0
  12. package/esm2020/lib/config/posts.config.mjs +30 -0
  13. package/esm2020/lib/config/pres.config.mjs +48 -0
  14. package/esm2020/lib/config/quits.config.mjs +11 -0
  15. package/esm2020/lib/config/synonyms.config.mjs +20 -0
  16. package/esm2020/lib/interfaces/chat.interface.mjs +2 -0
  17. package/esm2020/lib/interfaces/eliza.interface.mjs +2 -0
  18. package/esm2020/lib/interfaces/index.mjs +2 -0
  19. package/esm2020/lib/services/eliza/eliza.service.mjs +441 -0
  20. package/esm2020/lib/services/index.mjs +2 -0
  21. package/esm2020/rfprodz-client-util-eliza.mjs +5 -0
  22. package/fesm2015/rfprodz-client-util-eliza.mjs +1592 -0
  23. package/fesm2015/rfprodz-client-util-eliza.mjs.map +1 -0
  24. package/fesm2020/rfprodz-client-util-eliza.mjs +1586 -0
  25. package/fesm2020/rfprodz-client-util-eliza.mjs.map +1 -0
  26. package/index.d.ts +4 -0
  27. package/lib/client-util-eliza.module.d.ts +9 -0
  28. package/lib/config/data.config.d.ts +16 -0
  29. package/lib/config/eliza.config.d.ts +2 -0
  30. package/lib/config/finals.config.d.ts +15 -0
  31. package/lib/config/index.d.ts +1 -0
  32. package/lib/config/initials.config.d.ts +15 -0
  33. package/lib/config/keywords.config.d.ts +11 -0
  34. package/lib/config/post-transforms.config.d.ts +11 -0
  35. package/lib/config/posts.config.d.ts +11 -0
  36. package/lib/config/pres.config.d.ts +11 -0
  37. package/lib/config/quits.config.d.ts +11 -0
  38. package/lib/config/synonyms.config.d.ts +11 -0
  39. package/lib/interfaces/chat.interface.d.ts +4 -0
  40. package/lib/interfaces/eliza.interface.d.ts +41 -0
  41. package/lib/interfaces/index.d.ts +1 -0
  42. package/lib/services/eliza/eliza.service.d.ts +74 -0
  43. package/lib/services/index.d.ts +1 -0
  44. package/package.json +49 -0
@@ -0,0 +1,441 @@
1
+ /**
2
+ * elizabot.js v.1.1 - ELIZA JS library (N.Landsteiner 2005)
3
+ * Eliza is a mock Rogerian psychotherapist.
4
+ * Original program by Joseph Weizenbaum in MAD-SLIP for "Project MAC" at MIT.
5
+ * cf: Weizenbaum, Joseph "ELIZA - A Computer Program For the Study of Natural Language Communication Between Man and Machine"
6
+ * in: Communications of the ACM; Volume 9 , Issue 1 (January 1966): p 36-45.
7
+ * JavaScript implementation by Norbert Landsteiner 2005; <http://www.masserk.at>
8
+ *
9
+ * `ElizaBot' is also a general chatbot engine that can be supplied with any rule set.
10
+ * (for required data structures cf. "elizadata.js" and/or see the documentation.)
11
+ * data is parsed and transformed for internal use at the creation time of the first instance of the `ElizaBot' constructor.
12
+ *
13
+ * JavaScript source: https://github.com/natelewis/eliza-as-promised
14
+ */
15
+ import { Inject, Injectable } from '@angular/core';
16
+ import { BehaviorSubject } from 'rxjs';
17
+ import { ELIZA_DATA } from '../../config/data.config';
18
+ import { elizaInitialConfig } from '../../config/eliza.config';
19
+ import { elizaFinalDefault } from '../../config/finals.config';
20
+ import { elizaInitialDefault } from '../../config/initials.config';
21
+ import * as i0 from "@angular/core";
22
+ export class AppElizaService {
23
+ constructor(elizaData) {
24
+ this.elizaData = elizaData;
25
+ /**
26
+ * Eliza configuration.
27
+ */
28
+ this.configSubject = new BehaviorSubject({ ...elizaInitialConfig });
29
+ /**
30
+ * Publicly readable Eliza configuration.
31
+ */
32
+ this.config$ = this.configSubject.asObservable();
33
+ this.mem = [];
34
+ this.lastChoice = [];
35
+ this.postExp = new RegExp('');
36
+ this.preExp = new RegExp('');
37
+ this.pres = {};
38
+ this.posts = {};
39
+ /**
40
+ * Conversation messages.
41
+ */
42
+ this.messagesSubject = new BehaviorSubject([]);
43
+ /**
44
+ * Publicly readable conversation messages.
45
+ */
46
+ this.messages$ = this.messagesSubject.asObservable();
47
+ this.setup(elizaData);
48
+ }
49
+ /**
50
+ * Adds next chat message.
51
+ * @param message chat message
52
+ */
53
+ nextMessage(message) {
54
+ this.messagesSubject.next([...this.messagesSubject.value, message]);
55
+ }
56
+ /**
57
+ * Modifies Eliza configuration.
58
+ * @param config Eliza config
59
+ */
60
+ nextConfig(config) {
61
+ this.configSubject.next({ ...this.configSubject.value, ...config });
62
+ }
63
+ /**
64
+ * Sets up Eliza.
65
+ * @param data Eliza data
66
+ * @param reinitialize indicates that Eliza should be initialized again, even if it's data has already been initialized
67
+ */
68
+ setup(data, reinitialize = false) {
69
+ if (typeof this.data === 'undefined' && !reinitialize) {
70
+ this.init(data);
71
+ }
72
+ this.reset();
73
+ }
74
+ /**
75
+ * Resets Eliza.
76
+ */
77
+ reset() {
78
+ const data = this.data;
79
+ if (typeof data === 'undefined') {
80
+ throw new Error('Initialize Eliza first.');
81
+ }
82
+ this.mem = [];
83
+ this.lastChoice = [];
84
+ for (let k = 0; k < data.keywords.length; k += 1) {
85
+ this.lastChoice[k] = [];
86
+ const rules = data.keywords[k].rules;
87
+ for (let i = 0; i < rules.length; i += 1) {
88
+ this.lastChoice[k][i] = -1;
89
+ }
90
+ }
91
+ this.messagesSubject.next([{ bot: true, text: this.getInitial(data) }]);
92
+ }
93
+ // eslint-disable-next-line max-lines-per-function, complexity -- TODO refactor
94
+ init(data) {
95
+ this.data = { ...data };
96
+ // Parse data and convert it from canonical form to internal use.
97
+ // Produce a list of synonyms.
98
+ const synPatterns = {};
99
+ for (const item in this.data.synonyms) {
100
+ if (item) {
101
+ synPatterns[item] = `(${item}|${this.data.synonyms[item].join('|')})`;
102
+ }
103
+ }
104
+ // Check keywords.
105
+ if (data.keywords.length === 0) {
106
+ throw Error('Eliza does not have any configured keywords.');
107
+ }
108
+ // First, convert rules to regexps.
109
+ // Expand synonyms and insert asterisk expressions for backtracking.
110
+ const sre = /@(\S+)/;
111
+ const are = /(\S)\s*\*\s*(\S)/;
112
+ const are1 = /^\s*\*\s*(\S)/;
113
+ const are2 = /(\S)\s*\*\s*$/;
114
+ const are3 = /^\s*\*\s*$/;
115
+ const wsre = /\s+/g;
116
+ for (let i = 0; i < this.data.keywords.length; i += 1) {
117
+ const rules = this.data.keywords[i].rules;
118
+ for (let j = 0; j < rules.length; j += 1) {
119
+ const rule = rules[j];
120
+ // Check mem flag and store it as decomp's element 2.
121
+ if (rule.pattern.charAt(0) === '$') {
122
+ let ofs = 1;
123
+ while (rule.pattern.charAt[ofs] === ' ') {
124
+ ofs += 1;
125
+ }
126
+ rule.pattern = rule.pattern.substring(ofs);
127
+ rule.memory = true;
128
+ }
129
+ else {
130
+ rule.memory = false;
131
+ }
132
+ let match = rule.pattern.match(sre);
133
+ while (match !== null) {
134
+ const sp = synPatterns[match[1]] ? synPatterns[match[1]] : match[1];
135
+ rule.pattern = rule.pattern.substring(0, match.index ?? 0) + sp + rule.pattern.substring((match.index ?? 0) + match[0].length);
136
+ match = rule.pattern.match(sre);
137
+ }
138
+ // Expand asterisk expressions.
139
+ if (are3.test(rule.pattern)) {
140
+ rule.pattern = '\\s*(.*)\\s*';
141
+ }
142
+ else {
143
+ match = rule.pattern.match(are);
144
+ if (match !== null) {
145
+ let leftPart = '';
146
+ let rightPart = rule.pattern;
147
+ while (match !== null) {
148
+ leftPart += rightPart.substring(0, (match.index ?? 0) + 1);
149
+ if (match[1] !== ')') {
150
+ leftPart += '\\b';
151
+ }
152
+ leftPart += '\\s*(.*)\\s*';
153
+ if (match[2] !== '(' && match[2] !== '\\') {
154
+ leftPart += '\\b';
155
+ }
156
+ leftPart += match[2];
157
+ rightPart = rightPart.substring((match.index ?? 0) + match[0].length);
158
+ match = rightPart.match(are);
159
+ }
160
+ rule.pattern = leftPart + rightPart;
161
+ }
162
+ match = rule.pattern.match(are1);
163
+ if (match !== null) {
164
+ let leftPart = '\\s*(.*)\\s*';
165
+ if (match[1] !== ')' && match[1] !== '\\') {
166
+ leftPart += '\\b';
167
+ }
168
+ rule.pattern = leftPart + rule.pattern.substring((match.index ?? 0) - 1 + match[0].length);
169
+ }
170
+ match = rule.pattern.match(are2);
171
+ if (match !== null) {
172
+ let leftPart = rule.pattern.substring(0, (match.index ?? 0) + 1);
173
+ if (match[1] !== '(') {
174
+ leftPart += '\\b';
175
+ }
176
+ rule.pattern = leftPart + '\\s*(.*)\\s*';
177
+ }
178
+ }
179
+ // Expand whitespaces.
180
+ rule.pattern = rule.pattern.replace(wsre, '\\s+');
181
+ wsre.lastIndex = 0;
182
+ }
183
+ }
184
+ // Sort keywords by rank (highest first).
185
+ this.data.keywords.sort(this.sortKeywords);
186
+ // Compose regexps and refs for pres and posts.
187
+ this.composeRegExpsAndPresAndPosts(this.data);
188
+ }
189
+ /**
190
+ * Composes regexps and refs for pres and posts.
191
+ * @param data Eliza data
192
+ */
193
+ composeRegExpsAndPresAndPosts(data) {
194
+ this.pres = {};
195
+ this.posts = {};
196
+ if (data.pres.length === 0) {
197
+ throw Error('Eliza does not have any configured pre expressions.');
198
+ }
199
+ else {
200
+ const a = [];
201
+ for (let i = 0; i < data.pres.length; i += 2) {
202
+ a.push(data.pres[i]);
203
+ this.pres[data.pres[i]] = data.pres[i + 1];
204
+ }
205
+ this.preExp = new RegExp('\\b(' + a.join('|') + ')\\b');
206
+ }
207
+ if (data.posts.length === 0) {
208
+ throw Error('Eliza does not have any configured post expressions.');
209
+ }
210
+ else {
211
+ const a = [];
212
+ for (let i = 0; i < data.posts.length; i += 2) {
213
+ a.push(data.posts[i]);
214
+ this.posts[data.posts[i]] = data.posts[i + 1];
215
+ }
216
+ this.postExp = new RegExp('\\b(' + a.join('|') + ')\\b');
217
+ }
218
+ }
219
+ // eslint-disable-next-line max-lines-per-function, complexity -- TODO refactor
220
+ execRule(data, k, sentence) {
221
+ const config = this.configSubject.value;
222
+ const rules = data.keywords[k].rules;
223
+ const paramRegExp = /\(([0-9]+)\)/;
224
+ for (let i = 0; i < rules.length; i += 1) {
225
+ const match = sentence.match(rules[i].pattern);
226
+ if (match !== null) {
227
+ const options = rules[i].options;
228
+ const memory = rules[i].memory;
229
+ let optionIndex = config.noRandom ? 0 : Math.floor(Math.random() * options.length);
230
+ if ((config.noRandom && this.lastChoice[k][i] > optionIndex) || this.lastChoice[k][i] === optionIndex) {
231
+ this.lastChoice[k][i] += 1;
232
+ optionIndex = this.lastChoice[k][i];
233
+ if (optionIndex >= options.length) {
234
+ optionIndex = 0;
235
+ this.lastChoice[k][i] = -1;
236
+ }
237
+ }
238
+ else {
239
+ this.lastChoice[k][i] = optionIndex;
240
+ }
241
+ let reply = options[optionIndex];
242
+ if (config.debug) {
243
+ const debugLog = `match:\nkey: ${data.keywords[k].key}\nrank: ${data.keywords[k].rank}\ndecomp: ${rules[i].pattern}\nreasmb: ${reply}\nmemory: ${memory}`;
244
+ // eslint-disable-next-line no-console -- debug output
245
+ console.warn('debugLog', debugLog);
246
+ }
247
+ if (reply.search('^goto ') === 0) {
248
+ const key = reply.substring(5);
249
+ const ki = this.getRuleIndexByKey(data, key);
250
+ if (ki >= 0) {
251
+ return this.execRule(data, ki, sentence);
252
+ }
253
+ }
254
+ // Substitute positional params.
255
+ let paramRegExpMatch = reply.match(paramRegExp);
256
+ if (paramRegExpMatch) {
257
+ let leftPart = '';
258
+ let rightPart = reply;
259
+ while (paramRegExpMatch !== null) {
260
+ let param = match[parseInt(paramRegExpMatch[1], 10)];
261
+ // Postprocess param.
262
+ let postExpMatch = param.match(this.postExp);
263
+ if (postExpMatch !== null) {
264
+ let leftPart2 = '';
265
+ let rightPart2 = param;
266
+ while (postExpMatch !== null) {
267
+ leftPart2 += rightPart2.substring(0, postExpMatch.index ?? 0) + this.posts[postExpMatch[1]];
268
+ rightPart2 = rightPart2.substring((postExpMatch.index ?? 0) + postExpMatch[0].length);
269
+ postExpMatch = rightPart2.match(this.postExp);
270
+ }
271
+ param = leftPart2 + rightPart2;
272
+ }
273
+ leftPart += rightPart.substring(0, paramRegExpMatch.index) + param;
274
+ rightPart = rightPart.substring((paramRegExpMatch.index ?? 0) + paramRegExpMatch[0].length);
275
+ paramRegExpMatch = rightPart.match(paramRegExp);
276
+ }
277
+ reply = leftPart + rightPart;
278
+ }
279
+ const transformedReply = this.postTransform(data, reply);
280
+ if (memory) {
281
+ this.memSave(transformedReply);
282
+ }
283
+ else {
284
+ return transformedReply;
285
+ }
286
+ }
287
+ }
288
+ return '';
289
+ }
290
+ // eslint-disable-next-line complexity -- TODO refactor
291
+ transformUserQuery(data, input) {
292
+ let reply = '';
293
+ // Unify text string and split text in part sentences and loop through them.
294
+ const parts = this.splitUserQueryIntoParts(input);
295
+ for (let i = 0; i < parts.length; i += 1) {
296
+ let part = parts[i];
297
+ if (part !== '') {
298
+ // Check for quit expressions.
299
+ for (let q = 0; q < data.quits.length; q += 1) {
300
+ if (data.quits[q] === part) {
301
+ return { reply: this.getFinal(data), final: true };
302
+ }
303
+ }
304
+ let match = part.match(this.preExp);
305
+ if (match !== null) {
306
+ let leftPart = '';
307
+ let rightPart = part;
308
+ while (match !== null) {
309
+ leftPart += rightPart.substring(0, match.index ?? 0) + this.pres[match[1]];
310
+ rightPart = rightPart.substring((match.index ?? 0) + match[0].length);
311
+ match = rightPart.match(this.preExp);
312
+ }
313
+ part = leftPart + rightPart;
314
+ }
315
+ // Loop trough keywords.
316
+ for (let k = 0; k < data.keywords.length; k += 1) {
317
+ if (part.search(new RegExp('\\b' + data.keywords[k].key + '\\b', 'i')) >= 0) {
318
+ reply = this.execRule(data, k, part);
319
+ }
320
+ if (reply !== '') {
321
+ return { reply, final: false };
322
+ }
323
+ }
324
+ }
325
+ }
326
+ // Nothing matched, try mem.
327
+ reply = this.memGet();
328
+ // If nothing in mem, try xnone.
329
+ if (reply === '') {
330
+ const k = this.getRuleIndexByKey(data, 'xnone');
331
+ reply = k >= 0 ? this.execRule(data, k, ' ') : reply;
332
+ }
333
+ return { reply: reply !== '' ? reply : 'I am at a loss for words.', final: false };
334
+ }
335
+ /**
336
+ * Unify text string, split text into partial sentences to be able to loop through them.
337
+ * @param input user query
338
+ * @returns split user query
339
+ */
340
+ splitUserQueryIntoParts(input) {
341
+ const parts = input
342
+ .toLowerCase()
343
+ .replace(/@#\$%\^&\*\(\)_\+=~`\{\[\}\]\|:;<>\/\\\t/g, ' ')
344
+ .replace(/\s+-+\s+/g, '.')
345
+ .replace(/\s*[,.?!;]+\s*/g, '.')
346
+ .replace(/\s*\bbut\b\s*/g, '.')
347
+ .replace(/\s{2,}/g, ' ')
348
+ .split('.');
349
+ return parts;
350
+ }
351
+ sortKeywords(a, b) {
352
+ if (a.rank > b.rank) {
353
+ return -1;
354
+ }
355
+ else if (a.rank < b.rank) {
356
+ return 1;
357
+ }
358
+ else if (a.index > b.index) {
359
+ return 1;
360
+ }
361
+ else if (a.index < b.index) {
362
+ return -1;
363
+ }
364
+ return 0;
365
+ }
366
+ postTransform(data, input) {
367
+ // final cleanings
368
+ let result = input.replace(/\s{2,}/g, ' ').replace(/\s+\./g, '.');
369
+ if (data.postTransforms.length > 0) {
370
+ for (let i = 0; i < data.postTransforms.length; i += 1) {
371
+ const postTransform = data.postTransforms[i];
372
+ result = result.replace(postTransform.searchValue, postTransform.replaceValue);
373
+ data.postTransforms[i].searchValue.lastIndex = 0;
374
+ }
375
+ }
376
+ if (this.configSubject.value.capitalizeFirstLetter) {
377
+ const match = result.match(/^([a-z])/);
378
+ if (match) {
379
+ result = match[0].toUpperCase() + result.substring(1);
380
+ }
381
+ }
382
+ return result;
383
+ }
384
+ getRuleIndexByKey(data, key) {
385
+ for (let k = 0; k < data.keywords.length; k += 1) {
386
+ if (data.keywords[k].key === key) {
387
+ return k;
388
+ }
389
+ }
390
+ return -1;
391
+ }
392
+ memSave(input) {
393
+ this.mem.push(input);
394
+ if (this.mem.length > this.configSubject.value.memSize) {
395
+ this.mem.shift();
396
+ }
397
+ }
398
+ memGet() {
399
+ if (this.mem.length > 0) {
400
+ if (this.configSubject.value.noRandom) {
401
+ return this.mem.shift() ?? '';
402
+ }
403
+ const n = Math.floor(Math.random() * this.mem.length);
404
+ const reply = this.mem[n];
405
+ for (let i = n + 1; i < this.mem.length; i += 1) {
406
+ this.mem[i - 1] = this.mem[i];
407
+ }
408
+ this.mem.length -= 1;
409
+ return reply;
410
+ }
411
+ return '';
412
+ }
413
+ getFinal(data) {
414
+ return data.finals.length === 0 ? elizaFinalDefault : data.finals[Math.floor(Math.random() * data.finals.length)];
415
+ }
416
+ getInitial(data) {
417
+ return data.initials.length === 0 ? elizaInitialDefault : data.initials[Math.floor(Math.random() * data.initials.length)];
418
+ }
419
+ getResponse(statement) {
420
+ const data = this.data;
421
+ if (typeof data === 'undefined') {
422
+ throw new Error('Initialize Eliza first.');
423
+ }
424
+ return new Promise(resolve => {
425
+ const elizaReply = this.transformUserQuery(data, statement);
426
+ resolve(elizaReply);
427
+ });
428
+ }
429
+ }
430
+ /** @nocollapse */ AppElizaService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AppElizaService, deps: [{ token: ELIZA_DATA }], target: i0.ɵɵFactoryTarget.Injectable });
431
+ /** @nocollapse */ AppElizaService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AppElizaService, providedIn: 'root' });
432
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AppElizaService, decorators: [{
433
+ type: Injectable,
434
+ args: [{
435
+ providedIn: 'root',
436
+ }]
437
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
438
+ type: Inject,
439
+ args: [ELIZA_DATA]
440
+ }] }]; } });
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxpemEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2xpZW50LXV0aWwtZWxpemEvc3JjL2xpYi9zZXJ2aWNlcy9lbGl6YS9lbGl6YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFPbkUsTUFBTSxPQUFPLGVBQWU7SUFtQzFCLFlBQWdELFNBQXFCO1FBQXJCLGNBQVMsR0FBVCxTQUFTLENBQVk7UUFsQ3JFOztXQUVHO1FBQ2Msa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBZSxFQUFFLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBRTlGOztXQUVHO1FBQ2EsWUFBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7UUFJcEQsUUFBRyxHQUFhLEVBQUUsQ0FBQztRQUVuQixlQUFVLEdBQWUsRUFBRSxDQUFDO1FBRTVCLFlBQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV6QixXQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFeEIsU0FBSSxHQUEyQixFQUFFLENBQUM7UUFFbEMsVUFBSyxHQUEyQixFQUFFLENBQUM7UUFFM0M7O1dBRUc7UUFDYyxvQkFBZSxHQUFHLElB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TUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFFTSxXQUFXLENBQUMsU0FBaUI7UUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7U0FDNUM7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFpQixPQUFPLENBQUMsRUFBRTtZQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVELE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OytIQXphVSxlQUFlLGtCQW1DTixVQUFVO21JQW5DbkIsZUFBZSxjQUZkLE1BQU07MkZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQW9DYyxNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGVsaXphYm90LmpzIHYuMS4xIC0gRUxJWkEgSlMgbGlicmFyeSAoTi5MYW5kc3RlaW5lciAyMDA1KVxuICogRWxpemEgaXMgYSBtb2NrIFJvZ2VyaWFuIHBzeWNob3RoZXJhcGlzdC5cbiAqIE9yaWdpbmFsIHByb2dyYW0gYnkgSm9zZXBoIFdlaXplbmJhdW0gaW4gTUFELVNMSVAgZm9yIFwiUHJvamVjdCBNQUNcIiBhdCBNSVQuXG4gKiBjZjogV2VpemVuYmF1bSwgSm9zZXBoIFwiRUxJWkEgLSBBIENvbXB1dGVyIFByb2dyYW0gRm9yIHRoZSBTdHVkeSBvZiBOYXR1cmFsIExhbmd1YWdlIENvbW11bmljYXRpb24gQmV0d2VlbiBNYW4gYW5kIE1hY2hpbmVcIlxuICogaW46IENvbW11bmljYXRpb25zIG9mIHRoZSBBQ007IFZvbHVtZSA5ICwgSXNzdWUgMSAoSmFudWFyeSAxOTY2KTogcCAzNi00NS5cbiAqIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gYnkgTm9yYmVydCBMYW5kc3RlaW5lciAyMDA1OyA8aHR0cDovL3d3dy5tYXNzZXJrLmF0PlxuICpcbiAqIGBFbGl6YUJvdCcgaXMgYWxzbyBhIGdlbmVyYWwgY2hhdGJvdCBlbmdpbmUgdGhhdCBjYW4gYmUgc3VwcGxpZWQgd2l0aCBhbnkgcnVsZSBzZXQuXG4gKiAoZm9yIHJlcXVpcmVkIGRhdGEgc3RydWN0dXJlcyBjZi4gXCJlbGl6YWRhdGEuanNcIiBhbmQvb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uLilcbiAqIGRhdGEgaXMgcGFyc2VkIGFuZCB0cmFuc2Zvcm1lZCBmb3IgaW50ZXJuYWwgdXNlIGF0IHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgYEVsaXphQm90JyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBKYXZhU2NyaXB0IHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL25hdGVsZXdpcy9lbGl6YS1hcy1wcm9taXNlZFxuICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEVMSVpBX0RBVEEgfSBmcm9tICcuLi8uLi9jb25maWcvZGF0YS5jb25maWcnO1xuaW1wb3J0IHsgZWxpemFJbml0aWFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnL2VsaXphLmNvbmZpZyc7XG5pbXBvcnQgeyBlbGl6YUZpbmFsRGVmYXVsdCB9IGZyb20gJy4uLy4uL2NvbmZpZy9maW5hbHMuY29uZmlnJztcbmltcG9ydCB7IGVsaXphSW5pdGlhbERlZmF1bHQgfSBmcm9tICcuLi8uLi9jb25maWcvaW5pdGlhbHMuY29uZmlnJztcbmltcG9ydCB7IElDaGF0TWVzc2FnZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY2hhdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUVsaXphQ29uZmlnLCBJRWxpemFEYXRhLCBJRWxpemFLZXl3b3JkLCBJRWxpemFSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZWxpemEuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEFwcEVsaXphU2VydmljZSB7XG4gIC8qKlxuICAgKiBFbGl6YSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRWxpemFDb25maWc+KHsgLi4uZWxpemFJbml0aWFsQ29uZmlnIH0pO1xuXG4gIC8qKlxuICAgKiBQdWJsaWNseSByZWFkYWJsZSBFbGl6YSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZyQgPSB0aGlzLmNvbmZpZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBkYXRhPzogSUVsaXphRGF0YTtcblxuICBwcml2YXRlIG1lbTogc3RyaW5nW10gPSBbXTtcblxuICBwcml2YXRlIGxhc3RDaG9pY2U6IG51bWJlcltdW10gPSBbXTtcblxuICBwcml2YXRlIHBvc3RFeHAgPSBuZXcgUmVnRXhwKCcnKTtcblxuICBwcml2YXRlIHByZUV4cCA9IG5ldyBSZWdFeHAoJycpO1xuXG4gIHByaXZhdGUgcHJlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIHByaXZhdGUgcG9zdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvKipcbiAgICogQ29udmVyc2F0aW9uIG1lc3NhZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElDaGF0TWVzc2FnZVtdPihbXSk7XG5cbiAgLyoqXG4gICAqIFB1YmxpY2x5IHJlYWRhYmxlIGNvbnZlcnNhdGlvbiBtZXNzYWdlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXNzYWdlcyQgPSB0aGlzLm1lc3NhZ2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEVMSVpBX0RBVEEpIHB1YmxpYyByZWFkb25seSBlbGl6YURhdGE6IElFbGl6YURhdGEpIHtcbiAgICB0aGlzLnNldHVwKGVsaXphRGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBuZXh0IGNoYXQgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1lc3NhZ2UgY2hhdCBtZXNzYWdlXG4gICAqL1xuICBwdWJsaWMgbmV4dE1lc3NhZ2UobWVzc2FnZTogSUNoYXRNZXNzYWdlKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlc1N1YmplY3QubmV4dChbLi4udGhpcy5tZXNzYWdlc1N1YmplY3QudmFsdWUsIG1lc3NhZ2VdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBFbGl6YSBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0gY29uZmlnIEVsaXphIGNvbmZpZ1xuICAgKi9cbiAgcHVibGljIG5leHRDb25maWcoY29uZmlnOiBQYXJ0aWFsPElFbGl6YUNvbmZpZz4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ1N1YmplY3QubmV4dCh7IC4uLnRoaXMuY29uZmlnU3ViamVjdC52YWx1ZSwgLi4uY29uZmlnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgRWxpemEuXG4gICAqIEBwYXJhbSBkYXRhIEVsaXphIGRhdGFcbiAgICogQHBhcmFtIHJlaW5pdGlhbGl6ZSBpbmRpY2F0ZXMgdGhhdCBFbGl6YSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYWdhaW4sIGV2ZW4gaWYgaXQncyBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWRcbiAgICovXG4gIHB1YmxpYyBzZXR1cChkYXRhOiBJRWxpemFEYXRhLCByZWluaXRpYWxpemUgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhID09PSAndW5kZWZpbmVkJyAmJiAhcmVpbml0aWFsaXplKSB7XG4gICAgICB0aGlzLmluaXQoZGF0YSk7XG4gICAgfVxuICAgIHRoaXMucmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgRWxpemEuXG4gICAqL1xuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luaXRpYWxpemUgRWxpemEgZmlyc3QuJyk7XG4gICAgfVxuICAgIHRoaXMubWVtID0gW107XG4gICAgdGhpcy5sYXN0Q2hvaWNlID0gW107XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBkYXRhLmtleXdvcmRzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICB0aGlzLmxhc3RDaG9pY2Vba10gPSBbXTtcbiAgICAgIGNvbnN0IHJ1bGVzID0gZGF0YS5rZXl3b3Jkc1trXS5ydWxlcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdGhpcy5sYXN0Q2hvaWNlW2tdW2ldID0gLTE7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZXNTdWJqZWN0Lm5leHQoW3sgYm90OiB0cnVlLCB0ZXh0OiB0aGlzLmdldEluaXRpYWwoZGF0YSkgfV0pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1saW5lcy1wZXItZnVuY3Rpb24sIGNvbXBsZXhpdHkgLS0gVE9ETyByZWZhY3RvclxuICBwcml2YXRlIGluaXQoZGF0YTogSUVsaXphRGF0YSk6IHZvaWQge1xuICAgIHRoaXMuZGF0YSA9IHsgLi4uZGF0YSB9O1xuICAgIC8vIFBhcnNlIGRhdGEgYW5kIGNvbnZlcnQgaXQgZnJvbSBjYW5vbmljYWwgZm9ybSB0byBpbnRlcm5hbCB1c2UuXG4gICAgLy8gUHJvZHVjZSBhIGxpc3Qgb2Ygc3lub255bXMuXG4gICAgY29uc3Qgc3luUGF0dGVybnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gaW4gdGhpcy5kYXRhLnN5bm9ueW1zKSB7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBzeW5QYXR0ZXJuc1tpdGVtXSA9IGAoJHtpdGVtfXwke3RoaXMuZGF0YS5zeW5vbnltc1tpdGVtXS5qb2luKCd8Jyl9KWA7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENoZWNrIGtleXdvcmRzLlxuICAgIGlmIChkYXRhLmtleXdvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0VsaXphIGRvZXMgbm90IGhhdmUgYW55IGNvbmZpZ3VyZWQga2V5d29yZHMuJyk7XG4gICAgfVxuICAgIC8vIEZpcnN0LCBjb252ZXJ0IHJ1bGVzIHRvIHJlZ2V4cHMuXG4gICAgLy8gRXhwYW5kIHN5bm9ueW1zIGFuZCBpbnNlcnQgYXN0ZXJpc2sgZXhwcmVzc2lvbnMgZm9yIGJhY2t0cmFja2luZy5cbiAgICBjb25zdCBzcmUgPSAvQChcXFMrKS87XG4gICAgY29uc3QgYXJlID0gLyhcXFMpXFxzKlxcKlxccyooXFxTKS87XG4gICAgY29uc3QgYXJlMSA9IC9eXFxzKlxcKlxccyooXFxTKS87XG4gICAgY29uc3QgYXJlMiA9IC8oXFxTKVxccypcXCpcXHMqJC87XG4gICAgY29uc3QgYXJlMyA9IC9eXFxzKlxcKlxccyokLztcbiAgICBjb25zdCB3c3JlID0gL1xccysvZztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5rZXl3b3Jkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcnVsZXMgPSB0aGlzLmRhdGEua2V5d29yZHNbaV0ucnVsZXM7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJ1bGVzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSBydWxlc1tqXTtcbiAgICAgICAgLy8gQ2hlY2sgbWVtIGZsYWcgYW5kIHN0b3JlIGl0IGFzIGRlY29tcCdzIGVsZW1lbnQgMi5cbiAgICAgICAgaWYgKHJ1bGUucGF0dGVybi5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgIGxldCBvZnMgPSAxO1xuICAgICAgICAgIHdoaWxlIChydWxlLnBhdHRlcm4uY2hhckF0W29mc10gPT09ICcgJykge1xuICAgICAgICAgICAgb2ZzICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJ1bGUucGF0dGVybiA9IHJ1bGUucGF0dGVybi5zdWJzdHJpbmcob2ZzKTtcbiAgICAgICAgICBydWxlLm1lbW9yeSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcnVsZS5tZW1vcnkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2ggPSBydWxlLnBhdHRlcm4ubWF0Y2goc3JlKTtcbiAgICAgICAgd2hpbGUgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3Qgc3AgPSBzeW5QYXR0ZXJuc1ttYXRjaFsxXV0gPyBzeW5QYXR0ZXJuc1ttYXRjaFsxXV0gOiBtYXRjaFsxXTtcbiAgICAgICAgICBydWxlLnBhdHRlcm4gPSBydWxlLnBhdHRlcm4uc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4ID8/IDApICsgc3AgKyBydWxlLnBhdHRlcm4uc3Vic3RyaW5nKChtYXRjaC5pbmRleCA/PyAwKSArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgbWF0Y2ggPSBydWxlLnBhdHRlcm4ubWF0Y2goc3JlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHBhbmQgYXN0ZXJpc2sgZXhwcmVzc2lvbnMuXG4gICAgICAgIGlmIChhcmUzLnRlc3QocnVsZS5wYXR0ZXJuKSkge1xuICAgICAgICAgIHJ1bGUucGF0dGVybiA9ICdcXFxccyooLiopXFxcXHMqJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXRjaCA9IHJ1bGUucGF0dGVybi5tYXRjaChhcmUpO1xuICAgICAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGxlZnRQYXJ0ID0gJyc7XG4gICAgICAgICAgICBsZXQgcmlnaHRQYXJ0ID0gcnVsZS5wYXR0ZXJuO1xuICAgICAgICAgICAgd2hpbGUgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGxlZnRQYXJ0ICs9IHJpZ2h0UGFydC5zdWJzdHJpbmcoMCwgKG1hdGNoLmluZGV4ID8/IDApICsgMSk7XG4gICAgICAgICAgICAgIGlmIChtYXRjaFsxXSAhPT0gJyknKSB7XG4gICAgICAgICAgICAgICAgbGVmdFBhcnQgKz0gJ1xcXFxiJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZWZ0UGFydCArPSAnXFxcXHMqKC4qKVxcXFxzKic7XG4gICAgICAgICAgICAgIGlmIChtYXRjaFsyXSAhPT0gJygnICYmIG1hdGNoWzJdICE9PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICBsZWZ0UGFydCArPSAnXFxcXGInO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxlZnRQYXJ0ICs9IG1hdGNoWzJdO1xuICAgICAgICAgICAgICByaWdodFBhcnQgPSByaWdodFBhcnQuc3Vic3RyaW5nKChtYXRjaC5pbmRleCA/PyAwKSArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgIG1hdGNoID0gcmlnaHRQYXJ0Lm1hdGNoKGFyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydWxlLnBhdHRlcm4gPSBsZWZ0UGFydCArIHJpZ2h0UGFydDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWF0Y2ggPSBydWxlLnBhdHRlcm4ubWF0Y2goYXJlMSk7XG4gICAgICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbGVmdFBhcnQgPSAnXFxcXHMqKC4qKVxcXFxzKic7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMV0gIT09ICcpJyAmJiBtYXRjaFsxXSAhPT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgIGxlZnRQYXJ0ICs9ICdcXFxcYic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydWxlLnBhdHRlcm4gPSBsZWZ0UGFydCArIHJ1bGUucGF0dGVybi5zdWJzdHJpbmcoKG1hdGNoLmluZGV4ID8/IDApIC0gMSArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hdGNoID0gcnVsZS5wYXR0ZXJuLm1hdGNoKGFyZTIpO1xuICAgICAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGxlZnRQYXJ0ID0gcnVsZS5wYXR0ZXJuLnN1YnN0cmluZygwLCAobWF0Y2guaW5kZXggPz8gMCkgKyAxKTtcbiAgICAgICAgICAgIGlmIChtYXRjaFsxXSAhPT0gJygnKSB7XG4gICAgICAgICAgICAgIGxlZnRQYXJ0ICs9ICdcXFxcYic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydWxlLnBhdHRlcm4gPSBsZWZ0UGFydCArICdcXFxccyooLiopXFxcXHMqJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwYW5kIHdoaXRlc3BhY2VzLlxuICAgICAgICBydWxlLnBhdHRlcm4gPSBydWxlLnBhdHRlcm4ucmVwbGFjZSh3c3JlLCAnXFxcXHMrJyk7XG4gICAgICAgIHdzcmUubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU29ydCBrZXl3b3JkcyBieSByYW5rIChoaWdoZXN0IGZpcnN0KS5cbiAgICB0aGlzLmRhdGEua2V5d29yZHMuc29ydCh0aGlzLnNvcnRLZXl3b3Jkcyk7XG4gICAgLy8gQ29tcG9zZSByZWdleHBzIGFuZCByZWZzIGZvciBwcmVzIGFuZCBwb3N0cy5cbiAgICB0aGlzLmNvbXBvc2VSZWdFeHBzQW5kUHJlc0FuZFBvc3RzKHRoaXMuZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcG9zZXMgcmVnZXhwcyBhbmQgcmVmcyBmb3IgcHJlcyBhbmQgcG9zdHMuXG4gICAqIEBwYXJhbSBkYXRhIEVsaXphIGRhdGFcbiAgICovXG4gIHByaXZhdGUgY29tcG9zZVJlZ0V4cHNBbmRQcmVzQW5kUG9zdHMoZGF0YTogSUVsaXphRGF0YSk6IHZvaWQge1xuICAgIHRoaXMucHJlcyA9IHt9O1xuICAgIHRoaXMucG9zdHMgPSB7fTtcbiAgICBpZiAoZGF0YS5wcmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0VsaXphIGRvZXMgbm90IGhhdmUgYW55IGNvbmZpZ3VyZWQgcHJlIGV4cHJlc3Npb25zLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEucHJlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBhLnB1c2goZGF0YS5wcmVzW2ldKTtcbiAgICAgICAgdGhpcy5wcmVzW2RhdGEucHJlc1tpXV0gPSBkYXRhLnByZXNbaSArIDFdO1xuICAgICAgfVxuICAgICAgdGhpcy5wcmVFeHAgPSBuZXcgUmVnRXhwKCdcXFxcYignICsgYS5qb2luKCd8JykgKyAnKVxcXFxiJyk7XG4gICAgfVxuICAgIGlmIChkYXRhLnBvc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0VsaXphIGRvZXMgbm90IGhhdmUgYW55IGNvbmZpZ3VyZWQgcG9zdCBleHByZXNzaW9ucy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnBvc3RzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGEucHVzaChkYXRhLnBvc3RzW2ldKTtcbiAgICAgICAgdGhpcy5wb3N0c1tkYXRhLnBvc3RzW2ldXSA9IGRhdGEucG9zdHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgdGhpcy5wb3N0RXhwID0gbmV3IFJlZ0V4cCgnXFxcXGIoJyArIGEuam9pbignfCcpICsgJylcXFxcYicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGluZXMtcGVyLWZ1bmN0aW9uLCBjb21wbGV4aXR5IC0tIFRPRE8gcmVmYWN0b3JcbiAgcHJpdmF0ZSBleGVjUnVsZShkYXRhOiBJRWxpemFEYXRhLCBrOiBudW1iZXIsIHNlbnRlbmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU3ViamVjdC52YWx1ZTtcbiAgICBjb25zdCBydWxlcyA9IGRhdGEua2V5d29yZHNba10ucnVsZXM7XG4gICAgY29uc3QgcGFyYW1SZWdFeHAgPSAvXFwoKFswLTldKylcXCkvO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VudGVuY2UubWF0Y2gocnVsZXNbaV0ucGF0dGVybik7XG4gICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHJ1bGVzW2ldLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1lbW9yeSA9IHJ1bGVzW2ldLm1lbW9yeTtcbiAgICAgICAgbGV0IG9wdGlvbkluZGV4ID0gY29uZmlnLm5vUmFuZG9tID8gMCA6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgaWYgKChjb25maWcubm9SYW5kb20gJiYgdGhpcy5sYXN0Q2hvaWNlW2tdW2ldID4gb3B0aW9uSW5kZXgpIHx8IHRoaXMubGFzdENob2ljZVtrXVtpXSA9PT0gb3B0aW9uSW5kZXgpIHtcbiAgICAgICAgICB0aGlzLmxhc3RDaG9pY2Vba11baV0gKz0gMTtcbiAgICAgICAgICBvcHRpb25JbmRleCA9IHRoaXMubGFzdENob2ljZVtrXVtpXTtcbiAgICAgICAgICBpZiAob3B0aW9uSW5kZXggPj0gb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG9wdGlvbkluZGV4ID0gMDtcbiAgICAgICAgICAgIHRoaXMubGFzdENob2ljZVtrXVtpXSA9IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxhc3RDaG9pY2Vba11baV0gPSBvcHRpb25JbmRleDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVwbHkgPSBvcHRpb25zW29wdGlvbkluZGV4XTtcbiAgICAgICAgaWYgKGNvbmZpZy5kZWJ1Zykge1xuICAgICAgICAgIGNvbnN0IGRlYnVnTG9nID0gYG1hdGNoOlxcbmtleTogJHtkYXRhLmtleXdvcmRzW2tdLmtleX1cXG5yYW5rOiAke2RhdGEua2V5d29yZHNba10ucmFua31cXG5kZWNvbXA6ICR7cnVsZXNbaV0ucGF0dGVybn1cXG5yZWFzbWI6ICR7cmVwbHl9XFxubWVtb3J5OiAke21lbW9yeX1gO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlIC0tIGRlYnVnIG91dHB1dFxuICAgICAgICAgIGNvbnNvbGUud2FybignZGVidWdMb2cnLCBkZWJ1Z0xvZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcGx5LnNlYXJjaCgnXmdvdG8gJykgPT09IDApIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSByZXBseS5zdWJzdHJpbmcoNSk7XG4gICAgICAgICAgY29uc3Qga2kgPSB0aGlzLmdldFJ1bGVJbmRleEJ5S2V5KGRhdGEsIGtleSk7XG4gICAgICAgICAgaWYgKGtpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4ZWNSdWxlKGRhdGEsIGtpLCBzZW50ZW5jZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFN1YnN0aXR1dGUgcG9zaXRpb25hbCBwYXJhbXMuXG4gICAgICAgIGxldCBwYXJhbVJlZ0V4cE1hdGNoID0gcmVwbHkubWF0Y2gocGFyYW1SZWdFeHApO1xuICAgICAgICBpZiAocGFyYW1SZWdFeHBNYXRjaCkge1xuICAgICAgICAgIGxldCBsZWZ0UGFydCA9ICcnO1xuICAgICAgICAgIGxldCByaWdodFBhcnQgPSByZXBseTtcbiAgICAgICAgICB3aGlsZSAocGFyYW1SZWdFeHBNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHBhcmFtID0gbWF0Y2hbcGFyc2VJbnQocGFyYW1SZWdFeHBNYXRjaFsxXSwgMTApXTtcbiAgICAgICAgICAgIC8vIFBvc3Rwcm9jZXNzIHBhcmFtLlxuICAgICAgICAgICAgbGV0IHBvc3RFeHBNYXRjaCA9IHBhcmFtLm1hdGNoKHRoaXMucG9zdEV4cCk7XG4gICAgICAgICAgICBpZiAocG9zdEV4cE1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGxldCBsZWZ0UGFydDIgPSAnJztcbiAgICAgICAgICAgICAgbGV0IHJpZ2h0UGFydDIgPSBwYXJhbTtcbiAgICAgICAgICAgICAgd2hpbGUgKHBvc3RFeHBNYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxlZnRQYXJ0MiArPSByaWdodFBhcnQyLnN1YnN0cmluZygwLCBwb3N0RXhwTWF0Y2guaW5kZXggPz8gMCkgKyB0aGlzLnBvc3RzW3Bvc3RFeHBNYXRjaFsxXV07XG4gICAgICAgICAgICAgICAgcmlnaHRQYXJ0MiA9IHJpZ2h0UGFydDIuc3Vic3RyaW5nKChwb3N0RXhwTWF0Y2guaW5kZXggPz8gMCkgKyBwb3N0RXhwTWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBwb3N0RXhwTWF0Y2ggPSByaWdodFBhcnQyLm1hdGNoKHRoaXMucG9zdEV4cCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyYW0gPSBsZWZ0UGFydDIgKyByaWdodFBhcnQyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVmdFBhcnQgKz0gcmlnaHRQYXJ0LnN1YnN0cmluZygwLCBwYXJhbVJlZ0V4cE1hdGNoLmluZGV4KSArIHBhcmFtO1xuICAgICAgICAgICAgcmlnaHRQYXJ0ID0gcmlnaHRQYXJ0LnN1YnN0cmluZygocGFyYW1SZWdFeHBNYXRjaC5pbmRleCA/PyAwKSArIHBhcmFtUmVnRXhwTWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgIHBhcmFtUmVnRXhwTWF0Y2ggPSByaWdodFBhcnQubWF0Y2gocGFyYW1SZWdFeHApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXBseSA9IGxlZnRQYXJ0ICsgcmlnaHRQYXJ0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmVwbHkgPSB0aGlzLnBvc3RUcmFuc2Zvcm0oZGF0YSwgcmVwbHkpO1xuICAgICAgICBpZiAobWVtb3J5KSB7XG4gICAgICAgICAgdGhpcy5tZW1TYXZlKHRyYW5zZm9ybWVkUmVwbHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFJlcGx5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5IC0tIFRPRE8gcmVmYWN0b3JcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Vc2VyUXVlcnkoZGF0YTogSUVsaXphRGF0YSwgaW5wdXQ6IHN0cmluZyk6IElFbGl6YVJlc3BvbnNlIHtcbiAgICBsZXQgcmVwbHkgPSAnJztcbiAgICAvLyBVbmlmeSB0ZXh0IHN0cmluZyBhbmQgc3BsaXQgdGV4dCBpbiBwYXJ0IHNlbnRlbmNlcyBhbmQgbG9vcCB0aHJvdWdoIHRoZW0uXG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnNwbGl0VXNlclF1ZXJ5SW50b1BhcnRzKGlucHV0KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBsZXQgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgaWYgKHBhcnQgIT09ICcnKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBxdWl0IGV4cHJlc3Npb25zLlxuICAgICAgICBmb3IgKGxldCBxID0gMDsgcSA8IGRhdGEucXVpdHMubGVuZ3RoOyBxICs9IDEpIHtcbiAgICAgICAgICBpZiAoZGF0YS5xdWl0c1txXSA9PT0gcGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVwbHk6IHRoaXMuZ2V0RmluYWwoZGF0YSksIGZpbmFsOiB0cnVlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaCA9IHBhcnQubWF0Y2godGhpcy5wcmVFeHApO1xuICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICBsZXQgbGVmdFBhcnQgPSAnJztcbiAgICAgICAgICBsZXQgcmlnaHRQYXJ0ID0gcGFydDtcbiAgICAgICAgICB3aGlsZSAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxlZnRQYXJ0ICs9IHJpZ2h0UGFydC5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXggPz8gMCkgKyB0aGlzLnByZXNbbWF0Y2hbMV1dO1xuICAgICAgICAgICAgcmlnaHRQYXJ0ID0gcmlnaHRQYXJ0LnN1YnN0cmluZygobWF0Y2guaW5kZXggPz8gMCkgKyBtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICAgICAgbWF0Y2ggPSByaWdodFBhcnQubWF0Y2godGhpcy5wcmVFeHApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJ0ID0gbGVmdFBhcnQgKyByaWdodFBhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9vcCB0cm91Z2gga2V5d29yZHMuXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZGF0YS5rZXl3b3Jkcy5sZW5ndGg7IGsgKz0gMSkge1xuICAgICAgICAgIGlmIChwYXJ0LnNlYXJjaChuZXcgUmVnRXhwKCdcXFxcYicgKyBkYXRhLmtleXdvcmRzW2tdLmtleSArICdcXFxcYicsICdpJykpID49IDApIHtcbiAgICAgICAgICAgIHJlcGx5ID0gdGhpcy5leGVjUnVsZShkYXRhLCBrLCBwYXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcGx5ICE9PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVwbHksIGZpbmFsOiBmYWxzZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBOb3RoaW5nIG1hdGNoZWQsIHRyeSBtZW0uXG4gICAgcmVwbHkgPSB0aGlzLm1lbUdldCgpO1xuICAgIC8vIElmIG5vdGhpbmcgaW4gbWVtLCB0cnkgeG5vbmUuXG4gICAgaWYgKHJlcGx5ID09PSAnJykge1xuICAgICAgY29uc3QgayA9IHRoaXMuZ2V0UnVsZUluZGV4QnlLZXkoZGF0YSwgJ3hub25lJyk7XG4gICAgICByZXBseSA9IGsgPj0gMCA/IHRoaXMuZXhlY1J1bGUoZGF0YSwgaywgJyAnKSA6IHJlcGx5O1xuICAgIH1cbiAgICByZXR1cm4geyByZXBseTogcmVwbHkgIT09ICcnID8gcmVwbHkgOiAnSSBhbSBhdCBhIGxvc3MgZm9yIHdvcmRzLicsIGZpbmFsOiBmYWxzZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVuaWZ5IHRleHQgc3RyaW5nLCBzcGxpdCB0ZXh0IGludG8gcGFydGlhbCBzZW50ZW5jZXMgdG8gYmUgYWJsZSB0byBsb29wIHRocm91Z2ggdGhlbS5cbiAgICogQHBhcmFtIGlucHV0IHVzZXIgcXVlcnlcbiAgICogQHJldHVybnMgc3BsaXQgdXNlciBxdWVyeVxuICAgKi9cbiAgcHJpdmF0ZSBzcGxpdFVzZXJRdWVyeUludG9QYXJ0cyhpbnB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhcnRzID0gaW5wdXRcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvQCNcXCQlXFxeJlxcKlxcKFxcKV9cXCs9fmBcXHtcXFtcXH1cXF1cXHw6Ozw+XFwvXFxcXFxcdC9nLCAnICcpXG4gICAgICAucmVwbGFjZSgvXFxzKy0rXFxzKy9nLCAnLicpXG4gICAgICAucmVwbGFjZSgvXFxzKlssLj8hO10rXFxzKi9nLCAnLicpXG4gICAgICAucmVwbGFjZSgvXFxzKlxcYmJ1dFxcYlxccyovZywgJy4nKVxuICAgICAgLnJlcGxhY2UoL1xcc3syLH0vZywgJyAnKVxuICAgICAgLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0S2V5d29yZHMoYTogSUVsaXphS2V5d29yZCwgYjogSUVsaXphS2V5d29yZCkge1xuICAgIGlmIChhLnJhbmsgPiBiLnJhbmspIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGEucmFuayA8IGIucmFuaykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChhLmluZGV4ID4gYi5pbmRleCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChhLmluZGV4IDwgYi5pbmRleCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zdFRyYW5zZm9ybShkYXRhOiBJRWxpemFEYXRhLCBpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBmaW5hbCBjbGVhbmluZ3NcbiAgICBsZXQgcmVzdWx0ID0gaW5wdXQucmVwbGFjZSgvXFxzezIsfS9nLCAnICcpLnJlcGxhY2UoL1xccytcXC4vZywgJy4nKTtcbiAgICBpZiAoZGF0YS5wb3N0VHJhbnNmb3Jtcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEucG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgcG9zdFRyYW5zZm9ybSA9IGRhdGEucG9zdFRyYW5zZm9ybXNbaV07XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHBvc3RUcmFuc2Zvcm0uc2VhcmNoVmFsdWUsIHBvc3RUcmFuc2Zvcm0ucmVwbGFjZVZhbHVlKTtcbiAgICAgICAgZGF0YS5wb3N0VHJhbnNmb3Jtc1tpXS5zZWFyY2hWYWx1ZS5sYXN0SW5kZXggPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWdTdWJqZWN0LnZhbHVlLmNhcGl0YWxpemVGaXJzdExldHRlcikge1xuICAgICAgY29uc3QgbWF0Y2ggPSByZXN1bHQubWF0Y2goL14oW2Etel0pLyk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmVzdWx0ID0gbWF0Y2hbMF0udG9VcHBlckNhc2UoKSArIHJlc3VsdC5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGdldFJ1bGVJbmRleEJ5S2V5KGRhdGE6IElFbGl6YURhdGEsIGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGRhdGEua2V5d29yZHMubGVuZ3RoOyBrICs9IDEpIHtcbiAgICAgIGlmIChkYXRhLmtleXdvcmRzW2tdLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBwcml2YXRlIG1lbVNhdmUoaW5wdXQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWVtLnB1c2goaW5wdXQpO1xuICAgIGlmICh0aGlzLm1lbS5sZW5ndGggPiB0aGlzLmNvbmZpZ1N1YmplY3QudmFsdWUubWVtU2l6ZSkge1xuICAgICAgdGhpcy5tZW0uc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lbUdldCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm1lbS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5jb25maWdTdWJqZWN0LnZhbHVlLm5vUmFuZG9tKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbS5zaGlmdCgpID8/ICcnO1xuICAgICAgfVxuICAgICAgY29uc3QgbiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMubWVtLmxlbmd0aCk7XG4gICAgICBjb25zdCByZXBseSA9IHRoaXMubWVtW25dO1xuICAgICAgZm9yIChsZXQgaSA9IG4gKyAxOyBpIDwgdGhpcy5tZW0ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdGhpcy5tZW1baSAtIDFdID0gdGhpcy5tZW1baV07XG4gICAgICB9XG4gICAgICB0aGlzLm1lbS5sZW5ndGggLT0gMTtcbiAgICAgIHJldHVybiByZXBseTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaW5hbChkYXRhOiBJRWxpemFEYXRhKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0YS5maW5hbHMubGVuZ3RoID09PSAwID8gZWxpemFGaW5hbERlZmF1bHQgOiBkYXRhLmZpbmFsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBkYXRhLmZpbmFscy5sZW5ndGgpXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5pdGlhbChkYXRhOiBJRWxpemFEYXRhKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0YS5pbml0aWFscy5sZW5ndGggPT09IDAgPyBlbGl6YUluaXRpYWxEZWZhdWx0IDogZGF0YS5pbml0aWFsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBkYXRhLmluaXRpYWxzLmxlbmd0aCldO1xuICB9XG5cbiAgcHVibGljIGdldFJlc3BvbnNlKHN0YXRlbWVudDogc3RyaW5nKTogUHJvbWlzZTxJRWxpemFSZXNwb25zZT4ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbml0aWFsaXplIEVsaXphIGZpcnN0LicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2U8SUVsaXphUmVzcG9uc2U+KHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgZWxpemFSZXBseSA9IHRoaXMudHJhbnNmb3JtVXNlclF1ZXJ5KGRhdGEsIHN0YXRlbWVudCk7XG4gICAgICByZXNvbHZlKGVsaXphUmVwbHkpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './eliza/eliza.service';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NsaWVudC11dGlsLWVsaXphL3NyYy9saWIvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZWxpemEvZWxpemEuc2VydmljZSc7XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmZwcm9kei1jbGllbnQtdXRpbC1lbGl6YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvY2xpZW50LXV0aWwtZWxpemEvc3JjL3JmcHJvZHotY2xpZW50LXV0aWwtZWxpemEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=