@uql/core 0.4.88 → 0.4.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +40 -35
  2. package/package.json +1 -1
  3. package/dialect/abstractSqlDialect-spec.d.ts +0 -49
  4. package/dialect/abstractSqlDialect-spec.js +0 -765
  5. package/dialect/mysqlDialect.spec.d.ts +0 -6
  6. package/dialect/mysqlDialect.spec.js +0 -33
  7. package/dialect/postgresDialect.spec.d.ts +0 -1
  8. package/dialect/postgresDialect.spec.js +0 -139
  9. package/dialect/sqliteDialect.spec.d.ts +0 -1
  10. package/dialect/sqliteDialect.spec.js +0 -12
  11. package/entity/decorator/definition.spec.d.ts +0 -1
  12. package/entity/decorator/definition.spec.js +0 -725
  13. package/entity/decorator/relation.spec.d.ts +0 -1
  14. package/entity/decorator/relation.spec.js +0 -55
  15. package/options.spec.d.ts +0 -1
  16. package/options.spec.js +0 -27
  17. package/querier/abstractQuerier-it.d.ts +0 -41
  18. package/querier/abstractQuerier-it.js +0 -410
  19. package/querier/abstractSqlQuerier-it.d.ts +0 -9
  20. package/querier/abstractSqlQuerier-it.js +0 -19
  21. package/querier/abstractSqlQuerier-spec.d.ts +0 -53
  22. package/querier/abstractSqlQuerier-spec.js +0 -607
  23. package/querier/decorator/injectQuerier.spec.d.ts +0 -1
  24. package/querier/decorator/injectQuerier.spec.js +0 -108
  25. package/querier/decorator/transactional.spec.d.ts +0 -1
  26. package/querier/decorator/transactional.spec.js +0 -239
  27. package/repository/genericRepository.spec.d.ts +0 -1
  28. package/repository/genericRepository.spec.js +0 -86
  29. package/test/entityMock.d.ts +0 -180
  30. package/test/entityMock.js +0 -451
  31. package/test/index.d.ts +0 -3
  32. package/test/index.js +0 -7
  33. package/test/it.util.d.ts +0 -4
  34. package/test/it.util.js +0 -60
  35. package/test/spec.util.d.ts +0 -13
  36. package/test/spec.util.js +0 -54
  37. package/util/dialect.util.spec.d.ts +0 -1
  38. package/util/dialect.util.spec.js +0 -23
  39. package/util/object.util.spec.d.ts +0 -1
  40. package/util/object.util.spec.js +0 -26
  41. package/util/sql.util.spec.d.ts +0 -1
  42. package/util/sql.util.spec.js +0 -164
  43. package/util/string.util.spec.d.ts +0 -1
  44. package/util/string.util.spec.js +0 -26
