@mecanizou/telemetry-hub 1.0.0 → 1.0.2

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 (95) hide show
  1. package/.github/workflows/pull_request.yml +32 -32
  2. package/.github/workflows/release.yml +129 -129
  3. package/.prettierignore +4 -4
  4. package/CHANGELOG.md +14 -0
  5. package/DOCS_GUIDE.md +151 -0
  6. package/README.md +248 -0
  7. package/dist/core/__tests__/logger-types.test.d.ts +1 -0
  8. package/dist/core/__tests__/logger-types.test.js +325 -0
  9. package/dist/core/__tests__/logger.test.d.ts +1 -0
  10. package/dist/core/__tests__/logger.test.js +337 -0
  11. package/dist/core/__tests__/tracer.test.d.ts +1 -0
  12. package/dist/core/__tests__/tracer.test.js +330 -0
  13. package/dist/core/index.d.ts +4 -0
  14. package/dist/core/index.js +8 -0
  15. package/dist/core/logger-types.d.ts +43 -0
  16. package/dist/core/logger-types.js +3 -0
  17. package/dist/core/logger.d.ts +13 -0
  18. package/dist/core/logger.js +123 -0
  19. package/dist/core/tracer-types.d.ts +50 -0
  20. package/dist/core/tracer-types.js +3 -0
  21. package/dist/core/tracer.d.ts +10 -0
  22. package/dist/core/tracer.js +114 -0
  23. package/dist/index.d.ts +3 -1
  24. package/dist/index.js +4 -2
  25. package/dist/sst/__tests__/telemetry.test.d.ts +1 -0
  26. package/dist/sst/__tests__/telemetry.test.js +138 -0
  27. package/dist/sst/index.d.ts +1 -0
  28. package/dist/sst/index.js +18 -0
  29. package/dist/sst/middy/index.d.ts +1 -0
  30. package/dist/sst/middy/index.js +18 -0
  31. package/dist/sst/middy/middleware.d.ts +5 -0
  32. package/dist/sst/middy/middleware.js +157 -0
  33. package/dist/sst/telemetry.d.ts +4 -0
  34. package/dist/sst/telemetry.js +121 -0
  35. package/dist/telemetry/core/__tests__/logger-types.test.d.ts +1 -0
  36. package/dist/telemetry/core/__tests__/logger-types.test.js +325 -0
  37. package/dist/telemetry/core/__tests__/logger.test.d.ts +1 -0
  38. package/dist/telemetry/core/__tests__/logger.test.js +337 -0
  39. package/dist/telemetry/core/__tests__/tracer.test.d.ts +1 -0
  40. package/dist/telemetry/core/__tests__/tracer.test.js +330 -0
  41. package/dist/telemetry/core/index.d.ts +4 -0
  42. package/dist/telemetry/core/index.js +8 -0
  43. package/dist/telemetry/core/logger-types.d.ts +43 -0
  44. package/dist/telemetry/core/logger-types.js +3 -0
  45. package/dist/telemetry/core/logger.d.ts +13 -0
  46. package/dist/telemetry/core/logger.js +123 -0
  47. package/dist/telemetry/core/tracer-types.d.ts +50 -0
  48. package/dist/telemetry/core/tracer-types.js +3 -0
  49. package/dist/telemetry/core/tracer.d.ts +10 -0
  50. package/dist/telemetry/core/tracer.js +114 -0
  51. package/dist/telemetry/index.d.ts +3 -0
  52. package/dist/telemetry/index.js +20 -0
  53. package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +1 -0
  54. package/dist/telemetry/sst/__tests__/telemetry.test.js +138 -0
  55. package/dist/telemetry/sst/index.d.ts +1 -0
  56. package/dist/telemetry/sst/index.js +18 -0
  57. package/dist/telemetry/sst/middy/index.d.ts +1 -0
  58. package/dist/telemetry/sst/middy/index.js +18 -0
  59. package/dist/telemetry/sst/middy/middleware.d.ts +5 -0
  60. package/dist/telemetry/sst/middy/middleware.js +157 -0
  61. package/dist/telemetry/sst/telemetry.d.ts +4 -0
  62. package/dist/telemetry/sst/telemetry.js +121 -0
  63. package/dist/telemetry/tsed/__tests__/config.test.d.ts +1 -0
  64. package/dist/telemetry/tsed/__tests__/config.test.js +146 -0
  65. package/dist/telemetry/tsed/__tests__/service.test.d.ts +1 -0
  66. package/dist/telemetry/tsed/__tests__/service.test.js +63 -0
  67. package/dist/telemetry/tsed/config.d.ts +26 -0
  68. package/dist/telemetry/tsed/config.js +166 -0
  69. package/dist/telemetry/tsed/index.d.ts +4 -0
  70. package/dist/telemetry/tsed/index.js +21 -0
  71. package/dist/telemetry/tsed/log-telemetry.d.ts +1 -0
  72. package/dist/telemetry/tsed/log-telemetry.js +196 -0
  73. package/dist/telemetry/tsed/service.d.ts +26 -0
  74. package/dist/telemetry/tsed/service.js +150 -0
  75. package/dist/telemetry/tsed/sync-log-record-processor.d.ts +11 -0
  76. package/dist/telemetry/tsed/sync-log-record-processor.js +74 -0
  77. package/dist/tsed/__tests__/config.test.d.ts +1 -0
  78. package/dist/tsed/__tests__/config.test.js +146 -0
  79. package/dist/tsed/__tests__/service.test.d.ts +1 -0
  80. package/dist/tsed/__tests__/service.test.js +63 -0
  81. package/dist/tsed/config.d.ts +26 -0
  82. package/dist/tsed/config.js +166 -0
  83. package/dist/tsed/index.d.ts +4 -0
  84. package/dist/tsed/index.js +21 -0
  85. package/dist/tsed/log-telemetry.d.ts +1 -0
  86. package/dist/tsed/log-telemetry.js +196 -0
  87. package/dist/tsed/service.d.ts +26 -0
  88. package/dist/tsed/service.js +150 -0
  89. package/dist/tsed/sync-log-record-processor.d.ts +11 -0
  90. package/dist/tsed/sync-log-record-processor.js +74 -0
  91. package/package.json +72 -56
  92. package/release.config.js +23 -23
  93. package/vitest.config.ts +22 -0
  94. package/dist/check-if-is-working.d.ts +0 -1
  95. package/dist/check-if-is-working.js +0 -8
