@grnsft/if 0.0.6 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/.examples/ompls/azure.yml +205 -0
  2. package/.github/workflows/nodejs-ci.yml +0 -8
  3. package/README.md +48 -9
  4. package/build/index.js +1 -2
  5. package/examples/impls/test/azure.yml +8 -8
  6. package/examples/impls/test/ccf.yml +5 -3
  7. package/examples/impls/test/if-demo.yml +19 -9
  8. package/examples/impls/test/metadata.yml +3 -2
  9. package/examples/impls/test/nesting.yml +10 -13
  10. package/examples/impls/test/sci-e.yml +1 -1
  11. package/examples/impls/test/sci-m.yml +2 -2
  12. package/examples/impls/test/sci-o.yml +2 -4
  13. package/examples/impls/test/sci.yml +1 -2
  14. package/examples/impls/test/shell.yml +2 -1
  15. package/examples/impls/{tdp-finder-test.yml → test/tdp-finder.yml} +8 -8
  16. package/examples/ompls/ccf.yml +3 -1
  17. package/examples/ompls/if-demo.yml +46 -22
  18. package/package.json +12 -5
  19. package/tsconfig.build.json +7 -0
  20. package/tsconfig.build.tsbuildinfo +1 -0
  21. package/build/__mocks__/azure/index.d.ts +0 -11
  22. package/build/__mocks__/azure/index.js +0 -132
  23. package/build/__mocks__/boavizta/countries.json +0 -138
  24. package/build/__mocks__/boavizta/instance_types.json +0 -625
  25. package/build/__mocks__/boavizta/providers.json +0 -1
  26. package/build/__mocks__/fs/index.d.ts +0 -3
  27. package/build/__mocks__/fs/index.js +0 -56
  28. package/build/__mocks__/model-universe/index.d.ts +0 -31
  29. package/build/__mocks__/model-universe/index.js +0 -64
  30. package/build/__mocks__/watt-time/data.json +0 -119
  31. package/build/__tests__/integration/ompl/index.test.d.ts +0 -1
  32. package/build/__tests__/integration/ompl/index.test.js +0 -61
  33. package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +0 -1
  34. package/build/__tests__/unit/lib/azure-importer/index.test.js +0 -152
  35. package/build/__tests__/unit/lib/boavizta/index.test.d.ts +0 -1
  36. package/build/__tests__/unit/lib/boavizta/index.test.js +0 -579
  37. package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +0 -1
  38. package/build/__tests__/unit/lib/case-studies/aveva.test.js +0 -36
  39. package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +0 -1
  40. package/build/__tests__/unit/lib/case-studies/emem.test.js +0 -108
  41. package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +0 -1
  42. package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +0 -53
  43. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +0 -1
  44. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +0 -23
  45. package/build/__tests__/unit/lib/ccf/index.test.d.ts +0 -1
  46. package/build/__tests__/unit/lib/ccf/index.test.js +0 -223
  47. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +0 -1
  48. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +0 -73
  49. package/build/__tests__/unit/lib/models-universe.test.d.ts +0 -1
  50. package/build/__tests__/unit/lib/models-universe.test.js +0 -193
  51. package/build/__tests__/unit/lib/observatory.test.d.ts +0 -1
  52. package/build/__tests__/unit/lib/observatory.test.js +0 -99
  53. package/build/__tests__/unit/lib/sci/index.test.d.ts +0 -1
  54. package/build/__tests__/unit/lib/sci/index.test.js +0 -106
  55. package/build/__tests__/unit/lib/sci-e/index.test.d.ts +0 -1
  56. package/build/__tests__/unit/lib/sci-e/index.test.js +0 -30
  57. package/build/__tests__/unit/lib/sci-m/index.test.d.ts +0 -1
  58. package/build/__tests__/unit/lib/sci-m/index.test.js +0 -58
  59. package/build/__tests__/unit/lib/sci-o/index.test.d.ts +0 -1
  60. package/build/__tests__/unit/lib/sci-o/index.test.js +0 -42
  61. package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +0 -1
  62. package/build/__tests__/unit/lib/shell-imp/index.test.js +0 -21
  63. package/build/__tests__/unit/lib/supercomputer.test.d.ts +0 -1
  64. package/build/__tests__/unit/lib/supercomputer.test.js +0 -231
  65. package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +0 -1
  66. package/build/__tests__/unit/lib/tdp-finder/index.test.js +0 -62
  67. package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +0 -1
  68. package/build/__tests__/unit/lib/teads-aws/index.test.js +0 -170
  69. package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +0 -1
  70. package/build/__tests__/unit/lib/teads-curve/index.test.js +0 -146
  71. package/build/__tests__/unit/lib/watt-time/index.test.d.ts +0 -1
  72. package/build/__tests__/unit/lib/watt-time/index.test.js +0 -106
  73. package/build/__tests__/unit/util/args.test.d.ts +0 -1
  74. package/build/__tests__/unit/util/args.test.js +0 -92
  75. package/build/__tests__/unit/util/models-universe.test.d.ts +0 -1
  76. package/build/__tests__/unit/util/models-universe.test.js +0 -193
  77. package/build/__tests__/unit/util/observatory.test.d.ts +0 -1
  78. package/build/__tests__/unit/util/observatory.test.js +0 -99
  79. package/build/__tests__/unit/util/supercomputer.test.d.ts +0 -1
  80. package/build/__tests__/unit/util/supercomputer.test.js +0 -231
  81. package/build/__tests__/unit/util/yaml.test.d.ts +0 -1
  82. package/build/__tests__/unit/util/yaml.test.js +0 -59
  83. package/build/lib/azure-importer/index.d.ts +0 -55
  84. package/build/lib/azure-importer/index.js +0 -314
  85. package/build/lib/boavizta/index.d.ts +0 -53
  86. package/build/lib/boavizta/index.js +0 -254
  87. package/build/lib/case-studies/aveva-model.d.ts +0 -29
  88. package/build/lib/case-studies/aveva-model.js +0 -53
  89. package/build/lib/case-studies/emem-model.d.ts +0 -42
  90. package/build/lib/case-studies/emem-model.js +0 -93
  91. package/build/lib/case-studies/eshoppen-model.d.ts +0 -24
  92. package/build/lib/case-studies/eshoppen-model.js +0 -123
  93. package/build/lib/case-studies/index.d.ts +0 -4
  94. package/build/lib/case-studies/index.js +0 -21
  95. package/build/lib/case-studies/sci-accenture-model.d.ts +0 -10
  96. package/build/lib/case-studies/sci-accenture-model.js +0 -37
  97. package/build/lib/ccf/aws-embodied.json +0 -5591
  98. package/build/lib/ccf/aws-instances.json +0 -21116
  99. package/build/lib/ccf/aws-use.json +0 -79
  100. package/build/lib/ccf/azure-embodied.json +0 -6547
  101. package/build/lib/ccf/azure-instances.json +0 -8332
  102. package/build/lib/ccf/azure-use.json +0 -58
  103. package/build/lib/ccf/gcp-embodied.json +0 -3049
  104. package/build/lib/ccf/gcp-instances.json +0 -3880
  105. package/build/lib/ccf/gcp-use.json +0 -58
  106. package/build/lib/ccf/index.d.ts +0 -63
  107. package/build/lib/ccf/index.js +0 -338
  108. package/build/lib/cloud-instance-metadata/aws-instances.json +0 -1
  109. package/build/lib/cloud-instance-metadata/azure-instances.json +0 -1
  110. package/build/lib/cloud-instance-metadata/index.d.ts +0 -15
  111. package/build/lib/cloud-instance-metadata/index.js +0 -104
  112. package/build/lib/index.d.ts +0 -14
  113. package/build/lib/index.js +0 -32
  114. package/build/lib/interfaces/ccf.d.ts +0 -19
  115. package/build/lib/interfaces/ccf.js +0 -3
  116. package/build/lib/interfaces/index.d.ts +0 -7
  117. package/build/lib/interfaces/index.js +0 -18
  118. package/build/lib/sci/index.d.ts +0 -13
  119. package/build/lib/sci/index.js +0 -131
  120. package/build/lib/sci-e/index.d.ts +0 -38
  121. package/build/lib/sci-e/index.js +0 -85
  122. package/build/lib/sci-m/index.d.ts +0 -10
  123. package/build/lib/sci-m/index.js +0 -124
  124. package/build/lib/sci-o/index.d.ts +0 -17
  125. package/build/lib/sci-o/index.js +0 -52
  126. package/build/lib/shell-imp/index.d.ts +0 -32
  127. package/build/lib/shell-imp/index.js +0 -82
  128. package/build/lib/tdp-finder/index.d.ts +0 -19
  129. package/build/lib/tdp-finder/index.js +0 -98
  130. package/build/lib/teads-aws/aws-embodied.json +0 -1
  131. package/build/lib/teads-aws/aws-instances.json +0 -1
  132. package/build/lib/teads-aws/index.d.ts +0 -58
  133. package/build/lib/teads-aws/index.js +0 -208
  134. package/build/lib/teads-curve/index.d.ts +0 -52
  135. package/build/lib/teads-curve/index.js +0 -158
  136. package/build/lib/watt-time/index.d.ts +0 -18
  137. package/build/lib/watt-time/index.js +0 -204
  138. package/build/util/models-universe.d.ts +0 -28
  139. package/build/util/models-universe.js +0 -95
  140. package/build/util/observatory.d.ts +0 -20
  141. package/build/util/observatory.js +0 -31
  142. package/build/util/supercomputer.d.ts +0 -30
  143. package/build/util/supercomputer.js +0 -109
  144. package/docs/implementations/tdp-finder.md +0 -36
  145. package/examples/impls/test/complex-pipeline.yml +0 -67
  146. package/examples/impls/test/toto.yaml +0 -22
  147. package/tsconfig.tsbuildinfo +0 -1
