@growsober/sdk 1.0.6 → 1.0.8

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 (64) hide show
  1. package/dist/__tests__/e2e.test.d.ts +30 -0
  2. package/dist/__tests__/e2e.test.js +959 -63
  3. package/dist/api/mutations/badges.d.ts +116 -0
  4. package/dist/api/mutations/badges.js +177 -0
  5. package/dist/api/mutations/brands.d.ts +251 -0
  6. package/dist/api/mutations/brands.js +242 -0
  7. package/dist/api/mutations/creators.d.ts +131 -0
  8. package/dist/api/mutations/creators.js +129 -0
  9. package/dist/api/mutations/event-chat.d.ts +2 -2
  10. package/dist/api/mutations/event-chat.js +9 -9
  11. package/dist/api/mutations/index.d.ts +4 -0
  12. package/dist/api/mutations/index.js +5 -1
  13. package/dist/api/mutations/jack.d.ts +29 -0
  14. package/dist/api/mutations/jack.js +41 -1
  15. package/dist/api/mutations/products.d.ts +175 -0
  16. package/dist/api/mutations/products.js +226 -0
  17. package/dist/api/mutations/support.d.ts +20 -1
  18. package/dist/api/mutations/support.js +36 -1
  19. package/dist/api/queries/badges.d.ts +221 -0
  20. package/dist/api/queries/badges.js +290 -0
  21. package/dist/api/queries/bookings.d.ts +1 -1
  22. package/dist/api/queries/brands.d.ts +248 -0
  23. package/dist/api/queries/brands.js +226 -0
  24. package/dist/api/queries/businesses.d.ts +61 -1
  25. package/dist/api/queries/businesses.js +27 -1
  26. package/dist/api/queries/creators.d.ts +332 -0
  27. package/dist/api/queries/creators.js +249 -0
  28. package/dist/api/queries/event-chat.d.ts +1 -1
  29. package/dist/api/queries/event-chat.js +4 -4
  30. package/dist/api/queries/events.d.ts +35 -0
  31. package/dist/api/queries/index.d.ts +5 -0
  32. package/dist/api/queries/index.js +6 -1
  33. package/dist/api/queries/jack.d.ts +80 -0
  34. package/dist/api/queries/jack.js +98 -1
  35. package/dist/api/queries/library.d.ts +8 -0
  36. package/dist/api/queries/products.d.ts +185 -0
  37. package/dist/api/queries/products.js +203 -0
  38. package/dist/api/queries/support.d.ts +46 -1
  39. package/dist/api/queries/support.js +48 -1
  40. package/dist/api/queries/venues.d.ts +304 -0
  41. package/dist/api/queries/venues.js +211 -0
  42. package/dist/api/types.d.ts +245 -0
  43. package/dist/api/types.js +6 -1
  44. package/package.json +5 -2
  45. package/src/__tests__/e2e.test.ts +996 -64
  46. package/src/api/mutations/badges.ts +228 -0
  47. package/src/api/mutations/brands.ts +376 -0
  48. package/src/api/mutations/creators.ts +171 -0
  49. package/src/api/mutations/event-chat.ts +8 -8
  50. package/src/api/mutations/index.ts +4 -0
  51. package/src/api/mutations/jack.ts +50 -1
  52. package/src/api/mutations/products.ts +336 -0
  53. package/src/api/mutations/support.ts +44 -0
  54. package/src/api/queries/badges.ts +385 -0
  55. package/src/api/queries/brands.ts +281 -0
  56. package/src/api/queries/businesses.ts +30 -1
  57. package/src/api/queries/creators.ts +308 -0
  58. package/src/api/queries/event-chat.ts +3 -3
  59. package/src/api/queries/index.ts +5 -0
  60. package/src/api/queries/jack.ts +139 -1
  61. package/src/api/queries/products.ts +312 -0
  62. package/src/api/queries/support.ts +54 -0
  63. package/src/api/queries/venues.ts +271 -0
  64. package/src/api/types.ts +317 -1
@@ -4,13 +4,43 @@
4
4
  *
5
5
  * Tests all SDK endpoints against the real API.
6
6
  * Run with: npx ts-node src/__tests__/e2e.test.ts
7
+ *
8
+ * Covers:
9
+ * - Authentication
10
+ * - Users
11
+ * - Events (with venue, creator, brand sponsor)
12
+ * - Bookings
13
+ * - Event Chat (new roles: ATTENDEE, CREATOR, VENUE_REP, BRAND_REP)
14
+ * - Hubs
15
+ * - Venues (new - replaces businesses)
16
+ * - Creators (new)
17
+ * - Brands (new)
18
+ * - Unified Rewards (venue + brand rewards)
19
+ * - Library (content workflow)
20
+ * - Support (check-ins, wins, Jack AI)
21
+ * - Creator Products (sessions/packages with booking flow)
22
+ * - Badges & Rewards
23
+ * - Badge Awarding (business logic tests for automatic badge awarding)
24
+ * - CHECK_IN_STREAK badge on check-in
25
+ * - WINS_LOGGED badge on logging wins
26
+ * - MOOD_LOGS_COUNT badge on mood logging
27
+ * - REFLECTIONS_COUNT badge on submitting reflections
28
+ * - EVENTS_HOSTED badge on publishing events
29
+ * - EVENTS_ATTENDED badge progress tracking
30
+ * - Reward Flow (full redemption lifecycle)
31
+ * - Creating rewards for badges (venue/brand)
32
+ * - User earns badge -> reward becomes available
33
+ * - Redeem reward (get redemption details)
34
+ * - Cannot redeem without badge
35
+ * - Cannot redeem twice (per user limit)
36
+ * - Reward verification endpoint
7
37
  */
8
38
  var __importDefault = (this && this.__importDefault) || function (mod) {
9
39
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
40
  };
11
41
  Object.defineProperty(exports, "__esModule", { value: true });
12
42
  const axios_1 = __importDefault(require("axios"));
13
- const BASE_URL = 'http://localhost:3001/api/v1';
43
+ const BASE_URL = process.env.API_URL || 'http://localhost:3001/api/v1';
14
44
  const TEST_EMAIL = `e2e-${Date.now()}@growsober.com`;
15
45
  const TEST_PASSWORD = 'SecurePass123!';
16
46
  // Colors for output
@@ -21,6 +51,7 @@ const c = {
21
51
  yellow: '\x1b[33m',
22
52
  cyan: '\x1b[36m',
23
53
  dim: '\x1b[2m',
54
+ bold: '\x1b[1m',
24
55
  };
25
56
  // State shared across tests
