@nlabs/reaktor 1.6.3 → 1.8.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.
Files changed (278) hide show
  1. package/LICENSE +74 -201
  2. package/README.md +48 -16
  3. package/lib/actions/analytics.d.ts +10 -0
  4. package/lib/actions/analytics.js +539 -0
  5. package/lib/actions/apps.js +2 -2
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +2 -2
  8. package/lib/actions/conversations.js +2 -2
  9. package/lib/actions/crm.d.ts +11 -1
  10. package/lib/actions/crm.js +443 -13
  11. package/lib/actions/crud.js +2 -2
  12. package/lib/actions/dynamodb.d.ts +1 -1
  13. package/lib/actions/dynamodb.js +2 -2
  14. package/lib/actions/email.d.ts +1 -1
  15. package/lib/actions/email.js +2 -2
  16. package/lib/actions/files.js +2 -2
  17. package/lib/actions/flags.d.ts +6 -0
  18. package/lib/actions/flags.js +147 -0
  19. package/lib/actions/groups.js +2 -2
  20. package/lib/actions/images.d.ts +1 -1
  21. package/lib/actions/images.js +2 -2
  22. package/lib/actions/index.d.ts +3 -2
  23. package/lib/actions/index.js +4 -3
  24. package/lib/actions/ios.js +1 -1
  25. package/lib/actions/locations.js +2 -2
  26. package/lib/actions/messages.js +2 -2
  27. package/lib/actions/notifications.d.ts +1 -1
  28. package/lib/actions/notifications.js +2 -2
  29. package/lib/actions/payments.d.ts +3 -3
  30. package/lib/actions/payments.js +144 -189
  31. package/lib/actions/personas.js +1 -1
  32. package/lib/actions/posts.d.ts +0 -4
  33. package/lib/actions/posts.js +2 -4
  34. package/lib/actions/query.js +2 -2
  35. package/lib/actions/reactions.js +2 -2
  36. package/lib/actions/rum.js +148 -45
  37. package/lib/actions/s3.d.ts +1 -1
  38. package/lib/actions/s3.js +2 -2
  39. package/lib/actions/search.js +2 -2
  40. package/lib/actions/sms.js +2 -2
  41. package/lib/actions/statistics.js +2 -2
  42. package/lib/actions/subscriptions.js +2 -2
  43. package/lib/actions/tags.js +2 -2
  44. package/lib/actions/users.d.ts +4 -1
  45. package/lib/actions/users.js +85 -11
  46. package/lib/actions/videos.js +2 -2
  47. package/lib/adapters/arangoAdapter.js +1 -1
  48. package/lib/adapters/contentAdapter.js +2 -2
  49. package/lib/adapters/fileAdapter.js +1 -1
  50. package/lib/adapters/imageAdapter.js +1 -1
  51. package/lib/adapters/index.js +1 -1
  52. package/lib/adapters/messageAdapter.js +1 -1
  53. package/lib/adapters/postAdapter.js +1 -1
  54. package/lib/adapters/reaktorAdapter.js +1 -1
  55. package/lib/adapters/tagAdapter.d.ts +0 -1
  56. package/lib/adapters/tagAdapter.js +1 -2
  57. package/lib/adapters/userAdapter.d.ts +0 -1
  58. package/lib/adapters/userAdapter.js +1 -2
  59. package/lib/config.js +8 -2
  60. package/lib/constants/collections.d.ts +17 -1
  61. package/lib/constants/collections.js +18 -2
  62. package/lib/handlers/graphqlHandler.d.ts +2 -2
  63. package/lib/handlers/graphqlHandler.js +2 -19
  64. package/lib/index.d.ts +4 -2
  65. package/lib/index.js +4 -3
  66. package/lib/lambdas/actions/websockets.js +2 -2
  67. package/lib/lambdas/authorizer.js +2 -2
  68. package/lib/lambdas/connection.js +2 -2
  69. package/lib/lambdas/utils/message.js +2 -2
  70. package/lib/lambdas/utils/websocket.d.ts +1 -1
  71. package/lib/lambdas/utils/websocket.js +2 -2
  72. package/lib/mocks/conversation.js +1 -1
  73. package/lib/mocks/file.js +1 -1
  74. package/lib/mocks/group.js +1 -1
  75. package/lib/mocks/image.js +1 -1
  76. package/lib/mocks/post.js +1 -1
  77. package/lib/mocks/tag.js +1 -1
  78. package/lib/mocks/user.js +1 -1
  79. package/lib/mocks/video.js +1 -1
  80. package/lib/mutations/analytics/analytics.d.ts +1 -0
  81. package/lib/mutations/analytics/analytics.js +35 -0
  82. package/lib/mutations/content/content.js +2 -2
  83. package/lib/mutations/crm/crm.js +57 -11
  84. package/lib/mutations/events/events.js +2 -2
  85. package/lib/mutations/flags/flags.d.ts +1 -0
  86. package/lib/mutations/flags/flags.js +33 -0
  87. package/lib/mutations/groups/groups.js +2 -2
  88. package/lib/mutations/images/images.js +2 -2
  89. package/lib/mutations/index.d.ts +3 -1
  90. package/lib/mutations/index.js +13 -3
  91. package/lib/mutations/locations/locations.js +2 -2
  92. package/lib/mutations/messages/messages.js +2 -2
  93. package/lib/mutations/personas/personas.js +2 -2
  94. package/lib/mutations/posts/posts.js +2 -2
  95. package/lib/mutations/reactions/reactions.js +2 -2
  96. package/lib/mutations/rum/rum.js +2 -2
  97. package/lib/mutations/statistics/statistics.js +2 -2
  98. package/lib/mutations/subscriptions/subscriptions.js +2 -2
  99. package/lib/mutations/tags/tags.js +2 -2
  100. package/lib/mutations/users/users.js +30 -17
  101. package/lib/mutations/videos/videos.js +2 -2
  102. package/lib/objectTypes/analytics.d.ts +8 -0
  103. package/lib/objectTypes/analytics.js +147 -0
  104. package/lib/objectTypes/app.js +2 -2
  105. package/lib/objectTypes/bankAccount.js +2 -2
  106. package/lib/objectTypes/connection.js +2 -2
  107. package/lib/objectTypes/content.js +2 -2
  108. package/lib/objectTypes/conversation.js +2 -2
  109. package/lib/objectTypes/creditCard.js +2 -2
  110. package/lib/objectTypes/crm.d.ts +5 -0
  111. package/lib/objectTypes/crm.js +68 -2
  112. package/lib/objectTypes/document.js +1 -1
  113. package/lib/objectTypes/error.js +2 -2
  114. package/lib/objectTypes/event.js +2 -2
  115. package/lib/objectTypes/external.js +2 -2
  116. package/lib/objectTypes/file.js +2 -2
  117. package/lib/objectTypes/filter.js +2 -2
  118. package/lib/objectTypes/flag.d.ts +1 -0
  119. package/lib/objectTypes/flag.js +35 -0
  120. package/lib/objectTypes/group.js +2 -2
  121. package/lib/objectTypes/iapSubscription.js +2 -2
  122. package/lib/objectTypes/image.d.ts +1 -1
  123. package/lib/objectTypes/image.js +2 -2
  124. package/lib/objectTypes/index.d.ts +2 -0
  125. package/lib/objectTypes/index.js +3 -1
  126. package/lib/objectTypes/location.js +2 -2
  127. package/lib/objectTypes/message.js +2 -2
  128. package/lib/objectTypes/passcode.js +2 -2
  129. package/lib/objectTypes/persona.js +2 -2
  130. package/lib/objectTypes/plan.js +2 -2
  131. package/lib/objectTypes/post.js +2 -2
  132. package/lib/objectTypes/query.js +2 -2
  133. package/lib/objectTypes/reaction.js +2 -2
  134. package/lib/objectTypes/relation.js +2 -2
  135. package/lib/objectTypes/rum.js +4 -4
  136. package/lib/objectTypes/search.js +2 -2
  137. package/lib/objectTypes/statistics.js +2 -2
  138. package/lib/objectTypes/subscription.js +2 -2
  139. package/lib/objectTypes/tag.js +2 -2
  140. package/lib/objectTypes/user.js +10 -2
  141. package/lib/objectTypes/video.d.ts +1 -1
  142. package/lib/objectTypes/video.js +2 -2
  143. package/lib/queries/analytics/analytics.d.ts +1 -0
  144. package/lib/queries/analytics/analytics.js +41 -0
  145. package/lib/queries/content/content.js +2 -2
  146. package/lib/queries/crm/crm.js +52 -13
  147. package/lib/queries/events/events.js +2 -2
  148. package/lib/queries/flags/flags.d.ts +1 -0
  149. package/lib/queries/flags/flags.js +16 -0
  150. package/lib/queries/groups/groups.js +2 -2
  151. package/lib/queries/images/images.js +2 -2
  152. package/lib/queries/index.d.ts +3 -1
  153. package/lib/queries/index.js +13 -3
  154. package/lib/queries/locations/locations.js +2 -2
  155. package/lib/queries/messages/messages.js +1 -1
  156. package/lib/queries/personas/personas.js +2 -2
  157. package/lib/queries/posts/posts.js +2 -2
  158. package/lib/queries/query/query.js +2 -2
  159. package/lib/queries/reactions/reactions.js +2 -2
  160. package/lib/queries/statistics/statistics.js +2 -2
  161. package/lib/queries/subscriptions/subscriptions.js +1 -1
  162. package/lib/queries/tags/tags.js +2 -2
  163. package/lib/queries/users/users.js +2 -2
  164. package/lib/queries/videos/videos.js +2 -2
  165. package/lib/templates/email/layout.js +1 -1
  166. package/lib/templates/email/passwordForgot.js +1 -1
  167. package/lib/templates/email/passwordRecovery.js +1 -1
  168. package/lib/templates/email/verifyEmail.js +1 -1
  169. package/lib/templates/email/welcome.js +1 -1
  170. package/lib/templates/sms/passwordForgot.js +1 -1
  171. package/lib/templates/sms/passwordRecovery.js +1 -1
  172. package/lib/templates/sms/verifyEmail.js +1 -1
  173. package/lib/templates/sms/verifyPhone.js +1 -1
  174. package/lib/templates/sms/welcome.js +1 -1
  175. package/lib/types/analytics.types.d.ts +92 -0
  176. package/lib/types/analytics.types.js +6 -0
  177. package/lib/types/apps.types.d.ts +1 -1
  178. package/lib/types/apps.types.js +2 -2
  179. package/lib/types/arangodb.types.d.ts +2 -2
  180. package/lib/types/arangodb.types.js +2 -2
  181. package/lib/types/auth.types.d.ts +4 -1
  182. package/lib/types/auth.types.js +2 -2
  183. package/lib/types/connections.types.d.ts +1 -1
  184. package/lib/types/connections.types.js +2 -2
  185. package/lib/types/content.types.d.ts +1 -1
  186. package/lib/types/content.types.js +2 -2
  187. package/lib/types/conversations.types.d.ts +1 -1
  188. package/lib/types/conversations.types.js +2 -2
  189. package/lib/types/crm.types.d.ts +58 -2
  190. package/lib/types/crm.types.js +2 -2
  191. package/lib/types/email.types.d.ts +1 -1
  192. package/lib/types/email.types.js +2 -2
  193. package/lib/types/error.types.js +1 -1
  194. package/lib/types/files.types.d.ts +1 -1
  195. package/lib/types/files.types.js +2 -2
  196. package/lib/types/flags.types.d.ts +28 -0
  197. package/lib/types/flags.types.js +3 -0
  198. package/lib/types/google.types.d.ts +1 -1
  199. package/lib/types/google.types.js +2 -2
  200. package/lib/types/groups.types.d.ts +1 -1
  201. package/lib/types/groups.types.js +2 -2
  202. package/lib/types/images.types.d.ts +1 -1
  203. package/lib/types/images.types.js +2 -2
  204. package/lib/types/index.d.ts +3 -1
  205. package/lib/types/index.js +4 -2
  206. package/lib/types/locations.types.d.ts +1 -1
  207. package/lib/types/locations.types.js +2 -2
  208. package/lib/types/messages.types.d.ts +1 -1
  209. package/lib/types/messages.types.js +2 -2
  210. package/lib/types/notifications.types.d.ts +1 -1
  211. package/lib/types/notifications.types.js +2 -2
  212. package/lib/types/payments.types.d.ts +4 -1
  213. package/lib/types/payments.types.js +2 -2
  214. package/lib/types/personas.types.js +1 -1
  215. package/lib/types/posts.types.d.ts +1 -1
  216. package/lib/types/posts.types.js +2 -2
  217. package/lib/types/rum.types.d.ts +3 -3
  218. package/lib/types/rum.types.js +2 -2
  219. package/lib/types/statistics.types.js +1 -1
  220. package/lib/types/tags.types.d.ts +1 -1
  221. package/lib/types/tags.types.js +2 -2
  222. package/lib/types/users.types.d.ts +2 -1
  223. package/lib/types/users.types.js +2 -2
  224. package/lib/types/videos.types.d.ts +1 -1
  225. package/lib/types/videos.types.js +2 -2
  226. package/lib/types/websockets.types.d.ts +1 -1
  227. package/lib/types/websockets.types.js +2 -2
  228. package/lib/upload.js +4 -9
  229. package/lib/utils/adapterUtils.d.ts +1 -1
  230. package/lib/utils/adapterUtils.js +2 -2
  231. package/lib/utils/analyticsUtils.d.ts +1 -1
  232. package/lib/utils/analyticsUtils.js +2 -2
  233. package/lib/utils/appContext.d.ts +2 -0
  234. package/lib/utils/appContext.js +10 -0
  235. package/lib/utils/aqlHelpers.d.ts +1 -1
  236. package/lib/utils/aqlHelpers.js +2 -2
  237. package/lib/utils/arangodbUtils.d.ts +9 -1
  238. package/lib/utils/arangodbUtils.js +10 -2
  239. package/lib/utils/authUtils.js +2 -2
  240. package/lib/utils/awsUtils.js +2 -2
  241. package/lib/utils/collectionRegistry.d.ts +1 -1
  242. package/lib/utils/collectionRegistry.js +17 -2
  243. package/lib/utils/contextUtils.d.ts +2 -2
  244. package/lib/utils/contextUtils.js +2 -2
  245. package/lib/utils/dbI18n.example.d.ts +1 -1
  246. package/lib/utils/dbI18n.example.js +2 -2
  247. package/lib/utils/dbI18n.js +2 -2
  248. package/lib/utils/googleTranslate.d.ts +1 -1
  249. package/lib/utils/googleTranslate.js +2 -2
  250. package/lib/utils/graphqlUtils.d.ts +2 -0
  251. package/lib/utils/graphqlUtils.js +1 -1
  252. package/lib/utils/imageUtils.js +1 -1
  253. package/lib/utils/index.d.ts +1 -1
  254. package/lib/utils/index.js +2 -2
  255. package/lib/utils/languageDetection.js +1 -1
  256. package/lib/utils/localeUtils.d.ts +1 -1
  257. package/lib/utils/localeUtils.example.d.ts +1 -1
  258. package/lib/utils/localeUtils.example.js +2 -2
  259. package/lib/utils/localeUtils.js +2 -2
  260. package/lib/utils/middlewareUtils.js +1 -1
  261. package/lib/utils/queryBuilder.d.ts +1 -1
  262. package/lib/utils/queryBuilder.js +2 -2
  263. package/lib/utils/schemaUtils.js +1 -1
  264. package/lib/utils/sessionUtils.d.ts +4 -0
  265. package/lib/utils/sessionUtils.js +2 -2
  266. package/lib/utils/stripeUtils.d.ts +1 -1
  267. package/lib/utils/stripeUtils.js +2 -2
  268. package/lib/utils/templateUtils.js +1 -1
  269. package/lib/utils/testUtils.js +2 -2
  270. package/lib/utils/translationQueue.d.ts +1 -1
  271. package/lib/utils/translationQueue.example.d.ts +1 -1
  272. package/lib/utils/translationQueue.example.js +2 -2
  273. package/lib/utils/translationQueue.js +2 -2
  274. package/lib/videoProcessing.js +1 -1
  275. package/package.json +49 -86
  276. package/lib/actions/websockets.d.ts +0 -20
  277. package/lib/actions/websockets.js +0 -164
  278. package/lib/mocks/nlabs.png +0 -0
@@ -1,11 +1,14 @@
1
1
  /**
2
2
  * Copyright (c) 2026-Present, Nitrogen Labs, Inc.
3
- * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
- */ import { createHash, parseId, parseString } from '@nlabs/utils/parsers/strings';
3
+ * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
+ */ import { createHash, parseId, parsePhone, parseString } from '@nlabs/utils/parsers/strings';
5
5
  import { aql } from 'arangojs';
6
6
  import { literal } from 'arangojs/aql';
7
7
  import { COLLECTIONS, EDGES } from '../constants/collections.js';
8
+ import { Config } from '../config.js';
8
9
  import { useDb } from '../utils/arangodbUtils.js';
10
+ import { isAdminUser } from '../utils/sessionUtils.js';
11
+ import { sesSend } from './email.js';
9
12
  const now = ()=>Date.now();
10
13
  const collection = (name)=>literal(name);
11
14
  const docKey = (value = '')=>parseId(String(value));
@@ -13,6 +16,271 @@ const docId = (collectionName, key = '')=>`${collectionName}/${docKey(key)}`;
13
16
  const externalKey = (prefix, id = '')=>createHash(`${prefix}-${String(id)}`, null);
14
17
  const cleanString = (value, length = 640)=>parseString(String(value || ''), length);
15
18
  const cleanExternalId = (value, length = 320)=>String(value || '').trim().slice(0, length);
