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.
Files changed (111) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +366 -0
  3. package/dist/coverage/lcov-report/block-navigation.js +71 -0
  4. package/dist/coverage/lcov-report/prettify.js +478 -0
  5. package/dist/coverage/lcov-report/sorter.js +177 -0
  6. package/dist/eslint.config.js +56 -0
  7. package/dist/jest.config.cjs +13 -0
  8. package/dist/jest.config.js +13 -0
  9. package/dist/src/api/__tests__/index.test.js +52 -0
  10. package/dist/src/api/authorise.js +48 -0
  11. package/dist/src/api/invoices/cancel.js +33 -0
  12. package/dist/src/api/invoices/create.js +97 -0
  13. package/dist/src/api/invoices/delete.js +33 -0
  14. package/dist/src/api/invoices/downloadPdf.js +31 -0
  15. package/dist/src/api/invoices/getAll.js +84 -0
  16. package/dist/src/api/invoices/sendMail.js +59 -0
  17. package/dist/src/api/invoices/submitEfactura.js +34 -0
  18. package/dist/src/api/invoices/update.js +61 -0
  19. package/dist/src/api/invoices/validate.js +39 -0
  20. package/dist/src/api/invoices/view.js +93 -0
  21. package/dist/src/api/items/create.js +42 -0
  22. package/dist/src/api/items/getAll.js +74 -0
  23. package/dist/src/api/items/getById.js +46 -0
  24. package/dist/src/api/items/index.js +14 -0
  25. package/dist/src/api/items/patch.js +49 -0
  26. package/dist/src/api/items/update.js +41 -0
  27. package/dist/src/config/constants.js +23 -0
  28. package/dist/src/config/constructorParam.js +3 -0
  29. package/dist/src/config/measureUnit.js +22 -0
  30. package/dist/src/config/paymentType.js +17 -0
  31. package/dist/src/config/paymentType.js.js +16 -0
  32. package/dist/src/dto/allInvoicesResponse.js +3 -0
  33. package/dist/src/dto/authResponse.js +3 -0
  34. package/dist/src/dto/common/index.js +3 -0
  35. package/dist/src/dto/common/paginationParams.js +3 -0
  36. package/dist/src/dto/createInvoiceRequest.js +3 -0
  37. package/dist/src/dto/invoiceResponse.js +3 -0
  38. package/dist/src/dto/invoices/index.js +3 -0
  39. package/dist/src/dto/invoices/invoiceFilterParams.js +3 -0
  40. package/dist/src/dto/invoices/invoiceRequestV2.js +3 -0
  41. package/dist/src/dto/invoices/sendInvoiceParams.js +3 -0
  42. package/dist/src/dto/items/allItemsResponse.js +3 -0
  43. package/dist/src/dto/items/index.js +3 -0
  44. package/dist/src/dto/items/itemRequest.js +3 -0
  45. package/dist/src/dto/items/itemResponse.js +3 -0
  46. package/dist/src/errors/KeezError.js +27 -0
  47. package/dist/src/helpers/logger.js +15 -0
  48. package/dist/src/index.js +15 -0
  49. package/dist/src/keezApi.js +283 -0
  50. package/dist/tests/additional-coverage.test.js +351 -0
  51. package/dist/tests/edge-cases.test.js +353 -0
  52. package/dist/tests/error-handling.test.js +224 -0
  53. package/dist/tests/filter-params.test.js +267 -0
  54. package/dist/tests/index.test.js +493 -0
  55. package/dist/tests/invoices-extended.test.js +168 -0
  56. package/dist/tests/items.test.js +142 -0
  57. package/dist/types/coverage/lcov-report/block-navigation.d.ts +1 -0
  58. package/dist/types/coverage/lcov-report/prettify.d.ts +0 -0
  59. package/dist/types/coverage/lcov-report/sorter.d.ts +1 -0
  60. package/dist/types/eslint.config.d.ts +2 -0
  61. package/dist/types/jest.config.d.cts +9 -0
  62. package/dist/types/jest.config.d.ts +9 -0
  63. package/dist/types/src/api/__tests__/index.test.d.ts +1 -0
  64. package/dist/types/src/api/authorise.d.ts +18 -0
  65. package/dist/types/src/api/invoices/cancel.d.ts +9 -0
  66. package/dist/types/src/api/invoices/create.d.ts +22 -0
  67. package/dist/types/src/api/invoices/delete.d.ts +9 -0
  68. package/dist/types/src/api/invoices/downloadPdf.d.ts +8 -0
  69. package/dist/types/src/api/invoices/getAll.d.ts +22 -0
  70. package/dist/types/src/api/invoices/sendMail.d.ts +24 -0
  71. package/dist/types/src/api/invoices/submitEfactura.d.ts +9 -0
  72. package/dist/types/src/api/invoices/update.d.ts +11 -0
  73. package/dist/types/src/api/invoices/validate.d.ts +21 -0
  74. package/dist/types/src/api/invoices/view.d.ts +22 -0
  75. package/dist/types/src/api/items/create.d.ts +10 -0
  76. package/dist/types/src/api/items/getAll.d.ts +10 -0
  77. package/dist/types/src/api/items/getById.d.ts +10 -0
  78. package/dist/types/src/api/items/index.d.ts +5 -0
  79. package/dist/types/src/api/items/patch.d.ts +11 -0
  80. package/dist/types/src/api/items/update.d.ts +11 -0
  81. package/dist/types/src/config/constants.d.ts +13 -0
  82. package/dist/types/src/config/constructorParam.d.ts +6 -0
  83. package/dist/types/src/config/measureUnit.d.ts +17 -0
  84. package/dist/types/src/config/paymentType.d.ts +12 -0
  85. package/dist/types/src/config/paymentType.js.d.ts +11 -0
  86. package/dist/types/src/dto/allInvoicesResponse.d.ts +21 -0
  87. package/dist/types/src/dto/authResponse.d.ts +7 -0
  88. package/dist/types/src/dto/common/index.d.ts +1 -0
  89. package/dist/types/src/dto/common/paginationParams.d.ts +4 -0
  90. package/dist/types/src/dto/createInvoiceRequest.d.ts +34 -0
  91. package/dist/types/src/dto/invoiceResponse.d.ts +48 -0
  92. package/dist/types/src/dto/invoices/index.d.ts +3 -0
  93. package/dist/types/src/dto/invoices/invoiceFilterParams.d.ts +8 -0
  94. package/dist/types/src/dto/invoices/invoiceRequestV2.d.ts +23 -0
  95. package/dist/types/src/dto/invoices/sendInvoiceParams.d.ts +5 -0
  96. package/dist/types/src/dto/items/allItemsResponse.d.ts +13 -0
  97. package/dist/types/src/dto/items/index.d.ts +3 -0
  98. package/dist/types/src/dto/items/itemRequest.d.ts +34 -0
  99. package/dist/types/src/dto/items/itemResponse.d.ts +15 -0
  100. package/dist/types/src/errors/KeezError.d.ts +11 -0
  101. package/dist/types/src/helpers/logger.d.ts +2 -0
  102. package/dist/types/src/index.d.ts +11 -0
  103. package/dist/types/src/keezApi.d.ts +114 -0
  104. package/dist/types/tests/additional-coverage.test.d.ts +1 -0
  105. package/dist/types/tests/edge-cases.test.d.ts +1 -0
  106. package/dist/types/tests/error-handling.test.d.ts +1 -0
  107. package/dist/types/tests/filter-params.test.d.ts +1 -0
  108. package/dist/types/tests/index.test.d.ts +1 -0
  109. package/dist/types/tests/invoices-extended.test.d.ts +1 -0
  110. package/dist/types/tests/items.test.d.ts +1 -0
  111. package/package.json +66 -0
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const nock = require("nock");
4
+ const keezApi_1 = require("../src/keezApi");
5
+ const paymentType_1 = require("../src/config/paymentType");
6
+ const measureUnit_1 = require("../src/config/measureUnit");
7
+ const KeezError_1 = require("../src/errors/KeezError");
8
+ describe('Error Handling Tests', () => {
9
+ let keezApi;
10
+ const baseDomain = 'https://staging.keez.ro';
11
+ const clientEid = 'test-client-eid';
12
+ beforeAll(() => {
13
+ keezApi = new keezApi_1.KeezApi({
14
+ application_id: 'test-app-id',
15
+ client_eid: clientEid,
16
+ secret: 'test-secret',
17
+ live: false,
18
+ });
19
+ });
20
+ beforeEach(() => {
21
+ nock(baseDomain)
22
+ .post('/idp/connect/token')
23
+ .reply(200, {
24
+ access_token: 'test-token',
25
+ expires_in: 3600,
26
+ token_type: 'Bearer',
27
+ scope: 'public-api',
28
+ });
29
+ });
30
+ afterEach(() => {
31
+ nock.cleanAll();
32
+ });
33
+ describe('Invoice Error Handling', () => {
34
+ describe('cancelInvoice', () => {
35
+ it('should throw KeezApiError when cancel fails', async () => {
36
+ nock(baseDomain)
37
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/canceled`)
38
+ .reply(400, { Message: 'Invoice cannot be canceled' });
39
+ await expect(keezApi.cancelInvoice('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
40
+ });
41
+ it('should throw KeezApiError on server error during cancel', async () => {
42
+ nock(baseDomain)
43
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/canceled`)
44
+ .reply(500, { error: 'Internal Server Error' });
45
+ await expect(keezApi.cancelInvoice('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
46
+ });
47
+ });
48
+ describe('deleteInvoice', () => {
49
+ it('should throw KeezApiError when delete fails', async () => {
50
+ nock(baseDomain)
51
+ .delete(`/api/v1.0/public-api/${clientEid}/invoices`)
52
+ .reply(400, { Message: 'Invoice cannot be deleted' });
53
+ await expect(keezApi.deleteInvoice('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
54
+ });
55
+ it('should throw KeezApiError when invoice not found for delete', async () => {
56
+ nock(baseDomain)
57
+ .delete(`/api/v1.0/public-api/${clientEid}/invoices`)
58
+ .reply(404, { error: 'Invoice not found' });
59
+ await expect(keezApi.deleteInvoice('non-existent')).rejects.toThrow(KeezError_1.KeezApiError);
60
+ });
61
+ });
62
+ describe('downloadInvoicePdf', () => {
63
+ it('should throw KeezApiError when PDF download fails', async () => {
64
+ nock(baseDomain)
65
+ .get('/api/v1.0/public-api/invoices/inv-123/pdf')
66
+ .reply(404, { error: 'Invoice not found' });
67
+ await expect(keezApi.downloadInvoicePdf('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
68
+ });
69
+ it('should throw KeezApiError on server error during PDF download', async () => {
70
+ nock(baseDomain)
71
+ .get('/api/v1.0/public-api/invoices/inv-123/pdf')
72
+ .reply(500, { error: 'PDF generation failed' });
73
+ await expect(keezApi.downloadInvoicePdf('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
74
+ });
75
+ });
76
+ describe('updateInvoice', () => {
77
+ const invoiceData = {
78
+ series: 'INV',
79
+ documentDate: 20230101,
80
+ dueDate: 20230115,
81
+ currencyCode: 'RON',
82
+ paymentType: paymentType_1.PaymentType.BANK_TRANSFER,
83
+ partner: {
84
+ isLegalPerson: false,
85
+ partnerName: 'Test Partner',
86
+ identificationNumber: '123456',
87
+ countryCode: 'RO',
88
+ countryName: 'Romania',
89
+ countyCode: 'B',
90
+ countyName: 'Bucuresti',
91
+ cityName: 'Bucuresti',
92
+ addressDetails: 'Test Address',
93
+ },
94
+ items: [
95
+ {
96
+ itemExternalId: 'item-1',
97
+ measureUnitId: 1,
98
+ quantity: 2,
99
+ unitPrice: 100,
100
+ },
101
+ ],
102
+ };
103
+ it('should throw KeezApiError when update fails', async () => {
104
+ nock(baseDomain)
105
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
106
+ .reply(400, { Message: 'Invalid invoice data' });
107
+ await expect(keezApi.updateInvoice('inv-123', invoiceData)).rejects.toThrow(KeezError_1.KeezApiError);
108
+ });
109
+ it('should throw KeezApiError when invoice not found for update', async () => {
110
+ nock(baseDomain)
111
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/non-existent`)
112
+ .reply(404, { error: 'Invoice not found' });
113
+ await expect(keezApi.updateInvoice('non-existent', invoiceData)).rejects.toThrow(KeezError_1.KeezApiError);
114
+ });
115
+ });
116
+ describe('submitInvoiceToEfactura', () => {
117
+ it('should throw KeezApiError when submission fails', async () => {
118
+ nock(baseDomain)
119
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
120
+ .reply(400, { Message: 'Invoice not validated' });
121
+ await expect(keezApi.submitInvoiceToEfactura('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
122
+ });
123
+ it('should throw KeezApiError on server error during submission', async () => {
124
+ nock(baseDomain)
125
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
126
+ .reply(500, { error: 'eFactura service unavailable' });
127
+ await expect(keezApi.submitInvoiceToEfactura('inv-123')).rejects.toThrow(KeezError_1.KeezApiError);
128
+ });
129
+ });
130
+ });
131
+ describe('Item Error Handling', () => {
132
+ describe('createItem', () => {
133
+ it('should throw KeezApiError when create fails', async () => {
134
+ nock(baseDomain)
135
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
136
+ .reply(400, { Message: 'Invalid item data' });
137
+ await expect(keezApi.createItem({
138
+ itemName: 'Test Item',
139
+ measureUnitId: measureUnit_1.MeasureUnit.PIECE,
140
+ unitPrice: 100,
141
+ vatPercent: 19,
142
+ })).rejects.toThrow(KeezError_1.KeezApiError);
143
+ });
144
+ it('should throw KeezApiError on server error during create', async () => {
145
+ nock(baseDomain)
146
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
147
+ .reply(500, { error: 'Internal Server Error' });
148
+ await expect(keezApi.createItem({
149
+ itemName: 'Test Item',
150
+ measureUnitId: measureUnit_1.MeasureUnit.PIECE,
151
+ unitPrice: 100,
152
+ vatPercent: 19,
153
+ })).rejects.toThrow(KeezError_1.KeezApiError);
154
+ });
155
+ });
156
+ describe('getAllItems', () => {
157
+ it('should throw KeezApiError when fetch fails', async () => {
158
+ nock(baseDomain)
159
+ .get(`/api/v1.0/public-api/${clientEid}/items`)
160
+ .reply(500, { error: 'Internal Server Error' });
161
+ await expect(keezApi.getAllItems()).rejects.toThrow(KeezError_1.KeezApiError);
162
+ });
163
+ it('should throw KeezApiError on unauthorized access', async () => {
164
+ nock(baseDomain)
165
+ .get(`/api/v1.0/public-api/${clientEid}/items`)
166
+ .reply(401, { error: 'Unauthorized' });
167
+ await expect(keezApi.getAllItems()).rejects.toThrow(KeezError_1.KeezApiError);
168
+ });
169
+ });
170
+ describe('getItemByExternalId', () => {
171
+ it('should throw KeezApiError when item not found', async () => {
172
+ nock(baseDomain)
173
+ .get(`/api/v1.0/public-api/${clientEid}/items/non-existent`)
174
+ .reply(404, { error: 'Item not found' });
175
+ await expect(keezApi.getItemByExternalId('non-existent')).rejects.toThrow(KeezError_1.KeezApiError);
176
+ });
177
+ it('should throw KeezApiError on server error', async () => {
178
+ nock(baseDomain)
179
+ .get(`/api/v1.0/public-api/${clientEid}/items/item-123`)
180
+ .reply(500, { error: 'Internal Server Error' });
181
+ await expect(keezApi.getItemByExternalId('item-123')).rejects.toThrow(KeezError_1.KeezApiError);
182
+ });
183
+ });
184
+ describe('updateItem', () => {
185
+ it('should throw KeezApiError when update fails', async () => {
186
+ nock(baseDomain)
187
+ .put(`/api/v1.0/public-api/${clientEid}/items/item-123`)
188
+ .reply(400, { Message: 'Invalid item data' });
189
+ await expect(keezApi.updateItem('item-123', {
190
+ itemName: 'Updated Item',
191
+ measureUnitId: measureUnit_1.MeasureUnit.PIECE,
192
+ unitPrice: 150,
193
+ vatPercent: 19,
194
+ })).rejects.toThrow(KeezError_1.KeezApiError);
195
+ });
196
+ it('should throw KeezApiError when item not found for update', async () => {
197
+ nock(baseDomain)
198
+ .put(`/api/v1.0/public-api/${clientEid}/items/non-existent`)
199
+ .reply(404, { error: 'Item not found' });
200
+ await expect(keezApi.updateItem('non-existent', {
201
+ itemName: 'Updated Item',
202
+ measureUnitId: measureUnit_1.MeasureUnit.PIECE,
203
+ unitPrice: 150,
204
+ vatPercent: 19,
205
+ })).rejects.toThrow(KeezError_1.KeezApiError);
206
+ });
207
+ });
208
+ describe('patchItem', () => {
209
+ it('should throw KeezApiError when patch fails', async () => {
210
+ nock(baseDomain)
211
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
212
+ .reply(400, { Message: 'Invalid patch data' });
213
+ await expect(keezApi.patchItem('item-123', { unitPrice: -100 })).rejects.toThrow(KeezError_1.KeezApiError);
214
+ });
215
+ it('should throw KeezApiError when item not found for patch', async () => {
216
+ nock(baseDomain)
217
+ .patch(`/api/v1.0/public-api/${clientEid}/items/non-existent`)
218
+ .reply(404, { error: 'Item not found' });
219
+ await expect(keezApi.patchItem('non-existent', { unitPrice: 100 })).rejects.toThrow(KeezError_1.KeezApiError);
220
+ });
221
+ });
222
+ });
223
+ });
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItaGFuZGxpbmcudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3RzL2Vycm9yLWhhbmRsaW5nLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBOEI7QUFDOUIsdUNBQW9DO0FBQ3BDLHNEQUFtRDtBQUNuRCxzREFBbUQ7QUFDbkQsa0RBQWtEO0FBRWxELFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxPQUFnQixDQUFDO0lBQ3JCLE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDO0lBQzdDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBRXBDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1lBQ2xCLGNBQWMsRUFBRSxhQUFhO1lBQzdCLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLElBQUksRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNYLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzthQUMxQixLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ1IsWUFBWSxFQUFFLFlBQVk7WUFDMUIsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLFFBQVE7WUFDcEIsS0FBSyxFQUFFLFlBQVk7U0FDdEIsQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ1gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtRQUNwQyxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtZQUMzQixFQUFFLENBQUMsNkNBQTZDLEVBQUUs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QUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHdCQUFZLENBQUMsQ0FBQztZQUN0RyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgS2VlekFwaSB9IGZyb20gJ0Ava2VlekFwaSc7XG5pbXBvcnQgeyBQYXltZW50VHlwZSB9IGZyb20gJ0AvY29uZmlnL3BheW1lbnRUeXBlJztcbmltcG9ydCB7IE1lYXN1cmVVbml0IH0gZnJvbSAnQC9jb25maWcvbWVhc3VyZVVuaXQnO1xuaW1wb3J0IHsgS2VlekFwaUVycm9yIH0gZnJvbSAnQC9lcnJvcnMvS2VlekVycm9yJztcblxuZGVzY3JpYmUoJ0Vycm9yIEhhbmRsaW5nIFRlc3RzJywgKCkgPT4ge1xuICAgIGxldCBrZWV6QXBpOiBLZWV6QXBpO1xuICAgIGNvbnN0IGJhc2VEb21haW4gPSAnaHR0cHM6Ly9zdGFnaW5nLmtlZXoucm8nO1xuICAgIGNvbnN0IGNsaWVudEVpZCA9ICd0ZXN0LWNsaWVudC1laWQnO1xuXG4gICAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICAgICAga2VlekFwaSA9IG5ldyBLZWV6QXBpKHtcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgY2xpZW50X2VpZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgc2VjcmV0OiAndGVzdC1zZWNyZXQnLFxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgIC5wb3N0KCcvaWRwL2Nvbm5lY3QvdG9rZW4nKVxuICAgICAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgIGV4cGlyZXNfaW46IDM2MDAsXG4gICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogJ0JlYXJlcicsXG4gICAgICAgICAgICAgICAgc2NvcGU6ICdwdWJsaWMtYXBpJyxcbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0ludm9pY2UgRXJyb3IgSGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgICAgIGRlc2NyaWJlKCdjYW5jZWxJbnZvaWNlJywgKCkgPT4ge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igd2hlbiBjYW5jZWwgZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2NhbmNlbGVkYClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwMCwgeyBNZXNzYWdlOiAnSW52b2ljZSBjYW5ub3QgYmUgY2FuY2VsZWQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuY2FuY2VsSW52b2ljZSgnaW52LTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciBvbiBzZXJ2ZXIgZXJyb3IgZHVyaW5nIGNhbmNlbCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvY2FuY2VsZWRgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNTAwLCB7IGVycm9yOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLmNhbmNlbEludm9pY2UoJ2ludi0xMjMnKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2RlbGV0ZUludm9pY2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIGRlbGV0ZSBmYWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5kZWxldGUoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDAsIHsgTWVzc2FnZTogJ0ludm9pY2UgY2Fubm90IGJlIGRlbGV0ZWQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuZGVsZXRlSW52b2ljZSgnaW52LTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIGludm9pY2Ugbm90IGZvdW5kIGZvciBkZWxldGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXNgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNDA0LCB7IGVycm9yOiAnSW52b2ljZSBub3QgZm91bmQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuZGVsZXRlSW52b2ljZSgnbm9uLWV4aXN0ZW50JykpLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdkb3dubG9hZEludm9pY2VQZGYnLCAoKSA9PiB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIFBERiBkb3dubG9hZCBmYWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoJy9hcGkvdjEuMC9wdWJsaWMtYXBpL2ludm9pY2VzL2ludi0xMjMvcGRmJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwNCwgeyBlcnJvcjogJ0ludm9pY2Ugbm90IGZvdW5kJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLmRvd25sb2FkSW52b2ljZVBkZignaW52LTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciBvbiBzZXJ2ZXIgZXJyb3IgZHVyaW5nIFBERiBkb3dubG9hZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoJy9hcGkvdjEuMC9wdWJsaWMtYXBpL2ludm9pY2VzL2ludi0xMjMvcGRmJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDUwMCwgeyBlcnJvcjogJ1BERiBnZW5lcmF0aW9uIGZhaWxlZCcgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5kb3dubG9hZEludm9pY2VQZGYoJ2ludi0xMjMnKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3VwZGF0ZUludm9pY2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnZvaWNlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBzZXJpZXM6ICdJTlYnLFxuICAgICAgICAgICAgICAgIGRvY3VtZW50RGF0ZTogMjAyMzAxMDEsXG4gICAgICAgICAgICAgICAgZHVlRGF0ZTogMjAyMzAxMTUsXG4gICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlOiAnUk9OJyxcbiAgICAgICAgICAgICAgICBwYXltZW50VHlwZTogUGF5bWVudFR5cGUuQkFOS19UUkFOU0ZFUixcbiAgICAgICAgICAgICAgICBwYXJ0bmVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGlzTGVnYWxQZXJzb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpY2F0aW9uTnVtYmVyOiAnMTIzNDU2JyxcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGU6ICdSTycsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50cnlOYW1lOiAnUm9tYW5pYScsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50eUNvZGU6ICdCJyxcbiAgICAgICAgICAgICAgICAgICAgY291bnR5TmFtZTogJ0J1Y3VyZXN0aScsXG4gICAgICAgICAgICAgICAgICAgIGNpdHlOYW1lOiAnQnVjdXJlc3RpJyxcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzc0RldGFpbHM6ICdUZXN0IEFkZHJlc3MnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUV4dGVybmFsSWQ6ICdpdGVtLTEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gdXBkYXRlIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNDAwLCB7IE1lc3NhZ2U6ICdJbnZhbGlkIGludm9pY2UgZGF0YScgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS51cGRhdGVJbnZvaWNlKCdpbnYtMTIzJywgaW52b2ljZURhdGEpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIGludm9pY2Ugbm90IGZvdW5kIGZvciB1cGRhdGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgICAgICAucHV0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvbm9uLWV4aXN0ZW50YClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwNCwgeyBlcnJvcjogJ0ludm9pY2Ugbm90IGZvdW5kJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLnVwZGF0ZUludm9pY2UoJ25vbi1leGlzdGVudCcsIGludm9pY2VEYXRhKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3N1Ym1pdEludm9pY2VUb0VmYWN0dXJhJywgKCkgPT4ge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igd2hlbiBzdWJtaXNzaW9uIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9lZmFjdHVyYS9zdWJtaXR0ZWRgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNDAwLCB7IE1lc3NhZ2U6ICdJbnZvaWNlIG5vdCB2YWxpZGF0ZWQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuc3VibWl0SW52b2ljZVRvRWZhY3R1cmEoJ2ludi0xMjMnKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igb24gc2VydmVyIGVycm9yIGR1cmluZyBzdWJtaXNzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9lZmFjdHVyYS9zdWJtaXR0ZWRgKVxuICAgICAgICAgICAgICAgICAgICAucmVwbHkoNTAwLCB7IGVycm9yOiAnZUZhY3R1cmEgc2VydmljZSB1bmF2YWlsYWJsZScgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5zdWJtaXRJbnZvaWNlVG9FZmFjdHVyYSgnaW52LTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdJdGVtIEVycm9yIEhhbmRsaW5nJywgKCkgPT4ge1xuICAgICAgICBkZXNjcmliZSgnY3JlYXRlSXRlbScsICgpID0+IHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gY3JlYXRlIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDAsIHsgTWVzc2FnZTogJ0ludmFsaWQgaXRlbSBkYXRhJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICAgICAga2VlekFwaS5jcmVhdGVJdGVtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVGVzdCBJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LlBJRUNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIG9uIHNlcnZlciBlcnJvciBkdXJpbmcgY3JlYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg1MDAsIHsgZXJyb3I6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgICAgICBrZWV6QXBpLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdUZXN0IEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2dldEFsbEl0ZW1zJywgKCkgPT4ge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igd2hlbiBmZXRjaCBmYWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg1MDAsIHsgZXJyb3I6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuZ2V0QWxsSXRlbXMoKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igb24gdW5hdXRob3JpemVkIGFjY2VzcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDEsIHsgZXJyb3I6ICdVbmF1dGhvcml6ZWQnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkuZ2V0QWxsSXRlbXMoKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2dldEl0ZW1CeUV4dGVybmFsSWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IEtlZXpBcGlFcnJvciB3aGVuIGl0ZW0gbm90IGZvdW5kJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL25vbi1leGlzdGVudGApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDQsIHsgZXJyb3I6ICdJdGVtIG5vdCBmb3VuZCcgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5nZXRJdGVtQnlFeHRlcm5hbElkKCdub24tZXhpc3RlbnQnKSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igb24gc2VydmVyIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDUwMCwgeyBlcnJvcjogJ0ludGVybmFsIFNlcnZlciBFcnJvcicgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5nZXRJdGVtQnlFeHRlcm5hbElkKCdpdGVtLTEyMycpKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgndXBkYXRlSXRlbScsICgpID0+IHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gdXBkYXRlIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwMCwgeyBNZXNzYWdlOiAnSW52YWxpZCBpdGVtIGRhdGEnIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgICAgICBrZWV6QXBpLnVwZGF0ZUl0ZW0oJ2l0ZW0tMTIzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdVcGRhdGVkIEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDE1MCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBLZWV6QXBpRXJyb3Igd2hlbiBpdGVtIG5vdCBmb3VuZCBmb3IgdXBkYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL25vbi1leGlzdGVudGApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDQsIHsgZXJyb3I6ICdJdGVtIG5vdCBmb3VuZCcgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSXRlbSgnbm9uLWV4aXN0ZW50Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdVcGRhdGVkIEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDE1MCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3BhdGNoSXRlbScsICgpID0+IHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gcGF0Y2ggZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgICAgICAucGF0Y2goYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtcy9pdGVtLTEyM2ApXG4gICAgICAgICAgICAgICAgICAgIC5yZXBseSg0MDAsIHsgTWVzc2FnZTogJ0ludmFsaWQgcGF0Y2ggZGF0YScgfSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5wYXRjaEl0ZW0oJ2l0ZW0tMTIzJywgeyB1bml0UHJpY2U6IC0xMDAgfSkpLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgS2VlekFwaUVycm9yIHdoZW4gaXRlbSBub3QgZm91bmQgZm9yIHBhdGNoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAgICAgLnBhdGNoKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvbm9uLWV4aXN0ZW50YClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGx5KDQwNCwgeyBlcnJvcjogJ0l0ZW0gbm90IGZvdW5kJyB9KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLnBhdGNoSXRlbSgnbm9uLWV4aXN0ZW50JywgeyB1bml0UHJpY2U6IDEwMCB9KSkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const nock = require("nock");
4
+ const keezApi_1 = require("../src/keezApi");
5
+ const measureUnit_1 = require("../src/config/measureUnit");
6
+ describe('Filter Parameters Tests', () => {
7
+ let keezApi;
8
+ const baseDomain = 'https://staging.keez.ro';
9
+ const clientEid = 'test-client-eid';
10
+ beforeAll(() => {
11
+ keezApi = new keezApi_1.KeezApi({
12
+ application_id: 'test-app-id',
13
+ client_eid: clientEid,
14
+ secret: 'test-secret',
15
+ live: false,
16
+ });
17
+ });
18
+ beforeEach(() => {
19
+ nock(baseDomain)
20
+ .post('/idp/connect/token')
21
+ .reply(200, {
22
+ access_token: 'test-token',
23
+ expires_in: 3600,
24
+ token_type: 'Bearer',
25
+ scope: 'public-api',
26
+ });
27
+ });
28
+ afterEach(() => {
29
+ nock.cleanAll();
30
+ });
31
+ describe('Invoice Filter Parameters', () => {
32
+ const mockInvoicesResponse = {
33
+ first: 0,
34
+ last: 0,
35
+ recordsCount: 1,
36
+ data: [
37
+ {
38
+ externalId: 'inv-1',
39
+ series: 'INV',
40
+ number: 1,
41
+ documentDate: 20230101,
42
+ dueDate: 20230115,
43
+ status: 'VALIDATED',
44
+ clientName: 'Test Client',
45
+ partnerName: 'Test Partner',
46
+ currencyCode: 'RON',
47
+ referenceCurrencyCode: 'RON',
48
+ netAmount: 100,
49
+ vatAmount: 19,
50
+ grossAmount: 119,
51
+ },
52
+ ],
53
+ };
54
+ it('should filter invoices by fromDate', async () => {
55
+ nock(baseDomain)
56
+ .get(`/api/v1.0/public-api/${clientEid}/invoices`)
57
+ .query({ fromDate: '20230101' })
58
+ .reply(200, mockInvoicesResponse);
59
+ const result = await keezApi.getAllInvoices({ fromDate: 20230101 });
60
+ expect(result.data).toHaveLength(1);
61
+ });
62
+ it('should filter invoices by toDate', async () => {
63
+ nock(baseDomain)
64
+ .get(`/api/v1.0/public-api/${clientEid}/invoices`)
65
+ .query({ toDate: '20231231' })
66
+ .reply(200, mockInvoicesResponse);
67
+ const result = await keezApi.getAllInvoices({ toDate: 20231231 });
68
+ expect(result.data).toHaveLength(1);
69
+ });
70
+ it('should filter invoices by series', async () => {
71
+ nock(baseDomain)
72
+ .get(`/api/v1.0/public-api/${clientEid}/invoices`)
73
+ .query({ series: 'INV' })
74
+ .reply(200, mockInvoicesResponse);
75
+ const result = await keezApi.getAllInvoices({ series: 'INV' });
76
+ expect(result.data).toHaveLength(1);
77
+ });
78
+ it('should filter invoices by partnerName', async () => {
79
+ nock(baseDomain)
80
+ .get(`/api/v1.0/public-api/${clientEid}/invoices`)
81
+ .query({ partnerName: 'Test Partner' })
82
+ .reply(200, mockInvoicesResponse);
83
+ const result = await keezApi.getAllInvoices({ partnerName: 'Test Partner' });
84
+ expect(result.data).toHaveLength(1);
85
+ });
86
+ it('should filter invoices by date range', async () => {
87
+ nock(baseDomain)
88
+ .get(`/api/v1.0/public-api/${clientEid}/invoices`)
89
+ .query({ fromDate: '20230101', toDate: '20231231' })
90
+ .reply(200, mockInvoicesResponse);
91
+ const result = await keezApi.getAllInvoices({ fromDate: 20230101, toDate: 20231231 });
92
+ expect(result.data).toHaveLength(1);
93
+ });
94
+ it('should combine multiple invoice filters', async () => {
95
+ nock(baseDomain)
96
+ .get(`/api/v1.0/public-api/${clientEid}/invoices`)
97
+ .query({
98
+ status: 'VALIDATED',
99
+ series: 'INV',
100
+ partnerName: 'Test Partner',
101
+ fromDate: '20230101',
102
+ toDate: '20231231',
103
+ offset: '0',
104
+ count: '10',
105
+ })
106
+ .reply(200, mockInvoicesResponse);
107
+ const result = await keezApi.getAllInvoices({
108
+ status: 'VALIDATED',
109
+ series: 'INV',
110
+ partnerName: 'Test Partner',
111
+ fromDate: 20230101,
112
+ toDate: 20231231,
113
+ offset: 0,
114
+ count: 10,
115
+ });
116
+ expect(result.data).toHaveLength(1);
117
+ });
118
+ });
119
+ describe('Item Filter Parameters', () => {
120
+ const mockItemsResponse = {
121
+ first: 0,
122
+ last: 0,
123
+ recordsCount: 1,
124
+ data: [
125
+ {
126
+ externalId: 'item-1',
127
+ itemName: 'Test Item',
128
+ itemCode: 'TI001',
129
+ itemDescription: 'Test description',
130
+ measureUnitId: 1,
131
+ measureUnitName: 'Bucata',
132
+ unitPrice: 100,
133
+ vatPercent: 19,
134
+ vatCategoryCode: 'S',
135
+ vatExemptionReason: '',
136
+ isActive: true,
137
+ createdAt: 1700000000000,
138
+ updatedAt: 1700000000000,
139
+ },
140
+ ],
141
+ };
142
+ it('should filter items by itemName', async () => {
143
+ nock(baseDomain)
144
+ .get(`/api/v1.0/public-api/${clientEid}/items`)
145
+ .query({ itemName: 'Test Item' })
146
+ .reply(200, mockItemsResponse);
147
+ const result = await keezApi.getAllItems({ itemName: 'Test Item' });
148
+ expect(result.data).toHaveLength(1);
149
+ });
150
+ it('should filter items by itemCode', async () => {
151
+ nock(baseDomain)
152
+ .get(`/api/v1.0/public-api/${clientEid}/items`)
153
+ .query({ itemCode: 'TI001' })
154
+ .reply(200, mockItemsResponse);
155
+ const result = await keezApi.getAllItems({ itemCode: 'TI001' });
156
+ expect(result.data).toHaveLength(1);
157
+ });
158
+ it('should filter items by isActive', async () => {
159
+ nock(baseDomain)
160
+ .get(`/api/v1.0/public-api/${clientEid}/items`)
161
+ .query({ isActive: 'true' })
162
+ .reply(200, mockItemsResponse);
163
+ const result = await keezApi.getAllItems({ isActive: true });
164
+ expect(result.data).toHaveLength(1);
165
+ });
166
+ it('should filter inactive items', async () => {
167
+ const inactiveItemsResponse = {
168
+ ...mockItemsResponse,
169
+ data: [{ ...mockItemsResponse.data[0], isActive: false }],
170
+ };
171
+ nock(baseDomain)
172
+ .get(`/api/v1.0/public-api/${clientEid}/items`)
173
+ .query({ isActive: 'false' })
174
+ .reply(200, inactiveItemsResponse);
175
+ const result = await keezApi.getAllItems({ isActive: false });
176
+ expect(result.data).toHaveLength(1);
177
+ expect(result.data[0].isActive).toBe(false);
178
+ });
179
+ it('should combine multiple item filters', async () => {
180
+ nock(baseDomain)
181
+ .get(`/api/v1.0/public-api/${clientEid}/items`)
182
+ .query({
183
+ itemName: 'Test Item',
184
+ itemCode: 'TI001',
185
+ isActive: 'true',
186
+ offset: '0',
187
+ count: '10',
188
+ })
189
+ .reply(200, mockItemsResponse);
190
+ const result = await keezApi.getAllItems({
191
+ itemName: 'Test Item',
192
+ itemCode: 'TI001',
193
+ isActive: true,
194
+ offset: 0,
195
+ count: 10,
196
+ });
197
+ expect(result.data).toHaveLength(1);
198
+ });
199
+ });
200
+ describe('Patch Item with Multiple Fields', () => {
201
+ it('should patch item with all optional fields', async () => {
202
+ nock(baseDomain)
203
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
204
+ .reply(200);
205
+ await expect(keezApi.patchItem('item-123', {
206
+ itemName: 'Updated Name',
207
+ itemCode: 'NEW001',
208
+ itemDescription: 'Updated description',
209
+ measureUnitId: measureUnit_1.MeasureUnit.KILOGRAM,
210
+ unitPrice: 200,
211
+ vatPercent: 9,
212
+ vatCategoryCode: 'R',
213
+ vatExemptionReason: 'None',
214
+ isActive: false,
215
+ })).resolves.toBeUndefined();
216
+ });
217
+ it('should patch item with only itemName', async () => {
218
+ nock(baseDomain)
219
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
220
+ .reply(200);
221
+ await expect(keezApi.patchItem('item-123', { itemName: 'New Name' })).resolves.toBeUndefined();
222
+ });
223
+ it('should patch item with only itemCode', async () => {
224
+ nock(baseDomain)
225
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
226
+ .reply(200);
227
+ await expect(keezApi.patchItem('item-123', { itemCode: 'CODE001' })).resolves.toBeUndefined();
228
+ });
229
+ it('should patch item with itemDescription', async () => {
230
+ nock(baseDomain)
231
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
232
+ .reply(200);
233
+ await expect(keezApi.patchItem('item-123', { itemDescription: 'New description' })).resolves.toBeUndefined();
234
+ });
235
+ it('should patch item with measureUnitId', async () => {
236
+ nock(baseDomain)
237
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
238
+ .reply(200);
239
+ await expect(keezApi.patchItem('item-123', { measureUnitId: measureUnit_1.MeasureUnit.LITER })).resolves.toBeUndefined();
240
+ });
241
+ it('should patch item with vatPercent', async () => {
242
+ nock(baseDomain)
243
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
244
+ .reply(200);
245
+ await expect(keezApi.patchItem('item-123', { vatPercent: 5 })).resolves.toBeUndefined();
246
+ });
247
+ it('should patch item with vatCategoryCode', async () => {
248
+ nock(baseDomain)
249
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
250
+ .reply(200);
251
+ await expect(keezApi.patchItem('item-123', { vatCategoryCode: 'E' })).resolves.toBeUndefined();
252
+ });
253
+ it('should patch item with vatExemptionReason', async () => {
254
+ nock(baseDomain)
255
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
256
+ .reply(200);
257
+ await expect(keezApi.patchItem('item-123', { vatExemptionReason: 'Exempt for reason' })).resolves.toBeUndefined();
258
+ });
259
+ it('should patch item with isActive', async () => {
260
+ nock(baseDomain)
261
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
262
+ .reply(200);
263
+ await expect(keezApi.patchItem('item-123', { isActive: false })).resolves.toBeUndefined();
264
+ });
265
+ });
266
+ });
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXBhcmFtcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdHMvZmlsdGVyLXBhcmFtcy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQThCO0FBQzlCLHVDQUFvQztBQUNwQyxzREFBbUQ7QUFFbkQsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxJQUFJLE9BQWdCLENBQUM7SUFDckIsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUM7SUFDN0MsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUM7SUFFcEMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNYLE9BQU8sR0FBRyxJQUFJLGlCQUFPLENBQUM7WUFDbEIsY0FBYyxFQUFFLGFBQWE7WUFDN0IsVUFBVSxFQUFFLFNBQVM7WUFDckIsTUFBTSxFQUFFLGFBQWE7WUFDckIsSUFBSSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDWixJQUFJLENBQUMsVUFBVSxDQUFDO2FBQ1gsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2FBQzFCLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDUixZQUFZLEVBQUUsWUFBWTtZQUMxQixVQUFVLEVBQUUsSUFBSTtZQUNoQixVQUFVLEVBQUUsUUFBUTtZQUNwQixLQUFLLEVBQUUsWUFBWTtTQUN0QixDQUFDLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDLE1BQU0sb0JBQW9CLEdBQUc7WUFDekIsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLEVBQUUsQ0FBQztZQUNQLFlBQVksRUFBRSxDQUFDO1lBQ2YsSUFB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aUIsQ0FBQztpQkFDekQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWhCLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDOUYsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgeyBLZWV6QXBpIH0gZnJvbSAnQC9rZWV6QXBpJztcbmltcG9ydCB7IE1lYXN1cmVVbml0IH0gZnJvbSAnQC9jb25maWcvbWVhc3VyZVVuaXQnO1xuXG5kZXNjcmliZSgnRmlsdGVyIFBhcmFtZXRlcnMgVGVzdHMnLCAoKSA9PiB7XG4gICAgbGV0IGtlZXpBcGk6IEtlZXpBcGk7XG4gICAgY29uc3QgYmFzZURvbWFpbiA9ICdodHRwczovL3N0YWdpbmcua2Vlei5ybyc7XG4gICAgY29uc3QgY2xpZW50RWlkID0gJ3Rlc3QtY2xpZW50LWVpZCc7XG5cbiAgICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgICAgICBrZWV6QXBpID0gbmV3IEtlZXpBcGkoe1xuICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICBjbGllbnRfZWlkOiBjbGllbnRFaWQsXG4gICAgICAgICAgICBzZWNyZXQ6ICd0ZXN0LXNlY3JldCcsXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgLnBvc3QoJy9pZHAvY29ubmVjdC90b2tlbicpXG4gICAgICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiAndGVzdC10b2tlbicsXG4gICAgICAgICAgICAgICAgZXhwaXJlc19pbjogMzYwMCxcbiAgICAgICAgICAgICAgICB0b2tlbl90eXBlOiAnQmVhcmVyJyxcbiAgICAgICAgICAgICAgICBzY29wZTogJ3B1YmxpYy1hcGknLFxuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnSW52b2ljZSBGaWx0ZXIgUGFyYW1ldGVycycsICgpID0+IHtcbiAgICAgICAgY29uc3QgbW9ja0ludm9pY2VzUmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBmaXJzdDogMCxcbiAgICAgICAgICAgIGxhc3Q6IDAsXG4gICAgICAgICAgICByZWNvcmRzQ291bnQ6IDEsXG4gICAgICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBleHRlcm5hbElkOiAnaW52LTEnLFxuICAgICAgICAgICAgICAgICAgICBzZXJpZXM6ICdJTlYnLFxuICAgICAgICAgICAgICAgICAgICBudW1iZXI6IDEsXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50RGF0ZTogMjAyMzAxMDEsXG4gICAgICAgICAgICAgICAgICAgIGR1ZURhdGU6IDIwMjMwMTE1LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdWQUxJREFURUQnLFxuICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lOiAnVGVzdCBDbGllbnQnLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZTogJ1JPTicsXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUN1cnJlbmN5Q29kZTogJ1JPTicsXG4gICAgICAgICAgICAgICAgICAgIG5ldEFtb3VudDogMTAwLFxuICAgICAgICAgICAgICAgICAgICB2YXRBbW91bnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICBncm9zc0Ftb3VudDogMTE5LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmlsdGVyIGludm9pY2VzIGJ5IGZyb21EYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgZnJvbURhdGU6ICcyMDIzMDEwMScgfSlcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwLCBtb2NrSW52b2ljZXNSZXNwb25zZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuZ2V0QWxsSW52b2ljZXMoeyBmcm9tRGF0ZTogMjAyMzAxMDEgfSk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0LmRhdGEpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaWx0ZXIgaW52b2ljZXMgYnkgdG9EYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgdG9EYXRlOiAnMjAyMzEyMzEnIH0pXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwgbW9ja0ludm9pY2VzUmVzcG9uc2UpO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmdldEFsbEludm9pY2VzKHsgdG9EYXRlOiAyMDIzMTIzMSB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpbHRlciBpbnZvaWNlcyBieSBzZXJpZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzYClcbiAgICAgICAgICAgICAgICAucXVlcnkoeyBzZXJpZXM6ICdJTlYnIH0pXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwgbW9ja0ludm9pY2VzUmVzcG9uc2UpO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmdldEFsbEludm9pY2VzKHsgc2VyaWVzOiAnSU5WJyB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpbHRlciBpbnZvaWNlcyBieSBwYXJ0bmVyTmFtZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXNgKVxuICAgICAgICAgICAgICAgIC5xdWVyeSh7IHBhcnRuZXJOYW1lOiAnVGVzdCBQYXJ0bmVyJyB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJbnZvaWNlc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJbnZvaWNlcyh7IHBhcnRuZXJOYW1lOiAnVGVzdCBQYXJ0bmVyJyB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpbHRlciBpbnZvaWNlcyBieSBkYXRlIHJhbmdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgZnJvbURhdGU6ICcyMDIzMDEwMScsIHRvRGF0ZTogJzIwMjMxMjMxJyB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJbnZvaWNlc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJbnZvaWNlcyh7IGZyb21EYXRlOiAyMDIzMDEwMSwgdG9EYXRlOiAyMDIzMTIzMSB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNvbWJpbmUgbXVsdGlwbGUgaW52b2ljZSBmaWx0ZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnVkFMSURBVEVEJyxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWVzOiAnSU5WJyxcbiAgICAgICAgICAgICAgICAgICAgcGFydG5lck5hbWU6ICdUZXN0IFBhcnRuZXInLFxuICAgICAgICAgICAgICAgICAgICBmcm9tRGF0ZTogJzIwMjMwMTAxJyxcbiAgICAgICAgICAgICAgICAgICAgdG9EYXRlOiAnMjAyMzEyMzEnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6ICcwJyxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6ICcxMCcsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwLCBtb2NrSW52b2ljZXNSZXNwb25zZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuZ2V0QWxsSW52b2ljZXMoe1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ1ZBTElEQVRFRCcsXG4gICAgICAgICAgICAgICAgc2VyaWVzOiAnSU5WJyxcbiAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgZnJvbURhdGU6IDIwMjMwMTAxLFxuICAgICAgICAgICAgICAgIHRvRGF0ZTogMjAyMzEyMzEsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgIGNvdW50OiAxMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5kYXRhKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0l0ZW0gRmlsdGVyIFBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vY2tJdGVtc1Jlc3BvbnNlID0ge1xuICAgICAgICAgICAgZmlyc3Q6IDAsXG4gICAgICAgICAgICBsYXN0OiAwLFxuICAgICAgICAgICAgcmVjb3Jkc0NvdW50OiAxLFxuICAgICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxJZDogJ2l0ZW0tMScsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVGVzdCBJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvZGU6ICdUSTAwMScsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1EZXNjcmlwdGlvbjogJ1Rlc3QgZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiAxLFxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdE5hbWU6ICdCdWNhdGEnLFxuICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgdmF0UGVyY2VudDogMTksXG4gICAgICAgICAgICAgICAgICAgIHZhdENhdGVnb3J5Q29kZTogJ1MnLFxuICAgICAgICAgICAgICAgICAgICB2YXRFeGVtcHRpb25SZWFzb246ICcnLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiAxNzAwMDAwMDAwMDAwLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IDE3MDAwMDAwMDAwMDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaWx0ZXIgaXRlbXMgYnkgaXRlbU5hbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zYClcbiAgICAgICAgICAgICAgICAucXVlcnkoeyBpdGVtTmFtZTogJ1Rlc3QgSXRlbScgfSlcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwLCBtb2NrSXRlbXNSZXNwb25zZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuZ2V0QWxsSXRlbXMoeyBpdGVtTmFtZTogJ1Rlc3QgSXRlbScgfSk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0LmRhdGEpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaWx0ZXIgaXRlbXMgYnkgaXRlbUNvZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zYClcbiAgICAgICAgICAgICAgICAucXVlcnkoeyBpdGVtQ29kZTogJ1RJMDAxJyB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJdGVtc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJdGVtcyh7IGl0ZW1Db2RlOiAnVEkwMDEnIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5kYXRhKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmlsdGVyIGl0ZW1zIGJ5IGlzQWN0aXZlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgaXNBY3RpdmU6ICd0cnVlJyB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJdGVtc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJdGVtcyh7IGlzQWN0aXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5kYXRhKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmlsdGVyIGluYWN0aXZlIGl0ZW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5hY3RpdmVJdGVtc1Jlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIC4uLm1vY2tJdGVtc1Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgIGRhdGE6IFt7IC4uLm1vY2tJdGVtc1Jlc3BvbnNlLmRhdGFbMF0sIGlzQWN0aXZlOiBmYWxzZSB9XSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKVxuICAgICAgICAgICAgICAgIC5xdWVyeSh7IGlzQWN0aXZlOiAnZmFsc2UnIH0pXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwgaW5hY3RpdmVJdGVtc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJdGVtcyh7IGlzQWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5kYXRhWzBdLmlzQWN0aXZlKS50b0JlKGZhbHNlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjb21iaW5lIG11bHRpcGxlIGl0ZW0gZmlsdGVycycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKVxuICAgICAgICAgICAgICAgIC5xdWVyeSh7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVGVzdCBJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvZGU6ICdUSTAwMScsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiAndHJ1ZScsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogJzAnLFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogJzEwJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJdGVtc1Jlc3BvbnNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRBbGxJdGVtcyh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdUZXN0IEl0ZW0nLFxuICAgICAgICAgICAgICAgIGl0ZW1Db2RlOiAnVEkwMDEnLFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgICAgICBjb3VudDogMTAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuZGF0YSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdQYXRjaCBJdGVtIHdpdGggTXVsdGlwbGUgRmllbGRzJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHBhdGNoIGl0ZW0gd2l0aCBhbGwgb3B0aW9uYWwgZmllbGRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wYXRjaChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkucGF0Y2hJdGVtKCdpdGVtLTEyMycsIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdVcGRhdGVkIE5hbWUnLFxuICAgICAgICAgICAgICAgICAgICBpdGVtQ29kZTogJ05FVzAwMScsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1EZXNjcmlwdGlvbjogJ1VwZGF0ZWQgZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5LSUxPR1JBTSxcbiAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDksXG4gICAgICAgICAgICAgICAgICAgIHZhdENhdGVnb3J5Q29kZTogJ1InLFxuICAgICAgICAgICAgICAgICAgICB2YXRFeGVtcHRpb25SZWFzb246ICdOb25lJyxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggb25seSBpdGVtTmFtZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucGF0Y2goYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtcy9pdGVtLTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLnBhdGNoSXRlbSgnaXRlbS0xMjMnLCB7IGl0ZW1OYW1lOiAnTmV3IE5hbWUnIH0pKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcGF0Y2ggaXRlbSB3aXRoIG9ubHkgaXRlbUNvZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBhdGNoKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5wYXRjaEl0ZW0oJ2l0ZW0tMTIzJywgeyBpdGVtQ29kZTogJ0NPREUwMDEnIH0pKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcGF0Y2ggaXRlbSB3aXRoIGl0ZW1EZXNjcmlwdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucGF0Y2goYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtcy9pdGVtLTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBrZWV6QXBpLnBhdGNoSXRlbSgnaXRlbS0xMjMnLCB7IGl0ZW1EZXNjcmlwdGlvbjogJ05ldyBkZXNjcmlwdGlvbicgfSlcbiAgICAgICAgICAgICkucmVzb2x2ZXMudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHBhdGNoIGl0ZW0gd2l0aCBtZWFzdXJlVW5pdElkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wYXRjaChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkucGF0Y2hJdGVtKCdpdGVtLTEyMycsIHsgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuTElURVIgfSkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggdmF0UGVyY2VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucGF0Y2goYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtcy9pdGVtLTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChrZWV6QXBpLnBhdGNoSXRlbSgnaXRlbS0xMjMnLCB7IHZhdFBlcmNlbnQ6IDUgfSkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggdmF0Q2F0ZWdvcnlDb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wYXRjaChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KGtlZXpBcGkucGF0Y2hJdGVtKCdpdGVtLTEyMycsIHsgdmF0Q2F0ZWdvcnlDb2RlOiAnRScgfSkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggdmF0RXhlbXB0aW9uUmVhc29uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wYXRjaChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkucGF0Y2hJdGVtKCdpdGVtLTEyMycsIHsgdmF0RXhlbXB0aW9uUmVhc29uOiAnRXhlbXB0IGZvciByZWFzb24nIH0pXG4gICAgICAgICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwYXRjaCBpdGVtIHdpdGggaXNBY3RpdmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBhdGNoKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3Qoa2VlekFwaS5wYXRjaEl0ZW0oJ2l0ZW0tMTIzJywgeyBpc0FjdGl2ZTogZmFsc2UgfSkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiJdfQ==