@railhook/node 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +476 -0
- package/dist/__tests__/client.test.d.ts +1 -0
- package/dist/__tests__/client.test.js +105 -0
- package/dist/__tests__/incoming.test.d.ts +1 -0
- package/dist/__tests__/incoming.test.js +316 -0
- package/dist/__tests__/package-identity.test.d.ts +1 -0
- package/dist/__tests__/package-identity.test.js +19 -0
- package/dist/__tests__/standardWebhooks.test.d.ts +1 -0
- package/dist/__tests__/standardWebhooks.test.js +102 -0
- package/dist/__tests__/webhooks.test.d.ts +1 -0
- package/dist/__tests__/webhooks.test.js +190 -0
- package/dist/client.d.ts +103 -0
- package/dist/client.js +344 -0
- package/dist/errors.d.ts +28 -0
- package/dist/errors.js +53 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +37 -0
- package/dist/types.d.ts +293 -0
- package/dist/types.js +3 -0
- package/dist/webhooks.d.ts +83 -0
- package/dist/webhooks.js +241 -0
- package/package.json +47 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const client_1 = require("../client");
|
|
37
|
+
const http = __importStar(require("http"));
|
|
38
|
+
// Minimal mock HTTP server to verify request paths & methods
|
|
39
|
+
let server;
|
|
40
|
+
let lastRequest;
|
|
41
|
+
let mockResponse = { status: 200, body: {} };
|
|
42
|
+
const PORT = 19876;
|
|
43
|
+
beforeAll((done) => {
|
|
44
|
+
server = http.createServer((req, res) => {
|
|
45
|
+
let body = '';
|
|
46
|
+
req.on('data', (chunk) => (body += chunk));
|
|
47
|
+
req.on('end', () => {
|
|
48
|
+
lastRequest = {
|
|
49
|
+
method: req.method || '',
|
|
50
|
+
url: req.url || '',
|
|
51
|
+
body,
|
|
52
|
+
headers: req.headers,
|
|
53
|
+
};
|
|
54
|
+
res.writeHead(mockResponse.status, { 'Content-Type': 'application/json' });
|
|
55
|
+
res.end(JSON.stringify(mockResponse.body));
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
server.listen(PORT, done);
|
|
59
|
+
});
|
|
60
|
+
afterAll((done) => {
|
|
61
|
+
server.close(done);
|
|
62
|
+
});
|
|
63
|
+
function setMockResponse(status, body) {
|
|
64
|
+
mockResponse = { status, body };
|
|
65
|
+
}
|
|
66
|
+
function createClient() {
|
|
67
|
+
return new client_1.Railhook({
|
|
68
|
+
apiKey: 'test_key',
|
|
69
|
+
baseUrl: `http://localhost:${PORT}`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
describe('IncomingSources', () => {
|
|
73
|
+
const client = createClient();
|
|
74
|
+
const projectId = 'proj-123';
|
|
75
|
+
const sourceId = 'src-456';
|
|
76
|
+
const sourceResponse = {
|
|
77
|
+
id: sourceId,
|
|
78
|
+
projectId,
|
|
79
|
+
name: 'Stripe Webhooks',
|
|
80
|
+
slug: 'stripe',
|
|
81
|
+
providerType: 'STRIPE',
|
|
82
|
+
status: 'ACTIVE',
|
|
83
|
+
ingressPathToken: 'tok_abc',
|
|
84
|
+
ingressUrl: `http://localhost:${PORT}/ingress/tok_abc`,
|
|
85
|
+
verificationMode: 'HMAC_GENERIC',
|
|
86
|
+
hmacHeaderName: 'Stripe-Signature',
|
|
87
|
+
hmacSecretConfigured: true,
|
|
88
|
+
createdAt: '2024-01-01T00:00:00Z',
|
|
89
|
+
};
|
|
90
|
+
describe('create', () => {
|
|
91
|
+
it('should POST to correct path with params', async () => {
|
|
92
|
+
setMockResponse(200, sourceResponse);
|
|
93
|
+
const result = await client.incomingSources.create(projectId, {
|
|
94
|
+
name: 'Stripe Webhooks',
|
|
95
|
+
slug: 'stripe',
|
|
96
|
+
providerType: 'STRIPE',
|
|
97
|
+
verificationMode: 'HMAC_GENERIC',
|
|
98
|
+
hmacSecret: 'whsec_test',
|
|
99
|
+
hmacHeaderName: 'Stripe-Signature',
|
|
100
|
+
});
|
|
101
|
+
expect(lastRequest.method).toBe('POST');
|
|
102
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources`);
|
|
103
|
+
const body = JSON.parse(lastRequest.body);
|
|
104
|
+
expect(body.name).toBe('Stripe Webhooks');
|
|
105
|
+
expect(body.providerType).toBe('STRIPE');
|
|
106
|
+
expect(body.hmacSecret).toBe('whsec_test');
|
|
107
|
+
expect(result.id).toBe(sourceId);
|
|
108
|
+
expect(result.ingressUrl).toContain('tok_abc');
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('get', () => {
|
|
112
|
+
it('should GET by source ID', async () => {
|
|
113
|
+
setMockResponse(200, sourceResponse);
|
|
114
|
+
const result = await client.incomingSources.get(projectId, sourceId);
|
|
115
|
+
expect(lastRequest.method).toBe('GET');
|
|
116
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}`);
|
|
117
|
+
expect(result.name).toBe('Stripe Webhooks');
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('list', () => {
|
|
121
|
+
it('should GET sources list', async () => {
|
|
122
|
+
setMockResponse(200, { content: [sourceResponse], totalElements: 1, totalPages: 1, size: 20, number: 0 });
|
|
123
|
+
const result = await client.incomingSources.list(projectId);
|
|
124
|
+
expect(lastRequest.method).toBe('GET');
|
|
125
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources`);
|
|
126
|
+
expect(result.content).toHaveLength(1);
|
|
127
|
+
expect(result.content[0].slug).toBe('stripe');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('update', () => {
|
|
131
|
+
it('should PUT with update params', async () => {
|
|
132
|
+
setMockResponse(200, { ...sourceResponse, name: 'Updated' });
|
|
133
|
+
const result = await client.incomingSources.update(projectId, sourceId, {
|
|
134
|
+
name: 'Updated',
|
|
135
|
+
status: 'DISABLED',
|
|
136
|
+
});
|
|
137
|
+
expect(lastRequest.method).toBe('PUT');
|
|
138
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}`);
|
|
139
|
+
const body = JSON.parse(lastRequest.body);
|
|
140
|
+
expect(body.name).toBe('Updated');
|
|
141
|
+
expect(body.status).toBe('DISABLED');
|
|
142
|
+
expect(result.name).toBe('Updated');
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe('delete', () => {
|
|
146
|
+
it('should DELETE by source ID', async () => {
|
|
147
|
+
setMockResponse(204, '');
|
|
148
|
+
await client.incomingSources.delete(projectId, sourceId);
|
|
149
|
+
expect(lastRequest.method).toBe('DELETE');
|
|
150
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}`);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
// ── Destinations ──
|
|
154
|
+
const destId = 'dest-789';
|
|
155
|
+
const destResponse = {
|
|
156
|
+
id: destId,
|
|
157
|
+
incomingSourceId: sourceId,
|
|
158
|
+
url: 'https://api.example.com/webhooks/stripe',
|
|
159
|
+
authType: 'NONE',
|
|
160
|
+
authConfigured: false,
|
|
161
|
+
enabled: true,
|
|
162
|
+
maxAttempts: 5,
|
|
163
|
+
timeoutSeconds: 30,
|
|
164
|
+
createdAt: '2024-01-01T00:00:00Z',
|
|
165
|
+
};
|
|
166
|
+
describe('createDestination', () => {
|
|
167
|
+
it('should POST to destinations path', async () => {
|
|
168
|
+
setMockResponse(200, destResponse);
|
|
169
|
+
const result = await client.incomingSources.createDestination(projectId, sourceId, {
|
|
170
|
+
url: 'https://api.example.com/webhooks/stripe',
|
|
171
|
+
enabled: true,
|
|
172
|
+
maxAttempts: 5,
|
|
173
|
+
});
|
|
174
|
+
expect(lastRequest.method).toBe('POST');
|
|
175
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations`);
|
|
176
|
+
const body = JSON.parse(lastRequest.body);
|
|
177
|
+
expect(body.url).toBe('https://api.example.com/webhooks/stripe');
|
|
178
|
+
expect(result.id).toBe(destId);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
describe('getDestination', () => {
|
|
182
|
+
it('should GET destination by ID', async () => {
|
|
183
|
+
setMockResponse(200, destResponse);
|
|
184
|
+
const result = await client.incomingSources.getDestination(projectId, sourceId, destId);
|
|
185
|
+
expect(lastRequest.method).toBe('GET');
|
|
186
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations/${destId}`);
|
|
187
|
+
expect(result.url).toBe('https://api.example.com/webhooks/stripe');
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe('listDestinations', () => {
|
|
191
|
+
it('should GET destinations list', async () => {
|
|
192
|
+
setMockResponse(200, { content: [destResponse], totalElements: 1, totalPages: 1, size: 20, number: 0 });
|
|
193
|
+
const result = await client.incomingSources.listDestinations(projectId, sourceId);
|
|
194
|
+
expect(lastRequest.method).toBe('GET');
|
|
195
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations`);
|
|
196
|
+
expect(result.content).toHaveLength(1);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe('updateDestination', () => {
|
|
200
|
+
it('should PUT with update params', async () => {
|
|
201
|
+
setMockResponse(200, { ...destResponse, enabled: false });
|
|
202
|
+
const result = await client.incomingSources.updateDestination(projectId, sourceId, destId, {
|
|
203
|
+
enabled: false,
|
|
204
|
+
});
|
|
205
|
+
expect(lastRequest.method).toBe('PUT');
|
|
206
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations/${destId}`);
|
|
207
|
+
expect(result.enabled).toBe(false);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
describe('deleteDestination', () => {
|
|
211
|
+
it('should DELETE destination', async () => {
|
|
212
|
+
setMockResponse(204, '');
|
|
213
|
+
await client.incomingSources.deleteDestination(projectId, sourceId, destId);
|
|
214
|
+
expect(lastRequest.method).toBe('DELETE');
|
|
215
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations/${destId}`);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
describe('IncomingEvents', () => {
|
|
220
|
+
const client = createClient();
|
|
221
|
+
const projectId = 'proj-123';
|
|
222
|
+
const eventId = 'evt-abc';
|
|
223
|
+
const eventResponse = {
|
|
224
|
+
id: eventId,
|
|
225
|
+
incomingSourceId: 'src-456',
|
|
226
|
+
sourceName: 'Stripe Webhooks',
|
|
227
|
+
requestId: 'req-xyz',
|
|
228
|
+
method: 'POST',
|
|
229
|
+
path: '/ingress/tok_abc',
|
|
230
|
+
bodyRaw: '{"type":"checkout.session.completed"}',
|
|
231
|
+
contentType: 'application/json',
|
|
232
|
+
verified: true,
|
|
233
|
+
receivedAt: '2024-01-01T00:00:00Z',
|
|
234
|
+
};
|
|
235
|
+
describe('list', () => {
|
|
236
|
+
it('should GET events without params', async () => {
|
|
237
|
+
setMockResponse(200, { content: [eventResponse], totalElements: 1, totalPages: 1, size: 20, number: 0 });
|
|
238
|
+
const result = await client.incomingEvents.list(projectId);
|
|
239
|
+
expect(lastRequest.method).toBe('GET');
|
|
240
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-events`);
|
|
241
|
+
expect(result.content).toHaveLength(1);
|
|
242
|
+
expect(result.content[0].requestId).toBe('req-xyz');
|
|
243
|
+
});
|
|
244
|
+
it('should pass sourceId filter as query param', async () => {
|
|
245
|
+
setMockResponse(200, { content: [], totalElements: 0, totalPages: 0, size: 20, number: 0 });
|
|
246
|
+
await client.incomingEvents.list(projectId, { sourceId: 'src-456' });
|
|
247
|
+
expect(lastRequest.url).toContain('sourceId=src-456');
|
|
248
|
+
});
|
|
249
|
+
it('should pass pagination params', async () => {
|
|
250
|
+
setMockResponse(200, { content: [], totalElements: 0, totalPages: 0, size: 10, number: 2 });
|
|
251
|
+
await client.incomingEvents.list(projectId, { page: 2, size: 10 });
|
|
252
|
+
expect(lastRequest.url).toContain('page=2');
|
|
253
|
+
expect(lastRequest.url).toContain('size=10');
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('get', () => {
|
|
257
|
+
it('should GET event by ID', async () => {
|
|
258
|
+
setMockResponse(200, eventResponse);
|
|
259
|
+
const result = await client.incomingEvents.get(projectId, eventId);
|
|
260
|
+
expect(lastRequest.method).toBe('GET');
|
|
261
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-events/${eventId}`);
|
|
262
|
+
expect(result.verified).toBe(true);
|
|
263
|
+
expect(result.method).toBe('POST');
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
describe('getAttempts', () => {
|
|
267
|
+
it('should GET forward attempts', async () => {
|
|
268
|
+
const attemptResponse = {
|
|
269
|
+
content: [{
|
|
270
|
+
id: 'att-1',
|
|
271
|
+
incomingEventId: eventId,
|
|
272
|
+
destinationId: 'dest-789',
|
|
273
|
+
destinationUrl: 'https://api.example.com/webhooks/stripe',
|
|
274
|
+
attemptNumber: 1,
|
|
275
|
+
status: 'SUCCESS',
|
|
276
|
+
startedAt: '2024-01-01T00:00:00Z',
|
|
277
|
+
finishedAt: '2024-01-01T00:00:01Z',
|
|
278
|
+
responseCode: 200,
|
|
279
|
+
responseBodySnippet: 'OK',
|
|
280
|
+
createdAt: '2024-01-01T00:00:00Z',
|
|
281
|
+
}],
|
|
282
|
+
totalElements: 1,
|
|
283
|
+
totalPages: 1,
|
|
284
|
+
size: 20,
|
|
285
|
+
number: 0,
|
|
286
|
+
};
|
|
287
|
+
setMockResponse(200, attemptResponse);
|
|
288
|
+
const result = await client.incomingEvents.getAttempts(projectId, eventId);
|
|
289
|
+
expect(lastRequest.method).toBe('GET');
|
|
290
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-events/${eventId}/attempts`);
|
|
291
|
+
expect(result.content).toHaveLength(1);
|
|
292
|
+
expect(result.content[0].responseCode).toBe(200);
|
|
293
|
+
expect(result.content[0].status).toBe('SUCCESS');
|
|
294
|
+
expect(result.content[0].attemptNumber).toBe(1);
|
|
295
|
+
expect(result.content[0].destinationUrl).toBe('https://api.example.com/webhooks/stripe');
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
describe('replay', () => {
|
|
299
|
+
it('should POST replay', async () => {
|
|
300
|
+
setMockResponse(200, { status: 'replayed', eventId, destinationsCount: 2 });
|
|
301
|
+
const result = await client.incomingEvents.replay(projectId, eventId);
|
|
302
|
+
expect(lastRequest.method).toBe('POST');
|
|
303
|
+
expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-events/${eventId}/replay`);
|
|
304
|
+
expect(result.status).toBe('replayed');
|
|
305
|
+
expect(result.destinationsCount).toBe(2);
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
describe('Client initialization includes incoming modules', () => {
|
|
310
|
+
it('should have incomingSources and incomingEvents', () => {
|
|
311
|
+
const client = new client_1.Railhook({ apiKey: 'test_key' });
|
|
312
|
+
expect(client.incomingSources).toBeDefined();
|
|
313
|
+
expect(client.incomingEvents).toBeDefined();
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jb21pbmcudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5jb21pbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNDQUFxQztBQUNyQywyQ0FBNkI7QUFFN0IsNkRBQTZEO0FBQzdELElBQUksTUFBbUIsQ0FBQztBQUN4QixJQUFJLFdBQTZGLENBQUM7QUFDbEcsSUFBSSxZQUFZLEdBQXNDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFFaEYsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBRW5CLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2pCLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3RDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUNqQixXQUFXLEdBQUc7Z0JBQ1osTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRTtnQkFDeEIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRTtnQkFDbEIsSUFBSTtnQkFDSixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87YUFDckIsQ0FBQztZQUNGLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDM0UsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDLENBQUM7QUFFSCxTQUFTLGVBQWUsQ0FBQyxNQUFjLEVBQUUsSUFBYTtJQUNwRCxZQUFZLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDbEMsQ0FBQztBQUVELFNBQVMsWUFBWTtJQUNuQixPQUFPLElBQUksaUJBQVEsQ0FBQztRQUNsQixNQUFNLEVBQUUsVUFBVTtRQUNsQixPQUFPLEVBQUUsb0JBQW9CLElBQUksRUFBRTtLQUNwQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtJQUMvQixNQUFNLE1BQU0sR0FBRyxZQUFZLEVBQUUsQ0FBQztJQUM5QixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7SUFDN0IsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBRTNCLE1BQU0sY0FBYyxHQUFHO1FBQ3JCLEVBQUUsRUFBRSxRQUFRO1FBQ1osU0FBUztRQUNULElBQUksRUFBRSxpQkFBaUI7UUFDdkIsSUFBSSxFQUFFLFFBQVE7UUFDZCxZQUFZLEVBQUUsUUFBUTtRQUN0QixNQUFNLEVBQUUsUUFBUTtRQUNoQixnQkFBZ0IsRUFBRSxTQUFTO1FBQzNCLFVBQVUsRUFBRSxvQkFBb0IsSUFBSSxrQkFBa0I7UUFDdEQsZ0JBQWdCLEVBQUUsY0FBYztRQUNoQyxjQUFjLEVBQUUsa0JBQWtCO1FBQ2xDLG9CQUFvQixFQUFFLElBQUk7UUFDMUIsU0FBUyxFQUFFLHNCQUFzQjtLQUNsQyxDQUFDO0lBRUYsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDdEIsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3ZELGVBQWUsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFFckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQzVELElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLElBQUksRUFBRSxRQUFRO2dCQUNkLFlBQVksRUFBRSxRQUFRO2dCQUN0QixnQkFBZ0IsRUFBRSxjQUFjO2dCQUNoQyxVQUFVLEVBQUUsWUFBWTtnQkFDeEIsY0FBYyxFQUFFLGtCQUFrQjthQUNuQyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsU0FBUyxtQkFBbUIsQ0FBQyxDQUFDO1lBQy9FLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQ25CLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN2QyxlQUFlLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRXJDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXJFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixTQUFTLHFCQUFxQixRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ3BCLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN2QyxlQUFlLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFMUcsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUU1RCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsU0FBUyxtQkFBbUIsQ0FBQyxDQUFDO1lBQy9FLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDdEIsRUFBRSxDQUFDLCtCQUErQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzdDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUU3RCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUU7Z0JBQ3RFLElBQUksRUFBRSxTQUFTO2dCQUNmLE1BQU0sRUFBRSxVQUFVO2FBQ25CLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixTQUFTLHFCQUFxQixRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUN0QixFQUFFLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV6QixNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV6RCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsU0FBUyxxQkFBcUIsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM3RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgscUJBQXFCO0lBRXJCLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQztJQUMxQixNQUFNLFlBQVksR0FBRztRQUNuQixFQUFFLEVBQUUsTUFBTTtRQUNWLGdCQUFnQixFQUFFLFFBQVE7UUFDMUIsR0FBRyxFQUFFLHlDQUF5QztRQUM5QyxRQUFRLEVBQUUsTUFBTTtRQUNoQixjQUFjLEVBQUUsS0FBSztRQUNyQixPQUFPLEVBQUUsSUFBSTtRQUNiLFdBQVcsRUFBRSxDQUFDO1FBQ2QsY0FBYyxFQUFFLEVBQUU7UUFDbEIsU0FBUyxFQUFFLHNCQUFzQjtLQUNsQyxDQUFDO0lBRUYsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEQsZUFBZSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVuQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRTtnQkFDakYsR0FBRyxFQUFFLHlDQUF5QztnQkFDOUMsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsV0FBVyxFQUFFLENBQUM7YUFDZixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDMUIsb0JBQW9CLFNBQVMscUJBQXFCLFFBQVEsZUFBZSxDQUMxRSxDQUFDO1lBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtRQUM5QixFQUFFLENBQUMsOEJBQThCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDNUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVuQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFeEYsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQzFCLG9CQUFvQixTQUFTLHFCQUFxQixRQUFRLGlCQUFpQixNQUFNLEVBQUUsQ0FDcEYsQ0FBQztZQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsRUFBRSxDQUFDLDhCQUE4QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzVDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUV4RyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRWxGLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUMxQixvQkFBb0IsU0FBUyxxQkFBcUIsUUFBUSxlQUFlLENBQzFFLENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsK0JBQStCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDN0MsZUFBZSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRTFELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtnQkFDekYsT0FBTyxFQUFFLEtBQUs7YUFDZixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDMUIsb0JBQW9CLFNBQVMscUJBQXFCLFFBQVEsaUJBQWlCLE1BQU0sRUFBRSxDQUNwRixDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDakMsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3pDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFekIsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFNUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQzFCLG9CQUFvQixTQUFTLHFCQUFxQixRQUFRLGlCQUFpQixNQUFNLEVBQUUsQ0FDcEYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7SUFDOUIsTUFBTSxNQUFNLEdBQUcsWUFBWSxFQUFFLENBQUM7SUFDOUIsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUUxQixNQUFNLGFBQWEsR0FBRztRQUNwQixFQUFFLEVBQUUsT0FBTztRQUNYLGdCQUFnQixFQUFFLFNBQVM7UUFDM0IsVUFBVSxFQUFFLGlCQUFpQjtRQUM3QixTQUFTLEVBQUUsU0FBUztRQUNwQixNQUFNLEVBQUUsTUFBTTtRQUNkLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsT0FBTyxFQUFFLHVDQUF1QztRQUNoRCxXQUFXLEVBQUUsa0JBQWtCO1FBQy9CLFFBQVEsRUFBRSxJQUFJO1FBQ2QsVUFBVSxFQUFFLHNCQUFzQjtLQUNuQyxDQUFDO0lBRUYsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDcEIsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2hELGVBQWUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUV6RyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTNELE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixTQUFTLGtCQUFrQixDQUFDLENBQUM7WUFDOUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFELGVBQWUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRTVGLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFFckUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM3QyxlQUFlLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUU1RixNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFbkUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQ25CLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0QyxlQUFlLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBRXBDLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRW5FLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixTQUFTLG9CQUFvQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUMzQixFQUFFLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDM0MsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLE9BQU8sRUFBRSxDQUFDO3dCQUNSLEVBQUUsRUFBRSxPQUFPO3dCQUNYLGVBQWUsRUFBRSxPQUFPO3dCQUN4QixhQUFhLEVBQUUsVUFBVTt3QkFDekIsY0FBYyxFQUFFLHlDQUF5Qzt3QkFDekQsYUFBYSxFQUFFLENBQUM7d0JBQ2hCLE1BQU0sRUFBRSxTQUFTO3dCQUNqQixTQUFTLEVBQUUsc0JBQXNCO3dCQUNqQyxVQUFVLEVBQUUsc0JBQXNCO3dCQUNsQyxZQUFZLEVBQUUsR0FBRzt3QkFDakIsbUJBQW1CLEVBQUUsSUFBSTt3QkFDekIsU0FBUyxFQUFFLHNCQUFzQjtxQkFDbEMsQ0FBQztnQkFDRixhQUFhLEVBQUUsQ0FBQztnQkFDaEIsVUFBVSxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsTUFBTSxFQUFFLENBQUM7YUFDVixDQUFDO1lBQ0YsZUFBZSxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUV0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUUzRSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsU0FBUyxvQkFBb0IsT0FBTyxXQUFXLENBQUMsQ0FBQztZQUNsRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUMzRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9CQUFvQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2xDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRXRFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixTQUFTLG9CQUFvQixPQUFPLFNBQVMsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtJQUMvRCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmFpbGhvb2sgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcblxuLy8gTWluaW1hbCBtb2NrIEhUVFAgc2VydmVyIHRvIHZlcmlmeSByZXF1ZXN0IHBhdGhzICYgbWV0aG9kc1xubGV0IHNlcnZlcjogaHR0cC5TZXJ2ZXI7XG5sZXQgbGFzdFJlcXVlc3Q6IHsgbWV0aG9kOiBzdHJpbmc7IHVybDogc3RyaW5nOyBib2R5OiBzdHJpbmc7IGhlYWRlcnM6IGh0dHAuSW5jb21pbmdIdHRwSGVhZGVycyB9O1xubGV0IG1vY2tSZXNwb25zZTogeyBzdGF0dXM6IG51bWJlcjsgYm9keTogdW5rbm93biB9ID0geyBzdGF0dXM6IDIwMCwgYm9keToge30gfTtcblxuY29uc3QgUE9SVCA9IDE5ODc2O1xuXG5iZWZvcmVBbGwoKGRvbmUpID0+IHtcbiAgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKHJlcSwgcmVzKSA9PiB7XG4gICAgbGV0IGJvZHkgPSAnJztcbiAgICByZXEub24oJ2RhdGEnLCAoY2h1bmspID0+IChib2R5ICs9IGNodW5rKSk7XG4gICAgcmVxLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICBsYXN0UmVxdWVzdCA9IHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kIHx8ICcnLFxuICAgICAgICB1cmw6IHJlcS51cmwgfHwgJycsXG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgfTtcbiAgICAgIHJlcy53cml0ZUhlYWQobW9ja1Jlc3BvbnNlLnN0YXR1cywgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgcmVzLmVuZChKU09OLnN0cmluZ2lmeShtb2NrUmVzcG9uc2UuYm9keSkpO1xuICAgIH0pO1xuICB9KTtcbiAgc2VydmVyLmxpc3RlbihQT1JULCBkb25lKTtcbn0pO1xuXG5hZnRlckFsbCgoZG9uZSkgPT4ge1xuICBzZXJ2ZXIuY2xvc2UoZG9uZSk7XG59KTtcblxuZnVuY3Rpb24gc2V0TW9ja1Jlc3BvbnNlKHN0YXR1czogbnVtYmVyLCBib2R5OiB1bmtub3duKSB7XG4gIG1vY2tSZXNwb25zZSA9IHsgc3RhdHVzLCBib2R5IH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudCgpOiBSYWlsaG9vayB7XG4gIHJldHVybiBuZXcgUmFpbGhvb2soe1xuICAgIGFwaUtleTogJ3Rlc3Rfa2V5JyxcbiAgICBiYXNlVXJsOiBgaHR0cDovL2xvY2FsaG9zdDoke1BPUlR9YCxcbiAgfSk7XG59XG5cbmRlc2NyaWJlKCdJbmNvbWluZ1NvdXJjZXMnLCAoKSA9PiB7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUNsaWVudCgpO1xuICBjb25zdCBwcm9qZWN0SWQgPSAncHJvai0xMjMnO1xuICBjb25zdCBzb3VyY2VJZCA9ICdzcmMtNDU2JztcblxuICBjb25zdCBzb3VyY2VSZXNwb25zZSA9IHtcbiAgICBpZDogc291cmNlSWQsXG4gICAgcHJvamVjdElkLFxuICAgIG5hbWU6ICdTdHJpcGUgV2ViaG9va3MnLFxuICAgIHNsdWc6ICdzdHJpcGUnLFxuICAgIHByb3ZpZGVyVHlwZTogJ1NUUklQRScsXG4gICAgc3RhdHVzOiAnQUNUSVZFJyxcbiAgICBpbmdyZXNzUGF0aFRva2VuOiAndG9rX2FiYycsXG4gICAgaW5ncmVzc1VybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtQT1JUfS9pbmdyZXNzL3Rva19hYmNgLFxuICAgIHZlcmlmaWNhdGlvbk1vZGU6ICdITUFDX0dFTkVSSUMnLFxuICAgIGhtYWNIZWFkZXJOYW1lOiAnU3RyaXBlLVNpZ25hdHVyZScsXG4gICAgaG1hY1NlY3JldENvbmZpZ3VyZWQ6IHRydWUsXG4gICAgY3JlYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICB9O1xuXG4gIGRlc2NyaWJlKCdjcmVhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBQT1NUIHRvIGNvcnJlY3QgcGF0aCB3aXRoIHBhcmFtcycsIGFzeW5jICgpID0+IHtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIHNvdXJjZVJlc3BvbnNlKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmluY29taW5nU291cmNlcy5jcmVhdGUocHJvamVjdElkLCB7XG4gICAgICAgIG5hbWU6ICdTdHJpcGUgV2ViaG9va3MnLFxuICAgICAgICBzbHVnOiAnc3RyaXBlJyxcbiAgICAgICAgcHJvdmlkZXJUeXBlOiAnU1RSSVBFJyxcbiAgICAgICAgdmVyaWZpY2F0aW9uTW9kZTogJ0hNQUNfR0VORVJJQycsXG4gICAgICAgIGhtYWNTZWNyZXQ6ICd3aHNlY190ZXN0JyxcbiAgICAgICAgaG1hY0hlYWRlck5hbWU6ICdTdHJpcGUtU2lnbmF0dXJlJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdQT1NUJyk7XG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QudXJsKS50b0JlKGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzYCk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShsYXN0UmVxdWVzdC5ib2R5KTtcbiAgICAgIGV4cGVjdChib2R5Lm5hbWUpLnRvQmUoJ1N0cmlwZSBXZWJob29rcycpO1xuICAgICAgZXhwZWN0KGJvZHkucHJvdmlkZXJUeXBlKS50b0JlKCdTVFJJUEUnKTtcbiAgICAgIGV4cGVjdChib2R5LmhtYWNTZWNyZXQpLnRvQmUoJ3doc2VjX3Rlc3QnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuaWQpLnRvQmUoc291cmNlSWQpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5pbmdyZXNzVXJsKS50b0NvbnRhaW4oJ3Rva19hYmMnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIEdFVCBieSBzb3VyY2UgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXRNb2NrUmVzcG9uc2UoMjAwLCBzb3VyY2VSZXNwb25zZSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5pbmNvbWluZ1NvdXJjZXMuZ2V0KHByb2plY3RJZCwgc291cmNlSWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdHRVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXMvJHtzb3VyY2VJZH1gKTtcbiAgICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZSgnU3RyaXBlIFdlYmhvb2tzJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsaXN0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgR0VUIHNvdXJjZXMgbGlzdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIHsgY29udGVudDogW3NvdXJjZVJlc3BvbnNlXSwgdG90YWxFbGVtZW50czogMSwgdG90YWxQYWdlczogMSwgc2l6ZTogMjAsIG51bWJlcjogMCB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmluY29taW5nU291cmNlcy5saXN0KHByb2plY3RJZCk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ0dFVCcpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9CZShgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlc2ApO1xuICAgICAgZXhwZWN0KHJlc3VsdC5jb250ZW50KS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRbMF0uc2x1ZykudG9CZSgnc3RyaXBlJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd1cGRhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBQVVQgd2l0aCB1cGRhdGUgcGFyYW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyAuLi5zb3VyY2VSZXNwb25zZSwgbmFtZTogJ1VwZGF0ZWQnIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdTb3VyY2VzLnVwZGF0ZShwcm9qZWN0SWQsIHNvdXJjZUlkLCB7XG4gICAgICAgIG5hbWU6ICdVcGRhdGVkJyxcbiAgICAgICAgc3RhdHVzOiAnRElTQUJMRUQnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ1BVVCcpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9CZShgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlcy8ke3NvdXJjZUlkfWApO1xuICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UobGFzdFJlcXVlc3QuYm9keSk7XG4gICAgICBleHBlY3QoYm9keS5uYW1lKS50b0JlKCdVcGRhdGVkJyk7XG4gICAgICBleHBlY3QoYm9keS5zdGF0dXMpLnRvQmUoJ0RJU0FCTEVEJyk7XG4gICAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoJ1VwZGF0ZWQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlbGV0ZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIERFTEVURSBieSBzb3VyY2UgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXRNb2NrUmVzcG9uc2UoMjA0LCAnJyk7XG5cbiAgICAgIGF3YWl0IGNsaWVudC5pbmNvbWluZ1NvdXJjZXMuZGVsZXRlKHByb2plY3RJZCwgc291cmNlSWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdERUxFVEUnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXMvJHtzb3VyY2VJZH1gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8g4pSA4pSAIERlc3RpbmF0aW9ucyDilIDilIBcblxuICBjb25zdCBkZXN0SWQgPSAnZGVzdC03ODknO1xuICBjb25zdCBkZXN0UmVzcG9uc2UgPSB7XG4gICAgaWQ6IGRlc3RJZCxcbiAgICBpbmNvbWluZ1NvdXJjZUlkOiBzb3VyY2VJZCxcbiAgICB1cmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJob29rcy9zdHJpcGUnLFxuICAgIGF1dGhUeXBlOiAnTk9ORScsXG4gICAgYXV0aENvbmZpZ3VyZWQ6IGZhbHNlLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgbWF4QXR0ZW1wdHM6IDUsXG4gICAgdGltZW91dFNlY29uZHM6IDMwLFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgfTtcblxuICBkZXNjcmliZSgnY3JlYXRlRGVzdGluYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBQT1NUIHRvIGRlc3RpbmF0aW9ucyBwYXRoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgZGVzdFJlc3BvbnNlKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmluY29taW5nU291cmNlcy5jcmVhdGVEZXN0aW5hdGlvbihwcm9qZWN0SWQsIHNvdXJjZUlkLCB7XG4gICAgICAgIHVybDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3dlYmhvb2tzL3N0cmlwZScsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIG1heEF0dGVtcHRzOiA1LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ1BPU1QnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoXG4gICAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzLyR7c291cmNlSWR9L2Rlc3RpbmF0aW9uc2BcbiAgICAgICk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShsYXN0UmVxdWVzdC5ib2R5KTtcbiAgICAgIGV4cGVjdChib2R5LnVybCkudG9CZSgnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vd2ViaG9va3Mvc3RyaXBlJyk7XG4gICAgICBleHBlY3QocmVzdWx0LmlkKS50b0JlKGRlc3RJZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXREZXN0aW5hdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIEdFVCBkZXN0aW5hdGlvbiBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIGRlc3RSZXNwb25zZSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5pbmNvbWluZ1NvdXJjZXMuZ2V0RGVzdGluYXRpb24ocHJvamVjdElkLCBzb3VyY2VJZCwgZGVzdElkKTtcblxuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0Lm1ldGhvZCkudG9CZSgnR0VUJyk7XG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QudXJsKS50b0JlKFxuICAgICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlcy8ke3NvdXJjZUlkfS9kZXN0aW5hdGlvbnMvJHtkZXN0SWR9YFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQudXJsKS50b0JlKCdodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJob29rcy9zdHJpcGUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xpc3REZXN0aW5hdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBHRVQgZGVzdGluYXRpb25zIGxpc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXRNb2NrUmVzcG9uc2UoMjAwLCB7IGNvbnRlbnQ6IFtkZXN0UmVzcG9uc2VdLCB0b3RhbEVsZW1lbnRzOiAxLCB0b3RhbFBhZ2VzOiAxLCBzaXplOiAyMCwgbnVtYmVyOiAwIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdTb3VyY2VzLmxpc3REZXN0aW5hdGlvbnMocHJvamVjdElkLCBzb3VyY2VJZCk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ0dFVCcpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9CZShcbiAgICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXMvJHtzb3VyY2VJZH0vZGVzdGluYXRpb25zYFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuY29udGVudCkudG9IYXZlTGVuZ3RoKDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXBkYXRlRGVzdGluYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBQVVQgd2l0aCB1cGRhdGUgcGFyYW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyAuLi5kZXN0UmVzcG9uc2UsIGVuYWJsZWQ6IGZhbHNlIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdTb3VyY2VzLnVwZGF0ZURlc3RpbmF0aW9uKHByb2plY3RJZCwgc291cmNlSWQsIGRlc3RJZCwge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdQVVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoXG4gICAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzLyR7c291cmNlSWR9L2Rlc3RpbmF0aW9ucy8ke2Rlc3RJZH1gXG4gICAgICApO1xuICAgICAgZXhwZWN0KHJlc3VsdC5lbmFibGVkKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlbGV0ZURlc3RpbmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgREVMRVRFIGRlc3RpbmF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwNCwgJycpO1xuXG4gICAgICBhd2FpdCBjbGllbnQuaW5jb21pbmdTb3VyY2VzLmRlbGV0ZURlc3RpbmF0aW9uKHByb2plY3RJZCwgc291cmNlSWQsIGRlc3RJZCk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ0RFTEVURScpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9CZShcbiAgICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXMvJHtzb3VyY2VJZH0vZGVzdGluYXRpb25zLyR7ZGVzdElkfWBcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdJbmNvbWluZ0V2ZW50cycsICgpID0+IHtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlQ2xpZW50KCk7XG4gIGNvbnN0IHByb2plY3RJZCA9ICdwcm9qLTEyMyc7XG4gIGNvbnN0IGV2ZW50SWQgPSAnZXZ0LWFiYyc7XG5cbiAgY29uc3QgZXZlbnRSZXNwb25zZSA9IHtcbiAgICBpZDogZXZlbnRJZCxcbiAgICBpbmNvbWluZ1NvdXJjZUlkOiAnc3JjLTQ1NicsXG4gICAgc291cmNlTmFtZTogJ1N0cmlwZSBXZWJob29rcycsXG4gICAgcmVxdWVzdElkOiAncmVxLXh5eicsXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgcGF0aDogJy9pbmdyZXNzL3Rva19hYmMnLFxuICAgIGJvZHlSYXc6ICd7XCJ0eXBlXCI6XCJjaGVja291dC5zZXNzaW9uLmNvbXBsZXRlZFwifScsXG4gICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICByZWNlaXZlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICB9O1xuXG4gIGRlc2NyaWJlKCdsaXN0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgR0VUIGV2ZW50cyB3aXRob3V0IHBhcmFtcycsIGFzeW5jICgpID0+IHtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIHsgY29udGVudDogW2V2ZW50UmVzcG9uc2VdLCB0b3RhbEVsZW1lbnRzOiAxLCB0b3RhbFBhZ2VzOiAxLCBzaXplOiAyMCwgbnVtYmVyOiAwIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdFdmVudHMubGlzdChwcm9qZWN0SWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdHRVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLWV2ZW50c2ApO1xuICAgICAgZXhwZWN0KHJlc3VsdC5jb250ZW50KS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRbMF0ucmVxdWVzdElkKS50b0JlKCdyZXEteHl6Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhc3Mgc291cmNlSWQgZmlsdGVyIGFzIHF1ZXJ5IHBhcmFtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyBjb250ZW50OiBbXSwgdG90YWxFbGVtZW50czogMCwgdG90YWxQYWdlczogMCwgc2l6ZTogMjAsIG51bWJlcjogMCB9KTtcblxuICAgICAgYXdhaXQgY2xpZW50LmluY29taW5nRXZlbnRzLmxpc3QocHJvamVjdElkLCB7IHNvdXJjZUlkOiAnc3JjLTQ1NicgfSk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQ29udGFpbignc291cmNlSWQ9c3JjLTQ1NicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIHBhZ2luYXRpb24gcGFyYW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyBjb250ZW50OiBbXSwgdG90YWxFbGVtZW50czogMCwgdG90YWxQYWdlczogMCwgc2l6ZTogMTAsIG51bWJlcjogMiB9KTtcblxuICAgICAgYXdhaXQgY2xpZW50LmluY29taW5nRXZlbnRzLmxpc3QocHJvamVjdElkLCB7IHBhZ2U6IDIsIHNpemU6IDEwIH0pO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QudXJsKS50b0NvbnRhaW4oJ3BhZ2U9MicpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9Db250YWluKCdzaXplPTEwJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBHRVQgZXZlbnQgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXRNb2NrUmVzcG9uc2UoMjAwLCBldmVudFJlc3BvbnNlKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmluY29taW5nRXZlbnRzLmdldChwcm9qZWN0SWQsIGV2ZW50SWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdHRVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLWV2ZW50cy8ke2V2ZW50SWR9YCk7XG4gICAgICBleHBlY3QocmVzdWx0LnZlcmlmaWVkKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5tZXRob2QpLnRvQmUoJ1BPU1QnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEF0dGVtcHRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgR0VUIGZvcndhcmQgYXR0ZW1wdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhdHRlbXB0UmVzcG9uc2UgPSB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgaWQ6ICdhdHQtMScsXG4gICAgICAgICAgaW5jb21pbmdFdmVudElkOiBldmVudElkLFxuICAgICAgICAgIGRlc3RpbmF0aW9uSWQ6ICdkZXN0LTc4OScsXG4gICAgICAgICAgZGVzdGluYXRpb25Vcmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJob29rcy9zdHJpcGUnLFxuICAgICAgICAgIGF0dGVtcHROdW1iZXI6IDEsXG4gICAgICAgICAgc3RhdHVzOiAnU1VDQ0VTUycsXG4gICAgICAgICAgc3RhcnRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGZpbmlzaGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAxWicsXG4gICAgICAgICAgcmVzcG9uc2VDb2RlOiAyMDAsXG4gICAgICAgICAgcmVzcG9uc2VCb2R5U25pcHBldDogJ09LJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWicsXG4gICAgICAgIH1dLFxuICAgICAgICB0b3RhbEVsZW1lbnRzOiAxLFxuICAgICAgICB0b3RhbFBhZ2VzOiAxLFxuICAgICAgICBzaXplOiAyMCxcbiAgICAgICAgbnVtYmVyOiAwLFxuICAgICAgfTtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIGF0dGVtcHRSZXNwb25zZSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5pbmNvbWluZ0V2ZW50cy5nZXRBdHRlbXB0cyhwcm9qZWN0SWQsIGV2ZW50SWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdHRVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLWV2ZW50cy8ke2V2ZW50SWR9L2F0dGVtcHRzYCk7XG4gICAgICBleHBlY3QocmVzdWx0LmNvbnRlbnQpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuY29udGVudFswXS5yZXNwb25zZUNvZGUpLnRvQmUoMjAwKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuY29udGVudFswXS5zdGF0dXMpLnRvQmUoJ1NVQ0NFU1MnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuY29udGVudFswXS5hdHRlbXB0TnVtYmVyKS50b0JlKDEpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5jb250ZW50WzBdLmRlc3RpbmF0aW9uVXJsKS50b0JlKCdodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJob29rcy9zdHJpcGUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlcGxheScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIFBPU1QgcmVwbGF5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyBzdGF0dXM6ICdyZXBsYXllZCcsIGV2ZW50SWQsIGRlc3RpbmF0aW9uc0NvdW50OiAyIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdFdmVudHMucmVwbGF5KHByb2plY3RJZCwgZXZlbnRJZCk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ1BPU1QnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLWV2ZW50cy8ke2V2ZW50SWR9L3JlcGxheWApO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zdGF0dXMpLnRvQmUoJ3JlcGxheWVkJyk7XG4gICAgICBleHBlY3QocmVzdWx0LmRlc3RpbmF0aW9uc0NvdW50KS50b0JlKDIpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnQ2xpZW50IGluaXRpYWxpemF0aW9uIGluY2x1ZGVzIGluY29taW5nIG1vZHVsZXMnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgaGF2ZSBpbmNvbWluZ1NvdXJjZXMgYW5kIGluY29taW5nRXZlbnRzJywgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBSYWlsaG9vayh7IGFwaUtleTogJ3Rlc3Rfa2V5JyB9KTtcbiAgICBleHBlY3QoY2xpZW50LmluY29taW5nU291cmNlcykudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoY2xpZW50LmluY29taW5nRXZlbnRzKS50b0JlRGVmaW5lZCgpO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const node_1 = require("@railhook/node");
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
5
|
+
const pkg = require('../../package.json');
|
|
6
|
+
// Guards the published identity of this SDK: the manifest name and the export
|
|
7
|
+
// surface a consumer gets from `npm install @railhook/node` must not
|
|
8
|
+
// drift apart.
|
|
9
|
+
describe('package identity (@railhook/node)', () => {
|
|
10
|
+
it('is published under the @railhook/node package name', () => {
|
|
11
|
+
expect(pkg.name).toBe('@railhook/node');
|
|
12
|
+
});
|
|
13
|
+
it('smoke: importing "@railhook/node" constructs a working client', () => {
|
|
14
|
+
const client = new node_1.Railhook({ apiKey: 'test_api_key' });
|
|
15
|
+
expect(client).toBeInstanceOf(node_1.Railhook);
|
|
16
|
+
expect(client.events).toBeDefined();
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1pZGVudGl0eS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9wYWNrYWdlLWlkZW50aXR5LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBMEM7QUFDMUMsOERBQThEO0FBQzlELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRTFDLDhFQUE4RTtBQUM5RSxxRUFBcUU7QUFDckUsZUFBZTtBQUNmLFFBQVEsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7SUFDakQsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEdBQUcsRUFBRTtRQUN2RSxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUMsZUFBUSxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmFpbGhvb2sgfSBmcm9tICdAcmFpbGhvb2svbm9kZSc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgcGtnID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5cbi8vIEd1YXJkcyB0aGUgcHVibGlzaGVkIGlkZW50aXR5IG9mIHRoaXMgU0RLOiB0aGUgbWFuaWZlc3QgbmFtZSBhbmQgdGhlIGV4cG9ydFxuLy8gc3VyZmFjZSBhIGNvbnN1bWVyIGdldHMgZnJvbSBgbnBtIGluc3RhbGwgQHJhaWxob29rL25vZGVgIG11c3Qgbm90XG4vLyBkcmlmdCBhcGFydC5cbmRlc2NyaWJlKCdwYWNrYWdlIGlkZW50aXR5IChAcmFpbGhvb2svbm9kZSknLCAoKSA9PiB7XG4gIGl0KCdpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIEByYWlsaG9vay9ub2RlIHBhY2thZ2UgbmFtZScsICgpID0+IHtcbiAgICBleHBlY3QocGtnLm5hbWUpLnRvQmUoJ0ByYWlsaG9vay9ub2RlJyk7XG4gIH0pO1xuXG4gIGl0KCdzbW9rZTogaW1wb3J0aW5nIFwiQHJhaWxob29rL25vZGVcIiBjb25zdHJ1Y3RzIGEgd29ya2luZyBjbGllbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJhaWxob29rKHsgYXBpS2V5OiAndGVzdF9hcGlfa2V5JyB9KTtcbiAgICBleHBlY3QoY2xpZW50KS50b0JlSW5zdGFuY2VPZihSYWlsaG9vayk7XG4gICAgZXhwZWN0KGNsaWVudC5ldmVudHMpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const webhooks_1 = require("../webhooks");
|
|
37
|
+
const errors_1 = require("../errors");
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
39
|
+
/**
|
|
40
|
+
* The point of this scheme is that a receiver can verify with a library they already have,
|
|
41
|
+
* so the first test is the reference algorithm rather than a round-trip against ourselves —
|
|
42
|
+
* a round-trip would only prove we agree with our own bug.
|
|
43
|
+
*/
|
|
44
|
+
describe('verifyStandardWebhook', () => {
|
|
45
|
+
const id = 'msg_p5jXN8AQM9LWM0D4loKWxJek';
|
|
46
|
+
const payload = '{"test": 2432232314}';
|
|
47
|
+
const secretB64 = 'MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw';
|
|
48
|
+
const sharedSecret = `whsec_${secretB64}`;
|
|
49
|
+
/** Exactly what the reference libraries do: hmac(b64decode(secret), `${id}.${ts}.${body}`). */
|
|
50
|
+
const sign = (ts, secret = secretB64) => crypto
|
|
51
|
+
.createHmac('sha256', Buffer.from(secret, 'base64'))
|
|
52
|
+
.update(`${id}.${ts}.${payload}`)
|
|
53
|
+
.digest('base64');
|
|
54
|
+
const headers = (ts, signature) => ({
|
|
55
|
+
'webhook-id': id,
|
|
56
|
+
'webhook-timestamp': String(ts),
|
|
57
|
+
'webhook-signature': signature,
|
|
58
|
+
});
|
|
59
|
+
it('accepts a signature produced the way the reference libraries produce one', () => {
|
|
60
|
+
const ts = Math.floor(Date.now() / 1000);
|
|
61
|
+
expect((0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, `v1,${sign(ts)}`), sharedSecret)).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('accepts either signature during a secret rotation', () => {
|
|
64
|
+
const ts = Math.floor(Date.now() / 1000);
|
|
65
|
+
const retired = 'b2xkLXNlY3JldC1ieXRlcy1oZXJlLXBhZGRpbmc=';
|
|
66
|
+
// What Railhook sends through the grace window: one signature per valid secret.
|
|
67
|
+
const header = `v1,${sign(ts)} v1,${sign(ts, retired)}`;
|
|
68
|
+
expect((0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, header), sharedSecret)).toBe(true);
|
|
69
|
+
expect((0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, header), `whsec_${retired}`)).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
it('rejects a replayed request even though its signature is still valid', () => {
|
|
72
|
+
// A signature over a fixed body never expires by itself, so without the timestamp check
|
|
73
|
+
// a captured request stays replayable for as long as the secret lives.
|
|
74
|
+
const old = Math.floor(Date.now() / 1000) - 3600;
|
|
75
|
+
expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, headers(old, `v1,${sign(old)}`), sharedSecret))
|
|
76
|
+
.toThrow(errors_1.RailhookError);
|
|
77
|
+
});
|
|
78
|
+
it('rejects a signature lifted from a different message', () => {
|
|
79
|
+
const ts = Math.floor(Date.now() / 1000);
|
|
80
|
+
const forAnotherMessage = crypto
|
|
81
|
+
.createHmac('sha256', Buffer.from(secretB64, 'base64'))
|
|
82
|
+
.update(`msg_somethingelse.${ts}.${payload}`)
|
|
83
|
+
.digest('base64');
|
|
84
|
+
expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, `v1,${forAnotherMessage}`), sharedSecret)).toThrow(errors_1.RailhookError);
|
|
85
|
+
});
|
|
86
|
+
it('rejects a tampered body', () => {
|
|
87
|
+
const ts = Math.floor(Date.now() / 1000);
|
|
88
|
+
expect(() => (0, webhooks_1.verifyStandardWebhook)('{"test": 1}', headers(ts, `v1,${sign(ts)}`), sharedSecret)).toThrow(errors_1.RailhookError);
|
|
89
|
+
});
|
|
90
|
+
it('reports missing headers rather than treating them as unsigned', () => {
|
|
91
|
+
const ts = Math.floor(Date.now() / 1000);
|
|
92
|
+
expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, { 'webhook-id': id }, sharedSecret))
|
|
93
|
+
.toThrow(errors_1.RailhookError);
|
|
94
|
+
expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, { ...headers(ts, `v1,${sign(ts)}`), 'webhook-id': undefined }, sharedSecret)).toThrow(errors_1.RailhookError);
|
|
95
|
+
});
|
|
96
|
+
it('ignores signature entries of an unknown version', () => {
|
|
97
|
+
const ts = Math.floor(Date.now() / 1000);
|
|
98
|
+
expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, `v2,${sign(ts)}`), sharedSecret))
|
|
99
|
+
.toThrow(errors_1.RailhookError);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRXZWJob29rcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9zdGFuZGFyZFdlYmhvb2tzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBb0Q7QUFDcEQsc0NBQTBDO0FBQzFDLCtDQUFpQztBQUVqQzs7OztHQUlHO0FBQ0gsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxNQUFNLEVBQUUsR0FBRyw4QkFBOEIsQ0FBQztJQUMxQyxNQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQztJQUN2QyxNQUFNLFNBQVMsR0FBRyxrQ0FBa0MsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBRyxTQUFTLFNBQVMsRUFBRSxDQUFDO0lBRTFDLCtGQUErRjtJQUMvRixNQUFNLElBQUksR0FBRyxDQUFDLEVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FDOUMsTUFBTTtTQUNILFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDbkQsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQztTQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFdEIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFVLEVBQUUsU0FBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRCxZQUFZLEVBQUUsRUFBRTtRQUNoQixtQkFBbUIsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQy9CLG1CQUFtQixFQUFFLFNBQVM7S0FDL0IsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBFQUEwRSxFQUFFLEdBQUcsRUFBRTtRQUNsRixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxH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Li4vd2ViaG9va3MnO1xuaW1wb3J0IHsgUmFpbGhvb2tFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcblxuLyoqXG4gKiBUaGUgcG9pbnQgb2YgdGhpcyBzY2hlbWUgaXMgdGhhdCBhIHJlY2VpdmVyIGNhbiB2ZXJpZnkgd2l0aCBhIGxpYnJhcnkgdGhleSBhbHJlYWR5IGhhdmUsXG4gKiBzbyB0aGUgZmlyc3QgdGVzdCBpcyB0aGUgcmVmZXJlbmNlIGFsZ29yaXRobSByYXRoZXIgdGhhbiBhIHJvdW5kLXRyaXAgYWdhaW5zdCBvdXJzZWx2ZXMg4oCUXG4gKiBhIHJvdW5kLXRyaXAgd291bGQgb25seSBwcm92ZSB3ZSBhZ3JlZSB3aXRoIG91ciBvd24gYnVnLlxuICovXG5kZXNjcmliZSgndmVyaWZ5U3RhbmRhcmRXZWJob29rJywgKCkgPT4ge1xuICBjb25zdCBpZCA9ICdtc2dfcDVqWE44QVFNOUxXTTBENGxvS1d4SmVrJztcbiAgY29uc3QgcGF5bG9hZCA9ICd7XCJ0ZXN0XCI6IDI0MzIyMzIzMTR9JztcbiAgY29uc3Qgc2VjcmV0QjY0ID0gJ01mS1E5cjhHS1lxclR3alVQRDhJTFBaSW8yTGFMYVN3JztcbiAgY29uc3Qgc2hhcmVkU2VjcmV0ID0gYHdoc2VjXyR7c2VjcmV0QjY0fWA7XG5cbiAgLyoqIEV4YWN0bHkgd2hhdCB0aGUgcmVmZXJlbmNlIGxpYnJhcmllcyBkbzogaG1hYyhiNjRkZWNvZGUoc2VjcmV0KSwgYCR7aWR9LiR7dHN9LiR7Ym9keX1gKS4gKi9cbiAgY29uc3Qgc2lnbiA9ICh0czogbnVtYmVyLCBzZWNyZXQgPSBzZWNyZXRCNjQpID0+XG4gICAgY3J5cHRvXG4gICAgICAuY3JlYXRlSG1hYygnc2hhMjU2JywgQnVmZmVyLmZyb20oc2VjcmV0LCAnYmFzZTY0JykpXG4gICAgICAudXBkYXRlKGAke2lkfS4ke3RzfS4ke3BheWxvYWR9YClcbiAgICAgIC5kaWdlc3QoJ2Jhc2U2NCcpO1xuXG4gIGNvbnN0IGhlYWRlcnMgPSAodHM6IG51bWJlciwgc2lnbmF0dXJlOiBzdHJpbmcpID0+ICh7XG4gICAgJ3dlYmhvb2staWQnOiBpZCxcbiAgICAnd2ViaG9vay10aW1lc3RhbXAnOiBTdHJpbmcodHMpLFxuICAgICd3ZWJob29rLXNpZ25hdHVyZSc6IHNpZ25hdHVyZSxcbiAgfSk7XG5cbiAgaXQoJ2FjY2VwdHMgYSBzaWduYXR1cmUgcHJvZHVjZWQgdGhlIHdheSB0aGUgcmVmZXJlbmNlIGxpYnJhcmllcyBwcm9kdWNlIG9uZScsICgpID0+IHtcbiAgICBjb25zdCB0cyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIGV4cGVjdCh2ZXJpZnlTdGFuZGFyZFdlYmhvb2socGF5bG9hZCwgaGVhZGVycyh0cywgYHYxLCR7c2lnbih0cyl9YCksIHNoYXJlZFNlY3JldCkpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdhY2NlcHRzIGVpdGhlciBzaWduYXR1cmUgZHVyaW5nIGEgc2VjcmV0IHJvdGF0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IHRzID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgY29uc3QgcmV0aXJlZCA9ICdiMnhrTFhObFkzSmxkQzFpZVhSbGN5MW9aWEpsTFhCaFpHUnBibWM9JztcbiAgICAvLyBXaGF0IFJhaWxob29rIHNlbmRzIHRocm91Z2ggdGhlIGdyYWNlIHdpbmRvdzogb25lIHNpZ25hdHVyZSBwZXIgdmFsaWQgc2VjcmV0LlxuICAgIGNvbnN0IGhlYWRlciA9IGB2MSwke3NpZ24odHMpfSB2MSwke3NpZ24odHMsIHJldGlyZWQpfWA7XG5cbiAgICBleHBlY3QodmVyaWZ5U3RhbmRhcmRXZWJob29rKHBheWxvYWQsIGhlYWRlcnModHMsIGhlYWRlciksIHNoYXJlZFNlY3JldCkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KHZlcmlmeVN0YW5kYXJkV2ViaG9vayhwYXlsb2FkLCBoZWFkZXJzKHRzLCBoZWFkZXIpLCBgd2hzZWNfJHtyZXRpcmVkfWApKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIHJlcGxheWVkIHJlcXVlc3QgZXZlbiB0aG91Z2ggaXRzIHNpZ25hdHVyZSBpcyBzdGlsbCB2YWxpZCcsICgpID0+IHtcbiAgICAvLyBBIHNpZ25hdHVyZSBvdmVyIGEgZml4ZWQgYm9keSBuZXZlciBleHBpcmVzIGJ5IGl0c2VsZiwgc28gd2l0aG91dCB0aGUgdGltZXN0YW1wIGNoZWNrXG4gICAgLy8gYSBjYXB0dXJlZCByZXF1ZXN0IHN0YXlzIHJlcGxheWFibGUgZm9yIGFzIGxvbmcgYXMgdGhlIHNlY3JldCBsaXZlcy5cbiAgICBjb25zdCBvbGQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSAtIDM2MDA7XG4gICAgZXhwZWN0KCgpID0+IHZlcmlmeVN0YW5kYXJkV2ViaG9vayhwYXlsb2FkLCBoZWFkZXJzKG9sZCwgYHYxLCR7c2lnbihvbGQpfWApLCBzaGFyZWRTZWNyZXQpKVxuICAgICAgLnRvVGhyb3coUmFpbGhvb2tFcnJvcik7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgc2lnbmF0dXJlIGxpZnRlZCBmcm9tIGEgZGlmZmVyZW50IG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgdHMgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBjb25zdCBmb3JBbm90aGVyTWVzc2FnZSA9IGNyeXB0b1xuICAgICAgLmNyZWF0ZUhtYWMoJ3NoYTI1NicsIEJ1ZmZlci5mcm9tKHNlY3JldEI2NCwgJ2Jhc2U2NCcpKVxuICAgICAgLnVwZGF0ZShgbXNnX3NvbWV0aGluZ2Vsc2UuJHt0c30uJHtwYXlsb2FkfWApXG4gICAgICAuZGlnZXN0KCdiYXNlNjQnKTtcblxuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgdmVyaWZ5U3RhbmRhcmRXZWJob29rKHBheWxvYWQsIGhlYWRlcnModHMsIGB2MSwke2ZvckFub3RoZXJNZXNzYWdlfWApLCBzaGFyZWRTZWNyZXQpXG4gICAgKS50b1Rocm93KFJhaWxob29rRXJyb3IpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIHRhbXBlcmVkIGJvZHknLCAoKSA9PiB7XG4gICAgY29uc3QgdHMgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHZlcmlmeVN0YW5kYXJkV2ViaG9vaygne1widGVzdFwiOiAxfScsIGhlYWRlcnModHMsIGB2MSwke3NpZ24odHMpfWApLCBzaGFyZWRTZWNyZXQpXG4gICAgKS50b1Rocm93KFJhaWxob29rRXJyb3IpO1xuICB9KTtcblxuICBpdCgncmVwb3J0cyBtaXNzaW5nIGhlYWRlcnMgcmF0aGVyIHRoYW4gdHJlYXRpbmcgdGhlbSBhcyB1bnNpZ25lZCcsICgpID0+IHtcbiAgICBjb25zdCB0cyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIGV4cGVjdCgoKSA9PiB2ZXJpZnlTdGFuZGFyZFdlYmhvb2socGF5bG9hZCwgeyAnd2ViaG9vay1pZCc6IGlkIH0sIHNoYXJlZFNlY3JldCkpXG4gICAgICAudG9UaHJvdyhSYWlsaG9va0Vycm9yKTtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHZlcmlmeVN0YW5kYXJkV2ViaG9vayhwYXlsb2FkLCB7IC4uLmhlYWRlcnModHMsIGB2MSwke3NpZ24odHMpfWApLCAnd2ViaG9vay1pZCc6IHVuZGVmaW5lZCB9LCBzaGFyZWRTZWNyZXQpXG4gICAgKS50b1Rocm93KFJhaWxob29rRXJyb3IpO1xuICB9KTtcblxuICBpdCgnaWdub3JlcyBzaWduYXR1cmUgZW50cmllcyBvZiBhbiB1bmtub3duIHZlcnNpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgdHMgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBleHBlY3QoKCkgPT4gdmVyaWZ5U3RhbmRhcmRXZWJob29rKHBheWxvYWQsIGhlYWRlcnModHMsIGB2Miwke3NpZ24odHMpfWApLCBzaGFyZWRTZWNyZXQpKVxuICAgICAgLnRvVGhyb3coUmFpbGhvb2tFcnJvcik7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|