19
+ const ensureDocumentCollection = async (database, name)=>{
20
+ const target = database.collection(name);
21
+ if (await target.exists()) return;
22
+ try {
23
+ await database.createCollection(name);
24
+ } catch (error) {
25
+ if (!await target.exists()) throw error;
26
+ }
27
+ };
28
+ const ensureEdgeCollection = async (database, name)=>{
29
+ const target = database.collection(name);
30
+ if (await target.exists()) return;
31
+ try {
32
+ await database.createEdgeCollection(name);
33
+ } catch (error) {
34
+ if (!await target.exists()) throw error;
35
+ }
36
+ };
37
+ const requireCrmAdmin = (context)=>{
38
+ if (!isAdminUser(context.session)) {
39
+ throw new Error('administrator_access_required');
40
+ }
41
+ };
42
+ export const requireCrmAdministrator = requireCrmAdmin;
43
+ const allowedContactFields = new Set([
44
+ 'email',
45
+ 'firstName',
46
+ 'lastName',
47
+ 'phone',
48
+ 'marketingConsentSource',
49
+ 'crmSource'
50
+ ]);
51
+ const supportPriorities = new Set([
52
+ 'low',
53
+ 'normal',
54
+ 'high',
55
+ 'urgent'
56
+ ]);
57
+ const supportStatuses = new Set([
58
+ 'submitted',
59
+ 'in_progress',
60
+ 'done',
61
+ 'completed'
62
+ ]);
63
+ const supportTypes = new Set([
64
+ 'delivery_issue',
65
+ 'refund_request',
66
+ 'bug_report',
67
+ 'account_issue',
68
+ 'general_support'
69
+ ]);
70
+ const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/u;
71
+ const escapeHtml = (value)=>value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
72
+ const sanitizeHtml = (value)=>String(value || '').replace(/<(script|iframe|object|embed)\b[^>]*>[\s\S]*?<\/\1>/gi, '').replace(/\son\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi, '');
73
+ const sanitizeCss = (value)=>String(value || '').replace(/<\/?style\b[^>]*>/gi, '').replace(/@import\s+[^;]+;?/gi, '').replace(/url\s*\(\s*(['"]?)javascript:[^)]+\)/gi, '');
74
+ const htmlToText = (value)=>value.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
75
+ const chunk = (items, size)=>{
76
+ const groups = [];
77
+ for(let index = 0; index < items.length; index += size)groups.push(items.slice(index, index + size));
78
+ return groups;
79
+ };
80
+ export const submitCrmForm = async (context, input)=>{
81
+ if (typeof input?.marketingOptIn !== 'boolean') throw new Error('required_marketingOptIn');
82
+ const email = cleanString(input.email, 320).toLowerCase();
83
+ const rawPhone = cleanString(input.phone, 80);
84
+ const phone = rawPhone ? parsePhone(rawPhone) || rawPhone : '';
85
+ if (!email && !phone) throw new Error('required_email_or_phone');
86
+ const database = useDb(context.databaseName);
87
+ await ensureDocumentCollection(database, COLLECTIONS.CRM_FORM_SUBMISSIONS);
88
+ const timestamp = now();
89
+ const source = cleanString(input.source || input.formId || 'form', 160);
90
+ const values = input.values || {};
91
+ const firstName = cleanString(input.firstName || values.firstName, 160);
92
+ const lastName = cleanString(input.lastName || values.lastName, 160);
93
+ const generatedUserKey = createHash(email || phone, null);
94
+ const consent = input.marketingOptIn ? {
95
+ marketingOptInAt: timestamp,
96
+ marketingOptOutAt: null
97
+ } : {
98
+ marketingOptOutAt: timestamp
99
+ };
100
+ const userInsert = {
101
+ _key: generatedUserKey,
102
+ active: false,
103
+ added: timestamp,
104
+ email,
105
+ firstName,
106
+ lastName,
107
+ mailingList: input.marketingOptIn,
108
+ marketingConsentSource: source,
109
+ marketingOptIn: input.marketingOptIn,
110
+ modified: timestamp,
111
+ phone,
112
+ type: 'crmContact',
113
+ userAccess: 0,
114
+ userId: generatedUserKey,
115
+ verifiedEmail: false,
116
+ verifiedPhone: false,
117
+ ...consent
118
+ };
119
+ const userUpdate = {
120
+ ...email ? {
121
+ email
122
+ } : {},
123
+ ...firstName ? {
124
+ firstName
125
+ } : {},
126
+ ...lastName ? {
127
+ lastName
128
+ } : {},
129
+ ...phone ? {
130
+ phone
131
+ } : {},
132
+ mailingList: input.marketingOptIn,
133
+ marketingConsentSource: source,
134
+ marketingOptIn: input.marketingOptIn,
135
+ modified: timestamp,
136
+ ...consent
137
+ };
138
+ const user = await database.query(aql`
139
+ LET existing = FIRST(
140
+ FOR user IN ${collection(COLLECTIONS.USERS)}
141
+ FILTER (${email} != "" && LOWER(user.email || "") == ${email})
142
+ || (${phone} != "" && user.phone == ${phone})
143
+ LIMIT 1
144
+ RETURN user
145
+ )
146
+ LET userKey = existing ? existing._key : ${generatedUserKey}
147
+ UPSERT {_key: userKey}
148
+ INSERT MERGE(${userInsert}, {_key: userKey, userId: userKey})
149
+ UPDATE ${userUpdate} IN ${collection(COLLECTIONS.USERS)}
150
+ RETURN NEW
151
+ `).then((cursor)=>cursor.next());
152
+ const userId = docKey(String(user?._key || user?.userId || generatedUserKey));
153
+ const submissionId = createHash(`crm-submission-${timestamp}-${email}-${phone}`, null);
154
+ const submission = {
155
+ _key: submissionId,
156
+ added: timestamp,
157
+ email,
158
+ formId: cleanString(input.formId, 160),
159
+ marketingOptIn: input.marketingOptIn,
160
+ modified: timestamp,
161
+ phone,
162
+ source,
163
+ submissionId,
164
+ userId,
165
+ values
166
+ };
167
+ const saved = await database.query(aql`
168
+ INSERT ${submission} IN ${collection(COLLECTIONS.CRM_FORM_SUBMISSIONS)}
169
+ RETURN NEW
170
+ `).then((cursor)=>cursor.next());
171
+ return saved;
172
+ };
173
+ export const getCrmFormSubmissions = (context)=>{
174
+ requireCrmAdmin(context);
175
+ const database = useDb(context.databaseName);
176
+ return (async ()=>{
177
+ if (!await database.collection(COLLECTIONS.CRM_FORM_SUBMISSIONS).exists()) return [];
178
+ return database.query(aql`
179
+ FOR submission IN ${collection(COLLECTIONS.CRM_FORM_SUBMISSIONS)}
180
+ SORT submission.added DESC
181
+ LIMIT 500
182
+ RETURN submission
183
+ `).then((cursor)=>cursor.all());
184
+ })();
185
+ };
186
+ export const getCrmContacts = (context, filter = {})=>{
187
+ requireCrmAdmin(context);
188
+ const search = cleanString(filter.search, 320).toLowerCase();
189
+ const field = allowedContactFields.has(filter.field || '') ? String(filter.field) : '';
190
+ const value = cleanString(filter.value, 320).toLowerCase();
191
+ const optedInOnly = filter.optedInOnly !== false;
192
+ const operator = [
193
+ 'contains',
194
+ 'equals',
195
+ 'exists'
196
+ ].includes(filter.operator || '') ? filter.operator : 'contains';
197
+ return useDb(context.databaseName).query(aql`
198
+ FOR user IN ${collection(COLLECTIONS.USERS)}
199
+ FILTER ${!optedInOnly} || user.marketingOptIn == true
200
+ FILTER ${!search} || CONTAINS(LOWER(CONCAT_SEPARATOR(" ", user.firstName, user.lastName, user.email, user.phone)), ${search})
201
+ FILTER ${!field} || (${operator === 'exists'}
202
+ ? HAS(user, ${field})
203
+ : (${operator === 'equals'} ? LOWER(TO_STRING(user[${field}])) == ${value} : CONTAINS(LOWER(TO_STRING(user[${field}])), ${value})))
204
+ SORT user.added DESC
205
+ LIMIT 1000
206
+ RETURN MERGE(user, {crmSource: user.marketingConsentSource})
207
+ `).then((cursor)=>cursor.all());
208
+ };
209
+ export const sendCrmCampaign = async (context, input)=>{
210
+ requireCrmAdmin(context);
211
+ const subject = cleanString(input.subject, 320);
212
+ const bodyHtml = sanitizeHtml(input.html);
213
+ const css = sanitizeCss(input.css);
214
+ if (!subject || !bodyHtml) throw new Error('required_campaign_content');
215
+ const candidates = await getCrmContacts(context, {
216
+ ...input.filter,
217
+ optedInOnly: true
218
+ });
219
+ const selectedIds = new Set((input.userIds || []).map((id)=>docKey(id)));
220
+ const recipients = candidates.filter((user)=>Boolean(user.email) && (!selectedIds.size || selectedIds.has(docKey(user.userId || user._key))));
221
+ const timestamp = now();
222
+ const campaignId = createHash(`crm-campaign-${timestamp}-${subject}`, null);
223
+ const database = useDb(context.databaseName);
224
+ const campaign = {
225
+ _key: campaignId,
226
+ added: timestamp,
227
+ campaignId,
228
+ css,
229
+ failedCount: 0,
230
+ html: bodyHtml,
231
+ modified: timestamp,
232
+ recipientCount: recipients.length,
233
+ sentCount: 0,
234
+ status: 'sending',
235
+ subject
236
+ };
237
+ await database.query(aql`INSERT ${campaign} IN ${collection(COLLECTIONS.CRM_CAMPAIGNS)}`);
238
+ let failedCount = 0;
239
+ let sentCount = 0;
240
+ for (const recipientsBatch of chunk(recipients, 50)){
241
+ try {
242
+ await sesSend({
243
+ Destination: {
244
+ BccAddresses: recipientsBatch.map((recipient)=>String(recipient.email))
245
+ },
246
+ Message: {
247
+ Body: {
248
+ Html: {
249
+ Data: `<style>${css}</style>${bodyHtml}`
250
+ },
251
+ Text: {
252
+ Data: htmlToText(bodyHtml)
253
+ }
254
+ },
255
+ Subject: {
256
+ Data: subject
257
+ }
258
+ },
259
+ Source: `"${context.config?.details?.supportName || 'Reaktor'}" <${context.config?.details?.supportEmail || 'support@reaktor.io'}>`
260
+ });
261
+ sentCount += recipientsBatch.length;
262
+ } catch (_error) {
263
+ failedCount += recipientsBatch.length;
264
+ }
265
+ }
266
+ const result = {
267
+ ...campaign,
268
+ failedCount,
269
+ sentAt: now(),
270
+ sentCount,
271
+ status: failedCount ? sentCount ? 'partial' : 'failed' : 'sent'
272
+ };
273
+ await database.query(aql`
274
+ UPDATE ${campaignId} WITH ${{
275
+ failedCount: result.failedCount,
276
+ modified: result.sentAt,
277
+ sentAt: result.sentAt,
278
+ sentCount: result.sentCount,
279
+ status: result.status
280
+ }} IN ${collection(COLLECTIONS.CRM_CAMPAIGNS)}
281
+ `);
282
+ return result;
283
+ };
16
284
  const saveEdge = async (context, edgeCollection, edgeKey, from, to, data = {})=>{
17
285
  const timestamp = now();
18
286
  const edge = {
@@ -181,6 +449,7 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
181
449
  marketingOptInAt: customer.marketingOptIn === true ? timestamp : undefined,
182
450
  modified: timestamp,
183
451
  shopifyCustomerId,
452
+ type: 'crmContact',
184
453
  userId: userKey
185
454
  };
186
455
  const userUpdate = {
@@ -293,10 +562,43 @@ export const getCustomerOrdersByUser = (context, userId)=>{
293
562
  `;
294
563
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
295
564
  };
565
+ const sendSupportTicketEmail = async (context, ticket, details, heading)=>{
566
+ const user = await useDb(context.databaseName).query(aql`
567
+ RETURN DOCUMENT(${docId(COLLECTIONS.USERS, ticket.userId)})
568
+ `).then((cursor)=>cursor.next());
569
+ if (!user?.email) return;
570
+ const supportName = context.config?.details?.supportName || Config.get('details.supportName') || 'Reaktor Support';
571
+ const supportEmail = context.config?.details?.supportEmail || Config.get('details.supportEmail') || 'support@reaktor.io';
572
+ const ticketNumber = String(ticket.ticketNumber || ticket.supportTicketId || ticket._key || '');
573
+ const statusUrl = `https://crm.reaktor.io/support/status?ticket=${encodeURIComponent(ticketNumber)}`;
574
+ const text = `${heading}\n\nTicket: ${ticketNumber}\nStatus: ${ticket.status || 'submitted'}\n\n${details}\n\nTrack this ticket: ${statusUrl}`;
575
+ await sesSend({
576
+ Destination: {
577
+ ToAddresses: [
578
+ String(user.email)
579
+ ]
580
+ },
581
+ Message: {
582
+ Body: {
583
+ Html: {
584
+ Data: `<h1>${escapeHtml(heading)}</h1><p><strong>Ticket:</strong> ${escapeHtml(ticketNumber)}</p><p><strong>Status:</strong> ${escapeHtml(String(ticket.status || 'submitted'))}</p><pre style="white-space:pre-wrap;font-family:inherit">${escapeHtml(details)}</pre><p><a href="${escapeHtml(statusUrl)}">Track this ticket online</a></p>`
585
+ },
586
+ Text: {
587
+ Data: text
588
+ }
589
+ },
590
+ Subject: {
591
+ Data: `[${ticketNumber}] ${heading}`
592
+ }
593
+ },
594
+ Source: `"${supportName}" <${supportEmail}>`
595
+ }).catch(()=>undefined);
596
+ };
296
597
  export const createSupportTicket = async (context, input)=>{
297
598
  const timestamp = now();
298
599
  const userKey = docKey(String(input.userId || ''));
299
600
  const ticketKey = docKey(String(input.supportTicketId || createHash(`support-ticket-${userKey}-${timestamp}`)));
601
+ const ticketNumber = cleanString(input.ticketNumber, 80) || `RKT-${new Date(timestamp).toISOString().slice(0, 10).replace(/-/g, '')}-${ticketKey.slice(0, 8).toUpperCase()}`;
300
602
  const ticket = {
301
603
  _key: ticketKey,
302
604
  added: timestamp,
@@ -306,9 +608,10 @@ export const createSupportTicket = async (context, input)=>{
306
608
  priority: input.priority || 'normal',
307
609
  productId: cleanExternalId(input.productId, 320),
308
610
  shopifyOrderId: cleanString(input.shopifyOrderId, 160),
309
- status: 'open',
611
+ status: 'submitted',
310
612
  subject: cleanString(input.subject, 320),
311
613
  supportTicketId: ticketKey,
614
+ ticketNumber,
312
615
  type: input.type || 'general_support',
313
616
  userId: userKey
314
617
  };
@@ -324,28 +627,131 @@ export const createSupportTicket = async (context, input)=>{
324
627
  });
325
628
  await addSupportTicketEvent(context, {
326
629
  actorUserId: docKey(String(context?.session?.userId || userKey)),
327
- eventType: 'created',
630
+ eventType: 'submitted',
631
+ metadata: {
632
+ details: ticket.description
633
+ },
328
634
  supportTicketId: ticketKey,
329
635
  toValue: ticket.status
330
636
  });
331
637
  return savedTicket;
332
638
  };
333
- export const getSupportTickets = (context, filters = {})=>{
334
- const query = aql`
639
+ export const submitPublicSupportTicket = async (context, input)=>{
640
+ const email = cleanString(input.email, 320).toLowerCase();
641
+ const description = cleanString(input.description, 4000);
642
+ const subject = cleanString(input.subject, 320);
643
+ if (!emailPattern.test(email)) throw new Error('required_valid_email');
644
+ if (!subject) throw new Error('required_subject');
645
+ if (!description) throw new Error('required_description');
646
+ const database = useDb(context.databaseName);
647
+ await Promise.all([
648
+ COLLECTIONS.SUPPORT_TICKET_EVENTS,
649
+ COLLECTIONS.SUPPORT_TICKET_MESSAGES,
650
+ COLLECTIONS.SUPPORT_TICKETS,
651
+ COLLECTIONS.USERS
652
+ ].map((name)=>ensureDocumentCollection(database, name)));
653
+ await Promise.all([
654
+ EDGES.HAS_SUPPORT_TICKET,
655
+ EDGES.HAS_SUPPORT_TICKET_EVENT,
656
+ EDGES.HAS_SUPPORT_TICKET_MESSAGE
657
+ ].map((name)=>ensureEdgeCollection(database, name)));
658
+ const timestamp = now();
659
+ const generatedUserKey = createHash(email, null);
660
+ const optedIn = input.marketingOptIn === true;
661
+ const userInsert = {
662
+ _key: generatedUserKey,
663
+ active: false,
664
+ added: timestamp,
665
+ email,
666
+ firstName: cleanString(input.firstName, 160),
667
+ lastName: cleanString(input.lastName, 160),
668
+ mailingList: optedIn,
669
+ marketingOptIn: optedIn,
670
+ modified: timestamp,
671
+ userId: generatedUserKey
672
+ };
673
+ const userUpdate = {
674
+ ...optedIn ? {
675
+ mailingList: true,
676
+ marketingOptIn: true,
677
+ marketingOptInAt: timestamp
678
+ } : {},
679
+ firstName: cleanString(input.firstName, 160) || undefined,
680
+ lastName: cleanString(input.lastName, 160) || undefined,
681
+ modified: timestamp
682
+ };
683
+ const user = await database.query(aql`
684
+ UPSERT {email: ${email}}
685
+ INSERT ${userInsert}
686
+ UPDATE ${userUpdate}
687
+ IN ${collection(COLLECTIONS.USERS)}
688
+ RETURN NEW
689
+ `).then((cursor)=>cursor.next());
690
+ const ticket = await createSupportTicket(context, {
691
+ description,
692
+ priority: supportPriorities.has(String(input.priority)) ? input.priority : 'normal',
693
+ subject,
694
+ type: supportTypes.has(String(input.type)) ? input.type : 'general_support',
695
+ userId: String(user?._key || user?.userId || generatedUserKey)
696
+ });
697
+ await sendSupportTicketEmail(context, ticket, description, 'We received your support ticket');
698
+ return ticket;
699
+ };
700
+ export const getPublicSupportTicket = async (context, ticketNumber, emailAddress)=>{
701
+ const email = cleanString(emailAddress, 320).toLowerCase();
702
+ const number = cleanString(ticketNumber, 80).toUpperCase();
703
+ if (!emailPattern.test(email) || !number) return null;
704
+ const database = useDb(context.databaseName);
705
+ if (!await database.collection(COLLECTIONS.SUPPORT_TICKETS).exists()) return null;
706
+ return database.query(aql`
335
707
  FOR ticket IN ${collection(COLLECTIONS.SUPPORT_TICKETS)}
336
- ${filters.status ? aql`FILTER ticket.status == ${filters.status}` : aql``}
337
- ${filters.userId ? aql`FILTER ticket.userId == ${docKey(filters.userId)}` : aql``}
708
+ FILTER UPPER(ticket.ticketNumber) == ${number}
338
709
  LET user = DOCUMENT(${COLLECTIONS.USERS}, ticket.userId)
339
- SORT ticket.added DESC
340
- RETURN MERGE(ticket, {user})
341
- `;
342
- return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
710
+ FILTER LOWER(user.email) == ${email}
711
+ LET messages = (
712
+ FOR message IN ${collection(COLLECTIONS.SUPPORT_TICKET_MESSAGES)}
713
+ FILTER message.supportTicketId == ticket._key AND message.visibility == "customer"
714
+ SORT message.added ASC
715
+ RETURN message
716
+ )
717
+ LET events = (
718
+ FOR event IN ${collection(COLLECTIONS.SUPPORT_TICKET_EVENTS)}
719
+ FILTER event.supportTicketId == ticket._key
720
+ SORT event.added ASC
721
+ RETURN event
722
+ )
723
+ LIMIT 1
724
+ RETURN {ticket, messages, events}
725
+ `).then((cursor)=>cursor.next());
726
+ };
727
+ export const getSupportTickets = (context, filters = {})=>{
728
+ const database = useDb(context.databaseName);
729
+ return (async ()=>{
730
+ if (!await database.collection(COLLECTIONS.SUPPORT_TICKETS).exists()) return [];
731
+ const query = aql`
732
+ FOR ticket IN ${collection(COLLECTIONS.SUPPORT_TICKETS)}
733
+ ${filters.status ? aql`FILTER ticket.status == ${filters.status}` : aql``}
734
+ ${filters.userId ? aql`FILTER ticket.userId == ${docKey(filters.userId)}` : aql``}
735
+ LET user = DOCUMENT(${COLLECTIONS.USERS}, ticket.userId)
736
+ SORT ticket.added DESC
737
+ RETURN MERGE(ticket, {user})
738
+ `;
739
+ return database.query(query).then((cursor)=>cursor.all());
740
+ })();
343
741
  };
344
742
  export const updateSupportTicketStatus = async (context, supportTicketId, status, resolutionSummary = '')=>{
345
743
  const ticketKey = docKey(supportTicketId);
346
744
  const timestamp = now();
347
745
  const previous = await useDb(context.databaseName).query(aql`RETURN DOCUMENT(${docId(COLLECTIONS.SUPPORT_TICKETS, ticketKey)})`).then((cursor)=>cursor.next());
348
746
  const update = {
747
+ ...status === 'completed' && {
748
+ completedAt: timestamp,
749
+ resolutionSummary: cleanString(resolutionSummary, 4000)
750
+ },
751
+ ...status === 'done' && {
752
+ doneAt: timestamp,
753
+ resolutionSummary: cleanString(resolutionSummary, 4000)
754
+ },
349
755
  ...status === 'resolved' && {
350
756
  resolvedAt: timestamp,
351
757
  resolutionSummary: cleanString(resolutionSummary, 4000)
@@ -353,6 +759,7 @@ export const updateSupportTicketStatus = async (context, supportTicketId, status
353
759
  ...status === 'closed' && {
354
760
  closedAt: timestamp
355
761
  },
762
+ lastUpdateDetails: cleanString(resolutionSummary, 4000),
356
763
  modified: timestamp,
357
764
  status
358
765
  };
@@ -389,6 +796,29 @@ export const updateSupportTicketStatus = async (context, supportTicketId, status
389
796
  }
390
797
  return ticket;
391
798
  };
799
+ export const updateSupportTicketProgress = async (context, supportTicketId, status, details)=>{
800
+ requireCrmAdmin(context);
801
+ if (!supportStatuses.has(status)) throw new Error('invalid_support_ticket_status');
802
+ const markdown = cleanString(details, 4000);
803
+ if (!markdown) throw new Error('required_update_details');
804
+ const ticket = await updateSupportTicketStatus(context, supportTicketId, status, markdown);
805
+ await addSupportTicketMessage(context, {
806
+ authorUserId: String(context.session?.userId || ''),
807
+ body: markdown,
808
+ supportTicketId,
809
+ visibility: 'customer'
810
+ });
811
+ await createCustomerNotification(context, {
812
+ body: markdown,
813
+ status: 'sent',
814
+ subject: `Ticket ${ticket.ticketNumber || supportTicketId}: ${status.replace(/_/g, ' ')}`,
815
+ supportTicketId,
816
+ type: 'support_ticket_progress',
817
+ userId: ticket.userId
818
+ });
819
+ await sendSupportTicketEmail(context, ticket, markdown, `Support ticket ${status.replace(/_/g, ' ')}`);
820
+ return ticket;
821
+ };
392
822
  export const addSupportTicketMessage = async (context, input)=>{
393
823
  const timestamp = now();
394
824
  const ticketKey = docKey(String(input.supportTicketId || ''));
@@ -495,4 +925,4 @@ export const getCustomerNotificationsByUser = (context, userId)=>{
495
925
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
496
926
  };
497
927
 
498
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvY3JtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI2LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlSWQsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tZXJOb3RpZmljYXRpb25UeXBlLFxuICBDdXN0b21lck9yZGVyVHlwZSxcbiAgTWFpbGluZ0xpc3RUeXBlLFxuICBTaG9waWZ5Q3VzdG9tZXJPcmRlcklucHV0LFxuICBTdXBwb3J0VGlja2V0RXZlbnRUeXBlLFxuICBTdXBwb3J0VGlja2V0TWVzc2FnZVR5cGUsXG4gIFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIFN1cHBvcnRUaWNrZXRUeXBlRGF0YVxufSBmcm9tICcuLi90eXBlcy9jcm0udHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IG5vdyA9ICgpOiBudW1iZXIgPT4gRGF0ZS5ub3coKTtcbmNvbnN0IGNvbGxlY3Rpb24gPSAobmFtZTogc3RyaW5nKSA9PiBsaXRlcmFsKG5hbWUpO1xuY29uc3QgZG9jS2V5ID0gKHZhbHVlID0gJycpOiBzdHJpbmcgPT4gcGFyc2VJZChTdHJpbmcodmFsdWUpKTtcbmNvbnN0IGRvY0lkID0gKGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsIGtleSA9ICcnKTogc3RyaW5nID0+IGAke2NvbGxlY3Rpb25OYW1lfS8ke2RvY0tleShrZXkpfWA7XG5jb25zdCBleHRlcm5hbEtleSA9IChwcmVmaXg6IHN0cmluZywgaWQgPSAnJyk6IHN0cmluZyA9PiBjcmVhdGVIYXNoKGAke3ByZWZpeH0tJHtTdHJpbmcoaWQpfWAsIG51bGwpO1xuY29uc3QgY2xlYW5TdHJpbmcgPSAodmFsdWU6IHVua25vd24sIGxlbmd0aCA9IDY0MCk6IHN0cmluZyA9PiBwYXJzZVN0cmluZyhTdHJpbmcodmFsdWUgfHwgJycpLCBsZW5ndGgpO1xuY29uc3QgY2xlYW5FeHRlcm5hbElkID0gKHZhbHVlOiB1bmtub3duLCBsZW5ndGggPSAzMjApOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCkuc2xpY2UoMCwgbGVuZ3RoKTtcblxuY29uc3Qgc2F2ZUVkZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGVkZ2VDb2xsZWN0aW9uOiBzdHJpbmcsXG4gIGVkZ2VLZXk6IHN0cmluZyxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IGVkZ2UgPSB7XG4gICAgX2Zyb206IGZyb20sXG4gICAgX2tleTogZWRnZUtleSxcbiAgICBfdG86IHRvLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAuLi5kYXRhXG4gIH07XG4gIGNvbnN0IHF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBVUFNFUlQge19rZXk6ICR7ZWRnZUtleX19XG4gICAgSU5TRVJUICR7ZWRnZX1cbiAgICBVUERBVEUgJHtkYXRhfSBJTiAke2NvbGxlY3Rpb24oZWRnZUNvbGxlY3Rpb24pfVxuICBgO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPE1haWxpbmdMaXN0VHlwZT5cbik6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBtYWlsaW5nTGlzdElkID0gZG9jS2V5KFN0cmluZyhpbnB1dD8ubWFpbGluZ0xpc3RJZCB8fCBjcmVhdGVIYXNoKGBtYWlsaW5nLWxpc3QtJHtpbnB1dD8ubmFtZX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3QgbWFpbGluZ0xpc3QgPSB7XG4gICAgX2tleTogbWFpbGluZ0xpc3RJZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGNyZWF0ZWRCeVVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQ/LmRlc2NyaXB0aW9uLCAyMDAwKSxcbiAgICBtYWlsaW5nTGlzdElkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgbmFtZTogY2xlYW5TdHJpbmcoaW5wdXQ/Lm5hbWUsIDE2MCksXG4gICAgc3RhdHVzOiBpbnB1dD8uc3RhdHVzIHx8ICdhY3RpdmUnXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHttYWlsaW5nTGlzdElkfX1cbiAgICBJTlNFUlQgJHttYWlsaW5nTGlzdH1cbiAgICBVUERBVEUgJHt7XG4gICAgICBkZXNjcmlwdGlvbjogbWFpbGluZ0xpc3QuZGVzY3JpcHRpb24sXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgbmFtZTogbWFpbGluZ0xpc3QubmFtZSxcbiAgICAgIHN0YXR1czogbWFpbGluZ0xpc3Quc3RhdHVzXG4gICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1haWxpbmdMaXN0cyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgbGlzdCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUyl9XG4gICAgICBGSUxURVIgbGlzdC5zdGF0dXMgIT0gXCJhcmNoaXZlZFwiXG4gICAgICBTT1JUIGxpc3QuYWRkZWQgREVTQ1xuICAgICAgUkVUVVJOIGxpc3RcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlclRvTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmcsXG4gIHNvdXJjZSA9ICdtYW51YWwnXG4pOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZSB8IG51bGw+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfTUFJTElOR19MSVNULFxuICAgIGVkZ2VLZXksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIGxpc3RLZXkpLFxuICAgIHtcbiAgICAgIGFkZGVkQnlVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgICBzb3VyY2U6IGNsZWFuU3RyaW5nKHNvdXJjZSwgODApLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJ1xuICAgIH1cbiAgKTtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbGBSRVRVUk4gRE9DVU1FTlQoJHtkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBsaXN0S2V5KX0pYClcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgbWFpbGluZ0xpc3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBtb2RpZmllZDogbm93KCksXG4gICAgcmVtb3ZlZEF0OiBub3coKSxcbiAgICBzdGF0dXM6ICdyZW1vdmVkJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBVUERBVEUgJHtlZGdlS2V5fSBXSVRIICR7dXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkudGhlbihCb29sZWFuKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYWlsaW5nTGlzdFVzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBsaXN0SWQgPSBkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBtYWlsaW5nTGlzdElkKTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIHVzZXIsIGVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7bGlzdElkfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgICBGSUxURVIgZWRnZS5zdGF0dXMgPT0gXCJhY3RpdmVcIlxuICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgUkVUVVJOIHVzZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVB1cmNoYXNlZFByb2R1Y3QgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHByb2R1Y3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgcHJvZHVjdEtleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXByb2R1Y3QnLCBwcm9kdWN0SWQpO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1Igb3JkZXIgSU4gMS4uMSBJTkJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QpfVxuICAgICAgRk9SIHVzZXIgSU4gMS4uMSBJTkJPVU5EIG9yZGVyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGlnaWJsZU1haWxpbmdVc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgb3B0aW9uczoge3JlYWRvbmx5IG1haWxpbmdMaXN0SWQ/OiBzdHJpbmc7IHJlYWRvbmx5IHByb2R1Y3RJZD86IHN0cmluZzsgcmVhZG9ubHkgZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cz86IGJvb2xlYW59ID0ge31cbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID0gb3B0aW9ucy5leGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzICE9PSBmYWxzZTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgTEVUIGJhc2VVc2VycyA9IChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiB1c2VyLm1hcmtldGluZ09wdEluID09IHRydWVcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWwgIT0gbnVsbCAmJiB1c2VyLmVtYWlsICE9IFwiXCJcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBudWxsIHx8IHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBcInZhbGlkXCJcbiAgICAgICAgJHtvcHRpb25zLm1haWxpbmdMaXN0SWQgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiBsaXN0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19NQUlMSU5HX0xJU1QpfVxuICAgICAgICAgICAgICBGSUxURVIgbGlzdC5fa2V5ID09ICR7ZG9jS2V5KG9wdGlvbnMubWFpbGluZ0xpc3RJZCl9XG4gICAgICAgICAgICAgIFJFVFVSTiBsaXN0XG4gICAgICAgICAgKSA+IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICAke29wdGlvbnMucHJvZHVjdElkID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICAgICAgRk9SIHByb2R1Y3QgSU4gMS4uMSBPVVRCT1VORCBvcmRlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCl9XG4gICAgICAgICAgICAgICAgRklMVEVSIHByb2R1Y3QucHJvZHVjdElkID09ICR7U3RyaW5nKG9wdGlvbnMucHJvZHVjdElkKX1cbiAgICAgICAgICAgICAgICBSRVRVUk4gcHJvZHVjdFxuICAgICAgICAgICkgPiAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgJHtleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1IgdGlja2V0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQuc3RhdHVzIElOIFtcIm9wZW5cIiwgXCJpbl9wcm9ncmVzc1wiLCBcIndhaXRpbmdfb25fY3VzdG9tZXJcIiwgXCJ3YWl0aW5nX29uX2ludGVybmFsXCJdXG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQucHJpb3JpdHkgSU4gW1wiaGlnaFwiLCBcInVyZ2VudFwiXVxuICAgICAgICAgICAgICBSRVRVUk4gdGlja2V0XG4gICAgICAgICAgKSA9PSAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgRk9SIHVzZXIgSU4gYmFzZVVzZXJzXG4gICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbmdlc3RTaG9waWZ5Q3VzdG9tZXJPcmRlciA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFNob3BpZnlDdXN0b21lck9yZGVySW5wdXRcbik6IFByb21pc2U8Q3VzdG9tZXJPcmRlclR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHNob3BpZnlDdXN0b21lcklkID0gY2xlYW5FeHRlcm5hbElkKGlucHV0LnNob3BpZnlDdXN0b21lcklkLCAxNjApO1xuICBjb25zdCBzaG9waWZ5T3JkZXJJZCA9IGNsZWFuRXh0ZXJuYWxJZChpbnB1dC5zaG9waWZ5T3JkZXJJZCwgMTYwKTtcbiAgY29uc3QgY3VzdG9tZXIgPSBpbnB1dC5jdXN0b21lciB8fCB7fTtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhjdXN0b21lci5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBwcm9kdWN0SWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi4oaW5wdXQucHJvZHVjdElkcyB8fCBbXSksIC4uLihpbnB1dC5wcm9kdWN0cyB8fCBbXSkubWFwKChwcm9kdWN0KSA9PiBwcm9kdWN0LnByb2R1Y3RJZCldXG4gICAgLm1hcCgocHJvZHVjdElkKSA9PiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdElkLCAzMjApKVxuICAgIC5maWx0ZXIoQm9vbGVhbikpKTtcblxuICBpZighc2hvcGlmeUN1c3RvbWVySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3Nob3BpZnlDdXN0b21lcklkJyk7XG4gIH1cbiAgaWYoIXNob3BpZnlPcmRlcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9zaG9waWZ5T3JkZXJJZCcpO1xuICB9XG4gIGlmKCFlbWFpbCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfY3VzdG9tZXJFbWFpbCcpO1xuICB9XG5cbiAgY29uc3QgdXNlcktleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXVzZXInLCBzaG9waWZ5Q3VzdG9tZXJJZCk7XG4gIGNvbnN0IHVzZXJJbnNlcnQgPSB7XG4gICAgX2tleTogdXNlcktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5sYXN0TmFtZSwgMTYwKSxcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiAnc2hvcGlmeScsXG4gICAgbWFya2V0aW5nT3B0SW46IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlLFxuICAgIG1hcmtldGluZ09wdEluQXQ6IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlID8gdGltZXN0YW1wIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWQsXG4gICAgdXNlcklkOiB1c2VyS2V5XG4gIH07XG4gIGNvbnN0IHVzZXJVcGRhdGUgPSB7XG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5maXJzdE5hbWUsIDE2MCksXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmxhc3ROYW1lLCAxNjApLFxuICAgIGxhc3RQdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6ICdzaG9waWZ5JyxcbiAgICBtYXJrZXRpbmdPcHRJbjogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZFxuICB9O1xuICBjb25zdCB1c2VyUXVlcnkgPSBhcWxgXG4gICAgTEVUIGV4aXN0aW5nID0gRklSU1QoXG4gICAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgICBGSUxURVIgdXNlci5zaG9waWZ5Q3VzdG9tZXJJZCA9PSAke3Nob3BpZnlDdXN0b21lcklkfSB8fCB1c2VyLmVtYWlsID09ICR7ZW1haWx9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke3VzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3QgdXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeSh1c2VyUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGU7XG4gIGNvbnN0IHJlc29sdmVkVXNlcktleSA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgdXNlcktleSkpO1xuICBjb25zdCBvcmRlcktleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LW9yZGVyJywgc2hvcGlmeU9yZGVySWQpO1xuICBjb25zdCBvcmRlciA9IHtcbiAgICBfa2V5OiBvcmRlcktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGN1cnJlbmN5OiBjbGVhblN0cmluZyhpbnB1dC5jdXJyZW5jeSwgMykudG9VcHBlckNhc2UoKSxcbiAgICBjdXN0b21lck9yZGVySWQ6IG9yZGVyS2V5LFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJvZHVjdElkcyxcbiAgICBwdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkLFxuICAgIHNob3BpZnlPcmRlcklkLFxuICAgIHRvdGFsUHJpY2U6IE51bWJlcihpbnB1dC50b3RhbFByaWNlIHx8IDApLFxuICAgIHVzZXJJZDogcmVzb2x2ZWRVc2VyS2V5XG4gIH07XG4gIGNvbnN0IG9yZGVyUXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke29yZGVyS2V5fX1cbiAgICBJTlNFUlQgJHtvcmRlcn1cbiAgICBVUERBVEUgJHt7XG4gICAgICBjdXJyZW5jeTogb3JkZXIuY3VycmVuY3ksXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgcHJvZHVjdElkcyxcbiAgICAgIHB1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCxcbiAgICAgIHRvdGFsUHJpY2U6IG9yZGVyLnRvdGFsUHJpY2UsXG4gICAgICB1c2VySWQ6IHJlc29sdmVkVXNlcktleVxuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9PUkRFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRPcmRlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShvcmRlclF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIEN1c3RvbWVyT3JkZXJUeXBlO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX09SREVSLFxuICAgIGNyZWF0ZUhhc2goYGhhc0N1c3RvbWVyT3JkZXItJHtyZXNvbHZlZFVzZXJLZXl9LSR7b3JkZXJLZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTLCBvcmRlcktleSksXG4gICAge3B1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCwgc2hvcGlmeUN1c3RvbWVySWQsIHNob3BpZnlPcmRlcklkfVxuICApO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHByb2R1Y3RJZHMubWFwKGFzeW5jIChwcm9kdWN0SWQpID0+IHtcbiAgICBjb25zdCBwcm9kdWN0ID0gKGlucHV0LnByb2R1Y3RzIHx8IFtdKS5maW5kKChpdGVtKSA9PiBpdGVtLnByb2R1Y3RJZCA9PT0gcHJvZHVjdElkKSB8fCB7cHJvZHVjdElkfTtcbiAgICBjb25zdCBwcm9kdWN0S2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktcHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gICAgY29uc3QgcHJvZHVjdERvYyA9IHtcbiAgICAgIF9rZXk6IHByb2R1Y3RLZXksXG4gICAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHByb2R1Y3RJZCxcbiAgICAgIHRpdGxlOiBjbGVhblN0cmluZyhwcm9kdWN0LnRpdGxlLCAzMjApLFxuICAgICAgdmFyaWFudElkOiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdC52YXJpYW50SWQsIDE2MClcbiAgICB9O1xuICAgIGNvbnN0IHByb2R1Y3RRdWVyeSA9IGFxbGBcbiAgICAgIFVQU0VSVCB7X2tleTogJHtwcm9kdWN0S2V5fX1cbiAgICAgIElOU0VSVCAke3Byb2R1Y3REb2N9XG4gICAgICBVUERBVEUgJHt7XG4gICAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICAgIHRpdGxlOiBwcm9kdWN0RG9jLnRpdGxlLFxuICAgICAgICB2YXJpYW50SWQ6IHByb2R1Y3REb2MudmFyaWFudElkXG4gICAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUyl9XG4gICAgYDtcbiAgICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocHJvZHVjdFF1ZXJ5KTtcbiAgICBhd2FpdCBzYXZlRWRnZShcbiAgICAgIGNvbnRleHQsXG4gICAgICBFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QsXG4gICAgICBjcmVhdGVIYXNoKGBoYXNQdXJjaGFzZWRQcm9kdWN0LSR7b3JkZXJLZXl9LSR7cHJvZHVjdEtleX1gKSxcbiAgICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUywgb3JkZXJLZXkpLFxuICAgICAgZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSksXG4gICAgICB7cHJvZHVjdElkLCBwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXR9XG4gICAgKTtcbiAgfSkpO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgVVBEQVRFICR7cmVzb2x2ZWRVc2VyS2V5fVxuICAgIFdJVEgge1xuICAgICAgbGFzdFB1cmNoYXNlZEF0OiAke29yZGVyLnB1cmNoYXNlZEF0fSxcbiAgICAgIHRvdGFsT3JkZXJDb3VudDogTEVOR1RIKFxuICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICBSRVRVUk4gb3JkZXJcbiAgICAgICksXG4gICAgICB0b3RhbFNwZW5kOiBTVU0oXG4gICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgIFJFVFVSTiBUT19OVU1CRVIob3JkZXIudG90YWxQcmljZSlcbiAgICAgIClcbiAgICB9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gIGApO1xuXG4gIHJldHVybiBzYXZlZE9yZGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1c3RvbWVyT3JkZXJzQnlVc2VyID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxDdXN0b21lck9yZGVyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgU09SVCBvcmRlci5wdXJjaGFzZWRBdCBERVNDXG4gICAgICBSRVRVUk4gb3JkZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldFR5cGVEYXRhPlxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnVzZXJJZCB8fCAnJykpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IHRpY2tldCA9IHtcbiAgICBfa2V5OiB0aWNrZXRLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBhc3NpZ25lZFRvVXNlcklkOiBkb2NLZXkoU3RyaW5nKGlucHV0LmFzc2lnbmVkVG9Vc2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQuZGVzY3JpcHRpb24sIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJpb3JpdHk6IGlucHV0LnByaW9yaXR5IHx8ICdub3JtYWwnLFxuICAgIHByb2R1Y3RJZDogY2xlYW5FeHRlcm5hbElkKGlucHV0LnByb2R1Y3RJZCwgMzIwKSxcbiAgICBzaG9waWZ5T3JkZXJJZDogY2xlYW5TdHJpbmcoaW5wdXQuc2hvcGlmeU9yZGVySWQsIDE2MCksXG4gICAgc3RhdHVzOiAnb3BlbicsXG4gICAgc3ViamVjdDogY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0eXBlOiBpbnB1dC50eXBlIHx8ICdnZW5lcmFsX3N1cHBvcnQnLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHt0aWNrZXR9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRUaWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldC0ke3VzZXJLZXl9LSR7dGlja2V0S2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAge3ByaW9yaXR5OiB0aWNrZXQucHJpb3JpdHksIHN0YXR1czogdGlja2V0LnN0YXR1cywgdHlwZTogdGlja2V0LnR5cGV9XG4gICk7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRFdmVudChjb250ZXh0LCB7XG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8IHVzZXJLZXkpKSxcbiAgICBldmVudFR5cGU6ICdjcmVhdGVkJyxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiB0aWNrZXQuc3RhdHVzXG4gIH0pO1xuXG4gIHJldHVybiBzYXZlZFRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZmlsdGVyczoge3JlYWRvbmx5IHN0YXR1cz86IHN0cmluZzsgcmVhZG9ubHkgdXNlcklkPzogc3RyaW5nfSA9IHt9XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB0aWNrZXQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgICAke2ZpbHRlcnMuc3RhdHVzID8gYXFsYEZJTFRFUiB0aWNrZXQuc3RhdHVzID09ICR7ZmlsdGVycy5zdGF0dXN9YCA6IGFxbGBgfVxuICAgICAgJHtmaWx0ZXJzLnVzZXJJZCA/IGFxbGBGSUxURVIgdGlja2V0LnVzZXJJZCA9PSAke2RvY0tleShmaWx0ZXJzLnVzZXJJZCl9YCA6IGFxbGBgfVxuICAgICAgTEVUIHVzZXIgPSBET0NVTUVOVCgke0NPTExFQ1RJT05TLlVTRVJTfSwgdGlja2V0LnVzZXJJZClcbiAgICAgIFNPUlQgdGlja2V0LmFkZGVkIERFU0NcbiAgICAgIFJFVFVSTiBNRVJHRSh0aWNrZXQsIHt1c2VyfSlcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmcsXG4gIHN0YXR1czogU3VwcG9ydFRpY2tldFN0YXR1cyxcbiAgcmVzb2x1dGlvblN1bW1hcnkgPSAnJ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KHN1cHBvcnRUaWNrZXRJZCk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKVxuICAgIC5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpfSlgKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFN1cHBvcnRUaWNrZXRUeXBlRGF0YSB8IG51bGw7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAuLi4oc3RhdHVzID09PSAncmVzb2x2ZWQnICYmIHtyZXNvbHZlZEF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAnY2xvc2VkJyAmJiB7Y2xvc2VkQXQ6IHRpbWVzdGFtcH0pLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc3RhdHVzXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke3RpY2tldEtleX0gV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgU3VwcG9ydFRpY2tldFR5cGVEYXRhO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIGVkZ2UgSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICBGSUxURVIgZWRnZS5fdG8gPT0gJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSl9XG4gICAgICBVUERBVEUgZWRnZSBXSVRIICR7e1xuICAgICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgICByZXNvbHZlZEF0OiBzdGF0dXMgPT09ICdyZXNvbHZlZCcgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1c1xuICAgICAgfX0gSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gIGApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGV2ZW50VHlwZTogJ3N0YXR1c19jaGFuZ2VkJyxcbiAgICBmcm9tVmFsdWU6IHByZXZpb3VzPy5zdGF0dXMsXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogc3RhdHVzXG4gIH0pO1xuXG4gIGlmKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJykge1xuICAgIGF3YWl0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uKGNvbnRleHQsIHtcbiAgICAgIGJvZHk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5IHx8ICdZb3VyIHN1cHBvcnQgdGlja2V0IGhhcyBiZWVuIHJlc29sdmVkLicsIDQwMDApLFxuICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIHN1YmplY3Q6IGBSZXNvbHZlZDogJHt0aWNrZXQuc3ViamVjdCB8fCAnU3VwcG9ydCB0aWNrZXQnfWAsXG4gICAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9yZXNvbHZlZCcsXG4gICAgICB1c2VySWQ6IHRpY2tldC51c2VySWRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpO1xuICBjb25zdCBtZXNzYWdlS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0TWVzc2FnZUlkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LW1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgX2tleTogbWVzc2FnZUtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGF1dGhvclVzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hdXRob3JVc2VySWQgfHwgY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgYm9keTogY2xlYW5TdHJpbmcoaW5wdXQuYm9keSwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICBzdXBwb3J0VGlja2V0TWVzc2FnZUlkOiBtZXNzYWdlS2V5LFxuICAgIHZpc2liaWxpdHk6IGlucHV0LnZpc2liaWxpdHkgfHwgJ2N1c3RvbWVyJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHttZXNzYWdlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRNZXNzYWdlID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldE1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7bWVzc2FnZUtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMsIG1lc3NhZ2VLZXkpLFxuICAgIHthdXRob3JVc2VySWQ6IG1lc3NhZ2UuYXV0aG9yVXNlcklkLCB2aXNpYmlsaXR5OiBtZXNzYWdlLnZpc2liaWxpdHl9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkTWVzc2FnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBtZXNzYWdlIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHN1cHBvcnRUaWNrZXRJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSl9XG4gICAgICBTT1JUIG1lc3NhZ2UuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gbWVzc2FnZVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSk7XG4gIGNvbnN0IGV2ZW50S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0RXZlbnRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC1ldmVudC0ke3RpY2tldEtleX0tJHt0aW1lc3RhbXB9LSR7aW5wdXQuZXZlbnRUeXBlfWApKSk7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIF9rZXk6IGV2ZW50S2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuYWN0b3JVc2VySWQgfHwgJycpKSxcbiAgICBldmVudFR5cGU6IGNsZWFuU3RyaW5nKGlucHV0LmV2ZW50VHlwZSwgMTYwKSxcbiAgICBmcm9tVmFsdWU6IGNsZWFuU3RyaW5nKGlucHV0LmZyb21WYWx1ZSwgMzIwKSxcbiAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEgfHwge30sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0RXZlbnRJZDogZXZlbnRLZXksXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogY2xlYW5TdHJpbmcoaW5wdXQudG9WYWx1ZSwgMzIwKVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtldmVudH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZEV2ZW50ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5ULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXRFdmVudC0ke3RpY2tldEtleX0tJHtldmVudEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTLCBldmVudEtleSksXG4gICAge2FjdG9yVXNlcklkOiBldmVudC5hY3RvclVzZXJJZCwgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGV9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkRXZlbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldEV2ZW50VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBldmVudCBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCBzdXBwb3J0VGlja2V0SWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UKX1cbiAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gZXZlbnRcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZT5cbik6IFByb21pc2U8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC51c2VySWQgfHwgJycpKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5jdXN0b21lck5vdGlmaWNhdGlvbklkIHx8IGNyZWF0ZUhhc2goYGN1c3RvbWVyLW5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICBfa2V5OiBub3RpZmljYXRpb25LZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBib2R5OiBjbGVhblN0cmluZyhpbnB1dC5ib2R5LCA0MDAwKSxcbiAgICBjdXN0b21lck5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25LZXksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzZW50QXQ6IGlucHV0LnNlbnRBdCxcbiAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyB8fCAncXVldWVkJyxcbiAgICBzdWJqZWN0OiBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKSxcbiAgICB0eXBlOiBjbGVhblN0cmluZyhpbnB1dC50eXBlLCAxNjApLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtub3RpZmljYXRpb259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkTm90aWZpY2F0aW9uID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7bm90aWZpY2F0aW9uS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TLCBub3RpZmljYXRpb25LZXkpLFxuICAgIHtcbiAgICAgIHN0YXR1czogbm90aWZpY2F0aW9uLnN0YXR1cyxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogbm90aWZpY2F0aW9uLnN1cHBvcnRUaWNrZXRJZCxcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBzYXZlZE5vdGlmaWNhdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBub3RpZmljYXRpb24gSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTil9XG4gICAgICBTT1JUIG5vdGlmaWNhdGlvbi5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbm90aWZpY2F0aW9uXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlU3RyaW5nIiwiYXFsIiwibGl0ZXJhbCIsIkNPTExFQ1RJT05TIiwiRURHRVMiLCJ1c2VEYiIsIm5vdyIsIkRhdGUiLCJjb2xsZWN0aW9uIiwibmFtZSIsImRvY0tleSIsInZhbHVlIiwiU3RyaW5nIiwiZG9jSWQiLCJjb2xsZWN0aW9uTmFtZSIsImtleSIsImV4dGVybmFsS2V5IiwicHJlZml4IiwiaWQiLCJjbGVhblN0cmluZyIsImxlbmd0aCIsImNsZWFuRXh0ZXJuYWxJZCIsInRyaW0iLCJzbGljZSIsInNhdmVFZGdlIiwiY29udGV4dCIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUtleSIsImZyb20iLCJ0byIsImRhdGEiLCJ0aW1lc3RhbXAiLCJlZGdlIiwiX2Zyb20iLCJfa2V5IiwiX3RvIiwiYWRkZWQiLCJtb2RpZmllZCIsInF1ZXJ5IiwiZGF0YWJhc2VOYW1lIiwiY3JlYXRlTWFpbGluZ0xpc3QiLCJpbnB1dCIsIm1haWxpbmdMaXN0SWQiLCJtYWlsaW5nTGlzdCIsImNyZWF0ZWRCeVVzZXJJZCIsInNlc3Npb24iLCJ1c2VySWQiLCJkZXNjcmlwdGlvbiIsInN0YXR1cyIsIk1BSUxJTkdfTElTVFMiLCJ0aGVuIiwiY3Vyc29yIiwibmV4dCIsImdldE1haWxpbmdMaXN0cyIsImFsbCIsImFkZFVzZXJUb01haWxpbmdMaXN0Iiwic291cmNlIiwidXNlcktleSIsImxpc3RLZXkiLCJIQVNfTUFJTElOR19MSVNUIiwiVVNFUlMiLCJhZGRlZEJ5VXNlcklkIiwicmVtb3ZlVXNlckZyb21NYWlsaW5nTGlzdCIsInVwZGF0ZSIsInJlbW92ZWRBdCIsIkJvb2xlYW4iLCJnZXRNYWlsaW5nTGlzdFVzZXJzIiwibGlzdElkIiwiZ2V0VXNlcnNCeVB1cmNoYXNlZFByb2R1Y3QiLCJwcm9kdWN0SWQiLCJwcm9kdWN0S2V5IiwiU0hPUElGWV9QUk9EVUNUUyIsIkhBU19QVVJDSEFTRURfUFJPRFVDVCIsIkhBU19DVVNUT01FUl9PUkRFUiIsImdldEVsaWdpYmxlTWFpbGluZ1VzZXJzIiwib3B0aW9ucyIsImV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMiLCJIQVNfU1VQUE9SVF9USUNLRVQiLCJpbmdlc3RTaG9waWZ5Q3VzdG9tZXJPcmRlciIsInNob3BpZnlDdXN0b21lcklkIiwic2hvcGlmeU9yZGVySWQiLCJjdXN0b21lciIsImVtYWlsIiwidG9Mb3dlckNhc2UiLCJwcm9kdWN0SWRzIiwiQXJyYXkiLCJTZXQiLCJwcm9kdWN0cyIsIm1hcCIsInByb2R1Y3QiLCJmaWx0ZXIiLCJFcnJvciIsInVzZXJJbnNlcnQiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsIm1hcmtldGluZ0NvbnNlbnRTb3VyY2UiLCJtYXJrZXRpbmdPcHRJbiIsIm1hcmtldGluZ09wdEluQXQiLCJ1bmRlZmluZWQiLCJ1c2VyVXBkYXRlIiwibGFzdFB1cmNoYXNlZEF0IiwicHVyY2hhc2VkQXQiLCJ1c2VyUXVlcnkiLCJ1c2VyIiwicmVzb2x2ZWRVc2VyS2V5Iiwib3JkZXJLZXkiLCJvcmRlciIsImN1cnJlbmN5IiwidG9VcHBlckNhc2UiLCJjdXN0b21lck9yZGVySWQiLCJ0b3RhbFByaWNlIiwiTnVtYmVyIiwib3JkZXJRdWVyeSIsIkNVU1RPTUVSX09SREVSUyIsInNhdmVkT3JkZXIiLCJQcm9taXNlIiwiZmluZCIsIml0ZW0iLCJwcm9kdWN0RG9jIiwidGl0bGUiLCJ2YXJpYW50SWQiLCJwcm9kdWN0UXVlcnkiLCJnZXRDdXN0b21lck9yZGVyc0J5VXNlciIsImNyZWF0ZVN1cHBvcnRUaWNrZXQiLCJ0aWNrZXRLZXkiLCJzdXBwb3J0VGlja2V0SWQiLCJ0aWNrZXQiLCJhc3NpZ25lZFRvVXNlcklkIiwicHJpb3JpdHkiLCJzdWJqZWN0IiwidHlwZSIsIlNVUFBPUlRfVElDS0VUUyIsInNhdmVkVGlja2V0IiwiYWRkU3VwcG9ydFRpY2tldEV2ZW50IiwiYWN0b3JVc2VySWQiLCJldmVudFR5cGUiLCJ0b1ZhbHVlIiwiZ2V0U3VwcG9ydFRpY2tldHMiLCJmaWx0ZXJzIiwidXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyIsInJlc29sdXRpb25TdW1tYXJ5IiwicHJldmlvdXMiLCJyZXNvbHZlZEF0IiwiY2xvc2VkQXQiLCJmcm9tVmFsdWUiLCJjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbiIsImJvZHkiLCJhZGRTdXBwb3J0VGlja2V0TWVzc2FnZSIsIm1lc3NhZ2VLZXkiLCJzdXBwb3J0VGlja2V0TWVzc2FnZUlkIiwibWVzc2FnZSIsImF1dGhvclVzZXJJZCIsInZpc2liaWxpdHkiLCJTVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyIsInNhdmVkTWVzc2FnZSIsIkhBU19TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFIiwiZ2V0U3VwcG9ydFRpY2tldE1lc3NhZ2VzIiwiZXZlbnRLZXkiLCJzdXBwb3J0VGlja2V0RXZlbnRJZCIsImV2ZW50IiwibWV0YWRhdGEiLCJTVVBQT1JUX1RJQ0tFVF9FVkVOVFMiLCJzYXZlZEV2ZW50IiwiSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UIiwiZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyIsIm5vdGlmaWNhdGlvbktleSIsImN1c3RvbWVyTm90aWZpY2F0aW9uSWQiLCJub3RpZmljYXRpb24iLCJzZW50QXQiLCJDVVNUT01FUl9OT1RJRklDQVRJT05TIiwic2F2ZWROb3RpZmljYXRpb24iLCJIQVNfQ1VTVE9NRVJfTk9USUZJQ0FUSU9OIiwiZ2V0Q3VzdG9tZXJOb3RpZmljYXRpb25zQnlVc2VyIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxVQUFVLEVBQUVDLE9BQU8sRUFBRUMsV0FBVyxRQUFPLCtCQUErQjtBQUM5RSxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUVyQyxTQUFRQyxXQUFXLEVBQUVDLEtBQUssUUFBTyw4QkFBOEI7QUFDL0QsU0FBUUMsS0FBSyxRQUFPLDRCQUE0QjtBQWdCaEQsTUFBTUMsTUFBTSxJQUFjQyxLQUFLRCxHQUFHO0FBQ2xDLE1BQU1FLGFBQWEsQ0FBQ0Ms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
928
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL3JlYWt0b3IvcmVha3Rvci9wYWNrYWdlcy9yZWFrdG9yL3NyYy9hY3Rpb25zL2NybS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyNi1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUlkLCBwYXJzZVBob25lLCBwYXJzZVN0cmluZ30gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtsaXRlcmFsfSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuXG5pbXBvcnQge0NPTExFQ1RJT05TLCBFREdFU30gZnJvbSAnLi4vY29uc3RhbnRzL2NvbGxlY3Rpb25zLmpzJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2lzQWRtaW5Vc2VyfSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMuanMnO1xuaW1wb3J0IHtzZXNTZW5kfSBmcm9tICcuL2VtYWlsLmpzJztcblxuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDdXN0b21lck5vdGlmaWNhdGlvblR5cGUsXG4gIEN1c3RvbWVyT3JkZXJUeXBlLFxuICBDcm1DYW1wYWlnbklucHV0LFxuICBDcm1DYW1wYWlnblR5cGUsXG4gIENybUNvbnRhY3RGaWx0ZXIsXG4gIENybUZvcm1TdWJtaXNzaW9uSW5wdXQsXG4gIENybUZvcm1TdWJtaXNzaW9uVHlwZSxcbiAgTWFpbGluZ0xpc3RUeXBlLFxuICBQdWJsaWNTdXBwb3J0VGlja2V0RmVlZCxcbiAgUHVibGljU3VwcG9ydFRpY2tldElucHV0LFxuICBTaG9waWZ5Q3VzdG9tZXJPcmRlcklucHV0LFxuICBTdXBwb3J0VGlja2V0RXZlbnRUeXBlLFxuICBTdXBwb3J0VGlja2V0TWVzc2FnZVR5cGUsXG4gIFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIFN1cHBvcnRUaWNrZXRUeXBlRGF0YVxufSBmcm9tICcuLi90eXBlcy9jcm0udHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IG5vdyA9ICgpOiBudW1iZXIgPT4gRGF0ZS5ub3coKTtcbmNvbnN0IGNvbGxlY3Rpb24gPSAobmFtZTogc3RyaW5nKSA9PiBsaXRlcmFsKG5hbWUpO1xuY29uc3QgZG9jS2V5ID0gKHZhbHVlID0gJycpOiBzdHJpbmcgPT4gcGFyc2VJZChTdHJpbmcodmFsdWUpKTtcbmNvbnN0IGRvY0lkID0gKGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsIGtleSA9ICcnKTogc3RyaW5nID0+IGAke2NvbGxlY3Rpb25OYW1lfS8ke2RvY0tleShrZXkpfWA7XG5jb25zdCBleHRlcm5hbEtleSA9IChwcmVmaXg6IHN0cmluZywgaWQgPSAnJyk6IHN0cmluZyA9PiBjcmVhdGVIYXNoKGAke3ByZWZpeH0tJHtTdHJpbmcoaWQpfWAsIG51bGwpO1xuY29uc3QgY2xlYW5TdHJpbmcgPSAodmFsdWU6IHVua25vd24sIGxlbmd0aCA9IDY0MCk6IHN0cmluZyA9PiBwYXJzZVN0cmluZyhTdHJpbmcodmFsdWUgfHwgJycpLCBsZW5ndGgpO1xuY29uc3QgY2xlYW5FeHRlcm5hbElkID0gKHZhbHVlOiB1bmtub3duLCBsZW5ndGggPSAzMjApOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCkuc2xpY2UoMCwgbGVuZ3RoKTtcbmNvbnN0IGVuc3VyZURvY3VtZW50Q29sbGVjdGlvbiA9IGFzeW5jIChkYXRhYmFzZTogUmV0dXJuVHlwZTx0eXBlb2YgdXNlRGI+LCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdGFyZ2V0ID0gZGF0YWJhc2UuY29sbGVjdGlvbihuYW1lKTtcbiAgaWYoYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgZGF0YWJhc2UuY3JlYXRlQ29sbGVjdGlvbihuYW1lKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGlmKCFhd2FpdCB0YXJnZXQuZXhpc3RzKCkpIHRocm93IGVycm9yO1xuICB9XG59O1xuY29uc3QgZW5zdXJlRWRnZUNvbGxlY3Rpb24gPSBhc3luYyAoZGF0YWJhc2U6IFJldHVyblR5cGU8dHlwZW9mIHVzZURiPiwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGRhdGFiYXNlLmNvbGxlY3Rpb24obmFtZSk7XG4gIGlmKGF3YWl0IHRhcmdldC5leGlzdHMoKSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IGRhdGFiYXNlLmNyZWF0ZUVkZ2VDb2xsZWN0aW9uKG5hbWUpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgaWYoIWF3YWl0IHRhcmdldC5leGlzdHMoKSkgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmNvbnN0IHJlcXVpcmVDcm1BZG1pbiA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogdm9pZCA9PiB7XG4gIGlmKCFpc0FkbWluVXNlcihjb250ZXh0LnNlc3Npb24gYXMgYW55KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignYWRtaW5pc3RyYXRvcl9hY2Nlc3NfcmVxdWlyZWQnKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCByZXF1aXJlQ3JtQWRtaW5pc3RyYXRvciA9IHJlcXVpcmVDcm1BZG1pbjtcblxuY29uc3QgYWxsb3dlZENvbnRhY3RGaWVsZHMgPSBuZXcgU2V0KFsnZW1haWwnLCAnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3Bob25lJywgJ21hcmtldGluZ0NvbnNlbnRTb3VyY2UnLCAnY3JtU291cmNlJ10pO1xuY29uc3Qgc3VwcG9ydFByaW9yaXRpZXMgPSBuZXcgU2V0KFsnbG93JywgJ25vcm1hbCcsICdoaWdoJywgJ3VyZ2VudCddKTtcbmNvbnN0IHN1cHBvcnRTdGF0dXNlcyA9IG5ldyBTZXQoWydzdWJtaXR0ZWQnLCAnaW5fcHJvZ3Jlc3MnLCAnZG9uZScsICdjb21wbGV0ZWQnXSk7XG5jb25zdCBzdXBwb3J0VHlwZXMgPSBuZXcgU2V0KFsnZGVsaXZlcnlfaXNzdWUnLCAncmVmdW5kX3JlcXVlc3QnLCAnYnVnX3JlcG9ydCcsICdhY2NvdW50X2lzc3VlJywgJ2dlbmVyYWxfc3VwcG9ydCddKTtcbmNvbnN0IGVtYWlsUGF0dGVybiA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvdTtcbmNvbnN0IGVzY2FwZUh0bWwgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB2YWx1ZS5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuY29uc3Qgc2FuaXRpemVIdG1sID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSB8fCAnJylcbiAgLnJlcGxhY2UoLzwoc2NyaXB0fGlmcmFtZXxvYmplY3R8ZW1iZWQpXFxiW14+XSo+W1xcc1xcU10qPzxcXC9cXDE+L2dpLCAnJylcbiAgLnJlcGxhY2UoL1xcc29uXFx3K1xccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXlxccz5dKykvZ2ksICcnKTtcbmNvbnN0IHNhbml0aXplQ3NzID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSB8fCAnJylcbiAgLnJlcGxhY2UoLzxcXC8/c3R5bGVcXGJbXj5dKj4vZ2ksICcnKVxuICAucmVwbGFjZSgvQGltcG9ydFxccytbXjtdKzs/L2dpLCAnJylcbiAgLnJlcGxhY2UoL3VybFxccypcXChcXHMqKFsnXCJdPylqYXZhc2NyaXB0OlteKV0rXFwpL2dpLCAnJyk7XG5jb25zdCBodG1sVG9UZXh0ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gdmFsdWUucmVwbGFjZSgvPFtePl0rPi9nLCAnICcpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG5jb25zdCBjaHVuayA9IDxUPihpdGVtczogcmVhZG9ubHkgVFtdLCBzaXplOiBudW1iZXIpOiBUW11bXSA9PiB7XG4gIGNvbnN0IGdyb3VwczogVFtdW10gPSBbXTtcbiAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaXRlbXMubGVuZ3RoOyBpbmRleCArPSBzaXplKSBncm91cHMucHVzaChpdGVtcy5zbGljZShpbmRleCwgaW5kZXggKyBzaXplKSk7XG4gIHJldHVybiBncm91cHM7XG59O1xuXG5leHBvcnQgY29uc3Qgc3VibWl0Q3JtRm9ybSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IENybUZvcm1TdWJtaXNzaW9uSW5wdXRcbik6IFByb21pc2U8Q3JtRm9ybVN1Ym1pc3Npb25UeXBlPiA9PiB7XG4gIGlmKHR5cGVvZiBpbnB1dD8ubWFya2V0aW5nT3B0SW4gIT09ICdib29sZWFuJykgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9tYXJrZXRpbmdPcHRJbicpO1xuICBjb25zdCBlbWFpbCA9IGNsZWFuU3RyaW5nKGlucHV0LmVtYWlsLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJhd1Bob25lID0gY2xlYW5TdHJpbmcoaW5wdXQucGhvbmUsIDgwKTtcbiAgY29uc3QgcGhvbmUgPSByYXdQaG9uZSA/IChwYXJzZVBob25lKHJhd1Bob25lKSB8fCByYXdQaG9uZSkgOiAnJztcbiAgaWYoIWVtYWlsICYmICFwaG9uZSkgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9lbWFpbF9vcl9waG9uZScpO1xuXG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICBhd2FpdCBlbnN1cmVEb2N1bWVudENvbGxlY3Rpb24oZGF0YWJhc2UsIENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKTtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHNvdXJjZSA9IGNsZWFuU3RyaW5nKGlucHV0LnNvdXJjZSB8fCBpbnB1dC5mb3JtSWQgfHwgJ2Zvcm0nLCAxNjApO1xuICBjb25zdCB2YWx1ZXMgPSBpbnB1dC52YWx1ZXMgfHwge307XG4gIGNvbnN0IGZpcnN0TmFtZSA9IGNsZWFuU3RyaW5nKGlucHV0LmZpcnN0TmFtZSB8fCB2YWx1ZXMuZmlyc3ROYW1lLCAxNjApO1xuICBjb25zdCBsYXN0TmFtZSA9IGNsZWFuU3RyaW5nKGlucHV0Lmxhc3ROYW1lIHx8IHZhbHVlcy5sYXN0TmFtZSwgMTYwKTtcbiAgY29uc3QgZ2VuZXJhdGVkVXNlcktleSA9IGNyZWF0ZUhhc2goZW1haWwgfHwgcGhvbmUsIG51bGwpO1xuICBjb25zdCBjb25zZW50ID0gaW5wdXQubWFya2V0aW5nT3B0SW5cbiAgICA/IHttYXJrZXRpbmdPcHRJbkF0OiB0aW1lc3RhbXAsIG1hcmtldGluZ09wdE91dEF0OiBudWxsfVxuICAgIDoge21hcmtldGluZ09wdE91dEF0OiB0aW1lc3RhbXB9O1xuICBjb25zdCB1c2VySW5zZXJ0ID0ge1xuICAgIF9rZXk6IGdlbmVyYXRlZFVzZXJLZXksXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZSxcbiAgICBsYXN0TmFtZSxcbiAgICBtYWlsaW5nTGlzdDogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogc291cmNlLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHBob25lLFxuICAgIHR5cGU6ICdjcm1Db250YWN0JyxcbiAgICB1c2VyQWNjZXNzOiAwLFxuICAgIHVzZXJJZDogZ2VuZXJhdGVkVXNlcktleSxcbiAgICB2ZXJpZmllZEVtYWlsOiBmYWxzZSxcbiAgICB2ZXJpZmllZFBob25lOiBmYWxzZSxcbiAgICAuLi5jb25zZW50XG4gIH07XG4gIGNvbnN0IHVzZXJVcGRhdGUgPSB7XG4gICAgLi4uKGVtYWlsID8ge2VtYWlsfSA6IHt9KSxcbiAgICAuLi4oZmlyc3ROYW1lID8ge2ZpcnN0TmFtZX0gOiB7fSksXG4gICAgLi4uKGxhc3ROYW1lID8ge2xhc3ROYW1lfSA6IHt9KSxcbiAgICAuLi4ocGhvbmUgPyB7cGhvbmV9IDoge30pLFxuICAgIG1haWxpbmdMaXN0OiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiBzb3VyY2UsXG4gICAgbWFya2V0aW5nT3B0SW46IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgLi4uY29uc2VudFxuICB9O1xuICBjb25zdCB1c2VyID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIExFVCBleGlzdGluZyA9IEZJUlNUKFxuICAgICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgICAgRklMVEVSICgke2VtYWlsfSAhPSBcIlwiICYmIExPV0VSKHVzZXIuZW1haWwgfHwgXCJcIikgPT0gJHtlbWFpbH0pXG4gICAgICAgICAgfHwgKCR7cGhvbmV9ICE9IFwiXCIgJiYgdXNlci5waG9uZSA9PSAke3Bob25lfSlcbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdXNlclxuICAgIClcbiAgICBMRVQgdXNlcktleSA9IGV4aXN0aW5nID8gZXhpc3RpbmcuX2tleSA6ICR7Z2VuZXJhdGVkVXNlcktleX1cbiAgICBVUFNFUlQge19rZXk6IHVzZXJLZXl9XG4gICAgSU5TRVJUIE1FUkdFKCR7dXNlckluc2VydH0sIHtfa2V5OiB1c2VyS2V5LCB1c2VySWQ6IHVzZXJLZXl9KVxuICAgIFVQREFURSAke3VzZXJVcGRhdGV9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFVzZXJUeXBlIHwgbnVsbDtcbiAgY29uc3QgdXNlcklkID0gZG9jS2V5KFN0cmluZyh1c2VyPy5fa2V5IHx8IHVzZXI/LnVzZXJJZCB8fCBnZW5lcmF0ZWRVc2VyS2V5KSk7XG5cbiAgY29uc3Qgc3VibWlzc2lvbklkID0gY3JlYXRlSGFzaChgY3JtLXN1Ym1pc3Npb24tJHt0aW1lc3RhbXB9LSR7ZW1haWx9LSR7cGhvbmV9YCwgbnVsbCk7XG4gIGNvbnN0IHN1Ym1pc3Npb24gPSB7XG4gICAgX2tleTogc3VibWlzc2lvbklkLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgZW1haWwsXG4gICAgZm9ybUlkOiBjbGVhblN0cmluZyhpbnB1dC5mb3JtSWQsIDE2MCksXG4gICAgbWFya2V0aW5nT3B0SW46IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcGhvbmUsXG4gICAgc291cmNlLFxuICAgIHN1Ym1pc3Npb25JZCxcbiAgICB1c2VySWQsXG4gICAgdmFsdWVzXG4gIH07XG4gIGNvbnN0IHNhdmVkID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIElOU0VSVCAke3N1Ym1pc3Npb259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DUk1fRk9STV9TVUJNSVNTSU9OUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIHJldHVybiBzYXZlZDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDcm1Gb3JtU3VibWlzc2lvbnMgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8Q3JtRm9ybVN1Ym1pc3Npb25UeXBlW10+ID0+IHtcbiAgcmVxdWlyZUNybUFkbWluKGNvbnRleHQpO1xuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgaWYoIWF3YWl0IGRhdGFiYXNlLmNvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpLmV4aXN0cygpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICAgIEZPUiBzdWJtaXNzaW9uIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DUk1fRk9STV9TVUJNSVNTSU9OUyl9XG4gICAgICAgIFNPUlQgc3VibWlzc2lvbi5hZGRlZCBERVNDXG4gICAgICAgIExJTUlUIDUwMFxuICAgICAgICBSRVRVUk4gc3VibWlzc2lvblxuICAgIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbiAgfSkoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDcm1Db250YWN0cyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBmaWx0ZXI6IENybUNvbnRhY3RGaWx0ZXIgPSB7fSk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICByZXF1aXJlQ3JtQWRtaW4oY29udGV4dCk7XG4gIGNvbnN0IHNlYXJjaCA9IGNsZWFuU3RyaW5nKGZpbHRlci5zZWFyY2gsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZmllbGQgPSBhbGxvd2VkQ29udGFjdEZpZWxkcy5oYXMoZmlsdGVyLmZpZWxkIHx8ICcnKSA/IFN0cmluZyhmaWx0ZXIuZmllbGQpIDogJyc7XG4gIGNvbnN0IHZhbHVlID0gY2xlYW5TdHJpbmcoZmlsdGVyLnZhbHVlLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wdGVkSW5Pbmx5ID0gZmlsdGVyLm9wdGVkSW5Pbmx5ICE9PSBmYWxzZTtcbiAgY29uc3Qgb3BlcmF0b3IgPSBbJ2NvbnRhaW5zJywgJ2VxdWFscycsICdleGlzdHMnXS5pbmNsdWRlcyhmaWx0ZXIub3BlcmF0b3IgfHwgJycpID8gZmlsdGVyLm9wZXJhdG9yIDogJ2NvbnRhaW5zJztcbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgIEZJTFRFUiAkeyFvcHRlZEluT25seX0gfHwgdXNlci5tYXJrZXRpbmdPcHRJbiA9PSB0cnVlXG4gICAgICBGSUxURVIgJHshc2VhcmNofSB8fCBDT05UQUlOUyhMT1dFUihDT05DQVRfU0VQQVJBVE9SKFwiIFwiLCB1c2VyLmZpcnN0TmFtZSwgdXNlci5sYXN0TmFtZSwgdXNlci5lbWFpbCwgdXNlci5waG9uZSkpLCAke3NlYXJjaH0pXG4gICAgICBGSUxURVIgJHshZmllbGR9IHx8ICgke29wZXJhdG9yID09PSAnZXhpc3RzJ31cbiAgICAgICAgPyBIQVModXNlciwgJHtmaWVsZH0pXG4gICAgICAgIDogKCR7b3BlcmF0b3IgPT09ICdlcXVhbHMnfSA/IExPV0VSKFRPX1NUUklORyh1c2VyWyR7ZmllbGR9XSkpID09ICR7dmFsdWV9IDogQ09OVEFJTlMoTE9XRVIoVE9fU1RSSU5HKHVzZXJbJHtmaWVsZH1dKSksICR7dmFsdWV9KSkpXG4gICAgICBTT1JUIHVzZXIuYWRkZWQgREVTQ1xuICAgICAgTElNSVQgMTAwMFxuICAgICAgUkVUVVJOIE1FUkdFKHVzZXIsIHtjcm1Tb3VyY2U6IHVzZXIubWFya2V0aW5nQ29uc2VudFNvdXJjZX0pXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZW5kQ3JtQ2FtcGFpZ24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBDcm1DYW1wYWlnbklucHV0XG4pOiBQcm9taXNlPENybUNhbXBhaWduVHlwZT4gPT4ge1xuICByZXF1aXJlQ3JtQWRtaW4oY29udGV4dCk7XG4gIGNvbnN0IHN1YmplY3QgPSBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApO1xuICBjb25zdCBib2R5SHRtbCA9IHNhbml0aXplSHRtbChpbnB1dC5odG1sKTtcbiAgY29uc3QgY3NzID0gc2FuaXRpemVDc3MoaW5wdXQuY3NzKTtcbiAgaWYoIXN1YmplY3QgfHwgIWJvZHlIdG1sKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2NhbXBhaWduX2NvbnRlbnQnKTtcblxuICBjb25zdCBjYW5kaWRhdGVzID0gYXdhaXQgZ2V0Q3JtQ29udGFjdHMoY29udGV4dCwgey4uLmlucHV0LmZpbHRlciwgb3B0ZWRJbk9ubHk6IHRydWV9KTtcbiAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0KChpbnB1dC51c2VySWRzIHx8IFtdKS5tYXAoKGlkKSA9PiBkb2NLZXkoaWQpKSk7XG4gIGNvbnN0IHJlY2lwaWVudHMgPSBjYW5kaWRhdGVzLmZpbHRlcigodXNlcikgPT5cbiAgICBCb29sZWFuKHVzZXIuZW1haWwpICYmICghc2VsZWN0ZWRJZHMuc2l6ZSB8fCBzZWxlY3RlZElkcy5oYXMoZG9jS2V5KHVzZXIudXNlcklkIHx8IHVzZXIuX2tleSkpKSk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBjYW1wYWlnbklkID0gY3JlYXRlSGFzaChgY3JtLWNhbXBhaWduLSR7dGltZXN0YW1wfS0ke3N1YmplY3R9YCwgbnVsbCk7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICBjb25zdCBjYW1wYWlnbiA9IHtcbiAgICBfa2V5OiBjYW1wYWlnbklkLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgY2FtcGFpZ25JZCxcbiAgICBjc3MsXG4gICAgZmFpbGVkQ291bnQ6IDAsXG4gICAgaHRtbDogYm9keUh0bWwsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICByZWNpcGllbnRDb3VudDogcmVjaXBpZW50cy5sZW5ndGgsXG4gICAgc2VudENvdW50OiAwLFxuICAgIHN0YXR1czogJ3NlbmRpbmcnLFxuICAgIHN1YmplY3RcbiAgfTtcbiAgYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYElOU0VSVCAke2NhbXBhaWdufSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0NBTVBBSUdOUyl9YCk7XG5cbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgbGV0IHNlbnRDb3VudCA9IDA7XG4gIGZvcihjb25zdCByZWNpcGllbnRzQmF0Y2ggb2YgY2h1bmsocmVjaXBpZW50cywgNTApKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlc1NlbmQoe1xuICAgICAgICBEZXN0aW5hdGlvbjoge0JjY0FkZHJlc3NlczogcmVjaXBpZW50c0JhdGNoLm1hcCgocmVjaXBpZW50KSA9PiBTdHJpbmcocmVjaXBpZW50LmVtYWlsKSl9LFxuICAgICAgICBNZXNzYWdlOiB7XG4gICAgICAgICAgQm9keToge0h0bWw6IHtEYXRhOiBgPHN0eWxlPiR7Y3NzfTwvc3R5bGU+JHtib2R5SHRtbH1gfSwgVGV4dDoge0RhdGE6IGh0bWxUb1RleHQoYm9keUh0bWwpfX0sXG4gICAgICAgICAgU3ViamVjdDoge0RhdGE6IHN1YmplY3R9XG4gICAgICAgIH0sXG4gICAgICAgIFNvdXJjZTogYFwiJHtjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydE5hbWUgfHwgJ1JlYWt0b3InfVwiIDwke2NvbnRleHQuY29uZmlnPy5kZXRhaWxzPy5zdXBwb3J0RW1haWwgfHwgJ3N1cHBvcnRAcmVha3Rvci5pbyd9PmBcbiAgICAgIH0pO1xuICAgICAgc2VudENvdW50ICs9IHJlY2lwaWVudHNCYXRjaC5sZW5ndGg7XG4gICAgfSBjYXRjaChfZXJyb3IpIHtcbiAgICAgIGZhaWxlZENvdW50ICs9IHJlY2lwaWVudHNCYXRjaC5sZW5ndGg7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHsuLi5jYW1wYWlnbiwgZmFpbGVkQ291bnQsIHNlbnRBdDogbm93KCksIHNlbnRDb3VudCwgc3RhdHVzOiBmYWlsZWRDb3VudCA/IChzZW50Q291bnQgPyAncGFydGlhbCcgOiAnZmFpbGVkJykgOiAnc2VudCd9O1xuICBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgVVBEQVRFICR7Y2FtcGFpZ25JZH0gV0lUSCAke3tcbiAgICAgIGZhaWxlZENvdW50OiByZXN1bHQuZmFpbGVkQ291bnQsXG4gICAgICBtb2RpZmllZDogcmVzdWx0LnNlbnRBdCxcbiAgICAgIHNlbnRBdDogcmVzdWx0LnNlbnRBdCxcbiAgICAgIHNlbnRDb3VudDogcmVzdWx0LnNlbnRDb3VudCxcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1c1xuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DUk1fQ0FNUEFJR05TKX1cbiAgYCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBzYXZlRWRnZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZWRnZUNvbGxlY3Rpb246IHN0cmluZyxcbiAgZWRnZUtleTogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgZWRnZSA9IHtcbiAgICBfZnJvbTogZnJvbSxcbiAgICBfa2V5OiBlZGdlS2V5LFxuICAgIF90bzogdG8sXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIC4uLmRhdGFcbiAgfTtcbiAgY29uc3QgcXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHtlZGdlS2V5fX1cbiAgICBJTlNFUlQgJHtlZGdlfVxuICAgIFVQREFURSAke2RhdGF9IElOICR7Y29sbGVjdGlvbihlZGdlQ29sbGVjdGlvbil9XG4gIGA7XG5cbiAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVNYWlsaW5nTGlzdCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8TWFpbGluZ0xpc3RUeXBlPlxuKTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IG1haWxpbmdMaXN0SWQgPSBkb2NLZXkoU3RyaW5nKGlucHV0Py5tYWlsaW5nTGlzdElkIHx8IGNyZWF0ZUhhc2goYG1haWxpbmctbGlzdC0ke2lucHV0Py5uYW1lfS0ke3RpbWVzdGFtcH1gKSkpO1xuICBjb25zdCBtYWlsaW5nTGlzdCA9IHtcbiAgICBfa2V5OiBtYWlsaW5nTGlzdElkLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgY3JlYXRlZEJ5VXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGRlc2NyaXB0aW9uOiBjbGVhblN0cmluZyhpbnB1dD8uZGVzY3JpcHRpb24sIDIwMDApLFxuICAgIG1haWxpbmdMaXN0SWQsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBuYW1lOiBjbGVhblN0cmluZyhpbnB1dD8ubmFtZSwgMTYwKSxcbiAgICBzdGF0dXM6IGlucHV0Py5zdGF0dXMgfHwgJ2FjdGl2ZSdcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke21haWxpbmdMaXN0SWR9fVxuICAgIElOU0VSVCAke21haWxpbmdMaXN0fVxuICAgIFVQREFURSAke3tcbiAgICAgIGRlc2NyaXB0aW9uOiBtYWlsaW5nTGlzdC5kZXNjcmlwdGlvbixcbiAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICBuYW1lOiBtYWlsaW5nTGlzdC5uYW1lLFxuICAgICAgc3RhdHVzOiBtYWlsaW5nTGlzdC5zdGF0dXNcbiAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWFpbGluZ0xpc3RzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBsaXN0IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTKX1cbiAgICAgIEZJTFRFUiBsaXN0LnN0YXR1cyAhPSBcImFyY2hpdmVkXCJcbiAgICAgIFNPUlQgbGlzdC5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbGlzdFxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRVc2VyVG9NYWlsaW5nTGlzdCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG1haWxpbmdMaXN0SWQ6IHN0cmluZyxcbiAgc291cmNlID0gJ21hbnVhbCdcbik6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KHVzZXJJZCk7XG4gIGNvbnN0IGxpc3RLZXkgPSBkb2NLZXkobWFpbGluZ0xpc3RJZCk7XG4gIGNvbnN0IGVkZ2VLZXkgPSBjcmVhdGVIYXNoKGBoYXNNYWlsaW5nTGlzdC0ke3VzZXJLZXl9LSR7bGlzdEtleX1gKTtcblxuICBhd2FpdCBzYXZlRWRnZShcbiAgICBjb250ZXh0LFxuICAgIEVER0VTLkhBU19NQUlMSU5HX0xJU1QsXG4gICAgZWRnZUtleSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUywgbGlzdEtleSksXG4gICAge1xuICAgICAgYWRkZWRCeVVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICAgIHNvdXJjZTogY2xlYW5TdHJpbmcoc291cmNlLCA4MCksXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnXG4gICAgfVxuICApO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSlcbiAgICAucXVlcnkoYXFsYFJFVFVSTiBET0NVTUVOVCgke2RvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIGxpc3RLZXkpfSlgKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVVzZXJGcm9tTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KHVzZXJJZCk7XG4gIGNvbnN0IGxpc3RLZXkgPSBkb2NLZXkobWFpbGluZ0xpc3RJZCk7XG4gIGNvbnN0IGVkZ2VLZXkgPSBjcmVhdGVIYXNoKGBoYXNNYWlsaW5nTGlzdC0ke3VzZXJLZXl9LSR7bGlzdEtleX1gKTtcbiAgY29uc3QgdXBkYXRlID0ge1xuICAgIG1vZGlmaWVkOiBub3coKSxcbiAgICByZW1vdmVkQXQ6IG5vdygpLFxuICAgIHN0YXR1czogJ3JlbW92ZWQnXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke2VkZ2VLZXl9IFdJVEggJHt1cGRhdGV9IElOICR7Y29sbGVjdGlvbihFREdFUy5IQVNfTUFJTElOR19MSVNUKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKS50aGVuKEJvb2xlYW4pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1haWxpbmdMaXN0VXNlcnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG1haWxpbmdMaXN0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGxpc3RJZCA9IGRvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgdXNlciwgZWRnZSBJTiAxLi4xIElOQk9VTkQgJHtsaXN0SWR9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfTUFJTElOR19MSVNUKX1cbiAgICAgIEZJTFRFUiBlZGdlLnN0YXR1cyA9PSBcImFjdGl2ZVwiXG4gICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICBSRVRVUk4gdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5UHVyY2hhc2VkUHJvZHVjdCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcHJvZHVjdElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBwcm9kdWN0S2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktcHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBvcmRlciBJTiAxLi4xIElOQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TSE9QSUZZX1BST0RVQ1RTLCBwcm9kdWN0S2V5KX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCl9XG4gICAgICBGT1IgdXNlciBJTiAxLi4xIElOQk9VTkQgb3JkZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICAgIFJFVFVSTiBESVNUSU5DVCB1c2VyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsaWdpYmxlTWFpbGluZ1VzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBvcHRpb25zOiB7cmVhZG9ubHkgbWFpbGluZ0xpc3RJZD86IHN0cmluZzsgcmVhZG9ubHkgcHJvZHVjdElkPzogc3RyaW5nOyByZWFkb25seSBleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzPzogYm9vbGVhbn0gPSB7fVxuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMgPSBvcHRpb25zLmV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMgIT09IGZhbHNlO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBMRVQgYmFzZVVzZXJzID0gKFxuICAgICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgICAgRklMVEVSIHVzZXIubWFya2V0aW5nT3B0SW4gPT0gdHJ1ZVxuICAgICAgICBGSUxURVIgdXNlci5lbWFpbCAhPSBudWxsICYmIHVzZXIuZW1haWwgIT0gXCJcIlxuICAgICAgICBGSUxURVIgdXNlci5lbWFpbERlbGl2ZXJ5U3RhdHVzID09IG51bGwgfHwgdXNlci5lbWFpbERlbGl2ZXJ5U3RhdHVzID09IFwidmFsaWRcIlxuICAgICAgICAke29wdGlvbnMubWFpbGluZ0xpc3RJZCA/IGFxbGBcbiAgICAgICAgICBGSUxURVIgTEVOR1RIKFxuICAgICAgICAgICAgRk9SIGxpc3QgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgICAgICAgICAgIEZJTFRFUiBsaXN0Ll9rZXkgPT0gJHtkb2NLZXkob3B0aW9ucy5tYWlsaW5nTGlzdElkKX1cbiAgICAgICAgICAgICAgUkVUVVJOIGxpc3RcbiAgICAgICAgICApID4gMFxuICAgICAgICBgIDogYXFsYGB9XG4gICAgICAgICR7b3B0aW9ucy5wcm9kdWN0SWQgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EIHVzZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgICAgICBGT1IgcHJvZHVjdCBJTiAxLi4xIE9VVEJPVU5EIG9yZGVyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1BVUkNIQVNFRF9QUk9EVUNUKX1cbiAgICAgICAgICAgICAgICBGSUxURVIgcHJvZHVjdC5wcm9kdWN0SWQgPT0gJHtTdHJpbmcob3B0aW9ucy5wcm9kdWN0SWQpfVxuICAgICAgICAgICAgICAgIFJFVFVSTiBwcm9kdWN0XG4gICAgICAgICAgKSA+IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICAke2V4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiB0aWNrZXQgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUKX1cbiAgICAgICAgICAgICAgRklMVEVSIHRpY2tldC5zdGF0dXMgSU4gW1wib3BlblwiLCBcImluX3Byb2dyZXNzXCIsIFwid2FpdGluZ19vbl9jdXN0b21lclwiLCBcIndhaXRpbmdfb25faW50ZXJuYWxcIl1cbiAgICAgICAgICAgICAgRklMVEVSIHRpY2tldC5wcmlvcml0eSBJTiBbXCJoaWdoXCIsIFwidXJnZW50XCJdXG4gICAgICAgICAgICAgIFJFVFVSTiB0aWNrZXRcbiAgICAgICAgICApID09IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICBSRVRVUk4gdXNlclxuICAgIClcbiAgICBGT1IgdXNlciBJTiBiYXNlVXNlcnNcbiAgICAgIFNPUlQgdXNlci5lbWFpbCBBU0NcbiAgICAgIFJFVFVSTiBESVNUSU5DVCB1c2VyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluZ2VzdFNob3BpZnlDdXN0b21lck9yZGVyID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogU2hvcGlmeUN1c3RvbWVyT3JkZXJJbnB1dFxuKTogUHJvbWlzZTxDdXN0b21lck9yZGVyVHlwZT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3Qgc2hvcGlmeUN1c3RvbWVySWQgPSBjbGVhbkV4dGVybmFsSWQoaW5wdXQuc2hvcGlmeUN1c3RvbWVySWQsIDE2MCk7XG4gIGNvbnN0IHNob3BpZnlPcmRlcklkID0gY2xlYW5FeHRlcm5hbElkKGlucHV0LnNob3BpZnlPcmRlcklkLCAxNjApO1xuICBjb25zdCBjdXN0b21lciA9IGlucHV0LmN1c3RvbWVyIHx8IHt9O1xuICBjb25zdCBlbWFpbCA9IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmVtYWlsLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHByb2R1Y3RJZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLihpbnB1dC5wcm9kdWN0SWRzIHx8IFtdKSwgLi4uKGlucHV0LnByb2R1Y3RzIHx8IFtdKS5tYXAoKHByb2R1Y3QpID0+IHByb2R1Y3QucHJvZHVjdElkKV1cbiAgICAubWFwKChwcm9kdWN0SWQpID0+IGNsZWFuRXh0ZXJuYWxJZChwcm9kdWN0SWQsIDMyMCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSkpO1xuXG4gIGlmKCFzaG9waWZ5Q3VzdG9tZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfc2hvcGlmeUN1c3RvbWVySWQnKTtcbiAgfVxuICBpZighc2hvcGlmeU9yZGVySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3Nob3BpZnlPcmRlcklkJyk7XG4gIH1cbiAgaWYoIWVtYWlsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9jdXN0b21lckVtYWlsJyk7XG4gIH1cblxuICBjb25zdCB1c2VyS2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktdXNlcicsIHNob3BpZnlDdXN0b21lcklkKTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiB1c2VyS2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5maXJzdE5hbWUsIDE2MCksXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmxhc3ROYW1lLCAxNjApLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6ICdzaG9waWZ5JyxcbiAgICBtYXJrZXRpbmdPcHRJbjogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUsXG4gICAgbWFya2V0aW5nT3B0SW5BdDogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZCxcbiAgICB0eXBlOiAnY3JtQ29udGFjdCcsXG4gICAgdXNlcklkOiB1c2VyS2V5XG4gIH07XG4gIGNvbnN0IHVzZXJVcGRhdGUgPSB7XG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5maXJzdE5hbWUsIDE2MCksXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmxhc3ROYW1lLCAxNjApLFxuICAgIGxhc3RQdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6ICdzaG9waWZ5JyxcbiAgICBtYXJrZXRpbmdPcHRJbjogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZFxuICB9O1xuICBjb25zdCB1c2VyUXVlcnkgPSBhcWxgXG4gICAgTEVUIGV4aXN0aW5nID0gRklSU1QoXG4gICAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgICBGSUxURVIgdXNlci5zaG9waWZ5Q3VzdG9tZXJJZCA9PSAke3Nob3BpZnlDdXN0b21lcklkfSB8fCB1c2VyLmVtYWlsID09ICR7ZW1haWx9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke3VzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3QgdXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeSh1c2VyUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGU7XG4gIGNvbnN0IHJlc29sdmVkVXNlcktleSA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgdXNlcktleSkpO1xuICBjb25zdCBvcmRlcktleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LW9yZGVyJywgc2hvcGlmeU9yZGVySWQpO1xuICBjb25zdCBvcmRlciA9IHtcbiAgICBfa2V5OiBvcmRlcktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGN1cnJlbmN5OiBjbGVhblN0cmluZyhpbnB1dC5jdXJyZW5jeSwgMykudG9VcHBlckNhc2UoKSxcbiAgICBjdXN0b21lck9yZGVySWQ6IG9yZGVyS2V5LFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJvZHVjdElkcyxcbiAgICBwdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkLFxuICAgIHNob3BpZnlPcmRlcklkLFxuICAgIHRvdGFsUHJpY2U6IE51bWJlcihpbnB1dC50b3RhbFByaWNlIHx8IDApLFxuICAgIHVzZXJJZDogcmVzb2x2ZWRVc2VyS2V5XG4gIH07XG4gIGNvbnN0IG9yZGVyUXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke29yZGVyS2V5fX1cbiAgICBJTlNFUlQgJHtvcmRlcn1cbiAgICBVUERBVEUgJHt7XG4gICAgICBjdXJyZW5jeTogb3JkZXIuY3VycmVuY3ksXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgcHJvZHVjdElkcyxcbiAgICAgIHB1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCxcbiAgICAgIHRvdGFsUHJpY2U6IG9yZGVyLnRvdGFsUHJpY2UsXG4gICAgICB1c2VySWQ6IHJlc29sdmVkVXNlcktleVxuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9PUkRFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRPcmRlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShvcmRlclF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIEN1c3RvbWVyT3JkZXJUeXBlO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX09SREVSLFxuICAgIGNyZWF0ZUhhc2goYGhhc0N1c3RvbWVyT3JkZXItJHtyZXNvbHZlZFVzZXJLZXl9LSR7b3JkZXJLZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTLCBvcmRlcktleSksXG4gICAge3B1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCwgc2hvcGlmeUN1c3RvbWVySWQsIHNob3BpZnlPcmRlcklkfVxuICApO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHByb2R1Y3RJZHMubWFwKGFzeW5jIChwcm9kdWN0SWQpID0+IHtcbiAgICBjb25zdCBwcm9kdWN0ID0gKGlucHV0LnByb2R1Y3RzIHx8IFtdKS5maW5kKChpdGVtKSA9PiBpdGVtLnByb2R1Y3RJZCA9PT0gcHJvZHVjdElkKSB8fCB7cHJvZHVjdElkfTtcbiAgICBjb25zdCBwcm9kdWN0S2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktcHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gICAgY29uc3QgcHJvZHVjdERvYyA9IHtcbiAgICAgIF9rZXk6IHByb2R1Y3RLZXksXG4gICAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHByb2R1Y3RJZCxcbiAgICAgIHRpdGxlOiBjbGVhblN0cmluZyhwcm9kdWN0LnRpdGxlLCAzMjApLFxuICAgICAgdmFyaWFudElkOiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdC52YXJpYW50SWQsIDE2MClcbiAgICB9O1xuICAgIGNvbnN0IHByb2R1Y3RRdWVyeSA9IGFxbGBcbiAgICAgIFVQU0VSVCB7X2tleTogJHtwcm9kdWN0S2V5fX1cbiAgICAgIElOU0VSVCAke3Byb2R1Y3REb2N9XG4gICAgICBVUERBVEUgJHt7XG4gICAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICAgIHRpdGxlOiBwcm9kdWN0RG9jLnRpdGxlLFxuICAgICAgICB2YXJpYW50SWQ6IHByb2R1Y3REb2MudmFyaWFudElkXG4gICAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUyl9XG4gICAgYDtcbiAgICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocHJvZHVjdFF1ZXJ5KTtcbiAgICBhd2FpdCBzYXZlRWRnZShcbiAgICAgIGNvbnRleHQsXG4gICAgICBFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QsXG4gICAgICBjcmVhdGVIYXNoKGBoYXNQdXJjaGFzZWRQcm9kdWN0LSR7b3JkZXJLZXl9LSR7cHJvZHVjdEtleX1gKSxcbiAgICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUywgb3JkZXJLZXkpLFxuICAgICAgZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSksXG4gICAgICB7cHJvZHVjdElkLCBwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXR9XG4gICAgKTtcbiAgfSkpO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgVVBEQVRFICR7cmVzb2x2ZWRVc2VyS2V5fVxuICAgIFdJVEgge1xuICAgICAgbGFzdFB1cmNoYXNlZEF0OiAke29yZGVyLnB1cmNoYXNlZEF0fSxcbiAgICAgIHRvdGFsT3JkZXJDb3VudDogTEVOR1RIKFxuICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICBSRVRVUk4gb3JkZXJcbiAgICAgICksXG4gICAgICB0b3RhbFNwZW5kOiBTVU0oXG4gICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgIFJFVFVSTiBUT19OVU1CRVIob3JkZXIudG90YWxQcmljZSlcbiAgICAgIClcbiAgICB9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gIGApO1xuXG4gIHJldHVybiBzYXZlZE9yZGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1c3RvbWVyT3JkZXJzQnlVc2VyID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxDdXN0b21lck9yZGVyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgU09SVCBvcmRlci5wdXJjaGFzZWRBdCBERVNDXG4gICAgICBSRVRVUk4gb3JkZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5jb25zdCBzZW5kU3VwcG9ydFRpY2tldEVtYWlsID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB0aWNrZXQ6IFN1cHBvcnRUaWNrZXRUeXBlRGF0YSxcbiAgZGV0YWlsczogc3RyaW5nLFxuICBoZWFkaW5nOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB1c2VyID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbGBcbiAgICBSRVRVUk4gRE9DVU1FTlQoJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdGlja2V0LnVzZXJJZCl9KVxuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFVzZXJUeXBlIHwgbnVsbDtcbiAgaWYoIXVzZXI/LmVtYWlsKSByZXR1cm47XG4gIGNvbnN0IHN1cHBvcnROYW1lID0gY29udGV4dC5jb25maWc/LmRldGFpbHM/LnN1cHBvcnROYW1lIHx8IENvbmZpZy5nZXQoJ2RldGFpbHMuc3VwcG9ydE5hbWUnKSB8fCAnUmVha3RvciBTdXBwb3J0JztcbiAgY29uc3Qgc3VwcG9ydEVtYWlsID0gY29udGV4dC5jb25maWc/LmRldGFpbHM/LnN1cHBvcnRFbWFpbCB8fCBDb25maWcuZ2V0KCdkZXRhaWxzLnN1cHBvcnRFbWFpbCcpIHx8ICdzdXBwb3J0QHJlYWt0b3IuaW8nO1xuICBjb25zdCB0aWNrZXROdW1iZXIgPSBTdHJpbmcodGlja2V0LnRpY2tldE51bWJlciB8fCB0aWNrZXQuc3VwcG9ydFRpY2tldElkIHx8IHRpY2tldC5fa2V5IHx8ICcnKTtcbiAgY29uc3Qgc3RhdHVzVXJsID0gYGh0dHBzOi8vY3JtLnJlYWt0b3IuaW8vc3VwcG9ydC9zdGF0dXM/dGlja2V0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRpY2tldE51bWJlcil9YDtcbiAgY29uc3QgdGV4dCA9IGAke2hlYWRpbmd9XFxuXFxuVGlja2V0OiAke3RpY2tldE51bWJlcn1cXG5TdGF0dXM6ICR7dGlja2V0LnN0YXR1cyB8fCAnc3VibWl0dGVkJ31cXG5cXG4ke2RldGFpbHN9XFxuXFxuVHJhY2sgdGhpcyB0aWNrZXQ6ICR7c3RhdHVzVXJsfWA7XG4gIGF3YWl0IHNlc1NlbmQoe1xuICAgIERlc3RpbmF0aW9uOiB7VG9BZGRyZXNzZXM6IFtTdHJpbmcodXNlci5lbWFpbCldfSxcbiAgICBNZXNzYWdlOiB7XG4gICAgICBCb2R5OiB7SHRtbDoge0RhdGE6IGA8aDE+JHtlc2NhcGVIdG1sKGhlYWRpbmcpfTwvaDE+PHA+PHN0cm9uZz5UaWNrZXQ6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbCh0aWNrZXROdW1iZXIpfTwvcD48cD48c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKFN0cmluZyh0aWNrZXQuc3RhdHVzIHx8ICdzdWJtaXR0ZWQnKSl9PC9wPjxwcmUgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpwcmUtd3JhcDtmb250LWZhbWlseTppbmhlcml0XCI+JHtlc2NhcGVIdG1sKGRldGFpbHMpfTwvcHJlPjxwPjxhIGhyZWY9XCIke2VzY2FwZUh0bWwoc3RhdHVzVXJsKX1cIj5UcmFjayB0aGlzIHRpY2tldCBvbmxpbmU8L2E+PC9wPmB9LCBUZXh0OiB7RGF0YTogdGV4dH19LFxuICAgICAgU3ViamVjdDoge0RhdGE6IGBbJHt0aWNrZXROdW1iZXJ9XSAke2hlYWRpbmd9YH1cbiAgICB9LFxuICAgIFNvdXJjZTogYFwiJHtzdXBwb3J0TmFtZX1cIiA8JHtzdXBwb3J0RW1haWx9PmBcbiAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTdXBwb3J0VGlja2V0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogUGFydGlhbDxTdXBwb3J0VGlja2V0VHlwZURhdGE+XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleShTdHJpbmcoaW5wdXQudXNlcklkIHx8ICcnKSk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LSR7dXNlcktleX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3QgdGlja2V0TnVtYmVyID0gY2xlYW5TdHJpbmcoaW5wdXQudGlja2V0TnVtYmVyLCA4MCkgfHwgYFJLVC0ke25ldyBEYXRlKHRpbWVzdGFtcCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCkucmVwbGFjZSgvLS9nLCAnJyl9LSR7dGlja2V0S2V5LnNsaWNlKDAsIDgpLnRvVXBwZXJDYXNlKCl9YDtcbiAgY29uc3QgdGlja2V0ID0ge1xuICAgIF9rZXk6IHRpY2tldEtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGFzc2lnbmVkVG9Vc2VySWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuYXNzaWduZWRUb1VzZXJJZCB8fCAnJykpLFxuICAgIGRlc2NyaXB0aW9uOiBjbGVhblN0cmluZyhpbnB1dC5kZXNjcmlwdGlvbiwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwcmlvcml0eTogaW5wdXQucHJpb3JpdHkgfHwgJ25vcm1hbCcsXG4gICAgcHJvZHVjdElkOiBjbGVhbkV4dGVybmFsSWQoaW5wdXQucHJvZHVjdElkLCAzMjApLFxuICAgIHNob3BpZnlPcmRlcklkOiBjbGVhblN0cmluZyhpbnB1dC5zaG9waWZ5T3JkZXJJZCwgMTYwKSxcbiAgICBzdGF0dXM6ICdzdWJtaXR0ZWQnLFxuICAgIHN1YmplY3Q6IGNsZWFuU3RyaW5nKGlucHV0LnN1YmplY3QsIDMyMCksXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdGlja2V0TnVtYmVyLFxuICAgIHR5cGU6IGlucHV0LnR5cGUgfHwgJ2dlbmVyYWxfc3VwcG9ydCcsXG4gICAgdXNlcklkOiB1c2VyS2V5XG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIElOU0VSVCAke3RpY2tldH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZFRpY2tldCA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICBhd2FpdCBzYXZlRWRnZShcbiAgICBjb250ZXh0LFxuICAgIEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCxcbiAgICBjcmVhdGVIYXNoKGBoYXNTdXBwb3J0VGlja2V0LSR7dXNlcktleX0tJHt0aWNrZXRLZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KSxcbiAgICB7cHJpb3JpdHk6IHRpY2tldC5wcmlvcml0eSwgc3RhdHVzOiB0aWNrZXQuc3RhdHVzLCB0eXBlOiB0aWNrZXQudHlwZX1cbiAgKTtcbiAgYXdhaXQgYWRkU3VwcG9ydFRpY2tldEV2ZW50KGNvbnRleHQsIHtcbiAgICBhY3RvclVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgdXNlcktleSkpLFxuICAgIGV2ZW50VHlwZTogJ3N1Ym1pdHRlZCcsXG4gICAgbWV0YWRhdGE6IHtkZXRhaWxzOiB0aWNrZXQuZGVzY3JpcHRpb259LFxuICAgIHN1cHBvcnRUaWNrZXRJZDogdGlja2V0S2V5LFxuICAgIHRvVmFsdWU6IHRpY2tldC5zdGF0dXNcbiAgfSk7XG5cbiAgcmV0dXJuIHNhdmVkVGlja2V0O1xufTtcblxuZXhwb3J0IGNvbnN0IHN1Ym1pdFB1YmxpY1N1cHBvcnRUaWNrZXQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQdWJsaWNTdXBwb3J0VGlja2V0SW5wdXRcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhPiA9PiB7XG4gIGNvbnN0IGVtYWlsID0gY2xlYW5TdHJpbmcoaW5wdXQuZW1haWwsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBjbGVhblN0cmluZyhpbnB1dC5kZXNjcmlwdGlvbiwgNDAwMCk7XG4gIGNvbnN0IHN1YmplY3QgPSBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApO1xuICBpZighZW1haWxQYXR0ZXJuLnRlc3QoZW1haWwpKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3ZhbGlkX2VtYWlsJyk7XG4gIGlmKCFzdWJqZWN0KSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3N1YmplY3QnKTtcbiAgaWYoIWRlc2NyaXB0aW9uKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2Rlc2NyaXB0aW9uJyk7XG5cbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9FVkVOVFMsXG4gICAgQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMsXG4gICAgQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLFxuICAgIENPTExFQ1RJT05TLlVTRVJTXG4gIF0ubWFwKChuYW1lKSA9PiBlbnN1cmVEb2N1bWVudENvbGxlY3Rpb24oZGF0YWJhc2UsIG5hbWUpKSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5ULFxuICAgIEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFXG4gIF0ubWFwKChuYW1lKSA9PiBlbnN1cmVFZGdlQ29sbGVjdGlvbihkYXRhYmFzZSwgbmFtZSkpKTtcblxuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgZ2VuZXJhdGVkVXNlcktleSA9IGNyZWF0ZUhhc2goZW1haWwsIG51bGwpO1xuICBjb25zdCBvcHRlZEluID0gaW5wdXQubWFya2V0aW5nT3B0SW4gPT09IHRydWU7XG4gIGNvbnN0IHVzZXJJbnNlcnQgPSB7XG4gICAgX2tleTogZ2VuZXJhdGVkVXNlcktleSxcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhpbnB1dC5maXJzdE5hbWUsIDE2MCksXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGlucHV0Lmxhc3ROYW1lLCAxNjApLFxuICAgIG1haWxpbmdMaXN0OiBvcHRlZEluLFxuICAgIG1hcmtldGluZ09wdEluOiBvcHRlZEluLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgdXNlcklkOiBnZW5lcmF0ZWRVc2VyS2V5XG4gIH07XG4gIGNvbnN0IHVzZXJVcGRhdGUgPSB7XG4gICAgLi4uKG9wdGVkSW4gPyB7bWFpbGluZ0xpc3Q6IHRydWUsIG1hcmtldGluZ09wdEluOiB0cnVlLCBtYXJrZXRpbmdPcHRJbkF0OiB0aW1lc3RhbXB9IDoge30pLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoaW5wdXQuZmlyc3ROYW1lLCAxNjApIHx8IHVuZGVmaW5lZCxcbiAgICBsYXN0TmFtZTogY2xlYW5TdHJpbmcoaW5wdXQubGFzdE5hbWUsIDE2MCkgfHwgdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXBcbiAgfTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBVUFNFUlQge2VtYWlsOiAke2VtYWlsfX1cbiAgICAgIElOU0VSVCAke3VzZXJJbnNlcnR9XG4gICAgICBVUERBVEUgJHt1c2VyVXBkYXRlfVxuICAgICAgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZTtcbiAgY29uc3QgdGlja2V0ID0gYXdhaXQgY3JlYXRlU3VwcG9ydFRpY2tldChjb250ZXh0LCB7XG4gICAgZGVzY3JpcHRpb24sXG4gICAgcHJpb3JpdHk6IHN1cHBvcnRQcmlvcml0aWVzLmhhcyhTdHJpbmcoaW5wdXQucHJpb3JpdHkpKSA/IGlucHV0LnByaW9yaXR5IDogJ25vcm1hbCcsXG4gICAgc3ViamVjdCxcbiAgICB0eXBlOiBzdXBwb3J0VHlwZXMuaGFzKFN0cmluZyhpbnB1dC50eXBlKSkgPyBpbnB1dC50eXBlIDogJ2dlbmVyYWxfc3VwcG9ydCcsXG4gICAgdXNlcklkOiBTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgZ2VuZXJhdGVkVXNlcktleSlcbiAgfSk7XG4gIGF3YWl0IHNlbmRTdXBwb3J0VGlja2V0RW1haWwoY29udGV4dCwgdGlja2V0LCBkZXNjcmlwdGlvbiwgJ1dlIHJlY2VpdmVkIHlvdXIgc3VwcG9ydCB0aWNrZXQnKTtcbiAgcmV0dXJuIHRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQdWJsaWNTdXBwb3J0VGlja2V0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB0aWNrZXROdW1iZXI6IHN0cmluZyxcbiAgZW1haWxBZGRyZXNzOiBzdHJpbmdcbik6IFByb21pc2U8UHVibGljU3VwcG9ydFRpY2tldEZlZWQgfCBudWxsPiA9PiB7XG4gIGNvbnN0IGVtYWlsID0gY2xlYW5TdHJpbmcoZW1haWxBZGRyZXNzLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG51bWJlciA9IGNsZWFuU3RyaW5nKHRpY2tldE51bWJlciwgODApLnRvVXBwZXJDYXNlKCk7XG4gIGlmKCFlbWFpbFBhdHRlcm4udGVzdChlbWFpbCkgfHwgIW51bWJlcikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICBpZighYXdhaXQgZGF0YWJhc2UuY29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpLmV4aXN0cygpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBGT1IgdGlja2V0IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgICAgRklMVEVSIFVQUEVSKHRpY2tldC50aWNrZXROdW1iZXIpID09ICR7bnVtYmVyfVxuICAgICAgTEVUIHVzZXIgPSBET0NVTUVOVCgke0NPTExFQ1RJT05TLlVTRVJTfSwgdGlja2V0LnVzZXJJZClcbiAgICAgIEZJTFRFUiBMT1dFUih1c2VyLmVtYWlsKSA9PSAke2VtYWlsfVxuICAgICAgTEVUIG1lc3NhZ2VzID0gKFxuICAgICAgICBGT1IgbWVzc2FnZSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMpfVxuICAgICAgICAgIEZJTFRFUiBtZXNzYWdlLnN1cHBvcnRUaWNrZXRJZCA9PSB0aWNrZXQuX2tleSBBTkQgbWVzc2FnZS52aXNpYmlsaXR5ID09IFwiY3VzdG9tZXJcIlxuICAgICAgICAgIFNPUlQgbWVzc2FnZS5hZGRlZCBBU0NcbiAgICAgICAgICBSRVRVUk4gbWVzc2FnZVxuICAgICAgKVxuICAgICAgTEVUIGV2ZW50cyA9IChcbiAgICAgICAgRk9SIGV2ZW50IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9FVkVOVFMpfVxuICAgICAgICAgIEZJTFRFUiBldmVudC5zdXBwb3J0VGlja2V0SWQgPT0gdGlja2V0Ll9rZXlcbiAgICAgICAgICBTT1JUIGV2ZW50LmFkZGVkIEFTQ1xuICAgICAgICAgIFJFVFVSTiBldmVudFxuICAgICAgKVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIHt0aWNrZXQsIG1lc3NhZ2VzLCBldmVudHN9XG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgUHJvbWlzZTxQdWJsaWNTdXBwb3J0VGlja2V0RmVlZCB8IG51bGw+O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFN1cHBvcnRUaWNrZXRzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBmaWx0ZXJzOiB7cmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nOyByZWFkb25seSB1c2VySWQ/OiBzdHJpbmd9ID0ge31cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhW10+ID0+IHtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgIGlmKCFhd2FpdCBkYXRhYmFzZS5jb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUykuZXhpc3RzKCkpIHJldHVybiBbXTtcbiAgICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICAgIEZPUiB0aWNrZXQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgICAgICR7ZmlsdGVycy5zdGF0dXMgPyBhcWxgRklMVEVSIHRpY2tldC5zdGF0dXMgPT0gJHtmaWx0ZXJzLnN0YXR1c31gIDogYXFsYGB9XG4gICAgICAgICR7ZmlsdGVycy51c2VySWQgPyBhcWxgRklMVEVSIHRpY2tldC51c2VySWQgPT0gJHtkb2NLZXkoZmlsdGVycy51c2VySWQpfWAgOiBhcWxgYH1cbiAgICAgICAgTEVUIHVzZXIgPSBET0NVTUVOVCgke0NPTExFQ1RJT05TLlVTRVJTfSwgdGlja2V0LnVzZXJJZClcbiAgICAgICAgU09SVCB0aWNrZXQuYWRkZWQgREVTQ1xuICAgICAgICBSRVRVUk4gTUVSR0UodGlja2V0LCB7dXNlcn0pXG4gICAgYDtcbiAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbiAgfSkoKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVTdXBwb3J0VGlja2V0U3RhdHVzID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBzdXBwb3J0VGlja2V0SWQ6IHN0cmluZyxcbiAgc3RhdHVzOiBTdXBwb3J0VGlja2V0U3RhdHVzLFxuICByZXNvbHV0aW9uU3VtbWFyeSA9ICcnXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YT4gPT4ge1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoc3VwcG9ydFRpY2tldElkKTtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHByZXZpb3VzID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbGBSRVRVUk4gRE9DVU1FTlQoJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSl9KWApXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgU3VwcG9ydFRpY2tldFR5cGVEYXRhIHwgbnVsbDtcbiAgY29uc3QgdXBkYXRlID0ge1xuICAgIC4uLihzdGF0dXMgPT09ICdjb21wbGV0ZWQnICYmIHtjb21wbGV0ZWRBdDogdGltZXN0YW1wLCByZXNvbHV0aW9uU3VtbWFyeTogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApfSksXG4gICAgLi4uKHN0YXR1cyA9PT0gJ2RvbmUnICYmIHtkb25lQXQ6IHRpbWVzdGFtcCwgcmVzb2x1dGlvblN1bW1hcnk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5LCA0MDAwKX0pLFxuICAgIC4uLihzdGF0dXMgPT09ICdyZXNvbHZlZCcgJiYge3Jlc29sdmVkQXQ6IHRpbWVzdGFtcCwgcmVzb2x1dGlvblN1bW1hcnk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5LCA0MDAwKX0pLFxuICAgIC4uLihzdGF0dXMgPT09ICdjbG9zZWQnICYmIHtjbG9zZWRBdDogdGltZXN0YW1wfSksXG4gICAgbGFzdFVwZGF0ZURldGFpbHM6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5LCA0MDAwKSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHN0YXR1c1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBVUERBVEUgJHt0aWNrZXRLZXl9IFdJVEggJHt1cGRhdGV9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3QgdGlja2V0ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFN1cHBvcnRUaWNrZXRUeXBlRGF0YTtcblxuICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIEZPUiBlZGdlIElOICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQpfVxuICAgICAgRklMVEVSIGVkZ2UuX3RvID09ICR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpfVxuICAgICAgVVBEQVRFIGVkZ2UgV0lUSCAke3tcbiAgICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgICAgcmVzb2x2ZWRBdDogc3RhdHVzID09PSAncmVzb2x2ZWQnID8gdGltZXN0YW1wIDogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXNcbiAgICAgIH19IElOICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQpfVxuICBgKTtcbiAgYXdhaXQgYWRkU3VwcG9ydFRpY2tldEV2ZW50KGNvbnRleHQsIHtcbiAgICBhY3RvclVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICBldmVudFR5cGU6ICdzdGF0dXNfY2hhbmdlZCcsXG4gICAgZnJvbVZhbHVlOiBwcmV2aW91cz8uc3RhdHVzLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogdGlja2V0S2V5LFxuICAgIHRvVmFsdWU6IHN0YXR1c1xuICB9KTtcblxuICBpZihzdGF0dXMgPT09ICdyZXNvbHZlZCcpIHtcbiAgICBhd2FpdCBjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbihjb250ZXh0LCB7XG4gICAgICBib2R5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSB8fCAnWW91ciBzdXBwb3J0IHRpY2tldCBoYXMgYmVlbiByZXNvbHZlZC4nLCA0MDAwKSxcbiAgICAgIHN0YXR1czogJ3F1ZXVlZCcsXG4gICAgICBzdWJqZWN0OiBgUmVzb2x2ZWQ6ICR7dGlja2V0LnN1YmplY3QgfHwgJ1N1cHBvcnQgdGlja2V0J31gLFxuICAgICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgICB0eXBlOiAnc3VwcG9ydF90aWNrZXRfcmVzb2x2ZWQnLFxuICAgICAgdXNlcklkOiB0aWNrZXQudXNlcklkXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGlja2V0O1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVN1cHBvcnRUaWNrZXRQcm9ncmVzcyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmcsXG4gIHN0YXR1czogU3VwcG9ydFRpY2tldFN0YXR1cyxcbiAgZGV0YWlsczogc3RyaW5nXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YT4gPT4ge1xuICByZXF1aXJlQ3JtQWRtaW4oY29udGV4dCk7XG4gIGlmKCFzdXBwb3J0U3RhdHVzZXMuaGFzKHN0YXR1cykpIHRocm93IG5ldyBFcnJvcignaW52YWxpZF9zdXBwb3J0X3RpY2tldF9zdGF0dXMnKTtcbiAgY29uc3QgbWFya2Rvd24gPSBjbGVhblN0cmluZyhkZXRhaWxzLCA0MDAwKTtcbiAgaWYoIW1hcmtkb3duKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3VwZGF0ZV9kZXRhaWxzJyk7XG4gIGNvbnN0IHRpY2tldCA9IGF3YWl0IHVwZGF0ZVN1cHBvcnRUaWNrZXRTdGF0dXMoY29udGV4dCwgc3VwcG9ydFRpY2tldElkLCBzdGF0dXMsIG1hcmtkb3duKTtcbiAgYXdhaXQgYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UoY29udGV4dCwge1xuICAgIGF1dGhvclVzZXJJZDogU3RyaW5nKGNvbnRleHQuc2Vzc2lvbj8udXNlcklkIHx8ICcnKSxcbiAgICBib2R5OiBtYXJrZG93bixcbiAgICBzdXBwb3J0VGlja2V0SWQsXG4gICAgdmlzaWJpbGl0eTogJ2N1c3RvbWVyJ1xuICB9KTtcbiAgYXdhaXQgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24oY29udGV4dCwge1xuICAgIGJvZHk6IG1hcmtkb3duLFxuICAgIHN0YXR1czogJ3NlbnQnLFxuICAgIHN1YmplY3Q6IGBUaWNrZXQgJHt0aWNrZXQudGlja2V0TnVtYmVyIHx8IHN1cHBvcnRUaWNrZXRJZH06ICR7c3RhdHVzLnJlcGxhY2UoL18vZywgJyAnKX1gLFxuICAgIHN1cHBvcnRUaWNrZXRJZCxcbiAgICB0eXBlOiAnc3VwcG9ydF90aWNrZXRfcHJvZ3Jlc3MnLFxuICAgIHVzZXJJZDogdGlja2V0LnVzZXJJZFxuICB9KTtcbiAgYXdhaXQgc2VuZFN1cHBvcnRUaWNrZXRFbWFpbChjb250ZXh0LCB0aWNrZXQsIG1hcmtkb3duLCBgU3VwcG9ydCB0aWNrZXQgJHtzdGF0dXMucmVwbGFjZSgvXy9nLCAnICcpfWApO1xuICByZXR1cm4gdGlja2V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFN1cHBvcnRUaWNrZXRNZXNzYWdlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogUGFydGlhbDxTdXBwb3J0VGlja2V0TWVzc2FnZVR5cGU+XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKTtcbiAgY29uc3QgbWVzc2FnZUtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldE1lc3NhZ2VJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC1tZXNzYWdlLSR7dGlja2V0S2V5fS0ke3RpbWVzdGFtcH1gKSkpO1xuICBjb25zdCBtZXNzYWdlID0ge1xuICAgIF9rZXk6IG1lc3NhZ2VLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBhdXRob3JVc2VySWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuYXV0aG9yVXNlcklkIHx8IGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGJvZHk6IGNsZWFuU3RyaW5nKGlucHV0LmJvZHksIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgc3VwcG9ydFRpY2tldE1lc3NhZ2VJZDogbWVzc2FnZUtleSxcbiAgICB2aXNpYmlsaXR5OiBpbnB1dC52aXNpYmlsaXR5IHx8ICdjdXN0b21lcidcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgSU5TRVJUICR7bWVzc2FnZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX01FU1NBR0VTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkTWVzc2FnZSA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICBhd2FpdCBzYXZlRWRnZShcbiAgICBjb250ZXh0LFxuICAgIEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFLFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXRNZXNzYWdlLSR7dGlja2V0S2V5fS0ke21lc3NhZ2VLZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX01FU1NBR0VTLCBtZXNzYWdlS2V5KSxcbiAgICB7YXV0aG9yVXNlcklkOiBtZXNzYWdlLmF1dGhvclVzZXJJZCwgdmlzaWJpbGl0eTogbWVzc2FnZS52aXNpYmlsaXR5fVxuICApO1xuXG4gIHJldHVybiBzYXZlZE1lc3NhZ2U7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldE1lc3NhZ2VzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBzdXBwb3J0VGlja2V0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0TWVzc2FnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgbWVzc2FnZSBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCBzdXBwb3J0VGlja2V0SWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UpfVxuICAgICAgU09SVCBtZXNzYWdlLmFkZGVkIEFTQ1xuICAgICAgUkVUVVJOIG1lc3NhZ2VcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3VwcG9ydFRpY2tldEV2ZW50ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogUGFydGlhbDxTdXBwb3J0VGlja2V0RXZlbnRUeXBlPlxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0RXZlbnRUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpO1xuICBjb25zdCBldmVudEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldEV2ZW50SWQgfHwgY3JlYXRlSGFzaChgc3VwcG9ydC10aWNrZXQtZXZlbnQtJHt0aWNrZXRLZXl9LSR7dGltZXN0YW1wfS0ke2lucHV0LmV2ZW50VHlwZX1gKSkpO1xuICBjb25zdCBldmVudCA9IHtcbiAgICBfa2V5OiBldmVudEtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGlucHV0LmFjdG9yVXNlcklkIHx8ICcnKSksXG4gICAgZXZlbnRUeXBlOiBjbGVhblN0cmluZyhpbnB1dC5ldmVudFR5cGUsIDE2MCksXG4gICAgZnJvbVZhbHVlOiBjbGVhblN0cmluZyhpbnB1dC5mcm9tVmFsdWUsIDMyMCksXG4gICAgbWV0YWRhdGE6IGlucHV0Lm1ldGFkYXRhIHx8IHt9LFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc3VwcG9ydFRpY2tldEV2ZW50SWQ6IGV2ZW50S2V5LFxuICAgIHN1cHBvcnRUaWNrZXRJZDogdGlja2V0S2V5LFxuICAgIHRvVmFsdWU6IGNsZWFuU3RyaW5nKGlucHV0LnRvVmFsdWUsIDMyMClcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgSU5TRVJUICR7ZXZlbnR9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9FVkVOVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRFdmVudCA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICBhd2FpdCBzYXZlRWRnZShcbiAgICBjb250ZXh0LFxuICAgIEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVF9FVkVOVCxcbiAgICBjcmVhdGVIYXNoKGBoYXNTdXBwb3J0VGlja2V0RXZlbnQtJHt0aWNrZXRLZXl9LSR7ZXZlbnRLZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUywgZXZlbnRLZXkpLFxuICAgIHthY3RvclVzZXJJZDogZXZlbnQuYWN0b3JVc2VySWQsIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlfVxuICApO1xuXG4gIHJldHVybiBzYXZlZEV2ZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFN1cHBvcnRUaWNrZXRFdmVudHMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRFdmVudFR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgZXZlbnQgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgc3VwcG9ydFRpY2tldElkKX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVF9FVkVOVCl9XG4gICAgICBTT1JUIGV2ZW50LmFkZGVkIEFTQ1xuICAgICAgUkVUVVJOIGV2ZW50XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogUGFydGlhbDxDdXN0b21lck5vdGlmaWNhdGlvblR5cGU+XG4pOiBQcm9taXNlPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleShTdHJpbmcoaW5wdXQudXNlcklkIHx8ICcnKSk7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbktleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuY3VzdG9tZXJOb3RpZmljYXRpb25JZCB8fCBjcmVhdGVIYXNoKGBjdXN0b21lci1ub3RpZmljYXRpb24tJHt1c2VyS2V5fS0ke3RpbWVzdGFtcH1gKSkpO1xuICBjb25zdCBub3RpZmljYXRpb24gPSB7XG4gICAgX2tleTogbm90aWZpY2F0aW9uS2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYm9keTogY2xlYW5TdHJpbmcoaW5wdXQuYm9keSwgNDAwMCksXG4gICAgY3VzdG9tZXJOb3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uS2V5LFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc2VudEF0OiBpbnB1dC5zZW50QXQsXG4gICAgc3RhdHVzOiBpbnB1dC5zdGF0dXMgfHwgJ3F1ZXVlZCcsXG4gICAgc3ViamVjdDogY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSksXG4gICAgdHlwZTogY2xlYW5TdHJpbmcoaW5wdXQudHlwZSwgMTYwKSxcbiAgICB1c2VySWQ6IHVzZXJLZXlcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgSU5TRVJUICR7bm90aWZpY2F0aW9ufSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1VTVE9NRVJfTk9USUZJQ0FUSU9OUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZE5vdGlmaWNhdGlvbiA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICBhd2FpdCBzYXZlRWRnZShcbiAgICBjb250ZXh0LFxuICAgIEVER0VTLkhBU19DVVNUT01FUl9OT1RJRklDQVRJT04sXG4gICAgY3JlYXRlSGFzaChgaGFzQ3VzdG9tZXJOb3RpZmljYXRpb24tJHt1c2VyS2V5fS0ke25vdGlmaWNhdGlvbktleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuQ1VTVE9NRVJfTk9USUZJQ0FUSU9OUywgbm90aWZpY2F0aW9uS2V5KSxcbiAgICB7XG4gICAgICBzdGF0dXM6IG5vdGlmaWNhdGlvbi5zdGF0dXMsXG4gICAgICBzdXBwb3J0VGlja2V0SWQ6IG5vdGlmaWNhdGlvbi5zdXBwb3J0VGlja2V0SWQsXG4gICAgICB0eXBlOiBub3RpZmljYXRpb24udHlwZVxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gc2F2ZWROb3RpZmljYXRpb247XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VzdG9tZXJOb3RpZmljYXRpb25zQnlVc2VyID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxDdXN0b21lck5vdGlmaWNhdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1Igbm90aWZpY2F0aW9uIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcklkKX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9OT1RJRklDQVRJT04pfVxuICAgICAgU09SVCBub3RpZmljYXRpb24uYWRkZWQgREVTQ1xuICAgICAgUkVUVVJOIG5vdGlmaWNhdGlvblxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG4iXSwibmFtZXMiOlsiY3JlYXRlSGFzaCIsInBhcnNlSWQiLCJwYXJzZVBob25lIiwicGFyc2VTdHJpbmciLCJhcWwiLCJsaXRlcmFsIiwiQ09MTEVDVElPTlMiLCJFREdFUyIsIkNvbmZpZyIsInVzZURiIiwiaXNBZG1pblVzZXIiLCJzZXNTZW5kIiwibm93IiwiRGF0ZSIsImNvbGxlY3Rpb24iLCJuYW1lIiwiZG9jS2V5IiwidmFsdWUiLCJTdHJpbmciLCJkb2NJZCIsImNvbGxlY3Rpb25OYW1lIiwia2V5IiwiZXh0ZXJuYWxLZXkiLCJwcmVmaXgiLCJpZCIsImNsZWFuU3RyaW5nIiwibGVuZ3RoIiwiY2xlYW5FeHRlcm5hbElkIiwidHJpbSIsInNsaWNlIiwiZW5zdXJlRG9jdW1lbnRDb2xsZWN0aW9uIiwiZGF0YWJhc2UiLCJ0YXJnZXQiLCJleGlzdHMiLCJjcmVhdGVDb2xsZWN0aW9uIiwiZXJyb3IiLCJlbnN1cmVFZGdlQ29sbGVjdGlvbiIsImNyZWF0ZUVkZ2VDb2xsZWN0aW9uIiwicmVxdWlyZUNybUFkbWluIiwiY29udGV4dCIsInNlc3Npb24iLCJFcnJvciIsInJlcXVpcmVDcm1BZG1pbmlzdHJhdG9yIiwiYWxsb3dlZENvbnRhY3RGaWVsZHMiLCJTZXQiLCJzdXBwb3J0UHJpb3JpdGllcyIsInN1cHBvcnRTdGF0dXNlcyIsInN1cHBvcnRUeXBlcyIsImVtYWlsUGF0dGVybiIsImVzY2FwZUh0bWwiLCJyZXBsYWNlIiwic2FuaXRpemVIdG1sIiwic2FuaXRpemVDc3MiLCJodG1sVG9UZXh0IiwiY2h1bmsiLCJpdGVtcyIsInNpemUiLCJncm91cHMiLCJpbmRleCIsInB1c2giLCJzdWJtaXRDcm1Gb3JtIiwiaW5wdXQiLCJtYXJrZXRpbmdPcHRJbiIsImVtYWlsIiwidG9Mb3dlckNhc2UiLCJyYXdQaG9uZSIsInBob25lIiwiZGF0YWJhc2VOYW1lIiwiQ1JNX0ZPUk1fU1VCTUlTU0lPTlMiLCJ0aW1lc3RhbXAiLCJzb3VyY2UiLCJmb3JtSWQiLCJ2YWx1ZXMiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsImdlbmVyYXRlZFVzZXJLZXkiLCJjb25zZW50IiwibWFya2V0aW5nT3B0SW5BdCIsIm1hcmtldGluZ09wdE91dEF0IiwidXNlckluc2VydCIsIl9rZXkiLCJhY3RpdmUiLCJhZGRlZCIsIm1haWxpbmdMaXN0IiwibWFya2V0aW5nQ29uc2VudFNvdXJjZSIsIm1vZGlmaWVkIiwidHlwZSIsInVzZXJBY2Nlc3MiLCJ1c2VySWQiLCJ2ZXJpZmllZEVtYWlsIiwidmVyaWZpZWRQaG9uZSIsInVzZXJVcGRhdGUiLCJ1c2VyIiwicXVlcnkiLCJVU0VSUyIsInRoZW4iLCJjdXJzb3IiLCJuZXh0Iiwic3VibWlzc2lvbklkIiwic3VibWlzc2lvbiIsInNhdmVkIiwiZ2V0Q3JtRm9ybVN1Ym1pc3Npb25zIiwiYWxsIiwiZ2V0Q3JtQ29udGFjdHMiLCJmaWx0ZXIiLCJzZWFyY2giLCJmaWVsZCIsImhhcyIsIm9wdGVkSW5Pbmx5Iiwib3BlcmF0b3IiLCJpbmNsdWRlcyIsInNlbmRDcm1DYW1wYWlnbiIsInN1YmplY3QiLCJib2R5SHRtbCIsImh0bWwiLCJjc3MiLCJjYW5kaWRhdGVzIiwic2VsZWN0ZWRJZHMiLCJ1c2VySWRzIiwibWFwIiwicmVjaXBpZW50cyIsIkJvb2xlYW4iLCJjYW1wYWlnbklkIiwiY2FtcGFpZ24iLCJmYWlsZWRDb3VudCIsInJlY2lwaWVudENvdW50Iiwic2VudENvdW50Iiwic3RhdHVzIiwiQ1JNX0NBTVBBSUdOUyIsInJlY2lwaWVudHNCYXRjaCIsIkRlc3RpbmF0aW9uIiwiQmNjQWRkcmVzc2VzIiwicmVjaXBpZW50IiwiTWVzc2FnZSIsIkJvZHkiLCJIdG1sIiwiRGF0YSIsIlRleHQiLCJTdWJqZWN0IiwiU291cmNlIiwiY29uZmlnIiwiZGV0YWlscyIsInN1cHBvcnROYW1lIiwic3VwcG9ydEVtYWlsIiwiX2Vycm9yIiwicmVzdWx0Iiwic2VudEF0Iiwic2F2ZUVkZ2UiLCJlZGdlQ29sbGVjdGlvbiIsImVkZ2VLZXkiLCJmcm9tIiwidG8iLCJkYXRhIiwiZWRnZSIsIl9mcm9tIiwiX3RvIiwiY3JlYXRlTWFpbGluZ0xpc3QiLCJtYWlsaW5nTGlzdElkIiwiY3JlYXRlZEJ5VXNlcklkIiwiZGVzY3JpcHRpb24iLCJNQUlMSU5HX0xJU1RTIiwiZ2V0TWFpbGluZ0xpc3RzIiwiYWRkVXNlclRvTWFpbGluZ0xpc3QiLCJ1c2VyS2V5IiwibGlzdEtleSIsIkhBU19NQUlMSU5HX0xJU1QiLCJhZGRlZEJ5VXNlcklkIiwicmVtb3ZlVXNlckZyb21NYWlsaW5nTGlzdCIsInVwZGF0ZSIsInJlbW92ZWRBdCIsImdldE1haWxpbmdMaXN0VXNlcnMiLCJsaXN0SWQiLCJnZXRVc2Vyc0J5UHVyY2hhc2VkUHJvZHVjdCIsInByb2R1Y3RJZCIsInByb2R1Y3RLZXkiLCJTSE9QSUZZX1BST0RVQ1RTIiwiSEFTX1BVUkNIQVNFRF9QUk9EVUNUIiwiSEFTX0NVU1RPTUVSX09SREVSIiwiZ2V0RWxpZ2libGVNYWlsaW5nVXNlcnMiLCJvcHRpb25zIiwiZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cyIsIkhBU19TVVBQT1JUX1RJQ0tFVCIsImluZ2VzdFNob3BpZnlDdXN0b21lck9yZGVyIiwic2hvcGlmeUN1c3RvbWVySWQiLCJzaG9waWZ5T3JkZXJJZCIsImN1c3RvbWVyIiwicHJvZHVjdElkcyIsIkFycmF5IiwicHJvZHVjdHMiLCJwcm9kdWN0IiwidW5kZWZpbmVkIiwibGFzdFB1cmNoYXNlZEF0IiwicHVyY2hhc2VkQXQiLCJ1c2VyUXVlcnkiLCJyZXNvbHZlZFVzZXJLZXkiLCJvcmRlcktleSIsIm9yZGVyIiwiY3VycmVuY3kiLCJ0b1VwcGVyQ2FzZSIsImN1c3RvbWVyT3JkZXJJZCIsInRvdGFsUHJpY2UiLCJOdW1iZXIiLCJvcmRlclF1ZXJ5IiwiQ1VTVE9NRVJfT1JERVJTIiwic2F2ZWRPcmRlciIsIlByb21pc2UiLCJmaW5kIiwiaXRlbSIsInByb2R1Y3REb2MiLCJ0aXRsZSIsInZhcmlhbnRJZCIsInByb2R1Y3RRdWVyeSIsImdldEN1c3RvbWVyT3JkZXJzQnlVc2VyIiwic2VuZFN1cHBvcnRUaWNrZXRFbWFpbCIsInRpY2tldCIsImhlYWRpbmciLCJnZXQiLCJ0aWNrZXROdW1iZXIiLCJzdXBwb3J0VGlja2V0SWQiLCJzdGF0dXNVcmwiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ0ZXh0IiwiVG9BZGRyZXNzZXMiLCJjYXRjaCIsImNyZWF0ZVN1cHBvcnRUaWNrZXQiLCJ0aWNrZXRLZXkiLCJ0b0lTT1N0cmluZyIsImFzc2lnbmVkVG9Vc2VySWQiLCJwcmlvcml0eSIsIlNVUFBPUlRfVElDS0VUUyIsInNhdmVkVGlja2V0IiwiYWRkU3VwcG9ydFRpY2tldEV2ZW50IiwiYWN0b3JVc2VySWQiLCJldmVudFR5cGUiLCJtZXRhZGF0YSIsInRvVmFsdWUiLCJzdWJtaXRQdWJsaWNTdXBwb3J0VGlja2V0IiwidGVzdCIsIlNVUFBPUlRfVElDS0VUX0VWRU5UUyIsIlNVUFBPUlRfVElDS0VUX01FU1NBR0VTIiwiSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UIiwiSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UiLCJvcHRlZEluIiwiZ2V0UHVibGljU3VwcG9ydFRpY2tldCIsImVtYWlsQWRkcmVzcyIsIm51bWJlciIsImdldFN1cHBvcnRUaWNrZXRzIiwiZmlsdGVycyIsInVwZGF0ZVN1cHBvcnRUaWNrZXRTdGF0dXMiLCJyZXNvbHV0aW9uU3VtbWFyeSIsInByZXZpb3VzIiwiY29tcGxldGVkQXQiLCJkb25lQXQiLCJyZXNvbHZlZEF0IiwiY2xvc2VkQXQiLCJsYXN0VXBkYXRlRGV0YWlscyIsImZyb21WYWx1ZSIsImNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uIiwiYm9keSIsInVwZGF0ZVN1cHBvcnRUaWNrZXRQcm9ncmVzcyIsIm1hcmtkb3duIiwiYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UiLCJhdXRob3JVc2VySWQiLCJ2aXNpYmlsaXR5IiwibWVzc2FnZUtleSIsInN1cHBvcnRUaWNrZXRNZXNzYWdlSWQiLCJtZXNzYWdlIiwic2F2ZWRNZXNzYWdlIiwiZ2V0U3VwcG9ydFRpY2tldE1lc3NhZ2VzIiwiZXZlbnRLZXkiLCJzdXBwb3J0VGlja2V0RXZlbnRJZCIsImV2ZW50Iiwic2F2ZWRFdmVudCIsImdldFN1cHBvcnRUaWNrZXRFdmVudHMiLCJub3RpZmljYXRpb25LZXkiLCJjdXN0b21lck5vdGlmaWNhdGlvbklkIiwibm90aWZpY2F0aW9uIiwiQ1VTVE9NRVJfTk9USUZJQ0FUSU9OUyIsInNhdmVkTm90aWZpY2F0aW9uIiwiSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTiIsImdldEN1c3RvbWVyTm90aWZpY2F0aW9uc0J5VXNlciJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsVUFBVSxFQUFFQyxPQUFPLEVBQUVDLFVBQVUsRUFBRUMsV0FBVyxRQUFPLCtCQUErQjtBQUMxRixTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUVyQyxTQUFRQyxXQUFXLEVBQUVDLEtBQUssUUFBTyw4QkFBOEI7QUFDL0QsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFDcEMsU0FBUUMsS0FBSyxRQUFPLDRCQUE0QjtBQUNoRCxTQUFRQyxXQUFXLFFBQU8sMkJBQTJCO0FBQ3JELFNBQVFDLE9BQU8sUUFBTyxhQUFhO0FBdUJuQyxNQUFNQyxNQUFNLElBQWNDLEtBQUtELEdBQUc7QUFDbEMsTUFBTUUsYUFBYSxDQUFDQyxPQUFpQlYsUUFBUVU7QUFDN0MsTUFBTUMsU0FBUyxDQUFDQyxRQUFRLEVBQUUsR0FBYWhCLFFBQVFpQixPQUFPRDtBQUN0RCxNQUFNRSxRQUFRLENBQUNDLGdCQUF3QkMsTUFBTSxFQUFFLEdBQWEsR0FBR0QsZUFBZSxDQUFDLEVBQUVKLE9BQU9LLE1BQU07QUFDOUYsTUFBTUMsY0FBYyxDQUFDQyxRQUFnQkMsS0FBSyxFQUFFLEdBQWF4QixXQUFXLEdBQUd1QixPQUFPLENBQUMsRUFBRUwsT0FBT00sS0FBSyxFQUFFO0FBQy9GLE1BQU1DLGNBQWMsQ0FBQ1IsT0FBZ0JTLFNBQVMsR0FBRyxHQUFhdkIsWUFBWWUsT0FBT0QsU0FBUyxLQUFLUztBQUMvRixNQUFNQyxrQkFBa0IsQ0FBQ1YsT0FBZ0JTLFNBQVMsR0FBRyxHQUFhUixPQUFPRCxTQUFTLElBQUlXLElBQUksR0FBR0MsS0FBSyxDQUFDLEdBQUdIO0FBQ3RHLE1BQU1JLDJCQUEyQixPQUFPQyxV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