@@ -0,0 +1,337 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const vitest_1 = require("vitest");
13
+ const logger_1 = require("../logger");
14
+ const api_logs_1 = require("@opentelemetry/api-logs");
15
+ (0, vitest_1.describe)('StandardLogger', () => {
16
+ let mockLogger;
17
+ let standardLogger;
18
+ (0, vitest_1.beforeEach)(() => {
19
+ mockLogger = {
20
+ emit: vitest_1.vi.fn(),
21
+ };
22
+ standardLogger = new logger_1.StandardLogger(mockLogger, 'test-service');
23
+ });
24
+ (0, vitest_1.describe)('logError', () => {
25
+ (0, vitest_1.it)('deve emitir log com severity ERROR', () => __awaiter(void 0, void 0, void 0, function* () {
26
+ const errorData = {
27
+ message: 'Test error message',
28
+ serviceName: 'test-service',
29
+ environment: 'test',
30
+ };
31
+ yield standardLogger.logError(errorData);
32
+ (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
33
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
34
+ (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.ERROR);
35
+ (0, vitest_1.expect)(emittedLog.severityText).toBe('ERROR');
36
+ (0, vitest_1.expect)(emittedLog.body).toBe('Test error message');
37
+ }));
38
+ (0, vitest_1.it)('deve incluir informações do erro quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
39
+ const error = new Error('Custom error');
40
+ const errorData = {
41
+ message: 'Error occurred',
42
+ error,
43
+ serviceName: 'test-service',
44
+ environment: 'production',
45
+ };
46
+ yield standardLogger.logError(errorData);
47
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
48
+ (0, vitest_1.expect)(emittedLog.attributes['error.type']).toBe('Error');
49
+ (0, vitest_1.expect)(emittedLog.attributes['error.message']).toBe('Custom error');
50
+ (0, vitest_1.expect)(emittedLog.attributes['error.stack']).toBeDefined();
51
+ }));
52
+ (0, vitest_1.it)('deve incluir contexto HTTP quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
53
+ const errorData = {
54
+ message: 'HTTP error',
55
+ serviceName: 'test-service',
56
+ environment: 'production',
57
+ http: {
58
+ method: 'POST',
59
+ url: '/api/test',
60
+ endpoint: '/api/test',
61
+ statusCode: 500,
62
+ headers: { 'content-type': 'application/json' },
63
+ body: { test: 'data' },
64
+ params: { id: '123' },
65
+ query: { filter: 'active' },
66
+ },
67
+ };
68
+ yield standardLogger.logError(errorData);
69
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
70
+ (0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
71
+ (0, vitest_1.expect)(emittedLog.attributes['http.url']).toBe('/api/test');
72
+ (0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
73
+ (0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBe(500);
74
+ (0, vitest_1.expect)(emittedLog.attributes['http.headers']).toBe(JSON.stringify({ 'content-type': 'application/json' }));
75
+ (0, vitest_1.expect)(emittedLog.attributes['http.body']).toBe(JSON.stringify({ test: 'data' }));
76
+ }));
77
+ (0, vitest_1.it)('deve incluir informações de usuário quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
78
+ const errorData = {
79
+ message: 'User error',
80
+ serviceName: 'test-service',
81
+ environment: 'production',
82
+ user: {
83
+ accountUserUid: 'user-123',
84
+ accountUid: 'account-456',
85
+ applicationUid: 'app-789',
86
+ },
87
+ };
88
+ yield standardLogger.logError(errorData);
89
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
90
+ (0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
91
+ (0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBe('account-456');
92
+ (0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBe('app-789');
93
+ }));
94
+ (0, vitest_1.it)('deve incluir informações de execução quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
95
+ const errorData = {
96
+ message: 'Execution error',
97
+ serviceName: 'test-service',
98
+ environment: 'production',
99
+ execution: {
100
+ requestId: 'req-123',
101
+ awsRequestId: 'aws-456',
102
+ functionName: 'testFunction',
103
+ invocationId: 'inv-789',
104
+ controller: 'TestController',
105
+ controllerMethod: 'testMethod',
106
+ origin: 'mobile',
107
+ },
108
+ };
109
+ yield standardLogger.logError(errorData);
110
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
111
+ (0, vitest_1.expect)(emittedLog.attributes['request.id']).toBe('req-123');
112
+ (0, vitest_1.expect)(emittedLog.attributes['aws.request.id']).toBe('aws-456');
113
+ (0, vitest_1.expect)(emittedLog.attributes['faas.name']).toBe('testFunction');
114
+ (0, vitest_1.expect)(emittedLog.attributes['faas.invocation_id']).toBe('inv-789');
115
+ (0, vitest_1.expect)(emittedLog.attributes['controller.name']).toBe('TestController');
116
+ (0, vitest_1.expect)(emittedLog.attributes['controller.method']).toBe('testMethod');
117
+ (0, vitest_1.expect)(emittedLog.attributes['origin']).toBe('mobile');
118
+ }));
119
+ (0, vitest_1.it)('deve incluir métricas de performance quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
120
+ const errorData = {
121
+ message: 'Performance error',
122
+ serviceName: 'test-service',
123
+ environment: 'production',
124
+ performance: {
125
+ durationMs: 1500,
126
+ success: false,
127
+ },
128
+ };
129
+ yield standardLogger.logError(errorData);
130
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
131
+ (0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(1500);
132
+ (0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(false);
133
+ }));
134
+ (0, vitest_1.it)('deve incluir contexto adicional quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
135
+ const errorData = {
136
+ message: 'Context error',
137
+ serviceName: 'test-service',
138
+ environment: 'production',
139
+ context: {
140
+ additionalInfo: 'some data',
141
+ nested: { value: 123 },
142
+ },
143
+ };
144
+ yield standardLogger.logError(errorData);
145
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
146
+ (0, vitest_1.expect)(emittedLog.attributes['context']).toBe(JSON.stringify({ additionalInfo: 'some data', nested: { value: 123 } }));
147
+ }));
148
+ (0, vitest_1.it)('deve usar serviceName padrão quando não fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
149
+ const errorData = {
150
+ message: 'Default service error',
151
+ serviceName: '',
152
+ environment: 'production',
153
+ };
154
+ yield standardLogger.logError(errorData);
155
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
156
+ (0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('test-service');
157
+ }));
158
+ (0, vitest_1.it)('deve adicionar timestamp automaticamente', () => __awaiter(void 0, void 0, void 0, function* () {
159
+ const errorData = {
160
+ message: 'Timestamp test',
161
+ serviceName: 'test-service',
162
+ environment: 'production',
163
+ };
164
+ yield standardLogger.logError(errorData);
165
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
166
+ (0, vitest_1.expect)(emittedLog.attributes['timestamp']).toBeDefined();
167
+ (0, vitest_1.expect)(emittedLog.attributes['timestamp']).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
168
+ }));
169
+ (0, vitest_1.it)('deve filtrar valores undefined e null dos atributos', () => __awaiter(void 0, void 0, void 0, function* () {
170
+ const errorData = {
171
+ message: 'Filter test',
172
+ serviceName: 'test-service',
173
+ environment: 'production',
174
+ user: {
175
+ accountUserUid: 'user-123',
176
+ accountUid: undefined,
177
+ applicationUid: undefined,
178
+ },
179
+ };
180
+ yield standardLogger.logError(errorData);
181
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
182
+ (0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
183
+ (0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBeUndefined();
184
+ (0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBeUndefined();
185
+ }));
186
+ });
187
+ (0, vitest_1.describe)('logInfo', () => {
188
+ (0, vitest_1.it)('deve emitir log com severity INFO', () => __awaiter(void 0, void 0, void 0, function* () {
189
+ const infoData = {
190
+ message: 'Info message',
191
+ serviceName: 'test-service',
192
+ environment: 'production',
193
+ };
194
+ yield standardLogger.logInfo(infoData);
195
+ (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
196
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
197
+ (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.INFO);
198
+ (0, vitest_1.expect)(emittedLog.severityText).toBe('INFO');
199
+ (0, vitest_1.expect)(emittedLog.body).toBe('Info message');
200
+ }));
201
+ (0, vitest_1.it)('deve incluir dados de performance em log de sucesso', () => __awaiter(void 0, void 0, void 0, function* () {
202
+ const infoData = {
203
+ message: 'Request completed',
204
+ serviceName: 'test-service',
205
+ environment: 'production',
206
+ performance: {
207
+ durationMs: 250,
208
+ success: true,
209
+ },
210
+ };
211
+ yield standardLogger.logInfo(infoData);
212
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
213
+ (0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(250);
214
+ (0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(true);
215
+ }));
216
+ });
217
+ (0, vitest_1.describe)('logWarn', () => {
218
+ (0, vitest_1.it)('deve emitir log com severity WARN', () => __awaiter(void 0, void 0, void 0, function* () {
219
+ const warnData = {
220
+ message: 'Warning message',
221
+ serviceName: 'test-service',
222
+ environment: 'production',
223
+ };
224
+ yield standardLogger.logWarn(warnData);
225
+ (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
226
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
227
+ (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.WARN);
228
+ (0, vitest_1.expect)(emittedLog.severityText).toBe('WARN');
229
+ (0, vitest_1.expect)(emittedLog.body).toBe('Warning message');
230
+ }));
231
+ });
232
+ (0, vitest_1.describe)('logDebug', () => {
233
+ (0, vitest_1.it)('deve emitir log com severity DEBUG', () => __awaiter(void 0, void 0, void 0, function* () {
234
+ const debugData = {
235
+ message: 'Debug message',
236
+ serviceName: 'test-service',
237
+ environment: 'development',
238
+ };
239
+ yield standardLogger.logDebug(debugData);
240
+ (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
241
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
242
+ (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.DEBUG);
243
+ (0, vitest_1.expect)(emittedLog.severityText).toBe('DEBUG');
244
+ (0, vitest_1.expect)(emittedLog.body).toBe('Debug message');
245
+ }));
246
+ });
247
+ (0, vitest_1.describe)('buildAttributes', () => {
248
+ (0, vitest_1.it)('deve construir atributos completos com todos os campos', () => __awaiter(void 0, void 0, void 0, function* () {
249
+ const fullData = {
250
+ message: 'Complete log',
251
+ serviceName: 'complete-service',
252
+ environment: 'production',
253
+ error: new Error('Test error'),
254
+ http: {
255
+ method: 'GET',
256
+ url: '/api/users',
257
+ endpoint: '/api/users',
258
+ statusCode: 200,
259
+ },
260
+ user: {
261
+ accountUserUid: 'user-abc',
262
+ accountUid: 'account-xyz',
263
+ applicationUid: 'app-123',
264
+ },
265
+ execution: {
266
+ requestId: 'req-001',
267
+ awsRequestId: 'aws-002',
268
+ functionName: 'getUsers',
269
+ invocationId: 'inv-003',
270
+ controller: 'UserController',
271
+ controllerMethod: 'getAll',
272
+ origin: 'web',
273
+ },
274
+ performance: {
275
+ durationMs: 300,
276
+ success: true,
277
+ },
278
+ context: {
279
+ custom: 'data',
280
+ },
281
+ };
282
+ yield standardLogger.logInfo(fullData);
283
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
284
+ const attrs = emittedLog.attributes;
285
+ (0, vitest_1.expect)(attrs['service.name']).toBe('complete-service');
286
+ (0, vitest_1.expect)(attrs['deployment.environment.name']).toBe('production');
287
+ (0, vitest_1.expect)(attrs['error.type']).toBe('Error');
288
+ (0, vitest_1.expect)(attrs['http.method']).toBe('GET');
289
+ (0, vitest_1.expect)(attrs['accountUser.uid']).toBe('user-abc');
290
+ (0, vitest_1.expect)(attrs['request.id']).toBe('req-001');
291
+ (0, vitest_1.expect)(attrs['duration.ms']).toBe(300);
292
+ (0, vitest_1.expect)(attrs['context']).toBe(JSON.stringify({ custom: 'data' }));
293
+ }));
294
+ (0, vitest_1.it)('deve lidar com campos HTTP parciais', () => __awaiter(void 0, void 0, void 0, function* () {
295
+ const partialHttpData = {
296
+ message: 'Partial HTTP',
297
+ serviceName: 'test-service',
298
+ environment: 'production',
299
+ http: {
300
+ method: 'POST',
301
+ endpoint: '/api/test',
302
+ },
303
+ };
304
+ yield standardLogger.logInfo(partialHttpData);
305
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
306
+ (0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
307
+ (0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
308
+ (0, vitest_1.expect)(emittedLog.attributes['http.url']).toBeUndefined();
309
+ (0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBeUndefined();
310
+ }));
311
+ });
312
+ (0, vitest_1.describe)('construtor', () => {
313
+ (0, vitest_1.it)('deve aceitar serviceName padrão personalizado', () => {
314
+ const customLogger = new logger_1.StandardLogger(mockLogger, 'custom-service');
315
+ const logData = {
316
+ message: 'Test',
317
+ serviceName: '',
318
+ environment: 'test',
319
+ };
320
+ customLogger.logInfo(logData);
321
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
322
+ (0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('custom-service');
323
+ });
324
+ (0, vitest_1.it)('deve usar "unknown-service" como padrão quando não especificado', () => {
325
+ const defaultLogger = new logger_1.StandardLogger(mockLogger);
326
+ const logData = {
327
+ message: 'Test',
328
+ serviceName: '',
329
+ environment: 'test',
330
+ };
331
+ defaultLogger.logInfo(logData);
332
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
333
+ (0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('unknown-service');
334
+ });
335
+ });
336
+ });
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9fX3Rlc3RzX18vbG9nZ2VyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBOEQ7QUFDOUQsc0NBQTJDO0FBQzNDLHNEQUF5RDtBQUV6RCxJQUFBLGlCQUFRLEVBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLElBQUksVUFBZSxDQUFDO0lBQ3BCLElBQUksY0FBOEIsQ0FBQztJQUVuQyxJQUFBLG1CQUFVLEVBQUMsR0FBRyxFQUFFO1FBQ2QsVUFBVSxHQUFHO1lBQ1gsSUFBSSxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7U0FDZCxDQUFDO1FBQ0YsY0FBYyxHQUFHLElBQUksdUJBQWMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGlCQUFRLEVBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUN4QixJQUFBLFdBQUUsRUFBQyxvQ0FBb0MsRUFBRSxHQUFTLEVBQUU7WUFDbEQsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxvQkFBb0I7Z0JBQzdCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsTUFBTTthQUNwQixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBYyxDQUFDLEtB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QUFhLEdBQUcsSUFBSSx1QkFBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sT0FBTyxHQUFHO2dCQUNkLE9BQU8sRUFBRSxNQUFNO2dCQUNmLFdBQVcsRUFBRSxFQUFFO2dCQUNmLFdBQVcsRUFBRSxNQUFNO2FBQ3BCLENBQUM7WUFFRixhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRS9CLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGl0LCBleHBlY3QsIHZpLCBiZWZvcmVFYWNoIH0gZnJvbSAndml0ZXN0JztcclxuaW1wb3J0IHsgU3RhbmRhcmRMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xyXG5pbXBvcnQgeyBTZXZlcml0eU51bWJlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaS1sb2dzJztcclxuXHJcbmRlc2NyaWJlKCdTdGFuZGFyZExvZ2dlcicsICgpID0+IHtcclxuICBsZXQgbW9ja0xvZ2dlcjogYW55O1xyXG4gIGxldCBzdGFuZGFyZExvZ2dlcjogU3RhbmRhcmRMb2dnZXI7XHJcblxyXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xyXG4gICAgbW9ja0xvZ2dlciA9IHtcclxuICAgICAgZW1pdDogdmkuZm4oKSxcclxuICAgIH07XHJcbiAgICBzdGFuZGFyZExvZ2dlciA9IG5ldyBTdGFuZGFyZExvZ2dlcihtb2NrTG9nZ2VyLCAndGVzdC1zZXJ2aWNlJyk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdsb2dFcnJvcicsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGVtaXRpciBsb2cgY29tIHNldmVyaXR5IEVSUk9SJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1Rlc3QgZXJyb3IgbWVzc2FnZScsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAndGVzdCcsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tMb2dnZXIuZW1pdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5TnVtYmVyKS50b0JlKFNldmVyaXR5TnVtYmVyLkVSUk9SKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdFUlJPUicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5ib2R5KS50b0JlKCdUZXN0IGVycm9yIG1lc3NhZ2UnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgaW5mb3JtYcOnw7VlcyBkbyBlcnJvIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdDdXN0b20gZXJyb3InKTtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdFcnJvciBvY2N1cnJlZCcsXHJcbiAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydlcnJvci50eXBlJ10pLnRvQmUoJ0Vycm9yJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2Vycm9yLm1lc3NhZ2UnXSkudG9CZSgnQ3VzdG9tIGVycm9yJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2Vycm9yLnN0YWNrJ10pLnRvQmVEZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGNvbnRleHRvIEhUVFAgcXVhbmRvIGZvcm5lY2lkbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdIVFRQIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBodHRwOiB7XHJcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgIHVybDogJy9hcGkvdGVzdCcsXHJcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvdGVzdCcsXHJcbiAgICAgICAgICBzdGF0dXNDb2RlOiA1MDAsXHJcbiAgICAgICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcclxuICAgICAgICAgIGJvZHk6IHsgdGVzdDogJ2RhdGEnIH0sXHJcbiAgICAgICAgICBwYXJhbXM6IHsgaWQ6ICcxMjMnIH0sXHJcbiAgICAgICAgICBxdWVyeTogeyBmaWx0ZXI6ICdhY3RpdmUnIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0Vycm9yKGVycm9yRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAubWV0aG9kJ10pLnRvQmUoJ1BPU1QnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC51cmwnXSkudG9CZSgnL2FwaS90ZXN0Jyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuZW5kcG9pbnQnXSkudG9CZSgnL2FwaS90ZXN0Jyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuc3RhdHVzX2NvZGUnXSkudG9CZSg1MDApO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLmhlYWRlcnMnXSkudG9CZShcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSlcclxuICAgICAgKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5ib2R5J10pLnRvQmUoXHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyB0ZXN0OiAnZGF0YScgfSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgaW5mb3JtYcOnw7VlcyBkZSB1c3XDoXJpbyBxdWFuZG8gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1VzZXIgZXJyb3InLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci0xMjMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogJ2FjY291bnQtNDU2JyxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiAnYXBwLTc4OScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0Vycm9yKGVycm9yRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2FjY291bnRVc2VyLnVpZCddKS50b0JlKCd1c2VyLTEyMycpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50LnVpZCddKS50b0JlKCdhY2NvdW50LTQ1NicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhcHBsaWNhdGlvbi51aWQnXSkudG9CZSgnYXBwLTc4OScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBpbmZvcm1hw6fDtWVzIGRlIGV4ZWN1w6fDo28gcXVhbmRvIGZvcm5lY2lkbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdFeGVjdXRpb24gZXJyb3InLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIGV4ZWN1dGlvbjoge1xyXG4gICAgICAgICAgcmVxdWVzdElkOiAncmVxLTEyMycsXHJcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICdhd3MtNDU2JyxcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3Rlc3RGdW5jdGlvbicsXHJcbiAgICAgICAgICBpbnZvY2F0aW9uSWQ6ICdpbnYtNzg5JyxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6ICdUZXN0Q29udHJvbGxlcicsXHJcbiAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiAndGVzdE1ldGhvZCcsXHJcbiAgICAgICAgICBvcmlnaW46ICdtb2JpbGUnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydyZXF1ZXN0LmlkJ10pLnRvQmUoJ3JlcS0xMjMnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYXdzLnJlcXVlc3QuaWQnXSkudG9CZSgnYXdzLTQ1NicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydmYWFzLm5hbWUnXSkudG9CZSgndGVzdEZ1bmN0aW9uJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2ZhYXMuaW52b2NhdGlvbl9pZCddKS50b0JlKCdpbnYtNzg5Jyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2NvbnRyb2xsZXIubmFtZSddKS50b0JlKCdUZXN0Q29udHJvbGxlcicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydjb250cm9sbGVyLm1ldGhvZCddKS50b0JlKCd0ZXN0TWV0aG9kJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ29yaWdpbiddKS50b0JlKCdtb2JpbGUnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgbcOpdHJpY2FzIGRlIHBlcmZvcm1hbmNlIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnUGVyZm9ybWFuY2UgZXJyb3InLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHBlcmZvcm1hbmNlOiB7XHJcbiAgICAgICAgICBkdXJhdGlvbk1zOiAxNTAwLFxyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0Vycm9yKGVycm9yRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2R1cmF0aW9uLm1zJ10pLnRvQmUoMTUwMCk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2V4ZWN1dGlvbi5zdWNjZXNzJ10pLnRvQmUoZmFsc2UpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBjb250ZXh0byBhZGljaW9uYWwgcXVhbmRvIGZvcm5lY2lkbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdDb250ZXh0IGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICBhZGRpdGlvbmFsSW5mbzogJ3NvbWUgZGF0YScsXHJcbiAgICAgICAgICBuZXN0ZWQ6IHsgdmFsdWU6IDEyMyB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydjb250ZXh0J10pLnRvQmUoXHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBhZGRpdGlvbmFsSW5mbzogJ3NvbWUgZGF0YScsIG5lc3RlZDogeyB2YWx1ZTogMTIzIH0gfSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIHVzYXIgc2VydmljZU5hbWUgcGFkcsOjbyBxdWFuZG8gbsOjbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRGVmYXVsdCBzZXJ2aWNlIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsIC8vIEVtcHR5IHN0cmluZyBwYXJhIHRlc3RhciBmYWxsYmFja1xyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydzZXJ2aWNlLm5hbWUnXSkudG9CZSgndGVzdC1zZXJ2aWNlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBhZGljaW9uYXIgdGltZXN0YW1wIGF1dG9tYXRpY2FtZW50ZScsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUaW1lc3RhbXAgdGVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWyd0aW1lc3RhbXAnXSkudG9CZURlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1sndGltZXN0YW1wJ10pLnRvTWF0Y2goXHJcbiAgICAgICAgL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfVxcLlxcZHszfVokL1xyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgZmlsdHJhciB2YWxvcmVzIHVuZGVmaW5lZCBlIG51bGwgZG9zIGF0cmlidXRvcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdGaWx0ZXIgdGVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgdXNlcjoge1xyXG4gICAgICAgICAgYWNjb3VudFVzZXJVaWQ6ICd1c2VyLTEyMycsXHJcbiAgICAgICAgICBhY2NvdW50VWlkOiB1bmRlZmluZWQgYXMgYW55LFxyXG4gICAgICAgICAgYXBwbGljYXRpb25VaWQ6IHVuZGVmaW5lZCBhcyBhbnksXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0Vycm9yKGVycm9yRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2FjY291bnRVc2VyLnVpZCddKS50b0JlKCd1c2VyLTEyMycpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50LnVpZCddKS50b0JlVW5kZWZpbmVkKCk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2FwcGxpY2F0aW9uLnVpZCddKS50b0JlVW5kZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ2xvZ0luZm8nLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBlbWl0aXIgbG9nIGNvbSBzZXZlcml0eSBJTkZPJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBpbmZvRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnSW5mbyBtZXNzYWdlJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0luZm8oaW5mb0RhdGEpO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tMb2dnZXIuZW1pdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5TnVtYmVyKS50b0JlKFNldmVyaXR5TnVtYmVyLklORk8pO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eVRleHQpLnRvQmUoJ0lORk8nKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYm9keSkudG9CZSgnSW5mbyBtZXNzYWdlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGRhZG9zIGRlIHBlcmZvcm1hbmNlIGVtIGxvZyBkZSBzdWNlc3NvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBpbmZvRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnUmVxdWVzdCBjb21wbGV0ZWQnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHBlcmZvcm1hbmNlOiB7XHJcbiAgICAgICAgICBkdXJhdGlvbk1zOiAyNTAsXHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKGluZm9EYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZHVyYXRpb24ubXMnXSkudG9CZSgyNTApO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydleGVjdXRpb24uc3VjY2VzcyddKS50b0JlKHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdsb2dXYXJuJywgKCkgPT4ge1xyXG4gICAgaXQoJ2RldmUgZW1pdGlyIGxvZyBjb20gc2V2ZXJpdHkgV0FSTicsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3Qgd2FybkRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1dhcm5pbmcgbWVzc2FnZScsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dXYXJuKHdhcm5EYXRhKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrTG9nZ2VyLmVtaXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eU51bWJlcikudG9CZShTZXZlcml0eU51bWJlci5XQVJOKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdXQVJOJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmJvZHkpLnRvQmUoJ1dhcm5pbmcgbWVzc2FnZScpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdsb2dEZWJ1ZycsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGVtaXRpciBsb2cgY29tIHNldmVyaXR5IERFQlVHJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkZWJ1Z0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0RlYnVnIG1lc3NhZ2UnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0RlYnVnKGRlYnVnRGF0YSk7XHJcblxyXG4gICAgICBleHBlY3QobW9ja0xvZ2dlci5lbWl0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlOdW1iZXIpLnRvQmUoU2V2ZXJpdHlOdW1iZXIuREVCVUcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eVRleHQpLnRvQmUoJ0RFQlVHJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmJvZHkpLnRvQmUoJ0RlYnVnIG1lc3NhZ2UnKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnYnVpbGRBdHRyaWJ1dGVzJywgKCkgPT4ge1xyXG4gICAgaXQoJ2RldmUgY29uc3RydWlyIGF0cmlidXRvcyBjb21wbGV0b3MgY29tIHRvZG9zIG9zIGNhbXBvcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZnVsbERhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0NvbXBsZXRlIGxvZycsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdjb21wbGV0ZS1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3IoJ1Rlc3QgZXJyb3InKSxcclxuICAgICAgICBodHRwOiB7XHJcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgdXJsOiAnL2FwaS91c2VycycsXHJcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvdXNlcnMnLFxyXG4gICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXNlcjoge1xyXG4gICAgICAgICAgYWNjb3VudFVzZXJVaWQ6ICd1c2VyLWFiYycsXHJcbiAgICAgICAgICBhY2NvdW50VWlkOiAnYWNjb3VudC14eXonLFxyXG4gICAgICAgICAgYXBwbGljYXRpb25VaWQ6ICdhcHAtMTIzJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGV4ZWN1dGlvbjoge1xyXG4gICAgICAgICAgcmVxdWVzdElkOiAncmVxLTAwMScsXHJcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICdhd3MtMDAyJyxcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2dldFVzZXJzJyxcclxuICAgICAgICAgIGludm9jYXRpb25JZDogJ2ludi0wMDMnLFxyXG4gICAgICAgICAgY29udHJvbGxlcjogJ1VzZXJDb250cm9sbGVyJyxcclxuICAgICAgICAgIGNvbnRyb2xsZXJNZXRob2Q6ICdnZXRBbGwnLFxyXG4gICAgICAgICAgb3JpZ2luOiAnd2ViJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBlcmZvcm1hbmNlOiB7XHJcbiAgICAgICAgICBkdXJhdGlvbk1zOiAzMDAsXHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgY3VzdG9tOiAnZGF0YScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHN0YW5kYXJkTG9nZ2VyLmxvZ0luZm8oZnVsbERhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBjb25zdCBhdHRycyA9IGVtaXR0ZWRMb2cuYXR0cmlidXRlcztcclxuXHJcbiAgICAgIC8vIFZlcmlmaWNhciB0b2RvcyBvcyBjYW1wb3NcclxuICAgICAgZXhwZWN0KGF0dHJzWydzZXJ2aWNlLm5hbWUnXSkudG9CZSgnY29tcGxldGUtc2VydmljZScpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSddKS50b0JlKCdwcm9kdWN0aW9uJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyc1snZXJyb3IudHlwZSddKS50b0JlKCdFcnJvcicpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2h0dHAubWV0aG9kJ10pLnRvQmUoJ0dFVCcpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2FjY291bnRVc2VyLnVpZCddKS50b0JlKCd1c2VyLWFiYycpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ3JlcXVlc3QuaWQnXSkudG9CZSgncmVxLTAwMScpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2R1cmF0aW9uLm1zJ10pLnRvQmUoMzAwKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydjb250ZXh0J10pLnRvQmUoSlNPTi5zdHJpbmdpZnkoeyBjdXN0b206ICdkYXRhJyB9KSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBsaWRhciBjb20gY2FtcG9zIEhUVFAgcGFyY2lhaXMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcnRpYWxIdHRwRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnUGFydGlhbCBIVFRQJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBodHRwOiB7XHJcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgIGVuZHBvaW50OiAnL2FwaS90ZXN0JyxcclxuICAgICAgICAgIC8vIHVybCwgc3RhdHVzQ29kZSwgaGVhZGVycywgZXRjIG7Do28gZm9ybmVjaWRvc1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKHBhcnRpYWxIdHRwRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAubWV0aG9kJ10pLnRvQmUoJ1BPU1QnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5lbmRwb2ludCddKS50b0JlKCcvYXBpL3Rlc3QnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC51cmwnXSkudG9CZVVuZGVmaW5lZCgpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLnN0YXR1c19jb2RlJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnY29uc3RydXRvcicsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGFjZWl0YXIgc2VydmljZU5hbWUgcGFkcsOjbyBwZXJzb25hbGl6YWRvJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXN0b21Mb2dnZXIgPSBuZXcgU3RhbmRhcmRMb2dnZXIobW9ja0xvZ2dlciwgJ2N1c3RvbS1zZXJ2aWNlJyk7XHJcbiAgICAgIGNvbnN0IGxvZ0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1Rlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Rlc3QnLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY3VzdG9tTG9nZ2VyLmxvZ0luZm8obG9nRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ3NlcnZpY2UubmFtZSddKS50b0JlKCdjdXN0b20tc2VydmljZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgdXNhciBcInVua25vd24tc2VydmljZVwiIGNvbW8gcGFkcsOjbyBxdWFuZG8gbsOjbyBlc3BlY2lmaWNhZG8nLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRMb2dnZXIgPSBuZXcgU3RhbmRhcmRMb2dnZXIobW9ja0xvZ2dlcik7XHJcbiAgICAgIGNvbnN0IGxvZ0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1Rlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Rlc3QnLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgZGVmYXVsdExvZ2dlci5sb2dJbmZvKGxvZ0RhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydzZXJ2aWNlLm5hbWUnXSkudG9CZSgndW5rbm93bi1zZXJ2aWNlJyk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufSk7XHJcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};