@@ -1,579 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const globals_1 = require("@jest/globals");
4
- const index_1 = require("../../../../lib/boavizta/index");
5
- const axios_1 = require("axios");
6
- const PROVIDERS = require("../../../../__mocks__/boavizta/providers.json");
7
- const COUNTRIES = require("../../../../__mocks__/boavizta/countries.json");
8
- const INSTANCE_TYPES = require("../../../../__mocks__/boavizta/instance_types.json");
9
- async function axiosGet(url) {
10
- switch (url) {
11
- case 'https://api.boavizta.org/v1/cloud/instance/all_providers':
12
- return { data: PROVIDERS };
13
- case 'https://api.boavizta.org/v1/utils/country_code':
14
- return Promise.resolve({ data: COUNTRIES });
15
- case 'https://api.boavizta.org/v1/cloud/instance/all_instances?provider=aws':
16
- return Promise.resolve({
17
- data: INSTANCE_TYPES['aws'],
18
- });
19
- }
20
- return Promise.resolve({});
21
- }
22
- globals_1.jest.mock('axios');
23
- const mockAxios = axios_1.default;
24
- // Mock out all top level functions, such as get, put, delete and post:
25
- mockAxios.get.mockImplementation(axiosGet);
26
- mockAxios.post.mockImplementation((url) => {
27
- switch (url) {
28
- case 'https://api.boavizta.org/v1/component/cpu?verbose=false&duration=1':
29
- return Promise.resolve({
30
- data: {
31
- outputs: {
32
- gwp: {
33
- embedded: {
34
- value: 0.0008,
35
- min: 0.0004155,
36
- max: 0.003113,
37
- warnings: ['End of life is not included in the calculation'],
38
- },
39
- use: { value: 0.06743, min: 0.06743, max: 0.06743 },
40
- unit: 'kgCO2eq',
41
- description: 'Total climate change',
42
- },
43
- adp: {
44
- embedded: {
45
- value: 7.764e-7,
46
- min: 7.763e-7,
47
- max: 7.771e-7,
48
- warnings: ['End of life is not included in the calculation'],
49
- },
50
- use: { value: 1.796e-8, min: 1.796e-8, max: 1.796e-8 },
51
- unit: 'kgSbeq',
52
- description: 'Use of minerals and fossil ressources',
53
- },
54
- pe: {
55
- embedded: {
56
- value: 0.012,
57
- min: 0.006847,
58
- max: 0.04314,
59
- warnings: ['End of life is not included in the calculation'],
60
- },
61
- use: { value: 2.07, min: 2.07, max: 2.07 },
62
- unit: 'MJ',
63
- description: 'Consumption of primary energy',
64
- },
65
- },
66
- },
67
- });
68
- case 'https://api.boavizta.org/v1/component/cpu?verbose=true&duration=2':
69
- return Promise.resolve({
70
- data: {
71
- outputs: {
72
- gwp: {
73
- embedded: {
74
- value: 0.0016,
75
- min: 0.000831,
76
- max: 0.006226,
77
- warnings: ['End of life is not included in the calculation'],
78
- },
79
- use: { value: 0.1924, min: 0.1924, max: 0.1924 },
80
- unit: 'kgCO2eq',
81
- description: 'Total climate change',
82
- },
83
- adp: {
84
- embedded: {
85
- value: 0.000001553,
86
- min: 0.000001553,
87
- max: 0.000001554,
88
- warnings: ['End of life is not included in the calculation'],
89
- },
90
- use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
91
- unit: 'kgSbeq',
92
- description: 'Use of minerals and fossil ressources',
93
- },
94
- pe: {
95
- embedded: {
96
- value: 0.023,
97
- min: 0.01369,
98
- max: 0.08627,
99
- warnings: ['End of life is not included in the calculation'],
100
- },
101
- use: { value: 5.907, min: 5.907, max: 5.907 },
102
- unit: 'MJ',
103
- description: 'Consumption of primary energy',
104
- },
105
- },
106
- verbose: {
107
- outputs: {
108
- gwp: {
109
- embedded: {
110
- value: 0.0016,
111
- min: 0.000831,
112
- max: 0.006226,
113
- warnings: [
114
- 'End of life is not included in the calculation',
115
- ],
116
- },
117
- use: { value: 0.1924, min: 0.1924, max: 0.1924 },
118
- unit: 'kgCO2eq',
119
- description: 'Total climate change',
120
- },
121
- adp: {
122
- embedded: {
123
- value: 0.000001553,
124
- min: 0.000001553,
125
- max: 0.000001554,
126
- warnings: [
127
- 'End of life is not included in the calculation',
128
- ],
129
- },
130
- use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
131
- unit: 'kgSbeq',
132
- description: 'Use of minerals and fossil ressources',
133
- },
134
- pe: {
135
- embedded: {
136
- value: 0.023,
137
- min: 0.01369,
138
- max: 0.08627,
139
- warnings: [
140
- 'End of life is not included in the calculation',
141
- ],
142
- },
143
- use: { value: 5.907, min: 5.907, max: 5.907 },
144
- unit: 'MJ',
145
- description: 'Consumption of primary energy',
146
- },
147
- },
148
- units: { value: 1, status: 'ARCHETYPE', min: 1, max: 1 },
149
- die_size: {
150
- value: 521,
151
- status: 'COMPLETED',
152
- unit: 'mm2',
153
- source: 'Average value for all families',
154
- min: 41.2,
155
- max: 3640,
156
- },
157
- duration: { value: 2, unit: 'hours' },
158
- avg_power: {
159
- value: 260.05,
160
- status: 'COMPLETED',
161
- unit: 'W',
162
- min: 260.05,
163
- max: 260.05,
164
- },
165
- time_workload: { value: 100, status: 'INPUT', unit: '%' },
166
- usage_location: {
167
- value: 'USA',
168
- status: 'INPUT',
169
- unit: 'CodSP3 - NCS Country Codes - NATO',
170
- },
171
- use_time_ratio: {
172
- value: 1,
173
- status: 'ARCHETYPE',
174
- unit: '/1',
175
- min: 1,
176
- max: 1,
177
- },
178
- hours_life_time: {
179
- value: 26280,
180
- status: 'ARCHETYPE',
181
- unit: 'hours',
182
- min: 26280,
183
- max: 26280,
184
- },
185
- params: {
186
- value: { a: 171.2, b: 0.0354, c: 36.89, d: -10.13 },
187
- status: 'ARCHETYPE',
188
- },
189
- gwp_factor: {
190
- value: 0.37,
191
- status: 'COMPLETED',
192
- unit: 'kg CO2eq/kWh',
193
- source: 'https://ember-climate.org/data/data-explorer',
194
- min: 0.37,
195
- max: 0.37,
196
- },
197
- adp_factor: {
198
- value: 9.85548e-8,
199
- status: 'COMPLETED',
200
- unit: 'kg Sbeq/kWh',
201
- source: 'ADEME Base outputS ®',
202
- min: 9.85548e-8,
203
- max: 9.85548e-8,
204
- },
205
- pe_factor: {
206
- value: 11.358,
207
- status: 'COMPLETED',
208
- unit: 'MJ/kWh',
209
- source: 'ADPf / (1-%renewable_energy)',
210
- min: 11.358,
211
- max: 11.358,
212
- },
213
- },
214
- },
215
- });
216
- case 'https://api.boavizta.org/v1/cloud/instance?verbose=false&duration=0.004166666666666667':
217
- return Promise.resolve({
218
- data: {
219
- outputs: {
220
- gwp: {
221
- embedded: {
222
- value: 0.0016,
223
- min: 0.000831,
224
- max: 0.006226,
225
- warnings: ['End of life is not included in the calculation'],
226
- },
227
- use: { value: 0.1924, min: 0.1924, max: 0.1924 },
228
- unit: 'kgCO2eq',
229
- description: 'Total climate change',
230
- },
231
- adp: {
232
- embedded: {
233
- value: 0.000001553,
234
- min: 0.000001553,
235
- max: 0.000001554,
236
- warnings: ['End of life is not included in the calculation'],
237
- },
238
- use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
239
- unit: 'kgSbeq',
240
- description: 'Use of minerals and fossil ressources',
241
- },
242
- pe: {
243
- embedded: {
244
- value: 0.023,
245
- min: 0.01369,
246
- max: 0.08627,
247
- warnings: ['End of life is not included in the calculation'],
248
- },
249
- use: { value: 5.907, min: 5.907, max: 5.907 },
250
- unit: 'MJ',
251
- description: 'Consumption of primary energy',
252
- },
253
- },
254
- verbose: {
255
- outputs: {
256
- gwp: {
257
- embedded: {
258
- value: 0.0016,
259
- min: 0.000831,
260
- max: 0.006226,
261
- warnings: [
262
- 'End of life is not included in the calculation',
263
- ],
264
- },
265
- use: { value: 0.1924, min: 0.1924, max: 0.1924 },
266
- unit: 'kgCO2eq',
267
- description: 'Total climate change',
268
- },
269
- adp: {
270
- embedded: {
271
- value: 0.000001553,
272
- min: 0.000001553,
273
- max: 0.000001554,
274
- warnings: [
275
- 'End of life is not included in the calculation',
276
- ],
277
- },
278
- use: { value: 5.126e-8, min: 5.126e-8, max: 5.126e-8 },
279
- unit: 'kgSbeq',
280
- description: 'Use of minerals and fossil ressources',
281
- },
282
- pe: {
283
- embedded: {
284
- value: 0.023,
285
- min: 0.01369,
286
- max: 0.08627,
287
- warnings: [
288
- 'End of life is not included in the calculation',
289
- ],
290
- },
291
- use: { value: 5.907, min: 5.907, max: 5.907 },
292
- unit: 'MJ',
293
- description: 'Consumption of primary energy',
294
- },
295
- },
296
- units: { value: 1, status: 'ARCHETYPE', min: 1, max: 1 },
297
- die_size: {
298
- value: 521,
299
- status: 'COMPLETED',
300
- unit: 'mm2',
301
- source: 'Average value for all families',
302
- min: 41.2,
303
- max: 3640,
304
- },
305
- duration: { value: 2, unit: 'hours' },
306
- avg_power: {
307
- value: 260.05,
308
- status: 'COMPLETED',
309
- unit: 'W',
310
- min: 260.05,
311
- max: 260.05,
312
- },
313
- time_workload: { value: 100, status: 'INPUT', unit: '%' },
314
- usage_location: {
315
- value: 'USA',
316
- status: 'INPUT',
317
- unit: 'CodSP3 - NCS Country Codes - NATO',
318
- },
319
- use_time_ratio: {
320
- value: 1,
321
- status: 'ARCHETYPE',
322
- unit: '/1',
323
- min: 1,
324
- max: 1,
325
- },
326
- hours_life_time: {
327
- value: 26280,
328
- status: 'ARCHETYPE',
329
- unit: 'hours',
330
- min: 26280,
331
- max: 26280,
332
- },
333
- params: {
334
- value: { a: 171.2, b: 0.0354, c: 36.89, d: -10.13 },
335
- status: 'ARCHETYPE',
336
- },
337
- gwp_factor: {
338
- value: 0.37,
339
- status: 'COMPLETED',
340
- unit: 'kg CO2eq/kWh',
341
- source: 'https://ember-climate.org/data/data-explorer',
342
- min: 0.37,
343
- max: 0.37,
344
- },
345
- adp_factor: {
346
- value: 9.85548e-8,
347
- status: 'COMPLETED',
348
- unit: 'kg Sbeq/kWh',
349
- source: 'ADEME Base outputS ®',
350
- min: 9.85548e-8,
351
- max: 9.85548e-8,
352
- },
353
- pe_factor: {
354
- value: 11.358,
355
- status: 'COMPLETED',
356
- unit: 'MJ/kWh',
357
- source: 'ADPf / (1-%renewable_energy)',
358
- min: 11.358,
359
- max: 11.358,
360
- },
361
- },
362
- },
363
- });
364
- }
365
- return Promise.resolve({});
366
- });
367
- globals_1.jest.setTimeout(30000);
368
- (0, globals_1.describe)('cpu:configure test', () => {
369
- (0, globals_1.test)('initialize wrong params should throw error', async () => {
370
- const outputModel = new index_1.BoaviztaCpuOutputModel();
371
- await (0, globals_1.expect)(outputModel.configure('test', { allocation: 'wrong' })).rejects.toThrowError();
372
- (0, globals_1.expect)(outputModel.name).toBe('test');
373
- });
374
- (0, globals_1.test)('initialize without params throws error for parameter and call execute without params throws error for input', async () => {
375
- const outputModel = new index_1.BoaviztaCpuOutputModel();
376
- const outputModelConfigFail = new index_1.BoaviztaCpuOutputModel();
377
- (0, globals_1.expect)(outputModel.modelIdentifier()).toBe('org.boavizta.cpu.sci');
378
- await (0, globals_1.expect)(outputModel.authenticate({})).resolves.toBe(undefined);
379
- await (0, globals_1.expect)(outputModelConfigFail.execute([
380
- {
381
- timestamp: '2021-01-01T00:00:00Z',
382
- duration: 3600,
383
- 'cpu-util': 50,
384
- },
385
- ])).rejects.toThrowError();
386
- await (0, globals_1.expect)(outputModel.configure('test')).rejects.toThrow(Error('Improper configure: Missing processor parameter'));
387
- await (0, globals_1.expect)(outputModel.configure('test', {
388
- 'physical-processor': 'Intel Xeon Gold 6138f',
389
- })).rejects.toThrow(Error('Improper configure: Missing core-units parameter'));
390
- await (0, globals_1.expect)(outputModel.configure('test', {
391
- 'physical-processor': 'Intel Xeon Gold 6138f',
392
- 'core-units': 24,
393
- 'expected-lifespan': 4 * 365 * 24 * 60 * 60,
394
- })).resolves.toBeInstanceOf(index_1.BoaviztaCpuOutputModel);
395
- (0, globals_1.expect)(outputModel.name).toBe('test');
396
- // not providing inputs will throw a missing inputs error
397
- await (0, globals_1.expect)(outputModel.execute()).rejects.toStrictEqual(Error('Parameter Not Given: invalid inputs parameter. Expecting an array of inputs'));
398
- // improper inputs will throw an invalid inputs error
399
- await (0, globals_1.expect)(outputModel.execute([{ invalid: 'input' }])).rejects.toStrictEqual(Error('Invalid Input: Invalid inputs parameter'));
400
- });
401
- });
402
- (0, globals_1.describe)('cpu:initialize with params', () => {
403
- (0, globals_1.test)('initialize with params and call multiple usages in IMPL format', async () => {
404
- const outputModel = new index_1.BoaviztaCpuOutputModel();
405
- await (0, globals_1.expect)(outputModel.configure('test', {
406
- 'physical-processor': 'Intel Xeon Gold 6138f',
407
- 'core-units': 24,
408
- location: 'USA',
409
- })).resolves.toBeInstanceOf(index_1.BoaviztaCpuOutputModel);
410
- (0, globals_1.expect)(outputModel.name).toBe('test');
411
- // configure without static params will cause improper configure error
412
- await (0, globals_1.expect)(outputModel.execute([
413
- {
414
- timestamp: '2021-01-01T00:00:00Z',
415
- duration: 3600,
416
- 'cpu-util': 50,
417
- },
418
- ])).resolves.toStrictEqual([
419
- {
420
- 'embodied-carbon': 0.8,
421
- 'e-cpu': 0.575,
422
- },
423
- ]);
424
- });
425
- (0, globals_1.test)('initialize with params and call multiple usages in IMPL format:verbose', async () => {
426
- const outputModel = new index_1.BoaviztaCpuOutputModel();
427
- await (0, globals_1.expect)(outputModel.configure('test', {
428
- 'physical-processor': 'Intel Xeon Gold 6138f',
429
- 'core-units': 24,
430
- location: 'USA',
431
- verbose: true,
432
- })).resolves.toBeInstanceOf(index_1.BoaviztaCpuOutputModel);
433
- (0, globals_1.expect)(outputModel.name).toBe('test');
434
- // configure without static params will cause improper configure error
435
- await (0, globals_1.expect)(outputModel.execute([
436
- {
437
- timestamp: '2021-01-01T00:00:00Z',
438
- duration: 7200,
439
- 'cpu-util': 100,
440
- },
441
- ])).resolves.toStrictEqual([
442
- {
443
- 'embodied-carbon': 1.6,
444
- 'e-cpu': 1.6408333333333334,
445
- },
446
- ]);
447
- });
448
- });
449
- (0, globals_1.describe)('cloud:initialize with params', () => {
450
- (0, globals_1.test)('initialize with params and call usage in RAW Format', async () => {
451
- const outputModel = new index_1.BoaviztaCloudOutputModel();
452
- (0, globals_1.expect)(outputModel.modelIdentifier()).toBe('org.boavizta.cloud.sci');
453
- await (0, globals_1.expect)(outputModel.validateLocation({ location: 'SomethingFail' })).rejects.toThrowError();
454
- await (0, globals_1.expect)(outputModel.validateInstanceType({ 'instance-type': 'SomethingFail' })).rejects.toThrowError();
455
- await (0, globals_1.expect)(outputModel.validateProvider({ provider: 'SomethingFail' })).rejects.toThrowError();
456
- await (0, globals_1.expect)(outputModel.configure('test', {
457
- 'instance-type': 't2.micro',
458
- location: 'USA',
459
- 'expected-lifespan': 4 * 365 * 24 * 60 * 60,
460
- provider: 'aws',
461
- verbose: false,
462
- })).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
463
- await (0, globals_1.expect)(outputModel.configure('test', {
464
- 'instance-type': 't2.micro',
465
- location: 'USA',
466
- 'expected-lifespan': 4 * 365 * 24 * 60 * 60,
467
- provider: 'aws',
468
- verbose: 'false',
469
- })).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
470
- await (0, globals_1.expect)(outputModel.configure('test', {
471
- 'instance-type': 't2.micro',
472
- location: 'USA',
473
- 'expected-lifespan': 4 * 365 * 24 * 60 * 60,
474
- provider: 'aws',
475
- verbose: 0,
476
- })).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
477
- (0, globals_1.expect)(outputModel.name).toBe('test');
478
- // configure without static params will cause improper configure error
479
- });
480
- (0, globals_1.test)("correct 'instance-type': initialize with params and call usage in IMPL Format", async () => {
481
- const outputModel = new index_1.BoaviztaCloudOutputModel();
482
- await (0, globals_1.expect)(outputModel.configure('test', {
483
- 'instance-type': 't2.micro',
484
- location: 'USA',
485
- })).rejects.toThrowError();
486
- await (0, globals_1.expect)(outputModel.configure('test', {
487
- provider: 'aws',
488
- location: 'USA',
489
- })).rejects.toThrowError();
490
- await (0, globals_1.expect)(outputModel.configure('test', {
491
- 'instance-type': 't2.micro',
492
- location: 'USA',
493
- provider: 'aws',
494
- })).resolves.toBeInstanceOf(index_1.BoaviztaCloudOutputModel);
495
- (0, globals_1.expect)(outputModel.name).toBe('test');
496
- // mockAxios.get.mockResolvedValue({data: {}});
497
- await (0, globals_1.expect)(outputModel.execute([
498
- {
499
- timestamp: '2021-01-01T00:00:00Z',
500
- duration: 15,
501
- 'cpu-util': 34,
502
- },
503
- ])).resolves.toStrictEqual([
504
- {
505
- 'embodied-carbon': 1.6,
506
- energy: 1.6408333333333334,
507
- },
508
- ]);
509
- });
510
- (0, globals_1.test)('wrong "instance-type": initialize with params and call usage in IMPL Format throws error', async () => {
511
- const outputModel = new index_1.BoaviztaCloudOutputModel();
512
- await (0, globals_1.expect)(outputModel.configure('test', {
513
- 'instance-type': 't5.micro',
514
- location: 'USA',
515
- provider: 'aws',
516
- })).rejects.toThrowError();
517
- (0, globals_1.expect)(outputModel.name).toBe('test');
518
- // configure without static params will cause improper configure error
519
- await (0, globals_1.expect)(outputModel.execute([
520
- {
521
- timestamp: '2021-01-01T00:00:00Z',
522
- duration: 15,
523
- 'cpu-util': 34,
524
- },
525
- {
526
- timestamp: '2021-01-01T00:00:15Z',
527
- duration: 15,
528
- 'cpu-util': 12,
529
- },
530
- {
531
- timestamp: '2021-01-01T00:00:30Z',
532
- duration: 15,
533
- 'cpu-util': 1,
534
- },
535
- {
536
- timestamp: '2021-01-01T00:00:45Z',
537
- duration: 15,
538
- 'cpu-util': 78,
539
- },
540
- ])).rejects.toThrowError();
541
- });
542
- (0, globals_1.test)('without "instance-type": initialize with params and call usage in IMPL Format throws error', async () => {
543
- const outputModel = new index_1.BoaviztaCloudOutputModel();
544
- await (0, globals_1.expect)(outputModel.configure('test', {
545
- location: 'USA',
546
- provider: 'aws',
547
- })).rejects.toStrictEqual(Error("Improper configure: Missing 'instance-type' parameter"));
548
- await (0, globals_1.expect)(outputModel.configure('test', {
549
- location: 'USAF',
550
- provider: 'aws',
551
- 'instance-type': 't2.micro',
552
- })).rejects.toThrowError();
553
- (0, globals_1.expect)(outputModel.name).toBe('test');
554
- // configure without static params will cause improper configure error
555
- await (0, globals_1.expect)(outputModel.execute([
556
- {
557
- timestamp: '2021-01-01T00:00:00Z',
558
- duration: 15,
559
- 'cpu-util': 34,
560
- },
561
- {
562
- timestamp: '2021-01-01T00:00:15Z',
563
- duration: 15,
564
- 'cpu-util': 12,
565
- },
566
- {
567
- timestamp: '2021-01-01T00:00:30Z',
568
- duration: 15,
569
- 'cpu-util': 1,
570
- },
571
- {
572
- timestamp: '2021-01-01T00:00:45Z',
573
- duration: 15,
574
- 'cpu-util': 78,
575
- },
576
- ])).rejects.toStrictEqual(Error('Improper configure: Missing configuration parameters'));
577
- });
578
- });
579
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9fX3Rlc3RzX18vdW5pdC9saWIvYm9hdml6dGEvaW5kZXgudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJDQUEyRDtBQUMzRCwwREFHd0M7QUFDeEMsaUNBQTJDO0FBQzNDLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UscUZBQXFGO0FBRXJGLEtBQUssVUFBVSxRQUFRLENBQ3JCLEdBQVc7SUFFWCxRQUFRLEdBQUcsRUFBRTtRQUNYLEtBQUssMERBQTBEO1lBQzdELE9BQU8sRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFNLENBQUM7UUFDaEMsS0FBSyxnREFBZ0Q7WUFDbkQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBTSxDQUFDLENBQUM7UUFDakQsS0FBSyx1RUFBdUU7WUFDMUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFJLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQzthQUN2QixDQUFDLENBQUM7S0FDWDtJQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQixNQUFNLFNBQVMsR0FBRyxlQUFrQyxDQUFDO0FBQ3JELHVFQUF1RTtBQUN2RSxTQUFTLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQy9CLENBQXFDLEdBQVcsRUFBYyxFQUFFO0lBQzlELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxvRUFBb0U7WUFDdkUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFO3dCQUNQLEdBQUcsRUFB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akMsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osVUFBVSxFQUFFLEVBQUU7YUFDZjtTQUNGLENBQUMsQ0FDSCxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQ3JCLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUM5RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGVzY3JpYmUsIGV4cGVjdCwgamVzdCwgdGVzdH0gZnJvbSAnQGplc3QvZ2xvYmFscyc7XG5pbXBvcnQge1xuICBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwsXG4gIEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwsXG59IGZyb20gJy4uLy4uLy4uLy4uL2xpYi9ib2F2aXp0YS9pbmRleCc7XG5pbXBvcnQgYXhpb3MsIHtBeGlvc1Jlc3BvbnNlfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgKiBhcyBQUk9WSURFUlMgZnJvbSAnLi4vLi4vLi4vLi4vX19tb2Nrc19fL2JvYXZpenRhL3Byb3ZpZGVycy5qc29uJztcbmltcG9ydCAqIGFzIENPVU5UUklFUyBmcm9tICcuLi8uLi8uLi8uLi9fX21vY2tzX18vYm9hdml6dGEvY291bnRyaWVzLmpzb24nO1xuaW1wb3J0ICogYXMgSU5TVEFOQ0VfVFlQRVMgZnJvbSAnLi4vLi4vLi4vLi4vX19tb2Nrc19fL2JvYXZpenRhL2luc3RhbmNlX3R5cGVzLmpzb24nO1xuXG5hc3luYyBmdW5jdGlvbiBheGlvc0dldDxUID0gYW55LCBSID0gQXhpb3NSZXNwb25zZTxULCBhbnk+PihcbiAgdXJsOiBzdHJpbmdcbik6IFByb21pc2U8Uj4ge1xuICBzd2l0Y2ggKHVybCkge1xuICAgIGNhc2UgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jbG91ZC9pbnN0YW5jZS9hbGxfcHJvdmlkZXJzJzpcbiAgICAgIHJldHVybiB7ZGF0YTogUFJPVklERVJTfSBhcyBSO1xuICAgIGNhc2UgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS91dGlscy9jb3VudHJ5X2NvZGUnOlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7ZGF0YTogQ09VTlRSSUVTfSBhcyBSKTtcbiAgICBjYXNlICdodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2UvYWxsX2luc3RhbmNlcz9wcm92aWRlcj1hd3MnOlxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIGRhdGE6IElOU1RBTkNFX1RZUEVTWydhd3MnXSxcbiAgICAgIH0gYXMgUik7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSBhcyBSKTtcbn1cblxuamVzdC5tb2NrKCdheGlvcycpO1xuY29uc3QgbW9ja0F4aW9zID0gYXhpb3MgYXMgamVzdC5Nb2NrZWQ8dHlwZW9mIGF4aW9zPjtcbi8vIE1vY2sgb3V0IGFsbCB0b3AgbGV2ZWwgZnVuY3Rpb25zLCBzdWNoIGFzIGdldCwgcHV0LCBkZWxldGUgYW5kIHBvc3Q6XG5tb2NrQXhpb3MuZ2V0Lm1vY2tJbXBsZW1lbnRhdGlvbihheGlvc0dldCk7XG5tb2NrQXhpb3MucG9zdC5tb2NrSW1wbGVtZW50YXRpb24oXG4gIDxUID0gYW55LCBSID0gQXhpb3NSZXNwb25zZTxULCBhbnk+Pih1cmw6IHN0cmluZyk6IFByb21pc2U8Uj4gPT4ge1xuICAgIHN3aXRjaCAodXJsKSB7XG4gICAgICBjYXNlICdodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY29tcG9uZW50L2NwdT92ZXJib3NlPWZhbHNlJmR1cmF0aW9uPTEnOlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBvdXRwdXRzOiB7XG4gICAgICAgICAgICAgIGd3cDoge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogMC4wMDA4LFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAwMDQxNTUsXG4gICAgICAgICAgICAgICAgICBtYXg6IDAuMDAzMTEzLFxuICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFsnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDAuMDY3NDMsIG1pbjogMC4wNjc0MywgbWF4OiAwLjA2NzQzfSxcbiAgICAgICAgICAgICAgICB1bml0OiAna2dDTzJlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBjbGltYXRlIGNoYW5nZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkcDoge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogNy43NjRlLTcsXG4gICAgICAgICAgICAgICAgICBtaW46IDcuNzYzZS03LFxuICAgICAgICAgICAgICAgICAgbWF4OiA3Ljc3MWUtNyxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAxLjc5NmUtOCwgbWluOiAxLjc5NmUtOCwgbWF4OiAxLjc5NmUtOH0sXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnU2JlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2Ugb2YgbWluZXJhbHMgYW5kIGZvc3NpbCByZXNzb3VyY2VzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGU6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDEyLFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAwNjg0NyxcbiAgICAgICAgICAgICAgICAgIG1heDogMC4wNDMxNCxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAyLjA3LCBtaW46IDIuMDcsIG1heDogMi4wN30sXG4gICAgICAgICAgICAgICAgdW5pdDogJ01KJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bXB0aW9uIG9mIHByaW1hcnkgZW5lcmd5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBSKTtcbiAgICAgIGNhc2UgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jb21wb25lbnQvY3B1P3ZlcmJvc2U9dHJ1ZSZkdXJhdGlvbj0yJzpcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgb3V0cHV0czoge1xuICAgICAgICAgICAgICBnd3A6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAxNixcbiAgICAgICAgICAgICAgICAgIG1pbjogMC4wMDA4MzEsXG4gICAgICAgICAgICAgICAgICBtYXg6IDAuMDA2MjI2LFxuICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFsnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDAuMTkyNCwgbWluOiAwLjE5MjQsIG1heDogMC4xOTI0fSxcbiAgICAgICAgICAgICAgICB1bml0OiAna2dDTzJlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBjbGltYXRlIGNoYW5nZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkcDoge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogMC4wMDAwMDE1NTMsXG4gICAgICAgICAgICAgICAgICBtaW46IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgbWF4OiAwLjAwMDAwMTU1NCxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjEyNmUtOCwgbWluOiA1LjEyNmUtOCwgbWF4OiA1LjEyNmUtOH0sXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnU2JlcScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdVc2Ugb2YgbWluZXJhbHMgYW5kIGZvc3NpbCByZXNzb3VyY2VzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGU6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDIzLFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAxMzY5LFxuICAgICAgICAgICAgICAgICAgbWF4OiAwLjA4NjI3LFxuICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFsnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbiddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDUuOTA3LCBtaW46IDUuOTA3LCBtYXg6IDUuOTA3fSxcbiAgICAgICAgICAgICAgICB1bml0OiAnTUonLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ29uc3VtcHRpb24gb2YgcHJpbWFyeSBlbmVyZ3knLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgICAgICAgb3V0cHV0czoge1xuICAgICAgICAgICAgICAgIGd3cDoge1xuICAgICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAxNixcbiAgICAgICAgICAgICAgICAgICAgbWluOiAwLjAwMDgzMSxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiAwLjAwNjIyNixcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDAuMTkyNCwgbWluOiAwLjE5MjQsIG1heDogMC4xOTI0fSxcbiAgICAgICAgICAgICAgICAgIHVuaXQ6ICdrZ0NPMmVxJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgY2xpbWF0ZSBjaGFuZ2UnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWRwOiB7XG4gICAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMC4wMDAwMDE1NTMsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMC4wMDAwMDE1NTMsXG4gICAgICAgICAgICAgICAgICAgIG1heDogMC4wMDAwMDE1NTQsXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjEyNmUtOCwgbWluOiA1LjEyNmUtOCwgbWF4OiA1LjEyNmUtOH0sXG4gICAgICAgICAgICAgICAgICB1bml0OiAna2dTYmVxJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlIG9mIG1pbmVyYWxzIGFuZCBmb3NzaWwgcmVzc291cmNlcycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwZToge1xuICAgICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDIzLFxuICAgICAgICAgICAgICAgICAgICBtaW46IDAuMDEzNjksXG4gICAgICAgICAgICAgICAgICAgIG1heDogMC4wODYyNyxcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAnRW5kIG9mIGxpZmUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBjYWxjdWxhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdXNlOiB7dmFsdWU6IDUuOTA3LCBtaW46IDUuOTA3LCBtYXg6IDUuOTA3fSxcbiAgICAgICAgICAgICAgICAgIHVuaXQ6ICdNSicsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bXB0aW9uIG9mIHByaW1hcnkgZW5lcmd5JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB1bml0czoge3ZhbHVlOiAxLCBzdGF0dXM6ICdBUkNIRVRZUEUnLCBtaW46IDEsIG1heDogMX0sXG4gICAgICAgICAgICAgIGRpZV9zaXplOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDUyMSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdtbTInLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0F2ZXJhZ2UgdmFsdWUgZm9yIGFsbCBmYW1pbGllcycsXG4gICAgICAgICAgICAgICAgbWluOiA0MS4yLFxuICAgICAgICAgICAgICAgIG1heDogMzY0MCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHt2YWx1ZTogMiwgdW5pdDogJ2hvdXJzJ30sXG4gICAgICAgICAgICAgIGF2Z19wb3dlcjoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAyNjAuMDUsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnVycsXG4gICAgICAgICAgICAgICAgbWluOiAyNjAuMDUsXG4gICAgICAgICAgICAgICAgbWF4OiAyNjAuMDUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRpbWVfd29ya2xvYWQ6IHt2YWx1ZTogMTAwLCBzdGF0dXM6ICdJTlBVVCcsIHVuaXQ6ICclJ30sXG4gICAgICAgICAgICAgIHVzYWdlX2xvY2F0aW9uOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICdVU0EnLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0lOUFVUJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnQ29kU1AzIC0gTkNTIENvdW50cnkgQ29kZXMgLSBOQVRPJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXNlX3RpbWVfcmF0aW86IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdBUkNIRVRZUEUnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICcvMScsXG4gICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgIG1heDogMSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaG91cnNfbGlmZV90aW1lOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDI2MjgwLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0FSQ0hFVFlQRScsXG4gICAgICAgICAgICAgICAgdW5pdDogJ2hvdXJzJyxcbiAgICAgICAgICAgICAgICBtaW46IDI2MjgwLFxuICAgICAgICAgICAgICAgIG1heDogMjYyODAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB7YTogMTcxLjIsIGI6IDAuMDM1NCwgYzogMzYuODksIGQ6IC0xMC4xM30sXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQVJDSEVUWVBFJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZ3dwX2ZhY3Rvcjoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAwLjM3LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnIENPMmVxL2tXaCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly9lbWJlci1jbGltYXRlLm9yZy9kYXRhL2RhdGEtZXhwbG9yZXInLFxuICAgICAgICAgICAgICAgIG1pbjogMC4zNyxcbiAgICAgICAgICAgICAgICBtYXg6IDAuMzcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkcF9mYWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogOS44NTU0OGUtOCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdrZyBTYmVxL2tXaCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnQURFTUUgQmFzZSBvdXRwdXRTIMKuJyxcbiAgICAgICAgICAgICAgICBtaW46IDkuODU1NDhlLTgsXG4gICAgICAgICAgICAgICAgbWF4OiA5Ljg1NTQ4ZS04LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwZV9mYWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTEuMzU4LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ01KL2tXaCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnQURQZiAvICgxLSVyZW5ld2FibGVfZW5lcmd5KScsXG4gICAgICAgICAgICAgICAgbWluOiAxMS4zNTgsXG4gICAgICAgICAgICAgICAgbWF4OiAxMS4zNTgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgUik7XG4gICAgICBjYXNlICdodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2U/dmVyYm9zZT1mYWxzZSZkdXJhdGlvbj0wLjAwNDE2NjY2NjY2NjY2NjY2Nyc6XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG91dHB1dHM6IHtcbiAgICAgICAgICAgICAgZ3dwOiB7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAwMTYsXG4gICAgICAgICAgICAgICAgICBtaW46IDAuMDAwODMxLFxuICAgICAgICAgICAgICAgICAgbWF4OiAwLjAwNjIyNixcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAwLjE5MjQsIG1pbjogMC4xOTI0LCBtYXg6IDAuMTkyNH0sXG4gICAgICAgICAgICAgICAgdW5pdDogJ2tnQ08yZXEnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgY2xpbWF0ZSBjaGFuZ2UnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhZHA6IHtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZDoge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgbWluOiAwLjAwMDAwMTU1MyxcbiAgICAgICAgICAgICAgICAgIG1heDogMC4wMDAwMDE1NTQsXG4gICAgICAgICAgICAgICAgICB3YXJuaW5nczogWydFbmQgb2YgbGlmZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNhbGN1bGF0aW9uJ10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1c2U6IHt2YWx1ZTogNS4xMjZlLTgsIG1pbjogNS4xMjZlLTgsIG1heDogNS4xMjZlLTh9LFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdrZ1NiZXEnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlIG9mIG1pbmVyYWxzIGFuZCBmb3NzaWwgcmVzc291cmNlcycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBlOiB7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAyMyxcbiAgICAgICAgICAgICAgICAgIG1pbjogMC4wMTM2OSxcbiAgICAgICAgICAgICAgICAgIG1heDogMC4wODYyNyxcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjkwNywgbWluOiA1LjkwNywgbWF4OiA1LjkwN30sXG4gICAgICAgICAgICAgICAgdW5pdDogJ01KJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbnN1bXB0aW9uIG9mIHByaW1hcnkgZW5lcmd5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJib3NlOiB7XG4gICAgICAgICAgICAgIG91dHB1dHM6IHtcbiAgICAgICAgICAgICAgICBnd3A6IHtcbiAgICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAwMTYsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMC4wMDA4MzEsXG4gICAgICAgICAgICAgICAgICAgIG1heDogMC4wMDYyMjYsXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiAwLjE5MjQsIG1pbjogMC4xOTI0LCBtYXg6IDAuMTkyNH0sXG4gICAgICAgICAgICAgICAgICB1bml0OiAna2dDTzJlcScsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIGNsaW1hdGUgY2hhbmdlJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFkcDoge1xuICAgICAgICAgICAgICAgICAgZW1iZWRkZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgICBtaW46IDAuMDAwMDAxNTUzLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDAuMDAwMDAxNTU0LFxuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nczogW1xuICAgICAgICAgICAgICAgICAgICAgICdFbmQgb2YgbGlmZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNhbGN1bGF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB1c2U6IHt2YWx1ZTogNS4xMjZlLTgsIG1pbjogNS4xMjZlLTgsIG1heDogNS4xMjZlLTh9LFxuICAgICAgICAgICAgICAgICAgdW5pdDogJ2tnU2JlcScsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZSBvZiBtaW5lcmFscyBhbmQgZm9zc2lsIHJlc3NvdXJjZXMnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGU6IHtcbiAgICAgICAgICAgICAgICAgIGVtYmVkZGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLjAyMyxcbiAgICAgICAgICAgICAgICAgICAgbWluOiAwLjAxMzY5LFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDAuMDg2MjcsXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuZCBvZiBsaWZlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2FsY3VsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVzZToge3ZhbHVlOiA1LjkwNywgbWluOiA1LjkwNywgbWF4OiA1LjkwN30sXG4gICAgICAgICAgICAgICAgICB1bml0OiAnTUonLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDb25zdW1wdGlvbiBvZiBwcmltYXJ5IGVuZXJneScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5pdHM6IHt2YWx1ZTogMSwgc3RhdHVzOiAnQVJDSEVUWVBFJywgbWluOiAxLCBtYXg6IDF9LFxuICAgICAgICAgICAgICBkaWVfc2l6ZToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiA1MjEsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnbW0yJyxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdBdmVyYWdlIHZhbHVlIGZvciBhbGwgZmFtaWxpZXMnLFxuICAgICAgICAgICAgICAgIG1pbjogNDEuMixcbiAgICAgICAgICAgICAgICBtYXg6IDM2NDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB7dmFsdWU6IDIsIHVuaXQ6ICdob3Vycyd9LFxuICAgICAgICAgICAgICBhdmdfcG93ZXI6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMjYwLjA1LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ1cnLFxuICAgICAgICAgICAgICAgIG1pbjogMjYwLjA1LFxuICAgICAgICAgICAgICAgIG1heDogMjYwLjA1LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aW1lX3dvcmtsb2FkOiB7dmFsdWU6IDEwMCwgc3RhdHVzOiAnSU5QVVQnLCB1bml0OiAnJSd9LFxuICAgICAgICAgICAgICB1c2FnZV9sb2NhdGlvbjoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAnVVNBJyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdJTlBVVCcsXG4gICAgICAgICAgICAgICAgdW5pdDogJ0NvZFNQMyAtIE5DUyBDb3VudHJ5IENvZGVzIC0gTkFUTycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVzZV90aW1lX3JhdGlvOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQVJDSEVUWVBFJyxcbiAgICAgICAgICAgICAgICB1bml0OiAnLzEnLFxuICAgICAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGhvdXJzX2xpZmVfdGltZToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAyNjI4MCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdBUkNIRVRZUEUnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdob3VycycsXG4gICAgICAgICAgICAgICAgbWluOiAyNjI4MCxcbiAgICAgICAgICAgICAgICBtYXg6IDI2MjgwLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge2E6IDE3MS4yLCBiOiAwLjAzNTQsIGM6IDM2Ljg5LCBkOiAtMTAuMTN9LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ0FSQ0hFVFlQRScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGd3cF9mYWN0b3I6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMC4zNyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdrZyBDTzJlcS9rV2gnLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vZW1iZXItY2xpbWF0ZS5vcmcvZGF0YS9kYXRhLWV4cGxvcmVyJyxcbiAgICAgICAgICAgICAgICBtaW46IDAuMzcsXG4gICAgICAgICAgICAgICAgbWF4OiAwLjM3LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhZHBfZmFjdG9yOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDkuODU1NDhlLTgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICAgICAgICB1bml0OiAna2cgU2JlcS9rV2gnLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0FERU1FIEJhc2Ugb3V0cHV0UyDCricsXG4gICAgICAgICAgICAgICAgbWluOiA5Ljg1NTQ4ZS04LFxuICAgICAgICAgICAgICAgIG1heDogOS44NTU0OGUtOCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGVfZmFjdG9yOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDExLjM1OCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgICAgIHVuaXQ6ICdNSi9rV2gnLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0FEUGYgLyAoMS0lcmVuZXdhYmxlX2VuZXJneSknLFxuICAgICAgICAgICAgICAgIG1pbjogMTEuMzU4LFxuICAgICAgICAgICAgICAgIG1heDogMTEuMzU4LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIFIpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9IGFzIFIpO1xuICB9XG4pO1xuamVzdC5zZXRUaW1lb3V0KDMwMDAwKTtcbmRlc2NyaWJlKCdjcHU6Y29uZmlndXJlIHRlc3QnLCAoKSA9PiB7XG4gIHRlc3QoJ2luaXRpYWxpemUgd3JvbmcgcGFyYW1zIHNob3VsZCB0aHJvdyBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNwdU91dHB1dE1vZGVsKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge2FsbG9jYXRpb246ICd3cm9uZyd9KVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubmFtZSkudG9CZSgndGVzdCcpO1xuICB9KTtcblxuICB0ZXN0KCdpbml0aWFsaXplIHdpdGhvdXQgcGFyYW1zIHRocm93cyBlcnJvciBmb3IgcGFyYW1ldGVyIGFuZCBjYWxsIGV4ZWN1dGUgd2l0aG91dCBwYXJhbXMgdGhyb3dzIGVycm9yIGZvciBpbnB1dCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNwdU91dHB1dE1vZGVsKCk7XG4gICAgY29uc3Qgb3V0cHV0TW9kZWxDb25maWdGYWlsID0gbmV3IEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubW9kZWxJZGVudGlmaWVyKCkpLnRvQmUoJ29yZy5ib2F2aXp0YS5jcHUuc2NpJyk7XG4gICAgYXdhaXQgZXhwZWN0KG91dHB1dE1vZGVsLmF1dGhlbnRpY2F0ZSh7fSkpLnJlc29sdmVzLnRvQmUodW5kZWZpbmVkKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbENvbmZpZ0ZhaWwuZXhlY3V0ZShbXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjAwWicsXG4gICAgICAgICAgZHVyYXRpb246IDM2MDAsXG4gICAgICAgICAgJ2NwdS11dGlsJzogNTAsXG4gICAgICAgIH0sXG4gICAgICBdKVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcblxuICAgIGF3YWl0IGV4cGVjdChvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnKSkucmVqZWN0cy50b1Rocm93KFxuICAgICAgRXJyb3IoJ0ltcHJvcGVyIGNvbmZpZ3VyZTogTWlzc2luZyBwcm9jZXNzb3IgcGFyYW1ldGVyJylcbiAgICApO1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgJ3BoeXNpY2FsLXByb2Nlc3Nvcic6ICdJbnRlbCBYZW9uIEdvbGQgNjEzOGYnLFxuICAgICAgfSlcbiAgICApLnJlamVjdHMudG9UaHJvdyhcbiAgICAgIEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29yZS11bml0cyBwYXJhbWV0ZXInKVxuICAgICk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge1xuICAgICAgICAncGh5c2ljYWwtcHJvY2Vzc29yJzogJ0ludGVsIFhlb24gR29sZCA2MTM4ZicsXG4gICAgICAgICdjb3JlLXVuaXRzJzogMjQsXG4gICAgICAgICdleHBlY3RlZC1saWZlc3Bhbic6IDQgKiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDcHVPdXRwdXRNb2RlbCk7XG4gICAgZXhwZWN0KG91dHB1dE1vZGVsLm5hbWUpLnRvQmUoJ3Rlc3QnKTtcbiAgICAvLyBub3QgcHJvdmlkaW5nIGlucHV0cyB3aWxsIHRocm93IGEgbWlzc2luZyBpbnB1dHMgZXJyb3JcbiAgICBhd2FpdCBleHBlY3Qob3V0cHV0TW9kZWwuZXhlY3V0ZSgpKS5yZWplY3RzLnRvU3RyaWN0RXF1YWwoXG4gICAgICBFcnJvcihcbiAgICAgICAgJ1BhcmFtZXRlciBOb3QgR2l2ZW46IGludmFsaWQgaW5wdXRzIHBhcmFtZXRlci4gRXhwZWN0aW5nIGFuIGFycmF5IG9mIGlucHV0cydcbiAgICAgIClcbiAgICApO1xuICAgIC8vIGltcHJvcGVyIGlucHV0cyB3aWxsIHRocm93IGFuIGludmFsaWQgaW5wdXRzIGVycm9yXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuZXhlY3V0ZShbe2ludmFsaWQ6ICdpbnB1dCd9XSlcbiAgICApLnJlamVjdHMudG9TdHJpY3RFcXVhbChFcnJvcignSW52YWxpZCBJbnB1dDogSW52YWxpZCBpbnB1dHMgcGFyYW1ldGVyJykpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY3B1OmluaXRpYWxpemUgd2l0aCBwYXJhbXMnLCAoKSA9PiB7XG4gIHRlc3QoJ2luaXRpYWxpemUgd2l0aCBwYXJhbXMgYW5kIGNhbGwgbXVsdGlwbGUgdXNhZ2VzIGluIElNUEwgZm9ybWF0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dHB1dE1vZGVsID0gbmV3IEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwoKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdwaHlzaWNhbC1wcm9jZXNzb3InOiAnSW50ZWwgWGVvbiBHb2xkIDYxMzhmJyxcbiAgICAgICAgJ2NvcmUtdW5pdHMnOiAyNCxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgfSlcbiAgICApLnJlc29sdmVzLnRvQmVJbnN0YW5jZU9mKEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwpO1xuICAgIGV4cGVjdChvdXRwdXRNb2RlbC5uYW1lKS50b0JlKCd0ZXN0Jyk7XG4gICAgLy8gY29uZmlndXJlIHdpdGhvdXQgc3RhdGljIHBhcmFtcyB3aWxsIGNhdXNlIGltcHJvcGVyIGNvbmZpZ3VyZSBlcnJvclxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAzNjAwLFxuICAgICAgICAgICdjcHUtdXRpbCc6IDUwLFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICApLnJlc29sdmVzLnRvU3RyaWN0RXF1YWwoW1xuICAgICAge1xuICAgICAgICAnZW1ib2RpZWQtY2FyYm9uJzogMC44LFxuICAgICAgICAnZS1jcHUnOiAwLjU3NSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0pO1xuICB0ZXN0KCdpbml0aWFsaXplIHdpdGggcGFyYW1zIGFuZCBjYWxsIG11bHRpcGxlIHVzYWdlcyBpbiBJTVBMIGZvcm1hdDp2ZXJib3NlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dHB1dE1vZGVsID0gbmV3IEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwoKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdwaHlzaWNhbC1wcm9jZXNzb3InOiAnSW50ZWwgWGVvbiBHb2xkIDYxMzhmJyxcbiAgICAgICAgJ2NvcmUtdW5pdHMnOiAyNCxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICB2ZXJib3NlOiB0cnVlLFxuICAgICAgfSlcbiAgICApLnJlc29sdmVzLnRvQmVJbnN0YW5jZU9mKEJvYXZpenRhQ3B1T3V0cHV0TW9kZWwpO1xuICAgIGV4cGVjdChvdXRwdXRNb2RlbC5uYW1lKS50b0JlKCd0ZXN0Jyk7XG4gICAgLy8gY29uZmlndXJlIHdpdGhvdXQgc3RhdGljIHBhcmFtcyB3aWxsIGNhdXNlIGltcHJvcGVyIGNvbmZpZ3VyZSBlcnJvclxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiA3MjAwLFxuICAgICAgICAgICdjcHUtdXRpbCc6IDEwMCxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS5yZXNvbHZlcy50b1N0cmljdEVxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgJ2VtYm9kaWVkLWNhcmJvbic6IDEuNixcbiAgICAgICAgJ2UtY3B1JzogMS42NDA4MzMzMzMzMzMzMzM0LFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2Nsb3VkOmluaXRpYWxpemUgd2l0aCBwYXJhbXMnLCAoKSA9PiB7XG4gIHRlc3QoJ2luaXRpYWxpemUgd2l0aCBwYXJhbXMgYW5kIGNhbGwgdXNhZ2UgaW4gUkFXIEZvcm1hdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubW9kZWxJZGVudGlmaWVyKCkpLnRvQmUoJ29yZy5ib2F2aXp0YS5jbG91ZC5zY2knKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC52YWxpZGF0ZUxvY2F0aW9uKHtsb2NhdGlvbjogJ1NvbWV0aGluZ0ZhaWwnfSlcbiAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwudmFsaWRhdGVJbnN0YW5jZVR5cGUoeydpbnN0YW5jZS10eXBlJzogJ1NvbWV0aGluZ0ZhaWwnfSlcbiAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwudmFsaWRhdGVQcm92aWRlcih7cHJvdmlkZXI6ICdTb21ldGhpbmdGYWlsJ30pXG4gICAgKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgJ2luc3RhbmNlLXR5cGUnOiAndDIubWljcm8nLFxuICAgICAgICBsb2NhdGlvbjogJ1VTQScsXG4gICAgICAgICdleHBlY3RlZC1saWZlc3Bhbic6IDQgKiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgICAgIHByb3ZpZGVyOiAnYXdzJyxcbiAgICAgICAgdmVyYm9zZTogZmFsc2UsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3QyLm1pY3JvJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICAnZXhwZWN0ZWQtbGlmZXNwYW4nOiA0ICogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICAgIHZlcmJvc2U6ICdmYWxzZScsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3QyLm1pY3JvJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICAnZXhwZWN0ZWQtbGlmZXNwYW4nOiA0ICogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICAgIHZlcmJvc2U6IDAsXG4gICAgICB9KVxuICAgICkucmVzb2x2ZXMudG9CZUluc3RhbmNlT2YoQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubmFtZSkudG9CZSgndGVzdCcpO1xuICAgIC8vIGNvbmZpZ3VyZSB3aXRob3V0IHN0YXRpYyBwYXJhbXMgd2lsbCBjYXVzZSBpbXByb3BlciBjb25maWd1cmUgZXJyb3JcbiAgfSk7XG5cbiAgdGVzdChcImNvcnJlY3QgJ2luc3RhbmNlLXR5cGUnOiBpbml0aWFsaXplIHdpdGggcGFyYW1zIGFuZCBjYWxsIHVzYWdlIGluIElNUEwgRm9ybWF0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwoKTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgJ2luc3RhbmNlLXR5cGUnOiAndDIubWljcm8nLFxuICAgICAgICBsb2NhdGlvbjogJ1VTQScsXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgIHByb3ZpZGVyOiAnYXdzJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgfSlcbiAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge1xuICAgICAgICAnaW5zdGFuY2UtdHlwZSc6ICd0Mi5taWNybycsXG4gICAgICAgIGxvY2F0aW9uOiAnVVNBJyxcbiAgICAgICAgcHJvdmlkZXI6ICdhd3MnLFxuICAgICAgfSlcbiAgICApLnJlc29sdmVzLnRvQmVJbnN0YW5jZU9mKEJvYXZpenRhQ2xvdWRPdXRwdXRNb2RlbCk7XG4gICAgZXhwZWN0KG91dHB1dE1vZGVsLm5hbWUpLnRvQmUoJ3Rlc3QnKTtcbiAgICAvLyBtb2NrQXhpb3MuZ2V0Lm1vY2tSZXNvbHZlZFZhbHVlKHtkYXRhOiB7fX0pO1xuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiAzNCxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS5yZXNvbHZlcy50b1N0cmljdEVxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgJ2VtYm9kaWVkLWNhcmJvbic6IDEuNixcbiAgICAgICAgZW5lcmd5OiAxLjY0MDgzMzMzMzMzMzMzMzQsXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICB0ZXN0KCd3cm9uZyBcImluc3RhbmNlLXR5cGVcIjogaW5pdGlhbGl6ZSB3aXRoIHBhcmFtcyBhbmQgY2FsbCB1c2FnZSBpbiBJTVBMIEZvcm1hdCB0aHJvd3MgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0cHV0TW9kZWwgPSBuZXcgQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsKCk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5jb25maWd1cmUoJ3Rlc3QnLCB7XG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3Q1Lm1pY3JvJyxcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICBleHBlY3Qob3V0cHV0TW9kZWwubmFtZSkudG9CZSgndGVzdCcpO1xuICAgIC8vIGNvbmZpZ3VyZSB3aXRob3V0IHN0YXRpYyBwYXJhbXMgd2lsbCBjYXVzZSBpbXByb3BlciBjb25maWd1cmUgZXJyb3JcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBvdXRwdXRNb2RlbC5leGVjdXRlKFtcbiAgICAgICAge1xuICAgICAgICAgIHRpbWVzdGFtcDogJzIwMjEtMDEtMDFUMDA6MDA6MDBaJyxcbiAgICAgICAgICBkdXJhdGlvbjogMTUsXG4gICAgICAgICAgJ2NwdS11dGlsJzogMzQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjE1WicsXG4gICAgICAgICAgZHVyYXRpb246IDE1LFxuICAgICAgICAgICdjcHUtdXRpbCc6IDEyLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDozMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDo0NVonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiA3OCxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICB9KTtcblxuICB0ZXN0KCd3aXRob3V0IFwiaW5zdGFuY2UtdHlwZVwiOiBpbml0aWFsaXplIHdpdGggcGFyYW1zIGFuZCBjYWxsIHVzYWdlIGluIElNUEwgRm9ybWF0IHRocm93cyBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXRNb2RlbCA9IG5ldyBCb2F2aXp0YUNsb3VkT3V0cHV0TW9kZWwoKTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmNvbmZpZ3VyZSgndGVzdCcsIHtcbiAgICAgICAgbG9jYXRpb246ICdVU0EnLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1N0cmljdEVxdWFsKFxuICAgICAgRXJyb3IoXCJJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgJ2luc3RhbmNlLXR5cGUnIHBhcmFtZXRlclwiKVxuICAgICk7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgb3V0cHV0TW9kZWwuY29uZmlndXJlKCd0ZXN0Jywge1xuICAgICAgICBsb2NhdGlvbjogJ1VTQUYnLFxuICAgICAgICBwcm92aWRlcjogJ2F3cycsXG4gICAgICAgICdpbnN0YW5jZS10eXBlJzogJ3QyLm1pY3JvJyxcbiAgICAgIH0pXG4gICAgKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgIGV4cGVjdChvdXRwdXRNb2RlbC5uYW1lKS50b0JlKCd0ZXN0Jyk7XG4gICAgLy8gY29uZmlndXJlIHdpdGhvdXQgc3RhdGljIHBhcmFtcyB3aWxsIGNhdXNlIGltcHJvcGVyIGNvbmZpZ3VyZSBlcnJvclxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIG91dHB1dE1vZGVsLmV4ZWN1dGUoW1xuICAgICAgICB7XG4gICAgICAgICAgdGltZXN0YW1wOiAnMjAyMS0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGR1cmF0aW9uOiAxNSxcbiAgICAgICAgICAnY3B1LXV0aWwnOiAzNCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRpbWVzdGFtcDogJzIwMjEtMDEtMDFUMDA6MDA6MTVaJyxcbiAgICAgICAgICBkdXJhdGlvbjogMTUsXG4gICAgICAgICAgJ2NwdS11dGlsJzogMTIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjMwWicsXG4gICAgICAgICAgZHVyYXRpb246IDE1LFxuICAgICAgICAgICdjcHUtdXRpbCc6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lc3RhbXA6ICcyMDIxLTAxLTAxVDAwOjAwOjQ1WicsXG4gICAgICAgICAgZHVyYXRpb246IDE1LFxuICAgICAgICAgICdjcHUtdXRpbCc6IDc4LFxuICAgICAgICB9LFxuICAgICAgXSlcbiAgICApLnJlamVjdHMudG9TdHJpY3RFcXVhbChcbiAgICAgIEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzJylcbiAgICApO1xuICB9KTtcbn0pO1xuIl19