keez-invoicing 1.1.5
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.
- package/LICENSE +28 -0
- package/README.md +366 -0
- package/dist/coverage/lcov-report/block-navigation.js +71 -0
- package/dist/coverage/lcov-report/prettify.js +478 -0
- package/dist/coverage/lcov-report/sorter.js +177 -0
- package/dist/eslint.config.js +56 -0
- package/dist/jest.config.cjs +13 -0
- package/dist/jest.config.js +13 -0
- package/dist/src/api/__tests__/index.test.js +52 -0
- package/dist/src/api/authorise.js +48 -0
- package/dist/src/api/invoices/cancel.js +33 -0
- package/dist/src/api/invoices/create.js +97 -0
- package/dist/src/api/invoices/delete.js +33 -0
- package/dist/src/api/invoices/downloadPdf.js +31 -0
- package/dist/src/api/invoices/getAll.js +84 -0
- package/dist/src/api/invoices/sendMail.js +59 -0
- package/dist/src/api/invoices/submitEfactura.js +34 -0
- package/dist/src/api/invoices/update.js +61 -0
- package/dist/src/api/invoices/validate.js +39 -0
- package/dist/src/api/invoices/view.js +93 -0
- package/dist/src/api/items/create.js +42 -0
- package/dist/src/api/items/getAll.js +74 -0
- package/dist/src/api/items/getById.js +46 -0
- package/dist/src/api/items/index.js +14 -0
- package/dist/src/api/items/patch.js +49 -0
- package/dist/src/api/items/update.js +41 -0
- package/dist/src/config/constants.js +23 -0
- package/dist/src/config/constructorParam.js +3 -0
- package/dist/src/config/measureUnit.js +22 -0
- package/dist/src/config/paymentType.js +17 -0
- package/dist/src/config/paymentType.js.js +16 -0
- package/dist/src/dto/allInvoicesResponse.js +3 -0
- package/dist/src/dto/authResponse.js +3 -0
- package/dist/src/dto/common/index.js +3 -0
- package/dist/src/dto/common/paginationParams.js +3 -0
- package/dist/src/dto/createInvoiceRequest.js +3 -0
- package/dist/src/dto/invoiceResponse.js +3 -0
- package/dist/src/dto/invoices/index.js +3 -0
- package/dist/src/dto/invoices/invoiceFilterParams.js +3 -0
- package/dist/src/dto/invoices/invoiceRequestV2.js +3 -0
- package/dist/src/dto/invoices/sendInvoiceParams.js +3 -0
- package/dist/src/dto/items/allItemsResponse.js +3 -0
- package/dist/src/dto/items/index.js +3 -0
- package/dist/src/dto/items/itemRequest.js +3 -0
- package/dist/src/dto/items/itemResponse.js +3 -0
- package/dist/src/errors/KeezError.js +27 -0
- package/dist/src/helpers/logger.js +15 -0
- package/dist/src/index.js +15 -0
- package/dist/src/keezApi.js +283 -0
- package/dist/tests/additional-coverage.test.js +351 -0
- package/dist/tests/edge-cases.test.js +353 -0
- package/dist/tests/error-handling.test.js +224 -0
- package/dist/tests/filter-params.test.js +267 -0
- package/dist/tests/index.test.js +493 -0
- package/dist/tests/invoices-extended.test.js +168 -0
- package/dist/tests/items.test.js +142 -0
- package/dist/types/coverage/lcov-report/block-navigation.d.ts +1 -0
- package/dist/types/coverage/lcov-report/prettify.d.ts +0 -0
- package/dist/types/coverage/lcov-report/sorter.d.ts +1 -0
- package/dist/types/eslint.config.d.ts +2 -0
- package/dist/types/jest.config.d.cts +9 -0
- package/dist/types/jest.config.d.ts +9 -0
- package/dist/types/src/api/__tests__/index.test.d.ts +1 -0
- package/dist/types/src/api/authorise.d.ts +18 -0
- package/dist/types/src/api/invoices/cancel.d.ts +9 -0
- package/dist/types/src/api/invoices/create.d.ts +22 -0
- package/dist/types/src/api/invoices/delete.d.ts +9 -0
- package/dist/types/src/api/invoices/downloadPdf.d.ts +8 -0
- package/dist/types/src/api/invoices/getAll.d.ts +22 -0
- package/dist/types/src/api/invoices/sendMail.d.ts +24 -0
- package/dist/types/src/api/invoices/submitEfactura.d.ts +9 -0
- package/dist/types/src/api/invoices/update.d.ts +11 -0
- package/dist/types/src/api/invoices/validate.d.ts +21 -0
- package/dist/types/src/api/invoices/view.d.ts +22 -0
- package/dist/types/src/api/items/create.d.ts +10 -0
- package/dist/types/src/api/items/getAll.d.ts +10 -0
- package/dist/types/src/api/items/getById.d.ts +10 -0
- package/dist/types/src/api/items/index.d.ts +5 -0
- package/dist/types/src/api/items/patch.d.ts +11 -0
- package/dist/types/src/api/items/update.d.ts +11 -0
- package/dist/types/src/config/constants.d.ts +13 -0
- package/dist/types/src/config/constructorParam.d.ts +6 -0
- package/dist/types/src/config/measureUnit.d.ts +17 -0
- package/dist/types/src/config/paymentType.d.ts +12 -0
- package/dist/types/src/config/paymentType.js.d.ts +11 -0
- package/dist/types/src/dto/allInvoicesResponse.d.ts +21 -0
- package/dist/types/src/dto/authResponse.d.ts +7 -0
- package/dist/types/src/dto/common/index.d.ts +1 -0
- package/dist/types/src/dto/common/paginationParams.d.ts +4 -0
- package/dist/types/src/dto/createInvoiceRequest.d.ts +34 -0
- package/dist/types/src/dto/invoiceResponse.d.ts +48 -0
- package/dist/types/src/dto/invoices/index.d.ts +3 -0
- package/dist/types/src/dto/invoices/invoiceFilterParams.d.ts +8 -0
- package/dist/types/src/dto/invoices/invoiceRequestV2.d.ts +23 -0
- package/dist/types/src/dto/invoices/sendInvoiceParams.d.ts +5 -0
- package/dist/types/src/dto/items/allItemsResponse.d.ts +13 -0
- package/dist/types/src/dto/items/index.d.ts +3 -0
- package/dist/types/src/dto/items/itemRequest.d.ts +34 -0
- package/dist/types/src/dto/items/itemResponse.d.ts +15 -0
- package/dist/types/src/errors/KeezError.d.ts +11 -0
- package/dist/types/src/helpers/logger.d.ts +2 -0
- package/dist/types/src/index.d.ts +11 -0
- package/dist/types/src/keezApi.d.ts +114 -0
- package/dist/types/tests/additional-coverage.test.d.ts +1 -0
- package/dist/types/tests/edge-cases.test.d.ts +1 -0
- package/dist/types/tests/error-handling.test.d.ts +1 -0
- package/dist/types/tests/filter-params.test.d.ts +1 -0
- package/dist/types/tests/index.test.d.ts +1 -0
- package/dist/types/tests/invoices-extended.test.d.ts +1 -0
- package/dist/types/tests/items.test.d.ts +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const nock = require("nock");
|
|
4
|
+
const keezApi_1 = require("../src/keezApi");
|
|
5
|
+
const authorise_1 = require("../src/api/authorise");
|
|
6
|
+
const cancel_1 = require("../src/api/invoices/cancel");
|
|
7
|
+
const delete_1 = require("../src/api/invoices/delete");
|
|
8
|
+
const downloadPdf_1 = require("../src/api/invoices/downloadPdf");
|
|
9
|
+
const update_1 = require("../src/api/invoices/update");
|
|
10
|
+
const submitEfactura_1 = require("../src/api/invoices/submitEfactura");
|
|
11
|
+
const validate_1 = require("../src/api/invoices/validate");
|
|
12
|
+
const view_1 = require("../src/api/invoices/view");
|
|
13
|
+
const getAll_1 = require("../src/api/invoices/getAll");
|
|
14
|
+
const sendMail_1 = require("../src/api/invoices/sendMail");
|
|
15
|
+
const create_1 = require("../src/api/items/create");
|
|
16
|
+
const getAll_2 = require("../src/api/items/getAll");
|
|
17
|
+
const getById_1 = require("../src/api/items/getById");
|
|
18
|
+
const update_2 = require("../src/api/items/update");
|
|
19
|
+
const patch_1 = require("../src/api/items/patch");
|
|
20
|
+
const paymentType_1 = require("../src/config/paymentType");
|
|
21
|
+
const measureUnit_1 = require("../src/config/measureUnit");
|
|
22
|
+
const KeezError_1 = require("../src/errors/KeezError");
|
|
23
|
+
const baseDomain = 'https://staging.keez.ro';
|
|
24
|
+
const clientEid = 'test-client-eid';
|
|
25
|
+
describe('Additional Coverage Tests', () => {
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
nock.cleanAll();
|
|
28
|
+
});
|
|
29
|
+
describe('KeezApi getInvoiceByExternalId through class', () => {
|
|
30
|
+
let keezApi;
|
|
31
|
+
beforeAll(() => {
|
|
32
|
+
keezApi = new keezApi_1.KeezApi({
|
|
33
|
+
application_id: 'test-app-id',
|
|
34
|
+
client_eid: clientEid,
|
|
35
|
+
secret: 'test-secret',
|
|
36
|
+
live: false,
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it('should get invoice by external ID through KeezApi class', async () => {
|
|
40
|
+
nock(baseDomain)
|
|
41
|
+
.post('/idp/connect/token')
|
|
42
|
+
.reply(200, {
|
|
43
|
+
access_token: 'test-token',
|
|
44
|
+
expires_in: 3600,
|
|
45
|
+
token_type: 'Bearer',
|
|
46
|
+
scope: 'public-api',
|
|
47
|
+
});
|
|
48
|
+
const mockInvoice = {
|
|
49
|
+
currencyCode: 'RON',
|
|
50
|
+
discountGrossValue: 0,
|
|
51
|
+
discountNetValue: 0,
|
|
52
|
+
discountVatValue: 0,
|
|
53
|
+
discountValueOnNet: false,
|
|
54
|
+
exciseAmount: 0,
|
|
55
|
+
documentDate: 20230423,
|
|
56
|
+
dueDate: 20230430,
|
|
57
|
+
exchangeRate: 1,
|
|
58
|
+
grossAmount: 119,
|
|
59
|
+
netAmount: 100,
|
|
60
|
+
number: 1,
|
|
61
|
+
originalNetAmount: 100,
|
|
62
|
+
originalVatAmount: 19,
|
|
63
|
+
partner: {
|
|
64
|
+
addressDetails: 'Test Address',
|
|
65
|
+
cityName: 'Bucharest',
|
|
66
|
+
countryCode: 'RO',
|
|
67
|
+
countryName: 'Romania',
|
|
68
|
+
countyCode: 'RO.B',
|
|
69
|
+
countyName: 'Bucharest',
|
|
70
|
+
identificationNumber: '12345678',
|
|
71
|
+
isLegalPerson: false,
|
|
72
|
+
partnerName: 'Test Partner',
|
|
73
|
+
},
|
|
74
|
+
invoiceDetails: [
|
|
75
|
+
{
|
|
76
|
+
discountGrossValue: 0,
|
|
77
|
+
discountNetValue: 0,
|
|
78
|
+
discountVatValue: 0,
|
|
79
|
+
discountValueOnNet: false,
|
|
80
|
+
grossAmount: 119,
|
|
81
|
+
itemCode: 'ITEM-001',
|
|
82
|
+
itemDescription: 'Test Item',
|
|
83
|
+
itemExternalId: 'item-ext-1',
|
|
84
|
+
itemName: 'Test Item Name',
|
|
85
|
+
measureUnitId: 1,
|
|
86
|
+
netAmount: 100,
|
|
87
|
+
originalNetAmount: 100,
|
|
88
|
+
originalVatAmount: 19,
|
|
89
|
+
quantity: 1,
|
|
90
|
+
unMeasureUnit: 'buc',
|
|
91
|
+
unVatCategory: 'S',
|
|
92
|
+
unVatExemptionReason: '',
|
|
93
|
+
unitPrice: 100,
|
|
94
|
+
vatAmount: 19,
|
|
95
|
+
vatPercent: 19,
|
|
96
|
+
exciseAmount: 0,
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
paymentTypeId: 3,
|
|
100
|
+
referenceCurrencyCode: 'RON',
|
|
101
|
+
series: 'PDI',
|
|
102
|
+
status: 'draft',
|
|
103
|
+
vatAmount: 19,
|
|
104
|
+
vatOnCollection: false,
|
|
105
|
+
};
|
|
106
|
+
nock(baseDomain)
|
|
107
|
+
.get(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
108
|
+
.reply(200, mockInvoice);
|
|
109
|
+
const result = await keezApi.getInvoiceByExternalId('inv-123');
|
|
110
|
+
expect(result.grossAmount).toBe(119);
|
|
111
|
+
expect(result.partner.partnerName).toBe('Test Partner');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('Network Error Handling (axiosError.message fallback)', () => {
|
|
115
|
+
it('should handle network error in apiGenerateToken', async () => {
|
|
116
|
+
nock(baseDomain)
|
|
117
|
+
.post('/idp/connect/token')
|
|
118
|
+
.replyWithError('Network Error');
|
|
119
|
+
await expect((0, authorise_1.apiGenerateToken)({
|
|
120
|
+
baseDomain,
|
|
121
|
+
appId: 'test-app-id',
|
|
122
|
+
apiSecret: 'test-secret',
|
|
123
|
+
})).rejects.toThrow(KeezError_1.KeezAuthError);
|
|
124
|
+
});
|
|
125
|
+
it('should handle network error in apiCancelInvoice', async () => {
|
|
126
|
+
nock(baseDomain)
|
|
127
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/canceled`)
|
|
128
|
+
.replyWithError('Connection refused');
|
|
129
|
+
await expect((0, cancel_1.apiCancelInvoice)({
|
|
130
|
+
baseDomain,
|
|
131
|
+
appId: 'test-app-id',
|
|
132
|
+
appClientId: clientEid,
|
|
133
|
+
bearerToken: 'test-token',
|
|
134
|
+
invoiceId: 'inv-123',
|
|
135
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
136
|
+
});
|
|
137
|
+
it('should handle network error in apiDeleteInvoice', async () => {
|
|
138
|
+
nock(baseDomain)
|
|
139
|
+
.delete(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
140
|
+
.replyWithError('Connection timeout');
|
|
141
|
+
await expect((0, delete_1.apiDeleteInvoice)({
|
|
142
|
+
baseDomain,
|
|
143
|
+
appId: 'test-app-id',
|
|
144
|
+
appClientId: clientEid,
|
|
145
|
+
bearerToken: 'test-token',
|
|
146
|
+
invoiceId: 'inv-123',
|
|
147
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
148
|
+
});
|
|
149
|
+
it('should handle network error in apiDownloadInvoicePdf', async () => {
|
|
150
|
+
nock(baseDomain)
|
|
151
|
+
.get('/api/v1.0/public-api/invoices/inv-123/pdf')
|
|
152
|
+
.replyWithError('DNS resolution failed');
|
|
153
|
+
await expect((0, downloadPdf_1.apiDownloadInvoicePdf)({
|
|
154
|
+
baseDomain,
|
|
155
|
+
appId: 'test-app-id',
|
|
156
|
+
bearerToken: 'test-token',
|
|
157
|
+
invoiceId: 'inv-123',
|
|
158
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
159
|
+
});
|
|
160
|
+
it('should handle network error in apiUpdateInvoice', async () => {
|
|
161
|
+
nock(baseDomain)
|
|
162
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
163
|
+
.replyWithError('Socket hang up');
|
|
164
|
+
await expect((0, update_1.apiUpdateInvoice)({
|
|
165
|
+
baseDomain,
|
|
166
|
+
appId: 'test-app-id',
|
|
167
|
+
appClientId: clientEid,
|
|
168
|
+
bearerToken: 'test-token',
|
|
169
|
+
invoiceId: 'inv-123',
|
|
170
|
+
invoice: {
|
|
171
|
+
series: 'INV',
|
|
172
|
+
documentDate: 20230101,
|
|
173
|
+
dueDate: 20230115,
|
|
174
|
+
currencyCode: 'RON',
|
|
175
|
+
paymentType: paymentType_1.PaymentType.BANK_TRANSFER,
|
|
176
|
+
partner: {
|
|
177
|
+
isLegalPerson: false,
|
|
178
|
+
partnerName: 'Test Partner',
|
|
179
|
+
identificationNumber: '123456',
|
|
180
|
+
countryCode: 'RO',
|
|
181
|
+
countryName: 'Romania',
|
|
182
|
+
countyCode: 'B',
|
|
183
|
+
countyName: 'Bucuresti',
|
|
184
|
+
cityName: 'Bucuresti',
|
|
185
|
+
addressDetails: 'Test Address',
|
|
186
|
+
},
|
|
187
|
+
items: [
|
|
188
|
+
{
|
|
189
|
+
itemExternalId: 'item-1',
|
|
190
|
+
measureUnitId: 1,
|
|
191
|
+
quantity: 1,
|
|
192
|
+
unitPrice: 100,
|
|
193
|
+
},
|
|
194
|
+
],
|
|
195
|
+
},
|
|
196
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
197
|
+
});
|
|
198
|
+
it('should handle network error in apiSubmitEfactura', async () => {
|
|
199
|
+
nock(baseDomain)
|
|
200
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
|
|
201
|
+
.replyWithError('ECONNRESET');
|
|
202
|
+
await expect((0, submitEfactura_1.apiSubmitEfactura)({
|
|
203
|
+
baseDomain,
|
|
204
|
+
appId: 'test-app-id',
|
|
205
|
+
appClientId: clientEid,
|
|
206
|
+
bearerToken: 'test-token',
|
|
207
|
+
invoiceId: 'inv-123',
|
|
208
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
209
|
+
});
|
|
210
|
+
it('should handle network error in apiValidateInvoice', async () => {
|
|
211
|
+
nock(baseDomain)
|
|
212
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/valid`)
|
|
213
|
+
.replyWithError('ETIMEDOUT');
|
|
214
|
+
await expect((0, validate_1.apiValidateInvoice)({
|
|
215
|
+
baseDomain,
|
|
216
|
+
appId: 'test-app-id',
|
|
217
|
+
appClientId: clientEid,
|
|
218
|
+
bearerToken: 'test-token',
|
|
219
|
+
invoiceId: 'inv-123',
|
|
220
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
221
|
+
});
|
|
222
|
+
it('should handle network error in apiGetInvoiceByExternalId', async () => {
|
|
223
|
+
nock(baseDomain)
|
|
224
|
+
.get(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
225
|
+
.replyWithError('ENOTFOUND');
|
|
226
|
+
await expect((0, view_1.apiGetInvoiceByExternalId)({
|
|
227
|
+
baseDomain,
|
|
228
|
+
appId: 'test-app-id',
|
|
229
|
+
appClientId: clientEid,
|
|
230
|
+
bearerToken: 'test-token',
|
|
231
|
+
invoiceId: 'inv-123',
|
|
232
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
233
|
+
});
|
|
234
|
+
it('should handle network error in apiGetAllInvoices', async () => {
|
|
235
|
+
nock(baseDomain)
|
|
236
|
+
.get(`/api/v1.0/public-api/${clientEid}/invoices`)
|
|
237
|
+
.replyWithError('EHOSTUNREACH');
|
|
238
|
+
await expect((0, getAll_1.apiGetAllInvoices)({
|
|
239
|
+
baseDomain,
|
|
240
|
+
appId: 'test-app-id',
|
|
241
|
+
appClientId: clientEid,
|
|
242
|
+
bearerToken: 'test-token',
|
|
243
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
244
|
+
});
|
|
245
|
+
it('should handle network error in apiSendInvoice', async () => {
|
|
246
|
+
nock(baseDomain)
|
|
247
|
+
.post('/api/v1.0/public-api/invoices/delivery')
|
|
248
|
+
.replyWithError('ECONNREFUSED');
|
|
249
|
+
await expect((0, sendMail_1.apiSendInvoice)({
|
|
250
|
+
baseDomain,
|
|
251
|
+
appId: 'test-app-id',
|
|
252
|
+
bearerToken: 'test-token',
|
|
253
|
+
clientMail: 'test@example.com',
|
|
254
|
+
invoiceId: 'inv-123',
|
|
255
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
256
|
+
});
|
|
257
|
+
it('should handle network error in apiCreateItem', async () => {
|
|
258
|
+
nock(baseDomain)
|
|
259
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
260
|
+
.replyWithError('Network Error');
|
|
261
|
+
await expect((0, create_1.apiCreateItem)({
|
|
262
|
+
baseDomain,
|
|
263
|
+
appId: 'test-app-id',
|
|
264
|
+
appClientId: clientEid,
|
|
265
|
+
bearerToken: 'test-token',
|
|
266
|
+
item: {
|
|
267
|
+
itemName: 'Test Item',
|
|
268
|
+
measureUnitId: measureUnit_1.MeasureUnit.PIECE,
|
|
269
|
+
unitPrice: 100,
|
|
270
|
+
vatPercent: 19,
|
|
271
|
+
},
|
|
272
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
273
|
+
});
|
|
274
|
+
it('should handle network error in apiGetAllItems', async () => {
|
|
275
|
+
nock(baseDomain)
|
|
276
|
+
.get(`/api/v1.0/public-api/${clientEid}/items`)
|
|
277
|
+
.replyWithError('Connection failed');
|
|
278
|
+
await expect((0, getAll_2.apiGetAllItems)({
|
|
279
|
+
baseDomain,
|
|
280
|
+
appId: 'test-app-id',
|
|
281
|
+
appClientId: clientEid,
|
|
282
|
+
bearerToken: 'test-token',
|
|
283
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
284
|
+
});
|
|
285
|
+
it('should handle network error in apiGetItemById', async () => {
|
|
286
|
+
nock(baseDomain)
|
|
287
|
+
.get(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
288
|
+
.replyWithError('Request timeout');
|
|
289
|
+
await expect((0, getById_1.apiGetItemById)({
|
|
290
|
+
baseDomain,
|
|
291
|
+
appId: 'test-app-id',
|
|
292
|
+
appClientId: clientEid,
|
|
293
|
+
bearerToken: 'test-token',
|
|
294
|
+
itemId: 'item-123',
|
|
295
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
296
|
+
});
|
|
297
|
+
it('should handle network error in apiUpdateItem', async () => {
|
|
298
|
+
nock(baseDomain)
|
|
299
|
+
.put(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
300
|
+
.replyWithError('Socket closed');
|
|
301
|
+
await expect((0, update_2.apiUpdateItem)({
|
|
302
|
+
baseDomain,
|
|
303
|
+
appId: 'test-app-id',
|
|
304
|
+
appClientId: clientEid,
|
|
305
|
+
bearerToken: 'test-token',
|
|
306
|
+
itemId: 'item-123',
|
|
307
|
+
item: {
|
|
308
|
+
itemName: 'Updated Item',
|
|
309
|
+
measureUnitId: measureUnit_1.MeasureUnit.PIECE,
|
|
310
|
+
unitPrice: 150,
|
|
311
|
+
vatPercent: 19,
|
|
312
|
+
},
|
|
313
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
314
|
+
});
|
|
315
|
+
it('should handle network error in apiPatchItem', async () => {
|
|
316
|
+
nock(baseDomain)
|
|
317
|
+
.patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
318
|
+
.replyWithError('Peer reset connection');
|
|
319
|
+
await expect((0, patch_1.apiPatchItem)({
|
|
320
|
+
baseDomain,
|
|
321
|
+
appId: 'test-app-id',
|
|
322
|
+
appClientId: clientEid,
|
|
323
|
+
bearerToken: 'test-token',
|
|
324
|
+
itemId: 'item-123',
|
|
325
|
+
item: {
|
|
326
|
+
unitPrice: 200,
|
|
327
|
+
},
|
|
328
|
+
})).rejects.toThrow(KeezError_1.KeezApiError);
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
describe('Logger branch coverage', () => {
|
|
332
|
+
it('should use debug log level when DEBUG env is set', async () => {
|
|
333
|
+
// This test is more for completeness - the logger branch is based on LOG_LEVEL env
|
|
334
|
+
nock(baseDomain)
|
|
335
|
+
.post('/idp/connect/token')
|
|
336
|
+
.reply(200, {
|
|
337
|
+
access_token: 'test-token',
|
|
338
|
+
expires_in: 3600,
|
|
339
|
+
token_type: 'Bearer',
|
|
340
|
+
scope: 'public-api',
|
|
341
|
+
});
|
|
342
|
+
const result = await (0, authorise_1.apiGenerateToken)({
|
|
343
|
+
baseDomain,
|
|
344
|
+
appId: 'test-app-id',
|
|
345
|
+
apiSecret: 'test-secret',
|
|
346
|
+
});
|
|
347
|
+
expect(result.access_token).toBe('test-token');
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkaXRpb25hbC1jb3ZlcmFnZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdHMvYWRkaXRpb25hbC1jb3ZlcmFnZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQThCO0FBQzlCLHVDQUFvQztBQUNwQywrQ0FBbUQ7QUFDbkQsa0RBQXlEO0FBQ3pELGtEQUF5RDtBQUN6RCw0REFBbUU7QUFDbkUsa0RBQXlEO0FBQ3pELGtFQUFrRTtBQUNsRSxzREFBNkQ7QUFDN0QsOENBQWdFO0FBQ2hFLGtEQUEwRDtBQUMxRCxzREFBeUQ7QUFDekQsK0NBQW1EO0FBQ25ELCtDQUFvRDtBQUNwRCxpREFBcUQ7QUFDckQsK0NBQW1EO0FBQ25ELDZDQUFpRDtBQUNqRCxzREFBbUQ7QUFDbkQsc0RBQW1EO0FBQ25ELGtEQUFpRTtBQUVqRSxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQztBQUM3QyxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztBQUVwQyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3ZDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1FBQzFELElBQUksT0FBZ0IsQ0FBQztRQUVyQixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1gsT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQztnQkFDbEIsY0FBYyxFQUFFLGFBQWE7Z0JBQzdCLFVBQVUsRUFBRSxTQUFTO2dCQUNyQixNQUFNLEVBQUUsYUFBYTtnQkFDckIsSUFBSSxFQUFFLEtBQUs7YUFDZCxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNYLElB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WSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgS2VlekFwaSB9IGZyb20gJ0Ava2VlekFwaSc7XG5pbXBvcnQgeyBhcGlHZW5lcmF0ZVRva2VuIH0gZnJvbSAnQC9hcGkvYXV0aG9yaXNlJztcbmltcG9ydCB7IGFwaUNhbmNlbEludm9pY2UgfSBmcm9tICdAL2FwaS9pbnZvaWNlcy9jYW5jZWwnO1xuaW1wb3J0IHsgYXBpRGVsZXRlSW52b2ljZSB9IGZyb20gJ0AvYXBpL2ludm9pY2VzL2RlbGV0ZSc7XG5pbXBvcnQgeyBhcGlEb3dubG9hZEludm9pY2VQZGYgfSBmcm9tICdAL2FwaS9pbnZvaWNlcy9kb3dubG9hZFBkZic7XG5pbXBvcnQgeyBhcGlVcGRhdGVJbnZvaWNlIH0gZnJvbSAnQC9hcGkvaW52b2ljZXMvdXBkYXRlJztcbmltcG9ydCB7IGFwaVN1Ym1pdEVmYWN0dXJhIH0gZnJvbSAnQC9hcGkvaW52b2ljZXMvc3VibWl0RWZhY3R1cmEnO1xuaW1wb3J0IHsgYXBpVmFsaWRhdGVJbnZvaWNlIH0gZnJvbSAnQC9hcGkvaW52b2ljZXMvdmFsaWRhdGUnO1xuaW1wb3J0IHsgYXBpR2V0SW52b2ljZUJ5RXh0ZXJuYWxJZCB9IGZyb20gJ0AvYXBpL2ludm9pY2VzL3ZpZXcnO1xuaW1wb3J0IHsgYXBpR2V0QWxsSW52b2ljZXMgfSBmcm9tICdAL2FwaS9pbnZvaWNlcy9nZXRBbGwnO1xuaW1wb3J0IHsgYXBpU2VuZEludm9pY2UgfSBmcm9tICdAL2FwaS9pbnZvaWNlcy9zZW5kTWFpbCc7XG5pbXBvcnQgeyBhcGlDcmVhdGVJdGVtIH0gZnJvbSAnQC9hcGkvaXRlbXMvY3JlYXRlJztcbmltcG9ydCB7IGFwaUdldEFsbEl0ZW1zIH0gZnJvbSAnQC9hcGkvaXRlbXMvZ2V0QWxsJztcbmltcG9ydCB7IGFwaUdldEl0ZW1CeUlkIH0gZnJvbSAnQC9hcGkvaXRlbXMvZ2V0QnlJZCc7XG5pbXBvcnQgeyBhcGlVcGRhdGVJdGVtIH0gZnJvbSAnQC9hcGkvaXRlbXMvdXBkYXRlJztcbmltcG9ydCB7IGFwaVBhdGNoSXRlbSB9IGZyb20gJ0AvYXBpL2l0ZW1zL3BhdGNoJztcbmltcG9ydCB7IFBheW1lbnRUeXBlIH0gZnJvbSAnQC9jb25maWcvcGF5bWVudFR5cGUnO1xuaW1wb3J0IHsgTWVhc3VyZVVuaXQgfSBmcm9tICdAL2NvbmZpZy9tZWFzdXJlVW5pdCc7XG5pbXBvcnQgeyBLZWV6QXV0aEVycm9yLCBLZWV6QXBpRXJyb3IgfSBmcm9tICdAL2Vycm9ycy9LZWV6RXJyb3InO1xuXG5jb25zdCBiYXNlRG9tYWluID0gJ2h0dHBzOi8vc3RhZ2luZy5rZWV6LnJvJztcbmNvbnN0IGNsaWVudEVpZCA9ICd0ZXN0LWNsaWVudC1laWQnO1xuXG5kZXNjcmliZSgnQWRkaXRpb25hbCBDb3ZlcmFnZSBUZXN0cycsICgpID0+IHtcbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnS2VlekFwaSBnZXRJbnZvaWNlQnlFeHRlcm5hbElkIHRocm91Z2ggY2xhc3MnLCAoKSA9PiB7XG4gICAgICAgIGxldCBrZWV6QXBpOiBLZWV6QXBpO1xuXG4gICAgICAgIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgICAgICAgICBrZWV6QXBpID0gbmV3IEtlZXpBcGkoe1xuICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgIGNsaWVudF9laWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICBzZWNyZXQ6ICd0ZXN0LXNlY3JldCcsXG4gICAgICAgICAgICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBnZXQgaW52b2ljZSBieSBleHRlcm5hbCBJRCB0aHJvdWdoIEtlZXpBcGkgY2xhc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoJy9pZHAvY29ubmVjdC90b2tlbicpXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgZXhwaXJlc19pbjogMzYwMCxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogJ0JlYXJlcicsXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiAncHVibGljLWFwaScsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vY2tJbnZvaWNlID0ge1xuICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZTogJ1JPTicsXG4gICAgICAgICAgICAgICAgZGlzY291bnRHcm9zc1ZhbHVlOiAwLFxuICAgICAgICAgICAgICAgIGRpc2NvdW50TmV0VmFsdWU6IDAsXG4gICAgICAgICAgICAgICAgZGlzY291bnRWYXRWYWx1ZTogMCxcbiAgICAgICAgICAgICAgICBkaXNjb3VudFZhbHVlT25OZXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGV4Y2lzZUFtb3VudDogMCxcbiAgICAgICAgICAgICAgICBkb2N1bWVudERhdGU6IDIwMjMwNDIzLFxuICAgICAgICAgICAgICAgIGR1ZURhdGU6IDIwMjMwNDMwLFxuICAgICAgICAgICAgICAgIGV4Y2hhbmdlUmF0ZTogMSxcbiAgICAgICAgICAgICAgICBncm9zc0Ftb3VudDogMTE5LFxuICAgICAgICAgICAgICAgIG5ldEFtb3VudDogMTAwLFxuICAgICAgICAgICAgICAgIG51bWJlcjogMSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE5ldEFtb3VudDogMTAwLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmF0QW1vdW50OiAxOSxcbiAgICAgICAgICAgICAgICBwYXJ0bmVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NEZXRhaWxzOiAnVGVzdCBBZGRyZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgY2l0eU5hbWU6ICdCdWNoYXJlc3QnLFxuICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogJ1JPJyxcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeU5hbWU6ICdSb21hbmlhJyxcbiAgICAgICAgICAgICAgICAgICAgY291bnR5Q29kZTogJ1JPLkInLFxuICAgICAgICAgICAgICAgICAgICBjb3VudHlOYW1lOiAnQnVjaGFyZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmljYXRpb25OdW1iZXI6ICcxMjM0NTY3OCcsXG4gICAgICAgICAgICAgICAgICAgIGlzTGVnYWxQZXJzb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnZvaWNlRGV0YWlsczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudEdyb3NzVmFsdWU6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE5ldFZhbHVlOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRWYXRWYWx1ZTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50VmFsdWVPbk5ldDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBncm9zc0Ftb3VudDogMTE5LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNvZGU6ICdJVEVNLTAwMScsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtRGVzY3JpcHRpb246ICdUZXN0IEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUV4dGVybmFsSWQ6ICdpdGVtLWV4dC0xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVGVzdCBJdGVtIE5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldEFtb3VudDogMTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOZXRBbW91bnQ6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmF0QW1vdW50OiAxOSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5NZWFzdXJlVW5pdDogJ2J1YycsXG4gICAgICAgICAgICAgICAgICAgICAgICB1blZhdENhdGVnb3J5OiAnUycsXG4gICAgICAgICAgICAgICAgICAgICAgICB1blZhdEV4ZW1wdGlvblJlYXNvbjogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdEFtb3VudDogMTksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2lzZUFtb3VudDogMCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHBheW1lbnRUeXBlSWQ6IDMsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlQ3VycmVuY3lDb2RlOiAnUk9OJyxcbiAgICAgICAgICAgICAgICBzZXJpZXM6ICdQREknLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2RyYWZ0JyxcbiAgICAgICAgICAgICAgICB2YXRBbW91bnQ6IDE5LFxuICAgICAgICAgICAgICAgIHZhdE9uQ29sbGVjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJbnZvaWNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRJbnZvaWNlQnlFeHRlcm5hbElkKCdpbnYtMTIzJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0Lmdyb3NzQW1vdW50KS50b0JlKDExOSk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0LnBhcnRuZXIucGFydG5lck5hbWUpLnRvQmUoJ1Rlc3QgUGFydG5lcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdOZXR3b3JrIEVycm9yIEhhbmRsaW5nIChheGlvc0Vycm9yLm1lc3NhZ2UgZmFsbGJhY2spJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZXR3b3JrIGVycm9yIGluIGFwaUdlbmVyYXRlVG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoJy9pZHAvY29ubmVjdC90b2tlbicpXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdOZXR3b3JrIEVycm9yJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlHZW5lcmF0ZVRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZURvbWFpbixcbiAgICAgICAgICAgICAgICAgICAgYXBwSWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgICAgIGFwaVNlY3JldDogJ3Rlc3Qtc2VjcmV0JyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekF1dGhFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG5ldHdvcmsgZXJyb3IgaW4gYXBpQ2FuY2VsSW52b2ljZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2NhbmNlbGVkYClcbiAgICAgICAgICAgICAgICAucmVwbHlXaXRoRXJyb3IoJ0Nvbm5lY3Rpb24gcmVmdXNlZCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpQ2FuY2VsSW52b2ljZSh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6ICdpbnYtMTIzJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlEZWxldGVJbnZvaWNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5kZWxldGUoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdDb25uZWN0aW9uIHRpbWVvdXQnKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaURlbGV0ZUludm9pY2Uoe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2ljZUlkOiAnaW52LTEyMycsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG5ldHdvcmsgZXJyb3IgaW4gYXBpRG93bmxvYWRJbnZvaWNlUGRmJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoJy9hcGkvdjEuMC9wdWJsaWMtYXBpL2ludm9pY2VzL2ludi0xMjMvcGRmJylcbiAgICAgICAgICAgICAgICAucmVwbHlXaXRoRXJyb3IoJ0ROUyByZXNvbHV0aW9uIGZhaWxlZCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpRG93bmxvYWRJbnZvaWNlUGRmKHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZURvbWFpbixcbiAgICAgICAgICAgICAgICAgICAgYXBwSWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgICAgIGJlYXJlclRva2VuOiAndGVzdC10b2tlbicsXG4gICAgICAgICAgICAgICAgICAgIGludm9pY2VJZDogJ2ludi0xMjMnLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZXR3b3JrIGVycm9yIGluIGFwaVVwZGF0ZUludm9pY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignU29ja2V0IGhhbmcgdXAnKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaVVwZGF0ZUludm9pY2Uoe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2ljZUlkOiAnaW52LTEyMycsXG4gICAgICAgICAgICAgICAgICAgIGludm9pY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllczogJ0lOVicsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudERhdGU6IDIwMjMwMTAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZTogMjAyMzAxMTUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU6ICdST04nLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bWVudFR5cGU6IFBheW1lbnRUeXBlLkJBTktfVFJBTlNGRVIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMZWdhbFBlcnNvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lck5hbWU6ICdUZXN0IFBhcnRuZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpY2F0aW9uTnVtYmVyOiAnMTIzNDU2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogJ1JPJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5TmFtZTogJ1JvbWFuaWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eUNvZGU6ICdCJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHlOYW1lOiAnQnVjdXJlc3RpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXR5TmFtZTogJ0J1Y3VyZXN0aScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc0RldGFpbHM6ICdUZXN0IEFkZHJlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtRXh0ZXJuYWxJZDogJ2l0ZW0tMScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlTdWJtaXRFZmFjdHVyYScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2VmYWN0dXJhL3N1Ym1pdHRlZGApXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdFQ09OTlJFU0VUJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlTdWJtaXRFZmFjdHVyYSh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6ICdpbnYtMTIzJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlWYWxpZGF0ZUludm9pY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy92YWxpZGApXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdFVElNRURPVVQnKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaVZhbGlkYXRlSW52b2ljZSh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6ICdpbnYtMTIzJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlHZXRJbnZvaWNlQnlFeHRlcm5hbElkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9pbnYtMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHlXaXRoRXJyb3IoJ0VOT1RGT1VORCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpR2V0SW52b2ljZUJ5RXh0ZXJuYWxJZCh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6ICdpbnYtMTIzJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlHZXRBbGxJbnZvaWNlcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignRUhPU1RVTlJFQUNIJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlHZXRBbGxJbnZvaWNlcyh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZXR3b3JrIGVycm9yIGluIGFwaVNlbmRJbnZvaWNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wb3N0KCcvYXBpL3YxLjAvcHVibGljLWFwaS9pbnZvaWNlcy9kZWxpdmVyeScpXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdFQ09OTlJFRlVTRUQnKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaVNlbmRJbnZvaWNlKHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZURvbWFpbixcbiAgICAgICAgICAgICAgICAgICAgYXBwSWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgICAgIGJlYXJlclRva2VuOiAndGVzdC10b2tlbicsXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudE1haWw6ICd0ZXN0QGV4YW1wbGUuY29tJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2ljZUlkOiAnaW52LTEyMycsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG5ldHdvcmsgZXJyb3IgaW4gYXBpQ3JlYXRlSXRlbScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zYClcbiAgICAgICAgICAgICAgICAucmVwbHlXaXRoRXJyb3IoJ05ldHdvcmsgRXJyb3InKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaUNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdUZXN0IEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZXR3b3JrIGVycm9yIGluIGFwaUdldEFsbEl0ZW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdDb25uZWN0aW9uIGZhaWxlZCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpR2V0QWxsSXRlbXMoe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlHZXRJdGVtQnlJZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignUmVxdWVzdCB0aW1lb3V0Jyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlHZXRJdGVtQnlJZCh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6ICdpdGVtLTEyMycsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG5ldHdvcmsgZXJyb3IgaW4gYXBpVXBkYXRlSXRlbScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucHV0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignU29ja2V0IGNsb3NlZCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpVXBkYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6ICdpdGVtLTEyMycsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVXBkYXRlZCBJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LlBJRUNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxNTAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlQYXRjaEl0ZW0nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBhdGNoKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignUGVlciByZXNldCBjb25uZWN0aW9uJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlQYXRjaEl0ZW0oe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiAnaXRlbS0xMjMnLFxuICAgICAgICAgICAgICAgICAgICBpdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnTG9nZ2VyIGJyYW5jaCBjb3ZlcmFnZScsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCB1c2UgZGVidWcgbG9nIGxldmVsIHdoZW4gREVCVUcgZW52IGlzIHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBpcyBtb3JlIGZvciBjb21wbGV0ZW5lc3MgLSB0aGUgbG9nZ2VyIGJyYW5jaCBpcyBiYXNlZCBvbiBMT0dfTEVWRUwgZW52XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoJy9pZHAvY29ubmVjdC90b2tlbicpXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgZXhwaXJlc19pbjogMzYwMCxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogJ0JlYXJlcicsXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiAncHVibGljLWFwaScsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaUdlbmVyYXRlVG9rZW4oe1xuICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgYXBwSWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgYXBpU2VjcmV0OiAndGVzdC1zZWNyZXQnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuYWNjZXNzX3Rva2VuKS50b0JlKCd0ZXN0LXRva2VuJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iXX0=
|