26
57
  const state = {
@@ -31,6 +62,7 @@ const state = {
31
62
  // Stats
32
63
  let passed = 0;
33
64
  let failed = 0;
65
+ let skipped = 0;
34
66
  // Create axios client
35
67
  function api(token) {
36
68
  return axios_1.default.create({
@@ -55,30 +87,39 @@ async function test(name, fn) {
55
87
  return false;
56
88
  }
57
89
  }
58
- // Unwrap API response
90
+ // Skip test with reason
91
+ function skip(name, reason) {
92
+ console.log(`${c.yellow}SKIP${c.reset} ${name} ${c.dim}(${reason})${c.reset}`);
93
+ skipped++;
94
+ }
95
+ // Unwrap API response (handles both wrapped and unwrapped)
59
96
  function unwrap(res) {
60
- return res.data.data;
97
+ return res.data?.data !== undefined ? res.data.data : res.data;
98
+ }
99
+ // Section header
100
+ function section(name) {
101
+ console.log(`\n${c.cyan}--- ${name} ---${c.reset}\n`);
61
102
  }
62
103
  // ============================================================================
63
104
  // TESTS
64
105
  // ============================================================================
65
106
  async function runTests() {
66
- console.log(`\n${c.cyan}${'='.repeat(60)}${c.reset}`);
67
- console.log(`${c.cyan} GrowSober API E2E Tests${c.reset}`);
68
- console.log(`${c.cyan}${'='.repeat(60)}${c.reset}`);
107
+ console.log(`\n${c.cyan}${'='.repeat(70)}${c.reset}`);
108
+ console.log(`${c.cyan} GrowSober API E2E Tests - Full Coverage${c.reset}`);
109
+ console.log(`${c.cyan}${'='.repeat(70)}${c.reset}`);
69
110
  console.log(`${c.dim}Base URL: ${BASE_URL}${c.reset}`);
70
111
  console.log(`${c.dim}Test Email: ${TEST_EMAIL}${c.reset}\n`);
71
112
  // Health check
72
113
  const health = await api().get('/health');
73
114
  if (health.status !== 200) {
74
- console.log(`${c.red}API is not reachable${c.reset}`);
115
+ console.log(`${c.red}API is not reachable at ${BASE_URL}${c.reset}`);
75
116
  process.exit(1);
76
117
  }
77
118
  console.log(`${c.green}API is healthy${c.reset}\n`);
78
119
  // =========================================================================
79
120
  // AUTH
80
121
  // =========================================================================
81
- console.log(`\n${c.cyan}--- AUTHENTICATION ---${c.reset}\n`);
122
+ section('AUTHENTICATION');
82
123
  await test('Register new user', async () => {
83
124
  const res = await api().post('/auth/register', {
84
125
  email: TEST_EMAIL,
@@ -126,10 +167,23 @@ async function runTests() {
126
167
  if (res.status !== 401)
127
168
  throw new Error(`Expected 401, got ${res.status}`);
128
169
  });
170
+ // Register second user for ownership tests
171
+ await test('Register second user for ownership tests', async () => {
172
+ const res = await api().post('/auth/register', {
173
+ email: `e2e-second-${Date.now()}@growsober.com`,
174
+ password: TEST_PASSWORD,
175
+ name: 'E2E Second User',
176
+ });
177
+ if (res.status !== 201)
178
+ throw new Error(`Status ${res.status}`);
179
+ const data = unwrap(res);
180
+ state.secondUserToken = data.accessToken;
181
+ state.secondUserId = data.user.id;
182
+ });
129
183
  // =========================================================================
130
184
  // USERS
131
185
  // =========================================================================
132
- console.log(`\n${c.cyan}--- USERS ---${c.reset}\n`);
186
+ section('USERS');
133
187
  await test('Get current user profile', async () => {
134
188
  const res = await api(state.accessToken).get('/users/me');
135
189
  if (res.status !== 200)
@@ -154,9 +208,411 @@ async function runTests() {
154
208
  throw new Error(`Status ${res.status}`);
155
209
  });
156
210
  // =========================================================================
157
- // EVENTS
211
+ // VENUES (New - replaces Businesses)
212
+ // =========================================================================
213
+ section('VENUES');
214
+ await test('List venues', async () => {
215
+ const res = await api().get('/venues');
216
+ if (res.status !== 200)
217
+ throw new Error(`Status ${res.status}`);
218
+ const data = unwrap(res);
219
+ // Get first venue if exists for further tests
220
+ if (data?.venues?.length > 0) {
221
+ state.venueId = data.venues[0].id;
222
+ }
223
+ });
224
+ await test('Get featured venues', async () => {
225
+ const res = await api().get('/venues/featured');
226
+ if (res.status !== 200)
227
+ throw new Error(`Status ${res.status}`);
228
+ });
229
+ await test('Get nearby venues', async () => {
230
+ const res = await api().get('/venues/nearby', {
231
+ params: { lat: 51.5074, long: -0.1278, radius: 10 },
232
+ });
233
+ if (res.status !== 200)
234
+ throw new Error(`Status ${res.status}`);
235
+ });
236
+ if (state.venueId) {
237
+ await test('Get venue by ID', async () => {
238
+ const res = await api().get(`/venues/${state.venueId}`);
239
+ if (res.status !== 200)
240
+ throw new Error(`Status ${res.status}`);
241
+ });
242
+ await test('Get venue owners', async () => {
243
+ const res = await api(state.accessToken).get(`/venues/${state.venueId}/owners`);
244
+ if (res.status !== 200)
245
+ throw new Error(`Status ${res.status}`);
246
+ });
247
+ await test('Get venue events', async () => {
248
+ const res = await api().get(`/venues/${state.venueId}/events`);
249
+ if (res.status !== 200)
250
+ throw new Error(`Status ${res.status}`);
251
+ });
252
+ }
253
+ else {
254
+ skip('Get venue by ID', 'No venues in database');
255
+ skip('Get venue owners', 'No venues in database');
256
+ skip('Get venue events', 'No venues in database');
257
+ }
258
+ // =========================================================================
259
+ // CREATORS (New)
260
+ // =========================================================================
261
+ section('CREATORS');
262
+ await test('List creators', async () => {
263
+ const res = await api().get('/creators');
264
+ if (res.status !== 200)
265
+ throw new Error(`Status ${res.status}`);
266
+ });
267
+ await test('Create creator profile', async () => {
268
+ const res = await api(state.accessToken).post('/creators', {
269
+ slug: `e2e-creator-${Date.now()}`,
270
+ displayName: 'E2E Test Creator',
271
+ bio: 'A test creator for E2E tests',
272
+ canFacilitate: true,
273
+ canCreateContent: true,
274
+ isInfluencer: false,
275
+ specialties: ['meditation', 'sobriety-coaching'],
276
+ certifications: ['Test Cert 1'],
277
+ });
278
+ if (res.status !== 201)
279
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
280
+ const data = unwrap(res);
281
+ state.creatorId = data.id;
282
+ });
283
+ if (state.creatorId) {
284
+ await test('Get creator by ID', async () => {
285
+ const res = await api().get(`/creators/${state.creatorId}`);
286
+ if (res.status !== 200)
287
+ throw new Error(`Status ${res.status}`);
288
+ });
289
+ await test('Get my creator profile', async () => {
290
+ const res = await api(state.accessToken).get('/creators/me');
291
+ // Returns 200 with null or creator data
292
+ if (res.status !== 200)
293
+ throw new Error(`Status ${res.status}`);
294
+ });
295
+ await test('Get creator by user ID', async () => {
296
+ const res = await api(state.accessToken).get(`/creators/user/${state.userId}`);
297
+ if (res.status !== 200)
298
+ throw new Error(`Status ${res.status}`);
299
+ });
300
+ await test('Update creator profile', async () => {
301
+ const res = await api(state.accessToken).patch(`/creators/${state.creatorId}`, {
302
+ bio: 'Updated bio for E2E testing',
303
+ sessionRate: 50,
304
+ });
305
+ if (res.status !== 200)
306
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
307
+ });
308
+ await test('Add creator availability', async () => {
309
+ const res = await api(state.accessToken).post(`/creators/${state.creatorId}/availability`, {
310
+ dayOfWeek: 1, // Monday
311
+ startTime: '09:00',
312
+ endTime: '17:00',
313
+ timezone: 'Europe/London',
314
+ isRecurring: true,
315
+ });
316
+ if (res.status !== 201)
317
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
318
+ const data = unwrap(res);
319
+ state.availabilityId = data.id;
320
+ });
321
+ await test('Get creator availability', async () => {
322
+ const res = await api().get(`/creators/${state.creatorId}/availability`);
323
+ if (res.status !== 200)
324
+ throw new Error(`Status ${res.status}`);
325
+ });
326
+ await test('Get creator content (published)', async () => {
327
+ const res = await api().get(`/creators/${state.creatorId}/content`);
328
+ if (res.status !== 200)
329
+ throw new Error(`Status ${res.status}`);
330
+ });
331
+ await test('Get creator events', async () => {
332
+ const res = await api().get(`/creators/${state.creatorId}/events`);
333
+ if (res.status !== 200)
334
+ throw new Error(`Status ${res.status}`);
335
+ });
336
+ // Test ownership - second user cannot update
337
+ await test('Second user cannot update another creator profile (403)', async () => {
338
+ const res = await api(state.secondUserToken).patch(`/creators/${state.creatorId}`, {
339
+ bio: 'Hacked bio',
340
+ });
341
+ if (res.status !== 403)
342
+ throw new Error(`Expected 403, got ${res.status}`);
343
+ });
344
+ }
345
+ // =========================================================================
346
+ // CREATOR PRODUCTS (Sessions/Packages)
158
347
  // =========================================================================
159
- console.log(`\n${c.cyan}--- EVENTS ---${c.reset}\n`);
348
+ section('CREATOR PRODUCTS');
349
+ if (state.creatorId) {
350
+ await test('Create creator product (1-on-1 session)', async () => {
351
+ const res = await api(state.accessToken).post(`/creators/${state.creatorId}/products`, {
352
+ title: 'E2E Test 1-on-1 Session',
353
+ description: 'A test coaching session for E2E testing',
354
+ type: 'SESSION_1ON1',
355
+ price: 5000, // £50 in pence
356
+ currency: 'GBP',
357
+ durationMinutes: 60,
358
+ maxParticipants: 1,
359
+ deliveryMethod: 'VIDEO_CALL',
360
+ });
361
+ if (res.status !== 201)
362
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
363
+ const data = unwrap(res);
364
+ state.productId = data.id;
365
+ });
366
+ await test('Create second product (workshop)', async () => {
367
+ const res = await api(state.accessToken).post(`/creators/${state.creatorId}/products`, {
368
+ title: 'E2E Test Workshop',
369
+ description: 'A group workshop for E2E testing',
370
+ type: 'WORKSHOP',
371
+ price: 2500, // £25 in pence
372
+ currency: 'GBP',
373
+ durationMinutes: 90,
374
+ maxParticipants: 10,
375
+ deliveryMethod: 'VIDEO_CALL',
376
+ });
377
+ if (res.status !== 201)
378
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
379
+ });
380
+ await test('Get creator products', async () => {
381
+ const res = await api(state.accessToken).get(`/creators/${state.creatorId}/products`);
382
+ if (res.status !== 200)
383
+ throw new Error(`Status ${res.status}`);
384
+ const data = unwrap(res);
385
+ const products = data.products || data;
386
+ if (!Array.isArray(products) || products.length < 2) {
387
+ throw new Error('Expected at least 2 products for creator');
388
+ }
389
+ });
390
+ if (state.productId) {
391
+ await test('Get product by ID (public)', async () => {
392
+ const res = await api().get(`/products/${state.productId}`);
393
+ if (res.status !== 200)
394
+ throw new Error(`Status ${res.status}`);
395
+ const data = unwrap(res);
396
+ if (!data.title || !data.price)
397
+ throw new Error('Missing expected product fields');
398
+ });
399
+ await test('Update product', async () => {
400
+ const res = await api(state.accessToken).put(`/creators/${state.creatorId}/products/${state.productId}`, {
401
+ price: 6000, // Update to £60
402
+ description: 'Updated description for E2E testing',
403
+ });
404
+ if (res.status !== 200)
405
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
406
+ const data = unwrap(res);
407
+ if (data.price !== 6000)
408
+ throw new Error('Price not updated correctly');
409
+ });
410
+ // Second user books the product
411
+ await test('Book product (as second user)', async () => {
412
+ const scheduledAt = new Date();
413
+ scheduledAt.setDate(scheduledAt.getDate() + 14); // 2 weeks from now
414
+ scheduledAt.setHours(10, 0, 0, 0);
415
+ const res = await api(state.secondUserToken).post(`/products/${state.productId}/book`, {
416
+ scheduledAt: scheduledAt.toISOString(),
417
+ timezone: 'Europe/London',
418
+ clientNotes: 'E2E test booking',
419
+ });
420
+ if (res.status !== 201)
421
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
422
+ const data = unwrap(res);
423
+ state.productBookingId = data.id;
424
+ });
425
+ if (state.productBookingId) {
426
+ await test('Get product booking details', async () => {
427
+ const res = await api(state.secondUserToken).get(`/users/me/product-bookings/${state.productBookingId}`);
428
+ if (res.status !== 200)
429
+ throw new Error(`Status ${res.status}`);
430
+ const data = unwrap(res);
431
+ if (!data.scheduledAt || !data.status)
432
+ throw new Error('Missing booking fields');
433
+ });
434
+ await test('Get user product bookings', async () => {
435
+ const res = await api(state.secondUserToken).get('/users/me/product-bookings');
436
+ if (res.status !== 200)
437
+ throw new Error(`Status ${res.status}`);
438
+ const data = unwrap(res);
439
+ const bookings = Array.isArray(data) ? data : (data.data || []);
440
+ if (!Array.isArray(bookings) || bookings.length === 0) {
441
+ throw new Error('Expected at least one product booking');
442
+ }
443
+ });
444
+ await test('Get creator bookings (as creator)', async () => {
445
+ const res = await api(state.accessToken).get(`/creators/${state.creatorId}/products/bookings`);
446
+ if (res.status !== 200)
447
+ throw new Error(`Status ${res.status}`);
448
+ const data = unwrap(res);
449
+ const bookings = Array.isArray(data) ? data : (data.data || []);
450
+ if (!Array.isArray(bookings) || bookings.length === 0) {
451
+ throw new Error('Expected at least one booking for creator products');
452
+ }
453
+ });
454
+ await test('Update product booking', async () => {
455
+ const newScheduledAt = new Date();
456
+ newScheduledAt.setDate(newScheduledAt.getDate() + 21); // 3 weeks from now
457
+ newScheduledAt.setHours(14, 0, 0, 0);
458
+ const res = await api(state.secondUserToken).put(`/users/me/product-bookings/${state.productBookingId}`, {
459
+ scheduledAt: newScheduledAt.toISOString(),
460
+ clientNotes: 'Rescheduled - E2E test',
461
+ });
462
+ if (res.status !== 200)
463
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
464
+ });
465
+ await test('Cancel product booking', async () => {
466
+ const res = await api(state.secondUserToken).delete(`/users/me/product-bookings/${state.productBookingId}`, {
467
+ data: { reason: 'E2E test cleanup' },
468
+ });
469
+ if (res.status !== 200 && res.status !== 204)
470
+ throw new Error(`Status ${res.status}`);
471
+ });
472
+ }
473
+ // Second user cannot delete creator's product
474
+ await test('Second user cannot delete product (403)', async () => {
475
+ const res = await api(state.secondUserToken).delete(`/creators/${state.creatorId}/products/${state.productId}`);
476
+ if (res.status !== 403)
477
+ throw new Error(`Expected 403, got ${res.status}`);
478
+ });
479
+ }
480
+ }
481
+ else {
482
+ skip('Create creator product', 'No creator ID available');
483
+ skip('Create second product', 'No creator ID available');
484
+ skip('Get creator products', 'No creator ID available');
485
+ skip('Get product by ID', 'No product ID available');
486
+ skip('Update product', 'No product ID available');
487
+ skip('Book product', 'No product ID available');
488
+ skip('Get product booking details', 'No booking ID available');
489
+ skip('Get user product bookings', 'No booking ID available');
490
+ skip('Get creator bookings', 'No booking ID available');
491
+ skip('Update product booking', 'No booking ID available');
492
+ skip('Cancel product booking', 'No booking ID available');
493
+ skip('Second user cannot delete product', 'No product ID available');
494
+ }
495
+ // Test public products listing
496
+ await test('List all public products', async () => {
497
+ const res = await api().get('/products');
498
+ if (res.status !== 200)
499
+ throw new Error(`Status ${res.status}`);
500
+ const data = unwrap(res);
501
+ // May have products array or paginated response
502
+ const products = data.products || data;
503
+ if (!Array.isArray(products))
504
+ throw new Error('Expected products array');
505
+ });
506
+ // =========================================================================
507
+ // BRANDS (New)
508
+ // =========================================================================
509
+ section('BRANDS');
510
+ await test('List brands', async () => {
511
+ const res = await api().get('/brands');
512
+ if (res.status !== 200)
513
+ throw new Error(`Status ${res.status}`);
514
+ });
515
+ await test('Get featured brands', async () => {
516
+ const res = await api().get('/brands/featured');
517
+ if (res.status !== 200)
518
+ throw new Error(`Status ${res.status}`);
519
+ });
520
+ await test('Create brand', async () => {
521
+ const res = await api(state.accessToken).post('/brands', {
522
+ slug: `e2e-brand-${Date.now()}`,
523
+ name: 'E2E Test Brand',
524
+ description: 'A test brand for E2E testing',
525
+ website: 'https://example.com',
526
+ email: 'brand@example.com',
527
+ });
528
+ if (res.status !== 201)
529
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
530
+ const data = unwrap(res);
531
+ state.brandId = data.id;
532
+ });
533
+ if (state.brandId) {
534
+ await test('Get brand by ID', async () => {
535
+ const res = await api().get(`/brands/${state.brandId}`);
536
+ if (res.status !== 200)
537
+ throw new Error(`Status ${res.status}`);
538
+ });
539
+ await test('Update brand', async () => {
540
+ const res = await api(state.accessToken).patch(`/brands/${state.brandId}`, {
541
+ description: 'Updated brand description',
542
+ });
543
+ if (res.status !== 200)
544
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
545
+ });
546
+ await test('Get brand owners', async () => {
547
+ const res = await api(state.accessToken).get(`/brands/${state.brandId}/owners`);
548
+ if (res.status !== 200)
549
+ throw new Error(`Status ${res.status}`);
550
+ });
551
+ // Add second user as brand manager
552
+ await test('Add brand owner (manager role)', async () => {
553
+ const res = await api(state.accessToken).post(`/brands/${state.brandId}/owners`, {
554
+ userId: state.secondUserId,
555
+ role: 'MANAGER',
556
+ });
557
+ if (res.status !== 201)
558
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
559
+ });
560
+ // Manager can update brand
561
+ await test('Manager can update brand', async () => {
562
+ const res = await api(state.secondUserToken).patch(`/brands/${state.brandId}`, {
563
+ description: 'Updated by manager',
564
+ });
565
+ if (res.status !== 200)
566
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
567
+ });
568
+ await test('Get brand creators (partnerships)', async () => {
569
+ const res = await api(state.accessToken).get(`/brands/${state.brandId}/creators`);
570
+ if (res.status !== 200)
571
+ throw new Error(`Status ${res.status}`);
572
+ });
573
+ // Add creator partnership if creator exists
574
+ if (state.creatorId) {
575
+ await test('Add creator partnership to brand', async () => {
576
+ const res = await api(state.accessToken).post(`/brands/${state.brandId}/creators`, {
577
+ creatorId: state.creatorId,
578
+ commissionRate: 0.15,
579
+ isActive: true,
580
+ });
581
+ if (res.status !== 201)
582
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
583
+ });
584
+ await test('Update creator partnership', async () => {
585
+ const res = await api(state.accessToken).patch(`/brands/${state.brandId}/creators/${state.creatorId}`, {
586
+ commissionRate: 0.20,
587
+ });
588
+ if (res.status !== 200)
589
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
590
+ });
591
+ }
592
+ await test('Get brand sponsored events', async () => {
593
+ const res = await api().get(`/brands/${state.brandId}/events`);
594
+ if (res.status !== 200)
595
+ throw new Error(`Status ${res.status}`);
596
+ });
597
+ // Remove the manager
598
+ await test('Remove brand owner', async () => {
599
+ const res = await api(state.accessToken).delete(`/brands/${state.brandId}/owners/${state.secondUserId}`);
600
+ if (res.status !== 200 && res.status !== 204)
601
+ throw new Error(`Status ${res.status}`);
602
+ });
603
+ // Second user should now be forbidden
604
+ await test('Removed owner cannot access brand (403)', async () => {
605
+ const res = await api(state.secondUserToken).patch(`/brands/${state.brandId}`, {
606
+ description: 'Should fail',
607
+ });
608
+ if (res.status !== 403)
609
+ throw new Error(`Expected 403, got ${res.status}`);
610
+ });
611
+ }
612
+ // =========================================================================
613
+ // EVENTS (with new fields: venueId, creatorId, sponsorBrandId, gatheringType)
614
+ // =========================================================================
615
+ section('EVENTS');
160
616
  await test('List events', async () => {
161
617
  const res = await api().get('/events');
162
618
  if (res.status !== 200)
@@ -167,15 +623,24 @@ async function runTests() {
167
623
  if (res.status !== 200)
168
624
  throw new Error(`Status ${res.status}`);
169
625
  });
170
- await test('Create event', async () => {
171
- const res = await api(state.accessToken).post('/events', {
626
+ await test('Create event with creator and brand sponsor', async () => {
627
+ const eventData = {
172
628
  title: 'E2E Test Event',
173
629
  description: 'A test event created by E2E tests',
174
- startDate: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(), // 7 days from now
630
+ startDate: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),
175
631
  totalSpots: 20,
176
632
  locationName: 'Test Location',
177
633
  locationAddress: '123 Test Street',
178
- });
634
+ gatheringType: 'FACILITATOR_LED',
635
+ };
636
+ // Add creator and brand if available
637
+ if (state.creatorId)
638
+ eventData.creatorId = state.creatorId;
639
+ if (state.brandId)
640
+ eventData.sponsorBrandId = state.brandId;
641
+ if (state.venueId)
642
+ eventData.venueId = state.venueId;
643
+ const res = await api(state.accessToken).post('/events', eventData);
179
644
  if (res.status !== 201)
180
645
  throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
181
646
  const data = unwrap(res);
@@ -186,10 +651,21 @@ async function runTests() {
186
651
  const res = await api().get(`/events/${state.eventId}`);
187
652
  if (res.status !== 200)
188
653
  throw new Error(`Status ${res.status}`);
654
+ const data = unwrap(res);
655
+ // Verify new fields are present
656
+ if (!('gatheringType' in data))
657
+ throw new Error('Missing gatheringType field');
658
+ if (!('venueId' in data))
659
+ throw new Error('Missing venueId field');
660
+ if (!('creatorId' in data))
661
+ throw new Error('Missing creatorId field');
662
+ if (!('sponsorBrandId' in data))
663
+ throw new Error('Missing sponsorBrandId field');
189
664
  });
190
665
  await test('Update event', async () => {
191
666
  const res = await api(state.accessToken).put(`/events/${state.eventId}`, {
192
667
  title: 'E2E Test Event (Updated)',
668
+ description: 'Updated description for E2E testing',
193
669
  });
194
670
  if (res.status !== 200)
195
671
  throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
@@ -208,13 +684,12 @@ async function runTests() {
208
684
  // =========================================================================
209
685
  // BOOKINGS
210
686
  // =========================================================================
211
- console.log(`\n${c.cyan}--- BOOKINGS ---${c.reset}\n`);
687
+ section('BOOKINGS');
212
688
  if (state.eventId) {
213
689
  await test('RSVP to event', async () => {
214
690
  const res = await api(state.accessToken).post(`/events/${state.eventId}/book`);
215
- // 201 for new booking, 409 if already exists
216
691
  if (res.status !== 201 && res.status !== 409)
217
- throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
692
+ throw new Error(`Status ${res.status}`);
218
693
  if (res.status === 201) {
219
694
  const data = unwrap(res);
220
695
  state.bookingId = data.id;
@@ -227,9 +702,9 @@ async function runTests() {
227
702
  });
228
703
  }
229
704
  // =========================================================================
230
- // EVENT CHAT
705
+ // EVENT CHAT (New roles: ATTENDEE, CREATOR, VENUE_REP, BRAND_REP)
231
706
  // =========================================================================
232
- console.log(`\n${c.cyan}--- EVENT CHAT ---${c.reset}\n`);
707
+ section('EVENT CHAT');
233
708
  if (state.eventId) {
234
709
  await test('Get or create event chat', async () => {
235
710
  const res = await api(state.accessToken).get(`/events/${state.eventId}/chat`);
@@ -240,26 +715,34 @@ async function runTests() {
240
715
  });
241
716
  await test('Join event chat', async () => {
242
717
  const res = await api(state.accessToken).post(`/events/${state.eventId}/chat/join`);
243
- // 200 for join, 403 if no booking (but we just booked)
244
718
  if (res.status !== 200)
245
- throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
719
+ throw new Error(`Status ${res.status}`);
246
720
  });
247
721
  await test('Send chat message', async () => {
248
722
  const res = await api(state.accessToken).post(`/events/${state.eventId}/chat/messages`, {
249
723
  content: 'Hello from E2E test!',
250
724
  });
251
725
  if (res.status !== 201)
252
- throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
726
+ throw new Error(`Status ${res.status}`);
253
727
  });
254
728
  await test('Get chat messages', async () => {
255
729
  const res = await api(state.accessToken).get(`/events/${state.eventId}/chat/messages`);
256
730
  if (res.status !== 200)
257
- throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
731
+ throw new Error(`Status ${res.status}`);
258
732
  });
259
- await test('Get chat members', async () => {
733
+ await test('Get chat members (check for new roles)', async () => {
260
734
  const res = await api(state.accessToken).get(`/events/${state.eventId}/chat/members`);
261
735
  if (res.status !== 200)
262
736
  throw new Error(`Status ${res.status}`);
737
+ const data = unwrap(res);
738
+ // Verify members have role field
739
+ if (Array.isArray(data) && data.length > 0) {
740
+ const validRoles = ['ATTENDEE', 'CREATOR', 'VENUE_REP', 'BRAND_REP', 'MODERATOR', 'ADMIN'];
741
+ const member = data[0];
742
+ if (!validRoles.includes(member.role)) {
743
+ throw new Error(`Invalid role: ${member.role}`);
744
+ }
745
+ }
263
746
  });
264
747
  await test('Mark chat as read', async () => {
265
748
  const res = await api(state.accessToken).post(`/events/${state.eventId}/chat/read`);
@@ -268,15 +751,74 @@ async function runTests() {
268
751
  });
269
752
  }
270
753
  // =========================================================================
754
+ // BADGES & UNIFIED REWARDS
755
+ // =========================================================================
756
+ section('BADGES & UNIFIED REWARDS');
757
+ await test('Get all badges', async () => {
758
+ const res = await api(state.accessToken).get('/badges');
759
+ if (res.status !== 200)
760
+ throw new Error(`Status ${res.status}`);
761
+ const data = unwrap(res);
762
+ if (Array.isArray(data) && data.length > 0) {
763
+ state.badgeId = data[0].id;
764
+ }
765
+ });
766
+ await test('Get my badges', async () => {
767
+ const res = await api(state.accessToken).get('/badges/users/me/badges');
768
+ if (res.status !== 200)
769
+ throw new Error(`Status ${res.status}`);
770
+ });
771
+ await test('Get next badges (with progress)', async () => {
772
+ const res = await api(state.accessToken).get('/badges/next');
773
+ if (res.status !== 200)
774
+ throw new Error(`Status ${res.status}`);
775
+ });
776
+ await test('Get available rewards', async () => {
777
+ const res = await api(state.accessToken).get('/rewards/available');
778
+ if (res.status !== 200)
779
+ throw new Error(`Status ${res.status}`);
780
+ });
781
+ await test('Get rewards wallet', async () => {
782
+ const res = await api(state.accessToken).get('/rewards/wallet');
783
+ if (res.status !== 200)
784
+ throw new Error(`Status ${res.status}`);
785
+ const data = unwrap(res);
786
+ // Verify wallet structure - badges may be empty array for new users
787
+ if (data.badges === undefined)
788
+ throw new Error('Missing badges in wallet');
789
+ if (data.stats === undefined)
790
+ throw new Error('Missing stats in wallet');
791
+ });
792
+ if (state.badgeId) {
793
+ await test('Get rewards for badge', async () => {
794
+ const res = await api(state.accessToken).get(`/rewards/badge/${state.badgeId}`);
795
+ if (res.status !== 200)
796
+ throw new Error(`Status ${res.status}`);
797
+ });
798
+ }
799
+ if (state.venueId) {
800
+ await test('Get rewards for venue', async () => {
801
+ const res = await api(state.accessToken).get(`/rewards/venue/${state.venueId}`);
802
+ if (res.status !== 200)
803
+ throw new Error(`Status ${res.status}`);
804
+ });
805
+ }
806
+ if (state.brandId) {
807
+ await test('Get rewards for brand', async () => {
808
+ const res = await api(state.accessToken).get(`/rewards/brand/${state.brandId}`);
809
+ if (res.status !== 200)
810
+ throw new Error(`Status ${res.status}`);
811
+ });
812
+ }
813
+ // =========================================================================
271
814
  // HUBS
272
815
  // =========================================================================
273
- console.log(`\n${c.cyan}--- HUBS ---${c.reset}\n`);
816
+ section('HUBS');
274
817
  await test('List hubs', async () => {
275
818
  const res = await api().get('/hubs');
276
819
  if (res.status !== 200)
277
820
  throw new Error(`Status ${res.status}`);
278
- // Get first hub if exists
279
- const data = res.data.data;
821
+ const data = unwrap(res);
280
822
  if (Array.isArray(data) && data.length > 0) {
281
823
  state.hubId = data[0].id;
282
824
  }
@@ -289,9 +831,8 @@ async function runTests() {
289
831
  });
290
832
  await test('Join hub', async () => {
291
833
  const res = await api(state.accessToken).post(`/hubs/${state.hubId}/join`);
292
- // 200/201 for join, 409 if already member
293
834
  if (res.status !== 200 && res.status !== 201 && res.status !== 409) {
294
- throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
835
+ throw new Error(`Status ${res.status}`);
295
836
  }
296
837
  });
297
838
  await test('Get hub members', async () => {
@@ -301,15 +842,34 @@ async function runTests() {
301
842
  });
302
843
  }
303
844
  // =========================================================================
845
+ // LIBRARY (Content workflow)
846
+ // =========================================================================
847
+ section('LIBRARY');
848
+ await test('Get library content', async () => {
849
+ const res = await api(state.accessToken).get('/library');
850
+ if (res.status !== 200)
851
+ throw new Error(`Status ${res.status}`);
852
+ });
853
+ await test('Get featured content', async () => {
854
+ const res = await api(state.accessToken).get('/library/featured');
855
+ if (res.status !== 200)
856
+ throw new Error(`Status ${res.status}`);
857
+ });
858
+ // Content workflow tests (if creator exists)
859
+ if (state.creatorId) {
860
+ // Note: /library/creator/:id endpoint not implemented yet
861
+ // skip('Get content by creator', 'Endpoint not implemented');
862
+ }
863
+ // =========================================================================
304
864
  // JACK AI (Support Conversations)
305
865
  // =========================================================================
306
- console.log(`\n${c.cyan}--- JACK AI ---${c.reset}\n`);
866
+ section('JACK AI');
307
867
  await test('Start Jack conversation', async () => {
308
868
  const res = await api(state.accessToken).post('/support/jack/conversations/new', {
309
869
  message: 'Hello Jack!',
310
870
  });
311
871
  if (res.status !== 201 && res.status !== 200)
312
- throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
872
+ throw new Error(`Status ${res.status}`);
313
873
  const data = unwrap(res);
314
874
  state.conversationId = data.conversation?.id || data.id;
315
875
  });
@@ -333,18 +893,17 @@ async function runTests() {
333
893
  // =========================================================================
334
894
  // SUPPORT (Check-ins, Wins)
335
895
  // =========================================================================
336
- console.log(`\n${c.cyan}--- SUPPORT ---${c.reset}\n`);
896
+ section('SUPPORT');
337
897
  await test('Create daily check-in', async () => {
338
898
  const res = await api(state.accessToken).post('/support/check-ins', {
339
899
  date: new Date().toISOString().split('T')[0],
340
- mood: 4, // Valid range 1-5
341
- energy: 4, // Valid range 1-5
900
+ mood: 4,
901
+ energy: 4,
342
902
  stayedSober: true,
343
903
  notes: 'E2E test check-in',
344
904
  });
345
- // 201 for new, 409 if exists
346
905
  if (res.status !== 201 && res.status !== 409)
347
- throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
906
+ throw new Error(`Status ${res.status}`);
348
907
  });
349
908
  await test('Get check-ins', async () => {
350
909
  const res = await api(state.accessToken).get('/support/check-ins');
@@ -365,10 +924,10 @@ async function runTests() {
365
924
  const res = await api(state.accessToken).post('/support/wins', {
366
925
  title: 'Completed E2E tests',
367
926
  description: 'Successfully ran all API tests',
368
- category: 'PERSONAL', // Valid: SOBRIETY, HEALTH, RELATIONSHIP, CAREER, PERSONAL, FINANCIAL, OTHER
927
+ category: 'PERSONAL',
369
928
  });
370
929
  if (res.status !== 201)
371
- throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
930
+ throw new Error(`Status ${res.status}`);
372
931
  });
373
932
  await test('Get wins', async () => {
374
933
  const res = await api(state.accessToken).get('/support/wins');
@@ -383,7 +942,7 @@ async function runTests() {
383
942
  // =========================================================================
384
943
  // NOTIFICATIONS
385
944
  // =========================================================================
386
- console.log(`\n${c.cyan}--- NOTIFICATIONS ---${c.reset}\n`);
945
+ section('NOTIFICATIONS');
387
946
  await test('Get notifications', async () => {
388
947
  const res = await api(state.accessToken).get('/notifications');
389
948
  if (res.status !== 200)
@@ -397,7 +956,7 @@ async function runTests() {
397
956
  // =========================================================================
398
957
  // SUBSCRIPTIONS
399
958
  // =========================================================================
400
- console.log(`\n${c.cyan}--- SUBSCRIPTIONS ---${c.reset}\n`);
959
+ section('SUBSCRIPTIONS');
401
960
  await test('Get subscription plans', async () => {
402
961
  const res = await api(state.accessToken).get('/subscriptions/plans');
403
962
  if (res.status !== 200)
@@ -405,42 +964,366 @@ async function runTests() {
405
964
  });
406
965
  await test('Get my subscription', async () => {
407
966
  const res = await api(state.accessToken).get('/subscriptions/me');
408
- // 200 if subscribed, 404 if not
409
967
  if (res.status !== 200 && res.status !== 404)
410
968
  throw new Error(`Status ${res.status}`);
411
969
  });
412
970
  // =========================================================================
413
- // LIBRARY
971
+ // MAP
414
972
  // =========================================================================
415
- console.log(`\n${c.cyan}--- LIBRARY ---${c.reset}\n`);
416
- await test('Get library content', async () => {
417
- const res = await api(state.accessToken).get('/library');
973
+ section('MAP');
974
+ await test('Get map hubs', async () => {
975
+ const res = await api(state.accessToken).get('/map/hubs');
418
976
  if (res.status !== 200)
419
977
  throw new Error(`Status ${res.status}`);
420
978
  });
421
- await test('Get featured content', async () => {
422
- const res = await api(state.accessToken).get('/library/featured');
979
+ await test('Get map events', async () => {
980
+ const res = await api(state.accessToken).get('/map/events');
423
981
  if (res.status !== 200)
424
982
  throw new Error(`Status ${res.status}`);
425
983
  });
426
984
  // =========================================================================
427
- // MAP
985
+ // BADGE AWARDING (Business Logic Tests)
428
986
  // =========================================================================
429
- console.log(`\n${c.cyan}--- MAP ---${c.reset}\n`);
430
- await test('Get map hubs', async () => {
431
- const res = await api(state.accessToken).get('/map/hubs');
987
+ section('BADGE AWARDING');
988
+ // Test badge progress tracking after actions
989
+ // Note: These tests verify the badge awarding integration works correctly.
990
+ // Actual badge earning depends on thresholds in seed data.
991
+ // Get initial badge state
992
+ let initialBadgeCount = 0;
993
+ let initialBadges = [];
994
+ await test('Get initial user badges before badge tests', async () => {
995
+ const res = await api(state.accessToken).get('/badges/users/me/badges');
432
996
  if (res.status !== 200)
433
997
  throw new Error(`Status ${res.status}`);
998
+ const data = unwrap(res);
999
+ initialBadgeCount = Array.isArray(data) ? data.length : 0;
1000
+ initialBadges = Array.isArray(data) ? data.map((b) => b.badgeId) : [];
434
1001
  });
435
- await test('Get map events', async () => {
436
- const res = await api(state.accessToken).get('/map/events');
1002
+ // Check-in Streak Badge Tests
1003
+ await test('Check-in updates streak and triggers badge check', async () => {
1004
+ // Create a check-in for a previous day (to test streak logic)
1005
+ const yesterday = new Date();
1006
+ yesterday.setDate(yesterday.getDate() - 1);
1007
+ const yesterdayStr = yesterday.toISOString().split('T')[0];
1008
+ const res = await api(state.accessToken).post('/support/check-ins', {
1009
+ date: yesterdayStr,
1010
+ mood: 4,
1011
+ energy: 3,
1012
+ stayedSober: true,
1013
+ notes: 'Badge test check-in',
1014
+ });
1015
+ // Accept 201 (created) or 409 (already exists - re-running test)
1016
+ if (res.status !== 201 && res.status !== 409)
1017
+ throw new Error(`Status ${res.status}`);
1018
+ });
1019
+ await test('Verify streak is tracked after check-in', async () => {
1020
+ const res = await api(state.accessToken).get('/support/check-ins/streak');
437
1021
  if (res.status !== 200)
438
1022
  throw new Error(`Status ${res.status}`);
1023
+ const data = unwrap(res);
1024
+ // Should have at least 1 check-in now (from earlier test)
1025
+ if (data.totalCheckIns === undefined)
1026
+ throw new Error('Missing totalCheckIns in streak data');
1027
+ });
1028
+ // Wins Badge Tests
1029
+ await test('Log win updates count and triggers badge check', async () => {
1030
+ const res = await api(state.accessToken).post('/support/wins', {
1031
+ title: 'Badge awarding test win',
1032
+ description: 'Testing that logging wins triggers badge check',
1033
+ category: 'PERSONAL', // Valid WinCategory enum value
1034
+ });
1035
+ if (res.status !== 201)
1036
+ throw new Error(`Status ${res.status}`);
1037
+ });
1038
+ await test('Verify wins count is tracked', async () => {
1039
+ const res = await api(state.accessToken).get('/support/wins/count');
1040
+ if (res.status !== 200)
1041
+ throw new Error(`Status ${res.status}`);
1042
+ const data = unwrap(res);
1043
+ // Should have totalWins or count
1044
+ if (data.totalWins === undefined && typeof data !== 'number' && data.count === undefined) {
1045
+ throw new Error('Expected wins count in response');
1046
+ }
1047
+ });
1048
+ // Mood Log Badge Tests
1049
+ await test('Log mood updates count and triggers badge check', async () => {
1050
+ const res = await api(state.accessToken).post('/support/mood-logs', {
1051
+ mood: 4, // Required field (1-5)
1052
+ energy: 3, // Optional (1-5)
1053
+ tags: ['hopeful'], // Optional array of strings
1054
+ note: 'Badge test mood log', // Optional note
1055
+ });
1056
+ if (res.status !== 201)
1057
+ throw new Error(`Status ${res.status}`);
1058
+ });
1059
+ await test('Verify mood logs are tracked', async () => {
1060
+ const res = await api(state.accessToken).get('/support/mood-logs');
1061
+ if (res.status !== 200)
1062
+ throw new Error(`Status ${res.status}`);
1063
+ const data = unwrap(res);
1064
+ // Handle both array and { data: array } formats
1065
+ const logs = Array.isArray(data) ? data : (data.data || data.moodLogs || []);
1066
+ // Should have at least 1 mood log
1067
+ if (!Array.isArray(logs) || logs.length === 0) {
1068
+ throw new Error('Expected at least one mood log');
1069
+ }
1070
+ });
1071
+ // Reflection Badge Tests
1072
+ await test('Submit reflection updates count and triggers badge check', async () => {
1073
+ // Calculate weekStart - needs to be a Monday in YYYY-MM-DD format
1074
+ const now = new Date();
1075
+ const dayOfWeek = now.getDay();
1076
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
1077
+ const monday = new Date(now);
1078
+ monday.setDate(now.getDate() - daysToMonday);
1079
+ const weekStart = monday.toISOString().split('T')[0];
1080
+ const res = await api(state.accessToken).post('/support/reflections', {
1081
+ weekStart, // Required field
1082
+ overallRating: 4,
1083
+ biggestWin: 'Badge test reflection - testing the badge integration',
1084
+ challenges: 'Testing automated badge checks',
1085
+ goals: ['Continue improving the platform'],
1086
+ notes: 'E2E test reflection',
1087
+ });
1088
+ // Accept 201 (created) or 409 (already exists for this week)
1089
+ if (res.status !== 201 && res.status !== 409)
1090
+ throw new Error(`Status ${res.status}`);
1091
+ });
1092
+ await test('Verify reflections are tracked', async () => {
1093
+ const res = await api(state.accessToken).get('/support/reflections');
1094
+ if (res.status !== 200)
1095
+ throw new Error(`Status ${res.status}`);
1096
+ });
1097
+ // Events Hosted Badge Tests (awarded on publish)
1098
+ await test('Publishing event awards EVENTS_HOSTED badge to hosts', async () => {
1099
+ // The event was already published in EVENTS section
1100
+ // Verify the badge check was triggered by checking next badges
1101
+ const res = await api(state.accessToken).get('/badges/next');
1102
+ if (res.status !== 200)
1103
+ throw new Error(`Status ${res.status}`);
1104
+ const data = unwrap(res);
1105
+ // Should return badge progress data
1106
+ if (!Array.isArray(data))
1107
+ throw new Error('Expected array of next badges');
1108
+ });
1109
+ // Events Attended Badge Tests
1110
+ // Note: EVENTS_ATTENDED badge is awarded when booking is checked-in
1111
+ // This requires a host to check-in the booking, which we can't do in E2E easily
1112
+ // So we just verify the badge progress tracking works
1113
+ await test('Badge progress shows EVENTS_ATTENDED tracking', async () => {
1114
+ const res = await api(state.accessToken).get('/badges/next');
1115
+ if (res.status !== 200)
1116
+ throw new Error(`Status ${res.status}`);
1117
+ const data = unwrap(res);
1118
+ // Look for events attended badge in progress
1119
+ const eventsAttendedBadge = data.find((b) => b.badge?.type === 'EVENTS_ATTENDED' || b.badge?.slug?.includes('event'));
1120
+ // May or may not exist depending on seed data, but API should work
1121
+ });
1122
+ // Verify badge state after all actions
1123
+ await test('Verify badges after all badge-triggering actions', async () => {
1124
+ const res = await api(state.accessToken).get('/badges/users/me/badges');
1125
+ if (res.status !== 200)
1126
+ throw new Error(`Status ${res.status}`);
1127
+ const data = unwrap(res);
1128
+ const currentBadgeCount = Array.isArray(data) ? data.length : 0;
1129
+ // Depending on thresholds, user may have earned new badges
1130
+ // At minimum, the API should return successfully
1131
+ });
1132
+ // =========================================================================
1133
+ // REWARD FLOW
1134
+ // =========================================================================
1135
+ section('REWARD FLOW');
1136
+ // Store reward-related state
1137
+ let testBadgeIdForReward;
1138
+ let testRewardId;
1139
+ let redemptionId;
1140
+ // Get a badge to use for reward tests
1141
+ await test('Get available badges for reward test', async () => {
1142
+ const res = await api(state.accessToken).get('/badges');
1143
+ if (res.status !== 200)
1144
+ throw new Error(`Status ${res.status}`);
1145
+ const data = unwrap(res);
1146
+ if (Array.isArray(data) && data.length > 0) {
1147
+ testBadgeIdForReward = data[0].id;
1148
+ }
1149
+ });
1150
+ // Create a brand reward for testing (user owns brand from earlier tests)
1151
+ // Note: We use brand since we created one in the BRANDS section
1152
+ if (state.brandId) {
1153
+ await test('Create brand reward for badge', async () => {
1154
+ if (!testBadgeIdForReward) {
1155
+ throw new Error('No badge available to create reward for');
1156
+ }
1157
+ const res = await api(state.accessToken).post(`/brands/${state.brandId}/rewards`, {
1158
+ badgeId: testBadgeIdForReward,
1159
+ title: 'E2E Brand Test Reward',
1160
+ description: 'A test brand reward for E2E testing',
1161
+ redeemType: 'ONLINE',
1162
+ code: 'E2E-TEST-CODE',
1163
+ perUserLimit: 1,
1164
+ });
1165
+ if (res.status !== 201)
1166
+ throw new Error(`Status ${res.status}: ${JSON.stringify(res.data)}`);
1167
+ const data = unwrap(res);
1168
+ testRewardId = data.id;
1169
+ });
1170
+ }
1171
+ else {
1172
+ skip('Create brand reward for badge', 'No brand available (brand not created)');
1173
+ }
1174
+ // Test reward availability
1175
+ await test('Get available rewards for user', async () => {
1176
+ const res = await api(state.accessToken).get('/rewards/available');
1177
+ if (res.status !== 200)
1178
+ throw new Error(`Status ${res.status}`);
1179
+ const data = unwrap(res);
1180
+ // API returns { data: rewards[] }
1181
+ const rewards = data.data || data;
1182
+ if (!Array.isArray(rewards))
1183
+ throw new Error('Expected array of available rewards');
1184
+ });
1185
+ // Test user cannot redeem without earning the badge
1186
+ await test('Cannot redeem reward without earning required badge (400)', async () => {
1187
+ if (!testRewardId || !testBadgeIdForReward) {
1188
+ console.log(` ${c.dim}(Skipped: No test reward created)${c.reset}`);
1189
+ return;
1190
+ }
1191
+ // First check if user has the badge
1192
+ const badgeRes = await api(state.accessToken).get('/badges/users/me/badges');
1193
+ const badges = unwrap(badgeRes);
1194
+ const hasBadge = Array.isArray(badges) && badges.some((b) => b.badgeId === testBadgeIdForReward);
1195
+ if (!hasBadge) {
1196
+ // User doesn't have badge, should get 400 when trying to redeem
1197
+ const res = await api(state.accessToken).post(`/rewards/${testRewardId}/redeem`);
1198
+ if (res.status !== 400) {
1199
+ throw new Error(`Expected 400 (need badge first), got ${res.status}`);
1200
+ }
1201
+ }
1202
+ else {
1203
+ // User has the badge, test passes (we'll test redemption below)
1204
+ console.log(` ${c.dim}(User already has required badge - will test redemption)${c.reset}`);
1205
+ }
1206
+ });
1207
+ // Test redemption flow - check if user can redeem
1208
+ await test('Check badge ownership and test redemption flow', async () => {
1209
+ if (!testRewardId || !testBadgeIdForReward) {
1210
+ console.log(` ${c.dim}(Skipped: No test reward created)${c.reset}`);
1211
+ return;
1212
+ }
1213
+ // Check if user has earned the badge
1214
+ const badgeRes = await api(state.accessToken).get('/badges/users/me/badges');
1215
+ if (badgeRes.status !== 200)
1216
+ throw new Error(`Status ${badgeRes.status}`);
1217
+ const badges = unwrap(badgeRes);
1218
+ const userHasBadge = Array.isArray(badges) && badges.some((b) => b.badgeId === testBadgeIdForReward);
1219
+ if (userHasBadge) {
1220
+ // User has badge, test the full redemption flow
1221
+ const redeemRes = await api(state.accessToken).post(`/rewards/${testRewardId}/redeem`);
1222
+ if (redeemRes.status !== 201) {
1223
+ throw new Error(`Redeem failed: ${redeemRes.status}: ${JSON.stringify(redeemRes.data)}`);
1224
+ }
1225
+ const redeemData = unwrap(redeemRes);
1226
+ redemptionId = redeemData.id;
1227
+ console.log(` ${c.dim}(Redemption successful: ${redemptionId})${c.reset}`);
1228
+ }
1229
+ else {
1230
+ console.log(` ${c.dim}(User has not earned required badge - redemption test skipped)${c.reset}`);
1231
+ }
1232
+ });
1233
+ await test('Cannot redeem same reward twice (400)', async () => {
1234
+ if (!testRewardId || !redemptionId) {
1235
+ console.log(` ${c.dim}(Skipped: No prior redemption to test)${c.reset}`);
1236
+ return;
1237
+ }
1238
+ const res = await api(state.accessToken).post(`/rewards/${testRewardId}/redeem`);
1239
+ if (res.status !== 400) {
1240
+ throw new Error(`Expected 400 (already redeemed), got ${res.status}`);
1241
+ }
1242
+ });
1243
+ await test('Get redeemed rewards', async () => {
1244
+ const res = await api(state.accessToken).get('/rewards/redeemed');
1245
+ if (res.status !== 200)
1246
+ throw new Error(`Status ${res.status}`);
1247
+ const data = unwrap(res);
1248
+ // API returns { data: redemptions[] }
1249
+ const redemptions = data.data || data;
1250
+ if (!Array.isArray(redemptions))
1251
+ throw new Error('Expected array of redeemed rewards');
1252
+ // If we redeemed, should have at least one
1253
+ if (redemptionId && redemptions.length === 0) {
1254
+ throw new Error('Expected at least one redeemed reward');
1255
+ }
1256
+ });
1257
+ await test('Rewards wallet shows correct stats', async () => {
1258
+ const res = await api(state.accessToken).get('/rewards/wallet');
1259
+ if (res.status !== 200)
1260
+ throw new Error(`Status ${res.status}`);
1261
+ const data = unwrap(res);
1262
+ if (data.stats === undefined)
1263
+ throw new Error('Missing stats in wallet');
1264
+ // After redemption, should have at least 1 redeemed
1265
+ if (redemptionId && data.stats.totalRedeemedRewards < 1) {
1266
+ throw new Error('Expected at least 1 redeemed reward in wallet stats');
1267
+ }
1268
+ });
1269
+ // Test getting rewards by badge
1270
+ await test('Get rewards for specific badge', async () => {
1271
+ if (!testBadgeIdForReward) {
1272
+ console.log(` ${c.dim}(Skipped: No badge ID available)${c.reset}`);
1273
+ return;
1274
+ }
1275
+ const res = await api(state.accessToken).get(`/rewards/badge/${testBadgeIdForReward}`);
1276
+ if (res.status !== 200)
1277
+ throw new Error(`Status ${res.status}`);
1278
+ const data = unwrap(res);
1279
+ // API returns { data: rewards[] }
1280
+ const rewards = data.data || data;
1281
+ if (!Array.isArray(rewards))
1282
+ throw new Error('Expected array of rewards');
1283
+ });
1284
+ // Verify reward redemption verification endpoint
1285
+ await test('Verify redemption endpoint works', async () => {
1286
+ // This would normally be called by venue/brand staff
1287
+ // We'll test with an invalid token to ensure endpoint exists
1288
+ const res = await api(state.accessToken).post('/rewards/verify', {
1289
+ qrToken: 'invalid-test-token',
1290
+ });
1291
+ // POST defaults to 201, but either 200 or 201 is acceptable
1292
+ if (res.status !== 200 && res.status !== 201)
1293
+ throw new Error(`Status ${res.status}`);
1294
+ const data = unwrap(res);
1295
+ // API returns { data: { valid: boolean } }
1296
+ const result = data.data || data;
1297
+ if (result.valid !== false) {
1298
+ throw new Error('Expected valid: false for invalid token');
1299
+ }
439
1300
  });
440
1301
  // =========================================================================
441
1302
  // CLEANUP
442
1303
  // =========================================================================
443
- console.log(`\n${c.cyan}--- CLEANUP ---${c.reset}\n`);
1304
+ section('CLEANUP');
1305
+ // Cleanup creator products
1306
+ if (state.productId && state.creatorId) {
1307
+ await test('Delete creator product', async () => {
1308
+ const res = await api(state.accessToken).delete(`/creators/${state.creatorId}/products/${state.productId}`);
1309
+ if (res.status !== 200 && res.status !== 204)
1310
+ throw new Error(`Status ${res.status}`);
1311
+ });
1312
+ }
1313
+ if (state.availabilityId && state.creatorId) {
1314
+ await test('Remove creator availability', async () => {
1315
+ const res = await api(state.accessToken).delete(`/creators/${state.creatorId}/availability/${state.availabilityId}`);
1316
+ if (res.status !== 200 && res.status !== 204)
1317
+ throw new Error(`Status ${res.status}`);
1318
+ });
1319
+ }
1320
+ if (state.creatorId && state.brandId) {
1321
+ await test('Remove creator from brand partnership', async () => {
1322
+ const res = await api(state.accessToken).delete(`/brands/${state.brandId}/creators/${state.creatorId}`);
1323
+ if (res.status !== 200 && res.status !== 204)
1324
+ throw new Error(`Status ${res.status}`);
1325
+ });
1326
+ }
444
1327
  if (state.bookingId) {
445
1328
  await test('Cancel booking', async () => {
446
1329
  const res = await api(state.accessToken).delete(`/bookings/${state.bookingId}`);
@@ -458,15 +1341,28 @@ async function runTests() {
458
1341
  // =========================================================================
459
1342
  // SUMMARY
460
1343
  // =========================================================================
461
- console.log(`\n${c.cyan}${'='.repeat(60)}${c.reset}`);
1344
+ console.log(`\n${c.cyan}${'='.repeat(70)}${c.reset}`);
462
1345
  console.log(`${c.cyan} TEST SUMMARY${c.reset}`);
463
- console.log(`${c.cyan}${'='.repeat(60)}${c.reset}`);
464
- console.log(`${c.green}Passed: ${passed}${c.reset}`);
465
- console.log(`${c.red}Failed: ${failed}${c.reset}`);
466
- console.log(`Total: ${passed + failed}`);
467
- console.log(`${c.cyan}${'='.repeat(60)}${c.reset}\n`);
1346
+ console.log(`${c.cyan}${'='.repeat(70)}${c.reset}`);
1347
+ console.log(`${c.green}Passed: ${passed}${c.reset}`);
1348
+ console.log(`${c.red}Failed: ${failed}${c.reset}`);
1349
+ console.log(`${c.yellow}Skipped: ${skipped}${c.reset}`);
1350
+ console.log(`${c.bold}Total: ${passed + failed + skipped}${c.reset}`);
1351
+ console.log(`${c.cyan}${'='.repeat(70)}${c.reset}\n`);
1352
+ // IDs for debugging
1353
+ console.log(`${c.dim}Test IDs:${c.reset}`);
1354
+ console.log(`${c.dim} User: ${state.userId}${c.reset}`);
1355
+ console.log(`${c.dim} Creator: ${state.creatorId || 'N/A'}${c.reset}`);
1356
+ console.log(`${c.dim} Product: ${state.productId || 'N/A'}${c.reset}`);
1357
+ console.log(`${c.dim} Brand: ${state.brandId || 'N/A'}${c.reset}`);
1358
+ console.log(`${c.dim} Event: ${state.eventId || 'N/A'}${c.reset}`);
1359
+ console.log(`${c.dim} Venue: ${state.venueId || 'N/A'}${c.reset}`);
1360
+ console.log('');
468
1361
  process.exit(failed > 0 ? 1 : 0);
469
1362
  }
470
1363
  // Run tests
471
- runTests().catch(console.error);
472
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTJlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2UyZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7Ozs7QUFFSCxrREFBNkM7QUFFN0MsTUFBTSxRQUFRLEdBQUcsOEJBQThCLENBQUM7QUFDaEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDO0FBQ3JELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDO0FBRXZDLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsR0FBRztJQUNSLEtBQUssRUFBRSxTQUFTO0lBQ2hCLEtBQUssRUFBRSxVQUFVO0lBQ2pCLEdBQUcsRUFBRSxVQUFVO0lBQ2YsTUFBTSxFQUFFLFVBQVU7SUFDbEIsSUFBSSxFQUFFLFVBQVU7SUFDaEIsR0FBRyxFQUFFLFNBQVM7Q0FDZixDQUFDO0FBRUYsNEJBQTRCO0FBQzVCLE1BQU0sS0FBSyxHQVNQO0lBQ0YsV0FBVyxFQUFFLEVBQUU7SUFDZixZQUFZLEVBQUUsRUFBRTtJQUNoQixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUFFRixRQUFRO0FBQ1IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRWYsc0JBQXNCO0FBQ3RCLFNBQVMsR0FBRyxDQUFDLEtBQWM7SUFDekIsT0FBTyxlQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFVBQVUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMxRCxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtLQUMzQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsY0FBYztBQUNkLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBWSxF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QztBQUNuQyxDQUFDO0FBRUQsWUFBWTtBQUNaLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdyb3dTb2JlciBBUEkgRTJFIFRlc3RzXG4gKlxuICogVGVzdHMgYWxsIFNESyBlbmRwb2ludHMgYWdhaW5zdCB0aGUgcmVhbCBBUEkuXG4gKiBSdW4gd2l0aDogbnB4IHRzLW5vZGUgc3JjL19fdGVzdHNfXy9lMmUudGVzdC50c1xuICovXG5cbmltcG9ydCBheGlvcywgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5jb25zdCBCQVNFX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjMwMDEvYXBpL3YxJztcbmNvbnN0IFRFU1RfRU1BSUwgPSBgZTJlLSR7RGF0ZS5ub3coKX1AZ3Jvd3NvYmVyLmNvbWA7XG5jb25zdCBURVNUX1BBU1NXT1JEID0gJ1NlY3VyZVBhc3MxMjMhJztcblxuLy8gQ29sb3JzIGZvciBvdXRwdXRcbmNvbnN0IGMgPSB7XG4gIHJlc2V0OiAnXFx4MWJbMG0nLFxuICBncmVlbjogJ1xceDFiWzMybScsXG4gIHJlZDogJ1xceDFiWzMxbScsXG4gIHllbGxvdzogJ1xceDFiWzMzbScsXG4gIGN5YW46ICdcXHgxYlszNm0nLFxuICBkaW06ICdcXHgxYlsybScsXG59O1xuXG4vLyBTdGF0ZSBzaGFyZWQgYWNyb3NzIHRlc3RzXG5jb25zdCBzdGF0ZToge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGV2ZW50SWQ/OiBzdHJpbmc7XG4gIGh1YklkPzogc3RyaW5nO1xuICBib29raW5nSWQ/OiBzdHJpbmc7XG4gIGNoYXRJZD86IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7XG59ID0ge1xuICBhY2Nlc3NUb2tlbjogJycsXG4gIHJlZnJlc2hUb2tlbjogJycsXG4gIHVzZXJJZDogJycsXG59O1xuXG4vLyBTdGF0c1xubGV0IHBhc3NlZCA9IDA7XG5sZXQgZmFpbGVkID0gMDtcblxuLy8gQ3JlYXRlIGF4aW9zIGNsaWVudFxuZnVuY3Rpb24gYXBpKHRva2VuPzogc3RyaW5nKTogQXhpb3NJbnN0YW5jZSB7XG4gIHJldHVybiBheGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkw6IEJBU0VfVVJMLFxuICAgIGhlYWRlcnM6IHRva2VuID8geyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCB9IDoge30sXG4gICAgdmFsaWRhdGVTdGF0dXM6ICgpID0+IHRydWUsXG4gIH0pO1xufVxuXG4vLyBUZXN0IHJ1bm5lclxuYXN5bmMgZnVuY3Rpb24gdGVzdChuYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmbigpO1xuICAgIGNvbnNvbGUubG9nKGAke2MuZ3JlZW59UEFTUyR7Yy5yZXNldH0gJHtuYW1lfSAke2MuZGltfSgke0RhdGUubm93KCkgLSBzdGFydH1tcykke2MucmVzZXR9YCk7XG4gICAgcGFzc2VkKys7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKGAke2MucmVkfUZBSUwke2MucmVzZXR9ICR7bmFtZX0gJHtjLmRpbX0oJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMpJHtjLnJlc2V0fWApO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Yy55ZWxsb3d9JHtlLm1lc3NhZ2V9JHtjLnJlc2V0fWApO1xuICAgIGZhaWxlZCsrO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBVbndyYXAgQVBJIHJlc3BvbnNlXG5mdW5jdGlvbiB1bndyYXA8VD4ocmVzOiB7IGRhdGE6IHsgZGF0YTogVCB9IH0pOiBUIHtcbiAgcmV0dXJuIHJlcy5kYXRhLmRhdGE7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRFU1RTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RzKCkge1xuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59JHsnPScucmVwZWF0KDYwKX0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0gIEdyb3dTb2JlciBBUEkgRTJFIFRlc3RzJHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmN5YW59JHsnPScucmVwZWF0KDYwKX0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfUJhc2UgVVJMOiAke0JBU0VfVVJMfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5kaW19VGVzdCBFbWFpbDogJHtURVNUX0VNQUlMfSR7Yy5yZXNldH1cXG5gKTtcblxuICAvLyBIZWFsdGggY2hlY2tcbiAgY29uc3QgaGVhbHRoID0gYXdhaXQgYXBpKCkuZ2V0KCcvaGVhbHRoJyk7XG4gIGlmIChoZWFsdGguc3RhdHVzICE9PSAyMDApIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjLnJlZH1BUEkgaXMgbm90IHJlYWNoYWJsZSR7Yy5yZXNldH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgY29uc29sZS5sb2coYCR7Yy5ncmVlbn1BUEkgaXMgaGVhbHRoeSR7Yy5yZXNldH1cXG5gKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFVVEhcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIEFVVEhFTlRJQ0FUSU9OIC0tLSR7Yy5yZXNldH1cXG5gKTtcblxuICBhd2FpdCB0ZXN0KCdSZWdpc3RlciBuZXcgdXNlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWdpc3RlcicsIHtcbiAgICAgIGVtYWlsOiBURVNUX0VNQUlMLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgICBuYW1lOiAnRTJFIFRlc3QgVXNlcicsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuYWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc1Rva2VuO1xuICAgIHN0YXRlLnJlZnJlc2hUb2tlbiA9IGRhdGEucmVmcmVzaFRva2VuO1xuICAgIHN0YXRlLnVzZXJJZCA9IGRhdGEudXNlci5pZDtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnTG9naW4gd2l0aCBlbWFpbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9sb2dpbicsIHtcbiAgICAgIGVtYWlsOiBURVNUX0VNQUlMLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmFjY2Vzc1Rva2VuID0gZGF0YS5hY2Nlc3NUb2tlbjtcbiAgICBzdGF0ZS5yZWZyZXNoVG9rZW4gPSBkYXRhLnJlZnJlc2hUb2tlbjtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnUmVmcmVzaCB0b2tlbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWZyZXNoJywge1xuICAgICAgcmVmcmVzaFRva2VuOiBzdGF0ZS5yZWZyZXNoVG9rZW4sXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuYWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc1Rva2VuO1xuICAgIHN0YXRlLnJlZnJlc2hUb2tlbiA9IGRhdGEucmVmcmVzaFRva2VuO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY3VycmVudCB1c2VyIChhdXRoL21lKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2F1dGgvbWUnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0ludmFsaWQgbG9naW4gcmV0dXJucyA0MDEnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkucG9zdCgnL2F1dGgvbG9naW4nLCB7XG4gICAgICBlbWFpbDogVEVTVF9FTUFJTCxcbiAgICAgIHBhc3N3b3JkOiAnV3JvbmdQYXNzd29yZCcsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCA0MDEsIGdvdCAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVNFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIFVTRVJTIC0tLSR7Yy5yZXNldH1cXG5gKTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY3VycmVudCB1c2VyIHByb2ZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy91c2Vycy9tZScpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnVXBkYXRlIHByb2ZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wdXQoJy91c2Vycy9tZScsIHtcbiAgICAgIG5hbWU6ICdVcGRhdGVkIEUyRSBVc2VyJyxcbiAgICAgIGJpbzogJ0UyRSB0ZXN0IGJpbycsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCB1c2VyIGJ5IElEJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvdXNlcnMvJHtzdGF0ZS51c2VySWR9YCk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgdXNlciBwdWJsaWMgcHJvZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL3VzZXJzLyR7c3RhdGUudXNlcklkfS9wdWJsaWNgKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRVZFTlRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufS0tLSBFVkVOVFMgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGF3YWl0IHRlc3QoJ0xpc3QgZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL2V2ZW50cycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHVwY29taW5nIGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoJy9ldmVudHMvdXBjb21pbmcnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0NyZWF0ZSBldmVudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoJy9ldmVudHMnLCB7XG4gICAgICB0aXRsZTogJ0UyRSBUZXN0IEV2ZW50JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQSB0ZXN0IGV2ZW50IGNyZWF0ZWQgYnkgRTJFIHRlc3RzJyxcbiAgICAgIHN0YXJ0RGF0ZTogbmV3IERhdGUoRGF0ZS5ub3coKSArIDcgKiAyNCAqIDYwICogNjAgKiAxMDAwKS50b0lTT1N0cmluZygpLCAvLyA3IGRheXMgZnJvbSBub3dcbiAgICAgIHRvdGFsU3BvdHM6IDIwLFxuICAgICAgbG9jYXRpb25OYW1lOiAnVGVzdCBMb2NhdGlvbicsXG4gICAgICBsb2NhdGlvbkFkZHJlc3M6ICcxMjMgVGVzdCBTdHJlZXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmV2ZW50SWQgPSBkYXRhLmlkO1xuICB9KTtcblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBldmVudCBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdVcGRhdGUgZXZlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnB1dChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9YCwge1xuICAgICAgICB0aXRsZTogJ0UyRSBUZXN0IEV2ZW50IChVcGRhdGVkKScsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnUHVibGlzaCBldmVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L3B1Ymxpc2hgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBteSBldmVudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2V2ZW50cy9teS1ldmVudHMnKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQk9PS0lOR1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIEJPT0tJTkdTIC0tLSR7Yy5yZXNldH1cXG5gKTtcblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ1JTVlAgdG8gZXZlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfS9ib29rYCk7XG4gICAgICAvLyAyMDEgZm9yIG5ldyBib29raW5nLCA0MDkgaWYgYWxyZWFkeSBleGlzdHNcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAgIHN0YXRlLmJvb2tpbmdJZCA9IGRhdGEuaWQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdHZXQgbXkgYm9va2luZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2Jvb2tpbmdzL21lJyk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVWRU5UIENIQVRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIEVWRU5UIENIQVQgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGlmIChzdGF0ZS5ldmVudElkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IG9yIGNyZWF0ZSBldmVudCBjaGF0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfS9jaGF0YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgc3RhdGUuY2hhdElkID0gZGF0YS5pZDtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0pvaW4gZXZlbnQgY2hhdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvam9pbmApO1xuICAgICAgLy8gMjAwIGZvciBqb2luLCA0MDMgaWYgbm8gYm9va2luZyAoYnV0IHdlIGp1c3QgYm9va2VkKVxuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdTZW5kIGNoYXQgbWVzc2FnZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvbWVzc2FnZXNgLCB7XG4gICAgICAgIGNvbnRlbnQ6ICdIZWxsbyBmcm9tIEUyRSB0ZXN0IScsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNoYXQgbWVzc2FnZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvbWVzc2FnZXNgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNoYXQgbWVtYmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vY2hhdC9tZW1iZXJzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdNYXJrIGNoYXQgYXMgcmVhZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvcmVhZGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIVUJTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufS0tLSBIVUJTIC0tLSR7Yy5yZXNldH1cXG5gKTtcblxuICBhd2FpdCB0ZXN0KCdMaXN0IGh1YnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvaHVicycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAvLyBHZXQgZmlyc3QgaHViIGlmIGV4aXN0c1xuICAgIGNvbnN0IGRhdGEgPSByZXMuZGF0YS5kYXRhO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgc3RhdGUuaHViSWQgPSBkYXRhWzBdLmlkO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHN0YXRlLmh1YklkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IGh1YiBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL2h1YnMvJHtzdGF0ZS5odWJJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0pvaW4gaHViJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvaHVicy8ke3N0YXRlLmh1YklkfS9qb2luYCk7XG4gICAgICAvLyAyMDAvMjAxIGZvciBqb2luLCA0MDkgaWYgYWxyZWFkeSBtZW1iZXJcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjAxICYmIHJlcy5zdGF0dXMgIT09IDQwOSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBodWIgbWVtYmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvaHVicy8ke3N0YXRlLmh1YklkfS9tZW1iZXJzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEpBQ0sgQUkgKFN1cHBvcnQgQ29udmVyc2F0aW9ucylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIEpBQ0sgQUkgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGF3YWl0IHRlc3QoJ1N0YXJ0IEphY2sgY29udmVyc2F0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL3N1cHBvcnQvamFjay9jb252ZXJzYXRpb25zL25ldycsIHtcbiAgICAgIG1lc3NhZ2U6ICdIZWxsbyBKYWNrIScsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSAmJiByZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmNvbnZlcnNhdGlvbklkID0gZGF0YS5jb252ZXJzYXRpb24/LmlkIHx8IGRhdGEuaWQ7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBKYWNrIGNvbnZlcnNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L2phY2svY29udmVyc2F0aW9ucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IEphY2sgY2hhdCBoaXN0b3J5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9qYWNrL2hpc3RvcnknKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS5jb252ZXJzYXRpb25JZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBKYWNrIGNvbnZlcnNhdGlvbiBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvc3VwcG9ydC9qYWNrL2NvbnZlcnNhdGlvbnMvJHtzdGF0ZS5jb252ZXJzYXRpb25JZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1VQUE9SVCAoQ2hlY2staW5zLCBXaW5zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gU1VQUE9SVCAtLS0ke2MucmVzZXR9XFxuYCk7XG5cbiAgYXdhaXQgdGVzdCgnQ3JlYXRlIGRhaWx5IGNoZWNrLWluJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL3N1cHBvcnQvY2hlY2staW5zJywge1xuICAgICAgZGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0sXG4gICAgICBtb29kOiA0LCAvLyBWYWxpZCByYW5nZSAxLTVcbiAgICAgIGVuZXJneTogNCwgLy8gVmFsaWQgcmFuZ2UgMS01XG4gICAgICBzdGF5ZWRTb2JlcjogdHJ1ZSxcbiAgICAgIG5vdGVzOiAnRTJFIHRlc3QgY2hlY2staW4nLFxuICAgIH0pO1xuICAgIC8vIDIwMSBmb3IgbmV3LCA0MDkgaWYgZXhpc3RzXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSAmJiByZXMuc3RhdHVzICE9PSA0MDkpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY2hlY2staW5zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9jaGVjay1pbnMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCB0b2RheSBjaGVjay1pbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvY2hlY2staW5zL3RvZGF5Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCAmJiByZXMuc3RhdHVzICE9PSA0MDQpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IGNoZWNrLWluIHN0cmVhaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvY2hlY2staW5zL3N0cmVhaycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnTG9nIGEgd2luJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL3N1cHBvcnQvd2lucycsIHtcbiAgICAgIHRpdGxlOiAnQ29tcGxldGVkIEUyRSB0ZXN0cycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1N1Y2Nlc3NmdWxseSByYW4gYWxsIEFQSSB0ZXN0cycsXG4gICAgICBjYXRlZ29yeTogJ1BFUlNPTkFMJywgLy8gVmFsaWQ6IFNPQlJJRVRZLCBIRUFMVEgsIFJFTEFUSU9OU0hJUCwgQ0FSRUVSLCBQRVJTT05BTCwgRklOQU5DSUFMLCBPVEhFUlxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgd2lucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvd2lucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHdpbnMgY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L3dpbnMvY291bnQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk9USUZJQ0FUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gTk9USUZJQ0FUSU9OUyAtLS0ke2MucmVzZXR9XFxuYCk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG5vdGlmaWNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9ub3RpZmljYXRpb25zJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgdW5yZWFkIGNvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvbm90aWZpY2F0aW9ucy91bnJlYWQtY291bnQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1VCU0NSSVBUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gU1VCU0NSSVBUSU9OUyAtLS0ke2MucmVzZXR9XFxuYCk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHN1YnNjcmlwdGlvbiBwbGFucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1YnNjcmlwdGlvbnMvcGxhbnMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBteSBzdWJzY3JpcHRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdWJzY3JpcHRpb25zL21lJyk7XG4gICAgLy8gMjAwIGlmIHN1YnNjcmliZWQsIDQwNCBpZiBub3RcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDQwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExJQlJBUllcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59LS0tIExJQlJBUlkgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBsaWJyYXJ5IGNvbnRlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9saWJyYXJ5Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgZmVhdHVyZWQgY29udGVudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2xpYnJhcnkvZmVhdHVyZWQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUFQXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufS0tLSBNQVAgLS0tJHtjLnJlc2V0fVxcbmApO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBtYXAgaHVicycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL21hcC9odWJzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgbWFwIGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL21hcC9ldmVudHMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ0xFQU5VUFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gQ0xFQU5VUCAtLS0ke2MucmVzZXR9XFxuYCk7XG5cbiAgaWYgKHN0YXRlLmJvb2tpbmdJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBib29raW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5kZWxldGUoYC9ib29raW5ncy8ke3N0YXRlLmJvb2tpbmdJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDQgJiYgcmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBldmVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NhbmNlbGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTVU1NQVJZXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufSR7Jz0nLnJlcGVhdCg2MCl9JHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmN5YW59ICBURVNUIFNVTU1BUlkke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0keyc9Jy5yZXBlYXQoNjApfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5ncmVlbn1QYXNzZWQ6ICR7cGFzc2VkfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5yZWR9RmFpbGVkOiAke2ZhaWxlZH0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGBUb3RhbDogICR7cGFzc2VkICsgZmFpbGVkfWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmN5YW59JHsnPScucmVwZWF0KDYwKX0ke2MucmVzZXR9XFxuYCk7XG5cbiAgcHJvY2Vzcy5leGl0KGZhaWxlZCA+IDAgPyAxIDogMCk7XG59XG5cbi8vIFJ1biB0ZXN0c1xucnVuVGVzdHMoKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiJdfQ==
1364
+ runTests().catch((e) => {
1365
+ console.error(`${c.red}Unexpected error:${c.reset}`, e);
1366
+ process.exit(1);
1367
+ });
1368
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTJlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2UyZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7Ozs7O0FBRUgsa0RBQTZDO0FBRTdDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLDhCQUE4QixDQUFDO0FBQ3ZFLE1BQU0sVUFBVSxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQztBQUNyRCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztBQUV2QyxvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLEdBQUc7SUFDUixLQUFLLEVBQUUsU0FBUztJQUNoQixLQUFLLEVBQUUsVUFBVTtJQUNqQixHQUFHLEVBQUUsVUFBVTtJQUNmLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUksRUFBRSxVQUFVO0lBQ2hCLEdBQUcsRUFBRSxTQUFTO0lBQ2QsSUFBSSxFQUFFLFNBQVM7Q0FDaEIsQ0FBQztBQUVGLDRCQUE0QjtBQUM1QixNQUFNLEtBQUssR0F1QlA7SUFDRixXQUFXLEVBQUUsRUFBRTtJQUNmLFlBQVksRUFBRSxFQUFFO0lBQ2hCLE1BQU0sRUFBRSxFQUFFO0NBQ1gsQ0FBQztBQUVGLFFBQVE7QUFDUixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFaEIsc0JBQXNCO0FBQ3RCLFNBQVMsR0FBRyxDQUFDLEtBQWM7SUFDekIsT0FBTyxlQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFVBQVUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFD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QyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxZQUFZLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsWUFBWSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLFlBQVksT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxZQUFZLE1BQU0sR0FBRyxNQUFNLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7SUFFdEQsb0JBQW9CO0lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxlQUFlLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVoQixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELFlBQVk7QUFDWixRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHcm93U29iZXIgQVBJIEUyRSBUZXN0c1xuICpcbiAqIFRlc3RzIGFsbCBTREsgZW5kcG9pbnRzIGFnYWluc3QgdGhlIHJlYWwgQVBJLlxuICogUnVuIHdpdGg6IG5weCB0cy1ub2RlIHNyYy9fX3Rlc3RzX18vZTJlLnRlc3QudHNcbiAqXG4gKiBDb3ZlcnM6XG4gKiAtIEF1dGhlbnRpY2F0aW9uXG4gKiAtIFVzZXJzXG4gKiAtIEV2ZW50cyAod2l0aCB2ZW51ZSwgY3JlYXRvciwgYnJhbmQgc3BvbnNvcilcbiAqIC0gQm9va2luZ3NcbiAqIC0gRXZlbnQgQ2hhdCAobmV3IHJvbGVzOiBBVFRFTkRFRSwgQ1JFQVRPUiwgVkVOVUVfUkVQLCBCUkFORF9SRVApXG4gKiAtIEh1YnNcbiAqIC0gVmVudWVzIChuZXcgLSByZXBsYWNlcyBidXNpbmVzc2VzKVxuICogLSBDcmVhdG9ycyAobmV3KVxuICogLSBCcmFuZHMgKG5ldylcbiAqIC0gVW5pZmllZCBSZXdhcmRzICh2ZW51ZSArIGJyYW5kIHJld2FyZHMpXG4gKiAtIExpYnJhcnkgKGNvbnRlbnQgd29ya2Zsb3cpXG4gKiAtIFN1cHBvcnQgKGNoZWNrLWlucywgd2lucywgSmFjayBBSSlcbiAqIC0gQ3JlYXRvciBQcm9kdWN0cyAoc2Vzc2lvbnMvcGFja2FnZXMgd2l0aCBib29raW5nIGZsb3cpXG4gKiAtIEJhZGdlcyAmIFJld2FyZHNcbiAqIC0gQmFkZ2UgQXdhcmRpbmcgKGJ1c2luZXNzIGxvZ2ljIHRlc3RzIGZvciBhdXRvbWF0aWMgYmFkZ2UgYXdhcmRpbmcpXG4gKiAgIC0gQ0hFQ0tfSU5fU1RSRUFLIGJhZGdlIG9uIGNoZWNrLWluXG4gKiAgIC0gV0lOU19MT0dHRUQgYmFkZ2Ugb24gbG9nZ2luZyB3aW5zXG4gKiAgIC0gTU9PRF9MT0dTX0NPVU5UIGJhZGdlIG9uIG1vb2QgbG9nZ2luZ1xuICogICAtIFJFRkxFQ1RJT05TX0NPVU5UIGJhZGdlIG9uIHN1Ym1pdHRpbmcgcmVmbGVjdGlvbnNcbiAqICAgLSBFVkVOVFNfSE9TVEVEIGJhZGdlIG9uIHB1Ymxpc2hpbmcgZXZlbnRzXG4gKiAgIC0gRVZFTlRTX0FUVEVOREVEIGJhZGdlIHByb2dyZXNzIHRyYWNraW5nXG4gKiAtIFJld2FyZCBGbG93IChmdWxsIHJlZGVtcHRpb24gbGlmZWN5Y2xlKVxuICogICAtIENyZWF0aW5nIHJld2FyZHMgZm9yIGJhZGdlcyAodmVudWUvYnJhbmQpXG4gKiAgIC0gVXNlciBlYXJucyBiYWRnZSAtPiByZXdhcmQgYmVjb21lcyBhdmFpbGFibGVcbiAqICAgLSBSZWRlZW0gcmV3YXJkIChnZXQgcmVkZW1wdGlvbiBkZXRhaWxzKVxuICogICAtIENhbm5vdCByZWRlZW0gd2l0aG91dCBiYWRnZVxuICogICAtIENhbm5vdCByZWRlZW0gdHdpY2UgKHBlciB1c2VyIGxpbWl0KVxuICogICAtIFJld2FyZCB2ZXJpZmljYXRpb24gZW5kcG9pbnRcbiAqL1xuXG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NJbnN0YW5jZSB9IGZyb20gJ2F4aW9zJztcblxuY29uc3QgQkFTRV9VUkwgPSBwcm9jZXNzLmVudi5BUElfVVJMIHx8ICdodHRwOi8vbG9jYWxob3N0OjMwMDEvYXBpL3YxJztcbmNvbnN0IFRFU1RfRU1BSUwgPSBgZTJlLSR7RGF0ZS5ub3coKX1AZ3Jvd3NvYmVyLmNvbWA7XG5jb25zdCBURVNUX1BBU1NXT1JEID0gJ1NlY3VyZVBhc3MxMjMhJztcblxuLy8gQ29sb3JzIGZvciBvdXRwdXRcbmNvbnN0IGMgPSB7XG4gIHJlc2V0OiAnXFx4MWJbMG0nLFxuICBncmVlbjogJ1xceDFiWzMybScsXG4gIHJlZDogJ1xceDFiWzMxbScsXG4gIHllbGxvdzogJ1xceDFiWzMzbScsXG4gIGN5YW46ICdcXHgxYlszNm0nLFxuICBkaW06ICdcXHgxYlsybScsXG4gIGJvbGQ6ICdcXHgxYlsxbScsXG59O1xuXG4vLyBTdGF0ZSBzaGFyZWQgYWNyb3NzIHRlc3RzXG5jb25zdCBzdGF0ZToge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGV2ZW50SWQ/OiBzdHJpbmc7XG4gIGh1YklkPzogc3RyaW5nO1xuICBib29raW5nSWQ/OiBzdHJpbmc7XG4gIGNoYXRJZD86IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7XG4gIC8vIE5ldyBzdGF0ZSBmb3IgcmVzdHJ1Y3R1cmVkIG1vZGVsc1xuICB2ZW51ZUlkPzogc3RyaW5nO1xuICBjcmVhdG9ySWQ/OiBzdHJpbmc7XG4gIGJyYW5kSWQ/OiBzdHJpbmc7XG4gIGF2YWlsYWJpbGl0eUlkPzogc3RyaW5nO1xuICByZXdhcmRJZD86IHN0cmluZztcbiAgYmFkZ2VJZD86IHN0cmluZztcbiAgY29udGVudElkPzogc3RyaW5nO1xuICAvLyBDcmVhdG9yIHByb2R1Y3RzXG4gIHByb2R1Y3RJZD86IHN0cmluZztcbiAgcHJvZHVjdEJvb2tpbmdJZD86IHN0cmluZztcbiAgLy8gU2Vjb25kIHVzZXIgZm9yIG93bmVyc2hpcCB0ZXN0c1xuICBzZWNvbmRVc2VyVG9rZW4/OiBzdHJpbmc7XG4gIHNlY29uZFVzZXJJZD86IHN0cmluZztcbn0gPSB7XG4gIGFjY2Vzc1Rva2VuOiAnJyxcbiAgcmVmcmVzaFRva2VuOiAnJyxcbiAgdXNlcklkOiAnJyxcbn07XG5cbi8vIFN0YXRzXG5sZXQgcGFzc2VkID0gMDtcbmxldCBmYWlsZWQgPSAwO1xubGV0IHNraXBwZWQgPSAwO1xuXG4vLyBDcmVhdGUgYXhpb3MgY2xpZW50XG5mdW5jdGlvbiBhcGkodG9rZW4/OiBzdHJpbmcpOiBBeGlvc0luc3RhbmNlIHtcbiAgcmV0dXJuIGF4aW9zLmNyZWF0ZSh7XG4gICAgYmFzZVVSTDogQkFTRV9VUkwsXG4gICAgaGVhZGVyczogdG9rZW4gPyB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gIH0gOiB7fSxcbiAgICB2YWxpZGF0ZVN0YXR1czogKCkgPT4gdHJ1ZSxcbiAgfSk7XG59XG5cbi8vIFRlc3QgcnVubmVyXG5hc3luYyBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGF3YWl0IGZuKCk7XG4gICAgY29uc29sZS5sb2coYCR7Yy5ncmVlbn1QQVNTJHtjLnJlc2V0fSAke25hbWV9ICR7Yy5kaW19KCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zKSR7Yy5yZXNldH1gKTtcbiAgICBwYXNzZWQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgY29uc29sZS5sb2coYCR7Yy5yZWR9RkFJTCR7Yy5yZXNldH0gJHtuYW1lfSAke2MuZGltfSgke0RhdGUubm93KCkgLSBzdGFydH1tcykke2MucmVzZXR9YCk7XG4gICAgY29uc29sZS5sb2coYCAgJHtjLnllbGxvd30ke2UubWVzc2FnZX0ke2MucmVzZXR9YCk7XG4gICAgZmFpbGVkKys7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIFNraXAgdGVzdCB3aXRoIHJlYXNvblxuZnVuY3Rpb24gc2tpcChuYW1lOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKGAke2MueWVsbG93fVNLSVAke2MucmVzZXR9ICR7bmFtZX0gJHtjLmRpbX0oJHtyZWFzb259KSR7Yy5yZXNldH1gKTtcbiAgc2tpcHBlZCsrO1xufVxuXG4vLyBVbndyYXAgQVBJIHJlc3BvbnNlIChoYW5kbGVzIGJvdGggd3JhcHBlZCBhbmQgdW53cmFwcGVkKVxuZnVuY3Rpb24gdW53cmFwPFQ+KHJlczogeyBkYXRhOiBhbnkgfSk6IFQge1xuICByZXR1cm4gcmVzLmRhdGE/LmRhdGEgIT09IHVuZGVmaW5lZCA/IHJlcy5kYXRhLmRhdGEgOiByZXMuZGF0YTtcbn1cblxuLy8gU2VjdGlvbiBoZWFkZXJcbmZ1bmN0aW9uIHNlY3Rpb24obmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKGBcXG4ke2MuY3lhbn0tLS0gJHtuYW1lfSAtLS0ke2MucmVzZXR9XFxuYCk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRFU1RTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RzKCkge1xuICBjb25zb2xlLmxvZyhgXFxuJHtjLmN5YW59JHsnPScucmVwZWF0KDcwKX0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0gIEdyb3dTb2JlciBBUEkgRTJFIFRlc3RzIC0gRnVsbCBDb3ZlcmFnZSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5jeWFufSR7Jz0nLnJlcGVhdCg3MCl9JHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmRpbX1CYXNlIFVSTDogJHtCQVNFX1VSTH0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfVRlc3QgRW1haWw6ICR7VEVTVF9FTUFJTH0ke2MucmVzZXR9XFxuYCk7XG5cbiAgLy8gSGVhbHRoIGNoZWNrXG4gIGNvbnN0IGhlYWx0aCA9IGF3YWl0IGFwaSgpLmdldCgnL2hlYWx0aCcpO1xuICBpZiAoaGVhbHRoLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgY29uc29sZS5sb2coYCR7Yy5yZWR9QVBJIGlzIG5vdCByZWFjaGFibGUgYXQgJHtCQVNFX1VSTH0ke2MucmVzZXR9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGNvbnNvbGUubG9nKGAke2MuZ3JlZW59QVBJIGlzIGhlYWx0aHkke2MucmVzZXR9XFxuYCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBVVRIXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQVVUSEVOVElDQVRJT04nKTtcblxuICBhd2FpdCB0ZXN0KCdSZWdpc3RlciBuZXcgdXNlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWdpc3RlcicsIHtcbiAgICAgIGVtYWlsOiBURVNUX0VNQUlMLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgICBuYW1lOiAnRTJFIFRlc3QgVXNlcicsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuYWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc1Rva2VuO1xuICAgIHN0YXRlLnJlZnJlc2hUb2tlbiA9IGRhdGEucmVmcmVzaFRva2VuO1xuICAgIHN0YXRlLnVzZXJJZCA9IGRhdGEudXNlci5pZDtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnTG9naW4gd2l0aCBlbWFpbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9sb2dpbicsIHtcbiAgICAgIGVtYWlsOiBURVNUX0VNQUlMLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmFjY2Vzc1Rva2VuID0gZGF0YS5hY2Nlc3NUb2tlbjtcbiAgICBzdGF0ZS5yZWZyZXNoVG9rZW4gPSBkYXRhLnJlZnJlc2hUb2tlbjtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnUmVmcmVzaCB0b2tlbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWZyZXNoJywge1xuICAgICAgcmVmcmVzaFRva2VuOiBzdGF0ZS5yZWZyZXNoVG9rZW4sXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuYWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc1Rva2VuO1xuICAgIHN0YXRlLnJlZnJlc2hUb2tlbiA9IGRhdGEucmVmcmVzaFRva2VuO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY3VycmVudCB1c2VyIChhdXRoL21lKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2F1dGgvbWUnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0ludmFsaWQgbG9naW4gcmV0dXJucyA0MDEnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkucG9zdCgnL2F1dGgvbG9naW4nLCB7XG4gICAgICBlbWFpbDogVEVTVF9FTUFJTCxcbiAgICAgIHBhc3N3b3JkOiAnV3JvbmdQYXNzd29yZCcsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCA0MDEsIGdvdCAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vIFJlZ2lzdGVyIHNlY29uZCB1c2VyIGZvciBvd25lcnNoaXAgdGVzdHNcbiAgYXdhaXQgdGVzdCgnUmVnaXN0ZXIgc2Vjb25kIHVzZXIgZm9yIG93bmVyc2hpcCB0ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5wb3N0KCcvYXV0aC9yZWdpc3RlcicsIHtcbiAgICAgIGVtYWlsOiBgZTJlLXNlY29uZC0ke0RhdGUubm93KCl9QGdyb3dzb2Jlci5jb21gLFxuICAgICAgcGFzc3dvcmQ6IFRFU1RfUEFTU1dPUkQsXG4gICAgICBuYW1lOiAnRTJFIFNlY29uZCBVc2VyJyxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgc3RhdGUuc2Vjb25kVXNlclRva2VuID0gZGF0YS5hY2Nlc3NUb2tlbjtcbiAgICBzdGF0ZS5zZWNvbmRVc2VySWQgPSBkYXRhLnVzZXIuaWQ7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVNFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBzZWN0aW9uKCdVU0VSUycpO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBjdXJyZW50IHVzZXIgcHJvZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3VzZXJzL21lJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdVcGRhdGUgcHJvZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnB1dCgnL3VzZXJzL21lJywge1xuICAgICAgbmFtZTogJ1VwZGF0ZWQgRTJFIFVzZXInLFxuICAgICAgYmlvOiAnRTJFIHRlc3QgYmlvJyxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHVzZXIgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC91c2Vycy8ke3N0YXRlLnVzZXJJZH1gKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCB1c2VyIHB1YmxpYyBwcm9maWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvdXNlcnMvJHtzdGF0ZS51c2VySWR9L3B1YmxpY2ApO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBWRU5VRVMgKE5ldyAtIHJlcGxhY2VzIEJ1c2luZXNzZXMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignVkVOVUVTJyk7XG5cbiAgYXdhaXQgdGVzdCgnTGlzdCB2ZW51ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvdmVudWVzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIC8vIEdldCBmaXJzdCB2ZW51ZSBpZiBleGlzdHMgZm9yIGZ1cnRoZXIgdGVzdHNcbiAgICBpZiAoZGF0YT8udmVudWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICBzdGF0ZS52ZW51ZUlkID0gZGF0YS52ZW51ZXNbMF0uaWQ7XG4gICAgfVxuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgZmVhdHVyZWQgdmVudWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL3ZlbnVlcy9mZWF0dXJlZCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG5lYXJieSB2ZW51ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvdmVudWVzL25lYXJieScsIHtcbiAgICAgIHBhcmFtczogeyBsYXQ6IDUxLjUwNzQsIGxvbmc6IC0wLjEyNzgsIHJhZGl1czogMTAgfSxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS52ZW51ZUlkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IHZlbnVlIGJ5IElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KGAvdmVudWVzLyR7c3RhdGUudmVudWVJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCB2ZW51ZSBvd25lcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL3ZlbnVlcy8ke3N0YXRlLnZlbnVlSWR9L293bmVyc2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IHZlbnVlIGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL3ZlbnVlcy8ke3N0YXRlLnZlbnVlSWR9L2V2ZW50c2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNraXAoJ0dldCB2ZW51ZSBieSBJRCcsICdObyB2ZW51ZXMgaW4gZGF0YWJhc2UnKTtcbiAgICBza2lwKCdHZXQgdmVudWUgb3duZXJzJywgJ05vIHZlbnVlcyBpbiBkYXRhYmFzZScpO1xuICAgIHNraXAoJ0dldCB2ZW51ZSBldmVudHMnLCAnTm8gdmVudWVzIGluIGRhdGFiYXNlJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENSRUFUT1JTIChOZXcpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQ1JFQVRPUlMnKTtcblxuICBhd2FpdCB0ZXN0KCdMaXN0IGNyZWF0b3JzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL2NyZWF0b3JzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdDcmVhdGUgY3JlYXRvciBwcm9maWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL2NyZWF0b3JzJywge1xuICAgICAgc2x1ZzogYGUyZS1jcmVhdG9yLSR7RGF0ZS5ub3coKX1gLFxuICAgICAgZGlzcGxheU5hbWU6ICdFMkUgVGVzdCBDcmVhdG9yJyxcbiAgICAgIGJpbzogJ0EgdGVzdCBjcmVhdG9yIGZvciBFMkUgdGVzdHMnLFxuICAgICAgY2FuRmFjaWxpdGF0ZTogdHJ1ZSxcbiAgICAgIGNhbkNyZWF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICBpc0luZmx1ZW5jZXI6IGZhbHNlLFxuICAgICAgc3BlY2lhbHRpZXM6IFsnbWVkaXRhdGlvbicsICdzb2JyaWV0eS1jb2FjaGluZyddLFxuICAgICAgY2VydGlmaWNhdGlvbnM6IFsnVGVzdCBDZXJ0IDEnXSxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBzdGF0ZS5jcmVhdG9ySWQgPSBkYXRhLmlkO1xuICB9KTtcblxuICBpZiAoc3RhdGUuY3JlYXRvcklkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBteSBjcmVhdG9yIHByb2ZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2NyZWF0b3JzL21lJyk7XG4gICAgICAvLyBSZXR1cm5zIDIwMCB3aXRoIG51bGwgb3IgY3JlYXRvciBkYXRhXG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdHZXQgY3JlYXRvciBieSB1c2VyIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9jcmVhdG9ycy91c2VyLyR7c3RhdGUudXNlcklkfWApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnVXBkYXRlIGNyZWF0b3IgcHJvZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucGF0Y2goYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH1gLCB7XG4gICAgICAgIGJpbzogJ1VwZGF0ZWQgYmlvIGZvciBFMkUgdGVzdGluZycsXG4gICAgICAgIHNlc3Npb25SYXRlOiA1MCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdBZGQgY3JlYXRvciBhdmFpbGFiaWxpdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vYXZhaWxhYmlsaXR5YCwge1xuICAgICAgICBkYXlPZldlZWs6IDEsIC8vIE1vbmRheVxuICAgICAgICBzdGFydFRpbWU6ICcwOTowMCcsXG4gICAgICAgIGVuZFRpbWU6ICcxNzowMCcsXG4gICAgICAgIHRpbWV6b25lOiAnRXVyb3BlL0xvbmRvbicsXG4gICAgICAgIGlzUmVjdXJyaW5nOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgc3RhdGUuYXZhaWxhYmlsaXR5SWQgPSBkYXRhLmlkO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgYXZhaWxhYmlsaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KGAvY3JlYXRvcnMvJHtzdGF0ZS5jcmVhdG9ySWR9L2F2YWlsYWJpbGl0eWApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgY29udGVudCAocHVibGlzaGVkKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfS9jb250ZW50YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdHZXQgY3JlYXRvciBldmVudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vZXZlbnRzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0IG93bmVyc2hpcCAtIHNlY29uZCB1c2VyIGNhbm5vdCB1cGRhdGVcbiAgICBhd2FpdCB0ZXN0KCdTZWNvbmQgdXNlciBjYW5ub3QgdXBkYXRlIGFub3RoZXIgY3JlYXRvciBwcm9maWxlICg0MDMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLnNlY29uZFVzZXJUb2tlbikucGF0Y2goYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH1gLCB7XG4gICAgICAgIGJpbzogJ0hhY2tlZCBiaW8nLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gNDAzKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDQwMywgZ290ICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ1JFQVRPUiBQUk9EVUNUUyAoU2Vzc2lvbnMvUGFja2FnZXMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQ1JFQVRPUiBQUk9EVUNUUycpO1xuXG4gIGlmIChzdGF0ZS5jcmVhdG9ySWQpIHtcbiAgICBhd2FpdCB0ZXN0KCdDcmVhdGUgY3JlYXRvciBwcm9kdWN0ICgxLW9uLTEgc2Vzc2lvbiknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vcHJvZHVjdHNgLCB7XG4gICAgICAgIHRpdGxlOiAnRTJFIFRlc3QgMS1vbi0xIFNlc3Npb24nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0EgdGVzdCBjb2FjaGluZyBzZXNzaW9uIGZvciBFMkUgdGVzdGluZycsXG4gICAgICAgIHR5cGU6ICdTRVNTSU9OXzFPTjEnLFxuICAgICAgICBwcmljZTogNTAwMCwgLy8gwqM1MCBpbiBwZW5jZVxuICAgICAgICBjdXJyZW5jeTogJ0dCUCcsXG4gICAgICAgIGR1cmF0aW9uTWludXRlczogNjAsXG4gICAgICAgIG1heFBhcnRpY2lwYW50czogMSxcbiAgICAgICAgZGVsaXZlcnlNZXRob2Q6ICdWSURFT19DQUxMJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAgIHN0YXRlLnByb2R1Y3RJZCA9IGRhdGEuaWQ7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdDcmVhdGUgc2Vjb25kIHByb2R1Y3QgKHdvcmtzaG9wKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfS9wcm9kdWN0c2AsIHtcbiAgICAgICAgdGl0bGU6ICdFMkUgVGVzdCBXb3Jrc2hvcCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQSBncm91cCB3b3Jrc2hvcCBmb3IgRTJFIHRlc3RpbmcnLFxuICAgICAgICB0eXBlOiAnV09SS1NIT1AnLFxuICAgICAgICBwcmljZTogMjUwMCwgLy8gwqMyNSBpbiBwZW5jZVxuICAgICAgICBjdXJyZW5jeTogJ0dCUCcsXG4gICAgICAgIGR1cmF0aW9uTWludXRlczogOTAsXG4gICAgICAgIG1heFBhcnRpY2lwYW50czogMTAsXG4gICAgICAgIGRlbGl2ZXJ5TWV0aG9kOiAnVklERU9fQ0FMTCcsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgcHJvZHVjdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfS9wcm9kdWN0c2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICBjb25zdCBwcm9kdWN0cyA9IGRhdGEucHJvZHVjdHMgfHwgZGF0YTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9kdWN0cykgfHwgcHJvZHVjdHMubGVuZ3RoIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGF0IGxlYXN0IDIgcHJvZHVjdHMgZm9yIGNyZWF0b3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChzdGF0ZS5wcm9kdWN0SWQpIHtcbiAgICAgIGF3YWl0IHRlc3QoJ0dldCBwcm9kdWN0IGJ5IElEIChwdWJsaWMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9wcm9kdWN0cy8ke3N0YXRlLnByb2R1Y3RJZH1gKTtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAgICAgaWYgKCFkYXRhLnRpdGxlIHx8ICFkYXRhLnByaWNlKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZXhwZWN0ZWQgcHJvZHVjdCBmaWVsZHMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0ZXN0KCdVcGRhdGUgcHJvZHVjdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wdXQoYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vcHJvZHVjdHMvJHtzdGF0ZS5wcm9kdWN0SWR9YCwge1xuICAgICAgICAgIHByaWNlOiA2MDAwLCAvLyBVcGRhdGUgdG8gwqM2MFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXBkYXRlZCBkZXNjcmlwdGlvbiBmb3IgRTJFIHRlc3RpbmcnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgICBpZiAoZGF0YS5wcmljZSAhPT0gNjAwMCkgdGhyb3cgbmV3IEVycm9yKCdQcmljZSBub3QgdXBkYXRlZCBjb3JyZWN0bHknKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZWNvbmQgdXNlciBib29rcyB0aGUgcHJvZHVjdFxuICAgICAgYXdhaXQgdGVzdCgnQm9vayBwcm9kdWN0IChhcyBzZWNvbmQgdXNlciknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgc2NoZWR1bGVkQXQuc2V0RGF0ZShzY2hlZHVsZWRBdC5nZXREYXRlKCkgKyAxNCk7IC8vIDIgd2Vla3MgZnJvbSBub3dcbiAgICAgICAgc2NoZWR1bGVkQXQuc2V0SG91cnMoMTAsIDAsIDAsIDApO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5zZWNvbmRVc2VyVG9rZW4pLnBvc3QoYC9wcm9kdWN0cy8ke3N0YXRlLnByb2R1Y3RJZH0vYm9va2AsIHtcbiAgICAgICAgICBzY2hlZHVsZWRBdDogc2NoZWR1bGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB0aW1lem9uZTogJ0V1cm9wZS9Mb25kb24nLFxuICAgICAgICAgIGNsaWVudE5vdGVzOiAnRTJFIHRlc3QgYm9va2luZycsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAgIHN0YXRlLnByb2R1Y3RCb29raW5nSWQgPSBkYXRhLmlkO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGF0ZS5wcm9kdWN0Qm9va2luZ0lkKSB7XG4gICAgICAgIGF3YWl0IHRlc3QoJ0dldCBwcm9kdWN0IGJvb2tpbmcgZGV0YWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuc2Vjb25kVXNlclRva2VuKS5nZXQoYC91c2Vycy9tZS9wcm9kdWN0LWJvb2tpbmdzLyR7c3RhdGUucHJvZHVjdEJvb2tpbmdJZH1gKTtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAgICAgaWYgKCFkYXRhLnNjaGVkdWxlZEF0IHx8ICFkYXRhLnN0YXR1cykgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJvb2tpbmcgZmllbGRzJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRlc3QoJ0dldCB1c2VyIHByb2R1Y3QgYm9va2luZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLnNlY29uZFVzZXJUb2tlbikuZ2V0KCcvdXNlcnMvbWUvcHJvZHVjdC1ib29raW5ncycpO1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAgICAgICBjb25zdCBib29raW5ncyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogKGRhdGEuZGF0YSB8fCBbXSk7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGJvb2tpbmdzKSB8fCBib29raW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIHByb2R1Y3QgYm9va2luZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGVzdCgnR2V0IGNyZWF0b3IgYm9va2luZ3MgKGFzIGNyZWF0b3IpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvY3JlYXRvcnMvJHtzdGF0ZS5jcmVhdG9ySWR9L3Byb2R1Y3RzL2Jvb2tpbmdzYCk7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgICAgIGNvbnN0IGJvb2tpbmdzID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiAoZGF0YS5kYXRhIHx8IFtdKTtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYm9va2luZ3MpIHx8IGJvb2tpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYm9va2luZyBmb3IgY3JlYXRvciBwcm9kdWN0cycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGVzdCgnVXBkYXRlIHByb2R1Y3QgYm9va2luZycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTY2hlZHVsZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgbmV3U2NoZWR1bGVkQXQuc2V0RGF0ZShuZXdTY2hlZHVsZWRBdC5nZXREYXRlKCkgKyAyMSk7IC8vIDMgd2Vla3MgZnJvbSBub3dcbiAgICAgICAgICBuZXdTY2hlZHVsZWRBdC5zZXRIb3VycygxNCwgMCwgMCwgMCk7XG5cbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuc2Vjb25kVXNlclRva2VuKS5wdXQoYC91c2Vycy9tZS9wcm9kdWN0LWJvb2tpbmdzLyR7c3RhdGUucHJvZHVjdEJvb2tpbmdJZH1gLCB7XG4gICAgICAgICAgICBzY2hlZHVsZWRBdDogbmV3U2NoZWR1bGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIGNsaWVudE5vdGVzOiAnUmVzY2hlZHVsZWQgLSBFMkUgdGVzdCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBwcm9kdWN0IGJvb2tpbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLnNlY29uZFVzZXJUb2tlbikuZGVsZXRlKGAvdXNlcnMvbWUvcHJvZHVjdC1ib29raW5ncy8ke3N0YXRlLnByb2R1Y3RCb29raW5nSWR9YCwge1xuICAgICAgICAgICAgZGF0YTogeyByZWFzb246ICdFMkUgdGVzdCBjbGVhbnVwJyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjA0KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWNvbmQgdXNlciBjYW5ub3QgZGVsZXRlIGNyZWF0b3IncyBwcm9kdWN0XG4gICAgICBhd2FpdCB0ZXN0KCdTZWNvbmQgdXNlciBjYW5ub3QgZGVsZXRlIHByb2R1Y3QgKDQwMyknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5zZWNvbmRVc2VyVG9rZW4pLmRlbGV0ZShgL2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfS9wcm9kdWN0cy8ke3N0YXRlLnByb2R1Y3RJZH1gKTtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMykgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCA0MDMsIGdvdCAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcCgnQ3JlYXRlIGNyZWF0b3IgcHJvZHVjdCcsICdObyBjcmVhdG9yIElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0NyZWF0ZSBzZWNvbmQgcHJvZHVjdCcsICdObyBjcmVhdG9yIElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0dldCBjcmVhdG9yIHByb2R1Y3RzJywgJ05vIGNyZWF0b3IgSUQgYXZhaWxhYmxlJyk7XG4gICAgc2tpcCgnR2V0IHByb2R1Y3QgYnkgSUQnLCAnTm8gcHJvZHVjdCBJRCBhdmFpbGFibGUnKTtcbiAgICBza2lwKCdVcGRhdGUgcHJvZHVjdCcsICdObyBwcm9kdWN0IElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0Jvb2sgcHJvZHVjdCcsICdObyBwcm9kdWN0IElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0dldCBwcm9kdWN0IGJvb2tpbmcgZGV0YWlscycsICdObyBib29raW5nIElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ0dldCB1c2VyIHByb2R1Y3QgYm9va2luZ3MnLCAnTm8gYm9va2luZyBJRCBhdmFpbGFibGUnKTtcbiAgICBza2lwKCdHZXQgY3JlYXRvciBib29raW5ncycsICdObyBib29raW5nIElEIGF2YWlsYWJsZScpO1xuICAgIHNraXAoJ1VwZGF0ZSBwcm9kdWN0IGJvb2tpbmcnLCAnTm8gYm9va2luZyBJRCBhdmFpbGFibGUnKTtcbiAgICBza2lwKCdDYW5jZWwgcHJvZHVjdCBib29raW5nJywgJ05vIGJvb2tpbmcgSUQgYXZhaWxhYmxlJyk7XG4gICAgc2tpcCgnU2Vjb25kIHVzZXIgY2Fubm90IGRlbGV0ZSBwcm9kdWN0JywgJ05vIHByb2R1Y3QgSUQgYXZhaWxhYmxlJyk7XG4gIH1cblxuICAvLyBUZXN0IHB1YmxpYyBwcm9kdWN0cyBsaXN0aW5nXG4gIGF3YWl0IHRlc3QoJ0xpc3QgYWxsIHB1YmxpYyBwcm9kdWN0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoJy9wcm9kdWN0cycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAvLyBNYXkgaGF2ZSBwcm9kdWN0cyBhcnJheSBvciBwYWdpbmF0ZWQgcmVzcG9uc2VcbiAgICBjb25zdCBwcm9kdWN0cyA9IGRhdGEucHJvZHVjdHMgfHwgZGF0YTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvZHVjdHMpKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHByb2R1Y3RzIGFycmF5Jyk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQlJBTkRTIChOZXcpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQlJBTkRTJyk7XG5cbiAgYXdhaXQgdGVzdCgnTGlzdCBicmFuZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvYnJhbmRzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgZmVhdHVyZWQgYnJhbmRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL2JyYW5kcy9mZWF0dXJlZCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnQ3JlYXRlIGJyYW5kJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL2JyYW5kcycsIHtcbiAgICAgIHNsdWc6IGBlMmUtYnJhbmQtJHtEYXRlLm5vdygpfWAsXG4gICAgICBuYW1lOiAnRTJFIFRlc3QgQnJhbmQnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIHRlc3QgYnJhbmQgZm9yIEUyRSB0ZXN0aW5nJyxcbiAgICAgIHdlYnNpdGU6ICdodHRwczovL2V4YW1wbGUuY29tJyxcbiAgICAgIGVtYWlsOiAnYnJhbmRAZXhhbXBsZS5jb20nLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmJyYW5kSWQgPSBkYXRhLmlkO1xuICB9KTtcblxuICBpZiAoc3RhdGUuYnJhbmRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBicmFuZCBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldChgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdVcGRhdGUgYnJhbmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBhdGNoKGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH1gLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBkYXRlZCBicmFuZCBkZXNjcmlwdGlvbicsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGJyYW5kIG93bmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH0vb3duZXJzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgc2Vjb25kIHVzZXIgYXMgYnJhbmQgbWFuYWdlclxuICAgIGF3YWl0IHRlc3QoJ0FkZCBicmFuZCBvd25lciAobWFuYWdlciByb2xlKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9L293bmVyc2AsIHtcbiAgICAgICAgdXNlcklkOiBzdGF0ZS5zZWNvbmRVc2VySWQsXG4gICAgICAgIHJvbGU6ICdNQU5BR0VSJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBNYW5hZ2VyIGNhbiB1cGRhdGUgYnJhbmRcbiAgICBhd2FpdCB0ZXN0KCdNYW5hZ2VyIGNhbiB1cGRhdGUgYnJhbmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuc2Vjb25kVXNlclRva2VuKS5wYXRjaChgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9YCwge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwZGF0ZWQgYnkgbWFuYWdlcicsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGJyYW5kIGNyZWF0b3JzIChwYXJ0bmVyc2hpcHMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9icmFuZHMvJHtzdGF0ZS5icmFuZElkfS9jcmVhdG9yc2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGNyZWF0b3IgcGFydG5lcnNoaXAgaWYgY3JlYXRvciBleGlzdHNcbiAgICBpZiAoc3RhdGUuY3JlYXRvcklkKSB7XG4gICAgICBhd2FpdCB0ZXN0KCdBZGQgY3JlYXRvciBwYXJ0bmVyc2hpcCB0byBicmFuZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH0vY3JlYXRvcnNgLCB7XG4gICAgICAgICAgY3JlYXRvcklkOiBzdGF0ZS5jcmVhdG9ySWQsXG4gICAgICAgICAgY29tbWlzc2lvblJhdGU6IDAuMTUsXG4gICAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0ZXN0KCdVcGRhdGUgY3JlYXRvciBwYXJ0bmVyc2hpcCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wYXRjaChcbiAgICAgICAgICBgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9L2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29tbWlzc2lvblJhdGU6IDAuMjAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRlc3QoJ0dldCBicmFuZCBzcG9uc29yZWQgZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH0vZXZlbnRzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIG1hbmFnZXJcbiAgICBhd2FpdCB0ZXN0KCdSZW1vdmUgYnJhbmQgb3duZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmRlbGV0ZShcbiAgICAgICAgYC9icmFuZHMvJHtzdGF0ZS5icmFuZElkfS9vd25lcnMvJHtzdGF0ZS5zZWNvbmRVc2VySWR9YFxuICAgICAgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjA0KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBTZWNvbmQgdXNlciBzaG91bGQgbm93IGJlIGZvcmJpZGRlblxuICAgIGF3YWl0IHRlc3QoJ1JlbW92ZWQgb3duZXIgY2Fubm90IGFjY2VzcyBicmFuZCAoNDAzKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5zZWNvbmRVc2VyVG9rZW4pLnBhdGNoKGAvYnJhbmRzLyR7c3RhdGUuYnJhbmRJZH1gLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2hvdWxkIGZhaWwnLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gNDAzKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDQwMywgZ290ICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRVZFTlRTICh3aXRoIG5ldyBmaWVsZHM6IHZlbnVlSWQsIGNyZWF0b3JJZCwgc3BvbnNvckJyYW5kSWQsIGdhdGhlcmluZ1R5cGUpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignRVZFTlRTJyk7XG5cbiAgYXdhaXQgdGVzdCgnTGlzdCBldmVudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvZXZlbnRzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgdXBjb21pbmcgZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaSgpLmdldCgnL2V2ZW50cy91cGNvbWluZycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnQ3JlYXRlIGV2ZW50IHdpdGggY3JlYXRvciBhbmQgYnJhbmQgc3BvbnNvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBldmVudERhdGE6IGFueSA9IHtcbiAgICAgIHRpdGxlOiAnRTJFIFRlc3QgRXZlbnQnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIHRlc3QgZXZlbnQgY3JlYXRlZCBieSBFMkUgdGVzdHMnLFxuICAgICAgc3RhcnREYXRlOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgNyAqIDI0ICogNjAgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICB0b3RhbFNwb3RzOiAyMCxcbiAgICAgIGxvY2F0aW9uTmFtZTogJ1Rlc3QgTG9jYXRpb24nLFxuICAgICAgbG9jYXRpb25BZGRyZXNzOiAnMTIzIFRlc3QgU3RyZWV0JyxcbiAgICAgIGdhdGhlcmluZ1R5cGU6ICdGQUNJTElUQVRPUl9MRUQnLFxuICAgIH07XG5cbiAgICAvLyBBZGQgY3JlYXRvciBhbmQgYnJhbmQgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHN0YXRlLmNyZWF0b3JJZCkgZXZlbnREYXRhLmNyZWF0b3JJZCA9IHN0YXRlLmNyZWF0b3JJZDtcbiAgICBpZiAoc3RhdGUuYnJhbmRJZCkgZXZlbnREYXRhLnNwb25zb3JCcmFuZElkID0gc3RhdGUuYnJhbmRJZDtcbiAgICBpZiAoc3RhdGUudmVudWVJZCkgZXZlbnREYXRhLnZlbnVlSWQgPSBzdGF0ZS52ZW51ZUlkO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvZXZlbnRzJywgZXZlbnREYXRhKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHJlcy5kYXRhKX1gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBzdGF0ZS5ldmVudElkID0gZGF0YS5pZDtcbiAgfSk7XG5cbiAgaWYgKHN0YXRlLmV2ZW50SWQpIHtcbiAgICBhd2FpdCB0ZXN0KCdHZXQgZXZlbnQgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfWApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAvLyBWZXJpZnkgbmV3IGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgaWYgKCEoJ2dhdGhlcmluZ1R5cGUnIGluIGRhdGEpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZ2F0aGVyaW5nVHlwZSBmaWVsZCcpO1xuICAgICAgaWYgKCEoJ3ZlbnVlSWQnIGluIGRhdGEpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdmVudWVJZCBmaWVsZCcpO1xuICAgICAgaWYgKCEoJ2NyZWF0b3JJZCcgaW4gZGF0YSkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBjcmVhdG9ySWQgZmllbGQnKTtcbiAgICAgIGlmICghKCdzcG9uc29yQnJhbmRJZCcgaW4gZGF0YSkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBzcG9uc29yQnJhbmRJZCBmaWVsZCcpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnVXBkYXRlIGV2ZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wdXQoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfWAsIHtcbiAgICAgICAgdGl0bGU6ICdFMkUgVGVzdCBFdmVudCAoVXBkYXRlZCknLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwZGF0ZWQgZGVzY3JpcHRpb24gZm9yIEUyRSB0ZXN0aW5nJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdQdWJsaXNoIGV2ZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vcHVibGlzaGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IG15IGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvZXZlbnRzL215LWV2ZW50cycpO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCT09LSU5HU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0JPT0tJTkdTJyk7XG5cbiAgaWYgKHN0YXRlLmV2ZW50SWQpIHtcbiAgICBhd2FpdCB0ZXN0KCdSU1ZQIHRvIGV2ZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vYm9va2ApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSAmJiByZXMuc3RhdHVzICE9PSA0MDkpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICAgIHN0YXRlLmJvb2tpbmdJZCA9IGRhdGEuaWQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdHZXQgbXkgYm9va2luZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2Jvb2tpbmdzL21lJyk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVWRU5UIENIQVQgKE5ldyByb2xlczogQVRURU5ERUUsIENSRUFUT1IsIFZFTlVFX1JFUCwgQlJBTkRfUkVQKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0VWRU5UIENIQVQnKTtcblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBvciBjcmVhdGUgZXZlbnQgY2hhdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vY2hhdGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZXMuZGF0YSl9YCk7XG4gICAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAgIHN0YXRlLmNoYXRJZCA9IGRhdGEuaWQ7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdKb2luIGV2ZW50IGNoYXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfS9jaGF0L2pvaW5gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ1NlbmQgY2hhdCBtZXNzYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vY2hhdC9tZXNzYWdlc2AsIHtcbiAgICAgICAgY29udGVudDogJ0hlbGxvIGZyb20gRTJFIHRlc3QhJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGVzdCgnR2V0IGNoYXQgbWVzc2FnZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NoYXQvbWVzc2FnZXNgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBjaGF0IG1lbWJlcnMgKGNoZWNrIGZvciBuZXcgcm9sZXMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9ldmVudHMvJHtzdGF0ZS5ldmVudElkfS9jaGF0L21lbWJlcnNgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgICAgLy8gVmVyaWZ5IG1lbWJlcnMgaGF2ZSByb2xlIGZpZWxkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdmFsaWRSb2xlcyA9IFsnQVRURU5ERUUnLCAnQ1JFQVRPUicsICdWRU5VRV9SRVAnLCAnQlJBTkRfUkVQJywgJ01PREVSQVRPUicsICdBRE1JTiddO1xuICAgICAgICBjb25zdCBtZW1iZXIgPSBkYXRhWzBdO1xuICAgICAgICBpZiAoIXZhbGlkUm9sZXMuaW5jbHVkZXMobWVtYmVyLnJvbGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJvbGU6ICR7bWVtYmVyLnJvbGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ01hcmsgY2hhdCBhcyByZWFkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvZXZlbnRzLyR7c3RhdGUuZXZlbnRJZH0vY2hhdC9yZWFkYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjA0KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJBREdFUyAmIFVOSUZJRUQgUkVXQVJEU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0JBREdFUyAmIFVOSUZJRUQgUkVXQVJEUycpO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBhbGwgYmFkZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvYmFkZ2VzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgc3RhdGUuYmFkZ2VJZCA9IGRhdGFbMF0uaWQ7XG4gICAgfVxuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgbXkgYmFkZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvYmFkZ2VzL3VzZXJzL21lL2JhZGdlcycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG5leHQgYmFkZ2VzICh3aXRoIHByb2dyZXNzKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2JhZGdlcy9uZXh0Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgYXZhaWxhYmxlIHJld2FyZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9yZXdhcmRzL2F2YWlsYWJsZScpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHJld2FyZHMgd2FsbGV0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvcmV3YXJkcy93YWxsZXQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gVmVyaWZ5IHdhbGxldCBzdHJ1Y3R1cmUgLSBiYWRnZXMgbWF5IGJlIGVtcHR5IGFycmF5IGZvciBuZXcgdXNlcnNcbiAgICBpZiAoZGF0YS5iYWRnZXMgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJhZGdlcyBpbiB3YWxsZXQnKTtcbiAgICBpZiAoZGF0YS5zdGF0cyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc3RhdHMgaW4gd2FsbGV0Jyk7XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS5iYWRnZUlkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IHJld2FyZHMgZm9yIGJhZGdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9yZXdhcmRzL2JhZGdlLyR7c3RhdGUuYmFkZ2VJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZS52ZW51ZUlkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IHJld2FyZHMgZm9yIHZlbnVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9yZXdhcmRzL3ZlbnVlLyR7c3RhdGUudmVudWVJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5icmFuZElkKSB7XG4gICAgYXdhaXQgdGVzdCgnR2V0IHJld2FyZHMgZm9yIGJyYW5kJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9yZXdhcmRzL2JyYW5kLyR7c3RhdGUuYnJhbmRJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSFVCU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0hVQlMnKTtcblxuICBhd2FpdCB0ZXN0KCdMaXN0IGh1YnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKCkuZ2V0KCcvaHVicycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0YXRlLmh1YklkID0gZGF0YVswXS5pZDtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS5odWJJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBodWIgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoKS5nZXQoYC9odWJzLyR7c3RhdGUuaHViSWR9YCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0ZXN0KCdKb2luIGh1YicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2h1YnMvJHtzdGF0ZS5odWJJZH0vam9pbmApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCAmJiByZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IHRlc3QoJ0dldCBodWIgbWVtYmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KGAvaHVicy8ke3N0YXRlLmh1YklkfS9tZW1iZXJzYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExJQlJBUlkgKENvbnRlbnQgd29ya2Zsb3cpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignTElCUkFSWScpO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBsaWJyYXJ5IGNvbnRlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9saWJyYXJ5Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgZmVhdHVyZWQgY29udGVudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2xpYnJhcnkvZmVhdHVyZWQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vIENvbnRlbnQgd29ya2Zsb3cgdGVzdHMgKGlmIGNyZWF0b3IgZXhpc3RzKVxuICBpZiAoc3RhdGUuY3JlYXRvcklkKSB7XG4gICAgLy8gTm90ZTogL2xpYnJhcnkvY3JlYXRvci86aWQgZW5kcG9pbnQgbm90IGltcGxlbWVudGVkIHlldFxuICAgIC8vIHNraXAoJ0dldCBjb250ZW50IGJ5IGNyZWF0b3InLCAnRW5kcG9pbnQgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEpBQ0sgQUkgKFN1cHBvcnQgQ29udmVyc2F0aW9ucylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBzZWN0aW9uKCdKQUNLIEFJJyk7XG5cbiAgYXdhaXQgdGVzdCgnU3RhcnQgSmFjayBjb252ZXJzYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvc3VwcG9ydC9qYWNrL2NvbnZlcnNhdGlvbnMvbmV3Jywge1xuICAgICAgbWVzc2FnZTogJ0hlbGxvIEphY2shJyxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxICYmIHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIHN0YXRlLmNvbnZlcnNhdGlvbklkID0gZGF0YS5jb252ZXJzYXRpb24/LmlkIHx8IGRhdGEuaWQ7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBKYWNrIGNvbnZlcnNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L2phY2svY29udmVyc2F0aW9ucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IEphY2sgY2hhdCBoaXN0b3J5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9qYWNrL2hpc3RvcnknKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGlmIChzdGF0ZS5jb252ZXJzYXRpb25JZCkge1xuICAgIGF3YWl0IHRlc3QoJ0dldCBKYWNrIGNvbnZlcnNhdGlvbiBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KFxuICAgICAgICBgL3N1cHBvcnQvamFjay9jb252ZXJzYXRpb25zLyR7c3RhdGUuY29udmVyc2F0aW9uSWR9YFxuICAgICAgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1VQUE9SVCAoQ2hlY2staW5zLCBXaW5zKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ1NVUFBPUlQnKTtcblxuICBhd2FpdCB0ZXN0KCdDcmVhdGUgZGFpbHkgY2hlY2staW4nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvc3VwcG9ydC9jaGVjay1pbnMnLCB7XG4gICAgICBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSxcbiAgICAgIG1vb2Q6IDQsXG4gICAgICBlbmVyZ3k6IDQsXG4gICAgICBzdGF5ZWRTb2JlcjogdHJ1ZSxcbiAgICAgIG5vdGVzOiAnRTJFIHRlc3QgY2hlY2staW4nLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBjaGVjay1pbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L2NoZWNrLWlucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHRvZGF5IGNoZWNrLWluJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9jaGVjay1pbnMvdG9kYXknKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDQwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgY2hlY2staW4gc3RyZWFrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9jaGVjay1pbnMvc3RyZWFrJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdMb2cgYSB3aW4nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvc3VwcG9ydC93aW5zJywge1xuICAgICAgdGl0bGU6ICdDb21wbGV0ZWQgRTJFIHRlc3RzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU3VjY2Vzc2Z1bGx5IHJhbiBhbGwgQVBJIHRlc3RzJyxcbiAgICAgIGNhdGVnb3J5OiAnUEVSU09OQUwnLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IHdpbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L3dpbnMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCB3aW5zIGNvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC93aW5zL2NvdW50Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5PVElGSUNBVElPTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBzZWN0aW9uKCdOT1RJRklDQVRJT05TJyk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG5vdGlmaWNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9ub3RpZmljYXRpb25zJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgdW5yZWFkIGNvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvbm90aWZpY2F0aW9ucy91bnJlYWQtY291bnQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU1VCU0NSSVBUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ1NVQlNDUklQVElPTlMnKTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgc3Vic2NyaXB0aW9uIHBsYW5zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3Vic2NyaXB0aW9ucy9wbGFucycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgfSk7XG5cbiAgYXdhaXQgdGVzdCgnR2V0IG15IHN1YnNjcmlwdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1YnNjcmlwdGlvbnMvbWUnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDQwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1BUFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ01BUCcpO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBtYXAgaHVicycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL21hcC9odWJzJyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdHZXQgbWFwIGV2ZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL21hcC9ldmVudHMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQkFER0UgQVdBUkRJTkcgKEJ1c2luZXNzIExvZ2ljIFRlc3RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHNlY3Rpb24oJ0JBREdFIEFXQVJESU5HJyk7XG5cbiAgLy8gVGVzdCBiYWRnZSBwcm9ncmVzcyB0cmFja2luZyBhZnRlciBhY3Rpb25zXG4gIC8vIE5vdGU6IFRoZXNlIHRlc3RzIHZlcmlmeSB0aGUgYmFkZ2UgYXdhcmRpbmcgaW50ZWdyYXRpb24gd29ya3MgY29ycmVjdGx5LlxuICAvLyBBY3R1YWwgYmFkZ2UgZWFybmluZyBkZXBlbmRzIG9uIHRocmVzaG9sZHMgaW4gc2VlZCBkYXRhLlxuXG4gIC8vIEdldCBpbml0aWFsIGJhZGdlIHN0YXRlXG4gIGxldCBpbml0aWFsQmFkZ2VDb3VudCA9IDA7XG4gIGxldCBpbml0aWFsQmFkZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCBpbml0aWFsIHVzZXIgYmFkZ2VzIGJlZm9yZSBiYWRnZSB0ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2JhZGdlcy91c2Vycy9tZS9iYWRnZXMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgaW5pdGlhbEJhZGdlQ291bnQgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YS5sZW5ndGggOiAwO1xuICAgIGluaXRpYWxCYWRnZXMgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YS5tYXAoKGI6IGFueSkgPT4gYi5iYWRnZUlkKSA6IFtdO1xuICB9KTtcblxuICAvLyBDaGVjay1pbiBTdHJlYWsgQmFkZ2UgVGVzdHNcbiAgYXdhaXQgdGVzdCgnQ2hlY2staW4gdXBkYXRlcyBzdHJlYWsgYW5kIHRyaWdnZXJzIGJhZGdlIGNoZWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIENyZWF0ZSBhIGNoZWNrLWluIGZvciBhIHByZXZpb3VzIGRheSAodG8gdGVzdCBzdHJlYWsgbG9naWMpXG4gICAgY29uc3QgeWVzdGVyZGF5ID0gbmV3IERhdGUoKTtcbiAgICB5ZXN0ZXJkYXkuc2V0RGF0ZSh5ZXN0ZXJkYXkuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgY29uc3QgeWVzdGVyZGF5U3RyID0geWVzdGVyZGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdCgnL3N1cHBvcnQvY2hlY2staW5zJywge1xuICAgICAgZGF0ZTogeWVzdGVyZGF5U3RyLFxuICAgICAgbW9vZDogNCxcbiAgICAgIGVuZXJneTogMyxcbiAgICAgIHN0YXllZFNvYmVyOiB0cnVlLFxuICAgICAgbm90ZXM6ICdCYWRnZSB0ZXN0IGNoZWNrLWluJyxcbiAgICB9KTtcbiAgICAvLyBBY2NlcHQgMjAxIChjcmVhdGVkKSBvciA0MDkgKGFscmVhZHkgZXhpc3RzIC0gcmUtcnVubmluZyB0ZXN0KVxuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ1ZlcmlmeSBzdHJlYWsgaXMgdHJhY2tlZCBhZnRlciBjaGVjay1pbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvY2hlY2staW5zL3N0cmVhaycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAvLyBTaG91bGQgaGF2ZSBhdCBsZWFzdCAxIGNoZWNrLWluIG5vdyAoZnJvbSBlYXJsaWVyIHRlc3QpXG4gICAgaWYgKGRhdGEudG90YWxDaGVja0lucyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdG90YWxDaGVja0lucyBpbiBzdHJlYWsgZGF0YScpO1xuICB9KTtcblxuICAvLyBXaW5zIEJhZGdlIFRlc3RzXG4gIGF3YWl0IHRlc3QoJ0xvZyB3aW4gdXBkYXRlcyBjb3VudCBhbmQgdHJpZ2dlcnMgYmFkZ2UgY2hlY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KCcvc3VwcG9ydC93aW5zJywge1xuICAgICAgdGl0bGU6ICdCYWRnZSBhd2FyZGluZyB0ZXN0IHdpbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1Rlc3RpbmcgdGhhdCBsb2dnaW5nIHdpbnMgdHJpZ2dlcnMgYmFkZ2UgY2hlY2snLFxuICAgICAgY2F0ZWdvcnk6ICdQRVJTT05BTCcsIC8vIFZhbGlkIFdpbkNhdGVnb3J5IGVudW0gdmFsdWVcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ1ZlcmlmeSB3aW5zIGNvdW50IGlzIHRyYWNrZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9zdXBwb3J0L3dpbnMvY291bnQnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gU2hvdWxkIGhhdmUgdG90YWxXaW5zIG9yIGNvdW50XG4gICAgaWYgKGRhdGEudG90YWxXaW5zID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRhdGEgIT09ICdudW1iZXInICYmIGRhdGEuY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB3aW5zIGNvdW50IGluIHJlc3BvbnNlJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBNb29kIExvZyBCYWRnZSBUZXN0c1xuICBhd2FpdCB0ZXN0KCdMb2cgbW9vZCB1cGRhdGVzIGNvdW50IGFuZCB0cmlnZ2VycyBiYWRnZSBjaGVjaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoJy9zdXBwb3J0L21vb2QtbG9ncycsIHtcbiAgICAgIG1vb2Q6IDQsIC8vIFJlcXVpcmVkIGZpZWxkICgxLTUpXG4gICAgICBlbmVyZ3k6IDMsIC8vIE9wdGlvbmFsICgxLTUpXG4gICAgICB0YWdzOiBbJ2hvcGVmdWwnXSwgLy8gT3B0aW9uYWwgYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgbm90ZTogJ0JhZGdlIHRlc3QgbW9vZCBsb2cnLCAvLyBPcHRpb25hbCBub3RlXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMSkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdWZXJpZnkgbW9vZCBsb2dzIGFyZSB0cmFja2VkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvc3VwcG9ydC9tb29kLWxvZ3MnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gSGFuZGxlIGJvdGggYXJyYXkgYW5kIHsgZGF0YTogYXJyYXkgfSBmb3JtYXRzXG4gICAgY29uc3QgbG9ncyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogKGRhdGEuZGF0YSB8fCBkYXRhLm1vb2RMb2dzIHx8IFtdKTtcbiAgICAvLyBTaG91bGQgaGF2ZSBhdCBsZWFzdCAxIG1vb2QgbG9nXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxvZ3MpIHx8IGxvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGF0IGxlYXN0IG9uZSBtb29kIGxvZycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUmVmbGVjdGlvbiBCYWRnZSBUZXN0c1xuICBhd2FpdCB0ZXN0KCdTdWJtaXQgcmVmbGVjdGlvbiB1cGRhdGVzIGNvdW50IGFuZCB0cmlnZ2VycyBiYWRnZSBjaGVjaycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBDYWxjdWxhdGUgd2Vla1N0YXJ0IC0gbmVlZHMgdG8gYmUgYSBNb25kYXkgaW4gWVlZWS1NTS1ERCBmb3JtYXRcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IG5vdy5nZXREYXkoKTtcbiAgICBjb25zdCBkYXlzVG9Nb25kYXkgPSBkYXlPZldlZWsgPT09IDAgPyA2IDogZGF5T2ZXZWVrIC0gMTtcbiAgICBjb25zdCBtb25kYXkgPSBuZXcgRGF0ZShub3cpO1xuICAgIG1vbmRheS5zZXREYXRlKG5vdy5nZXREYXRlKCkgLSBkYXlzVG9Nb25kYXkpO1xuICAgIGNvbnN0IHdlZWtTdGFydCA9IG1vbmRheS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoJy9zdXBwb3J0L3JlZmxlY3Rpb25zJywge1xuICAgICAgd2Vla1N0YXJ0LCAvLyBSZXF1aXJlZCBmaWVsZFxuICAgICAgb3ZlcmFsbFJhdGluZzogNCxcbiAgICAgIGJpZ2dlc3RXaW46ICdCYWRnZSB0ZXN0IHJlZmxlY3Rpb24gLSB0ZXN0aW5nIHRoZSBiYWRnZSBpbnRlZ3JhdGlvbicsXG4gICAgICBjaGFsbGVuZ2VzOiAnVGVzdGluZyBhdXRvbWF0ZWQgYmFkZ2UgY2hlY2tzJyxcbiAgICAgIGdvYWxzOiBbJ0NvbnRpbnVlIGltcHJvdmluZyB0aGUgcGxhdGZvcm0nXSxcbiAgICAgIG5vdGVzOiAnRTJFIHRlc3QgcmVmbGVjdGlvbicsXG4gICAgfSk7XG4gICAgLy8gQWNjZXB0IDIwMSAoY3JlYXRlZCkgb3IgNDA5IChhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyB3ZWVrKVxuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEgJiYgcmVzLnN0YXR1cyAhPT0gNDA5KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ1ZlcmlmeSByZWZsZWN0aW9ucyBhcmUgdHJhY2tlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL3N1cHBvcnQvcmVmbGVjdGlvbnMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gIH0pO1xuXG4gIC8vIEV2ZW50cyBIb3N0ZWQgQmFkZ2UgVGVzdHMgKGF3YXJkZWQgb24gcHVibGlzaClcbiAgYXdhaXQgdGVzdCgnUHVibGlzaGluZyBldmVudCBhd2FyZHMgRVZFTlRTX0hPU1RFRCBiYWRnZSB0byBob3N0cycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgZXZlbnQgd2FzIGFscmVhZHkgcHVibGlzaGVkIGluIEVWRU5UUyBzZWN0aW9uXG4gICAgLy8gVmVyaWZ5IHRoZSBiYWRnZSBjaGVjayB3YXMgdHJpZ2dlcmVkIGJ5IGNoZWNraW5nIG5leHQgYmFkZ2VzXG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9iYWRnZXMvbmV4dCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAvLyBTaG91bGQgcmV0dXJuIGJhZGdlIHByb2dyZXNzIGRhdGFcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYXJyYXkgb2YgbmV4dCBiYWRnZXMnKTtcbiAgfSk7XG5cbiAgLy8gRXZlbnRzIEF0dGVuZGVkIEJhZGdlIFRlc3RzXG4gIC8vIE5vdGU6IEVWRU5UU19BVFRFTkRFRCBiYWRnZSBpcyBhd2FyZGVkIHdoZW4gYm9va2luZyBpcyBjaGVja2VkLWluXG4gIC8vIFRoaXMgcmVxdWlyZXMgYSBob3N0IHRvIGNoZWNrLWluIHRoZSBib29raW5nLCB3aGljaCB3ZSBjYW4ndCBkbyBpbiBFMkUgZWFzaWx5XG4gIC8vIFNvIHdlIGp1c3QgdmVyaWZ5IHRoZSBiYWRnZSBwcm9ncmVzcyB0cmFja2luZyB3b3Jrc1xuXG4gIGF3YWl0IHRlc3QoJ0JhZGdlIHByb2dyZXNzIHNob3dzIEVWRU5UU19BVFRFTkRFRCB0cmFja2luZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2JhZGdlcy9uZXh0Jyk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIC8vIExvb2sgZm9yIGV2ZW50cyBhdHRlbmRlZCBiYWRnZSBpbiBwcm9ncmVzc1xuICAgIGNvbnN0IGV2ZW50c0F0dGVuZGVkQmFkZ2UgPSBkYXRhLmZpbmQoXG4gICAgICAoYjogYW55KSA9PiBiLmJhZGdlPy50eXBlID09PSAnRVZFTlRTX0FUVEVOREVEJyB8fCBiLmJhZGdlPy5zbHVnPy5pbmNsdWRlcygnZXZlbnQnKVxuICAgICk7XG4gICAgLy8gTWF5IG9yIG1heSBub3QgZXhpc3QgZGVwZW5kaW5nIG9uIHNlZWQgZGF0YSwgYnV0IEFQSSBzaG91bGQgd29ya1xuICB9KTtcblxuICAvLyBWZXJpZnkgYmFkZ2Ugc3RhdGUgYWZ0ZXIgYWxsIGFjdGlvbnNcbiAgYXdhaXQgdGVzdCgnVmVyaWZ5IGJhZGdlcyBhZnRlciBhbGwgYmFkZ2UtdHJpZ2dlcmluZyBhY3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvYmFkZ2VzL3VzZXJzL21lL2JhZGdlcycpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBjb25zdCBjdXJyZW50QmFkZ2VDb3VudCA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhLmxlbmd0aCA6IDA7XG4gICAgLy8gRGVwZW5kaW5nIG9uIHRocmVzaG9sZHMsIHVzZXIgbWF5IGhhdmUgZWFybmVkIG5ldyBiYWRnZXNcbiAgICAvLyBBdCBtaW5pbXVtLCB0aGUgQVBJIHNob3VsZCByZXR1cm4gc3VjY2Vzc2Z1bGx5XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUkVXQVJEIEZMT1dcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBzZWN0aW9uKCdSRVdBUkQgRkxPVycpO1xuXG4gIC8vIFN0b3JlIHJld2FyZC1yZWxhdGVkIHN0YXRlXG4gIGxldCB0ZXN0QmFkZ2VJZEZvclJld2FyZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgdGVzdFJld2FyZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCByZWRlbXB0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBHZXQgYSBiYWRnZSB0byB1c2UgZm9yIHJld2FyZCB0ZXN0c1xuICBhd2FpdCB0ZXN0KCdHZXQgYXZhaWxhYmxlIGJhZGdlcyBmb3IgcmV3YXJkIHRlc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9iYWRnZXMnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICB0ZXN0QmFkZ2VJZEZvclJld2FyZCA9IGRhdGFbMF0uaWQ7XG4gICAgfVxuICB9KTtcblxuICAvLyBDcmVhdGUgYSBicmFuZCByZXdhcmQgZm9yIHRlc3RpbmcgKHVzZXIgb3ducyBicmFuZCBmcm9tIGVhcmxpZXIgdGVzdHMpXG4gIC8vIE5vdGU6IFdlIHVzZSBicmFuZCBzaW5jZSB3ZSBjcmVhdGVkIG9uZSBpbiB0aGUgQlJBTkRTIHNlY3Rpb25cbiAgaWYgKHN0YXRlLmJyYW5kSWQpIHtcbiAgICBhd2FpdCB0ZXN0KCdDcmVhdGUgYnJhbmQgcmV3YXJkIGZvciBiYWRnZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghdGVzdEJhZGdlSWRGb3JSZXdhcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBiYWRnZSBhdmFpbGFibGUgdG8gY3JlYXRlIHJld2FyZCBmb3InKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9L3Jld2FyZHNgLCB7XG4gICAgICAgIGJhZGdlSWQ6IHRlc3RCYWRnZUlkRm9yUmV3YXJkLFxuICAgICAgICB0aXRsZTogJ0UyRSBCcmFuZCBUZXN0IFJld2FyZCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQSB0ZXN0IGJyYW5kIHJld2FyZCBmb3IgRTJFIHRlc3RpbmcnLFxuICAgICAgICByZWRlZW1UeXBlOiAnT05MSU5FJyxcbiAgICAgICAgY29kZTogJ0UyRS1URVNULUNPREUnLFxuICAgICAgICBwZXJVc2VyTGltaXQ6IDEsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDEpIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocmVzLmRhdGEpfWApO1xuICAgICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgICB0ZXN0UmV3YXJkSWQgPSBkYXRhLmlkO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNraXAoJ0NyZWF0ZSBicmFuZCByZXdhcmQgZm9yIGJhZGdlJywgJ05vIGJyYW5kIGF2YWlsYWJsZSAoYnJhbmQgbm90IGNyZWF0ZWQpJyk7XG4gIH1cblxuICAvLyBUZXN0IHJld2FyZCBhdmFpbGFiaWxpdHlcbiAgYXdhaXQgdGVzdCgnR2V0IGF2YWlsYWJsZSByZXdhcmRzIGZvciB1c2VyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvcmV3YXJkcy9hdmFpbGFibGUnKTtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gQVBJIHJldHVybnMgeyBkYXRhOiByZXdhcmRzW10gfVxuICAgIGNvbnN0IHJld2FyZHMgPSBkYXRhLmRhdGEgfHwgZGF0YTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmV3YXJkcykpIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYXJyYXkgb2YgYXZhaWxhYmxlIHJld2FyZHMnKTtcbiAgfSk7XG5cbiAgLy8gVGVzdCB1c2VyIGNhbm5vdCByZWRlZW0gd2l0aG91dCBlYXJuaW5nIHRoZSBiYWRnZVxuICBhd2FpdCB0ZXN0KCdDYW5ub3QgcmVkZWVtIHJld2FyZCB3aXRob3V0IGVhcm5pbmcgcmVxdWlyZWQgYmFkZ2UgKDQwMCknLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCF0ZXN0UmV3YXJkSWQgfHwgIXRlc3RCYWRnZUlkRm9yUmV3YXJkKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2MuZGltfShTa2lwcGVkOiBObyB0ZXN0IHJld2FyZCBjcmVhdGVkKSR7Yy5yZXNldH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCBjaGVjayBpZiB1c2VyIGhhcyB0aGUgYmFkZ2VcbiAgICBjb25zdCBiYWRnZVJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvYmFkZ2VzL3VzZXJzL21lL2JhZGdlcycpO1xuICAgIGNvbnN0IGJhZGdlcyA9IHVud3JhcDxhbnk+KGJhZGdlUmVzKTtcbiAgICBjb25zdCBoYXNCYWRnZSA9IEFycmF5LmlzQXJyYXkoYmFkZ2VzKSAmJiBiYWRnZXMuc29tZShcbiAgICAgIChiOiBhbnkpID0+IGIuYmFkZ2VJZCA9PT0gdGVzdEJhZGdlSWRGb3JSZXdhcmRcbiAgICApO1xuXG4gICAgaWYgKCFoYXNCYWRnZSkge1xuICAgICAgLy8gVXNlciBkb2Vzbid0IGhhdmUgYmFkZ2UsIHNob3VsZCBnZXQgNDAwIHdoZW4gdHJ5aW5nIHRvIHJlZGVlbVxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvcmV3YXJkcy8ke3Rlc3RSZXdhcmRJZH0vcmVkZWVtYCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gNDAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgNDAwIChuZWVkIGJhZGdlIGZpcnN0KSwgZ290ICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlciBoYXMgdGhlIGJhZGdlLCB0ZXN0IHBhc3NlcyAod2UnbGwgdGVzdCByZWRlbXB0aW9uIGJlbG93KVxuICAgICAgY29uc29sZS5sb2coYCAgJHtjLmRpbX0oVXNlciBhbHJlYWR5IGhhcyByZXF1aXJlZCBiYWRnZSAtIHdpbGwgdGVzdCByZWRlbXB0aW9uKSR7Yy5yZXNldH1gKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRlc3QgcmVkZW1wdGlvbiBmbG93IC0gY2hlY2sgaWYgdXNlciBjYW4gcmVkZWVtXG4gIGF3YWl0IHRlc3QoJ0NoZWNrIGJhZGdlIG93bmVyc2hpcCBhbmQgdGVzdCByZWRlbXB0aW9uIGZsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCF0ZXN0UmV3YXJkSWQgfHwgIXRlc3RCYWRnZUlkRm9yUmV3YXJkKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2MuZGltfShTa2lwcGVkOiBObyB0ZXN0IHJld2FyZCBjcmVhdGVkKSR7Yy5yZXNldH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB1c2VyIGhhcyBlYXJuZWQgdGhlIGJhZGdlXG4gICAgY29uc3QgYmFkZ2VSZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmdldCgnL2JhZGdlcy91c2Vycy9tZS9iYWRnZXMnKTtcbiAgICBpZiAoYmFkZ2VSZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7YmFkZ2VSZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGJhZGdlcyA9IHVud3JhcDxhbnk+KGJhZGdlUmVzKTtcbiAgICBjb25zdCB1c2VySGFzQmFkZ2UgPSBBcnJheS5pc0FycmF5KGJhZGdlcykgJiYgYmFkZ2VzLnNvbWUoXG4gICAgICAoYjogYW55KSA9PiBiLmJhZGdlSWQgPT09IHRlc3RCYWRnZUlkRm9yUmV3YXJkXG4gICAgKTtcblxuICAgIGlmICh1c2VySGFzQmFkZ2UpIHtcbiAgICAgIC8vIFVzZXIgaGFzIGJhZGdlLCB0ZXN0IHRoZSBmdWxsIHJlZGVtcHRpb24gZmxvd1xuICAgICAgY29uc3QgcmVkZWVtUmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5wb3N0KGAvcmV3YXJkcy8ke3Rlc3RSZXdhcmRJZH0vcmVkZWVtYCk7XG4gICAgICBpZiAocmVkZWVtUmVzLnN0YXR1cyAhPT0gMjAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVkZWVtIGZhaWxlZDogJHtyZWRlZW1SZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShyZWRlZW1SZXMuZGF0YSl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWRlZW1EYXRhID0gdW53cmFwPGFueT4ocmVkZWVtUmVzKTtcbiAgICAgIHJlZGVtcHRpb25JZCA9IHJlZGVlbURhdGEuaWQ7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2MuZGltfShSZWRlbXB0aW9uIHN1Y2Nlc3NmdWw6ICR7cmVkZW1wdGlvbklkfSkke2MucmVzZXR9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Yy5kaW19KFVzZXIgaGFzIG5vdCBlYXJuZWQgcmVxdWlyZWQgYmFkZ2UgLSByZWRlbXB0aW9uIHRlc3Qgc2tpcHBlZCkke2MucmVzZXR9YCk7XG4gICAgfVxuICB9KTtcblxuICBhd2FpdCB0ZXN0KCdDYW5ub3QgcmVkZWVtIHNhbWUgcmV3YXJkIHR3aWNlICg0MDApJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghdGVzdFJld2FyZElkIHx8ICFyZWRlbXB0aW9uSWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Yy5kaW19KFNraXBwZWQ6IE5vIHByaW9yIHJlZGVtcHRpb24gdG8gdGVzdCkke2MucmVzZXR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL3Jld2FyZHMvJHt0ZXN0UmV3YXJkSWR9L3JlZGVlbWApO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSA0MDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgNDAwIChhbHJlYWR5IHJlZGVlbWVkKSwgZ290ICR7cmVzLnN0YXR1c31gKTtcbiAgICB9XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ0dldCByZWRlZW1lZCByZXdhcmRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZ2V0KCcvcmV3YXJkcy9yZWRlZW1lZCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICAvLyBBUEkgcmV0dXJucyB7IGRhdGE6IHJlZGVtcHRpb25zW10gfVxuICAgIGNvbnN0IHJlZGVtcHRpb25zID0gZGF0YS5kYXRhIHx8IGRhdGE7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZGVtcHRpb25zKSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhcnJheSBvZiByZWRlZW1lZCByZXdhcmRzJyk7XG4gICAgLy8gSWYgd2UgcmVkZWVtZWQsIHNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZVxuICAgIGlmIChyZWRlbXB0aW9uSWQgJiYgcmVkZW1wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGF0IGxlYXN0IG9uZSByZWRlZW1lZCByZXdhcmQnKTtcbiAgICB9XG4gIH0pO1xuXG4gIGF3YWl0IHRlc3QoJ1Jld2FyZHMgd2FsbGV0IHNob3dzIGNvcnJlY3Qgc3RhdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoJy9yZXdhcmRzL3dhbGxldCcpO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBkYXRhID0gdW53cmFwPGFueT4ocmVzKTtcbiAgICBpZiAoZGF0YS5zdGF0cyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc3RhdHMgaW4gd2FsbGV0Jyk7XG4gICAgLy8gQWZ0ZXIgcmVkZW1wdGlvbiwgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMSByZWRlZW1lZFxuICAgIGlmIChyZWRlbXB0aW9uSWQgJiYgZGF0YS5zdGF0cy50b3RhbFJlZGVlbWVkUmV3YXJkcyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYXQgbGVhc3QgMSByZWRlZW1lZCByZXdhcmQgaW4gd2FsbGV0IHN0YXRzJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBUZXN0IGdldHRpbmcgcmV3YXJkcyBieSBiYWRnZVxuICBhd2FpdCB0ZXN0KCdHZXQgcmV3YXJkcyBmb3Igc3BlY2lmaWMgYmFkZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCF0ZXN0QmFkZ2VJZEZvclJld2FyZCkge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtjLmRpbX0oU2tpcHBlZDogTm8gYmFkZ2UgSUQgYXZhaWxhYmxlKSR7Yy5yZXNldH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5nZXQoYC9yZXdhcmRzL2JhZGdlLyR7dGVzdEJhZGdlSWRGb3JSZXdhcmR9YCk7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIGNvbnN0IGRhdGEgPSB1bndyYXA8YW55PihyZXMpO1xuICAgIC8vIEFQSSByZXR1cm5zIHsgZGF0YTogcmV3YXJkc1tdIH1cbiAgICBjb25zdCByZXdhcmRzID0gZGF0YS5kYXRhIHx8IGRhdGE7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJld2FyZHMpKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGFycmF5IG9mIHJld2FyZHMnKTtcbiAgfSk7XG5cbiAgLy8gVmVyaWZ5IHJld2FyZCByZWRlbXB0aW9uIHZlcmlmaWNhdGlvbiBlbmRwb2ludFxuICBhd2FpdCB0ZXN0KCdWZXJpZnkgcmVkZW1wdGlvbiBlbmRwb2ludCB3b3JrcycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGlzIHdvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCBieSB2ZW51ZS9icmFuZCBzdGFmZlxuICAgIC8vIFdlJ2xsIHRlc3Qgd2l0aCBhbiBpbnZhbGlkIHRva2VuIHRvIGVuc3VyZSBlbmRwb2ludCBleGlzdHNcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLnBvc3QoJy9yZXdhcmRzL3ZlcmlmeScsIHtcbiAgICAgIHFyVG9rZW46ICdpbnZhbGlkLXRlc3QtdG9rZW4nLFxuICAgIH0pO1xuICAgIC8vIFBPU1QgZGVmYXVsdHMgdG8gMjAxLCBidXQgZWl0aGVyIDIwMCBvciAyMDEgaXMgYWNjZXB0YWJsZVxuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjAxKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgY29uc3QgZGF0YSA9IHVud3JhcDxhbnk+KHJlcyk7XG4gICAgLy8gQVBJIHJldHVybnMgeyBkYXRhOiB7IHZhbGlkOiBib29sZWFuIH0gfVxuICAgIGNvbnN0IHJlc3VsdCA9IGRhdGEuZGF0YSB8fCBkYXRhO1xuICAgIGlmIChyZXN1bHQudmFsaWQgIT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhbGlkOiBmYWxzZSBmb3IgaW52YWxpZCB0b2tlbicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDTEVBTlVQXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgc2VjdGlvbignQ0xFQU5VUCcpO1xuXG4gIC8vIENsZWFudXAgY3JlYXRvciBwcm9kdWN0c1xuICBpZiAoc3RhdGUucHJvZHVjdElkICYmIHN0YXRlLmNyZWF0b3JJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0RlbGV0ZSBjcmVhdG9yIHByb2R1Y3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkoc3RhdGUuYWNjZXNzVG9rZW4pLmRlbGV0ZShcbiAgICAgICAgYC9jcmVhdG9ycy8ke3N0YXRlLmNyZWF0b3JJZH0vcHJvZHVjdHMvJHtzdGF0ZS5wcm9kdWN0SWR9YFxuICAgICAgKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDAgJiYgcmVzLnN0YXR1cyAhPT0gMjA0KSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUuYXZhaWxhYmlsaXR5SWQgJiYgc3RhdGUuY3JlYXRvcklkKSB7XG4gICAgYXdhaXQgdGVzdCgnUmVtb3ZlIGNyZWF0b3IgYXZhaWxhYmlsaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5kZWxldGUoXG4gICAgICAgIGAvY3JlYXRvcnMvJHtzdGF0ZS5jcmVhdG9ySWR9L2F2YWlsYWJpbGl0eS8ke3N0YXRlLmF2YWlsYWJpbGl0eUlkfWBcbiAgICAgICk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDIwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHN0YXRlLmNyZWF0b3JJZCAmJiBzdGF0ZS5icmFuZElkKSB7XG4gICAgYXdhaXQgdGVzdCgnUmVtb3ZlIGNyZWF0b3IgZnJvbSBicmFuZCBwYXJ0bmVyc2hpcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikuZGVsZXRlKFxuICAgICAgICBgL2JyYW5kcy8ke3N0YXRlLmJyYW5kSWR9L2NyZWF0b3JzLyR7c3RhdGUuY3JlYXRvcklkfWBcbiAgICAgICk7XG4gICAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwICYmIHJlcy5zdGF0dXMgIT09IDIwNCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHN0YXRlLmJvb2tpbmdJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBib29raW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpKHN0YXRlLmFjY2Vzc1Rva2VuKS5kZWxldGUoYC9ib29raW5ncy8ke3N0YXRlLmJvb2tpbmdJZH1gKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDQgJiYgcmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoYFN0YXR1cyAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoc3RhdGUuZXZlbnRJZCkge1xuICAgIGF3YWl0IHRlc3QoJ0NhbmNlbCBldmVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaShzdGF0ZS5hY2Nlc3NUb2tlbikucG9zdChgL2V2ZW50cy8ke3N0YXRlLmV2ZW50SWR9L2NhbmNlbGApO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKGBTdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTVU1NQVJZXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc29sZS5sb2coYFxcbiR7Yy5jeWFufSR7Jz0nLnJlcGVhdCg3MCl9JHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmN5YW59ICBURVNUIFNVTU1BUlkke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0keyc9Jy5yZXBlYXQoNzApfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5ncmVlbn1QYXNzZWQ6ICAke3Bhc3NlZH0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MucmVkfUZhaWxlZDogICR7ZmFpbGVkfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy55ZWxsb3d9U2tpcHBlZDogJHtza2lwcGVkfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5ib2xkfVRvdGFsOiAgICR7cGFzc2VkICsgZmFpbGVkICsgc2tpcHBlZH0ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuY3lhbn0keyc9Jy5yZXBlYXQoNzApfSR7Yy5yZXNldH1cXG5gKTtcblxuICAvLyBJRHMgZm9yIGRlYnVnZ2luZ1xuICBjb25zb2xlLmxvZyhgJHtjLmRpbX1UZXN0IElEczoke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfSAgVXNlcjogICAgICR7c3RhdGUudXNlcklkfSR7Yy5yZXNldH1gKTtcbiAgY29uc29sZS5sb2coYCR7Yy5kaW19ICBDcmVhdG9yOiAgJHtzdGF0ZS5jcmVhdG9ySWQgfHwgJ04vQSd9JHtjLnJlc2V0fWApO1xuICBjb25zb2xlLmxvZyhgJHtjLmRpbX0gIFByb2R1Y3Q6ICAke3N0YXRlLnByb2R1Y3RJZCB8fCAnTi9BJ30ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfSAgQnJhbmQ6ICAgICR7c3RhdGUuYnJhbmRJZCB8fCAnTi9BJ30ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfSAgRXZlbnQ6ICAgICR7c3RhdGUuZXZlbnRJZCB8fCAnTi9BJ30ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKGAke2MuZGltfSAgVmVudWU6ICAgICR7c3RhdGUudmVudWVJZCB8fCAnTi9BJ30ke2MucmVzZXR9YCk7XG4gIGNvbnNvbGUubG9nKCcnKTtcblxuICBwcm9jZXNzLmV4aXQoZmFpbGVkID4gMCA/IDEgOiAwKTtcbn1cblxuLy8gUnVuIHRlc3RzXG5ydW5UZXN0cygpLmNhdGNoKChlKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoYCR7Yy5yZWR9VW5leHBlY3RlZCBlcnJvcjoke2MucmVzZXR9YCwgZSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuIl19