@aitos/core 1.0.0 → 1.0.1

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.
@@ -0,0 +1,371 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAtAtom = exports.toUpperAtom = exports.toLowerAtom = exports.trimAtom = exports.replaceAtom = exports.startsWithAtom = exports.containsAtom = exports.toNumAtom = exports.formatAtom = exports.filterAtom = exports.mergeAtom = exports.valuesAtom = exports.keysAtom = exports.setPropAtom = exports.getPropAtom = exports.sliceAtom = exports.popAtom = exports.pushAtom = exports.lenAtom = exports.splitAtom = exports.concatAtom = void 0;
4
+ exports.concatAtom = {
5
+ name: 'concat',
6
+ version: '1.0.0',
7
+ meta: {
8
+ input: [
9
+ { name: 'a', type: 'any' },
10
+ { name: 'b', type: 'any' }
11
+ ],
12
+ output: { type: 'any' }
13
+ },
14
+ characteristics: { stateless: true, atomic: true, composable: true },
15
+ execute: async (input, context) => {
16
+ if (Array.isArray(input.a) && Array.isArray(input.b)) {
17
+ return { success: true, data: [...input.a, ...input.b] };
18
+ }
19
+ return { success: true, data: String(input.a) + String(input.b) };
20
+ },
21
+ };
22
+ exports.splitAtom = {
23
+ name: 'split',
24
+ version: '1.0.0',
25
+ meta: {
26
+ input: [
27
+ { name: 'text', type: 'string' },
28
+ { name: 'separator', type: 'string' }
29
+ ],
30
+ output: { type: 'array' }
31
+ },
32
+ characteristics: { stateless: true, atomic: true, composable: true },
33
+ execute: async (input, context) => {
34
+ return { success: true, data: input.text.split(input.separator) };
35
+ },
36
+ };
37
+ exports.lenAtom = {
38
+ name: 'len',
39
+ version: '1.0.0',
40
+ meta: {
41
+ input: [
42
+ { name: 'value', type: 'any' }
43
+ ],
44
+ output: { type: 'number' }
45
+ },
46
+ characteristics: { stateless: true, atomic: true, composable: true },
47
+ execute: async (input, context) => {
48
+ if (input.value === null || input.value === undefined) {
49
+ return { success: true, data: 0 };
50
+ }
51
+ return { success: true, data: input.value.length };
52
+ },
53
+ };
54
+ exports.pushAtom = {
55
+ name: 'push',
56
+ version: '1.0.0',
57
+ meta: {
58
+ input: [
59
+ { name: 'array', type: 'array' },
60
+ { name: 'value', type: 'any' }
61
+ ],
62
+ output: { type: 'array' }
63
+ },
64
+ characteristics: { stateless: true, atomic: true, composable: true },
65
+ execute: async (input, context) => {
66
+ const arr = [...input.array, input.value];
67
+ return { success: true, data: arr };
68
+ },
69
+ };
70
+ exports.popAtom = {
71
+ name: 'pop',
72
+ version: '1.0.0',
73
+ meta: {
74
+ input: [
75
+ { name: 'array', type: 'array' }
76
+ ],
77
+ output: { type: 'any' }
78
+ },
79
+ characteristics: { stateless: true, atomic: true, composable: true },
80
+ execute: async (input, context) => {
81
+ const arr = [...input.array];
82
+ const value = arr.pop();
83
+ return { success: true, data: value };
84
+ },
85
+ };
86
+ exports.sliceAtom = {
87
+ name: 'slice',
88
+ version: '1.0.0',
89
+ meta: {
90
+ input: [
91
+ { name: 'array', type: 'array|string' },
92
+ { name: 'start', type: 'number' },
93
+ { name: 'end', type: 'number' }
94
+ ],
95
+ output: { type: 'array|string' }
96
+ },
97
+ characteristics: { stateless: true, atomic: true, composable: true },
98
+ execute: async (input, context) => {
99
+ if (typeof input.array === 'string') {
100
+ return { success: true, data: input.array.slice(input.start, input.end) };
101
+ }
102
+ return { success: true, data: input.array.slice(input.start, input.end) };
103
+ },
104
+ };
105
+ exports.getPropAtom = {
106
+ name: 'getProp',
107
+ version: '1.0.0',
108
+ meta: {
109
+ input: [
110
+ { name: 'obj', type: 'object' },
111
+ { name: 'key', type: 'any' }
112
+ ],
113
+ output: { type: 'any' }
114
+ },
115
+ characteristics: { stateless: true, atomic: true, composable: true },
116
+ execute: async (input, context) => {
117
+ return { success: true, data: input.obj?.[input.key] ?? null };
118
+ },
119
+ };
120
+ exports.setPropAtom = {
121
+ name: 'setProp',
122
+ version: '1.0.0',
123
+ meta: {
124
+ input: [
125
+ { name: 'obj', type: 'object' },
126
+ { name: 'key', type: 'any' },
127
+ { name: 'value', type: 'any' }
128
+ ],
129
+ output: { type: 'any' }
130
+ },
131
+ characteristics: { stateless: true, atomic: true, composable: true },
132
+ execute: async (input, context) => {
133
+ if (Array.isArray(input.obj)) {
134
+ const arr = [...input.obj];
135
+ arr[Number(input.key)] = input.value;
136
+ return { success: true, data: arr };
137
+ }
138
+ else {
139
+ const obj = { ...input.obj };
140
+ obj[input.key] = input.value;
141
+ return { success: true, data: obj };
142
+ }
143
+ },
144
+ };
145
+ exports.keysAtom = {
146
+ name: 'keys',
147
+ version: '1.0.0',
148
+ meta: {
149
+ input: [
150
+ { name: 'obj', type: 'object' }
151
+ ],
152
+ output: { type: 'array' }
153
+ },
154
+ characteristics: { stateless: true, atomic: true, composable: true },
155
+ execute: async (input, context) => {
156
+ return { success: true, data: Object.keys(input.obj || {}) };
157
+ },
158
+ };
159
+ exports.valuesAtom = {
160
+ name: 'values',
161
+ version: '1.0.0',
162
+ meta: {
163
+ input: [
164
+ { name: 'obj', type: 'object' }
165
+ ],
166
+ output: { type: 'array' }
167
+ },
168
+ characteristics: { stateless: true, atomic: true, composable: true },
169
+ execute: async (input, context) => {
170
+ return { success: true, data: Object.values(input.obj || {}) };
171
+ },
172
+ };
173
+ exports.mergeAtom = {
174
+ name: 'merge',
175
+ version: '1.0.0',
176
+ meta: {
177
+ input: [
178
+ { name: 'a', type: 'object' },
179
+ { name: 'b', type: 'object' }
180
+ ],
181
+ output: { type: 'object' }
182
+ },
183
+ characteristics: { stateless: true, atomic: true, composable: true },
184
+ execute: async (input, context) => {
185
+ return { success: true, data: { ...input.a, ...input.b } };
186
+ },
187
+ };
188
+ exports.filterAtom = {
189
+ name: 'filter',
190
+ version: '1.0.0',
191
+ meta: {
192
+ input: [
193
+ { name: 'array', type: 'array', description: 'Array to filter' },
194
+ { name: 'nodes', type: 'object', description: 'Graph to execute for each item, should return boolean' },
195
+ { name: 'itemKey', type: 'string', description: 'Key to store current item in store' },
196
+ { name: 'indexKey', type: 'string', description: 'Optional key to store current index' }
197
+ ],
198
+ output: { type: 'array', description: 'Filtered array' }
199
+ },
200
+ characteristics: { stateless: true, atomic: true, composable: true },
201
+ execute: async (input, context) => {
202
+ if (!context.executeGraph) {
203
+ return { success: true, data: [] };
204
+ }
205
+ if (!Array.isArray(input.array)) {
206
+ return { success: false, error: 'Input is not an array' };
207
+ }
208
+ const result = [];
209
+ for (let i = 0; i < input.array.length; i++) {
210
+ context.store.set(input.itemKey, input.array[i]);
211
+ if (input.indexKey) {
212
+ context.store.set(input.indexKey, i);
213
+ }
214
+ const results = await context.executeGraph(input.nodes, context.currentScope);
215
+ const lastNodeId = input.nodes.order[input.nodes.order.length - 1];
216
+ const shouldKeep = results[lastNodeId];
217
+ if (shouldKeep === true) {
218
+ result.push(input.array[i]);
219
+ }
220
+ }
221
+ return { success: true, data: result };
222
+ },
223
+ };
224
+ exports.formatAtom = {
225
+ name: 'format',
226
+ version: '1.0.0',
227
+ meta: {
228
+ input: [
229
+ { name: 'template', type: 'string', description: 'Template string with {placeholder} syntax' }
230
+ ],
231
+ output: { type: 'string', description: 'Formatted string with placeholders replaced' }
232
+ },
233
+ characteristics: { stateless: true, atomic: true, composable: true },
234
+ execute: async (input, context) => {
235
+ let result = input.template;
236
+ for (const [key, value] of Object.entries(input)) {
237
+ if (key === 'template')
238
+ continue;
239
+ const placeholder = `{${key}}`;
240
+ const strValue = (typeof value === 'object' && value !== null) ? JSON.stringify(value, null, 2) : String(value);
241
+ result = result.replace(new RegExp(placeholder.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), strValue);
242
+ }
243
+ return { success: true, data: result };
244
+ },
245
+ };
246
+ exports.toNumAtom = {
247
+ name: 'toNum',
248
+ version: '1.0.0',
249
+ meta: {
250
+ input: [
251
+ { name: 'value', type: 'any', description: 'Value to convert to number' }
252
+ ],
253
+ output: { type: 'number', description: 'Numeric value or NaN if conversion fails' }
254
+ },
255
+ characteristics: { stateless: true, atomic: true, composable: true },
256
+ execute: async (input, context) => {
257
+ const num = Number(input.value);
258
+ return { success: true, data: num };
259
+ },
260
+ };
261
+ exports.containsAtom = {
262
+ name: 'contains',
263
+ version: '1.0.0',
264
+ meta: {
265
+ input: [
266
+ { name: 'text', type: 'string', description: 'String to search in' },
267
+ { name: 'search', type: 'string', description: 'String to search for' }
268
+ ],
269
+ output: { type: 'boolean', description: 'True if text contains search' }
270
+ },
271
+ characteristics: { stateless: true, atomic: true, composable: true },
272
+ execute: async (input, context) => {
273
+ return { success: true, data: String(input.text).includes(String(input.search)) };
274
+ },
275
+ };
276
+ exports.startsWithAtom = {
277
+ name: 'startsWith',
278
+ version: '1.0.0',
279
+ meta: {
280
+ input: [
281
+ { name: 'text', type: 'string', description: 'String to check' },
282
+ { name: 'prefix', type: 'string', description: 'Prefix to check for' }
283
+ ],
284
+ output: { type: 'boolean', description: 'True if text starts with prefix' }
285
+ },
286
+ characteristics: { stateless: true, atomic: true, composable: true },
287
+ execute: async (input, context) => {
288
+ return { success: true, data: String(input.text).startsWith(String(input.prefix)) };
289
+ },
290
+ };
291
+ exports.replaceAtom = {
292
+ name: 'replace',
293
+ version: '1.0.0',
294
+ meta: {
295
+ input: [
296
+ { name: 'text', type: 'string', description: 'Source string' },
297
+ { name: 'search', type: 'string', description: 'Substring to find' },
298
+ { name: 'replacement', type: 'string', description: 'Replacement string' }
299
+ ],
300
+ output: { type: 'string', description: 'String with first occurrence replaced' }
301
+ },
302
+ characteristics: { stateless: true, atomic: true, composable: true },
303
+ execute: async (input, context) => {
304
+ return { success: true, data: String(input.text).replace(String(input.search), String(input.replacement)) };
305
+ },
306
+ };
307
+ exports.trimAtom = {
308
+ name: 'trim',
309
+ version: '1.0.0',
310
+ meta: {
311
+ input: [
312
+ { name: 'text', type: 'string', description: 'String to trim' }
313
+ ],
314
+ output: { type: 'string', description: 'Trimmed string' }
315
+ },
316
+ characteristics: { stateless: true, atomic: true, composable: true },
317
+ execute: async (input, context) => {
318
+ return { success: true, data: String(input.text).trim() };
319
+ },
320
+ };
321
+ exports.toLowerAtom = {
322
+ name: 'toLower',
323
+ version: '1.0.0',
324
+ meta: {
325
+ input: [
326
+ { name: 'text', type: 'string', description: 'String to convert' }
327
+ ],
328
+ output: { type: 'string', description: 'Lowercase string' }
329
+ },
330
+ characteristics: { stateless: true, atomic: true, composable: true },
331
+ execute: async (input, context) => {
332
+ return { success: true, data: String(input.text).toLowerCase() };
333
+ },
334
+ };
335
+ exports.toUpperAtom = {
336
+ name: 'toUpper',
337
+ version: '1.0.0',
338
+ meta: {
339
+ input: [
340
+ { name: 'text', type: 'string', description: 'String to convert' }
341
+ ],
342
+ output: { type: 'string', description: 'Uppercase string' }
343
+ },
344
+ characteristics: { stateless: true, atomic: true, composable: true },
345
+ execute: async (input, context) => {
346
+ return { success: true, data: String(input.text).toUpperCase() };
347
+ },
348
+ };
349
+ exports.getAtAtom = {
350
+ name: 'getAt',
351
+ version: '1.0.0',
352
+ meta: {
353
+ input: [
354
+ { name: 'array', type: 'array', description: 'Array to index into' },
355
+ { name: 'index', type: 'number', description: 'Index to retrieve' }
356
+ ],
357
+ output: { type: 'any', description: 'Element at the given index' }
358
+ },
359
+ characteristics: { stateless: true, atomic: true, composable: true },
360
+ execute: async (input, context) => {
361
+ if (!Array.isArray(input.array)) {
362
+ return { success: false, error: 'Input is not an array' };
363
+ }
364
+ const idx = Number(input.index);
365
+ if (idx < 0 || idx >= input.array.length) {
366
+ return { success: true, data: null };
367
+ }
368
+ return { success: true, data: input.array[idx] };
369
+ },
370
+ };
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaXB1bGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F0b21zL21hbmlwdWxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFYSxRQUFBLFVBQVUsR0FBUztJQUM5QixJQUFJLEVBQUUsUUFBUTtJQUNkLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRTtZQUNMLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQzFCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1NBQzNCO1FBQ0QsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtLQUN4QjtJQUNELGVBQWUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO0lBQ3BFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBeUIsRUFBRSxPQUFnQixFQUFtQixFQUFFO1FBQzlFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUM7Q0FDRixDQUFDO0FBRVcsUUFBQSxTQUFTLEdBQVM7SUFDN0Is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RUFBRSxJQUFJLEVBQUU7SUFDcEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFzQyxFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDM0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLENBQUM7UUFDNUQsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0b20sIENvbnRleHQsIFJlc3VsdCwgR3JhcGggfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBjb25jYXRBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAnY29uY2F0JyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdhJywgdHlwZTogJ2FueScgfSxcbiAgICAgIHsgbmFtZTogJ2InLCB0eXBlOiAnYW55JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FueScgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IGE6IGFueTsgYjogYW55IH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0LmEpICYmIEFycmF5LmlzQXJyYXkoaW5wdXQuYikpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFsuLi5pbnB1dC5hLCAuLi5pbnB1dC5iXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQuYSkgKyBTdHJpbmcoaW5wdXQuYikgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBzcGxpdEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdzcGxpdCcsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICB7IG5hbWU6ICdzZXBhcmF0b3InLCB0eXBlOiAnc3RyaW5nJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdGV4dDogc3RyaW5nOyBzZXBhcmF0b3I6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBpbnB1dC50ZXh0LnNwbGl0KGlucHV0LnNlcGFyYXRvcikgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBsZW5BdG9tOiBBdG9tID0ge1xuICBuYW1lOiAnbGVuJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICd2YWx1ZScsIHR5cGU6ICdhbnknIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnbnVtYmVyJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdmFsdWU6IHN0cmluZyB8IGFueVtdIHwgbnVsbCB8IHVuZGVmaW5lZCB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoaW5wdXQudmFsdWUgPT09IG51bGwgfHwgaW5wdXQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogMCB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBpbnB1dC52YWx1ZS5sZW5ndGggfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBwdXNoQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ3B1c2gnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2FycmF5JywgdHlwZTogJ2FycmF5JyB9LFxuICAgICAgeyBuYW1lOiAndmFsdWUnLCB0eXBlOiAnYW55JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgYXJyYXk6IGFueVtdOyB2YWx1ZTogYW55IH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGNvbnN0IGFyciA9IFsuLi5pbnB1dC5hcnJheSwgaW5wdXQudmFsdWVdO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IGFyciB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHBvcEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdwb3AnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2FycmF5JywgdHlwZTogJ2FycmF5JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FueScgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IGFycmF5OiBhbnlbXSB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBjb25zdCBhcnIgPSBbLi4uaW5wdXQuYXJyYXldO1xuICAgIGNvbnN0IHZhbHVlID0gYXJyLnBvcCgpO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHZhbHVlIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc2xpY2VBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAnc2xpY2UnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2FycmF5JywgdHlwZTogJ2FycmF5fHN0cmluZycgfSxcbiAgICAgIHsgbmFtZTogJ3N0YXJ0JywgdHlwZTogJ251bWJlcicgfSxcbiAgICAgIHsgbmFtZTogJ2VuZCcsIHR5cGU6ICdudW1iZXInIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYXJyYXl8c3RyaW5nJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgYXJyYXk6IGFueVtdIHwgc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ/OiBudW1iZXIgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dC5hcnJheSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IGlucHV0LmFycmF5LnNsaWNlKGlucHV0LnN0YXJ0LCBpbnB1dC5lbmQpIH07XG4gICAgfVxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IGlucHV0LmFycmF5LnNsaWNlKGlucHV0LnN0YXJ0LCBpbnB1dC5lbmQpIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHJvcEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdnZXRQcm9wJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdvYmonLCB0eXBlOiAnb2JqZWN0JyB9LFxuICAgICAgeyBuYW1lOiAna2V5JywgdHlwZTogJ2FueScgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdhbnknIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyBvYmo6IGFueTsga2V5OiBzdHJpbmcgfCBudW1iZXIgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogaW5wdXQub2JqPy5baW5wdXQua2V5XSA/PyBudWxsIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc2V0UHJvcEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdzZXRQcm9wJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdvYmonLCB0eXBlOiAnb2JqZWN0JyB9LFxuICAgICAgeyBuYW1lOiAna2V5JywgdHlwZTogJ2FueScgfSxcbiAgICAgIHsgbmFtZTogJ3ZhbHVlJywgdHlwZTogJ2FueScgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdhbnknIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyBvYmo6IGFueTsga2V5OiBzdHJpbmcgfCBudW1iZXI7IHZhbHVlOiBhbnkgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQub2JqKSkge1xuICAgICAgY29uc3QgYXJyID0gWy4uLmlucHV0Lm9ial07XG4gICAgICBhcnJbTnVtYmVyKGlucHV0LmtleSldID0gaW5wdXQudmFsdWU7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBhcnIgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb2JqID0geyAuLi5pbnB1dC5vYmogfTtcbiAgICAgIG9ialtpbnB1dC5rZXldID0gaW5wdXQudmFsdWU7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBvYmogfTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qga2V5c0F0b206IEF0b20gPSB7XG4gIG5hbWU6ICdrZXlzJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdvYmonLCB0eXBlOiAnb2JqZWN0JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgb2JqOiBhbnkgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogT2JqZWN0LmtleXMoaW5wdXQub2JqIHx8IHt9KSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlc0F0b206IEF0b20gPSB7XG4gIG5hbWU6ICd2YWx1ZXMnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ29iaicsIHR5cGU6ICdvYmplY3QnIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYXJyYXknIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyBvYmo6IGFueSB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBPYmplY3QudmFsdWVzKGlucHV0Lm9iaiB8fCB7fSkgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBtZXJnZUF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdtZXJnZScsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAnYScsIHR5cGU6ICdvYmplY3QnIH0sXG4gICAgICB7IG5hbWU6ICdiJywgdHlwZTogJ29iamVjdCcgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdvYmplY3QnIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyBhOiBhbnk7IGI6IGFueSB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiB7IC4uLmlucHV0LmEsIC4uLmlucHV0LmIgfSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZpbHRlckF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdmaWx0ZXInLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2FycmF5JywgdHlwZTogJ2FycmF5JywgZGVzY3JpcHRpb246ICdBcnJheSB0byBmaWx0ZXInIH0sXG4gICAgICB7IG5hbWU6ICdub2RlcycsIHR5cGU6ICdvYmplY3QnLCBkZXNjcmlwdGlvbjogJ0dyYXBoIHRvIGV4ZWN1dGUgZm9yIGVhY2ggaXRlbSwgc2hvdWxkIHJldHVybiBib29sZWFuJyB9LFxuICAgICAgeyBuYW1lOiAnaXRlbUtleScsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ0tleSB0byBzdG9yZSBjdXJyZW50IGl0ZW0gaW4gc3RvcmUnIH0sXG4gICAgICB7IG5hbWU6ICdpbmRleEtleScsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIGtleSB0byBzdG9yZSBjdXJyZW50IGluZGV4JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JywgZGVzY3JpcHRpb246ICdGaWx0ZXJlZCBhcnJheScgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IFxuICAgIGFycmF5OiBhbnlbXTsgXG4gICAgbm9kZXM6IEdyYXBoOyBcbiAgICBpdGVtS2V5OiBzdHJpbmc7XG4gICAgaW5kZXhLZXk/OiBzdHJpbmc7XG4gIH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGlmICghY29udGV4dC5leGVjdXRlR3JhcGgpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFtdIH07XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0LmFycmF5KSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnSW5wdXQgaXMgbm90IGFuIGFycmF5JyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0LmFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb250ZXh0LnN0b3JlLnNldChpbnB1dC5pdGVtS2V5LCBpbnB1dC5hcnJheVtpXSk7XG4gICAgICBpZiAoaW5wdXQuaW5kZXhLZXkpIHtcbiAgICAgICAgY29udGV4dC5zdG9yZS5zZXQoaW5wdXQuaW5kZXhLZXksIGkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgY29udGV4dC5leGVjdXRlR3JhcGgoaW5wdXQubm9kZXMsIGNvbnRleHQuY3VycmVudFNjb3BlKTtcbiAgICAgIGNvbnN0IGxhc3ROb2RlSWQgPSBpbnB1dC5ub2Rlcy5vcmRlcltpbnB1dC5ub2Rlcy5vcmRlci5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IHNob3VsZEtlZXAgPSByZXN1bHRzW2xhc3ROb2RlSWRdO1xuICAgICAgXG4gICAgICBpZiAoc2hvdWxkS2VlcCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXN1bHQucHVzaChpbnB1dC5hcnJheVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlc3VsdCB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdmb3JtYXQnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ3RlbXBsYXRlJywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnVGVtcGxhdGUgc3RyaW5nIHdpdGgge3BsYWNlaG9sZGVyfSBzeW50YXgnIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdGb3JtYXR0ZWQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzIHJlcGxhY2VkJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdGVtcGxhdGU6IHN0cmluZzsgW2tleTogc3RyaW5nXTogYW55IH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGxldCByZXN1bHQgPSBpbnB1dC50ZW1wbGF0ZTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICd0ZW1wbGF0ZScpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBgeyR7a2V5fX1gO1xuICAgICAgY29uc3Qgc3RyVmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMikgOiBTdHJpbmcodmFsdWUpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UobmV3IFJlZ0V4cChwbGFjZWhvbGRlci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLCAnZycpLCBzdHJWYWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlc3VsdCB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRvTnVtQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ3RvTnVtJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICd2YWx1ZScsIHR5cGU6ICdhbnknLCBkZXNjcmlwdGlvbjogJ1ZhbHVlIHRvIGNvbnZlcnQgdG8gbnVtYmVyJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ251bWJlcicsIGRlc2NyaXB0aW9uOiAnTnVtZXJpYyB2YWx1ZSBvciBOYU4gaWYgY29udmVyc2lvbiBmYWlscycgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IHZhbHVlOiBhbnkgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgbnVtID0gTnVtYmVyKGlucHV0LnZhbHVlKTtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBudW0gfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBjb250YWluc0F0b206IEF0b20gPSB7XG4gIG5hbWU6ICdjb250YWlucycsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB0byBzZWFyY2ggaW4nIH0sXG4gICAgICB7IG5hbWU6ICdzZWFyY2gnLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTdHJpbmcgdG8gc2VhcmNoIGZvcicgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdib29sZWFuJywgZGVzY3JpcHRpb246ICdUcnVlIGlmIHRleHQgY29udGFpbnMgc2VhcmNoJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdGV4dDogc3RyaW5nOyBzZWFyY2g6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQudGV4dCkuaW5jbHVkZXMoU3RyaW5nKGlucHV0LnNlYXJjaCkpIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRzV2l0aEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdzdGFydHNXaXRoJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICd0ZXh0JywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnU3RyaW5nIHRvIGNoZWNrJyB9LFxuICAgICAgeyBuYW1lOiAncHJlZml4JywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnUHJlZml4IHRvIGNoZWNrIGZvcicgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdib29sZWFuJywgZGVzY3JpcHRpb246ICdUcnVlIGlmIHRleHQgc3RhcnRzIHdpdGggcHJlZml4JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdGV4dDogc3RyaW5nOyBwcmVmaXg6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQudGV4dCkuc3RhcnRzV2l0aChTdHJpbmcoaW5wdXQucHJlZml4KSkgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCByZXBsYWNlQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ3JlcGxhY2UnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ3RleHQnLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTb3VyY2Ugc3RyaW5nJyB9LFxuICAgICAgeyBuYW1lOiAnc2VhcmNoJywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnU3Vic3RyaW5nIHRvIGZpbmQnIH0sXG4gICAgICB7IG5hbWU6ICdyZXBsYWNlbWVudCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1JlcGxhY2VtZW50IHN0cmluZycgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB3aXRoIGZpcnN0IG9jY3VycmVuY2UgcmVwbGFjZWQnIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyB0ZXh0OiBzdHJpbmc7IHNlYXJjaDogc3RyaW5nOyByZXBsYWNlbWVudDogc3RyaW5nIH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFN0cmluZyhpbnB1dC50ZXh0KS5yZXBsYWNlKFN0cmluZyhpbnB1dC5zZWFyY2gpLCBTdHJpbmcoaW5wdXQucmVwbGFjZW1lbnQpKSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRyaW1BdG9tOiBBdG9tID0ge1xuICBuYW1lOiAndHJpbScsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB0byB0cmltJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnVHJpbW1lZCBzdHJpbmcnIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyB0ZXh0OiBzdHJpbmcgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogU3RyaW5nKGlucHV0LnRleHQpLnRyaW0oKSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRvTG93ZXJBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAndG9Mb3dlcicsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB0byBjb252ZXJ0JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnTG93ZXJjYXNlIHN0cmluZycgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IHRleHQ6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQudGV4dCkudG9Mb3dlckNhc2UoKSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRvVXBwZXJBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAndG9VcHBlcicsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB0byBjb252ZXJ0JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnVXBwZXJjYXNlIHN0cmluZycgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IHRleHQ6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQudGV4dCkudG9VcHBlckNhc2UoKSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGdldEF0QXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ2dldEF0JyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdhcnJheScsIHR5cGU6ICdhcnJheScsIGRlc2NyaXB0aW9uOiAnQXJyYXkgdG8gaW5kZXggaW50bycgfSxcbiAgICAgIHsgbmFtZTogJ2luZGV4JywgdHlwZTogJ251bWJlcicsIGRlc2NyaXB0aW9uOiAnSW5kZXggdG8gcmV0cmlldmUnIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYW55JywgZGVzY3JpcHRpb246ICdFbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleCcgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IGFycmF5OiBhbnlbXTsgaW5kZXg6IG51bWJlciB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQuYXJyYXkpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdJbnB1dCBpcyBub3QgYW4gYXJyYXknIH07XG4gICAgfVxuICAgIGNvbnN0IGlkeCA9IE51bWJlcihpbnB1dC5pbmRleCk7XG4gICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IGlucHV0LmFycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogbnVsbCB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBpbnB1dC5hcnJheVtpZHhdIH07XG4gIH0sXG59O1xuIl19
@@ -0,0 +1,3 @@
1
+ import { Atom } from '../types';
2
+ export declare const getAtom: Atom;
3
+ export declare const setAtom: Atom;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setAtom = exports.getAtom = void 0;
4
+ exports.getAtom = {
5
+ name: 'get',
6
+ version: '1.0.0',
7
+ meta: {
8
+ input: [
9
+ { name: 'key', type: 'string', description: 'State key name' }
10
+ ],
11
+ output: { type: 'any', description: 'Stored value' }
12
+ },
13
+ characteristics: { stateless: true, atomic: true, composable: true },
14
+ execute: async (input, context) => {
15
+ const value = context.store.get(input.key);
16
+ return { success: true, data: value ?? null };
17
+ },
18
+ };
19
+ exports.setAtom = {
20
+ name: 'set',
21
+ version: '1.0.0',
22
+ meta: {
23
+ input: [
24
+ { name: 'key', type: 'string', description: 'State key name' },
25
+ { name: 'value', type: 'any', description: 'Value to store' }
26
+ ],
27
+ output: { type: 'any', description: 'The value that was set' }
28
+ },
29
+ characteristics: { stateless: true, atomic: true, composable: true },
30
+ execute: async (input, context) => {
31
+ context.store.set(input.key, input.value);
32
+ return { success: true, data: input.value };
33
+ },
34
+ };
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXRvbXMvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxPQUFPLEdBQVM7SUFDM0IsSUFBSSxFQUFFLEtBQUs7SUFDWCxPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUU7UUFDSixLQUFLLEVBQUU7WUFDTCxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUU7U0FDL0Q7UUFDRCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUU7S0FDckQ7SUFDRCxlQUFlLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtJQUNwRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQXNCLEVBQUUsT0FBZ0IsRUFBbUIsRUFBRTtRQUMzRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0NBQ0YsQ0FBQztBQUVXLFFBQUEsT0FBTyxHQUFTO0lBQzNCLElBQUksRUFBRSxLQUFLO0lBQ1gsT0FBTyxFQUFFLE9BQU87SUFDaEIsSUFBSSxFQUFFO1FBQ0osS0FBSyxFQUFFO1lBQ0wsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFO1lBQzlELEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRTtTQUM5RDtRQUNELE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFO0tBQy9EO0lBQ0QsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7SUFDcEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFrQyxFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDdkYsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0b20sIENvbnRleHQsIFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGdldEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdnZXQnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0YXRlIGtleSBuYW1lJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FueScsIGRlc2NyaXB0aW9uOiAnU3RvcmVkIHZhbHVlJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsga2V5OiBzdHJpbmcgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250ZXh0LnN0b3JlLmdldChpbnB1dC5rZXkpO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHZhbHVlID8/IG51bGwgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAnc2V0JyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTdGF0ZSBrZXkgbmFtZScgfSxcbiAgICAgIHsgbmFtZTogJ3ZhbHVlJywgdHlwZTogJ2FueScsIGRlc2NyaXB0aW9uOiAnVmFsdWUgdG8gc3RvcmUnIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYW55JywgZGVzY3JpcHRpb246ICdUaGUgdmFsdWUgdGhhdCB3YXMgc2V0JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnkgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgY29udGV4dC5zdG9yZS5zZXQoaW5wdXQua2V5LCBpbnB1dC52YWx1ZSk7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogaW5wdXQudmFsdWUgfTtcbiAgfSxcbn07XG4iXX0=
@@ -0,0 +1,6 @@
1
+ import { Atom } from '../types';
2
+ export declare const getTelemetryStatsAtom: Atom;
3
+ export declare const resetTelemetryAtom: Atom;
4
+ export declare const flushTelemetryAtom: Atom;
5
+ export declare const getTelemetryHistoryAtom: Atom;
6
+ export declare const analyzeTelemetryAtom: Atom;
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeTelemetryAtom = exports.getTelemetryHistoryAtom = exports.flushTelemetryAtom = exports.resetTelemetryAtom = exports.getTelemetryStatsAtom = void 0;
4
+ exports.getTelemetryStatsAtom = {
5
+ name: 'getTelemetryStats',
6
+ version: '1.0.0',
7
+ meta: {
8
+ input: [],
9
+ output: { type: 'array', description: 'Aggregated telemetry statistics per atom' }
10
+ },
11
+ characteristics: { stateless: false, atomic: true, composable: true },
12
+ execute: async (_input, context) => {
13
+ if (!context.runtime) {
14
+ return { success: false, error: 'Runtime not available' };
15
+ }
16
+ const stats = context.runtime.getTelemetryStats();
17
+ return { success: true, data: stats };
18
+ }
19
+ };
20
+ exports.resetTelemetryAtom = {
21
+ name: 'resetTelemetry',
22
+ version: '1.0.0',
23
+ meta: {
24
+ input: [],
25
+ output: { type: 'null', description: 'Clears all telemetry data' }
26
+ },
27
+ characteristics: { stateless: false, atomic: true, composable: true },
28
+ execute: async (_input, context) => {
29
+ if (!context.runtime) {
30
+ return { success: false, error: 'Runtime not available' };
31
+ }
32
+ context.runtime.resetTelemetry();
33
+ return { success: true, data: null };
34
+ }
35
+ };
36
+ exports.flushTelemetryAtom = {
37
+ name: 'flushTelemetry',
38
+ version: '1.0.0',
39
+ meta: {
40
+ input: [],
41
+ output: { type: 'object', description: 'Flush result with snapshot info' }
42
+ },
43
+ characteristics: { stateless: false, atomic: true, composable: true },
44
+ execute: async (_input, context) => {
45
+ if (!context.runtime) {
46
+ return { success: false, error: 'Runtime not available' };
47
+ }
48
+ const snapshot = context.runtime.flushTelemetry();
49
+ return { success: true, data: { flushed: true, timestamp: snapshot.timestamp } };
50
+ }
51
+ };
52
+ exports.getTelemetryHistoryAtom = {
53
+ name: 'getTelemetryHistory',
54
+ version: '1.0.0',
55
+ meta: {
56
+ input: [],
57
+ output: { type: 'array', description: 'Historical telemetry snapshots' }
58
+ },
59
+ characteristics: { stateless: false, atomic: true, composable: true },
60
+ execute: async (_input, context) => {
61
+ if (!context.runtime) {
62
+ return { success: false, error: 'Runtime not available' };
63
+ }
64
+ const history = context.runtime.getTelemetryHistory();
65
+ return { success: true, data: history };
66
+ }
67
+ };
68
+ exports.analyzeTelemetryAtom = {
69
+ name: 'analyzeTelemetry',
70
+ version: '1.0.0',
71
+ meta: {
72
+ input: [],
73
+ output: { type: 'object', description: 'Telemetry analysis with summary, top atoms, error hotspots, and graph usage' }
74
+ },
75
+ characteristics: { stateless: false, atomic: true, composable: true },
76
+ execute: async (_input, context) => {
77
+ if (!context.runtime) {
78
+ return { success: false, error: 'Runtime not available' };
79
+ }
80
+ const stats = context.runtime.getTelemetryStats();
81
+ if (stats.length === 0) {
82
+ return { success: true, data: { found: false, message: 'No telemetry data available yet' } };
83
+ }
84
+ const totalCalls = stats.reduce((sum, s) => sum + s.count, 0);
85
+ const totalErrors = stats.reduce((sum, s) => sum + s.errorCount, 0);
86
+ const avgDuration = Math.round(stats.reduce((sum, s) => sum + s.avgDuration * s.count, 0) / totalCalls);
87
+ const topAtoms = [...stats]
88
+ .sort((a, b) => b.count - a.count)
89
+ .slice(0, 10);
90
+ const errorHotspots = stats
91
+ .filter(s => s.errorRate > 0)
92
+ .sort((a, b) => b.errorRate - a.errorRate);
93
+ const graphUsage = stats.reduce((acc, s) => {
94
+ for (const g of s.graphs) {
95
+ if (!acc[g])
96
+ acc[g] = { calls: 0, errors: 0 };
97
+ acc[g].calls += s.count;
98
+ acc[g].errors += s.errorCount;
99
+ }
100
+ return acc;
101
+ }, {});
102
+ return {
103
+ success: true,
104
+ data: {
105
+ found: true,
106
+ summary: {
107
+ totalAtoms: stats.length,
108
+ totalCalls,
109
+ totalErrors,
110
+ errorRate: totalCalls > 0
111
+ ? Math.round((totalErrors / totalCalls) * 10000) / 100
112
+ : 0,
113
+ avgDuration,
114
+ },
115
+ topAtoms: topAtoms.map(a => ({
116
+ name: a.atom,
117
+ calls: a.count,
118
+ avgDuration: a.avgDuration,
119
+ errorRate: a.errorRate,
120
+ })),
121
+ errorHotspots: errorHotspots.map(a => ({
122
+ name: a.atom,
123
+ errorRate: a.errorRate,
124
+ errorCount: a.errorCount,
125
+ totalCalls: a.count,
126
+ })),
127
+ graphUsage: Object.entries(graphUsage)
128
+ .map(([name, data]) => ({ name, ...data }))
129
+ .sort((a, b) => b.calls - a.calls),
130
+ timestamp: Date.now(),
131
+ }
132
+ };
133
+ }
134
+ };
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F0b21zL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFYSxRQUFBLHFCQUFxQixHQUFTO0lBQ3pDLElBQUksRUFBRSxtQkFBbUI7SUFDekIsT0FBTyxFQUFFLE9BQU87SUFDaEIsSUFBSSxFQUFFO1FBQ0osS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSwwQ0FBMEMsRUFBRTtLQUNuRjtJQUNELGVBQWUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO0lBQ3JFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBVyxFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDaEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0YsQ0FBQztBQUVXLFFBQUEsa0JBQWtCLEdBQVM7SUFDdEMsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUU7UUFDSixLQUFLLEVBQUUsRUFBRTtRQUNULE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLDJCQUEyQixFQUFFO0tBQ25FO0lBQ0QsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFB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LFdBQVc7aUJBQ1o7Z0JBQ0QsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMzQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7b0JBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO29CQUNkLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztvQkFDMUIsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO2lCQUN2QixDQUFDLENBQUM7Z0JBQ0gsYUFBYSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7b0JBQ1osU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO29CQUN0QixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7b0JBQ3hCLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSztpQkFDcEIsQ0FBQyxDQUFDO2dCQUNILFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztxQkFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUMxQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2FBQ3RCO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXRvbSwgQ29udGV4dCwgUmVzdWx0LCBUZWxlbWV0cnlTdGF0cyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGdldFRlbGVtZXRyeVN0YXRzQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ2dldFRlbGVtZXRyeVN0YXRzJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JywgZGVzY3JpcHRpb246ICdBZ2dyZWdhdGVkIHRlbGVtZXRyeSBzdGF0aXN0aWNzIHBlciBhdG9tJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IGZhbHNlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dDogYW55LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoIWNvbnRleHQucnVudGltZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnUnVudGltZSBub3QgYXZhaWxhYmxlJyB9O1xuICAgIH1cbiAgICBjb25zdCBzdGF0cyA9IGNvbnRleHQucnVudGltZS5nZXRUZWxlbWV0cnlTdGF0cygpO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHN0YXRzIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXNldFRlbGVtZXRyeUF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdyZXNldFRlbGVtZXRyeScsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW10sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdudWxsJywgZGVzY3JpcHRpb246ICdDbGVhcnMgYWxsIHRlbGVtZXRyeSBkYXRhJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IGZhbHNlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dDogYW55LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoIWNvbnRleHQucnVudGltZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnUnVudGltZSBub3QgYXZhaWxhYmxlJyB9O1xuICAgIH1cbiAgICBjb250ZXh0LnJ1bnRpbWUucmVzZXRUZWxlbWV0cnkoKTtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBudWxsIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBmbHVzaFRlbGVtZXRyeUF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdmbHVzaFRlbGVtZXRyeScsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW10sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdvYmplY3QnLCBkZXNjcmlwdGlvbjogJ0ZsdXNoIHJlc3VsdCB3aXRoIHNuYXBzaG90IGluZm8nIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogZmFsc2UsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoX2lucHV0OiBhbnksIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGlmICghY29udGV4dC5ydW50aW1lKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdSdW50aW1lIG5vdCBhdmFpbGFibGUnIH07XG4gICAgfVxuICAgIGNvbnN0IHNuYXBzaG90ID0gY29udGV4dC5ydW50aW1lLmZsdXNoVGVsZW1ldHJ5KCk7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogeyBmbHVzaGVkOiB0cnVlLCB0aW1lc3RhbXA6IHNuYXBzaG90LnRpbWVzdGFtcCB9IH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZWxlbWV0cnlIaXN0b3J5QXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ2dldFRlbGVtZXRyeUhpc3RvcnknLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYXJyYXknLCBkZXNjcmlwdGlvbjogJ0hpc3RvcmljYWwgdGVsZW1ldHJ5IHNuYXBzaG90cycgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiBmYWxzZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQ6IGFueSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgaWYgKCFjb250ZXh0LnJ1bnRpbWUpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1J1bnRpbWUgbm90IGF2YWlsYWJsZScgfTtcbiAgICB9XG4gICAgY29uc3QgaGlzdG9yeSA9IGNvbnRleHQucnVudGltZS5nZXRUZWxlbWV0cnlIaXN0b3J5KCk7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogaGlzdG9yeSB9O1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYW5hbHl6ZVRlbGVtZXRyeUF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdhbmFseXplVGVsZW1ldHJ5JyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ29iamVjdCcsIGRlc2NyaXB0aW9uOiAnVGVsZW1ldHJ5IGFuYWx5c2lzIHdpdGggc3VtbWFyeSwgdG9wIGF0b21zLCBlcnJvciBob3RzcG90cywgYW5kIGdyYXBoIHVzYWdlJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IGZhbHNlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dDogYW55LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoIWNvbnRleHQucnVudGltZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnUnVudGltZSBub3QgYXZhaWxhYmxlJyB9O1xuICAgIH1cbiAgICBjb25zdCBzdGF0czogVGVsZW1ldHJ5U3RhdHNbXSA9IGNvbnRleHQucnVudGltZS5nZXRUZWxlbWV0cnlTdGF0cygpO1xuXG4gICAgaWYgKHN0YXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogeyBmb3VuZDogZmFsc2UsIG1lc3NhZ2U6ICdObyB0ZWxlbWV0cnkgZGF0YSBhdmFpbGFibGUgeWV0JyB9IH07XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWxDYWxscyA9IHN0YXRzLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyBzLmNvdW50LCAwKTtcbiAgICBjb25zdCB0b3RhbEVycm9ycyA9IHN0YXRzLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyBzLmVycm9yQ291bnQsIDApO1xuICAgIGNvbnN0IGF2Z0R1cmF0aW9uID0gTWF0aC5yb3VuZChcbiAgICAgIHN0YXRzLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyBzLmF2Z0R1cmF0aW9uICogcy5jb3VudCwgMCkgLyB0b3RhbENhbGxzXG4gICAgKTtcblxuICAgIGNvbnN0IHRvcEF0b21zID0gWy4uLnN0YXRzXVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY291bnQgLSBhLmNvdW50KVxuICAgICAgLnNsaWNlKDAsIDEwKTtcblxuICAgIGNvbnN0IGVycm9ySG90c3BvdHMgPSBzdGF0c1xuICAgICAgLmZpbHRlcihzID0+IHMuZXJyb3JSYXRlID4gMClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmVycm9yUmF0ZSAtIGEuZXJyb3JSYXRlKTtcblxuICAgIGNvbnN0IGdyYXBoVXNhZ2UgPSBzdGF0cy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgeyBjYWxsczogbnVtYmVyOyBlcnJvcnM6IG51bWJlciB9Pj4oXG4gICAgICAoYWNjLCBzKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZyBvZiBzLmdyYXBocykge1xuICAgICAgICAgIGlmICghYWNjW2ddKSBhY2NbZ10gPSB7IGNhbGxzOiAwLCBlcnJvcnM6IDAgfTtcbiAgICAgICAgICBhY2NbZ10uY2FsbHMgKz0gcy5jb3VudDtcbiAgICAgICAgICBhY2NbZ10uZXJyb3JzICs9IHMuZXJyb3JDb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZvdW5kOiB0cnVlLFxuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgdG90YWxBdG9tczogc3RhdHMubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsQ2FsbHMsXG4gICAgICAgICAgdG90YWxFcnJvcnMsXG4gICAgICAgICAgZXJyb3JSYXRlOiB0b3RhbENhbGxzID4gMFxuICAgICAgICAgICAgPyBNYXRoLnJvdW5kKCh0b3RhbEVycm9ycyAvIHRvdGFsQ2FsbHMpICogMTAwMDApIC8gMTAwXG4gICAgICAgICAgICA6IDAsXG4gICAgICAgICAgYXZnRHVyYXRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIHRvcEF0b21zOiB0b3BBdG9tcy5tYXAoYSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGEuYXRvbSxcbiAgICAgICAgICBjYWxsczogYS5jb3VudCxcbiAgICAgICAgICBhdmdEdXJhdGlvbjogYS5hdmdEdXJhdGlvbixcbiAgICAgICAgICBlcnJvclJhdGU6IGEuZXJyb3JSYXRlLFxuICAgICAgICB9KSksXG4gICAgICAgIGVycm9ySG90c3BvdHM6IGVycm9ySG90c3BvdHMubWFwKGEgPT4gKHtcbiAgICAgICAgICBuYW1lOiBhLmF0b20sXG4gICAgICAgICAgZXJyb3JSYXRlOiBhLmVycm9yUmF0ZSxcbiAgICAgICAgICBlcnJvckNvdW50OiBhLmVycm9yQ291bnQsXG4gICAgICAgICAgdG90YWxDYWxsczogYS5jb3VudCxcbiAgICAgICAgfSkpLFxuICAgICAgICBncmFwaFVzYWdlOiBPYmplY3QuZW50cmllcyhncmFwaFVzYWdlKVxuICAgICAgICAgIC5tYXAoKFtuYW1lLCBkYXRhXSkgPT4gKHsgbmFtZSwgLi4uZGF0YSB9KSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5jYWxscyAtIGEuY2FsbHMpLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==