@openhi/constructs 0.0.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 +3 -0
- package/lib/app/index.d.ts +4 -0
- package/lib/app/index.js +21 -0
- package/lib/app/open-hi-app.d.ts +85 -0
- package/lib/app/open-hi-app.js +127 -0
- package/lib/app/open-hi-environment.d.ts +59 -0
- package/lib/app/open-hi-environment.js +72 -0
- package/lib/app/open-hi-service.d.ts +169 -0
- package/lib/app/open-hi-service.js +195 -0
- package/lib/app/open-hi-stage.d.ts +71 -0
- package/lib/app/open-hi-stage.js +70 -0
- package/lib/components/acm/root-wildcard-certificate.d.ts +15 -0
- package/lib/components/acm/root-wildcard-certificate.js +35 -0
- package/lib/components/api-gateway/core-http-api.d.ts +10 -0
- package/lib/components/api-gateway/core-http-api.js +44 -0
- package/lib/components/api-gateway/http-lambda-integration-no-permissions.d.ts +18 -0
- package/lib/components/api-gateway/http-lambda-integration-no-permissions.js +26 -0
- package/lib/components/app-sync/core-graphql-api.d.ts +12 -0
- package/lib/components/app-sync/core-graphql-api.js +54 -0
- package/lib/components/auth.d.ts +75 -0
- package/lib/components/auth.js +100 -0
- package/lib/components/cognito/core-user-pool-client.d.ts +10 -0
- package/lib/components/cognito/core-user-pool-client.js +47 -0
- package/lib/components/cognito/core-user-pool-domain.d.ts +10 -0
- package/lib/components/cognito/core-user-pool-domain.js +41 -0
- package/lib/components/cognito/core-user-pool-kms-key.d.ts +10 -0
- package/lib/components/cognito/core-user-pool-kms-key.js +37 -0
- package/lib/components/cognito/core-user-pool.d.ts +10 -0
- package/lib/components/cognito/core-user-pool.js +54 -0
- package/lib/components/core.d.ts +102 -0
- package/lib/components/core.js +79 -0
- package/lib/components/dynamodb/dynamo-db-data-store.d.ts +33 -0
- package/lib/components/dynamodb/dynamo-db-data-store.js +107 -0
- package/lib/components/event-bridge/data-event-bus.d.ts +19 -0
- package/lib/components/event-bridge/data-event-bus.js +34 -0
- package/lib/components/event-bridge/ops-event-bus.d.ts +19 -0
- package/lib/components/event-bridge/ops-event-bus.js +34 -0
- package/lib/components/global.d.ts +36 -0
- package/lib/components/global.js +63 -0
- package/lib/components/index.d.ts +1 -0
- package/lib/components/index.js +18 -0
- package/lib/components/route-53/child-hosted-zone.d.ts +20 -0
- package/lib/components/route-53/child-hosted-zone.js +48 -0
- package/lib/components/route-53/root-hosted-zone.d.ts +10 -0
- package/lib/components/route-53/root-hosted-zone.js +20 -0
- package/lib/components/ssm/discoverable-string-parameter.d.ts +59 -0
- package/lib/components/ssm/discoverable-string-parameter.js +50 -0
- package/lib/components/ssm/index.d.ts +1 -0
- package/lib/components/ssm/index.js +18 -0
- package/lib/data/dynamo/ehr/r4/Patient.d.ts +180 -0
- package/lib/data/dynamo/ehr/r4/Patient.js +192 -0
- package/lib/data/dynamo/ehr/r4/ehr-r4-data-service.d.ts +162 -0
- package/lib/data/dynamo/ehr/r4/ehr-r4-data-service.js +37 -0
- package/lib/data/hello-world.d.ts +39 -0
- package/lib/data/hello-world.js +59 -0
- package/lib/data/import-patient-with-dynalite.d.ts +1 -0
- package/lib/data/import-patient-with-dynalite.js +87 -0
- package/lib/data/import-patient.d.ts +47 -0
- package/lib/data/import-patient.js +158 -0
- package/lib/data/lambda/rest-api-lambda.d.ts +13 -0
- package/lib/data/lambda/rest-api-lambda.handler.d.ts +1 -0
- package/lib/data/lambda/rest-api-lambda.handler.js +10 -0
- package/lib/data/lambda/rest-api-lambda.js +22 -0
- package/lib/data/middleware/open-hi-context.d.ts +13 -0
- package/lib/data/middleware/open-hi-context.js +31 -0
- package/lib/data/rest-api/ehr/r4/Patient.d.ts +16 -0
- package/lib/data/rest-api/ehr/r4/Patient.js +234 -0
- package/lib/data/rest-api/rest-api-local.d.ts +1 -0
- package/lib/data/rest-api/rest-api-local.js +8 -0
- package/lib/data/rest-api/rest-api-mockdata.d.ts +7 -0
- package/lib/data/rest-api/rest-api-mockdata.js +585 -0
- package/lib/data/rest-api/rest-api.d.ts +3 -0
- package/lib/data/rest-api/rest-api.js +26 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +20 -0
- package/lib/lib/compression.d.ts +27 -0
- package/lib/lib/compression.js +87 -0
- package/lib/services/index.d.ts +5 -0
- package/lib/services/index.js +22 -0
- package/lib/services/open-hi-auth-service.d.ts +31 -0
- package/lib/services/open-hi-auth-service.js +31 -0
- package/lib/services/open-hi-core-service.d.ts +15 -0
- package/lib/services/open-hi-core-service.js +38 -0
- package/lib/services/open-hi-data-service.d.ts +18 -0
- package/lib/services/open-hi-data-service.js +18 -0
- package/lib/services/open-hi-global-service.d.ts +15 -0
- package/lib/services/open-hi-global-service.js +44 -0
- package/lib/services/open-hi-rest-api-service.d.ts +17 -0
- package/lib/services/open-hi-rest-api-service.js +107 -0
- package/package.json +67 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.patientRouter = void 0;
|
|
7
|
+
exports.listPatients = listPatients;
|
|
8
|
+
exports.getPatientById = getPatientById;
|
|
9
|
+
exports.createPatient = createPatient;
|
|
10
|
+
exports.updatePatient = updatePatient;
|
|
11
|
+
exports.deletePatient = deletePatient;
|
|
12
|
+
const express_1 = __importDefault(require("express"));
|
|
13
|
+
const compression_1 = require("../../../../lib/compression");
|
|
14
|
+
const ehr_r4_data_service_1 = require("../../../dynamo/ehr/r4/ehr-r4-data-service");
|
|
15
|
+
const import_patient_1 = require("../../../import-patient");
|
|
16
|
+
const BASE_PATH = "/ehr/r4/Patient";
|
|
17
|
+
const router = express_1.default.Router();
|
|
18
|
+
exports.patientRouter = router;
|
|
19
|
+
const SK = "CURRENT";
|
|
20
|
+
const TABLE_NAME = process.env.DYNAMO_TABLE_NAME ?? "jesttesttable";
|
|
21
|
+
/**
|
|
22
|
+
* GET /ehr/r4/Patient — search/list: returns a FHIR Bundle (searchset) from the data store.
|
|
23
|
+
* Uses GSI4 (Resource Type Index) to list all Patients in the workspace without a table scan.
|
|
24
|
+
* @see {@link https://github.com/codedrifters/openhi/blob/main/sites/www-docs/content/architecture/dynamodb-single-table-design.md | DynamoDB Single-Table Design} — GSI4, Query and Access Rules (no scans).
|
|
25
|
+
*/
|
|
26
|
+
async function listPatients(req, res) {
|
|
27
|
+
const { tenantId, workspaceId } = req.openhiContext;
|
|
28
|
+
const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
|
|
29
|
+
try {
|
|
30
|
+
const result = await service.entities.patient.query
|
|
31
|
+
.gsi4({ tenantId, workspaceId })
|
|
32
|
+
.go();
|
|
33
|
+
const entries = (result.data ?? []).map((item) => {
|
|
34
|
+
const resource = JSON.parse((0, compression_1.decompressResource)(item.resource));
|
|
35
|
+
return {
|
|
36
|
+
fullUrl: `${BASE_PATH}/${item.id}`,
|
|
37
|
+
resource: { ...resource, id: item.id },
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
const bundle = {
|
|
41
|
+
resourceType: "Bundle",
|
|
42
|
+
type: "searchset",
|
|
43
|
+
total: entries.length,
|
|
44
|
+
link: [{ relation: "self", url: BASE_PATH }],
|
|
45
|
+
entry: entries,
|
|
46
|
+
};
|
|
47
|
+
return res.json(bundle);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.error("GET /Patient list error:", err);
|
|
51
|
+
return res.status(500).json({
|
|
52
|
+
resourceType: "OperationOutcome",
|
|
53
|
+
issue: [
|
|
54
|
+
{
|
|
55
|
+
severity: "error",
|
|
56
|
+
code: "exception",
|
|
57
|
+
diagnostics: String(err),
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
router.get("/", listPatients);
|
|
64
|
+
async function getPatientById(req, res) {
|
|
65
|
+
const id = String(req.params.id);
|
|
66
|
+
const { tenantId, workspaceId } = req.openhiContext;
|
|
67
|
+
const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
|
|
68
|
+
try {
|
|
69
|
+
const result = await service.entities.patient
|
|
70
|
+
.get({ tenantId, workspaceId, id, sk: "CURRENT" })
|
|
71
|
+
.go();
|
|
72
|
+
if (!result.data) {
|
|
73
|
+
return res.status(404).json({
|
|
74
|
+
resourceType: "OperationOutcome",
|
|
75
|
+
issue: [
|
|
76
|
+
{
|
|
77
|
+
severity: "error",
|
|
78
|
+
code: "not-found",
|
|
79
|
+
diagnostics: `Patient ${id} not found`,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const resource = JSON.parse((0, compression_1.decompressResource)(result.data.resource));
|
|
85
|
+
return res.json({ ...resource, id: result.data.id });
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
console.error("GET Patient error:", err);
|
|
89
|
+
return res.status(500).json({
|
|
90
|
+
resourceType: "OperationOutcome",
|
|
91
|
+
issue: [
|
|
92
|
+
{
|
|
93
|
+
severity: "error",
|
|
94
|
+
code: "exception",
|
|
95
|
+
diagnostics: String(err),
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** GET /ehr/r4/Patient/:id — read: returns a single Patient resource from the data store or 404. */
|
|
102
|
+
router.get("/:id", getPatientById);
|
|
103
|
+
/** POST /ehr/r4/Patient — create: accepts Patient in body, persists via data store, returns 201. */
|
|
104
|
+
async function createPatient(req, res) {
|
|
105
|
+
const ctx = req.openhiContext;
|
|
106
|
+
const { tenantId, workspaceId, date, userId, username } = ctx;
|
|
107
|
+
const body = req.body;
|
|
108
|
+
const id = body?.id ?? `patient-${Date.now()}`;
|
|
109
|
+
const patient = {
|
|
110
|
+
...body,
|
|
111
|
+
resourceType: "Patient",
|
|
112
|
+
id,
|
|
113
|
+
meta: {
|
|
114
|
+
...(body?.meta ?? {}),
|
|
115
|
+
lastUpdated: date,
|
|
116
|
+
versionId: "1",
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
const options = {
|
|
120
|
+
tenantId,
|
|
121
|
+
workspaceId,
|
|
122
|
+
createdDate: date,
|
|
123
|
+
createdById: userId,
|
|
124
|
+
createdByName: username,
|
|
125
|
+
modifiedDate: date,
|
|
126
|
+
modifiedById: userId,
|
|
127
|
+
modifiedByName: username,
|
|
128
|
+
};
|
|
129
|
+
const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
|
|
130
|
+
try {
|
|
131
|
+
const attrs = (0, import_patient_1.patientToPutAttrs)(patient, options);
|
|
132
|
+
await service.entities.patient
|
|
133
|
+
.put(attrs)
|
|
134
|
+
.go();
|
|
135
|
+
return res.status(201).location(`${BASE_PATH}/${id}`).json(patient);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
console.error("POST Patient error:", err);
|
|
139
|
+
return res.status(500).json({
|
|
140
|
+
resourceType: "OperationOutcome",
|
|
141
|
+
issue: [
|
|
142
|
+
{ severity: "error", code: "exception", diagnostics: String(err) },
|
|
143
|
+
],
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
router.post("/", createPatient);
|
|
148
|
+
/** PUT /ehr/r4/Patient/:id — update: accepts Patient in body, persists via data store, returns 200. */
|
|
149
|
+
async function updatePatient(req, res) {
|
|
150
|
+
const id = String(req.params.id);
|
|
151
|
+
const ctx = req.openhiContext;
|
|
152
|
+
const { tenantId, workspaceId, date, userId, username } = ctx;
|
|
153
|
+
const body = req.body;
|
|
154
|
+
const patient = {
|
|
155
|
+
...body,
|
|
156
|
+
resourceType: "Patient",
|
|
157
|
+
id,
|
|
158
|
+
meta: {
|
|
159
|
+
...(body?.meta ?? {}),
|
|
160
|
+
lastUpdated: date,
|
|
161
|
+
versionId: "2",
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
|
|
165
|
+
try {
|
|
166
|
+
const existing = await service.entities.patient
|
|
167
|
+
.get({ tenantId, workspaceId, id, sk: SK })
|
|
168
|
+
.go();
|
|
169
|
+
if (!existing.data) {
|
|
170
|
+
return res.status(404).json({
|
|
171
|
+
resourceType: "OperationOutcome",
|
|
172
|
+
issue: [
|
|
173
|
+
{
|
|
174
|
+
severity: "error",
|
|
175
|
+
code: "not-found",
|
|
176
|
+
diagnostics: `Patient ${id} not found`,
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
const existingMeta = existing.data.resource != null
|
|
182
|
+
? JSON.parse((0, compression_1.decompressResource)(existing.data.resource)).meta
|
|
183
|
+
: undefined;
|
|
184
|
+
const patientWithMeta = {
|
|
185
|
+
...patient,
|
|
186
|
+
meta: (0, import_patient_1.mergeAuditIntoMeta)(patient.meta ?? existingMeta, {
|
|
187
|
+
modifiedDate: date,
|
|
188
|
+
modifiedById: userId,
|
|
189
|
+
modifiedByName: username,
|
|
190
|
+
}),
|
|
191
|
+
};
|
|
192
|
+
await service.entities.patient
|
|
193
|
+
.patch({ tenantId, workspaceId, id, sk: SK })
|
|
194
|
+
.set({
|
|
195
|
+
resource: (0, compression_1.compressResource)(JSON.stringify(patientWithMeta)),
|
|
196
|
+
lastUpdated: date,
|
|
197
|
+
})
|
|
198
|
+
.go();
|
|
199
|
+
return res.json(patientWithMeta);
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
console.error("PUT Patient error:", err);
|
|
203
|
+
return res.status(500).json({
|
|
204
|
+
resourceType: "OperationOutcome",
|
|
205
|
+
issue: [
|
|
206
|
+
{ severity: "error", code: "exception", diagnostics: String(err) },
|
|
207
|
+
],
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
router.put("/:id", updatePatient);
|
|
212
|
+
/** DELETE /ehr/r4/Patient/:id — delete: removes from data store, returns 204. */
|
|
213
|
+
async function deletePatient(req, res) {
|
|
214
|
+
const id = String(req.params.id);
|
|
215
|
+
const { tenantId, workspaceId } = req.openhiContext;
|
|
216
|
+
const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
|
|
217
|
+
try {
|
|
218
|
+
await service.entities.patient
|
|
219
|
+
.delete({ tenantId, workspaceId, id, sk: SK })
|
|
220
|
+
.go();
|
|
221
|
+
return res.status(204).send();
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
console.error("DELETE Patient error:", err);
|
|
225
|
+
return res.status(500).json({
|
|
226
|
+
resourceType: "OperationOutcome",
|
|
227
|
+
issue: [
|
|
228
|
+
{ severity: "error", code: "exception", diagnostics: String(err) },
|
|
229
|
+
],
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
router.delete("/:id", deletePatient);
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0aWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhL3Jlc3QtYXBpL2Voci9yNC9QYXRpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQXVCQSxvQ0EyQ0M7QUFJRCx3Q0EyQ0M7QUFNRCxzQ0ErQ0M7QUFLRCxzQ0F3RUM7QUFLRCxzQ0FzQkM7QUE5UUQsc0RBQXFEO0FBQ3JELDZEQUdxQztBQUNyQyxvRkFBaUY7QUFDakYsNERBSWlDO0FBRWpDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFtQixpQkFBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBcVE3QiwrQkFBYTtBQXBRaEMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDO0FBRXJCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksZUFBZSxDQUFDO0FBRXBFOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsWUFBWSxDQUNoQyxHQUFZLEVBQ1osR0FBYTtJQUViLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlDQUFtQixFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSzthQUNoRCxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUM7YUFDL0IsRUFBRSxFQUFFLENBQUM7UUFFUixNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLGdDQUFrQixF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LE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlDQUFtQixFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQzNCLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUM3QyxFQUFFLEVBQUUsQ0FBQztRQUNSLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsWUFBWSxFQUFFLGtCQUFrQjtZQUNoQyxLQUFLLEVBQUU7Z0JBQ0wsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTthQUNuRTtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXhwcmVzcywgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQge1xuICBjb21wcmVzc1Jlc291cmNlLFxuICBkZWNvbXByZXNzUmVzb3VyY2UsXG59IGZyb20gXCIuLi8uLi8uLi8uLi9saWIvY29tcHJlc3Npb25cIjtcbmltcG9ydCB7IGdldEVoclI0RGF0YVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vZHluYW1vL2Voci9yNC9laHItcjQtZGF0YS1zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBtZXJnZUF1ZGl0SW50b01ldGEsXG4gIHBhdGllbnRUb1B1dEF0dHJzLFxuICB0eXBlIEltcG9ydFBhdGllbnRPcHRpb25zLFxufSBmcm9tIFwiLi4vLi4vLi4vaW1wb3J0LXBhdGllbnRcIjtcblxuY29uc3QgQkFTRV9QQVRIID0gXCIvZWhyL3I0L1BhdGllbnRcIjtcbmNvbnN0IHJvdXRlcjogZXhwcmVzcy5Sb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuY29uc3QgU0sgPSBcIkNVUlJFTlRcIjtcblxuY29uc3QgVEFCTEVfTkFNRSA9IHByb2Nlc3MuZW52LkRZTkFNT19UQUJMRV9OQU1FID8/IFwiamVzdHRlc3R0YWJsZVwiO1xuXG4vKipcbiAqIEdFVCAvZWhyL3I0L1BhdGllbnQg4oCUIHNlYXJjaC9saXN0OiByZXR1cm5zIGEgRkhJUiBCdW5kbGUgKHNlYXJjaHNldCkgZnJvbSB0aGUgZGF0YSBzdG9yZS5cbiAqIFVzZXMgR1NJNCAoUmVzb3VyY2UgVHlwZSBJbmRleCkgdG8gbGlzdCBhbGwgUGF0aWVudHMgaW4gdGhlIHdvcmtzcGFjZSB3aXRob3V0IGEgdGFibGUgc2Nhbi5cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlZHJpZnRlcnMvb3BlbmhpL2Jsb2IvbWFpbi9zaXRlcy93d3ctZG9jcy9jb250ZW50L2FyY2hpdGVjdHVyZS9keW5hbW9kYi1zaW5nbGUtdGFibGUtZGVzaWduLm1kIHwgRHluYW1vREIgU2luZ2xlLVRhYmxlIERlc2lnbn0g4oCUIEdTSTQsIFF1ZXJ5IGFuZCBBY2Nlc3MgUnVsZXMgKG5vIHNjYW5zKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RQYXRpZW50cyhcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB7IHRlbmFudElkLCB3b3Jrc3BhY2VJZCB9ID0gcmVxLm9wZW5oaUNvbnRleHQhO1xuICBjb25zdCBzZXJ2aWNlID0gZ2V0RWhyUjREYXRhU2VydmljZShUQUJMRV9OQU1FKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UuZW50aXRpZXMucGF0aWVudC5xdWVyeVxuICAgICAgLmdzaTQoeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQgfSlcbiAgICAgIC5nbygpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IChyZXN1bHQuZGF0YSA/PyBbXSkubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IEpTT04ucGFyc2UoZGVjb21wcmVzc1Jlc291cmNlKGl0ZW0ucmVzb3VyY2UpKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgdW5rbm93blxuICAgICAgPjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZ1bGxVcmw6IGAke0JBU0VfUEFUSH0vJHtpdGVtLmlkfWAsXG4gICAgICAgIHJlc291cmNlOiB7IC4uLnJlc291cmNlLCBpZDogaXRlbS5pZCB9LFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBidW5kbGUgPSB7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiQnVuZGxlXCIsXG4gICAgICB0eXBlOiBcInNlYXJjaHNldFwiLFxuICAgICAgdG90YWw6IGVudHJpZXMubGVuZ3RoLFxuICAgICAgbGluazogW3sgcmVsYXRpb246IFwic2VsZlwiLCB1cmw6IEJBU0VfUEFUSCB9XSxcbiAgICAgIGVudHJ5OiBlbnRyaWVzLFxuICAgIH07XG4gICAgcmV0dXJuIHJlcy5qc29uKGJ1bmRsZSk7XG4gIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJHRVQgL1BhdGllbnQgbGlzdCBlcnJvcjpcIiwgZXJyKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgcmVzb3VyY2VUeXBlOiBcIk9wZXJhdGlvbk91dGNvbWVcIixcbiAgICAgIGlzc3VlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgIGNvZGU6IFwiZXhjZXB0aW9uXCIsXG4gICAgICAgICAgZGlhZ25vc3RpY3M6IFN0cmluZyhlcnIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG5yb3V0ZXIuZ2V0KFwiL1wiLCBsaXN0UGF0aWVudHMpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGF0aWVudEJ5SWQoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgaWQgPSBTdHJpbmcocmVxLnBhcmFtcy5pZCk7XG4gIGNvbnN0IHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkIH0gPSByZXEub3BlbmhpQ29udGV4dCE7XG4gIGNvbnN0IHNlcnZpY2UgPSBnZXRFaHJSNERhdGFTZXJ2aWNlKFRBQkxFX05BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5lbnRpdGllcy5wYXRpZW50XG4gICAgICAuZ2V0KHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkLCBpZCwgc2s6IFwiQ1VSUkVOVFwiIH0pXG4gICAgICAuZ28oKTtcblxuICAgIGlmICghcmVzdWx0LmRhdGEpIHtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7XG4gICAgICAgIHJlc291cmNlVHlwZTogXCJPcGVyYXRpb25PdXRjb21lXCIsXG4gICAgICAgIGlzc3VlOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgICAgICAgIGNvZGU6IFwibm90LWZvdW5kXCIsXG4gICAgICAgICAgICBkaWFnbm9zdGljczogYFBhdGllbnQgJHtpZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBKU09OLnBhcnNlKFxuICAgICAgZGVjb21wcmVzc1Jlc291cmNlKHJlc3VsdC5kYXRhLnJlc291cmNlKSxcbiAgICApIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiByZXMuanNvbih7IC4uLnJlc291cmNlLCBpZDogcmVzdWx0LmRhdGEuaWQgfSk7XG4gIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJHRVQgUGF0aWVudCBlcnJvcjpcIiwgZXJyKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgcmVzb3VyY2VUeXBlOiBcIk9wZXJhdGlvbk91dGNvbWVcIixcbiAgICAgIGlzc3VlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgIGNvZGU6IFwiZXhjZXB0aW9uXCIsXG4gICAgICAgICAgZGlhZ25vc3RpY3M6IFN0cmluZyhlcnIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogR0VUIC9laHIvcjQvUGF0aWVudC86aWQg4oCUIHJlYWQ6IHJldHVybnMgYSBzaW5nbGUgUGF0aWVudCByZXNvdXJjZSBmcm9tIHRoZSBkYXRhIHN0b3JlIG9yIDQwNC4gKi9cbnJvdXRlci5nZXQoXCIvOmlkXCIsIGdldFBhdGllbnRCeUlkKTtcblxuLyoqIFBPU1QgL2Voci9yNC9QYXRpZW50IOKAlCBjcmVhdGU6IGFjY2VwdHMgUGF0aWVudCBpbiBib2R5LCBwZXJzaXN0cyB2aWEgZGF0YSBzdG9yZSwgcmV0dXJucyAyMDEuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGF0aWVudChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjdHggPSByZXEub3BlbmhpQ29udGV4dCE7XG4gIGNvbnN0IHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkLCBkYXRlLCB1c2VySWQsIHVzZXJuYW1lIH0gPSBjdHg7XG4gIGNvbnN0IGJvZHkgPSByZXEuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgaWQgPSAoYm9keT8uaWQgYXMgc3RyaW5nKSA/PyBgcGF0aWVudC0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgcGF0aWVudCA9IHtcbiAgICAuLi5ib2R5LFxuICAgIHJlc291cmNlVHlwZTogXCJQYXRpZW50XCIsXG4gICAgaWQsXG4gICAgbWV0YToge1xuICAgICAgLi4uKChib2R5Py5tZXRhIGFzIG9iamVjdCkgPz8ge30pLFxuICAgICAgbGFzdFVwZGF0ZWQ6IGRhdGUsXG4gICAgICB2ZXJzaW9uSWQ6IFwiMVwiLFxuICAgIH0sXG4gIH0gYXMgeyByZXNvdXJjZVR5cGU6IHN0cmluZzsgaWQ6IHN0cmluZzsgbWV0YT86IHsgbGFzdFVwZGF0ZWQ/OiBzdHJpbmcgfSB9O1xuICBjb25zdCBvcHRpb25zOiBJbXBvcnRQYXRpZW50T3B0aW9ucyA9IHtcbiAgICB0ZW5hbnRJZCxcbiAgICB3b3Jrc3BhY2VJZCxcbiAgICBjcmVhdGVkRGF0ZTogZGF0ZSxcbiAgICBjcmVhdGVkQnlJZDogdXNlcklkLFxuICAgIGNyZWF0ZWRCeU5hbWU6IHVzZXJuYW1lLFxuICAgIG1vZGlmaWVkRGF0ZTogZGF0ZSxcbiAgICBtb2RpZmllZEJ5SWQ6IHVzZXJJZCxcbiAgICBtb2RpZmllZEJ5TmFtZTogdXNlcm5hbWUsXG4gIH07XG4gIGNvbnN0IHNlcnZpY2UgPSBnZXRFaHJSNERhdGFTZXJ2aWNlKFRBQkxFX05BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYXR0cnMgPSBwYXRpZW50VG9QdXRBdHRycyhwYXRpZW50LCBvcHRpb25zKTtcbiAgICBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5wdXQoXG4gICAgICAgIGF0dHJzIGFzIHVua25vd24gYXMgUGFyYW1ldGVyczx0eXBlb2Ygc2VydmljZS5lbnRpdGllcy5wYXRpZW50LnB1dD5bMF0sXG4gICAgICApXG4gICAgICAuZ28oKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDEpLmxvY2F0aW9uKGAke0JBU0VfUEFUSH0vJHtpZH1gKS5qc29uKHBhdGllbnQpO1xuICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiUE9TVCBQYXRpZW50IGVycm9yOlwiLCBlcnIpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiT3BlcmF0aW9uT3V0Y29tZVwiLFxuICAgICAgaXNzdWU6IFtcbiAgICAgICAgeyBzZXZlcml0eTogXCJlcnJvclwiLCBjb2RlOiBcImV4Y2VwdGlvblwiLCBkaWFnbm9zdGljczogU3RyaW5nKGVycikgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cblxucm91dGVyLnBvc3QoXCIvXCIsIGNyZWF0ZVBhdGllbnQpO1xuXG4vKiogUFVUIC9laHIvcjQvUGF0aWVudC86aWQg4oCUIHVwZGF0ZTogYWNjZXB0cyBQYXRpZW50IGluIGJvZHksIHBlcnNpc3RzIHZpYSBkYXRhIHN0b3JlLCByZXR1cm5zIDIwMC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVQYXRpZW50KFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGlkID0gU3RyaW5nKHJlcS5wYXJhbXMuaWQpO1xuICBjb25zdCBjdHggPSByZXEub3BlbmhpQ29udGV4dCE7XG4gIGNvbnN0IHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkLCBkYXRlLCB1c2VySWQsIHVzZXJuYW1lIH0gPSBjdHg7XG4gIGNvbnN0IGJvZHkgPSByZXEuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcGF0aWVudCA9IHtcbiAgICAuLi5ib2R5LFxuICAgIHJlc291cmNlVHlwZTogXCJQYXRpZW50XCIsXG4gICAgaWQsXG4gICAgbWV0YToge1xuICAgICAgLi4uKChib2R5Py5tZXRhIGFzIG9iamVjdCkgPz8ge30pLFxuICAgICAgbGFzdFVwZGF0ZWQ6IGRhdGUsXG4gICAgICB2ZXJzaW9uSWQ6IFwiMlwiLFxuICAgIH0sXG4gIH07XG4gIGNvbnN0IHNlcnZpY2UgPSBnZXRFaHJSNERhdGFTZXJ2aWNlKFRBQkxFX05BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5nZXQoeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQsIGlkLCBzazogU0sgfSlcbiAgICAgIC5nbygpO1xuICAgIGlmICghZXhpc3RpbmcuZGF0YSkge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtcbiAgICAgICAgcmVzb3VyY2VUeXBlOiBcIk9wZXJhdGlvbk91dGNvbWVcIixcbiAgICAgICAgaXNzdWU6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgICAgY29kZTogXCJub3QtZm91bmRcIixcbiAgICAgICAgICAgIGRpYWdub3N0aWNzOiBgUGF0aWVudCAke2lkfSBub3QgZm91bmRgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdNZXRhID1cbiAgICAgIGV4aXN0aW5nLmRhdGEucmVzb3VyY2UgIT0gbnVsbFxuICAgICAgICA/IChcbiAgICAgICAgICAgIEpTT04ucGFyc2UoZGVjb21wcmVzc1Jlc291cmNlKGV4aXN0aW5nLmRhdGEucmVzb3VyY2UpKSBhcyB7XG4gICAgICAgICAgICAgIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLm1ldGFcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGF0aWVudFdpdGhNZXRhID0ge1xuICAgICAgLi4ucGF0aWVudCxcbiAgICAgIG1ldGE6IG1lcmdlQXVkaXRJbnRvTWV0YShcbiAgICAgICAgKHBhdGllbnQubWV0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCkgPz8gZXhpc3RpbmdNZXRhLFxuICAgICAgICB7XG4gICAgICAgICAgbW9kaWZpZWREYXRlOiBkYXRlLFxuICAgICAgICAgIG1vZGlmaWVkQnlJZDogdXNlcklkLFxuICAgICAgICAgIG1vZGlmaWVkQnlOYW1lOiB1c2VybmFtZSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfTtcbiAgICBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5wYXRjaCh7IHRlbmFudElkLCB3b3Jrc3BhY2VJZCwgaWQsIHNrOiBTSyB9KVxuICAgICAgLnNldCh7XG4gICAgICAgIHJlc291cmNlOiBjb21wcmVzc1Jlc291cmNlKEpTT04uc3RyaW5naWZ5KHBhdGllbnRXaXRoTWV0YSkpLFxuICAgICAgICBsYXN0VXBkYXRlZDogZGF0ZSxcbiAgICAgIH0pXG4gICAgICAuZ28oKTtcbiAgICByZXR1cm4gcmVzLmpzb24ocGF0aWVudFdpdGhNZXRhKTtcbiAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlBVVCBQYXRpZW50IGVycm9yOlwiLCBlcnIpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiT3BlcmF0aW9uT3V0Y29tZVwiLFxuICAgICAgaXNzdWU6IFtcbiAgICAgICAgeyBzZXZlcml0eTogXCJlcnJvclwiLCBjb2RlOiBcImV4Y2VwdGlvblwiLCBkaWFnbm9zdGljczogU3RyaW5nKGVycikgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cblxucm91dGVyLnB1dChcIi86aWRcIiwgdXBkYXRlUGF0aWVudCk7XG5cbi8qKiBERUxFVEUgL2Voci9yNC9QYXRpZW50LzppZCDigJQgZGVsZXRlOiByZW1vdmVzIGZyb20gZGF0YSBzdG9yZSwgcmV0dXJucyAyMDQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlUGF0aWVudChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBpZCA9IFN0cmluZyhyZXEucGFyYW1zLmlkKTtcbiAgY29uc3QgeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQgfSA9IHJlcS5vcGVuaGlDb250ZXh0ITtcbiAgY29uc3Qgc2VydmljZSA9IGdldEVoclI0RGF0YVNlcnZpY2UoVEFCTEVfTkFNRSk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5kZWxldGUoeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQsIGlkLCBzazogU0sgfSlcbiAgICAgIC5nbygpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDIwNCkuc2VuZCgpO1xuICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiREVMRVRFIFBhdGllbnQgZXJyb3I6XCIsIGVycik7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHJlc291cmNlVHlwZTogXCJPcGVyYXRpb25PdXRjb21lXCIsXG4gICAgICBpc3N1ZTogW1xuICAgICAgICB7IHNldmVyaXR5OiBcImVycm9yXCIsIGNvZGU6IFwiZXhjZXB0aW9uXCIsIGRpYWdub3N0aWNzOiBTdHJpbmcoZXJyKSB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG5yb3V0ZXIuZGVsZXRlKFwiLzppZFwiLCBkZWxldGVQYXRpZW50KTtcblxuZXhwb3J0IHsgcm91dGVyIGFzIHBhdGllbnRSb3V0ZXIgfTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const rest_api_1 = require("./rest-api");
|
|
4
|
+
const port = 3000;
|
|
5
|
+
rest_api_1.app.listen(port, () => {
|
|
6
|
+
console.log(`POC app listening at http://localhost:${port}`);
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1hcGktbG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YS9yZXN0LWFwaS9yZXN0LWFwaS1sb2NhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFpQztBQUVqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7QUFFbEIsY0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMseUNBQXlDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9yZXN0LWFwaVwiO1xuXG5jb25zdCBwb3J0ID0gMzAwMDtcblxuYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBQT0MgYXBwIGxpc3RlbmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKTtcbn0pO1xuIl19
|