@nlabs/reaktor 1.16.0 → 1.18.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 +186 -0
- package/docs/ASSISTANT.md +138 -0
- package/docs/GENERATION.md +29 -2
- package/docs/NATIVE_PUSH.md +56 -0
- package/lib/actions/alfredFaq.d.ts +80 -0
- package/lib/actions/alfredFaq.js +206 -0
- package/lib/actions/contentGeneration.d.ts +4 -1
- package/lib/actions/contentGeneration.js +83 -27
- package/lib/actions/contentGenerationErrors.js +1 -1
- package/lib/actions/conversations.d.ts +1 -1
- package/lib/actions/conversations.js +19 -9
- package/lib/actions/crud.js +26 -1
- package/lib/actions/index.d.ts +2 -0
- package/lib/actions/index.js +3 -1
- package/lib/actions/messages.js +23 -7
- package/lib/actions/phoneSupport.d.ts +18 -0
- package/lib/actions/phoneSupport.js +170 -0
- package/lib/actions/users.js +57 -4
- package/lib/assistant/core.d.ts +53 -0
- package/lib/assistant/core.js +123 -0
- package/lib/assistant/faq.d.ts +26 -0
- package/lib/assistant/faq.js +238 -0
- package/lib/assistant/faqCore.d.ts +23 -0
- package/lib/assistant/faqCore.js +20 -0
- package/lib/assistant/index.d.ts +7 -0
- package/lib/assistant/index.js +5 -0
- package/lib/assistant/service.d.ts +35 -0
- package/lib/assistant/service.js +201 -0
- package/lib/config.js +3 -2
- package/lib/durableChat/conversations.d.ts +62 -0
- package/lib/durableChat/conversations.js +729 -0
- package/lib/durableChat/errors.d.ts +6 -0
- package/lib/durableChat/errors.js +11 -0
- package/lib/durableChat/events.d.ts +22 -0
- package/lib/durableChat/events.js +50 -0
- package/lib/durableChat/index.d.ts +8 -0
- package/lib/durableChat/index.js +10 -0
- package/lib/durableChat/membership.d.ts +24 -0
- package/lib/durableChat/membership.js +85 -0
- package/lib/durableChat/messageTypes.d.ts +76 -0
- package/lib/durableChat/messageTypes.js +3 -0
- package/lib/durableChat/messages.d.ts +16 -0
- package/lib/durableChat/messages.js +257 -0
- package/lib/durableChat/transaction.d.ts +10 -0
- package/lib/durableChat/transaction.js +53 -0
- package/lib/durableChat/types.d.ts +81 -0
- package/lib/durableChat/types.js +3 -0
- package/lib/index.d.ts +4 -4
- package/lib/index.js +5 -3
- package/lib/lambdas/actions/websockets.js +4 -4
- package/lib/nativePush/graphql.d.ts +14 -0
- package/lib/nativePush/graphql.js +105 -0
- package/lib/nativePush/index.d.ts +7 -0
- package/lib/nativePush/index.js +9 -0
- package/lib/nativePush/migrations.d.ts +2 -0
- package/lib/nativePush/migrations.js +36 -0
- package/lib/nativePush/nativePushContract.fixture.d.ts +22 -0
- package/lib/nativePush/nativePushContract.fixture.js +27 -0
- package/lib/nativePush/payload.d.ts +2 -0
- package/lib/nativePush/payload.js +106 -0
- package/lib/nativePush/repository.d.ts +9 -0
- package/lib/nativePush/repository.js +120 -0
- package/lib/nativePush/service.d.ts +2 -0
- package/lib/nativePush/service.js +110 -0
- package/lib/nativePush/snsProvider.d.ts +17 -0
- package/lib/nativePush/snsProvider.js +165 -0
- package/lib/nativePush/types.d.ts +89 -0
- package/lib/nativePush/types.js +3 -0
- package/lib/organizations/accountLifecycle.d.ts +7 -0
- package/lib/organizations/accountLifecycle.js +106 -0
- package/lib/organizations/authorization.d.ts +9 -0
- package/lib/organizations/authorization.js +40 -0
- package/lib/organizations/billing.d.ts +38 -0
- package/lib/organizations/billing.js +277 -0
- package/lib/organizations/billingProvider.d.ts +4 -0
- package/lib/organizations/billingProvider.js +287 -0
- package/lib/organizations/billingUpdates.d.ts +9 -0
- package/lib/organizations/billingUpdates.js +388 -0
- package/lib/organizations/index.d.ts +10 -0
- package/lib/organizations/index.js +12 -0
- package/lib/organizations/mail.d.ts +10 -0
- package/lib/organizations/mail.js +60 -0
- package/lib/organizations/memberDirectory.d.ts +15 -0
- package/lib/organizations/memberDirectory.js +28 -0
- package/lib/organizations/membership.d.ts +19 -0
- package/lib/organizations/membership.js +248 -0
- package/lib/organizations/passwordRecovery.d.ts +9 -0
- package/lib/organizations/passwordRecovery.js +50 -0
- package/lib/organizations/plans.d.ts +6 -0
- package/lib/organizations/plans.js +40 -0
- package/lib/organizations/providerPagination.d.ts +6 -0
- package/lib/organizations/providerPagination.js +23 -0
- package/lib/organizations/reconciliation.d.ts +11 -0
- package/lib/organizations/reconciliation.js +400 -0
- package/lib/organizations/signup.d.ts +25 -0
- package/lib/organizations/signup.js +169 -0
- package/lib/organizations/store.d.ts +25 -0
- package/lib/organizations/store.js +167 -0
- package/lib/organizations/types.d.ts +138 -0
- package/lib/organizations/types.js +3 -0
- package/lib/organizations/verification.d.ts +3 -0
- package/lib/organizations/verification.js +51 -0
- package/package.json +16 -3
package/lib/actions/messages.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
3
|
* All rights reserved. Use is subject to the accompanying commercial LICENSE.
|
|
4
|
-
*/ import { cloneDeep } from '@nlabs/utils/objects/clone';
|
|
4
|
+
*/ /* eslint no-underscore-dangle: ["error", {"allow": ["_id", "_key"]}] -- ArangoDB document identity fields. */ import { cloneDeep } from '@nlabs/utils/objects/clone';
|
|
5
5
|
import { createHash, parseId, parseString } from '@nlabs/utils/parsers/strings';
|
|
6
6
|
import { aql } from 'arangojs';
|
|
7
7
|
import { literal } from 'arangojs/aql';
|
|
@@ -100,6 +100,7 @@ export const getMessages = (context, conversationId, { from, to })=>{
|
|
|
100
100
|
const conversationDocId = `conversations/${formatConversationId}`;
|
|
101
101
|
const conversationQry = aql`FOR e IN hasConversation
|
|
102
102
|
FILTER e._from == ${sessionDocId} && e._to == ${conversationDocId}
|
|
103
|
+
AND DOCUMENT(${conversationDocId}).chatSchemaVersion != 1
|
|
103
104
|
LIMIT 1
|
|
104
105
|
RETURN e`;
|
|
105
106
|
return useDb(databaseName).query(conversationQry).then((cursor)=>cursor.all()).then((conversations)=>{
|
|
@@ -109,7 +110,7 @@ export const getMessages = (context, conversationId, { from, to })=>{
|
|
|
109
110
|
const limit = getLimit(from, to);
|
|
110
111
|
const aqlQry = aql`
|
|
111
112
|
FOR m IN messages
|
|
112
|
-
FILTER m.conversationId == ${formatConversationId}
|
|
113
|
+
FILTER m.conversationId == ${formatConversationId} AND m.chatSchemaVersion != 1
|
|
113
114
|
SORT m.added DESC
|
|
114
115
|
${literal(limit.aql)}
|
|
115
116
|
SORT m.added ASC
|
|
@@ -146,7 +147,9 @@ export const updateMessage = (context, message)=>{
|
|
|
146
147
|
personaId,
|
|
147
148
|
userId: sessionId
|
|
148
149
|
};
|
|
149
|
-
const aqlQry = aql`
|
|
150
|
+
const aqlQry = aql`LET current = DOCUMENT('messages', ${formatMsgId})
|
|
151
|
+
FILTER current.chatSchemaVersion != 1
|
|
152
|
+
UPSERT {_key: ${formatMsgId}, conversationId: ${formatConversationId}, personaId: ${personaId}}
|
|
150
153
|
INSERT ${insert}
|
|
151
154
|
UPDATE ${update} IN messages
|
|
152
155
|
RETURN NEW`;
|
|
@@ -176,8 +179,11 @@ export const saveMessage = (context, messageId, conversationId)=>{
|
|
|
176
179
|
const formatId = parseId(messageId);
|
|
177
180
|
return getConversationById(context, conversationId).then((conversation)=>{
|
|
178
181
|
const { _key: conversationKey } = conversation;
|
|
182
|
+
if (!conversationKey) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
179
185
|
const aqlQry = aql`FOR m IN messages
|
|
180
|
-
FILTER m._key == ${formatId} && m.to == ${conversationKey}
|
|
186
|
+
FILTER m._key == ${formatId} && m.to == ${conversationKey} && m.chatSchemaVersion != 1
|
|
181
187
|
UPDATE m WITH {saved: APPEND(m.saved, ${sessionId}, true)} IN messages
|
|
182
188
|
RETURN NEW`;
|
|
183
189
|
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((message)=>{
|
|
@@ -197,8 +203,11 @@ export const unsaveMessage = (context, messageId, conversationId)=>{
|
|
|
197
203
|
const formatId = parseId(messageId);
|
|
198
204
|
return getConversationById(context, conversationId).then((conversation)=>{
|
|
199
205
|
const { _key: conversationKey } = conversation;
|
|
206
|
+
if (!conversationKey) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
200
209
|
const aqlQry = aql`FOR m IN messages
|
|
201
|
-
FILTER m._key == ${formatId} && m.to == ${conversationKey}
|
|
210
|
+
FILTER m._key == ${formatId} && m.to == ${conversationKey} && m.chatSchemaVersion != 1
|
|
202
211
|
UPDATE m WITH {saved: REMOVE_VALUE(m.saved, ${sessionId})} IN messages
|
|
203
212
|
RETURN NEW`;
|
|
204
213
|
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((message)=>{
|
|
@@ -218,8 +227,11 @@ export const deleteMessage = (context, messageId, conversationId)=>{
|
|
|
218
227
|
const formatId = parseId(messageId);
|
|
219
228
|
return getConversationById(context, conversationId).then((conversation)=>{
|
|
220
229
|
const { _key: conversationKey } = conversation;
|
|
230
|
+
if (!conversationKey) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
221
233
|
const aqlQry = aql`FOR m IN messages
|
|
222
|
-
FILTER m._key == ${formatId} && m.to == ${conversationKey} && m.from == ${sessionId}
|
|
234
|
+
FILTER m._key == ${formatId} && m.to == ${conversationKey} && m.from == ${sessionId} && m.chatSchemaVersion != 1
|
|
223
235
|
REMOVE m IN messages
|
|
224
236
|
RETURN OLD`;
|
|
225
237
|
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((message)=>{
|
|
@@ -239,6 +251,9 @@ export const getMessage = (context, messageId)=>{
|
|
|
239
251
|
return getListBy(context, 'messages', {
|
|
240
252
|
_key: formatId
|
|
241
253
|
}, {
|
|
254
|
+
customQueries: [
|
|
255
|
+
'FILTER doc.chatSchemaVersion != 1'
|
|
256
|
+
],
|
|
242
257
|
limit: {
|
|
243
258
|
from: 0,
|
|
244
259
|
to: 1
|
|
@@ -251,6 +266,7 @@ export const cleanMessages = (databaseName)=>{
|
|
|
251
266
|
// Remove all messages that are over 60 days and not saved
|
|
252
267
|
const aqlQry = aql`FOR m IN messages
|
|
253
268
|
FILTER m.added < DATE_TIMESTAMP(DATE_SUBTRACT(DATE_NOW(), 60, 'day')) && LENGTH(m.saved) > 0
|
|
269
|
+
AND m.chatSchemaVersion != 1
|
|
254
270
|
REMOVE m IN messages
|
|
255
271
|
RETURN OLD`;
|
|
256
272
|
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.all()).then((list)=>list.length).catch((error)=>{
|
|
@@ -258,4 +274,4 @@ export const cleanMessages = (databaseName)=>{
|
|
|
258
274
|
});
|
|
259
275
|
};
|
|
260
276
|
|
|
261
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9tZXNzYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuaW1wb3J0IHtjbG9uZURlZXB9IGZyb20gJ0BubGFicy91dGlscy9vYmplY3RzL2Nsb25lJztcbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnksIGxpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7cGFyc2VNZXNzYWdlfSBmcm9tICcuLi9hZGFwdGVycy9tZXNzYWdlQWRhcHRlci5qcyc7XG5pbXBvcnQge2dldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbn0gZnJvbSAnLi4vbGFtYmRhcy9hY3Rpb25zL3dlYnNvY2tldHMuanMnO1xuaW1wb3J0IHt3c0NsaWVudH0gZnJvbSAnLi4vbGFtYmRhcy91dGlscy93ZWJzb2NrZXQuanMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkLCBnZXRDb252ZXJzYXRpb25CeUlkfSBmcm9tICcuL2NvbnZlcnNhdGlvbnMuanMnO1xuaW1wb3J0IHthZGRJdGVtLCBnZXRMaXN0Qnl9IGZyb20gJy4vY3J1ZC5qcyc7XG5pbXBvcnQge2dldFBlcnNvbmFCeUlkfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7Z2V0VXNlckRpc3BsYXlOYW1lfSBmcm9tICcuL3VzZXJzLmpzJztcblxuaW1wb3J0IHR5cGUge0FyYW5nb0RiTGltaXR9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDb252ZXJzYXRpb25UeXBlfSBmcm9tICcuLi90eXBlcy9jb252ZXJzYXRpb25zLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtNZXNzYWdlSW5wdXRUeXBlLCBNZXNzYWdlVHlwZX0gZnJvbSAnLi4vdHlwZXMvbWVzc2FnZXMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnbWVzc2FnZXMnO1xuXG5jb25zdCBlbnJpY2hNZXNzYWdlVXNlciA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbWVzc2FnZTogTWVzc2FnZVR5cGUsXG4gIGJhc2VVc2VyPzogVXNlclR5cGUgfCBudWxsXG4pOiBQcm9taXNlPFVzZXJUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCBzZXNzaW9uVXNlcklkID0gcGFyc2VJZChTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSk7XG4gIGNvbnN0IHNlc3Npb25QZXJzb25hSWQgPSBwYXJzZUlkKFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy5wZXJzb25hSWQgfHwgJycpKTtcbiAgY29uc3QgbWVzc2FnZVVzZXJJZCA9IHBhcnNlSWQoU3RyaW5nKG1lc3NhZ2U/LnVzZXJJZCB8fCBiYXNlVXNlcj8udXNlcklkIHx8IGJhc2VVc2VyPy5fa2V5IHx8ICcnKSk7XG5cbiAgaWYoIW1lc3NhZ2VVc2VySWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHVzZXIgPSBiYXNlVXNlciB8fCBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7bWVzc2FnZVVzZXJJZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB1XG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICBjb25zdCByZXNvbHZlZFBlcnNvbmFJZCA9IHBhcnNlSWQoXG4gICAgU3RyaW5nKFxuICAgICAgbWVzc2FnZT8ucGVyc29uYUlkXG4gICAgICB8fCAobWVzc2FnZVVzZXJJZCA9PT0gc2Vzc2lvblVzZXJJZCA/IHNlc3Npb25QZXJzb25hSWQgOiAnJylcbiAgICAgIHx8IHVzZXI/LnBlcnNvbmFJZFxuICAgICAgfHwgJydcbiAgICApXG4gICk7XG4gIGNvbnN0IHBlcnNvbmEgPSByZXNvbHZlZFBlcnNvbmFJZFxuICAgID8gYXdhaXQgZ2V0UGVyc29uYUJ5SWQoY29udGV4dCwgcmVzb2x2ZWRQZXJzb25hSWQpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgLi4udXNlcixcbiAgICBpbWFnZVVybDogU3RyaW5nKHVzZXI/LmltYWdlVXJsIHx8IHBlcnNvbmE/LmltYWdlVXJsIHx8ICcnKSxcbiAgICBuYW1lOiBTdHJpbmcocGVyc29uYT8ubmFtZSB8fCB1c2VyPy5uYW1lIHx8IGdldFVzZXJEaXNwbGF5TmFtZSh1c2VyIHx8IHt9IGFzIFVzZXJUeXBlKSksXG4gICAgcGVyc29uYUlkOiBTdHJpbmcocmVzb2x2ZWRQZXJzb25hSWQgfHwgdXNlcj8ucGVyc29uYUlkIHx8ICcnKSxcbiAgICB0aHVtYlVybDogU3RyaW5nKHVzZXI/LnRodW1iVXJsIHx8IHVzZXI/LnRodW1iSWQgfHwgcGVyc29uYT8udGh1bWJVcmwgfHwgJycpLFxuICAgIHVzZXJJZDogbWVzc2FnZVVzZXJJZCxcbiAgICB1c2VybmFtZTogU3RyaW5nKHVzZXI/LnVzZXJuYW1lIHx8ICcnKVxuICB9O1xufTtcblxuY29uc3Qgd2l0aE1lc3NhZ2VVc2VyID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBtZXNzYWdlOiBNZXNzYWdlVHlwZSxcbiAgYmFzZVVzZXI/OiBVc2VyVHlwZSB8IG51bGxcbik6IFByb21pc2U8TWVzc2FnZVR5cGU+ID0+ICh7XG4gIC4uLm1lc3NhZ2UsXG4gIHVzZXI6IGF3YWl0IGVucmljaE1lc3NhZ2VVc2VyKGNvbnRleHQsIG1lc3NhZ2UsIGJhc2VVc2VyKVxufSk7XG5cbmNvbnN0IHVwZGF0ZUNvbnZlcnNhdGlvblN1bW1hcnkgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG1lc3NhZ2U6IE1lc3NhZ2VUeXBlXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGUgfCBudWxsPiA9PiB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gcGFyc2VJZChTdHJpbmcobWVzc2FnZT8uY29udmVyc2F0aW9uSWQgfHwgJycpKTtcblxuICBpZighY29udmVyc2F0aW9uSWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBwYXJzZVN0cmluZyhTdHJpbmcobWVzc2FnZT8uY29udGVudCB8fCAnJyksIDY0MCk7XG4gIGNvbnN0IG1vZGlmaWVkID0gTnVtYmVyKG1lc3NhZ2U/Lm1vZGlmaWVkIHx8IG1lc3NhZ2U/LmFkZGVkIHx8IERhdGUubm93KCkpO1xuICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgIGNvbnRlbnQsXG4gICAgbW9kaWZpZWRcbiAgfTtcblxuICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIFVQREFURSAke2NvbnZlcnNhdGlvbklkfVxuICAgIFdJVEggJHtzdW1tYXJ5fVxuICAgIElOIGNvbnZlcnNhdGlvbnNcbiAgYCk7XG5cbiAgY29uc3QgY29udmVyc2F0aW9uID0gYXdhaXQgZ2V0Q29udmVyc2F0aW9uQnlJZChjb250ZXh0LCBjb252ZXJzYXRpb25JZCk7XG5cbiAgaWYoIWNvbnZlcnNhdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb252ZXJzYXRpb24sXG4gICAgY29udGVudCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBtb2RpZmllZFxuICB9IGFzIENvbnZlcnNhdGlvblR5cGU7XG59O1xuXG5jb25zdCBlbWl0UmVhbHRpbWVNZXNzYWdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2U6IE1lc3NhZ2VUeXBlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmKCFtZXNzYWdlPy5jb252ZXJzYXRpb25JZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGF3YWl0IHVwZGF0ZUNvbnZlcnNhdGlvblN1bW1hcnkoY29udGV4dCwgbWVzc2FnZSk7XG5cbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICBhY3Rpb246ICdtZXNzYWdlLmNyZWF0ZWQnLFxuICAgIGRhdGE6IHtcbiAgICAgIC4uLihjb252ZXJzYXRpb24gPyB7Y29udmVyc2F0aW9ufSA6IHt9KSxcbiAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgLi4uKGF3YWl0IHdpdGhNZXNzYWdlVXNlcihjb250ZXh0LCBtZXNzYWdlKSlcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGNvbm5lY3Rpb25Hcm91cHMgPSBhd2FpdCBnZXRDb25uZWN0aW9uQnlDb252ZXJzYXRpb24oY29udGV4dCwgbWVzc2FnZS5jb252ZXJzYXRpb25JZCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25JZHMgPSBjb25uZWN0aW9uR3JvdXBzXG4gICAgLmZsYXRNYXAoKGdyb3VwKSA9PiBBcnJheS5pc0FycmF5KGdyb3VwKSA/IGdyb3VwIDogW10pXG4gICAgLm1hcCgoY29ubmVjdGlvbklkKSA9PiBwYXJzZVN0cmluZyhjb25uZWN0aW9uSWQsIDMyKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmZpbHRlcigoY29ubmVjdGlvbklkLCBpbmRleCwgbGlzdCkgPT4gbGlzdC5pbmRleE9mKGNvbm5lY3Rpb25JZCkgPT09IGluZGV4KTtcblxuICBpZihjb25uZWN0aW9uSWRzLmxlbmd0aCkge1xuICAgIGF3YWl0IHdzQ2xpZW50LnNlbmQoY29ubmVjdGlvbklkcywgcGF5bG9hZCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNZXNzYWdlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjb252ZXJzYXRpb25JZDogc3RyaW5nLCB7ZnJvbSwgdG99KTogUHJvbWlzZTxNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtmb3JtYXRDb252ZXJzYXRpb25JZH1gO1xuICBjb25zdCBjb252ZXJzYXRpb25RcnkgPSBhcWxgRk9SIGUgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGUuX2Zyb20gPT0gJHtzZXNzaW9uRG9jSWR9ICYmIGUuX3RvID09ICR7Y29udmVyc2F0aW9uRG9jSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBlYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShjb252ZXJzYXRpb25RcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKChjb252ZXJzYXRpb25zKSA9PiB7XG4gICAgICBpZighY29udmVyc2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW1pdDogQXJhbmdvRGJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICAgIEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgICAgRklMVEVSIG0uY29udmVyc2F0aW9uSWQgPT0gJHtmb3JtYXRDb252ZXJzYXRpb25JZH1cbiAgICAgICAgICBTT1JUIG0uYWRkZWQgREVTQ1xuICAgICAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgICAgIFNPUlQgbS5hZGRlZCBBU0NcbiAgICAgICAgICBMRVQgdXNlciA9IEZJUlNUKFxuICAgICAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgICAgICAgRklMVEVSIHUuX2tleSA9PSBtLnVzZXJJZFxuICAgICAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgICAgIFJFVFVSTiB1XG4gICAgICAgICAgKVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShtLCB7dXNlcn0pXG4gICAgICBgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAgICAgLnRoZW4oKG1lc3NhZ2VzKSA9PiBQcm9taXNlLmFsbChtZXNzYWdlcy5tYXAoKG1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgbWVzc2FnZSwgbWVzc2FnZT8udXNlciBhcyBVc2VyVHlwZSB8IG51bGwpKSkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZTogTWVzc2FnZUlucHV0VHlwZSk6IFByb21pc2U8TWVzc2FnZVR5cGU+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3BlcnNvbmFJZCwgdXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBmaWxlcyxcbiAgICBpbWFnZXMsXG4gICAgbWVzc2FnZUlkID0gY3JlYXRlSGFzaChgbWVzc2FnZS0ke3BlcnNvbmFJZH0tJHtEYXRlLm5vdygpfWApLFxuICB9ID0gbWVzc2FnZTtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcblxuICBpZihmb3JtYXRDb252ZXJzYXRpb25JZCA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2NvbnZlcnNhdGlvbklkJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRNc2dJZCA9IHBhcnNlSWQobWVzc2FnZUlkKTtcbiAgY29uc3QgdXBkYXRlOiBNZXNzYWdlVHlwZSA9IHtcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhtZXNzYWdlLmNvbnRlbnQsIDY0MCksXG4gICAgZmlsZXM6IGZpbGVzIHx8IFtdLFxuICAgIGltYWdlczogaW1hZ2VzIHx8IFtdXG4gIH07XG5cbiAgY29uc3QgaW5zZXJ0OiBNZXNzYWdlVHlwZSA9IHtcbiAgICAuLi5jbG9uZURlZXAodXBkYXRlKSxcbiAgICBfa2V5OiBmb3JtYXRNc2dJZCxcbiAgICBjb252ZXJzYXRpb25JZDogZm9ybWF0Q29udmVyc2F0aW9uSWQsXG4gICAgcGVyc29uYUlkLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdE1zZ0lkfSwgY29udmVyc2F0aW9uSWQ6ICR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9LCBwZXJzb25hSWQ6ICR7cGVyc29uYUlkfX1cbiAgICBJTlNFUlQgJHtpbnNlcnR9XG4gICAgVVBEQVRFICR7dXBkYXRlfSBJTiBtZXNzYWdlc1xuICAgIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkKGNvbnRleHQsIGZvcm1hdENvbnZlcnNhdGlvbklkKVxuICAgIC50aGVuKCgpID0+IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKGFzeW5jIChzYXZlZE1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICBjb25zdCBlbnJpY2hlZE1lc3NhZ2UgPSBhd2FpdCB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgc2F2ZWRNZXNzYWdlKTtcbiAgICAgIGF3YWl0IGVtaXRSZWFsdGltZU1lc3NhZ2UoY29udGV4dCwgZW5yaWNoZWRNZXNzYWdlKTtcbiAgICAgIHJldHVybiBlbnJpY2hlZE1lc3NhZ2U7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkTWVzc2FnZSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBtZXNzYWdlOiBNZXNzYWdlSW5wdXRUeXBlKTogUHJvbWlzZTxNZXNzYWdlVHlwZT4gPT4ge1xuICBjb25zdCBuZXdNZXNzYWdlOiBNZXNzYWdlVHlwZSA9IHBhcnNlTWVzc2FnZShtZXNzYWdlKTtcbiAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKFN0cmluZyhuZXdNZXNzYWdlPy5jb252ZXJzYXRpb25JZCB8fCAnJykpO1xuXG4gIHJldHVybiBlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkKGNvbnRleHQsIGNvbnZlcnNhdGlvbklkKVxuICAgIC50aGVuKCgpID0+IGFkZEl0ZW08TWVzc2FnZVR5cGU+KGNvbnRleHQsICdtZXNzYWdlcycsIG5ld01lc3NhZ2UpKVxuICAgIC50aGVuKGFzeW5jIChzYXZlZE1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICBjb25zdCBlbnJpY2hlZE1lc3NhZ2UgPSBhd2FpdCB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgc2F2ZWRNZXNzYWdlKTtcbiAgICAgIGF3YWl0IGVtaXRSZWFsdGltZU1lc3NhZ2UoY29udGV4dCwgZW5yaWNoZWRNZXNzYWdlKTtcbiAgICAgIHJldHVybiBlbnJpY2hlZE1lc3NhZ2U7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uOiAnYWRkTWVzc2FnZScsXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnYWRkTWVzc2FnZSdcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNhdmVNZXNzYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2VJZDogc3RyaW5nLCBjb252ZXJzYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNZXNzYWdlVHlwZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdElkID0gcGFyc2VJZChtZXNzYWdlSWQpO1xuXG4gIHJldHVybiBnZXRDb252ZXJzYXRpb25CeUlkKGNvbnRleHQsIGNvbnZlcnNhdGlvbklkKVxuICAgIC50aGVuKChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtfa2V5OiBjb252ZXJzYXRpb25LZXl9ID0gY29udmVyc2F0aW9uO1xuICAgICAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgIEZJTFRFUiBtLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgbS50byA9PSAke2NvbnZlcnNhdGlvbktleX1cbiAgICAgICAgVVBEQVRFIG0gV0lUSCB7c2F2ZWQ6IEFQUEVORChtLnNhdmVkLCAke3Nlc3Npb25JZH0sIHRydWUpfSBJTiBtZXNzYWdlc1xuICAgICAgICBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigobWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgICAgICBpZihtZXNzYWdlKSB7XG4gICAgICAgICAgICAvLyBCcm9hZGNhc3QgdG8gbWVzc2FnZSBib3hcbiAgICAgICAgICAgIC8vIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VUeXBlID0gTWVzc2FnZXMuZ2V0TWVzc2FnZU9iamVjdChtZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIGlvLnRvKG1lc3NhZ2UudG9JZCkuZW1pdCgnbWVzc2FnZV9zYXZlJywgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuc2F2ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQgPSBwYXJzZUlkKG1lc3NhZ2VJZCk7XG5cbiAgcmV0dXJuIGdldENvbnZlcnNhdGlvbkJ5SWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGNvbnZlcnNhdGlvbktleX0gPSBjb252ZXJzYXRpb247XG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgICAgRklMVEVSIG0uX2tleSA9PSAke2Zvcm1hdElkfSAmJiBtLnRvID09ICR7Y29udmVyc2F0aW9uS2V5fVxuICAgICAgICAgIFVQREFURSBtIFdJVEgge3NhdmVkOiBSRU1PVkVfVkFMVUUobS5zYXZlZCwgJHtzZXNzaW9uSWR9KX0gSU4gbWVzc2FnZXNcbiAgICAgICAgICBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigobWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgICAgICBpZihtZXNzYWdlKSB7XG4gICAgICAgICAgICAvLyBCcm9hZGNhc3QgdG8gbWVzc2FnZSBib3hcbiAgICAgICAgICAgIC8vIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VUeXBlID0gTWVzc2FnZXMuZ2V0TWVzc2FnZU9iamVjdChtZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIGlvLnRvKG1lc3NhZ2UuaWQpLmVtaXQoJ21lc3NhZ2VfdW5zYXZlJywgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQgPSBwYXJzZUlkKG1lc3NhZ2VJZCk7XG5cbiAgcmV0dXJuIGdldENvbnZlcnNhdGlvbkJ5SWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGNvbnZlcnNhdGlvbktleX0gPSBjb252ZXJzYXRpb247XG4gICAgICBjb25zdCBhcWxRcnkgPSBhcWxgRk9SIG0gSU4gbWVzc2FnZXNcbiAgICAgICAgRklMVEVSIG0uX2tleSA9PSAke2Zvcm1hdElkfSAmJiBtLnRvID09ICR7Y29udmVyc2F0aW9uS2V5fSAmJiBtLmZyb20gPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIFJFTU9WRSBtIElOIG1lc3NhZ2VzXG4gICAgICAgIFJFVFVSTiBPTERgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKChtZXNzYWdlOiBNZXNzYWdlVHlwZSkgPT4ge1xuICAgICAgICAgIGlmKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIC8vIEJyb2FkY2FzdCB0byBtZXNzYWdlIGJveFxuICAgICAgICAgICAgLy8gY29uc3QgbWVzc2FnZTogTWVzc2FnZVR5cGUgPSBNZXNzYWdlcy5nZXRNZXNzYWdlT2JqZWN0KG1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gaW8udG8obWVzc2FnZS50b0lkKS5lbWl0KCdtZXNzYWdlX2RlbGV0ZScsIG1lc3NhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNZXNzYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxNZXNzYWdlVHlwZT4gPT4ge1xuICBjb25zdCBmb3JtYXRJZCA9IHBhcnNlSWQobWVzc2FnZUlkKTtcblxuICByZXR1cm4gZ2V0TGlzdEJ5PE1lc3NhZ2VUeXBlPihcbiAgICBjb250ZXh0LFxuICAgICdtZXNzYWdlcycsXG4gICAge19rZXk6IGZvcm1hdElkfSxcbiAgICB7bGltaXQ6IHtmcm9tOiAwLCB0bzogMX19XG4gIClcbiAgICAudGhlbigobWVzc2FnZXMpID0+IG1lc3NhZ2VzWzBdIHx8IG51bGwpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFuTWVzc2FnZXMgPSAoZGF0YWJhc2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAvLyBSZW1vdmUgYWxsIG1lc3NhZ2VzIHRoYXQgYXJlIG92ZXIgNjAgZGF5cyBhbmQgbm90IHNhdmVkXG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgbSBJTiBtZXNzYWdlc1xuICAgICAgRklMVEVSIG0uYWRkZWQgPCBEQVRFX1RJTUVTVEFNUChEQVRFX1NVQlRSQUNUKERBVEVfTk9XKCksIDYwLCAnZGF5JykpICYmIExFTkdUSChtLnNhdmVkKSA+IDBcbiAgICAgIFJFTU9WRSBtIElOIG1lc3NhZ2VzXG4gICAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKChsaXN0OiBNZXNzYWdlVHlwZVtdKSA9PiBsaXN0Lmxlbmd0aClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuIl0sIm5hbWVzIjpbImNsb25lRGVlcCIsImNyZWF0ZUhhc2giLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJhcWwiLCJsaXRlcmFsIiwicGFyc2VNZXNzYWdlIiwiZ2V0Q29ubmVjdGlvbkJ5Q29udmVyc2F0aW9uIiwid3NDbGllbnQiLCJsb2dFcnJvciIsImdldExpbWl0IiwidXNlRGIiLCJlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkIiwiZ2V0Q29udmVyc2F0aW9uQnlJZCIsImFkZEl0ZW0iLCJnZXRMaXN0QnkiLCJnZXRQZXJzb25hQnlJZCIsImdldFVzZXJEaXNwbGF5TmFtZSIsImV2ZW50Q2F0ZWdvcnkiLCJlbnJpY2hNZXNzYWdlVXNlciIsImNvbnRleHQiLCJtZXNzYWdlIiwiYmFzZVVzZXIiLCJzZXNzaW9uVXNlcklkIiwiU3RyaW5nIiwic2Vzc2lvbiIsInVzZXJJZCIsInNlc3Npb25QZXJzb25hSWQiLCJwZXJzb25hSWQiLCJtZXNzYWdlVXNlcklkIiwiX2tleSIsInVzZXIiLCJkYXRhYmFzZU5hbWUiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJuZXh0IiwicmVzb2x2ZWRQZXJzb25hSWQiLCJwZXJzb25hIiwiY2F0Y2giLCJpbWFnZVVybCIsIm5hbWUiLCJ0aHVtYlVybCIsInRodW1iSWQiLCJ1c2VybmFtZSIsIndpdGhNZXNzYWdlVXNlciIsInVwZGF0ZUNvbnZlcnNhdGlvblN1bW1hcnkiLCJjb252ZXJzYXRpb25JZCIsImNvbnRlbnQiLCJtb2RpZmllZCIsIk51bWJlciIsImFkZGVkIiwiRGF0ZSIsIm5vdyIsInN1bW1hcnkiLCJjb252ZXJzYXRpb24iLCJlbWl0UmVhbHRpbWVNZXNzYWdlIiwicGF5bG9hZCIsImFjdGlvbiIsImRhdGEiLCJjb25uZWN0aW9uR3JvdXBzIiwiY29ubmVjdGlvbklkcyIsImZsYXRNYXAiLCJncm91cCIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsImNvbm5lY3Rpb25JZCIsImZpbHRlciIsIkJvb2xlYW4iLCJpbmRleCIsImxpc3QiLCJpbmRleE9mIiwibGVuZ3RoIiwic2VuZCIsImdldE1lc3NhZ2VzIiwiZnJvbSIsInRvIiwic2Vzc2lvbklkIiwiZm9ybWF0Q29udmVyc2F0aW9uSWQiLCJzZXNzaW9uRG9jSWQiLCJjb252ZXJzYXRpb25Eb2NJZCIsImNvbnZlcnNhdGlvblFyeSIsImFsbCIsImNvbnZlcnNhdGlvbnMiLCJsaW1pdCIsImFxbFFyeSIsIm1lc3NhZ2VzIiwiUHJvbWlzZSIsImVycm9yIiwidXBkYXRlTWVzc2FnZSIsImZpbGVzIiwiaW1hZ2VzIiwibWVzc2FnZUlkIiwiRXJyb3IiLCJmb3JtYXRNc2dJZCIsInVwZGF0ZSIsImluc2VydCIsInNhdmVkTWVzc2FnZSIsImVucmljaGVkTWVzc2FnZSIsImFkZE1lc3NhZ2UiLCJuZXdNZXNzYWdlIiwiY2F0ZWdvcnkiLCJsYWJlbCIsInNhdmVNZXNzYWdlIiwiZm9ybWF0SWQiLCJjb252ZXJzYXRpb25LZXkiLCJ1bnNhdmVNZXNzYWdlIiwiZGVsZXRlTWVzc2FnZSIsImdldE1lc3NhZ2UiLCJjbGVhbk1lc3NhZ2VzIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxTQUFTLFFBQU8sNkJBQTZCO0FBQ3JELFNBQVFDLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxXQUFXLFFBQU8sK0JBQStCO0FBQzlFLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQWtCQyxPQUFPLFFBQU8sZUFBZTtBQUUvQyxTQUFRQyxZQUFZLFFBQU8sZ0NBQWdDO0FBQzNELFNBQVFDLDJCQUEyQixRQUFPLG1DQUFtQztBQUM3RSxTQUFRQyxRQUFRLFFBQU8sZ0NBQWdDO0FBQ3ZELFNBQVFDLFFBQVEsUUFBTyw2QkFBNkI7QUFDcEQsU0FBUUMsUUFBUSxFQUFFQyxLQUFLLFFBQU8sNEJBQTRCO0FBQzFE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
|
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9tZXNzYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuLyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiBbXCJlcnJvclwiLCB7XCJhbGxvd1wiOiBbXCJfaWRcIiwgXCJfa2V5XCJdfV0gLS0gQXJhbmdvREIgZG9jdW1lbnQgaWRlbnRpdHkgZmllbGRzLiAqL1xuaW1wb3J0IHtjbG9uZURlZXB9IGZyb20gJ0BubGFicy91dGlscy9vYmplY3RzL2Nsb25lJztcbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnksIGxpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7cGFyc2VNZXNzYWdlfSBmcm9tICcuLi9hZGFwdGVycy9tZXNzYWdlQWRhcHRlci5qcyc7XG5pbXBvcnQge2dldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbn0gZnJvbSAnLi4vbGFtYmRhcy9hY3Rpb25zL3dlYnNvY2tldHMuanMnO1xuaW1wb3J0IHt3c0NsaWVudH0gZnJvbSAnLi4vbGFtYmRhcy91dGlscy93ZWJzb2NrZXQuanMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkLCBnZXRDb252ZXJzYXRpb25CeUlkfSBmcm9tICcuL2NvbnZlcnNhdGlvbnMuanMnO1xuaW1wb3J0IHthZGRJdGVtLCBnZXRMaXN0Qnl9IGZyb20gJy4vY3J1ZC5qcyc7XG5pbXBvcnQge2dldFBlcnNvbmFCeUlkfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7Z2V0VXNlckRpc3BsYXlOYW1lfSBmcm9tICcuL3VzZXJzLmpzJztcblxuaW1wb3J0IHR5cGUge0FyYW5nb0RiTGltaXR9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDb252ZXJzYXRpb25UeXBlfSBmcm9tICcuLi90eXBlcy9jb252ZXJzYXRpb25zLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtNZXNzYWdlSW5wdXRUeXBlLCBNZXNzYWdlVHlwZX0gZnJvbSAnLi4vdHlwZXMvbWVzc2FnZXMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnbWVzc2FnZXMnO1xuXG5jb25zdCBlbnJpY2hNZXNzYWdlVXNlciA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbWVzc2FnZTogTWVzc2FnZVR5cGUsXG4gIGJhc2VVc2VyPzogVXNlclR5cGUgfCBudWxsXG4pOiBQcm9taXNlPFVzZXJUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCBzZXNzaW9uVXNlcklkID0gcGFyc2VJZChTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSk7XG4gIGNvbnN0IHNlc3Npb25QZXJzb25hSWQgPSBwYXJzZUlkKFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy5wZXJzb25hSWQgfHwgJycpKTtcbiAgY29uc3QgbWVzc2FnZVVzZXJJZCA9IHBhcnNlSWQoU3RyaW5nKG1lc3NhZ2U/LnVzZXJJZCB8fCBiYXNlVXNlcj8udXNlcklkIHx8IGJhc2VVc2VyPy5fa2V5IHx8ICcnKSk7XG5cbiAgaWYoIW1lc3NhZ2VVc2VySWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHVzZXIgPSBiYXNlVXNlciB8fCBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7bWVzc2FnZVVzZXJJZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB1XG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICBjb25zdCByZXNvbHZlZFBlcnNvbmFJZCA9IHBhcnNlSWQoXG4gICAgU3RyaW5nKFxuICAgICAgbWVzc2FnZT8ucGVyc29uYUlkXG4gICAgICB8fCAobWVzc2FnZVVzZXJJZCA9PT0gc2Vzc2lvblVzZXJJZCA/IHNlc3Npb25QZXJzb25hSWQgOiAnJylcbiAgICAgIHx8IHVzZXI/LnBlcnNvbmFJZFxuICAgICAgfHwgJydcbiAgICApXG4gICk7XG4gIGNvbnN0IHBlcnNvbmEgPSByZXNvbHZlZFBlcnNvbmFJZFxuICAgID8gYXdhaXQgZ2V0UGVyc29uYUJ5SWQoY29udGV4dCwgcmVzb2x2ZWRQZXJzb25hSWQpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgLi4udXNlcixcbiAgICBpbWFnZVVybDogU3RyaW5nKHVzZXI/LmltYWdlVXJsIHx8IHBlcnNvbmE/LmltYWdlVXJsIHx8ICcnKSxcbiAgICBuYW1lOiBTdHJpbmcocGVyc29uYT8ubmFtZSB8fCB1c2VyPy5uYW1lIHx8IGdldFVzZXJEaXNwbGF5TmFtZSh1c2VyIHx8IHt9KSksXG4gICAgcGVyc29uYUlkOiBTdHJpbmcocmVzb2x2ZWRQZXJzb25hSWQgfHwgdXNlcj8ucGVyc29uYUlkIHx8ICcnKSxcbiAgICB0aHVtYlVybDogU3RyaW5nKHVzZXI/LnRodW1iVXJsIHx8IHVzZXI/LnRodW1iSWQgfHwgcGVyc29uYT8udGh1bWJVcmwgfHwgJycpLFxuICAgIHVzZXJJZDogbWVzc2FnZVVzZXJJZCxcbiAgICB1c2VybmFtZTogU3RyaW5nKHVzZXI/LnVzZXJuYW1lIHx8ICcnKVxuICB9O1xufTtcblxuY29uc3Qgd2l0aE1lc3NhZ2VVc2VyID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBtZXNzYWdlOiBNZXNzYWdlVHlwZSxcbiAgYmFzZVVzZXI/OiBVc2VyVHlwZSB8IG51bGxcbik6IFByb21pc2U8TWVzc2FnZVR5cGU+ID0+ICh7XG4gIC4uLm1lc3NhZ2UsXG4gIHVzZXI6IGF3YWl0IGVucmljaE1lc3NhZ2VVc2VyKGNvbnRleHQsIG1lc3NhZ2UsIGJhc2VVc2VyKVxufSk7XG5cbmNvbnN0IHVwZGF0ZUNvbnZlcnNhdGlvblN1bW1hcnkgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG1lc3NhZ2U6IE1lc3NhZ2VUeXBlXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGUgfCBudWxsPiA9PiB7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gcGFyc2VJZChTdHJpbmcobWVzc2FnZT8uY29udmVyc2F0aW9uSWQgfHwgJycpKTtcblxuICBpZighY29udmVyc2F0aW9uSWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBwYXJzZVN0cmluZyhTdHJpbmcobWVzc2FnZT8uY29udGVudCB8fCAnJyksIDY0MCk7XG4gIGNvbnN0IG1vZGlmaWVkID0gTnVtYmVyKG1lc3NhZ2U/Lm1vZGlmaWVkIHx8IG1lc3NhZ2U/LmFkZGVkIHx8IERhdGUubm93KCkpO1xuICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgIGNvbnRlbnQsXG4gICAgbW9kaWZpZWRcbiAgfTtcblxuICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIFVQREFURSAke2NvbnZlcnNhdGlvbklkfVxuICAgIFdJVEggJHtzdW1tYXJ5fVxuICAgIElOIGNvbnZlcnNhdGlvbnNcbiAgYCk7XG5cbiAgY29uc3QgY29udmVyc2F0aW9uID0gYXdhaXQgZ2V0Q29udmVyc2F0aW9uQnlJZChjb250ZXh0LCBjb252ZXJzYXRpb25JZCk7XG5cbiAgaWYoIWNvbnZlcnNhdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb252ZXJzYXRpb24sXG4gICAgY29udGVudCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBtb2RpZmllZFxuICB9O1xufTtcblxuY29uc3QgZW1pdFJlYWx0aW1lTWVzc2FnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBtZXNzYWdlOiBNZXNzYWdlVHlwZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZighbWVzc2FnZT8uY29udmVyc2F0aW9uSWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb252ZXJzYXRpb24gPSBhd2FpdCB1cGRhdGVDb252ZXJzYXRpb25TdW1tYXJ5KGNvbnRleHQsIG1lc3NhZ2UpO1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgYWN0aW9uOiAnbWVzc2FnZS5jcmVhdGVkJyxcbiAgICBkYXRhOiB7XG4gICAgICAuLi4oY29udmVyc2F0aW9uID8ge2NvbnZlcnNhdGlvbn0gOiB7fSksXG4gICAgICBtZXNzYWdlOiB7XG4gICAgICAgIC4uLihhd2FpdCB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgbWVzc2FnZSkpXG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBjb25uZWN0aW9uR3JvdXBzID0gYXdhaXQgZ2V0Q29ubmVjdGlvbkJ5Q29udmVyc2F0aW9uKGNvbnRleHQsIG1lc3NhZ2UuY29udmVyc2F0aW9uSWQpO1xuICBjb25zdCBjb25uZWN0aW9uSWRzID0gY29ubmVjdGlvbkdyb3Vwc1xuICAgIC5mbGF0TWFwKChncm91cCkgPT4gKEFycmF5LmlzQXJyYXkoZ3JvdXApID8gZ3JvdXAgOiBbXSkpXG4gICAgLm1hcCgoY29ubmVjdGlvbklkKSA9PiBwYXJzZVN0cmluZyhjb25uZWN0aW9uSWQsIDMyKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmZpbHRlcigoY29ubmVjdGlvbklkLCBpbmRleCwgbGlzdCkgPT4gbGlzdC5pbmRleE9mKGNvbm5lY3Rpb25JZCkgPT09IGluZGV4KTtcblxuICBpZihjb25uZWN0aW9uSWRzLmxlbmd0aCkge1xuICAgIGF3YWl0IHdzQ2xpZW50LnNlbmQoY29ubmVjdGlvbklkcywgcGF5bG9hZCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNZXNzYWdlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjb252ZXJzYXRpb25JZDogc3RyaW5nLCB7ZnJvbSwgdG99KTogUHJvbWlzZTxNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtmb3JtYXRDb252ZXJzYXRpb25JZH1gO1xuICBjb25zdCBjb252ZXJzYXRpb25RcnkgPSBhcWxgRk9SIGUgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGUuX2Zyb20gPT0gJHtzZXNzaW9uRG9jSWR9ICYmIGUuX3RvID09ICR7Y29udmVyc2F0aW9uRG9jSWR9XG4gICAgICBBTkQgRE9DVU1FTlQoJHtjb252ZXJzYXRpb25Eb2NJZH0pLmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIGVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGNvbnZlcnNhdGlvblFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbnMpID0+IHtcbiAgICAgIGlmKCFjb252ZXJzYXRpb25zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbWl0OiBBcmFuZ29EYkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgICAgRk9SIG0gSU4gbWVzc2FnZXNcbiAgICAgICAgICBGSUxURVIgbS5jb252ZXJzYXRpb25JZCA9PSAke2Zvcm1hdENvbnZlcnNhdGlvbklkfSBBTkQgbS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxXG4gICAgICAgICAgU09SVCBtLmFkZGVkIERFU0NcbiAgICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgICBTT1JUIG0uYWRkZWQgQVNDXG4gICAgICAgICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICAgICAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gbS51c2VySWRcbiAgICAgICAgICAgICAgTElNSVQgMVxuICAgICAgICAgICAgICBSRVRVUk4gdVxuICAgICAgICAgIClcbiAgICAgICAgICBSRVRVUk4gTUVSR0UobSwge3VzZXJ9KVxuICAgICAgYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgICAgIC50aGVuKChtZXNzYWdlcykgPT4gUHJvbWlzZS5hbGwobWVzc2FnZXMubWFwKChtZXNzYWdlOiBNZXNzYWdlVHlwZSkgPT5cbiAgICAgICAgICB3aXRoTWVzc2FnZVVzZXIoY29udGV4dCwgbWVzc2FnZSwgbWVzc2FnZT8udXNlciBhcyBVc2VyVHlwZSB8IG51bGwpKSkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZTogTWVzc2FnZUlucHV0VHlwZSk6IFByb21pc2U8TWVzc2FnZVR5cGU+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3BlcnNvbmFJZCwgdXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBmaWxlcyxcbiAgICBpbWFnZXMsXG4gICAgbWVzc2FnZUlkID0gY3JlYXRlSGFzaChgbWVzc2FnZS0ke3BlcnNvbmFJZH0tJHtEYXRlLm5vdygpfWApXG4gIH0gPSBtZXNzYWdlO1xuICBjb25zdCBmb3JtYXRDb252ZXJzYXRpb25JZCA9IHBhcnNlSWQoY29udmVyc2F0aW9uSWQpO1xuXG4gIGlmKGZvcm1hdENvbnZlcnNhdGlvbklkID09PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfY29udmVyc2F0aW9uSWQnKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdE1zZ0lkID0gcGFyc2VJZChtZXNzYWdlSWQpO1xuICBjb25zdCB1cGRhdGU6IE1lc3NhZ2VUeXBlID0ge1xuICAgIGNvbnRlbnQ6IHBhcnNlU3RyaW5nKG1lc3NhZ2UuY29udGVudCwgNjQwKSxcbiAgICBmaWxlczogZmlsZXMgfHwgW10sXG4gICAgaW1hZ2VzOiBpbWFnZXMgfHwgW11cbiAgfTtcblxuICBjb25zdCBpbnNlcnQ6IE1lc3NhZ2VUeXBlID0ge1xuICAgIC4uLmNsb25lRGVlcCh1cGRhdGUpLFxuICAgIF9rZXk6IGZvcm1hdE1zZ0lkLFxuICAgIGNvbnZlcnNhdGlvbklkOiBmb3JtYXRDb252ZXJzYXRpb25JZCxcbiAgICBwZXJzb25hSWQsXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgY3VycmVudCA9IERPQ1VNRU5UKCdtZXNzYWdlcycsICR7Zm9ybWF0TXNnSWR9KVxuICAgIEZJTFRFUiBjdXJyZW50LmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICBVUFNFUlQge19rZXk6ICR7Zm9ybWF0TXNnSWR9LCBjb252ZXJzYXRpb25JZDogJHtmb3JtYXRDb252ZXJzYXRpb25JZH0sIHBlcnNvbmFJZDogJHtwZXJzb25hSWR9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9IElOIG1lc3NhZ2VzXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGVuc3VyZUNvbnZlcnNhdGlvbk1lc3NhZ2luZ0FsbG93ZWQoY29udGV4dCwgZm9ybWF0Q29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKCkgPT4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oYXN5bmMgKHNhdmVkTWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGVucmljaGVkTWVzc2FnZSA9IGF3YWl0IHdpdGhNZXNzYWdlVXNlcihjb250ZXh0LCBzYXZlZE1lc3NhZ2UpO1xuICAgICAgYXdhaXQgZW1pdFJlYWx0aW1lTWVzc2FnZShjb250ZXh0LCBlbnJpY2hlZE1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGVucmljaGVkTWVzc2FnZTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRNZXNzYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2U6IE1lc3NhZ2VJbnB1dFR5cGUpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IG5ld01lc3NhZ2U6IE1lc3NhZ2VUeXBlID0gcGFyc2VNZXNzYWdlKG1lc3NhZ2UpO1xuICBjb25zdCBjb252ZXJzYXRpb25JZCA9IHBhcnNlSWQoU3RyaW5nKG5ld01lc3NhZ2U/LmNvbnZlcnNhdGlvbklkIHx8ICcnKSk7XG5cbiAgcmV0dXJuIGVuc3VyZUNvbnZlcnNhdGlvbk1lc3NhZ2luZ0FsbG93ZWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKCkgPT4gYWRkSXRlbTxNZXNzYWdlVHlwZT4oY29udGV4dCwgJ21lc3NhZ2VzJywgbmV3TWVzc2FnZSkpXG4gICAgLnRoZW4oYXN5bmMgKHNhdmVkTWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGVucmljaGVkTWVzc2FnZSA9IGF3YWl0IHdpdGhNZXNzYWdlVXNlcihjb250ZXh0LCBzYXZlZE1lc3NhZ2UpO1xuICAgICAgYXdhaXQgZW1pdFJlYWx0aW1lTWVzc2FnZShjb250ZXh0LCBlbnJpY2hlZE1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGVucmljaGVkTWVzc2FnZTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb246ICdhZGRNZXNzYWdlJyxcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdhZGRNZXNzYWdlJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2F2ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQgPSBwYXJzZUlkKG1lc3NhZ2VJZCk7XG5cbiAgcmV0dXJuIGdldENvbnZlcnNhdGlvbkJ5SWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGNvbnZlcnNhdGlvbktleX0gPSBjb252ZXJzYXRpb247XG4gICAgICBpZighY29udmVyc2F0aW9uS2V5KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgIEZJTFRFUiBtLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgbS50byA9PSAke2NvbnZlcnNhdGlvbktleX0gJiYgbS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxXG4gICAgICAgIFVQREFURSBtIFdJVEgge3NhdmVkOiBBUFBFTkQobS5zYXZlZCwgJHtzZXNzaW9uSWR9LCB0cnVlKX0gSU4gbWVzc2FnZXNcbiAgICAgICAgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKG1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICAgICAgaWYobWVzc2FnZSkge1xuICAgICAgICAgICAgLy8gQnJvYWRjYXN0IHRvIG1lc3NhZ2UgYm94XG4gICAgICAgICAgICAvLyBjb25zdCBtZXNzYWdlOiBNZXNzYWdlVHlwZSA9IE1lc3NhZ2VzLmdldE1lc3NhZ2VPYmplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICAvLyBpby50byhtZXNzYWdlLnRvSWQpLmVtaXQoJ21lc3NhZ2Vfc2F2ZScsIG1lc3NhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1bnNhdmVNZXNzYWdlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG1lc3NhZ2VJZDogc3RyaW5nLCBjb252ZXJzYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNZXNzYWdlVHlwZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdElkID0gcGFyc2VJZChtZXNzYWdlSWQpO1xuXG4gIHJldHVybiBnZXRDb252ZXJzYXRpb25CeUlkKGNvbnRleHQsIGNvbnZlcnNhdGlvbklkKVxuICAgIC50aGVuKChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtfa2V5OiBjb252ZXJzYXRpb25LZXl9ID0gY29udmVyc2F0aW9uO1xuICAgICAgaWYoIWNvbnZlcnNhdGlvbktleSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIG0gSU4gbWVzc2FnZXNcbiAgICAgICAgICBGSUxURVIgbS5fa2V5ID09ICR7Zm9ybWF0SWR9ICYmIG0udG8gPT0gJHtjb252ZXJzYXRpb25LZXl9ICYmIG0uY2hhdFNjaGVtYVZlcnNpb24gIT0gMVxuICAgICAgICAgIFVQREFURSBtIFdJVEgge3NhdmVkOiBSRU1PVkVfVkFMVUUobS5zYXZlZCwgJHtzZXNzaW9uSWR9KX0gSU4gbWVzc2FnZXNcbiAgICAgICAgICBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigobWVzc2FnZTogTWVzc2FnZVR5cGUpID0+IHtcbiAgICAgICAgICBpZihtZXNzYWdlKSB7XG4gICAgICAgICAgICAvLyBCcm9hZGNhc3QgdG8gbWVzc2FnZSBib3hcbiAgICAgICAgICAgIC8vIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VUeXBlID0gTWVzc2FnZXMuZ2V0TWVzc2FnZU9iamVjdChtZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIGlvLnRvKG1lc3NhZ2UuaWQpLmVtaXQoJ21lc3NhZ2VfdW5zYXZlJywgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZU1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQgPSBwYXJzZUlkKG1lc3NhZ2VJZCk7XG5cbiAgcmV0dXJuIGdldENvbnZlcnNhdGlvbkJ5SWQoY29udGV4dCwgY29udmVyc2F0aW9uSWQpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGNvbnZlcnNhdGlvbktleX0gPSBjb252ZXJzYXRpb247XG4gICAgICBpZighY29udmVyc2F0aW9uS2V5KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICAgIEZJTFRFUiBtLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgbS50byA9PSAke2NvbnZlcnNhdGlvbktleX0gJiYgbS5mcm9tID09ICR7c2Vzc2lvbklkfSAmJiBtLmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICAgICAgUkVNT1ZFIG0gSU4gbWVzc2FnZXNcbiAgICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKG1lc3NhZ2U6IE1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICAgICAgaWYobWVzc2FnZSkge1xuICAgICAgICAgICAgLy8gQnJvYWRjYXN0IHRvIG1lc3NhZ2UgYm94XG4gICAgICAgICAgICAvLyBjb25zdCBtZXNzYWdlOiBNZXNzYWdlVHlwZSA9IE1lc3NhZ2VzLmdldE1lc3NhZ2VPYmplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICAvLyBpby50byhtZXNzYWdlLnRvSWQpLmVtaXQoJ21lc3NhZ2VfZGVsZXRlJywgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1lc3NhZ2UgPSAoY29udGV4dDogQXBpQ29udGV4dCwgbWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGZvcm1hdElkID0gcGFyc2VJZChtZXNzYWdlSWQpO1xuXG4gIHJldHVybiBnZXRMaXN0Qnk8TWVzc2FnZVR5cGU+KFxuICAgIGNvbnRleHQsXG4gICAgJ21lc3NhZ2VzJyxcbiAgICB7X2tleTogZm9ybWF0SWR9LFxuICAgIHtjdXN0b21RdWVyaWVzOiBbJ0ZJTFRFUiBkb2MuY2hhdFNjaGVtYVZlcnNpb24gIT0gMSddLCBsaW1pdDoge2Zyb206IDAsIHRvOiAxfX1cbiAgKVxuICAgIC50aGVuKChtZXNzYWdlcykgPT4gbWVzc2FnZXNbMF0gfHwgbnVsbClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYW5NZXNzYWdlcyA9IChkYXRhYmFzZU5hbWU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIC8vIFJlbW92ZSBhbGwgbWVzc2FnZXMgdGhhdCBhcmUgb3ZlciA2MCBkYXlzIGFuZCBub3Qgc2F2ZWRcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBtIElOIG1lc3NhZ2VzXG4gICAgICBGSUxURVIgbS5hZGRlZCA8IERBVEVfVElNRVNUQU1QKERBVEVfU1VCVFJBQ1QoREFURV9OT1coKSwgNjAsICdkYXknKSkgJiYgTEVOR1RIKG0uc2F2ZWQpID4gMFxuICAgICAgICBBTkQgbS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxXG4gICAgICBSRU1PVkUgbSBJTiBtZXNzYWdlc1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigobGlzdDogTWVzc2FnZVR5cGVbXSkgPT4gbGlzdC5sZW5ndGgpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdLCJuYW1lcyI6WyJjbG9uZURlZXAiLCJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlU3RyaW5nIiwiYXFsIiwibGl0ZXJhbCIsInBhcnNlTWVzc2FnZSIsImdldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbiIsIndzQ2xpZW50IiwibG9nRXJyb3IiLCJnZXRMaW1pdCIsInVzZURiIiwiZW5zdXJlQ29udmVyc2F0aW9uTWVzc2FnaW5nQWxsb3dlZCIsImdldENvbnZlcnNhdGlvbkJ5SWQiLCJhZGRJdGVtIiwiZ2V0TGlzdEJ5IiwiZ2V0UGVyc29uYUJ5SWQiLCJnZXRVc2VyRGlzcGxheU5hbWUiLCJldmVudENhdGVnb3J5IiwiZW5yaWNoTWVzc2FnZVVzZXIiLCJjb250ZXh0IiwibWVzc2FnZSIsImJhc2VVc2VyIiwic2Vzc2lvblVzZXJJZCIsIlN0cmluZyIsInNlc3Npb24iLCJ1c2VySWQiLCJzZXNzaW9uUGVyc29uYUlkIiwicGVyc29uYUlkIiwibWVzc2FnZVVzZXJJZCIsIl9rZXkiLCJ1c2VyIiwiZGF0YWJhc2VOYW1lIiwicXVlcnkiLCJ0aGVuIiwiY3Vyc29yIiwibmV4dCIsInJlc29sdmVkUGVyc29uYUlkIiwicGVyc29uYSIsImNhdGNoIiwiaW1hZ2VVcmwiLCJuYW1lIiwidGh1bWJVcmwiLCJ0aHVtYklkIiwidXNlcm5hbWUiLCJ3aXRoTWVzc2FnZVVzZXIiLCJ1cGRhdGVDb252ZXJzYXRpb25TdW1tYXJ5IiwiY29udmVyc2F0aW9uSWQiLCJjb250ZW50IiwibW9kaWZpZWQiLCJOdW1iZXIiLCJhZGRlZCIsIkRhdGUiLCJub3ciLCJzdW1tYXJ5IiwiY29udmVyc2F0aW9uIiwiZW1pdFJlYWx0aW1lTWVzc2FnZSIsInBheWxvYWQiLCJhY3Rpb24iLCJkYXRhIiwiY29ubmVjdGlvbkdyb3VwcyIsImNvbm5lY3Rpb25JZHMiLCJmbGF0TWFwIiwiZ3JvdXAiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJjb25uZWN0aW9uSWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaW5kZXgiLCJsaXN0IiwiaW5kZXhPZiIsImxlbmd0aCIsInNlbmQiLCJnZXRNZXNzYWdlcyIsImZyb20iLCJ0byIsInNlc3Npb25JZCIsImZvcm1hdENvbnZlcnNhdGlvbklkIiwic2Vzc2lvbkRvY0lkIiwiY29udmVyc2F0aW9uRG9jSWQiLCJjb252ZXJzYXRpb25RcnkiLCJhbGwiLCJjb252ZXJzYXRpb25zIiwibGltaXQiLCJhcWxRcnkiLCJtZXNzYWdlcyIsIlByb21pc2UiLCJlcnJvciIsInVwZGF0ZU1lc3NhZ2UiLCJmaWxlcyIsImltYWdlcyIsIm1lc3NhZ2VJZCIsIkVycm9yIiwiZm9ybWF0TXNnSWQiLCJ1cGRhdGUiLCJpbnNlcnQiLCJzYXZlZE1lc3NhZ2UiLCJlbnJpY2hlZE1lc3NhZ2UiLCJhZGRNZXNzYWdlIiwibmV3TWVzc2FnZSIsImNhdGVnb3J5IiwibGFiZWwiLCJzYXZlTWVzc2FnZSIsImZvcm1hdElkIiwiY29udmVyc2F0aW9uS2V5IiwidW5zYXZlTWVzc2FnZSIsImRlbGV0ZU1lc3NhZ2UiLCJnZXRNZXNzYWdlIiwiY3VzdG9tUXVlcmllcyIsImNsZWFuTWVzc2FnZXMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELDRHQUE0RyxHQUM1RyxTQUFRQSxTQUFTLFFBQU8sNkJBQTZCO0FBQ3JELFNBQVFDLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxXQUFXLFFBQU8sK0JBQStCO0FBQzlFLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQWtCQyxPQUFPLFFBQU8sZUFBZTtBQUUvQyxTQUFRQyxZQUFZLFFBQU8sZ0NBQWdDO0FBQzNELFNBQVFDLDJCQUEyQixRQUFPLG1DQUFtQztBQUM3RSxTQUFRQyxRQUFRLFFBQU8sZ0NBQWdDO0FBQ3ZELFNBQVFDLFFBQVEsUUFBTyw2QkFBNkI7QUFDcEQsU0FBUUMsUUFBUSxFQUFFQyxLQUFLLFFBQU8sNEJBQTRCO0FBQzFELFNBQVFDLGtDQUFrQyxFQUFFQyxtQkFBbUIsUUFBTyxxQkFBcUI7QUFDM0YsU0FBUUMsT0FBTyxFQUFFQyxTQUFTLFFBQU8sWUFBWTtBQUM3QyxTQUFRQyxjQUFjLFFBQU8sZ0JBQWdCO0FBQzdDLFNBQVFDLGtCQUFrQixRQUFPLGFBQWE7QUFROUMsTUFBTUMsZ0JBQWdCO0FBRXRCLE1BQU1DLG9CQUFvQixPQUN4QkMsU0FDQUMsU0FDQUM7SUFFQSxNQUFNQyxnQkFBZ0JyQixRQUFRc0Is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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ApiContext } from '../types/auth.types.js';
|
|
2
|
+
export interface PhoneSupportInput {
|
|
3
|
+
readonly company?: string;
|
|
4
|
+
readonly contactId: string;
|
|
5
|
+
readonly email: string;
|
|
6
|
+
readonly firstName: string;
|
|
7
|
+
readonly lastName?: string;
|
|
8
|
+
readonly message: string;
|
|
9
|
+
readonly phone: string;
|
|
10
|
+
readonly product: string;
|
|
11
|
+
readonly source?: 'website-assistant';
|
|
12
|
+
}
|
|
13
|
+
export declare const submitPhoneSupportTicket: (context: ApiContext, input: PhoneSupportInput) => Promise<{
|
|
14
|
+
notificationStatus: string;
|
|
15
|
+
status: string;
|
|
16
|
+
supportTicketId: string;
|
|
17
|
+
ticketNumber: string;
|
|
18
|
+
}>;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { aql } from 'arangojs';
|
|
3
|
+
import { useDb } from '../utils/arangodbUtils.js';
|
|
4
|
+
import { sesSend } from './email.js';
|
|
5
|
+
const hash = (value)=>createHash('sha256').update(value).digest('hex');
|
|
6
|
+
const documents = [
|
|
7
|
+
'users',
|
|
8
|
+
'supportTickets',
|
|
9
|
+
'supportTicketEvents',
|
|
10
|
+
'supportTicketMessages'
|
|
11
|
+
];
|
|
12
|
+
const edges = [
|
|
13
|
+
'hasSupportTicket',
|
|
14
|
+
'hasSupportTicketEvent',
|
|
15
|
+
'hasSupportTicketMessage'
|
|
16
|
+
];
|
|
17
|
+
// Atomic, deterministic IDs make a retried Connect request return the original ticket.
|
|
18
|
+
export const submitPhoneSupportTicket = async (context, input)=>{
|
|
19
|
+
const db = useDb(context.databaseName);
|
|
20
|
+
for (const name of [
|
|
21
|
+
...documents,
|
|
22
|
+
...edges
|
|
23
|
+
]){
|
|
24
|
+
const target = db.collection(name);
|
|
25
|
+
if (!await target.exists()) {
|
|
26
|
+
try {
|
|
27
|
+
await target.create({
|
|
28
|
+
type: edges.includes(name) ? 3 : 2
|
|
29
|
+
});
|
|
30
|
+
} catch (error) {
|
|
31
|
+
if (!await target.exists()) throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const email = input.email.toLowerCase();
|
|
36
|
+
const source = input.source || 'amazon-connect';
|
|
37
|
+
const channel = input.source ? 'website' : 'phone';
|
|
38
|
+
const key = hash(`nitrogenx:${channel}:${input.contactId}`);
|
|
39
|
+
const payloadHash = hash(JSON.stringify({
|
|
40
|
+
...input,
|
|
41
|
+
email
|
|
42
|
+
}));
|
|
43
|
+
const timestamp = Date.now();
|
|
44
|
+
const ticketNumber = `NX-${key.slice(0, 12).toUpperCase()}`;
|
|
45
|
+
const tx = await db.beginTransaction({
|
|
46
|
+
exclusive: [
|
|
47
|
+
...documents,
|
|
48
|
+
...edges
|
|
49
|
+
]
|
|
50
|
+
}, {
|
|
51
|
+
lockTimeout: 10
|
|
52
|
+
});
|
|
53
|
+
let ticket;
|
|
54
|
+
try {
|
|
55
|
+
const existing = await tx.step(()=>db.query(aql`RETURN DOCUMENT('supportTickets', ${key})`)).then((cursor)=>cursor.next());
|
|
56
|
+
if (existing) {
|
|
57
|
+
if (existing.payloadHash !== payloadHash) throw new Error('contact_payload_conflict');
|
|
58
|
+
ticket = existing;
|
|
59
|
+
} else {
|
|
60
|
+
const userKey = hash(email);
|
|
61
|
+
const user = await tx.step(()=>db.query(aql`
|
|
62
|
+
UPSERT {email: ${email}}
|
|
63
|
+
INSERT ${{
|
|
64
|
+
_key: userKey,
|
|
65
|
+
active: false,
|
|
66
|
+
added: timestamp,
|
|
67
|
+
company: input.company || '',
|
|
68
|
+
crmSource: `nitrogenx-${channel}`,
|
|
69
|
+
email,
|
|
70
|
+
firstName: input.firstName,
|
|
71
|
+
lastName: input.lastName || '',
|
|
72
|
+
marketingOptIn: false,
|
|
73
|
+
modified: timestamp,
|
|
74
|
+
phone: input.phone,
|
|
75
|
+
userId: userKey
|
|
76
|
+
}}
|
|
77
|
+
UPDATE {modified: ${timestamp}} IN users RETURN NEW
|
|
78
|
+
`)).then((cursor)=>cursor.next());
|
|
79
|
+
// Caller-provided details are kept on the ticket. An unauthenticated caller cannot overwrite an existing CRM profile.
|
|
80
|
+
ticket = {
|
|
81
|
+
_key: key,
|
|
82
|
+
added: timestamp,
|
|
83
|
+
appId: 'nitrogenx',
|
|
84
|
+
caller: input,
|
|
85
|
+
description: input.message,
|
|
86
|
+
modified: timestamp,
|
|
87
|
+
notificationStatus: 'pending',
|
|
88
|
+
payloadHash,
|
|
89
|
+
priority: 'normal',
|
|
90
|
+
productId: input.product,
|
|
91
|
+
source,
|
|
92
|
+
status: 'submitted',
|
|
93
|
+
subject: `${channel} message: ${input.product}`,
|
|
94
|
+
supportTicketId: key,
|
|
95
|
+
ticketNumber,
|
|
96
|
+
type: 'general_support',
|
|
97
|
+
userId: user._key
|
|
98
|
+
};
|
|
99
|
+
await tx.step(()=>db.query(aql`INSERT ${ticket} IN supportTickets`));
|
|
100
|
+
await tx.step(()=>db.query(aql`INSERT ${{
|
|
101
|
+
_from: `users/${user._key}`,
|
|
102
|
+
_key: key,
|
|
103
|
+
_to: `supportTickets/${key}`,
|
|
104
|
+
added: timestamp,
|
|
105
|
+
status: 'submitted'
|
|
106
|
+
}} IN hasSupportTicket`));
|
|
107
|
+
await tx.step(()=>db.query(aql`INSERT ${{
|
|
108
|
+
_key: key,
|
|
109
|
+
added: timestamp,
|
|
110
|
+
eventType: 'submitted',
|
|
111
|
+
metadata: {
|
|
112
|
+
details: input.message,
|
|
113
|
+
source
|
|
114
|
+
},
|
|
115
|
+
supportTicketId: key,
|
|
116
|
+
toValue: 'submitted'
|
|
117
|
+
}} IN supportTicketEvents`));
|
|
118
|
+
await tx.step(()=>db.query(aql`INSERT ${{
|
|
119
|
+
_from: `supportTickets/${key}`,
|
|
120
|
+
_key: key,
|
|
121
|
+
_to: `supportTicketEvents/${key}`,
|
|
122
|
+
added: timestamp
|
|
123
|
+
}} IN hasSupportTicketEvent`));
|
|
124
|
+
}
|
|
125
|
+
await tx.commit();
|
|
126
|
+
} catch (error) {
|
|
127
|
+
await tx.abort();
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
// At-least-once email delivery; retries never duplicate the CRM contact or ticket.
|
|
131
|
+
if (ticket.notificationStatus !== 'sent') {
|
|
132
|
+
// An invalid legacy transcription must not prevent the internal support notification.
|
|
133
|
+
const replyable = email.length <= 254 && email.split('@')[0].length <= 64 && /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/i.test(email);
|
|
134
|
+
const delivery = await sesSend({
|
|
135
|
+
Destination: {
|
|
136
|
+
ToAddresses: [
|
|
137
|
+
'support@nitrogenx.co'
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
Message: {
|
|
141
|
+
Body: {
|
|
142
|
+
Text: {
|
|
143
|
+
Data: `New Nitrogen ${channel} message\nTicket: ${ticketNumber}\nProduct: ${input.product}\nName: ${input.firstName} ${input.lastName || ''}\nEmail: ${email}${replyable ? '' : ' (needs correction; use callback number)'}\nPhone: ${input.phone}\nCompany: ${input.company || 'Not supplied'}\nSubmission: ${input.contactId}\n\n${input.message}`
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
Subject: {
|
|
147
|
+
Data: `[${ticketNumber}] Nitrogen ${channel} support — ${input.product}`
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
...replyable ? {
|
|
151
|
+
ReplyToAddresses: [
|
|
152
|
+
email
|
|
153
|
+
]
|
|
154
|
+
} : {},
|
|
155
|
+
Source: 'Nitrogen Support <support@nitrogenx.co>'
|
|
156
|
+
});
|
|
157
|
+
await db.query(aql`UPDATE ${key} WITH ${{
|
|
158
|
+
notificationMessageId: delivery.MessageId || null,
|
|
159
|
+
notificationStatus: 'sent'
|
|
160
|
+
}} IN supportTickets`);
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
notificationStatus: 'sent',
|
|
164
|
+
status: 'submitted',
|
|
165
|
+
supportTicketId: key,
|
|
166
|
+
ticketNumber
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9waG9uZVN1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjcmVhdGVIYXNofSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuXG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7c2VzU2VuZH0gZnJvbSAnLi9lbWFpbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQaG9uZVN1cHBvcnRJbnB1dCB7XG4gIHJlYWRvbmx5IGNvbXBhbnk/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbnRhY3RJZDogc3RyaW5nO1xuICByZWFkb25seSBlbWFpbDogc3RyaW5nO1xuICByZWFkb25seSBmaXJzdE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbGFzdE5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgcmVhZG9ubHkgcGhvbmU6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvZHVjdDogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U/OiAnd2Vic2l0ZS1hc3Npc3RhbnQnO1xufVxuXG5jb25zdCBoYXNoID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHZhbHVlKS5kaWdlc3QoJ2hleCcpO1xuY29uc3QgZG9jdW1lbnRzID0gWyd1c2VycycsICdzdXBwb3J0VGlja2V0cycsICdzdXBwb3J0VGlja2V0RXZlbnRzJywgJ3N1cHBvcnRUaWNrZXRNZXNzYWdlcyddO1xuY29uc3QgZWRnZXMgPSBbJ2hhc1N1cHBvcnRUaWNrZXQnLCAnaGFzU3VwcG9ydFRpY2tldEV2ZW50JywgJ2hhc1N1cHBvcnRUaWNrZXRNZXNzYWdlJ107XG5cbi8vIEF0b21pYywgZGV0ZXJtaW5pc3RpYyBJRHMgbWFrZSBhIHJldHJpZWQgQ29ubmVjdCByZXF1ZXN0IHJldHVybiB0aGUgb3JpZ2luYWwgdGlja2V0LlxuZXhwb3J0IGNvbnN0IHN1Ym1pdFBob25lU3VwcG9ydFRpY2tldCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbnB1dDogUGhvbmVTdXBwb3J0SW5wdXQpID0+IHtcbiAgY29uc3QgZGIgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGZvcihjb25zdCBuYW1lIG9mIFsuLi5kb2N1bWVudHMsIC4uLmVkZ2VzXSkge1xuICAgIGNvbnN0IHRhcmdldCA9IGRiLmNvbGxlY3Rpb24obmFtZSk7XG4gICAgaWYoIWF3YWl0IHRhcmdldC5leGlzdHMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGFyZ2V0LmNyZWF0ZSh7dHlwZTogZWRnZXMuaW5jbHVkZXMobmFtZSkgPyAzIDogMn0pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBpZighYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgZW1haWwgPSBpbnB1dC5lbWFpbC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBzb3VyY2UgPSBpbnB1dC5zb3VyY2UgfHwgJ2FtYXpvbi1jb25uZWN0JztcbiAgY29uc3QgY2hhbm5lbCA9IGlucHV0LnNvdXJjZSA/ICd3ZWJzaXRlJyA6ICdwaG9uZSc7XG4gIGNvbnN0IGtleSA9IGhhc2goYG5pdHJvZ2VueDoke2NoYW5uZWx9OiR7aW5wdXQuY29udGFjdElkfWApO1xuICBjb25zdCBwYXlsb2FkSGFzaCA9IGhhc2goSlNPTi5zdHJpbmdpZnkoey4uLmlucHV0LCBlbWFpbH0pKTtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgdGlja2V0TnVtYmVyID0gYE5YLSR7a2V5LnNsaWNlKDAsIDEyKS50b1VwcGVyQ2FzZSgpfWA7XG4gIGNvbnN0IHR4ID0gYXdhaXQgZGIuYmVnaW5UcmFuc2FjdGlvbih7ZXhjbHVzaXZlOiBbLi4uZG9jdW1lbnRzLCAuLi5lZGdlc119LCB7bG9ja1RpbWVvdXQ6IDEwfSk7XG4gIGxldCB0aWNrZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB0cnkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdHguc3RlcCgoKSA9PiBkYi5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCdzdXBwb3J0VGlja2V0cycsICR7a2V5fSlgKSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICBpZihleGlzdGluZykge1xuICAgICAgaWYoZXhpc3RpbmcucGF5bG9hZEhhc2ggIT09IHBheWxvYWRIYXNoKSB0aHJvdyBuZXcgRXJyb3IoJ2NvbnRhY3RfcGF5bG9hZF9jb25mbGljdCcpO1xuICAgICAgdGlja2V0ID0gZXhpc3Rpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXJLZXkgPSBoYXNoKGVtYWlsKTtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0eC5zdGVwKCgpID0+IGRiLnF1ZXJ5KGFxbGBcbiAgICAgICAgVVBTRVJUIHtlbWFpbDogJHtlbWFpbH19XG4gICAgICAgIElOU0VSVCAke3tfa2V5OiB1c2VyS2V5LCBhY3RpdmU6IGZhbHNlLCBhZGRlZDogdGltZXN0YW1wLCBjb21wYW55OiBpbnB1dC5jb21wYW55IHx8ICcnLCBjcm1Tb3VyY2U6IGBuaXRyb2dlbngtJHtjaGFubmVsfWAsIGVtYWlsLCBmaXJzdE5hbWU6IGlucHV0LmZpcnN0TmFtZSwgbGFzdE5hbWU6IGlucHV0Lmxhc3ROYW1lIHx8ICcnLCBtYXJrZXRpbmdPcHRJbjogZmFsc2UsIG1vZGlmaWVkOiB0aW1lc3RhbXAsIHBob25lOiBpbnB1dC5waG9uZSwgdXNlcklkOiB1c2VyS2V5fX1cbiAgICAgICAgVVBEQVRFIHttb2RpZmllZDogJHt0aW1lc3RhbXB9fSBJTiB1c2VycyBSRVRVUk4gTkVXXG4gICAgICBgKSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICAgIC8vIENhbGxlci1wcm92aWRlZCBkZXRhaWxzIGFyZSBrZXB0IG9uIHRoZSB0aWNrZXQuIEFuIHVuYXV0aGVudGljYXRlZCBjYWxsZXIgY2Fubm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBDUk0gcHJvZmlsZS5cbiAgICAgIHRpY2tldCA9IHtfa2V5OiBrZXksIGFkZGVkOiB0aW1lc3RhbXAsIGFwcElkOiAnbml0cm9nZW54JywgY2FsbGVyOiBpbnB1dCwgZGVzY3JpcHRpb246IGlucHV0Lm1lc3NhZ2UsIG1vZGlmaWVkOiB0aW1lc3RhbXAsIG5vdGlmaWNhdGlvblN0YXR1czogJ3BlbmRpbmcnLCBwYXlsb2FkSGFzaCwgcHJpb3JpdHk6ICdub3JtYWwnLCBwcm9kdWN0SWQ6IGlucHV0LnByb2R1Y3QsIHNvdXJjZSwgc3RhdHVzOiAnc3VibWl0dGVkJywgc3ViamVjdDogYCR7Y2hhbm5lbH0gbWVzc2FnZTogJHtpbnB1dC5wcm9kdWN0fWAsIHN1cHBvcnRUaWNrZXRJZDoga2V5LCB0aWNrZXROdW1iZXIsIHR5cGU6ICdnZW5lcmFsX3N1cHBvcnQnLCB1c2VySWQ6IHVzZXIuX2tleX07XG4gICAgICBhd2FpdCB0eC5zdGVwKCgpID0+IGRiLnF1ZXJ5KGFxbGBJTlNFUlQgJHt0aWNrZXR9IElOIHN1cHBvcnRUaWNrZXRzYCkpO1xuICAgICAgYXdhaXQgdHguc3RlcCgoKSA9PiBkYi5xdWVyeShhcWxgSU5TRVJUICR7e19mcm9tOiBgdXNlcnMvJHt1c2VyLl9rZXl9YCwgX2tleToga2V5LCBfdG86IGBzdXBwb3J0VGlja2V0cy8ke2tleX1gLCBhZGRlZDogdGltZXN0YW1wLCBzdGF0dXM6ICdzdWJtaXR0ZWQnfX0gSU4gaGFzU3VwcG9ydFRpY2tldGApKTtcbiAgICAgIGF3YWl0IHR4LnN0ZXAoKCkgPT4gZGIucXVlcnkoYXFsYElOU0VSVCAke3tfa2V5OiBrZXksIGFkZGVkOiB0aW1lc3RhbXAsIGV2ZW50VHlwZTogJ3N1Ym1pdHRlZCcsIG1ldGFkYXRhOiB7ZGV0YWlsczogaW5wdXQubWVzc2FnZSwgc291cmNlfSwgc3VwcG9ydFRpY2tldElkOiBrZXksIHRvVmFsdWU6ICdzdWJtaXR0ZWQnfX0gSU4gc3VwcG9ydFRpY2tldEV2ZW50c2ApKTtcbiAgICAgIGF3YWl0IHR4LnN0ZXAoKCkgPT4gZGIucXVlcnkoYXFsYElOU0VSVCAke3tfZnJvbTogYHN1cHBvcnRUaWNrZXRzLyR7a2V5fWAsIF9rZXk6IGtleSwgX3RvOiBgc3VwcG9ydFRpY2tldEV2ZW50cy8ke2tleX1gLCBhZGRlZDogdGltZXN0YW1wfX0gSU4gaGFzU3VwcG9ydFRpY2tldEV2ZW50YCkpO1xuICAgIH1cbiAgICBhd2FpdCB0eC5jb21taXQoKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGF3YWl0IHR4LmFib3J0KCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgLy8gQXQtbGVhc3Qtb25jZSBlbWFpbCBkZWxpdmVyeTsgcmV0cmllcyBuZXZlciBkdXBsaWNhdGUgdGhlIENSTSBjb250YWN0IG9yIHRpY2tldC5cbiAgaWYodGlja2V0Lm5vdGlmaWNhdGlvblN0YXR1cyAhPT0gJ3NlbnQnKSB7XG4gICAgLy8gQW4gaW52YWxpZCBsZWdhY3kgdHJhbnNjcmlwdGlvbiBtdXN0IG5vdCBwcmV2ZW50IHRoZSBpbnRlcm5hbCBzdXBwb3J0IG5vdGlmaWNhdGlvbi5cbiAgICBjb25zdCByZXBseWFibGUgPSBlbWFpbC5sZW5ndGggPD0gMjU0ICYmIGVtYWlsLnNwbGl0KCdAJylbMF0ubGVuZ3RoIDw9IDY0ICYmIC9eW2EtejAtOSEjJCUmJyorXFwvPT9eX2B7fH1+LV0rKD86XFwuW2EtejAtOSEjJCUmJyorXFwvPT9eX2B7fH1+LV0rKSpAKD86W2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/XFwuKStbYS16XXsyLDYzfSQvaS50ZXN0KGVtYWlsKTtcbiAgICBjb25zdCBkZWxpdmVyeSA9IGF3YWl0IHNlc1NlbmQoe1xuICAgICAgRGVzdGluYXRpb246IHtUb0FkZHJlc3NlczogWydzdXBwb3J0QG5pdHJvZ2VueC5jbyddfSxcbiAgICAgIE1lc3NhZ2U6IHtcbiAgICAgICAgQm9keToge1RleHQ6IHtEYXRhOiBgTmV3IE5pdHJvZ2VuICR7Y2hhbm5lbH0gbWVzc2FnZVxcblRpY2tldDogJHt0aWNrZXROdW1iZXJ9XFxuUHJvZHVjdDogJHtpbnB1dC5wcm9kdWN0fVxcbk5hbWU6ICR7aW5wdXQuZmlyc3ROYW1lfSAke2lucHV0Lmxhc3ROYW1lIHx8ICcnfVxcbkVtYWlsOiAke2VtYWlsfSR7cmVwbHlhYmxlID8gJycgOiAnIChuZWVkcyBjb3JyZWN0aW9uOyB1c2UgY2FsbGJhY2sgbnVtYmVyKSd9XFxuUGhvbmU6ICR7aW5wdXQucGhvbmV9XFxuQ29tcGFueTogJHtpbnB1dC5jb21wYW55IHx8ICdOb3Qgc3VwcGxpZWQnfVxcblN1Ym1pc3Npb246ICR7aW5wdXQuY29udGFjdElkfVxcblxcbiR7aW5wdXQubWVzc2FnZX1gfX0sXG4gICAgICAgIFN1YmplY3Q6IHtEYXRhOiBgWyR7dGlja2V0TnVtYmVyfV0gTml0cm9nZW4gJHtjaGFubmVsfSBzdXBwb3J0IOKAlCAke2lucHV0LnByb2R1Y3R9YH1cbiAgICAgIH0sXG4gICAgICAuLi4ocmVwbHlhYmxlID8ge1JlcGx5VG9BZGRyZXNzZXM6IFtlbWFpbF19IDoge30pLFxuICAgICAgU291cmNlOiAnTml0cm9nZW4gU3VwcG9ydCA8c3VwcG9ydEBuaXRyb2dlbnguY28+J1xuICAgIH0pO1xuICAgIGF3YWl0IGRiLnF1ZXJ5KGFxbGBVUERBVEUgJHtrZXl9IFdJVEggJHt7bm90aWZpY2F0aW9uTWVzc2FnZUlkOiBkZWxpdmVyeS5NZXNzYWdlSWQgfHwgbnVsbCwgbm90aWZpY2F0aW9uU3RhdHVzOiAnc2VudCd9fSBJTiBzdXBwb3J0VGlja2V0c2ApO1xuICB9XG4gIHJldHVybiB7bm90aWZpY2F0aW9uU3RhdHVzOiAnc2VudCcsIHN0YXR1czogJ3N1Ym1pdHRlZCcsIHN1cHBvcnRUaWNrZXRJZDoga2V5LCB0aWNrZXROdW1iZXJ9O1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwiYXFsIiwidXNlRGIiLCJzZXNTZW5kIiwiaGFzaCIsInZhbHVlIiwidXBkYXRlIiwiZGlnZXN0IiwiZG9jdW1lbnRzIiwiZWRnZXMiLCJzdWJtaXRQaG9uZVN1cHBvcnRUaWNrZXQiLCJjb250ZXh0IiwiaW5wdXQiLCJkYiIsImRhdGFiYXNlTmFtZSIsIm5hbWUiLCJ0YXJnZXQiLCJjb2xsZWN0aW9uIiwiZXhpc3RzIiwiY3JlYXRlIiwidHlwZSIsImluY2x1ZGVzIiwiZXJyb3IiLCJlbWFpbCIsInRvTG93ZXJDYXNlIiwic291cmNlIiwiY2hhbm5lbCIsImtleSIsImNvbnRhY3RJZCIsInBheWxvYWRIYXNoIiwiSlNPTiIsInN0cmluZ2lmeSIsInRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJ0aWNrZXROdW1iZXIiLCJzbGljZSIsInRvVXBwZXJDYXNlIiwidHgiLCJiZWdpblRyYW5zYWN0aW9uIiwiZXhjbHVzaXZlIiwibG9ja1RpbWVvdXQiLCJ0aWNrZXQiLCJleGlzdGluZyIsInN0ZXAiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJuZXh0IiwiRXJyb3IiLCJ1c2VyS2V5IiwidXNlciIsIl9rZXkiLCJhY3RpdmUiLCJhZGRlZCIsImNvbXBhbnkiLCJjcm1Tb3VyY2UiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsIm1hcmtldGluZ09wdEluIiwibW9kaWZpZWQiLCJwaG9uZSIsInVzZXJJZCIsImFwcElkIiwiY2FsbGVyIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwibm90aWZpY2F0aW9uU3RhdHVzIiwicHJpb3JpdHkiLCJwcm9kdWN0SWQiLCJwcm9kdWN0Iiwic3RhdHVzIiwic3ViamVjdCIsInN1cHBvcnRUaWNrZXRJZCIsIl9mcm9tIiwiX3RvIiwiZXZlbnRUeXBlIiwibWV0YWRhdGEiLCJkZXRhaWxzIiwidG9WYWx1ZSIsImNvbW1pdCIsImFib3J0IiwicmVwbHlhYmxlIiwibGVuZ3RoIiwic3BsaXQiLCJ0ZXN0IiwiZGVsaXZlcnkiLCJEZXN0aW5hdGlvbiIsIlRvQWRkcmVzc2VzIiwiTWVzc2FnZSIsIkJvZHkiLCJUZXh0IiwiRGF0YSIsIlN1YmplY3QiLCJSZXBseVRvQWRkcmVzc2VzIiwiU291cmNlIiwibm90aWZpY2F0aW9uTWVzc2FnZUlkIiwiTWVzc2FnZUlkIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFRQSxVQUFVLFFBQU8sY0FBYztBQUN2QyxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUU3QixTQUFRQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ2hELFNBQVFDLE9BQU8sUUFBTyxhQUFhO0FBZ0JuQyxNQUFNQyxPQUFPLENBQUNDLFFBQTBCTCxXQUFXLFVBQVVNLE1BQU0sQ0FBQ0QsT0FBT0UsTUFBTSxDQUFDO0FBQ2xGLE1BQU1DLFlBQVk7SUFBQztJQUFTO0lBQWtCO0lBQXVCO0NBQXdCO0FBQzdGLE1BQU1DLFFBQVE7SUFBQztJQUFvQjtJQUF5QjtDQUEwQjtBQUV0Rix1RkFBdUY7QUFDdkYsT0FBTyxNQUFNQywyQkFBMkIsT0FBT0MsU0FBcUJDO0lBQ2xFLE1BQU1DLEtBQUtYLE1BQU1TLFFBQVFHLFlBQVk7SUFDckMsS0FBSSxNQUFNQyxRQUFRO1dBQUlQO1dBQWNDO0tBQU0sQ0FBRTtRQUMxQyxNQUFNTyxTQUFTSCxHQUFHSSxVQUFVLENBQUNGO1FBQzdCLElBQUcsQ0FBQyxNQUFNQyxPQUFPRSxNQUFNLElBQUk7WUFDekIsSUFBSTtnQkFDRixNQUFNRixPQUFPRyxNQUFNLENBQUM7b0JBQUNDLE1BQU1YLE1BQU1ZLFFBQVEsQ0FBQ04sUUFBUSxJQUFJO2dCQUFDO1lBQ3pELEVBQUUsT0FBTU8sT0FBTztnQkFDYixJQUFHLENBQUMsTUFBTU4sT0FBT0UsTUFBTSxJQUFJLE1BQU1JO1lBQ25DO1FBQ0Y7SUFDRjtJQUNBLE1BQU1DLFFBQVFYLE1BQU1XLEtBQUssQ0FBQ0MsV0FBVztJQUNyQyxN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
|