@@ -1,765 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AbstractSqlDialectSpec = void 0;
4
- const test_1 = require("@uql/core/test");
5
- const util_1 = require("@uql/core/util");
6
- class AbstractSqlDialectSpec {
7
- constructor(dialect) {
8
- this.dialect = dialect;
9
- }
10
- shouldBeValidEscapeCharacter() {
11
- expect(this.dialect.escapeIdChar).toBe('`');
12
- }
13
- shouldBeginTransaction() {
14
- expect(this.dialect.beginTransactionCommand).toBe('BEGIN TRANSACTION');
15
- }
16
- shouldInsertMany() {
17
- expect(this.dialect.insert(test_1.User, [
18
- {
19
- name: 'Some name 1',
20
- email: 'someemail1@example.com',
21
- createdAt: 123,
22
- },
23
- {
24
- name: 'Some name 2',
25
- email: 'someemail2@example.com',
26
- createdAt: 456,
27
- },
28
- {
29
- name: 'Some name 3',
30
- email: 'someemail3@example.com',
31
- createdAt: 789,
32
- },
33
- ])).toBe('INSERT INTO `User` (`name`, `email`, `createdAt`) VALUES' +
34
- " ('Some name 1', 'someemail1@example.com', 123)" +
35
- ", ('Some name 2', 'someemail2@example.com', 456)" +
36
- ", ('Some name 3', 'someemail3@example.com', 789)");
37
- }
38
- shouldInsertOne() {
39
- expect(this.dialect.insert(test_1.User, {
40
- name: 'Some Name',
41
- email: 'someemail@example.com',
42
- createdAt: 123,
43
- })).toBe("INSERT INTO `User` (`name`, `email`, `createdAt`) VALUES ('Some Name', 'someemail@example.com', 123)");
44
- expect(this.dialect.insert(test_1.InventoryAdjustment, {
45
- date: new Date(2021, 11, 31, 23, 59, 59, 999),
46
- createdAt: 123,
47
- })).toBe("INSERT INTO `InventoryAdjustment` (`date`, `createdAt`) VALUES ('2021-12-31 23:59:59.999', 123)");
48
- }
49
- shouldInsertWithOnInsertId() {
50
- expect(this.dialect.insert(test_1.TaxCategory, {
51
- name: 'Some Name',
52
- createdAt: 123,
53
- })).toMatch(/^INSERT INTO `TaxCategory` \(`name`, `createdAt`, `pk`\) VALUES \('Some Name', 123, '.+'\)$/);
54
- }
55
- shouldInsertManyWithSpecifiedIdsAndOnInsertIdAsDefault() {
56
- expect(this.dialect.insert(test_1.TaxCategory, [
57
- {
58
- name: 'Some Name A',
59
- },
60
- {
61
- pk: '50',
62
- name: 'Some Name B',
63
- },
64
- {
65
- name: 'Some Name C',
66
- },
67
- {
68
- pk: '70',
69
- name: 'Some Name D',
70
- },
71
- ])).toMatch(/^INSERT INTO `TaxCategory` \(`name`, `createdAt`, `pk`\) VALUES \('Some Name A', \d+, '.+'\), \('Some Name B', \d+, '50'\), \('Some Name C', \d+, '.+'\), \('Some Name D', \d+, '70'\)$/);
72
- }
73
- shouldUpdate() {
74
- expect(this.dialect.update(test_1.User, { $filter: { name: 'some', creatorId: 123 } }, {
75
- name: 'Some Text',
76
- updatedAt: 321,
77
- })).toBe("UPDATE `User` SET `name` = 'Some Text', `updatedAt` = 321 WHERE `name` = 'some' AND `creatorId` = 123");
78
- }
79
- shouldFind() {
80
- expect(this.dialect.find(test_1.User, {
81
- $project: ['id'],
82
- $filter: { id: 123, name: 'abc' },
83
- })).toBe("SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'");
84
- expect(this.dialect.find(test_1.Profile, {
85
- $project: ['id', 'picture', 'companyId'],
86
- $filter: { id: 123, picture: 'abc' },
87
- })).toBe("SELECT `pk` `id`, `image` `picture`, `companyId` FROM `user_profile` WHERE `pk` = 123 AND `image` = 'abc'");
88
- expect(this.dialect.find(test_1.MeasureUnit, {
89
- $project: ['id'],
90
- $filter: { id: 123, name: 'abc' },
91
- })).toBe("SELECT `id` FROM `MeasureUnit` WHERE `id` = 123 AND `name` = 'abc' AND `deletedAt` IS NULL");
92
- }
93
- shouldBeSecure() {
94
- expect(this.dialect.find(test_1.User, {
95
- $project: ['id', 'something'],
96
- $filter: {
97
- id: 1,
98
- something: 1,
99
- },
100
- $sort: {
101
- id: 1,
102
- something: 1,
103
- },
104
- $group: ['id', 'something'],
105
- })).toBe('SELECT `id` FROM `User` WHERE `id` = 1 AND `something` = 1 GROUP BY `id`, `something` ORDER BY `id`, `something`');
106
- expect(this.dialect.insert(test_1.User, {
107
- name: 'Some Name',
108
- something: 'anything',
109
- createdAt: 1,
110
- })).toBe("INSERT INTO `User` (`name`, `createdAt`) VALUES ('Some Name', 1)");
111
- expect(this.dialect.update(test_1.User, {
112
- $filter: { something: 'anything' },
113
- }, {
114
- name: 'Some Name',
115
- something: 'anything',
116
- updatedAt: 1,
117
- })).toBe("UPDATE `User` SET `name` = 'Some Name', `updatedAt` = 1 WHERE `something` = 'anything'");
118
- expect(this.dialect.delete(test_1.User, {
119
- $filter: { something: 'anything' },
120
- })).toBe("DELETE FROM `User` WHERE `something` = 'anything'");
121
- }
122
- shouldFind$and() {
123
- const sql = "SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'";
124
- expect(this.dialect.find(test_1.User, {
125
- $project: ['id'],
126
- $filter: { $and: [{ id: 123, name: 'abc' }] },
127
- })).toBe(sql);
128
- expect(this.dialect.find(test_1.User, {
129
- $project: { id: 1 },
130
- $filter: { $and: [{ id: 123 }], name: 'abc' },
131
- })).toBe(sql);
132
- }
133
- shouldFind$or() {
134
- expect(this.dialect.find(test_1.User, {
135
- $project: ['id'],
136
- $filter: { $or: [{ id: 123 }, { name: 'abc' }] },
137
- })).toBe("SELECT `id` FROM `User` WHERE `id` = 123 OR `name` = 'abc'");
138
- expect(this.dialect.find(test_1.User, {
139
- $project: ['id'],
140
- $filter: { $or: [{ id: 123 }] },
141
- })).toBe('SELECT `id` FROM `User` WHERE `id` = 123');
142
- expect(this.dialect.find(test_1.User, {
143
- $project: { id: 1 },
144
- $filter: { $or: [{ id: 123, name: 'abc' }] },
145
- })).toBe("SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'");
146
- expect(this.dialect.find(test_1.User, {
147
- $project: ['id'],
148
- $filter: { $or: [{ id: 123 }], name: 'abc' },
149
- })).toBe("SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'");
150
- }
151
- shouldFind$not() {
152
- expect(this.dialect.find(test_1.User, {
153
- $project: ['id'],
154
- $filter: { $not: [{ name: 'Some' }] },
155
- })).toBe("SELECT `id` FROM `User` WHERE NOT `name` = 'Some'");
156
- expect(this.dialect.find(test_1.Company, {
157
- $project: ['id'],
158
- $filter: { id: { $not: 123 } },
159
- })).toBe('SELECT `id` FROM `Company` WHERE NOT `id` = 123');
160
- expect(this.dialect.find(test_1.Company, {
161
- $project: ['id'],
162
- $filter: { id: { $not: [123, 456] } },
163
- })).toBe('SELECT `id` FROM `Company` WHERE NOT `id` IN (123, 456)');
164
- expect(this.dialect.find(test_1.Company, {
165
- $project: ['id'],
166
- $filter: { id: 123, name: { $not: { $startsWith: 'a' } } },
167
- })).toBe("SELECT `id` FROM `Company` WHERE `id` = 123 AND NOT `name` LIKE 'a%'");
168
- expect(this.dialect.find(test_1.Company, {
169
- $project: ['id'],
170
- $filter: { name: { $not: { $startsWith: 'a', $endsWith: 'z' } } },
171
- })).toBe("SELECT `id` FROM `Company` WHERE NOT (`name` LIKE 'a%' AND `name` LIKE '%z')");
172
- expect(this.dialect.find(test_1.User, {
173
- $project: { id: true },
174
- $filter: { $not: [{ name: { $like: 'Some', $ne: 'Something' } }] },
175
- })).toBe("SELECT `id` FROM `User` WHERE NOT (`name` LIKE 'Some' AND `name` <> 'Something')");
176
- expect(this.dialect.find(test_1.User, {
177
- $project: { id: true },
178
- $filter: { $not: [{ name: 'abc' }, { creatorId: 1 }] },
179
- })).toBe("SELECT `id` FROM `User` WHERE NOT (`name` = 'abc' AND `creatorId` = 1)");
180
- expect(this.dialect.find(test_1.Tax, {
181
- $project: ['id'],
182
- $filter: { companyId: 1, name: { $not: { $startsWith: 'a' } } },
183
- })).toBe("SELECT `id` FROM `Tax` WHERE `companyId` = 1 AND NOT `name` LIKE 'a%'");
184
- }
185
- shouldFind$nor() {
186
- expect(this.dialect.find(test_1.User, {
187
- $project: ['id'],
188
- $filter: { $nor: [{ name: 'Some' }] },
189
- })).toBe("SELECT `id` FROM `User` WHERE NOT `name` = 'Some'");
190
- expect(this.dialect.find(test_1.User, {
191
- $project: { id: true },
192
- $filter: { $nor: [{ name: { $like: 'Some', $ne: 'Something' } }] },
193
- })).toBe("SELECT `id` FROM `User` WHERE NOT (`name` LIKE 'Some' AND `name` <> 'Something')");
194
- expect(this.dialect.find(test_1.User, {
195
- $project: { id: true },
196
- $filter: { $nor: [{ name: 'abc' }, { creatorId: 1 }] },
197
- })).toBe("SELECT `id` FROM `User` WHERE NOT (`name` = 'abc' OR `creatorId` = 1)");
198
- }
199
- shouldFind$orAnd$and() {
200
- expect(this.dialect.find(test_1.User, {
201
- $project: ['id'],
202
- $filter: { creatorId: 1, $or: [{ name: ['a', 'b', 'c'] }, { email: 'abc@example.com' }], id: 1 },
203
- })).toBe("SELECT `id` FROM `User` WHERE `creatorId` = 1 AND (`name` IN ('a', 'b', 'c') OR `email` = 'abc@example.com') AND `id` = 1");
204
- expect(this.dialect.find(test_1.User, {
205
- $project: ['id'],
206
- $filter: {
207
- creatorId: 1,
208
- $or: [{ name: ['a', 'b', 'c'] }, { email: 'abc@example.com' }],
209
- id: 1,
210
- email: 'e',
211
- },
212
- })).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 1' +
213
- " AND (`name` IN ('a', 'b', 'c') OR `email` = 'abc@example.com') AND `id` = 1 AND `email` = 'e'");
214
- expect(this.dialect.find(test_1.User, {
215
- $project: ['id'],
216
- $filter: {
217
- creatorId: 1,
218
- $or: [{ name: ['a', 'b', 'c'] }, { email: 'abc@example.com' }],
219
- id: 1,
220
- email: 'e',
221
- },
222
- $sort: { name: 1, createdAt: -1 },
223
- $skip: 50,
224
- $limit: 10,
225
- })).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 1' +
226
- " AND (`name` IN ('a', 'b', 'c') OR `email` = 'abc@example.com')" +
227
- " AND `id` = 1 AND `email` = 'e'" +
228
- ' ORDER BY `name`, `createdAt` DESC LIMIT 10 OFFSET 50');
229
- expect(this.dialect.find(test_1.User, {
230
- $project: ['id'],
231
- $filter: {
232
- $or: [
233
- {
234
- creatorId: 1,
235
- id: 1,
236
- email: 'e',
237
- },
238
- { name: ['a', 'b', 'c'], email: 'abc@example.com' },
239
- ],
240
- },
241
- $sort: [
242
- { field: 'name', sort: 'asc' },
243
- { field: 'createdAt', sort: 'desc' },
244
- ],
245
- $skip: 50,
246
- $limit: 10,
247
- })).toBe("SELECT `id` FROM `User` WHERE (`creatorId` = 1 AND `id` = 1 AND `email` = 'e')" +
248
- " OR (`name` IN ('a', 'b', 'c') AND `email` = 'abc@example.com')" +
249
- ' ORDER BY `name`, `createdAt` DESC LIMIT 10 OFFSET 50');
250
- }
251
- shouldFindSingle$filter() {
252
- expect(this.dialect.find(test_1.User, {
253
- $project: ['id'],
254
- $filter: { name: 'some' },
255
- $limit: 3,
256
- })).toBe("SELECT `id` FROM `User` WHERE `name` = 'some' LIMIT 3");
257
- }
258
- shouldFindMultipleComparisonOperators() {
259
- expect(this.dialect.find(test_1.User, {
260
- $project: ['id'],
261
- $filter: { $or: [{ name: { $eq: 'other', $ne: 'other unwanted' } }, { companyId: 1 }] },
262
- })).toBe("SELECT `id` FROM `User` WHERE (`name` = 'other' AND `name` <> 'other unwanted') OR `companyId` = 1");
263
- expect(this.dialect.find(test_1.User, {
264
- $project: ['id'],
265
- $filter: { createdAt: { $gte: 123, $lte: 999 } },
266
- $limit: 10,
267
- })).toBe('SELECT `id` FROM `User` WHERE (`createdAt` >= 123 AND `createdAt` <= 999) LIMIT 10');
268
- expect(this.dialect.find(test_1.User, {
269
- $project: ['id'],
270
- $filter: { createdAt: { $gt: 123, $lt: 999 } },
271
- $limit: 10,
272
- })).toBe('SELECT `id` FROM `User` WHERE (`createdAt` > 123 AND `createdAt` < 999) LIMIT 10');
273
- }
274
- shouldFind$ne() {
275
- expect(this.dialect.find(test_1.User, {
276
- $project: ['id'],
277
- $filter: { name: 'some', companyId: { $ne: 5 } },
278
- $limit: 20,
279
- })).toBe("SELECT `id` FROM `User` WHERE `name` = 'some' AND `companyId` <> 5 LIMIT 20");
280
- }
281
- shouldFindIsNull() {
282
- expect(this.dialect.find(test_1.User, {
283
- $project: ['id'],
284
- $filter: { creatorId: 123, companyId: null },
285
- $limit: 5,
286
- })).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 123 AND `companyId` IS NULL LIMIT 5');
287
- expect(this.dialect.find(test_1.User, {
288
- $project: { id: true },
289
- $filter: { creatorId: 123, companyId: { $ne: null } },
290
- $limit: 5,
291
- })).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 123 AND `companyId` IS NOT NULL LIMIT 5');
292
- }
293
- shouldFind$in() {
294
- const sql = "SELECT `id` FROM `User` WHERE `name` = 'some' AND `companyId` IN (1, 2, 3) LIMIT 10";
295
- expect(this.dialect.find(test_1.User, {
296
- $project: ['id'],
297
- $filter: { name: 'some', companyId: [1, 2, 3] },
298
- $limit: 10,
299
- })).toBe(sql);
300
- expect(this.dialect.find(test_1.User, {
301
- $project: ['id'],
302
- $filter: { name: 'some', companyId: { $in: [1, 2, 3] } },
303
- $limit: 10,
304
- })).toBe(sql);
305
- }
306
- shouldFind$nin() {
307
- expect(this.dialect.find(test_1.User, {
308
- $project: ['id'],
309
- $filter: { name: 'some', companyId: { $nin: [1, 2, 3] } },
310
- $limit: 10,
311
- })).toBe("SELECT `id` FROM `User` WHERE `name` = 'some' AND `companyId` NOT IN (1, 2, 3) LIMIT 10");
312
- }
313
- shouldFind$projectFields() {
314
- expect(this.dialect.find(test_1.User, { $project: { id: true, company: true } })).toBe('SELECT `User`.`id`, `company`.`id` `company.id`, `company`.`companyId` `company.companyId`, `company`.`creatorId` `company.creatorId`' +
315
- ', `company`.`createdAt` `company.createdAt`, `company`.`updatedAt` `company.updatedAt`' +
316
- ', `company`.`name` `company.name`, `company`.`description` `company.description`' +
317
- ' FROM `User` LEFT JOIN `Company` `company` ON `company`.`id` = `User`.`companyId`');
318
- }
319
- shouldFind$projectOneToOne() {
320
- expect(this.dialect.find(test_1.User, {
321
- $project: { id: true, name: true, profile: ['id', 'picture'] },
322
- })).toBe('SELECT `User`.`id`, `User`.`name`, `profile`.`pk` `profile.id`, `profile`.`image` `profile.picture` FROM `User`' +
323
- ' LEFT JOIN `user_profile` `profile` ON `profile`.`creatorId` = `User`.`id`');
324
- expect(this.dialect.find(test_1.User, { $project: { profile: true } })).toBe('SELECT `User`.`id`, `profile`.`companyId` `profile.companyId`' +
325
- ', `profile`.`creatorId` `profile.creatorId`, `profile`.`createdAt` `profile.createdAt`' +
326
- ', `profile`.`updatedAt` `profile.updatedAt`' +
327
- ', `profile`.`pk` `profile.id`, `profile`.`image` `profile.picture`' +
328
- ' FROM `User` LEFT JOIN `user_profile` `profile` ON `profile`.`creatorId` = `User`.`id`');
329
- }
330
- shouldFind$projectManyToOne() {
331
- expect(this.dialect.find(test_1.Item, {
332
- $project: {
333
- id: true,
334
- name: true,
335
- code: true,
336
- tax: { $project: ['id', 'name'], $required: true },
337
- measureUnit: { $project: ['id', 'name', 'categoryId'] },
338
- },
339
- $limit: 100,
340
- })).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`' +
341
- ', `tax`.`id` `tax.id`, `tax`.`name` `tax.name`' +
342
- ', `measureUnit`.`id` `measureUnit.id`, `measureUnit`.`name` `measureUnit.name`, `measureUnit`.`categoryId` `measureUnit.categoryId`' +
343
- ' FROM `Item`' +
344
- ' INNER JOIN `Tax` `tax` ON `tax`.`id` = `Item`.`taxId`' +
345
- ' LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
346
- ' LIMIT 100');
347
- }
348
- shouldFind$projectWithAllFieldsAndSpecificFieldsAndFilter() {
349
- expect(this.dialect.find(test_1.Item, {
350
- $project: {
351
- id: true,
352
- name: true,
353
- measureUnit: { $project: ['id', 'name'], $filter: { name: { $ne: 'unidad' } }, $required: true },
354
- tax: ['id', 'name'],
355
- },
356
- $filter: { salePrice: { $gte: 1000 }, name: { $istartsWith: 'A' } },
357
- $sort: { tax: { name: 1 }, measureUnit: { name: 1 }, createdAt: -1 },
358
- $limit: 100,
359
- })).toBe('SELECT `Item`.`id`, `Item`.`name`' +
360
- ', `measureUnit`.`id` `measureUnit.id`, `measureUnit`.`name` `measureUnit.name`' +
361
- ', `tax`.`id` `tax.id`, `tax`.`name` `tax.name`' +
362
- ' FROM `Item`' +
363
- " INNER JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId` AND `measureUnit`.`name` <> 'unidad' AND `measureUnit`.`deletedAt` IS NULL" +
364
- ' LEFT JOIN `Tax` `tax` ON `tax`.`id` = `Item`.`taxId`' +
365
- " WHERE `Item`.`salePrice` >= 1000 AND LOWER(`Item`.`name`) LIKE 'a%'" +
366
- ' ORDER BY `tax`.`name`, `measureUnit`.`name`, `Item`.`createdAt` DESC LIMIT 100');
367
- }
368
- shouldVirtualField() {
369
- expect(this.dialect.find(test_1.Item, {
370
- $project: {
371
- id: 1,
372
- },
373
- $filter: {
374
- tagsCount: { $gte: 10 },
375
- },
376
- })).toBe('SELECT `id` FROM `Item` WHERE (SELECT COUNT(*) `count` FROM `ItemTag` WHERE `ItemTag`.`itemId` = `id`) >= 10');
377
- expect(this.dialect.find(test_1.Item, {
378
- $project: {
379
- id: 1,
380
- name: 1,
381
- code: 1,
382
- tagsCount: 1,
383
- measureUnit: {
384
- $project: { id: 1, name: 1, categoryId: 1, category: ['name'] },
385
- },
386
- },
387
- $limit: 100,
388
- })).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`' +
389
- ', (SELECT COUNT(*) `count` FROM `ItemTag` WHERE `ItemTag`.`itemId` = `Item`.`id`) `tagsCount`' +
390
- ', `measureUnit`.`id` `measureUnit.id`, `measureUnit`.`name` `measureUnit.name`, `measureUnit`.`categoryId` `measureUnit.categoryId`' +
391
- ', `measureUnit.category`.`id` `measureUnit.category.id`, `measureUnit.category`.`name` `measureUnit.category.name`' +
392
- ' FROM `Item` LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
393
- ' LEFT JOIN `MeasureUnitCategory` `measureUnit.category` ON `measureUnit.category`.`id` = `measureUnit`.`categoryId`' +
394
- ' LIMIT 100');
395
- }
396
- shouldFind$projectDeep() {
397
- expect(this.dialect.find(test_1.Item, {
398
- $project: {
399
- id: 1,
400
- name: 1,
401
- code: 1,
402
- measureUnit: {
403
- $project: { id: 1, name: 1, categoryId: 1, category: ['name'] },
404
- },
405
- },
406
- $limit: 100,
407
- })).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`' +
408
- ', `measureUnit`.`id` `measureUnit.id`' +
409
- ', `measureUnit`.`name` `measureUnit.name`, `measureUnit`.`categoryId` `measureUnit.categoryId`' +
410
- ', `measureUnit.category`.`id` `measureUnit.category.id`, `measureUnit.category`.`name` `measureUnit.category.name`' +
411
- ' FROM `Item` LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
412
- ' LEFT JOIN `MeasureUnitCategory` `measureUnit.category` ON `measureUnit.category`.`id` = `measureUnit`.`categoryId`' +
413
- ' LIMIT 100');
414
- expect(this.dialect.find(test_1.Item, {
415
- $project: {
416
- id: true,
417
- name: true,
418
- code: true,
419
- measureUnit: {
420
- $project: { id: true, name: true, category: { $project: { id: true, name: true } } },
421
- },
422
- },
423
- $limit: 100,
424
- })).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`, `measureUnit`.`id` `measureUnit.id`' +
425
- ', `measureUnit`.`name` `measureUnit.name`, `measureUnit.category`.`id` `measureUnit.category.id`' +
426
- ', `measureUnit.category`.`name` `measureUnit.category.name`' +
427
- ' FROM `Item` LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
428
- ' LEFT JOIN `MeasureUnitCategory` `measureUnit.category` ON `measureUnit.category`.`id` = `measureUnit`.`categoryId`' +
429
- ' LIMIT 100');
430
- expect(this.dialect.find(test_1.ItemAdjustment, {
431
- $project: {
432
- id: true,
433
- buyPrice: true,
434
- number: true,
435
- item: {
436
- $project: {
437
- id: true,
438
- name: true,
439
- measureUnit: {
440
- $project: { id: true, name: true, category: ['id', 'name'] },
441
- },
442
- },
443
- $required: true,
444
- },
445
- },
446
- $limit: 100,
447
- })).toBe('SELECT `ItemAdjustment`.`id`, `ItemAdjustment`.`buyPrice`, `ItemAdjustment`.`number`' +
448
- ', `item`.`id` `item.id`, `item`.`name` `item.name`' +
449
- ', `item.measureUnit`.`id` `item.measureUnit.id`, `item.measureUnit`.`name` `item.measureUnit.name`' +
450
- ', `item.measureUnit.category`.`id` `item.measureUnit.category.id`, `item.measureUnit.category`.`name` `item.measureUnit.category.name`' +
451
- ' FROM `ItemAdjustment`' +
452
- ' INNER JOIN `Item` `item` ON `item`.`id` = `ItemAdjustment`.`itemId`' +
453
- ' LEFT JOIN `MeasureUnit` `item.measureUnit` ON `item.measureUnit`.`id` = `item`.`measureUnitId`' +
454
- ' LEFT JOIN `MeasureUnitCategory` `item.measureUnit.category` ON `item.measureUnit.category`.`id` = `item.measureUnit`.`categoryId`' +
455
- ' LIMIT 100');
456
- }
457
- shouldFind$group() {
458
- expect(this.dialect.find(test_1.User, {
459
- $group: ['companyId'],
460
- })).toBe('SELECT `id`, `companyId`, `creatorId`, `createdAt`, `updatedAt`, `name`, `email`, `password` FROM `User` GROUP BY `companyId`');
461
- expect(this.dialect.find(test_1.User, {
462
- $project: ['companyId', (0, util_1.raw)('COUNT(*)', 'count')],
463
- $group: ['companyId'],
464
- $having: {
465
- count: {
466
- $gte: 10,
467
- },
468
- },
469
- })).toBe('SELECT `companyId`, COUNT(*) `count` FROM `User` GROUP BY `companyId` HAVING `count` >= 10');
470
- expect(this.dialect.find(test_1.User, {
471
- $project: ['id', 'name'],
472
- $filter: { companyId: 1 },
473
- $group: ['companyId'],
474
- $skip: 50,
475
- $limit: 100,
476
- $sort: { name: 'desc' },
477
- })).toBe('SELECT `id`, `name` FROM `User` WHERE `companyId` = 1 GROUP BY `companyId` ORDER BY `name` DESC LIMIT 100 OFFSET 50');
478
- }
479
- shouldFind$limit() {
480
- expect(this.dialect.find(test_1.User, {
481
- $project: ['id'],
482
- $filter: 9,
483
- $limit: 1,
484
- })).toBe('SELECT `id` FROM `User` WHERE `id` = 9 LIMIT 1');
485
- expect(this.dialect.find(test_1.User, {
486
- $project: { id: 1, name: 1, creatorId: 1 },
487
- $filter: 9,
488
- $limit: 1,
489
- })).toBe('SELECT `id`, `name`, `creatorId` FROM `User` WHERE `id` = 9 LIMIT 1');
490
- expect(this.dialect.find(test_1.User, {
491
- $project: ['id'],
492
- $filter: { name: 'something', creatorId: 123 },
493
- $limit: 1,
494
- })).toBe("SELECT `id` FROM `User` WHERE `name` = 'something' AND `creatorId` = 123 LIMIT 1");
495
- expect(this.dialect.find(test_1.User, {
496
- $project: ['id', 'name', 'creatorId'],
497
- $limit: 25,
498
- })).toBe('SELECT `id`, `name`, `creatorId` FROM `User` LIMIT 25');
499
- }
500
- shouldFind$skip() {
501
- expect(this.dialect.find(test_1.User, {
502
- $project: { id: 1, name: 1, creatorId: 1 },
503
- $skip: 30,
504
- })).toBe('SELECT `id`, `name`, `creatorId` FROM `User` OFFSET 30');
505
- }
506
- shouldFind$project() {
507
- expect(this.dialect.find(test_1.User, {
508
- $project: { password: false },
509
- })).toBe('SELECT `id`, `companyId`, `creatorId`, `createdAt`, `updatedAt`, `name`, `email` FROM `User`');
510
- expect(this.dialect.find(test_1.User, {
511
- $project: { name: 0, password: 0 },
512
- })).toBe('SELECT `id`, `companyId`, `creatorId`, `createdAt`, `updatedAt`, `email` FROM `User`');
513
- expect(this.dialect.find(test_1.User, {
514
- $project: { id: 1, name: 1, password: 0 },
515
- })).toBe('SELECT `id`, `name` FROM `User`');
516
- expect(this.dialect.find(test_1.User, {
517
- $project: { id: 1, name: 0, password: 0 },
518
- })).toBe('SELECT `id` FROM `User`');
519
- expect(this.dialect.find(test_1.User, {
520
- $project: [(0, util_1.raw)('*'), (0, util_1.raw)('LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt', 'hotness')],
521
- $filter: { name: 'something' },
522
- })).toBe("SELECT *, LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt `hotness` FROM `User` WHERE `name` = 'something'");
523
- }
524
- shouldDelete() {
525
- expect(this.dialect.delete(test_1.User, { $filter: 123 })).toBe('DELETE FROM `User` WHERE `id` = 123');
526
- expect(() => this.dialect.delete(test_1.User, { $filter: 123 }, { softDelete: true })).toThrow("'User' has not enabled 'softDelete'");
527
- expect(this.dialect.delete(test_1.User, { $filter: 123 }, { softDelete: false })).toBe('DELETE FROM `User` WHERE `id` = 123');
528
- expect(this.dialect.delete(test_1.MeasureUnit, { $filter: 123 })).toMatch(/^UPDATE `MeasureUnit` SET `deletedAt` = \d+ WHERE `id` = 123 AND `deletedAt` IS NULL$/);
529
- expect(this.dialect.delete(test_1.MeasureUnit, { $filter: 123 }, { softDelete: true })).toMatch(/^UPDATE `MeasureUnit` SET `deletedAt` = \d+ WHERE `id` = 123 AND `deletedAt` IS NULL$/);
530
- expect(this.dialect.delete(test_1.MeasureUnit, { $filter: 123 }, { softDelete: false })).toBe('DELETE FROM `MeasureUnit` WHERE `id` = 123');
531
- }
532
- shouldFind$projectRaw() {
533
- expect(this.dialect.find(test_1.Item, {
534
- $project: {
535
- companyId: true,
536
- total: (0, util_1.raw)(({ escapedPrefix, dialect }) => `SUM(${escapedPrefix}${dialect.escapeId('salePrice')})`),
537
- },
538
- $group: ['companyId'],
539
- })).toBe('SELECT `companyId`, SUM(`salePrice`) `total` FROM `Item` GROUP BY `companyId`');
540
- expect(this.dialect.find(test_1.ItemAdjustment, {
541
- $project: {
542
- item: {
543
- $project: {
544
- companyId: true,
545
- total: (0, util_1.raw)(({ escapedPrefix, dialect }) => `SUM(${escapedPrefix}${dialect.escapeId('salePrice')})`),
546
- },
547
- $required: true,
548
- },
549
- },
550
- $group: ['companyId'],
551
- })).toBe('SELECT `ItemAdjustment`.`id`, `item`.`id` `item.id`, `item`.`companyId` `item.companyId`, SUM(`item`.`salePrice`) `item.total`' +
552
- ' FROM `ItemAdjustment` INNER JOIN `Item` `item` ON `item`.`id` = `ItemAdjustment`.`itemId` GROUP BY `companyId`');
553
- expect(this.dialect.find(test_1.User, {
554
- $project: ['companyId', (0, util_1.raw)('COUNT(*)', 'count')],
555
- $group: ['companyId'],
556
- $having: {
557
- count: {
558
- $gte: 10,
559
- },
560
- },
561
- })).toBe('SELECT `companyId`, COUNT(*) `count` FROM `User` GROUP BY `companyId` HAVING `count` >= 10');
562
- expect(this.dialect.find(test_1.User, {
563
- $project: [(0, util_1.raw)(() => 'createdAt', 'hotness')],
564
- $filter: { name: 'something' },
565
- })).toBe("SELECT createdAt `hotness` FROM `User` WHERE `name` = 'something'");
566
- expect(this.dialect.find(test_1.User, {
567
- $project: [(0, util_1.raw)('*'), (0, util_1.raw)('LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt', 'hotness')],
568
- $filter: { name: 'something' },
569
- })).toBe("SELECT *, LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt `hotness` FROM `User` WHERE `name` = 'something'");
570
- }
571
- shouldFind$filterRaw() {
572
- expect(this.dialect.find(test_1.Item, {
573
- $project: ['id'],
574
- $filter: { $and: [{ companyId: 1 }, (0, util_1.raw)('SUM(salePrice) > 500')] },
575
- $group: ['creatorId'],
576
- })).toBe('SELECT `id` FROM `Item` WHERE `companyId` = 1 AND SUM(salePrice) > 500 GROUP BY `creatorId`');
577
- expect(this.dialect.find(test_1.Item, {
578
- $project: ['id'],
579
- $filter: { $or: [{ companyId: 1 }, 5, (0, util_1.raw)('SUM(salePrice) > 500')] },
580
- })).toBe('SELECT `id` FROM `Item` WHERE `companyId` = 1 OR `id` = 5 OR SUM(salePrice) > 500');
581
- expect(this.dialect.find(test_1.Item, {
582
- $project: ['id'],
583
- $filter: { $and: [(0, util_1.raw)('SUM(`salePrice`) > 500')] },
584
- $group: ['companyId'],
585
- })).toBe('SELECT `id` FROM `Item` WHERE SUM(`salePrice`) > 500 GROUP BY `companyId`');
586
- expect(this.dialect.find(test_1.Item, {
587
- $project: ['id'],
588
- $filter: { $or: [1, (0, util_1.raw)('SUM(salePrice) > 500')] },
589
- })).toBe('SELECT `id` FROM `Item` WHERE `id` = 1 OR SUM(salePrice) > 500');
590
- expect(this.dialect.find(test_1.Item, {
591
- $project: ['id'],
592
- $filter: { $or: [(0, util_1.raw)('SUM(salePrice) > 500'), 1, { companyId: 1 }] },
593
- })).toBe('SELECT `id` FROM `Item` WHERE SUM(salePrice) > 500 OR `id` = 1 OR `companyId` = 1');
594
- expect(this.dialect.find(test_1.Item, {
595
- $project: ['id'],
596
- $filter: { $and: [(0, util_1.raw)('SUM(salePrice) > 500')] },
597
- $group: ['creatorId'],
598
- })).toBe('SELECT `id` FROM `Item` WHERE SUM(salePrice) > 500 GROUP BY `creatorId`');
599
- expect(this.dialect.find(test_1.Item, {
600
- $project: ['id'],
601
- $filter: (0, util_1.raw)('SUM(salePrice) > 500'),
602
- $group: ['creatorId'],
603
- })).toBe('SELECT `id` FROM `Item` WHERE SUM(salePrice) > 500 GROUP BY `creatorId`');
604
- expect(this.dialect.find(test_1.Item, {
605
- $project: ['id'],
606
- $filter: { $or: [[1, 2], { code: 'abc' }] },
607
- $group: ['creatorId'],
608
- })).toBe("SELECT `id` FROM `Item` WHERE `id` IN (1, 2) OR `code` = 'abc' GROUP BY `creatorId`");
609
- }
610
- shouldFind$startsWith() {
611
- expect(this.dialect.find(test_1.User, {
612
- $project: ['id'],
613
- $filter: { name: { $startsWith: 'Some' } },
614
- $sort: [
615
- { field: 'name', sort: 'asc' },
616
- { field: 'createdAt', sort: 'desc' },
617
- ],
618
- $skip: 0,
619
- $limit: 50,
620
- })).toBe("SELECT `id` FROM `User` WHERE `name` LIKE 'Some%' ORDER BY `name`, `createdAt` DESC LIMIT 50 OFFSET 0");
621
- expect(this.dialect.find(test_1.User, {
622
- $project: { id: true },
623
- $filter: { name: { $startsWith: 'Some', $ne: 'Something' } },
624
- $sort: { name: 1, id: -1 },
625
- $skip: 0,
626
- $limit: 50,
627
- })).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE 'Some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
628
- }
629
- shouldFind$istartsWith() {
630
- expect(this.dialect.find(test_1.User, {
631
- $project: ['id'],
632
- $filter: { name: { $istartsWith: 'Some' } },
633
- $sort: { name: 1, id: -1 },
634
- $skip: 0,
635
- $limit: 50,
636
- })).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE 'some%' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
637
- expect(this.dialect.find(test_1.User, {
638
- $project: { id: true },
639
- $filter: { name: { $istartsWith: 'Some', $ne: 'Something' } },
640
- $sort: { name: 1, id: -1 },
641
- $skip: 0,
642
- $limit: 50,
643
- })).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE 'some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
644
- }
645
- shouldFind$endsWith() {
646
- expect(this.dialect.find(test_1.User, {
647
- $project: ['id'],
648
- $filter: { name: { $endsWith: 'Some' } },
649
- $sort: { name: 1, id: -1 },
650
- $skip: 0,
651
- $limit: 50,
652
- })).toBe("SELECT `id` FROM `User` WHERE `name` LIKE '%Some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
653
- expect(this.dialect.find(test_1.User, {
654
- $project: ['id'],
655
- $filter: { name: { $endsWith: 'Some', $ne: 'Something' } },
656
- $sort: { name: 1, id: -1 },
657
- $skip: 0,
658
- $limit: 50,
659
- })).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE '%Some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
660
- }
661
- shouldFind$iendsWith() {
662
- expect(this.dialect.find(test_1.User, {
663
- $project: ['id'],
664
- $filter: { name: { $iendsWith: 'Some' } },
665
- $sort: { name: 1, id: -1 },
666
- $skip: 0,
667
- $limit: 50,
668
- })).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE '%some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
669
- expect(this.dialect.find(test_1.User, {
670
- $project: ['id'],
671
- $filter: { name: { $iendsWith: 'Some', $ne: 'Something' } },
672
- $sort: { name: 1, id: -1 },
673
- $skip: 0,
674
- $limit: 50,
675
- })).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE '%some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
676
- }
677
- shouldFind$includes() {
678
- expect(this.dialect.find(test_1.User, {
679
- $project: ['id'],
680
- $filter: { name: { $includes: 'Some' } },
681
- $sort: { name: 1, id: -1 },
682
- $skip: 0,
683
- $limit: 50,
684
- })).toBe("SELECT `id` FROM `User` WHERE `name` LIKE '%Some%' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
685
- expect(this.dialect.find(test_1.User, {
686
- $project: ['id'],
687
- $filter: { name: { $includes: 'Some', $ne: 'Something' } },
688
- $sort: { name: 1, id: -1 },
689
- $skip: 0,
690
- $limit: 50,
691
- })).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE '%Some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
692
- }
693
- shouldFind$iincludes() {
694
- expect(this.dialect.find(test_1.User, {
695
- $project: ['id'],
696
- $filter: { name: { $iincludes: 'Some' } },
697
- $sort: { name: 1, id: -1 },
698
- $skip: 0,
699
- $limit: 50,
700
- })).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE '%some%' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
701
- expect(this.dialect.find(test_1.User, {
702
- $project: ['id'],
703
- $filter: { name: { $iincludes: 'Some', $ne: 'Something' } },
704
- $sort: { name: 1, id: -1 },
705
- $skip: 0,
706
- $limit: 50,
707
- })).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE '%some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
708
- }
709
- shouldFind$like() {
710
- expect(this.dialect.find(test_1.User, {
711
- $project: ['id'],
712
- $filter: { name: { $like: 'Some' } },
713
- $sort: { name: 1, id: -1 },
714
- $skip: 0,
715
- $limit: 50,
716
- })).toBe("SELECT `id` FROM `User` WHERE `name` LIKE 'Some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
717
- expect(this.dialect.find(test_1.User, {
718
- $project: { id: true },
719
- $filter: { name: { $like: 'Some', $ne: 'Something' } },
720
- $sort: { name: 1, id: -1 },
721
- $skip: 0,
722
- $limit: 50,
723
- })).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE 'Some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
724
- }
725
- shouldFind$ilike() {
726
- expect(this.dialect.find(test_1.User, {
727
- $project: ['id'],
728
- $filter: { name: { $ilike: 'Some' } },
729
- $sort: { name: 1, id: -1 },
730
- $skip: 0,
731
- $limit: 50,
732
- })).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE 'some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
733
- expect(this.dialect.find(test_1.User, {
734
- $project: { id: true },
735
- $filter: { name: { $ilike: 'Some', $ne: 'Something' } },
736
- $sort: { name: 1, id: -1 },
737
- $skip: 0,
738
- $limit: 50,
739
- })).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE 'some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
740
- }
741
- shouldFind$regex() {
742
- expect(this.dialect.find(test_1.User, {
743
- $project: ['id'],
744
- $filter: { name: { $regex: '^some' } },
745
- })).toBe("SELECT `id` FROM `User` WHERE `name` REGEXP '^some'");
746
- }
747
- shouldFind$text() {
748
- expect(this.dialect.find(test_1.Item, {
749
- $project: { id: true },
750
- $filter: { $text: { $fields: ['name', 'description'], $value: 'some text' }, companyId: 1 },
751
- $limit: 30,
752
- })).toBe("SELECT `id` FROM `Item` WHERE `Item` MATCH {`name` `description`} : 'some text' AND `companyId` = 1 LIMIT 30");
753
- expect(this.dialect.find(test_1.User, {
754
- $project: { id: 1 },
755
- $filter: {
756
- $text: { $fields: ['name'], $value: 'something' },
757
- name: { $ne: 'other unwanted' },
758
- companyId: 1,
759
- },
760
- $limit: 10,
761
- })).toBe("SELECT `id` FROM `User` WHERE `User` MATCH {`name`} : 'something' AND `name` <> 'other unwanted' AND `companyId` = 1 LIMIT 10");
762
- }
763
- }
764
- exports.AbstractSqlDialectSpec = AbstractSqlDialectSpec;
765
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RTcWxEaWFsZWN0LXNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlhbGVjdC9hYnN0cmFjdFNxbERpYWxlY3Qtc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBd0k7QUFHeEkseUNBQXFDO0FBR3JDLE1BQXNCLHNCQUFzQjtJQUMxQyxZQUFxQixPQUEyQjtRQUEzQixZQUFPLEdBQVAsT0FBTyxDQUFvQjtJQUFHLENBQUM7SUFFcEQsNEJBQTRCO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sQ0FDSixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFJLEVBQUU7WUFDeEI7Z0JBQ0UsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLEtBQUssRUFBRSx3QkFBd0I7Z0JBQy9CLFNBQVMsRUFBRSxHQUFHO2FBQ2Y7WUFDRDtnQkFDRSxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsS0FBSyxFQUFFLHdCQUF3QjtnQkFDL0IsU0FBUyxFQUFFLEdBQUc7YUFDZjtZQUNEO2dCQUNFLElBQUksRUFBRSxhQUFhO2dCQUNuQixLQUFLLEVBQUUsd0JBQXdCO2dCQUMvQixTQUFTLEVBQUUsR0FBRzthQUNmO1NBQ0YsQ0FBQyxDQUNILENBQUMsSUFBSSxDQUNKLDBEQUEwRDtZQUN4RCxpREFBaUQ7WUFDakQsa0RBQWtEO1lBQ2xELGtEQUFrRCxDQUNyRCxDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLENBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENB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dCB7IFNwZWMsIFVzZXIsIEl0ZW0sIEl0ZW1BZGp1c3RtZW50LCBUYXhDYXRlZ29yeSwgUHJvZmlsZSwgSW52ZW50b3J5QWRqdXN0bWVudCwgTWVhc3VyZVVuaXQsIENvbXBhbnksIFRheCB9IGZyb20gJ0B1cWwvY29yZS90ZXN0JztcblxuaW1wb3J0IHsgRmllbGRLZXksIFF1ZXJ5RmlsdGVyIH0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuaW1wb3J0IHsgcmF3IH0gZnJvbSAnQHVxbC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxEaWFsZWN0IH0gZnJvbSAnLi9hYnN0cmFjdFNxbERpYWxlY3QnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTcWxEaWFsZWN0U3BlYyBpbXBsZW1lbnRzIFNwZWMge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBkaWFsZWN0OiBBYnN0cmFjdFNxbERpYWxlY3QpIHt9XG5cbiAgc2hvdWxkQmVWYWxpZEVzY2FwZUNoYXJhY3RlcigpIHtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmVzY2FwZUlkQ2hhcikudG9CZSgnYCcpO1xuICB9XG5cbiAgc2hvdWxkQmVnaW5UcmFuc2FjdGlvbigpIHtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmJlZ2luVHJhbnNhY3Rpb25Db21tYW5kKS50b0JlKCdCRUdJTiBUUkFOU0FDVElPTicpO1xuICB9XG5cbiAgc2hvdWxkSW5zZXJ0TWFueSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFVzZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMScsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwxQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMicsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwyQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDQ1NixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMycsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwzQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDc4OSxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS50b0JlKFxuICAgICAgJ0lOU0VSVCBJTlRPIGBVc2VyYCAoYG5hbWVgLCBgZW1haWxgLCBgY3JlYXRlZEF0YCkgVkFMVUVTJyArXG4gICAgICAgIFwiICgnU29tZSBuYW1lIDEnLCAnc29tZWVtYWlsMUBleGFtcGxlLmNvbScsIDEyMylcIiArXG4gICAgICAgIFwiLCAoJ1NvbWUgbmFtZSAyJywgJ3NvbWVlbWFpbDJAZXhhbXBsZS5jb20nLCA0NTYpXCIgK1xuICAgICAgICBcIiwgKCdTb21lIG5hbWUgMycsICdzb21lZW1haWwzQGV4YW1wbGUuY29tJywgNzg5KVwiXG4gICAgKTtcbiAgfVxuXG4gIHNob3VsZEluc2VydE9uZSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFVzZXIsIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZScsXG4gICAgICAgIGVtYWlsOiAnc29tZWVtYWlsQGV4YW1wbGUuY29tJyxcbiAgICAgICAgY3JlYXRlZEF0OiAxMjMsXG4gICAgICB9KVxuICAgICkudG9CZShcIklOU0VSVCBJTlRPIGBVc2VyYCAoYG5hbWVgLCBgZW1haWxgLCBgY3JlYXRlZEF0YCkgVkFMVUVTICgnU29tZSBOYW1lJywgJ3NvbWVlbWFpbEBleGFtcGxlLmNvbScsIDEyMylcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KEludmVudG9yeUFkanVzdG1lbnQsIHtcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoMjAyMSwgMTEsIDMxLCAyMywgNTksIDU5LCA5OTkpLFxuICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiSU5TRVJUIElOVE8gYEludmVudG9yeUFkanVzdG1lbnRgIChgZGF0ZWAsIGBjcmVhdGVkQXRgKSBWQUxVRVMgKCcyMDIxLTEyLTMxIDIzOjU5OjU5Ljk5OScsIDEyMylcIik7XG4gIH1cblxuICBzaG91bGRJbnNlcnRXaXRoT25JbnNlcnRJZCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFRheENhdGVnb3J5LCB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgIH0pXG4gICAgKS50b01hdGNoKC9eSU5TRVJUIElOVE8gYFRheENhdGVnb3J5YCBcXChgbmFtZWAsIGBjcmVhdGVkQXRgLCBgcGtgXFwpIFZBTFVFUyBcXCgnU29tZSBOYW1lJywgMTIzLCAnLisnXFwpJC8pO1xuICB9XG5cbiAgc2hvdWxkSW5zZXJ0TWFueVdpdGhTcGVjaWZpZWRJZHNBbmRPbkluc2VydElkQXNEZWZhdWx0KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5pbnNlcnQoVGF4Q2F0ZWdvcnksIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwazogJzUwJyxcbiAgICAgICAgICBuYW1lOiAnU29tZSBOYW1lIEInLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBDJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBrOiAnNzAnLFxuICAgICAgICAgIG5hbWU6ICdTb21lIE5hbWUgRCcsXG4gICAgICAgIH0sXG4gICAgICBdKVxuICAgICkudG9NYXRjaChcbiAgICAgIC9eSU5TRVJUIElOVE8gYFRheENhdGVnb3J5YCBcXChgbmFtZWAsIGBjcmVhdGVkQXRgLCBgcGtgXFwpIFZBTFVFUyBcXCgnU29tZSBOYW1lIEEnLCBcXGQrLCAnLisnXFwpLCBcXCgnU29tZSBOYW1lIEInLCBcXGQrLCAnNTAnXFwpLCBcXCgnU29tZSBOYW1lIEMnLCBcXGQrLCAnLisnXFwpLCBcXCgnU29tZSBOYW1lIEQnLCBcXGQrLCAnNzAnXFwpJC9cbiAgICApO1xuICB9XG5cbiAgc2hvdWxkVXBkYXRlKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC51cGRhdGUoXG4gICAgICAgIFVzZXIsXG4gICAgICAgIHsgJGZpbHRlcjogeyBuYW1lOiAnc29tZScsIGNyZWF0b3JJZDogMTIzIH0gfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIFRleHQnLFxuICAgICAgICAgIHVwZGF0ZWRBdDogMzIxLFxuICAgICAgICB9XG4gICAgICApXG4gICAgKS50b0JlKFwiVVBEQVRFIGBVc2VyYCBTRVQgYG5hbWVgID0gJ1NvbWUgVGV4dCcsIGB1cGRhdGVkQXRgID0gMzIxIFdIRVJFIGBuYW1lYCA9ICdzb21lJyBBTkQgYGNyZWF0b3JJZGAgPSAxMjNcIik7XG4gIH1cblxuICBzaG91bGRGaW5kKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBpZDogMTIzLCBuYW1lOiAnYWJjJyB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgaWRgID0gMTIzIEFORCBgbmFtZWAgPSAnYWJjJ1wiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFByb2ZpbGUsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnLCAncGljdHVyZScsICdjb21wYW55SWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBpZDogMTIzLCBwaWN0dXJlOiAnYWJjJyB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYHBrYCBgaWRgLCBgaW1hZ2VgIGBwaWN0dXJlYCwgYGNvbXBhbnlJZGAgRlJPTSBgdXNlcl9wcm9maWxlYCBXSEVSRSBgcGtgID0gMTIzIEFORCBgaW1hZ2VgID0gJ2FiYydcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChNZWFzdXJlVW5pdCwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IGlkOiAxMjMsIG5hbWU6ICdhYmMnIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYE1lYXN1cmVVbml0YCBXSEVSRSBgaWRgID0gMTIzIEFORCBgbmFtZWAgPSAnYWJjJyBBTkQgYGRlbGV0ZWRBdGAgSVMgTlVMTFwiKTtcbiAgfVxuXG4gIHNob3VsZEJlU2VjdXJlKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnLCAnc29tZXRoaW5nJyBhcyBGaWVsZEtleTxVc2VyPl0sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICBzb21ldGhpbmc6IDEsXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICAkc29ydDoge1xuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIHNvbWV0aGluZzogMSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICRncm91cDogWydpZCcsICdzb21ldGhpbmcnIGFzIGFueV0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGlkYCA9IDEgQU5EIGBzb21ldGhpbmdgID0gMSBHUk9VUCBCWSBgaWRgLCBgc29tZXRoaW5nYCBPUkRFUiBCWSBgaWRgLCBgc29tZXRoaW5nYCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0Lmluc2VydChVc2VyLCB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICBzb21ldGhpbmc6ICdhbnl0aGluZycsXG4gICAgICAgIGNyZWF0ZWRBdDogMSxcbiAgICAgIH0gYXMgYW55KVxuICAgICkudG9CZShcIklOU0VSVCBJTlRPIGBVc2VyYCAoYG5hbWVgLCBgY3JlYXRlZEF0YCkgVkFMVUVTICgnU29tZSBOYW1lJywgMSlcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QudXBkYXRlKFxuICAgICAgICBVc2VyLFxuICAgICAgICB7XG4gICAgICAgICAgJGZpbHRlcjogeyBzb21ldGhpbmc6ICdhbnl0aGluZycgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICAgIHNvbWV0aGluZzogJ2FueXRoaW5nJyxcbiAgICAgICAgICB1cGRhdGVkQXQ6IDEsXG4gICAgICAgIH0gYXMgYW55XG4gICAgICApXG4gICAgKS50b0JlKFwiVVBEQVRFIGBVc2VyYCBTRVQgYG5hbWVgID0gJ1NvbWUgTmFtZScsIGB1cGRhdGVkQXRgID0gMSBXSEVSRSBgc29tZXRoaW5nYCA9ICdhbnl0aGluZydcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZGVsZXRlKFVzZXIsIHtcbiAgICAgICAgJGZpbHRlcjogeyBzb21ldGhpbmc6ICdhbnl0aGluZycgfSBhcyBhbnksXG4gICAgICB9KVxuICAgICkudG9CZShcIkRFTEVURSBGUk9NIGBVc2VyYCBXSEVSRSBgc29tZXRoaW5nYCA9ICdhbnl0aGluZydcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGFuZCgpIHtcbiAgICBjb25zdCBzcWwgPSBcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMgQU5EIGBuYW1lYCA9ICdhYmMnXCI7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJGFuZDogW3sgaWQ6IDEyMywgbmFtZTogJ2FiYycgfV0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKHNxbCk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiAxIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJGFuZDogW3sgaWQ6IDEyMyB9XSwgbmFtZTogJ2FiYycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKHNxbCk7XG4gIH1cblxuICBzaG91bGRGaW5kJG9yKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFt7IGlkOiAxMjMgfSwgeyBuYW1lOiAnYWJjJyB9XSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgaWRgID0gMTIzIE9SIGBuYW1lYCA9ICdhYmMnXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRvcjogW3sgaWQ6IDEyMyB9XSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEgfSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFt7IGlkOiAxMjMsIG5hbWU6ICdhYmMnIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMgQU5EIGBuYW1lYCA9ICdhYmMnXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRvcjogW3sgaWQ6IDEyMyB9XSwgbmFtZTogJ2FiYycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGlkYCA9IDEyMyBBTkQgYG5hbWVgID0gJ2FiYydcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJG5vdCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vdDogW3sgbmFtZTogJ1NvbWUnIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCBgbmFtZWAgPSAnU29tZSdcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChDb21wYW55LCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgaWQ6IHsgJG5vdDogMTIzIH0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCBGUk9NIGBDb21wYW55YCBXSEVSRSBOT1QgYGlkYCA9IDEyMycpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoQ29tcGFueSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IGlkOiB7ICRub3Q6IFsxMjMsIDQ1Nl0gfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYENvbXBhbnlgIFdIRVJFIE5PVCBgaWRgIElOICgxMjMsIDQ1NiknKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKENvbXBhbnksIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBpZDogMTIzLCBuYW1lOiB7ICRub3Q6IHsgJHN0YXJ0c1dpdGg6ICdhJyB9IH0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgQ29tcGFueWAgV0hFUkUgYGlkYCA9IDEyMyBBTkQgTk9UIGBuYW1lYCBMSUtFICdhJSdcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChDb21wYW55LCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkbm90OiB7ICRzdGFydHNXaXRoOiAnYScsICRlbmRzV2l0aDogJ3onIH0gfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBDb21wYW55YCBXSEVSRSBOT1QgKGBuYW1lYCBMSUtFICdhJScgQU5EIGBuYW1lYCBMSUtFICcleicpXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7ICRub3Q6IFt7IG5hbWU6IHsgJGxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCAoYG5hbWVgIExJS0UgJ1NvbWUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7ICRub3Q6IFt7IG5hbWU6ICdhYmMnIH0sIHsgY3JlYXRvcklkOiAxIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCAoYG5hbWVgID0gJ2FiYycgQU5EIGBjcmVhdG9ySWRgID0gMSlcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChUYXgsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjb21wYW55SWQ6IDEsIG5hbWU6IHsgJG5vdDogeyAkc3RhcnRzV2l0aDogJ2EnIH0gfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBUYXhgIFdIRVJFIGBjb21wYW55SWRgID0gMSBBTkQgTk9UIGBuYW1lYCBMSUtFICdhJSdcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJG5vcigpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vcjogW3sgbmFtZTogJ1NvbWUnIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCBgbmFtZWAgPSAnU29tZSdcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vcjogW3sgbmFtZTogeyAkbGlrZTogJ1NvbWUnLCAkbmU6ICdTb21ldGhpbmcnIH0gfV0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgTk9UIChgbmFtZWAgTElLRSAnU29tZScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJylcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vcjogW3sgbmFtZTogJ2FiYycgfSwgeyBjcmVhdG9ySWQ6IDEgfV0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgTk9UIChgbmFtZWAgPSAnYWJjJyBPUiBgY3JlYXRvcklkYCA9IDEpXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRvckFuZCRhbmQoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IGNyZWF0b3JJZDogMSwgJG9yOiBbeyBuYW1lOiBbJ2EnLCAnYicsICdjJ10gfSwgeyBlbWFpbDogJ2FiY0BleGFtcGxlLmNvbScgfV0sIGlkOiAxIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBjcmVhdG9ySWRgID0gMSBBTkQgKGBuYW1lYCBJTiAoJ2EnLCAnYicsICdjJykgT1IgYGVtYWlsYCA9ICdhYmNAZXhhbXBsZS5jb20nKSBBTkQgYGlkYCA9IDFcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICBjcmVhdG9ySWQ6IDEsXG4gICAgICAgICAgJG9yOiBbeyBuYW1lOiBbJ2EnLCAnYicsICdjJ10gfSwgeyBlbWFpbDogJ2FiY0BleGFtcGxlLmNvbScgfV0sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgZW1haWw6ICdlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBjcmVhdG9ySWRgID0gMScgK1xuICAgICAgICBcIiBBTkQgKGBuYW1lYCBJTiAoJ2EnLCAnYicsICdjJykgT1IgYGVtYWlsYCA9ICdhYmNAZXhhbXBsZS5jb20nKSBBTkQgYGlkYCA9IDEgQU5EIGBlbWFpbGAgPSAnZSdcIlxuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICBjcmVhdG9ySWQ6IDEsXG4gICAgICAgICAgJG9yOiBbeyBuYW1lOiBbJ2EnLCAnYicsICdjJ10gfSwgeyBlbWFpbDogJ2FiY0BleGFtcGxlLmNvbScgfV0sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgZW1haWw6ICdlJyxcbiAgICAgICAgfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgY3JlYXRlZEF0OiAtMSB9LFxuICAgICAgICAkc2tpcDogNTAsXG4gICAgICAgICRsaW1pdDogMTAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgY3JlYXRvcklkYCA9IDEnICtcbiAgICAgICAgXCIgQU5EIChgbmFtZWAgSU4gKCdhJywgJ2InLCAnYycpIE9SIGBlbWFpbGAgPSAnYWJjQGV4YW1wbGUuY29tJylcIiArXG4gICAgICAgIFwiIEFORCBgaWRgID0gMSBBTkQgYGVtYWlsYCA9ICdlJ1wiICtcbiAgICAgICAgJyBPUkRFUiBCWSBgbmFtZWAsIGBjcmVhdGVkQXRgIERFU0MgTElNSVQgMTAgT0ZGU0VUIDUwJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY3JlYXRvcklkOiAxLFxuICAgICAgICAgICAgICBpZDogMSxcbiAgICAgICAgICAgICAgZW1haWw6ICdlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFsnYScsICdiJywgJ2MnXSwgZW1haWw6ICdhYmNAZXhhbXBsZS5jb20nIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgJHNvcnQ6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnbmFtZScsIHNvcnQ6ICdhc2MnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIHNvcnQ6ICdkZXNjJyB9LFxuICAgICAgICBdLFxuICAgICAgICAkc2tpcDogNTAsXG4gICAgICAgICRsaW1pdDogMTAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgIFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBjcmVhdG9ySWRgID0gMSBBTkQgYGlkYCA9IDEgQU5EIGBlbWFpbGAgPSAnZScpXCIgK1xuICAgICAgICBcIiBPUiAoYG5hbWVgIElOICgnYScsICdiJywgJ2MnKSBBTkQgYGVtYWlsYCA9ICdhYmNAZXhhbXBsZS5jb20nKVwiICtcbiAgICAgICAgJyBPUkRFUiBCWSBgbmFtZWAsIGBjcmVhdGVkQXRgIERFU0MgTElNSVQgMTAgT0ZGU0VUIDUwJ1xuICAgICk7XG4gIH1cblxuICBzaG91bGRGaW5kU2luZ2xlJGZpbHRlcigpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnIH0sXG4gICAgICAgICRsaW1pdDogMyxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWUnIExJTUlUIDNcIik7XG4gIH1cblxuICBzaG91bGRGaW5kTXVsdGlwbGVDb21wYXJpc29uT3BlcmF0b3JzKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFt7IG5hbWU6IHsgJGVxOiAnb3RoZXInLCAkbmU6ICdvdGhlciB1bndhbnRlZCcgfSB9LCB7IGNvbXBhbnlJZDogMSB9XSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSAoYG5hbWVgID0gJ290aGVyJyBBTkQgYG5hbWVgIDw+ICdvdGhlciB1bndhbnRlZCcpIE9SIGBjb21wYW55SWRgID0gMVwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjcmVhdGVkQXQ6IHsgJGd0ZTogMTIzLCAkbHRlOiA5OTkgfSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIChgY3JlYXRlZEF0YCA+PSAxMjMgQU5EIGBjcmVhdGVkQXRgIDw9IDk5OSkgTElNSVQgMTAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjcmVhdGVkQXQ6IHsgJGd0OiAxMjMsICRsdDogOTk5IH0gfSxcbiAgICAgICAgJGxpbWl0OiAxMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSAoYGNyZWF0ZWRBdGAgPiAxMjMgQU5EIGBjcmVhdGVkQXRgIDwgOTk5KSBMSU1JVCAxMCcpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRuZSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnLCBjb21wYW55SWQ6IHsgJG5lOiA1IH0gfSxcbiAgICAgICAgJGxpbWl0OiAyMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWUnIEFORCBgY29tcGFueUlkYCA8PiA1IExJTUlUIDIwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZElzTnVsbCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgY3JlYXRvcklkOiAxMjMsIGNvbXBhbnlJZDogbnVsbCB9LFxuICAgICAgICAkbGltaXQ6IDUsXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGNyZWF0b3JJZGAgPSAxMjMgQU5EIGBjb21wYW55SWRgIElTIE5VTEwgTElNSVQgNScpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IGNyZWF0b3JJZDogMTIzLCBjb21wYW55SWQ6IHsgJG5lOiBudWxsIH0gfSxcbiAgICAgICAgJGxpbWl0OiA1LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBjcmVhdG9ySWRgID0gMTIzIEFORCBgY29tcGFueUlkYCBJUyBOT1QgTlVMTCBMSU1JVCA1Jyk7XG4gIH1cblxuICBzaG91bGRGaW5kJGluKCkge1xuICAgIGNvbnN0IHNxbCA9IFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWUnIEFORCBgY29tcGFueUlkYCBJTiAoMSwgMiwgMykgTElNSVQgMTBcIjtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnLCBjb21wYW55SWQ6IFsxLCAyLCAzXSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoc3FsKTtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnLCBjb21wYW55SWQ6IHsgJGluOiBbMSwgMiwgM10gfSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoc3FsKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkbmluKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiAnc29tZScsIGNvbXBhbnlJZDogeyAkbmluOiBbMSwgMiwgM10gfSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgbmFtZWAgPSAnc29tZScgQU5EIGBjb21wYW55SWRgIE5PVCBJTiAoMSwgMiwgMykgTElNSVQgMTBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJHByb2plY3RGaWVsZHMoKSB7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHsgJHByb2plY3Q6IHsgaWQ6IHRydWUsIGNvbXBhbnk6IHRydWUgfSB9KSkudG9CZShcbiAgICAgICdTRUxFQ1QgYFVzZXJgLmBpZGAsIGBjb21wYW55YC5gaWRgIGBjb21wYW55LmlkYCwgYGNvbXBhbnlgLmBjb21wYW55SWRgIGBjb21wYW55LmNvbXBhbnlJZGAsIGBjb21wYW55YC5gY3JlYXRvcklkYCBgY29tcGFueS5jcmVhdG9ySWRgJyArXG4gICAgICAgICcsIGBjb21wYW55YC5gY3JlYXRlZEF0YCBgY29tcGFueS5jcmVhdGVkQXRgLCBgY29tcGFueWAuYHVwZGF0ZWRBdGAgYGNvbXBhbnkudXBkYXRlZEF0YCcgK1xuICAgICAgICAnLCBgY29tcGFueWAuYG5hbWVgIGBjb21wYW55Lm5hbWVgLCBgY29tcGFueWAuYGRlc2NyaXB0aW9uYCBgY29tcGFueS5kZXNjcmlwdGlvbmAnICtcbiAgICAgICAgJyBGUk9NIGBVc2VyYCBMRUZUIEpPSU4gYENvbXBhbnlgIGBjb21wYW55YCBPTiBgY29tcGFueWAuYGlkYCA9IGBVc2VyYC5gY29tcGFueUlkYCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0T25lVG9PbmUoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSwgbmFtZTogdHJ1ZSwgcHJvZmlsZTogWydpZCcsICdwaWN0dXJlJ10gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgVXNlcmAuYGlkYCwgYFVzZXJgLmBuYW1lYCwgYHByb2ZpbGVgLmBwa2AgYHByb2ZpbGUuaWRgLCBgcHJvZmlsZWAuYGltYWdlYCBgcHJvZmlsZS5waWN0dXJlYCBGUk9NIGBVc2VyYCcgK1xuICAgICAgICAnIExFRlQgSk9JTiBgdXNlcl9wcm9maWxlYCBgcHJvZmlsZWAgT04gYHByb2ZpbGVgLmBjcmVhdG9ySWRgID0gYFVzZXJgLmBpZGAnXG4gICAgKTtcblxuICAgIGV4cGVjdCh0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7ICRwcm9qZWN0OiB7IHByb2ZpbGU6IHRydWUgfSB9KSkudG9CZShcbiAgICAgICdTRUxFQ1QgYFVzZXJgLmBpZGAsIGBwcm9maWxlYC5gY29tcGFueUlkYCBgcHJvZmlsZS5jb21wYW55SWRgJyArXG4gICAgICAgICcsIGBwcm9maWxlYC5gY3JlYXRvcklkYCBgcHJvZmlsZS5jcmVhdG9ySWRgLCBgcHJvZmlsZWAuYGNyZWF0ZWRBdGAgYHByb2ZpbGUuY3JlYXRlZEF0YCcgK1xuICAgICAgICAnLCBgcHJvZmlsZWAuYHVwZGF0ZWRBdGAgYHByb2ZpbGUudXBkYXRlZEF0YCcgK1xuICAgICAgICAnLCBgcHJvZmlsZWAuYHBrYCBgcHJvZmlsZS5pZGAsIGBwcm9maWxlYC5gaW1hZ2VgIGBwcm9maWxlLnBpY3R1cmVgJyArXG4gICAgICAgICcgRlJPTSBgVXNlcmAgTEVGVCBKT0lOIGB1c2VyX3Byb2ZpbGVgIGBwcm9maWxlYCBPTiBgcHJvZmlsZWAuYGNyZWF0b3JJZGAgPSBgVXNlcmAuYGlkYCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0TWFueVRvT25lKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICBuYW1lOiB0cnVlLFxuICAgICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgICAgdGF4OiB7ICRwcm9qZWN0OiBbJ2lkJywgJ25hbWUnXSwgJHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHsgJHByb2plY3Q6IFsnaWQnLCAnbmFtZScsICdjYXRlZ29yeUlkJ10gfSxcbiAgICAgICAgfSxcbiAgICAgICAgJGxpbWl0OiAxMDAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYEl0ZW1gLmBpZGAsIGBJdGVtYC5gbmFtZWAsIGBJdGVtYC5gY29kZWAnICtcbiAgICAgICAgJywgYHRheGAuYGlkYCBgdGF4LmlkYCwgYHRheGAuYG5hbWVgIGB0YXgubmFtZWAnICtcbiAgICAgICAgJywgYG1lYXN1cmVVbml0YC5gaWRgIGBtZWFzdXJlVW5pdC5pZGAsIGBtZWFzdXJlVW5pdGAuYG5hbWVgIGBtZWFzdXJlVW5pdC5uYW1lYCwgYG1lYXN1cmVVbml0YC5gY2F0ZWdvcnlJZGAgYG1lYXN1cmVVbml0LmNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAnICtcbiAgICAgICAgJyBJTk5FUiBKT0lOIGBUYXhgIGB0YXhgIE9OIGB0YXhgLmBpZGAgPSBgSXRlbWAuYHRheElkYCcgK1xuICAgICAgICAnIExFRlQgSk9JTiBgTWVhc3VyZVVuaXRgIGBtZWFzdXJlVW5pdGAgT04gYG1lYXN1cmVVbml0YC5gaWRgID0gYEl0ZW1gLmBtZWFzdXJlVW5pdElkYCcgK1xuICAgICAgICAnIExJTUlUIDEwMCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0V2l0aEFsbEZpZWxkc0FuZFNwZWNpZmljRmllbGRzQW5kRmlsdGVyKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICBuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lYXN1cmVVbml0OiB7ICRwcm9qZWN0OiBbJ2lkJywgJ25hbWUnXSwgJGZpbHRlcjogeyBuYW1lOiB7ICRuZTogJ3VuaWRhZCcgfSB9LCAkcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB0YXg6IFsnaWQnLCAnbmFtZSddLFxuICAgICAgICB9LFxuICAgICAgICAkZmlsdGVyOiB7IHNhbGVQcmljZTogeyAkZ3RlOiAxMDAwIH0sIG5hbWU6IHsgJGlzdGFydHNXaXRoOiAnQScgfSB9LFxuICAgICAgICAkc29ydDogeyB0YXg6IHsgbmFtZTogMSB9LCBtZWFzdXJlVW5pdDogeyBuYW1lOiAxIH0sIGNyZWF0ZWRBdDogLTEgfSxcbiAgICAgICAgJGxpbWl0OiAxMDAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYEl0ZW1gLmBpZGAsIGBJdGVtYC5gbmFtZWAnICtcbiAgICAgICAgJywgYG1lYXN1cmVVbml0YC5gaWRgIGBtZWFzdXJlVW5pdC5pZGAsIGBtZWFzdXJlVW5pdGAuYG5hbWVgIGBtZWFzdXJlVW5pdC5uYW1lYCcgK1xuICAgICAgICAnLCBgdGF4YC5gaWRgIGB0YXguaWRgLCBgdGF4YC5gbmFtZWAgYHRheC5uYW1lYCcgK1xuICAgICAgICAnIEZST00gYEl0ZW1gJyArXG4gICAgICAgIFwiIElOTkVSIEpPSU4gYE1lYXN1cmVVbml0YCBgbWVhc3VyZVVuaXRgIE9OIGBtZWFzdXJlVW5pdGAuYGlkYCA9IGBJdGVtYC5gbWVhc3VyZVVuaXRJZGAgQU5EIGBtZWFzdXJlVW5pdGAuYG5hbWVgIDw+ICd1bmlkYWQnIEFORCBgbWVhc3VyZVVuaXRgLmBkZWxldGVkQXRgIElTIE5VTExcIiArXG4gICAgICAgICcgTEVGVCBKT0lOIGBUYXhgIGB0YXhgIE9OIGB0YXhgLmBpZGAgPSBgSXRlbWAuYHRheElkYCcgK1xuICAgICAgICBcIiBXSEVSRSBgSXRlbWAuYHNhbGVQcmljZWAgPj0gMTAwMCBBTkQgTE9XRVIoYEl0ZW1gLmBuYW1lYCkgTElLRSAnYSUnXCIgK1xuICAgICAgICAnIE9SREVSIEJZIGB0YXhgLmBuYW1lYCwgYG1lYXN1cmVVbml0YC5gbmFtZWAsIGBJdGVtYC5gY3JlYXRlZEF0YCBERVNDIExJTUlUIDEwMCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkVmlydHVhbEZpZWxkKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgJGZpbHRlcjoge1xuICAgICAgICAgIHRhZ3NDb3VudDogeyAkZ3RlOiAxMCB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIChTRUxFQ1QgQ09VTlQoKikgYGNvdW50YCBGUk9NIGBJdGVtVGFnYCBXSEVSRSBgSXRlbVRhZ2AuYGl0ZW1JZGAgPSBgaWRgKSA+PSAxMCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIG5hbWU6IDEsXG4gICAgICAgICAgY29kZTogMSxcbiAgICAgICAgICB0YWdzQ291bnQ6IDEsXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgICAgICRwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAxLCBjYXRlZ29yeUlkOiAxLCBjYXRlZ29yeTogWyduYW1lJ10gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAkbGltaXQ6IDEwMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgSXRlbWAuYGlkYCwgYEl0ZW1gLmBuYW1lYCwgYEl0ZW1gLmBjb2RlYCcgK1xuICAgICAgICAnLCAoU0VMRUNUIENPVU5UKCopIGBjb3VudGAgRlJPTSBgSXRlbVRhZ2AgV0hFUkUgYEl0ZW1UYWdgLmBpdGVtSWRgID0gYEl0ZW1gLmBpZGApIGB0YWdzQ291bnRgJyArXG4gICAgICAgICcsIGBtZWFzdXJlVW5pdGAuYGlkYCBgbWVhc3VyZVVuaXQuaWRgLCBgbWVhc3VyZVVuaXRgLmBuYW1lYCBgbWVhc3VyZVVuaXQubmFtZWAsIGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgIGBtZWFzdXJlVW5pdC5jYXRlZ29yeUlkYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgLmBpZGAgYG1lYXN1cmVVbml0LmNhdGVnb3J5LmlkYCwgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gbmFtZWAgYG1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdGAgYG1lYXN1cmVVbml0YCBPTiBgbWVhc3VyZVVuaXRgLmBpZGAgPSBgSXRlbWAuYG1lYXN1cmVVbml0SWRgJyArXG4gICAgICAgICcgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdENhdGVnb3J5YCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgIE9OIGBtZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgTElNSVQgMTAwJ1xuICAgICk7XG4gIH1cblxuICBzaG91bGRGaW5kJHByb2plY3REZWVwKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICBuYW1lOiAxLFxuICAgICAgICAgIGNvZGU6IDEsXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgICAgICRwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAxLCBjYXRlZ29yeUlkOiAxLCBjYXRlZ29yeTogWyduYW1lJ10gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAkbGltaXQ6IDEwMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgSXRlbWAuYGlkYCwgYEl0ZW1gLmBuYW1lYCwgYEl0ZW1gLmBjb2RlYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXRgLmBpZGAgYG1lYXN1cmVVbml0LmlkYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXRgLmBuYW1lYCBgbWVhc3VyZVVuaXQubmFtZWAsIGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgIGBtZWFzdXJlVW5pdC5jYXRlZ29yeUlkYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgLmBpZGAgYG1lYXN1cmVVbml0LmNhdGVnb3J5LmlkYCwgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gbmFtZWAgYG1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdGAgYG1lYXN1cmVVbml0YCBPTiBgbWVhc3VyZVVuaXRgLmBpZGAgPSBgSXRlbWAuYG1lYXN1cmVVbml0SWRgJyArXG4gICAgICAgICcgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdENhdGVnb3J5YCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgIE9OIGBtZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgTElNSVQgMTAwJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiB7XG4gICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgICAgbmFtZTogdHJ1ZSxcbiAgICAgICAgICBjb2RlOiB0cnVlLFxuICAgICAgICAgIG1lYXN1cmVVbml0OiB7XG4gICAgICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSwgbmFtZTogdHJ1ZSwgY2F0ZWdvcnk6IHsgJHByb2plY3Q6IHsgaWQ6IHRydWUsIG5hbWU6IHRydWUgfSB9IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJGxpbWl0OiAxMDAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYEl0ZW1gLmBpZGAsIGBJdGVtYC5gbmFtZWAsIGBJdGVtYC5gY29kZWAsIGBtZWFzdXJlVW5pdGAuYGlkYCBgbWVhc3VyZVVuaXQuaWRgJyArXG4gICAgICAgICcsIGBtZWFzdXJlVW5pdGAuYG5hbWVgIGBtZWFzdXJlVW5pdC5uYW1lYCwgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gaWRgIGBtZWFzdXJlVW5pdC5jYXRlZ29yeS5pZGAnICtcbiAgICAgICAgJywgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gbmFtZWAgYG1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdGAgYG1lYXN1cmVVbml0YCBPTiBgbWVhc3VyZVVuaXRgLmBpZGAgPSBgSXRlbWAuYG1lYXN1cmVVbml0SWRgJyArXG4gICAgICAgICcgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdENhdGVnb3J5YCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgIE9OIGBtZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgTElNSVQgMTAwJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtQWRqdXN0bWVudCwge1xuICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgIGJ1eVByaWNlOiB0cnVlLFxuICAgICAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgICAgICBpdGVtOiB7XG4gICAgICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSwgbmFtZTogdHJ1ZSwgY2F0ZWdvcnk6IFsnaWQnLCAnbmFtZSddIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICRsaW1pdDogMTAwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXG4gICAgICAnU0VMRUNUIGBJdGVtQWRqdXN0bWVudGAuYGlkYCwgYEl0ZW1BZGp1c3RtZW50YC5gYnV5UHJpY2VgLCBgSXRlbUFkanVzdG1lbnRgLmBudW1iZXJgJyArXG4gICAgICAgICcsIGBpdGVtYC5gaWRgIGBpdGVtLmlkYCwgYGl0ZW1gLmBuYW1lYCBgaXRlbS5uYW1lYCcgK1xuICAgICAgICAnLCBgaXRlbS5tZWFzdXJlVW5pdGAuYGlkYCBgaXRlbS5tZWFzdXJlVW5pdC5pZGAsIGBpdGVtLm1lYXN1cmVVbml0YC5gbmFtZWAgYGl0ZW0ubWVhc3VyZVVuaXQubmFtZWAnICtcbiAgICAgICAgJywgYGl0ZW0ubWVhc3VyZVVuaXQuY2F0ZWdvcnlgLmBpZGAgYGl0ZW0ubWVhc3VyZVVuaXQuY2F0ZWdvcnkuaWRgLCBgaXRlbS5tZWFzdXJlVW5pdC5jYXRlZ29yeWAuYG5hbWVgIGBpdGVtLm1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbUFkanVzdG1lbnRgJyArXG4gICAgICAgICcgSU5ORVIgSk9JTiBgSXRlbWAgYGl0ZW1gIE9OIGBpdGVtYC5gaWRgID0gYEl0ZW1BZGp1c3RtZW50YC5gaXRlbUlkYCcgK1xuICAgICAgICAnIExFRlQgSk9JTiBgTWVhc3VyZVVuaXRgIGBpdGVtLm1lYXN1cmVVbml0YCBPTiBgaXRlbS5tZWFzdXJlVW5pdGAuYGlkYCA9IGBpdGVtYC5gbWVhc3VyZVVuaXRJZGAnICtcbiAgICAgICAgJyBMRUZUIEpPSU4gYE1lYXN1cmVVbml0Q2F0ZWdvcnlgIGBpdGVtLm1lYXN1cmVVbml0LmNhdGVnb3J5YCBPTiBgaXRlbS5tZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBpdGVtLm1lYXN1cmVVbml0YC5gY2F0ZWdvcnlJZGAnICtcbiAgICAgICAgJyBMSU1JVCAxMDAnXG4gICAgKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkZ3JvdXAoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkZ3JvdXA6IFsnY29tcGFueUlkJ10sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAsIGBjb21wYW55SWRgLCBgY3JlYXRvcklkYCwgYGNyZWF0ZWRBdGAsIGB1cGRhdGVkQXRgLCBgbmFtZWAsIGBlbWFpbGAsIGBwYXNzd29yZGAgRlJPTSBgVXNlcmAgR1JPVVAgQlkgYGNvbXBhbnlJZGAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnY29tcGFueUlkJywgcmF3KCdDT1VOVCgqKScsICdjb3VudCcpXSxcbiAgICAgICAgJGdyb3VwOiBbJ2NvbXBhbnlJZCddLFxuICAgICAgICAkaGF2aW5nOiB7XG4gICAgICAgICAgY291bnQ6IHtcbiAgICAgICAgICAgICRndGU6IDEwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgUXVlcnlGaWx0ZXI8VXNlcj4sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBjb21wYW55SWRgLCBDT1VOVCgqKSBgY291bnRgIEZST00gYFVzZXJgIEdST1VQIEJZIGBjb21wYW55SWRgIEhBVklORyBgY291bnRgID49IDEwJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJywgJ25hbWUnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjb21wYW55SWQ6IDEgfSxcbiAgICAgICAgJGdyb3VwOiBbJ2NvbXBhbnlJZCddLFxuICAgICAgICAkc2tpcDogNTAsXG4gICAgICAgICRsaW1pdDogMTAwLFxuICAgICAgICAkc29ydDogeyBuYW1lOiAnZGVzYycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCwgYG5hbWVgIEZST00gYFVzZXJgIFdIRVJFIGBjb21wYW55SWRgID0gMSBHUk9VUCBCWSBgY29tcGFueUlkYCBPUkRFUiBCWSBgbmFtZWAgREVTQyBMSU1JVCAxMDAgT0ZGU0VUIDUwJyk7XG4gIH1cblxuICBzaG91bGRGaW5kJGxpbWl0KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogOSxcbiAgICAgICAgJGxpbWl0OiAxLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSA5IExJTUlUIDEnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEsIG5hbWU6IDEsIGNyZWF0b3JJZDogMSB9LFxuICAgICAgICAkZmlsdGVyOiA5LFxuICAgICAgICAkbGltaXQ6IDEsXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAsIGBuYW1lYCwgYGNyZWF0b3JJZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGlkYCA9IDkgTElNSVQgMScpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6ICdzb21ldGhpbmcnLCBjcmVhdG9ySWQ6IDEyMyB9LFxuICAgICAgICAkbGltaXQ6IDEsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCA9ICdzb21ldGhpbmcnIEFORCBgY3JlYXRvcklkYCA9IDEyMyBMSU1JVCAxXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCcsICduYW1lJywgJ2NyZWF0b3JJZCddLFxuICAgICAgICAkbGltaXQ6IDI1LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgLCBgbmFtZWAsIGBjcmVhdG9ySWRgIEZST00gYFVzZXJgIExJTUlUIDI1Jyk7XG4gIH1cblxuICBzaG91bGRGaW5kJHNraXAoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogMSwgbmFtZTogMSwgY3JlYXRvcklkOiAxIH0sXG4gICAgICAgICRza2lwOiAzMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCwgYG5hbWVgLCBgY3JlYXRvcklkYCBGUk9NIGBVc2VyYCBPRkZTRVQgMzAnKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkcHJvamVjdCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IHBhc3N3b3JkOiBmYWxzZSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgLCBgY29tcGFueUlkYCwgYGNyZWF0b3JJZGAsIGBjcmVhdGVkQXRgLCBgdXBkYXRlZEF0YCwgYG5hbWVgLCBgZW1haWxgIEZST00gYFVzZXJgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IG5hbWU6IDAsIHBhc3N3b3JkOiAwIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAsIGBjb21wYW55SWRgLCBgY3JlYXRvcklkYCwgYGNyZWF0ZWRBdGAsIGB1cGRhdGVkQXRgLCBgZW1haWxgIEZST00gYFVzZXJgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAxLCBwYXNzd29yZDogMCB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgLCBgbmFtZWAgRlJPTSBgVXNlcmAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEsIG5hbWU6IDAsIHBhc3N3b3JkOiAwIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFtyYXcoJyonKSwgcmF3KCdMT0cxMChudW1iZXJPZlZvdGVzICsgMSkgKiAyODcwMTQuNTg3Mzk4MjY4MSArIGNyZWF0ZWRBdCcsICdob3RuZXNzJyldLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6ICdzb21ldGhpbmcnIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCAqLCBMT0cxMChudW1iZXJPZlZvdGVzICsgMSkgKiAyODcwMTQuNTg3Mzk4MjY4MSArIGNyZWF0ZWRBdCBgaG90bmVzc2AgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWV0aGluZydcIik7XG4gIH1cblxuICBzaG91bGREZWxldGUoKSB7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5kZWxldGUoVXNlciwgeyAkZmlsdGVyOiAxMjMgfSkpLnRvQmUoJ0RFTEVURSBGUk9NIGBVc2VyYCBXSEVSRSBgaWRgID0gMTIzJyk7XG4gICAgZXhwZWN0KCgpID0+IHRoaXMuZGlhbGVjdC5kZWxldGUoVXNlciwgeyAkZmlsdGVyOiAxMjMgfSwgeyBzb2Z0RGVsZXRlOiB0cnVlIH0pKS50b1Rocm93KFwiJ1VzZXInIGhhcyBub3QgZW5hYmxlZCAnc29mdERlbGV0ZSdcIik7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5kZWxldGUoVXNlciwgeyAkZmlsdGVyOiAxMjMgfSwgeyBzb2Z0RGVsZXRlOiBmYWxzZSB9KSkudG9CZSgnREVMRVRFIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMnKTtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmRlbGV0ZShNZWFzdXJlVW5pdCwgeyAkZmlsdGVyOiAxMjMgfSkpLnRvTWF0Y2goXG4gICAgICAvXlVQREFURSBgTWVhc3VyZVVuaXRgIFNFVCBgZGVsZXRlZEF0YCA9IFxcZCsgV0hFUkUgYGlkYCA9IDEyMyBBTkQgYGRlbGV0ZWRBdGAgSVMgTlVMTCQvXG4gICAgKTtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmRlbGV0ZShNZWFzdXJlVW5pdCwgeyAkZmlsdGVyOiAxMjMgfSwgeyBzb2Z0RGVsZXRlOiB0cnVlIH0pKS50b01hdGNoKFxuICAgICAgL15VUERBVEUgYE1lYXN1cmVVbml0YCBTRVQgYGRlbGV0ZWRBdGAgPSBcXGQrIFdIRVJFIGBpZGAgPSAxMjMgQU5EIGBkZWxldGVkQXRgIElTIE5VTEwkL1xuICAgICk7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5kZWxldGUoTWVhc3VyZVVuaXQsIHsgJGZpbHRlcjogMTIzIH0sIHsgc29mdERlbGV0ZTogZmFsc2UgfSkpLnRvQmUoJ0RFTEVURSBGUk9NIGBNZWFzdXJlVW5pdGAgV0hFUkUgYGlkYCA9IDEyMycpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0UmF3KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBjb21wYW55SWQ6IHRydWUsXG4gICAgICAgICAgdG90YWw6IHJhdygoeyBlc2NhcGVkUHJlZml4LCBkaWFsZWN0IH0pID0+IGBTVU0oJHtlc2NhcGVkUHJlZml4fSR7ZGlhbGVjdC5lc2NhcGVJZCgnc2FsZVByaWNlJyl9KWApLFxuICAgICAgICB9LFxuICAgICAgICAkZ3JvdXA6IFsnY29tcGFueUlkJ10sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBjb21wYW55SWRgLCBTVU0oYHNhbGVQcmljZWApIGB0b3RhbGAgRlJPTSBgSXRlbWAgR1JPVVAgQlkgYGNvbXBhbnlJZGAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW1BZGp1c3RtZW50LCB7XG4gICAgICAgICRwcm9qZWN0OiB7XG4gICAgICAgICAgaXRlbToge1xuICAgICAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICAgICAgY29tcGFueUlkOiB0cnVlLFxuICAgICAgICAgICAgICB0b3RhbDogcmF3KCh7IGVzY2FwZWRQcmVmaXgsIGRpYWxlY3QgfSkgPT4gYFNVTSgke2VzY2FwZWRQcmVmaXh9JHtkaWFsZWN0LmVzY2FwZUlkKCdzYWxlUHJpY2UnKX0pYCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICRncm91cDogWydjb21wYW55SWQnXSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgSXRlbUFkanVzdG1lbnRgLmBpZGAsIGBpdGVtYC5gaWRgIGBpdGVtLmlkYCwgYGl0ZW1gLmBjb21wYW55SWRgIGBpdGVtLmNvbXBhbnlJZGAsIFNVTShgaXRlbWAuYHNhbGVQcmljZWApIGBpdGVtLnRvdGFsYCcgK1xuICAgICAgICAnIEZST00gYEl0ZW1BZGp1c3RtZW50YCBJTk5FUiBKT0lOIGBJdGVtYCBgaXRlbWAgT04gYGl0ZW1gLmBpZGAgPSBgSXRlbUFkanVzdG1lbnRgLmBpdGVtSWRgIEdST1VQIEJZIGBjb21wYW55SWRgJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2NvbXBhbnlJZCcsIHJhdygnQ09VTlQoKiknLCAnY291bnQnKV0sXG4gICAgICAgICRncm91cDogWydjb21wYW55SWQnXSxcbiAgICAgICAgJGhhdmluZzoge1xuICAgICAgICAgIGNvdW50OiB7XG4gICAgICAgICAgICAkZ3RlOiAxMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIFF1ZXJ5RmlsdGVyPFVzZXI+LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgY29tcGFueUlkYCwgQ09VTlQoKikgYGNvdW50YCBGUk9NIGBVc2VyYCBHUk9VUCBCWSBgY29tcGFueUlkYCBIQVZJTkcgYGNvdW50YCA+PSAxMCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogW3JhdygoKSA9PiAnY3JlYXRlZEF0JywgJ2hvdG5lc3MnKV0sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWV0aGluZycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGNyZWF0ZWRBdCBgaG90bmVzc2AgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWV0aGluZydcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbcmF3KCcqJyksIHJhdygnTE9HMTAobnVtYmVyT2ZWb3RlcyArIDEpICogMjg3MDE0LjU4NzM5ODI2ODEgKyBjcmVhdGVkQXQnLCAnaG90bmVzcycpXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiAnc29tZXRoaW5nJyB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgKiwgTE9HMTAobnVtYmVyT2ZWb3RlcyArIDEpICogMjg3MDE0LjU4NzM5ODI2ODEgKyBjcmVhdGVkQXQgYGhvdG5lc3NgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCA9ICdzb21ldGhpbmcnXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRmaWx0ZXJSYXcoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRhbmQ6IFt7IGNvbXBhbnlJZDogMSB9LCByYXcoJ1NVTShzYWxlUHJpY2UpID4gNTAwJyldIH0sXG4gICAgICAgICRncm91cDogWydjcmVhdG9ySWQnXSxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCBGUk9NIGBJdGVtYCBXSEVSRSBgY29tcGFueUlkYCA9IDEgQU5EIFNVTShzYWxlUHJpY2UpID4gNTAwIEdST1VQIEJZIGBjcmVhdG9ySWRgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG9yOiBbeyBjb21wYW55SWQ6IDEgfSwgNSwgcmF3KCdTVU0oc2FsZVByaWNlKSA+IDUwMCcpXSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIGBjb21wYW55SWRgID0gMSBPUiBgaWRgID0gNSBPUiBTVU0oc2FsZVByaWNlKSA+IDUwMCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRhbmQ6IFtyYXcoJ1NVTShgc2FsZVByaWNlYCkgPiA1MDAnKV0gfSxcbiAgICAgICAgJGdyb3VwOiBbJ2NvbXBhbnlJZCddLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIFNVTShgc2FsZVByaWNlYCkgPiA1MDAgR1JPVVAgQlkgYGNvbXBhbnlJZGAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFsxLCByYXcoJ1NVTShzYWxlUHJpY2UpID4gNTAwJyldIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgSXRlbWAgV0hFUkUgYGlkYCA9IDEgT1IgU1VNKHNhbGVQcmljZSkgPiA1MDAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFtyYXcoJ1NVTShzYWxlUHJpY2UpID4gNTAwJyksIDEsIHsgY29tcGFueUlkOiAxIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgSXRlbWAgV0hFUkUgU1VNKHNhbGVQcmljZSkgPiA1MDAgT1IgYGlkYCA9IDEgT1IgYGNvbXBhbnlJZGAgPSAxJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJGFuZDogW3JhdygnU1VNKHNhbGVQcmljZSkgPiA1MDAnKV0gfSxcbiAgICAgICAgJGdyb3VwOiBbJ2NyZWF0b3JJZCddLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIFNVTShzYWxlUHJpY2UpID4gNTAwIEdST1VQIEJZIGBjcmVhdG9ySWRgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHJhdygnU1VNKHNhbGVQcmljZSkgPiA1MDAnKSxcbiAgICAgICAgJGdyb3VwOiBbJ2NyZWF0b3JJZCddLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIFNVTShzYWxlUHJpY2UpID4gNTAwIEdST1VQIEJZIGBjcmVhdG9ySWRgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG9yOiBbWzEsIDJdLCB7IGNvZGU6ICdhYmMnIH1dIH0sXG4gICAgICAgICRncm91cDogWydjcmVhdG9ySWQnXSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgSXRlbWAgV0hFUkUgYGlkYCBJTiAoMSwgMikgT1IgYGNvZGVgID0gJ2FiYycgR1JPVVAgQlkgYGNyZWF0b3JJZGBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJHN0YXJ0c1dpdGgoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJHN0YXJ0c1dpdGg6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiBbXG4gICAgICAgICAgeyBmaWVsZDogJ25hbWUnLCBzb3J0OiAnYXNjJyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdjcmVhdGVkQXQnLCBzb3J0OiAnZGVzYycgfSxcbiAgICAgICAgXSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCBMSUtFICdTb21lJScgT1JERVIgQlkgYG5hbWVgLCBgY3JlYXRlZEF0YCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJHN0YXJ0c1dpdGg6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBuYW1lYCBMSUtFICdTb21lJScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGlzdGFydHNXaXRoKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpc3RhcnRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBMT1dFUihgbmFtZWApIExJS0UgJ3NvbWUlJyBPUkRFUiBCWSBgbmFtZWAsIGBpZGAgREVTQyBMSU1JVCA1MCBPRkZTRVQgMFwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IHRydWUgfSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpc3RhcnRzV2l0aDogJ1NvbWUnLCAkbmU6ICdTb21ldGhpbmcnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSAoTE9XRVIoYG5hbWVgKSBMSUtFICdzb21lJScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGVuZHNXaXRoKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRlbmRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgbmFtZWAgTElLRSAnJVNvbWUnIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGVuZHNXaXRoOiAnU29tZScsICRuZTogJ1NvbWV0aGluZycgfSB9LFxuICAgICAgICAkc29ydDogeyBuYW1lOiAxLCBpZDogLTEgfSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIChgbmFtZWAgTElLRSAnJVNvbWUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpZW5kc1dpdGgoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGllbmRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBMT1dFUihgbmFtZWApIExJS0UgJyVzb21lJyBPUkRFUiBCWSBgbmFtZWAsIGBpZGAgREVTQyBMSU1JVCA1MCBPRkZTRVQgMFwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpZW5kc1dpdGg6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKExPV0VSKGBuYW1lYCkgTElLRSAnJXNvbWUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpbmNsdWRlcygpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaW5jbHVkZXM6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgIExJS0UgJyVTb21lJScgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaW5jbHVkZXM6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBuYW1lYCBMSUtFICclU29tZSUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpaW5jbHVkZXMoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGlpbmNsdWRlczogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBMT1dFUihgbmFtZWApIExJS0UgJyVzb21lJScgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaWluY2x1ZGVzOiAnU29tZScsICRuZTogJ1NvbWV0aGluZycgfSB9LFxuICAgICAgICAkc29ydDogeyBuYW1lOiAxLCBpZDogLTEgfSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIChMT1dFUihgbmFtZWApIExJS0UgJyVzb21lJScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGxpa2UoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGxpa2U6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgIExJS0UgJ1NvbWUnIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBuYW1lYCBMSUtFICdTb21lJyBBTkQgYG5hbWVgIDw+ICdTb21ldGhpbmcnKSBPUkRFUiBCWSBgbmFtZWAsIGBpZGAgREVTQyBMSU1JVCA1MCBPRkZTRVQgMFwiKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkaWxpa2UoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGlsaWtlOiAnU29tZScgfSB9LFxuICAgICAgICAkc29ydDogeyBuYW1lOiAxLCBpZDogLTEgfSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIExPV0VSKGBuYW1lYCkgTElLRSAnc29tZScgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaWxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKExPV0VSKGBuYW1lYCkgTElLRSAnc29tZScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJHJlZ2V4KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRyZWdleDogJ15zb21lJyB9IH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCBSRUdFWFAgJ15zb21lJ1wiKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkdGV4dCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJHRleHQ6IHsgJGZpZWxkczogWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ10sICR2YWx1ZTogJ3NvbWUgdGV4dCcgfSwgY29tcGFueUlkOiAxIH0sXG4gICAgICAgICRsaW1pdDogMzAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIGBJdGVtYCBNQVRDSCB7YG5hbWVgIGBkZXNjcmlwdGlvbmB9IDogJ3NvbWUgdGV4dCcgQU5EIGBjb21wYW55SWRgID0gMSBMSU1JVCAzMFwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEgfSxcbiAgICAgICAgJGZpbHRlcjoge1xuICAgICAgICAgICR0ZXh0OiB7ICRmaWVsZHM6IFsnbmFtZSddLCAkdmFsdWU6ICdzb21ldGhpbmcnIH0sXG4gICAgICAgICAgbmFtZTogeyAkbmU6ICdvdGhlciB1bndhbnRlZCcgfSxcbiAgICAgICAgICBjb21wYW55SWQ6IDEsXG4gICAgICAgIH0sXG4gICAgICAgICRsaW1pdDogMTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBVc2VyYCBNQVRDSCB7YG5hbWVgfSA6ICdzb21ldGhpbmcnIEFORCBgbmFtZWAgPD4gJ290aGVyIHVud2FudGVkJyBBTkQgYGNvbXBhbnlJZGAgPSAxIExJTUlUIDEwXCIpO1xuICB9XG59XG4iXX0=