@nlabs/reaktor 1.7.0 → 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 (211) hide show
  1. package/lib/actions/analytics.js +1 -1
  2. package/lib/actions/apps.js +1 -1
  3. package/lib/actions/connections.js +1 -1
  4. package/lib/actions/content.js +1 -1
  5. package/lib/actions/conversations.js +1 -1
  6. package/lib/actions/crm.d.ts +7 -1
  7. package/lib/actions/crm.js +224 -17
  8. package/lib/actions/crud.js +1 -1
  9. package/lib/actions/dynamodb.js +1 -1
  10. package/lib/actions/email.js +1 -1
  11. package/lib/actions/files.js +1 -1
  12. package/lib/actions/flags.js +1 -1
  13. package/lib/actions/groups.js +1 -1
  14. package/lib/actions/images.js +1 -1
  15. package/lib/actions/index.js +1 -1
  16. package/lib/actions/ios.js +1 -1
  17. package/lib/actions/locations.js +1 -1
  18. package/lib/actions/messages.js +1 -1
  19. package/lib/actions/notifications.js +1 -1
  20. package/lib/actions/payments.js +1 -1
  21. package/lib/actions/personas.js +1 -1
  22. package/lib/actions/posts.js +1 -1
  23. package/lib/actions/query.js +1 -1
  24. package/lib/actions/reactions.js +1 -1
  25. package/lib/actions/rum.js +14 -9
  26. package/lib/actions/s3.js +1 -1
  27. package/lib/actions/search.js +1 -1
  28. package/lib/actions/sms.js +1 -1
  29. package/lib/actions/statistics.js +1 -1
  30. package/lib/actions/subscriptions.js +1 -1
  31. package/lib/actions/tags.js +1 -1
  32. package/lib/actions/users.d.ts +4 -1
  33. package/lib/actions/users.js +28 -7
  34. package/lib/actions/videos.js +1 -1
  35. package/lib/adapters/arangoAdapter.js +1 -1
  36. package/lib/adapters/contentAdapter.js +1 -1
  37. package/lib/adapters/fileAdapter.js +1 -1
  38. package/lib/adapters/imageAdapter.js +1 -1
  39. package/lib/adapters/index.js +1 -1
  40. package/lib/adapters/messageAdapter.js +1 -1
  41. package/lib/adapters/postAdapter.js +1 -1
  42. package/lib/adapters/reaktorAdapter.js +1 -1
  43. package/lib/adapters/tagAdapter.js +1 -1
  44. package/lib/adapters/userAdapter.js +1 -1
  45. package/lib/config.js +1 -1
  46. package/lib/constants/collections.d.ts +12 -0
  47. package/lib/constants/collections.js +13 -1
  48. package/lib/handlers/graphqlHandler.js +1 -1
  49. package/lib/index.d.ts +3 -1
  50. package/lib/index.js +3 -2
  51. package/lib/lambdas/actions/websockets.js +1 -1
  52. package/lib/lambdas/authorizer.js +1 -1
  53. package/lib/lambdas/connection.js +1 -1
  54. package/lib/lambdas/utils/message.js +1 -1
  55. package/lib/lambdas/utils/websocket.js +1 -1
  56. package/lib/mocks/conversation.js +1 -1
  57. package/lib/mocks/file.js +1 -1
  58. package/lib/mocks/group.js +1 -1
  59. package/lib/mocks/image.js +1 -1
  60. package/lib/mocks/post.js +1 -1
  61. package/lib/mocks/tag.js +1 -1
  62. package/lib/mocks/user.js +1 -1
  63. package/lib/mocks/video.js +1 -1
  64. package/lib/mutations/analytics/analytics.js +1 -1
  65. package/lib/mutations/content/content.js +1 -1
  66. package/lib/mutations/crm/crm.js +43 -11
  67. package/lib/mutations/events/events.js +1 -1
  68. package/lib/mutations/flags/flags.js +1 -1
  69. package/lib/mutations/groups/groups.js +1 -1
  70. package/lib/mutations/images/images.js +1 -1
  71. package/lib/mutations/index.js +1 -1
  72. package/lib/mutations/locations/locations.js +1 -1
  73. package/lib/mutations/messages/messages.js +1 -1
  74. package/lib/mutations/personas/personas.js +1 -1
  75. package/lib/mutations/posts/posts.js +1 -1
  76. package/lib/mutations/reactions/reactions.js +1 -1
  77. package/lib/mutations/rum/rum.js +1 -1
  78. package/lib/mutations/statistics/statistics.js +1 -1
  79. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  80. package/lib/mutations/tags/tags.js +1 -1
  81. package/lib/mutations/users/users.js +1 -1
  82. package/lib/mutations/videos/videos.js +1 -1
  83. package/lib/objectTypes/analytics.js +1 -1
  84. package/lib/objectTypes/app.js +1 -1
  85. package/lib/objectTypes/bankAccount.js +1 -1
  86. package/lib/objectTypes/connection.js +1 -1
  87. package/lib/objectTypes/content.js +1 -1
  88. package/lib/objectTypes/conversation.js +1 -1
  89. package/lib/objectTypes/creditCard.js +1 -1
  90. package/lib/objectTypes/crm.js +5 -1
  91. package/lib/objectTypes/document.js +1 -1
  92. package/lib/objectTypes/error.js +1 -1
  93. package/lib/objectTypes/event.js +1 -1
  94. package/lib/objectTypes/external.js +1 -1
  95. package/lib/objectTypes/file.js +1 -1
  96. package/lib/objectTypes/filter.js +1 -1
  97. package/lib/objectTypes/flag.js +5 -2
  98. package/lib/objectTypes/group.js +1 -1
  99. package/lib/objectTypes/iapSubscription.js +1 -1
  100. package/lib/objectTypes/image.js +1 -1
  101. package/lib/objectTypes/index.js +1 -1
  102. package/lib/objectTypes/location.js +1 -1
  103. package/lib/objectTypes/message.js +1 -1
  104. package/lib/objectTypes/passcode.js +1 -1
  105. package/lib/objectTypes/persona.js +1 -1
  106. package/lib/objectTypes/plan.js +1 -1
  107. package/lib/objectTypes/post.js +1 -1
  108. package/lib/objectTypes/query.js +1 -1
  109. package/lib/objectTypes/reaction.js +1 -1
  110. package/lib/objectTypes/relation.js +1 -1
  111. package/lib/objectTypes/rum.js +1 -1
  112. package/lib/objectTypes/search.js +1 -1
  113. package/lib/objectTypes/statistics.js +1 -1
  114. package/lib/objectTypes/subscription.js +1 -1
  115. package/lib/objectTypes/tag.js +1 -1
  116. package/lib/objectTypes/user.js +9 -1
  117. package/lib/objectTypes/video.js +1 -1
  118. package/lib/queries/analytics/analytics.js +1 -1
  119. package/lib/queries/content/content.js +1 -1
  120. package/lib/queries/crm/crm.js +41 -13
  121. package/lib/queries/events/events.js +1 -1
  122. package/lib/queries/flags/flags.js +1 -1
  123. package/lib/queries/groups/groups.js +1 -1
  124. package/lib/queries/images/images.js +1 -1
  125. package/lib/queries/index.js +1 -1
  126. package/lib/queries/locations/locations.js +1 -1
  127. package/lib/queries/messages/messages.js +1 -1
  128. package/lib/queries/personas/personas.js +1 -1
  129. package/lib/queries/posts/posts.js +1 -1
  130. package/lib/queries/query/query.js +1 -1
  131. package/lib/queries/reactions/reactions.js +1 -1
  132. package/lib/queries/statistics/statistics.js +1 -1
  133. package/lib/queries/subscriptions/subscriptions.js +1 -1
  134. package/lib/queries/tags/tags.js +1 -1
  135. package/lib/queries/users/users.js +1 -1
  136. package/lib/queries/videos/videos.js +1 -1
  137. package/lib/templates/email/layout.js +1 -1
  138. package/lib/templates/email/passwordForgot.js +1 -1
  139. package/lib/templates/email/passwordRecovery.js +1 -1
  140. package/lib/templates/email/verifyEmail.js +1 -1
  141. package/lib/templates/email/welcome.js +1 -1
  142. package/lib/templates/sms/passwordForgot.js +1 -1
  143. package/lib/templates/sms/passwordRecovery.js +1 -1
  144. package/lib/templates/sms/verifyEmail.js +1 -1
  145. package/lib/templates/sms/verifyPhone.js +1 -1
  146. package/lib/templates/sms/welcome.js +1 -1
  147. package/lib/types/analytics.types.js +1 -1
  148. package/lib/types/apps.types.js +1 -1
  149. package/lib/types/arangodb.types.d.ts +1 -1
  150. package/lib/types/arangodb.types.js +1 -1
  151. package/lib/types/auth.types.d.ts +1 -0
  152. package/lib/types/auth.types.js +1 -1
  153. package/lib/types/connections.types.js +1 -1
  154. package/lib/types/content.types.js +1 -1
  155. package/lib/types/conversations.types.js +1 -1
  156. package/lib/types/crm.types.d.ts +20 -1
  157. package/lib/types/crm.types.js +1 -1
  158. package/lib/types/email.types.js +1 -1
  159. package/lib/types/error.types.js +1 -1
  160. package/lib/types/files.types.js +1 -1
  161. package/lib/types/flags.types.js +1 -1
  162. package/lib/types/google.types.js +1 -1
  163. package/lib/types/groups.types.js +1 -1
  164. package/lib/types/images.types.js +1 -1
  165. package/lib/types/index.js +1 -1
  166. package/lib/types/locations.types.js +1 -1
  167. package/lib/types/messages.types.js +1 -1
  168. package/lib/types/notifications.types.js +1 -1
  169. package/lib/types/payments.types.js +1 -1
  170. package/lib/types/personas.types.js +1 -1
  171. package/lib/types/posts.types.js +1 -1
  172. package/lib/types/rum.types.js +1 -1
  173. package/lib/types/statistics.types.js +1 -1
  174. package/lib/types/tags.types.js +1 -1
  175. package/lib/types/users.types.d.ts +1 -0
  176. package/lib/types/users.types.js +1 -1
  177. package/lib/types/videos.types.js +1 -1
  178. package/lib/types/websockets.types.js +1 -1
  179. package/lib/upload.js +1 -1
  180. package/lib/utils/adapterUtils.js +1 -1
  181. package/lib/utils/analyticsUtils.js +1 -1
  182. package/lib/utils/appContext.d.ts +2 -0
  183. package/lib/utils/appContext.js +10 -0
  184. package/lib/utils/aqlHelpers.js +1 -1
  185. package/lib/utils/arangodbUtils.js +1 -1
  186. package/lib/utils/authUtils.js +1 -1
  187. package/lib/utils/awsUtils.js +1 -1
  188. package/lib/utils/collectionRegistry.js +1 -1
  189. package/lib/utils/contextUtils.js +1 -1
  190. package/lib/utils/dbI18n.example.js +1 -1
  191. package/lib/utils/dbI18n.js +1 -1
  192. package/lib/utils/googleTranslate.js +1 -1
  193. package/lib/utils/graphqlUtils.d.ts +1 -0
  194. package/lib/utils/graphqlUtils.js +1 -1
  195. package/lib/utils/imageUtils.js +1 -1
  196. package/lib/utils/index.js +1 -1
  197. package/lib/utils/languageDetection.js +1 -1
  198. package/lib/utils/localeUtils.example.js +1 -1
  199. package/lib/utils/localeUtils.js +1 -1
  200. package/lib/utils/middlewareUtils.js +1 -1
  201. package/lib/utils/queryBuilder.js +1 -1
  202. package/lib/utils/schemaUtils.js +1 -1
  203. package/lib/utils/sessionUtils.d.ts +4 -0
  204. package/lib/utils/sessionUtils.js +1 -1
  205. package/lib/utils/stripeUtils.js +1 -1
  206. package/lib/utils/templateUtils.js +1 -1
  207. package/lib/utils/testUtils.js +1 -1
  208. package/lib/utils/translationQueue.example.js +1 -1
  209. package/lib/utils/translationQueue.js +1 -1
  210. package/lib/videoProcessing.js +1 -1
  211. package/package.json +18 -18
@@ -5,6 +5,7 @@
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';
9
10
  import { isAdminUser } from '../utils/sessionUtils.js';
10
11
  import { sesSend } from './email.js';
@@ -15,11 +16,30 @@ const docId = (collectionName, key = '')=>`${collectionName}/${docKey(key)}`;
15
16
  const externalKey = (prefix, id = '')=>createHash(`${prefix}-${String(id)}`, null);
16
17
  const cleanString = (value, length = 640)=>parseString(String(value || ''), length);
17
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
+ };
18
37
  const requireCrmAdmin = (context)=>{
19
38
  if (!isAdminUser(context.session)) {
20
39
  throw new Error('administrator_access_required');
21
40
  }
22
41
  };
42
+ export const requireCrmAdministrator = requireCrmAdmin;
23
43
  const allowedContactFields = new Set([
24
44
  'email',
25
45
  'firstName',
@@ -28,6 +48,27 @@ const allowedContactFields = new Set([
28
48
  'marketingConsentSource',
29
49
  'crmSource'
30
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;');
31
72
  const sanitizeHtml = (value)=>String(value || '').replace(/<(script|iframe|object|embed)\b[^>]*>[\s\S]*?<\/\1>/gi, '').replace(/\son\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi, '');
32
73
  const sanitizeCss = (value)=>String(value || '').replace(/<\/?style\b[^>]*>/gi, '').replace(/@import\s+[^;]+;?/gi, '').replace(/url\s*\(\s*(['"]?)javascript:[^)]+\)/gi, '');
33
74
  const htmlToText = (value)=>value.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
@@ -43,6 +84,7 @@ export const submitCrmForm = async (context, input)=>{
43
84
  const phone = rawPhone ? parsePhone(rawPhone) || rawPhone : '';
44
85
  if (!email && !phone) throw new Error('required_email_or_phone');
45
86
  const database = useDb(context.databaseName);
87
+ await ensureDocumentCollection(database, COLLECTIONS.CRM_FORM_SUBMISSIONS);
46
88
  const timestamp = now();
47
89
  const source = cleanString(input.source || input.formId || 'form', 160);
48
90
  const values = input.values || {};
@@ -130,12 +172,16 @@ export const submitCrmForm = async (context, input)=>{
130
172
  };
131
173
  export const getCrmFormSubmissions = (context)=>{
132
174
  requireCrmAdmin(context);
133
- return useDb(context.databaseName).query(aql`
134
- FOR submission IN ${collection(COLLECTIONS.CRM_FORM_SUBMISSIONS)}
135
- SORT submission.added DESC
136
- LIMIT 500
137
- RETURN submission
138
- `).then((cursor)=>cursor.all());
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
+ })();
139
185
  };
140
186
  export const getCrmContacts = (context, filter = {})=>{
141
187
  requireCrmAdmin(context);
@@ -516,10 +562,43 @@ export const getCustomerOrdersByUser = (context, userId)=>{
516
562
  `;
517
563
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
518
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
+ };
519
597
  export const createSupportTicket = async (context, input)=>{
520
598
  const timestamp = now();
521
599
  const userKey = docKey(String(input.userId || ''));
522
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()}`;
523
602
  const ticket = {
524
603
  _key: ticketKey,
525
604
  added: timestamp,
@@ -529,9 +608,10 @@ export const createSupportTicket = async (context, input)=>{
529
608
  priority: input.priority || 'normal',
530
609
  productId: cleanExternalId(input.productId, 320),
531
610
  shopifyOrderId: cleanString(input.shopifyOrderId, 160),
532
- status: 'open',
611
+ status: 'submitted',
533
612
  subject: cleanString(input.subject, 320),
534
613
  supportTicketId: ticketKey,
614
+ ticketNumber,
535
615
  type: input.type || 'general_support',
536
616
  userId: userKey
537
617
  };
@@ -547,28 +627,131 @@ export const createSupportTicket = async (context, input)=>{
547
627
  });
548
628
  await addSupportTicketEvent(context, {
549
629
  actorUserId: docKey(String(context?.session?.userId || userKey)),
550
- eventType: 'created',
630
+ eventType: 'submitted',
631
+ metadata: {
632
+ details: ticket.description
633
+ },
551
634
  supportTicketId: ticketKey,
552
635
  toValue: ticket.status
553
636
  });
554
637
  return savedTicket;
555
638
  };
556
- export const getSupportTickets = (context, filters = {})=>{
557
- 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`
558
707
  FOR ticket IN ${collection(COLLECTIONS.SUPPORT_TICKETS)}
559
- ${filters.status ? aql`FILTER ticket.status == ${filters.status}` : aql``}
560
- ${filters.userId ? aql`FILTER ticket.userId == ${docKey(filters.userId)}` : aql``}
708
+ FILTER UPPER(ticket.ticketNumber) == ${number}
561
709
  LET user = DOCUMENT(${COLLECTIONS.USERS}, ticket.userId)
562
- SORT ticket.added DESC
563
- RETURN MERGE(ticket, {user})
564
- `;
565
- 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
+ })();
566
741
  };
567
742
  export const updateSupportTicketStatus = async (context, supportTicketId, status, resolutionSummary = '')=>{
568
743
  const ticketKey = docKey(supportTicketId);
569
744
  const timestamp = now();
570
745
  const previous = await useDb(context.databaseName).query(aql`RETURN DOCUMENT(${docId(COLLECTIONS.SUPPORT_TICKETS, ticketKey)})`).then((cursor)=>cursor.next());
571
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
+ },
572
755
  ...status === 'resolved' && {
573
756
  resolvedAt: timestamp,
574
757
  resolutionSummary: cleanString(resolutionSummary, 4000)
@@ -576,6 +759,7 @@ export const updateSupportTicketStatus = async (context, supportTicketId, status
576
759
  ...status === 'closed' && {
577
760
  closedAt: timestamp
578
761
  },
762
+ lastUpdateDetails: cleanString(resolutionSummary, 4000),
579
763
  modified: timestamp,
580
764
  status
581
765
  };
@@ -612,6 +796,29 @@ export const updateSupportTicketStatus = async (context, supportTicketId, status
612
796
  }
613
797
  return ticket;
614
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
+ };
615
822
  export const addSupportTicketMessage = async (context, input)=>{
616
823
  const timestamp = now();
617
824
  const ticketKey = docKey(String(input.supportTicketId || ''));
@@ -718,4 +925,4 @@ export const getCustomerNotificationsByUser = (context, userId)=>{
718
925
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
719
926
  };
720
927
 
721
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC9ubGFicy1yZWFrdG9yLXJlbGVhc2UuZU1RNVNoL2NoZWNrb3V0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2FjdGlvbnMvY3JtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI2LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlSWQsIHBhcnNlUGhvbmUsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2lzQWRtaW5Vc2VyfSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMuanMnO1xuaW1wb3J0IHtzZXNTZW5kfSBmcm9tICcuL2VtYWlsLmpzJztcblxuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDdXN0b21lck5vdGlmaWNhdGlvblR5cGUsXG4gIEN1c3RvbWVyT3JkZXJUeXBlLFxuICBDcm1DYW1wYWlnbklucHV0LFxuICBDcm1DYW1wYWlnblR5cGUsXG4gIENybUNvbnRhY3RGaWx0ZXIsXG4gIENybUZvcm1TdWJtaXNzaW9uSW5wdXQsXG4gIENybUZvcm1TdWJtaXNzaW9uVHlwZSxcbiAgTWFpbGluZ0xpc3RUeXBlLFxuICBTaG9waWZ5Q3VzdG9tZXJPcmRlcklucHV0LFxuICBTdXBwb3J0VGlja2V0RXZlbnRUeXBlLFxuICBTdXBwb3J0VGlja2V0TWVzc2FnZVR5cGUsXG4gIFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIFN1cHBvcnRUaWNrZXRUeXBlRGF0YVxufSBmcm9tICcuLi90eXBlcy9jcm0udHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IG5vdyA9ICgpOiBudW1iZXIgPT4gRGF0ZS5ub3coKTtcbmNvbnN0IGNvbGxlY3Rpb24gPSAobmFtZTogc3RyaW5nKSA9PiBsaXRlcmFsKG5hbWUpO1xuY29uc3QgZG9jS2V5ID0gKHZhbHVlID0gJycpOiBzdHJpbmcgPT4gcGFyc2VJZChTdHJpbmcodmFsdWUpKTtcbmNvbnN0IGRvY0lkID0gKGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsIGtleSA9ICcnKTogc3RyaW5nID0+IGAke2NvbGxlY3Rpb25OYW1lfS8ke2RvY0tleShrZXkpfWA7XG5jb25zdCBleHRlcm5hbEtleSA9IChwcmVmaXg6IHN0cmluZywgaWQgPSAnJyk6IHN0cmluZyA9PiBjcmVhdGVIYXNoKGAke3ByZWZpeH0tJHtTdHJpbmcoaWQpfWAsIG51bGwpO1xuY29uc3QgY2xlYW5TdHJpbmcgPSAodmFsdWU6IHVua25vd24sIGxlbmd0aCA9IDY0MCk6IHN0cmluZyA9PiBwYXJzZVN0cmluZyhTdHJpbmcodmFsdWUgfHwgJycpLCBsZW5ndGgpO1xuY29uc3QgY2xlYW5FeHRlcm5hbElkID0gKHZhbHVlOiB1bmtub3duLCBsZW5ndGggPSAzMjApOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCkuc2xpY2UoMCwgbGVuZ3RoKTtcblxuY29uc3QgcmVxdWlyZUNybUFkbWluID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiB2b2lkID0+IHtcbiAgaWYoIWlzQWRtaW5Vc2VyKGNvbnRleHQuc2Vzc2lvbiBhcyBhbnkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhZG1pbmlzdHJhdG9yX2FjY2Vzc19yZXF1aXJlZCcpO1xuICB9XG59O1xuXG5jb25zdCBhbGxvd2VkQ29udGFjdEZpZWxkcyA9IG5ldyBTZXQoWydlbWFpbCcsICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAncGhvbmUnLCAnbWFya2V0aW5nQ29uc2VudFNvdXJjZScsICdjcm1Tb3VyY2UnXSk7XG5jb25zdCBzYW5pdGl6ZUh0bWwgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKVxuICAucmVwbGFjZSgvPChzY3JpcHR8aWZyYW1lfG9iamVjdHxlbWJlZClcXGJbXj5dKj5bXFxzXFxTXSo/PFxcL1xcMT4vZ2ksICcnKVxuICAucmVwbGFjZSgvXFxzb25cXHcrXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzPl0rKS9naSwgJycpO1xuY29uc3Qgc2FuaXRpemVDc3MgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKVxuICAucmVwbGFjZSgvPFxcLz9zdHlsZVxcYltePl0qPi9naSwgJycpXG4gIC5yZXBsYWNlKC9AaW1wb3J0XFxzK1teO10rOz8vZ2ksICcnKVxuICAucmVwbGFjZSgvdXJsXFxzKlxcKFxccyooWydcIl0/KWphdmFzY3JpcHQ6W14pXStcXCkvZ2ksICcnKTtcbmNvbnN0IGh0bWxUb1RleHQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB2YWx1ZS5yZXBsYWNlKC88W14+XSs+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbmNvbnN0IGNodW5rID0gPFQ+KGl0ZW1zOiByZWFkb25seSBUW10sIHNpemU6IG51bWJlcik6IFRbXVtdID0+IHtcbiAgY29uc3QgZ3JvdXBzOiBUW11bXSA9IFtdO1xuICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ICs9IHNpemUpIGdyb3Vwcy5wdXNoKGl0ZW1zLnNsaWNlKGluZGV4LCBpbmRleCArIHNpemUpKTtcbiAgcmV0dXJuIGdyb3Vwcztcbn07XG5cbmV4cG9ydCBjb25zdCBzdWJtaXRDcm1Gb3JtID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogQ3JtRm9ybVN1Ym1pc3Npb25JbnB1dFxuKTogUHJvbWlzZTxDcm1Gb3JtU3VibWlzc2lvblR5cGU+ID0+IHtcbiAgaWYodHlwZW9mIGlucHV0Py5tYXJrZXRpbmdPcHRJbiAhPT0gJ2Jvb2xlYW4nKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX21hcmtldGluZ09wdEluJyk7XG4gIGNvbnN0IGVtYWlsID0gY2xlYW5TdHJpbmcoaW5wdXQuZW1haWwsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmF3UGhvbmUgPSBjbGVhblN0cmluZyhpbnB1dC5waG9uZSwgODApO1xuICBjb25zdCBwaG9uZSA9IHJhd1Bob25lID8gKHBhcnNlUGhvbmUocmF3UGhvbmUpIHx8IHJhd1Bob25lKSA6ICcnO1xuICBpZighZW1haWwgJiYgIXBob25lKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2VtYWlsX29yX3Bob25lJyk7XG5cbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBzb3VyY2UgPSBjbGVhblN0cmluZyhpbnB1dC5zb3VyY2UgfHwgaW5wdXQuZm9ybUlkIHx8ICdmb3JtJywgMTYwKTtcbiAgY29uc3QgdmFsdWVzID0gaW5wdXQudmFsdWVzIHx8IHt9O1xuICBjb25zdCBmaXJzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5maXJzdE5hbWUgfHwgdmFsdWVzLmZpcnN0TmFtZSwgMTYwKTtcbiAgY29uc3QgbGFzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSB8fCB2YWx1ZXMubGFzdE5hbWUsIDE2MCk7XG4gIGNvbnN0IGdlbmVyYXRlZFVzZXJLZXkgPSBjcmVhdGVIYXNoKGVtYWlsIHx8IHBob25lLCBudWxsKTtcbiAgY29uc3QgY29uc2VudCA9IGlucHV0Lm1hcmtldGluZ09wdEluXG4gICAgPyB7bWFya2V0aW5nT3B0SW5BdDogdGltZXN0YW1wLCBtYXJrZXRpbmdPcHRPdXRBdDogbnVsbH1cbiAgICA6IHttYXJrZXRpbmdPcHRPdXRBdDogdGltZXN0YW1wfTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWUsXG4gICAgbGFzdE5hbWUsXG4gICAgbWFpbGluZ0xpc3Q6IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6IHNvdXJjZSxcbiAgICBtYXJrZXRpbmdPcHRJbjogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwaG9uZSxcbiAgICB0eXBlOiAnY3JtQ29udGFjdCcsXG4gICAgdXNlckFjY2VzczogMCxcbiAgICB1c2VySWQ6IGdlbmVyYXRlZFVzZXJLZXksXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgLi4uY29uc2VudFxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIC4uLihlbWFpbCA/IHtlbWFpbH0gOiB7fSksXG4gICAgLi4uKGZpcnN0TmFtZSA/IHtmaXJzdE5hbWV9IDoge30pLFxuICAgIC4uLihsYXN0TmFtZSA/IHtsYXN0TmFtZX0gOiB7fSksXG4gICAgLi4uKHBob25lID8ge3Bob25lfSA6IHt9KSxcbiAgICBtYWlsaW5nTGlzdDogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogc291cmNlLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIC4uLmNvbnNlbnRcbiAgfTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBMRVQgZXhpc3RpbmcgPSBGSVJTVChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiAoJHtlbWFpbH0gIT0gXCJcIiAmJiBMT1dFUih1c2VyLmVtYWlsIHx8IFwiXCIpID09ICR7ZW1haWx9KVxuICAgICAgICAgIHx8ICgke3Bob25lfSAhPSBcIlwiICYmIHVzZXIucGhvbmUgPT0gJHtwaG9uZX0pXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke2dlbmVyYXRlZFVzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZSB8IG51bGw7XG4gIGNvbnN0IHVzZXJJZCA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgZ2VuZXJhdGVkVXNlcktleSkpO1xuXG4gIGNvbnN0IHN1Ym1pc3Npb25JZCA9IGNyZWF0ZUhhc2goYGNybS1zdWJtaXNzaW9uLSR7dGltZXN0YW1wfS0ke2VtYWlsfS0ke3Bob25lfWAsIG51bGwpO1xuICBjb25zdCBzdWJtaXNzaW9uID0ge1xuICAgIF9rZXk6IHN1Ym1pc3Npb25JZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZvcm1JZDogY2xlYW5TdHJpbmcoaW5wdXQuZm9ybUlkLCAxNjApLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHBob25lLFxuICAgIHNvdXJjZSxcbiAgICBzdWJtaXNzaW9uSWQsXG4gICAgdXNlcklkLFxuICAgIHZhbHVlc1xuICB9O1xuICBjb25zdCBzYXZlZCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBJTlNFUlQgJHtzdWJtaXNzaW9ufSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICByZXR1cm4gc2F2ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JtRm9ybVN1Ym1pc3Npb25zID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPENybUZvcm1TdWJtaXNzaW9uVHlwZVtdPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIHN1Ym1pc3Npb24gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKX1cbiAgICAgIFNPUlQgc3VibWlzc2lvbi5hZGRlZCBERVNDXG4gICAgICBMSU1JVCA1MDBcbiAgICAgIFJFVFVSTiBzdWJtaXNzaW9uXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDcm1Db250YWN0cyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBmaWx0ZXI6IENybUNvbnRhY3RGaWx0ZXIgPSB7fSk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICByZXF1aXJlQ3JtQWRtaW4oY29udGV4dCk7XG4gIGNvbnN0IHNlYXJjaCA9IGNsZWFuU3RyaW5nKGZpbHRlci5zZWFyY2gsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgZmllbGQgPSBhbGxvd2VkQ29udGFjdEZpZWxkcy5oYXMoZmlsdGVyLmZpZWxkIHx8ICcnKSA/IFN0cmluZyhmaWx0ZXIuZmllbGQpIDogJyc7XG4gIGNvbnN0IHZhbHVlID0gY2xlYW5TdHJpbmcoZmlsdGVyLnZhbHVlLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wdGVkSW5Pbmx5ID0gZmlsdGVyLm9wdGVkSW5Pbmx5ICE9PSBmYWxzZTtcbiAgY29uc3Qgb3BlcmF0b3IgPSBbJ2NvbnRhaW5zJywgJ2VxdWFscycsICdleGlzdHMnXS5pbmNsdWRlcyhmaWx0ZXIub3BlcmF0b3IgfHwgJycpID8gZmlsdGVyLm9wZXJhdG9yIDogJ2NvbnRhaW5zJztcbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgIEZJTFRFUiAkeyFvcHRlZEluT25seX0gfHwgdXNlci5tYXJrZXRpbmdPcHRJbiA9PSB0cnVlXG4gICAgICBGSUxURVIgJHshc2VhcmNofSB8fCBDT05UQUlOUyhMT1dFUihDT05DQVRfU0VQQVJBVE9SKFwiIFwiLCB1c2VyLmZpcnN0TmFtZSwgdXNlci5sYXN0TmFtZSwgdXNlci5lbWFpbCwgdXNlci5waG9uZSkpLCAke3NlYXJjaH0pXG4gICAgICBGSUxURVIgJHshZmllbGR9IHx8ICgke29wZXJhdG9yID09PSAnZXhpc3RzJ31cbiAgICAgICAgPyBIQVModXNlciwgJHtmaWVsZH0pXG4gICAgICAgIDogKCR7b3BlcmF0b3IgPT09ICdlcXVhbHMnfSA/IExPV0VSKFRPX1NUUklORyh1c2VyWyR7ZmllbGR9XSkpID09ICR7dmFsdWV9IDogQ09OVEFJTlMoTE9XRVIoVE9fU1RSSU5HKHVzZXJbJHtmaWVsZH1dKSksICR7dmFsdWV9KSkpXG4gICAgICBTT1JUIHVzZXIuYWRkZWQgREVTQ1xuICAgICAgTElNSVQgMTAwMFxuICAgICAgUkVUVVJOIE1FUkdFKHVzZXIsIHtjcm1Tb3VyY2U6IHVzZXIubWFya2V0aW5nQ29uc2VudFNvdXJjZX0pXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZW5kQ3JtQ2FtcGFpZ24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBDcm1DYW1wYWlnbklucHV0XG4pOiBQcm9taXNlPENybUNhbXBhaWduVHlwZT4gPT4ge1xuICByZXF1aXJlQ3JtQWRtaW4oY29udGV4dCk7XG4gIGNvbnN0IHN1YmplY3QgPSBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApO1xuICBjb25zdCBib2R5SHRtbCA9IHNhbml0aXplSHRtbChpbnB1dC5odG1sKTtcbiAgY29uc3QgY3NzID0gc2FuaXRpemVDc3MoaW5wdXQuY3NzKTtcbiAgaWYoIXN1YmplY3QgfHwgIWJvZHlIdG1sKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2NhbXBhaWduX2NvbnRlbnQnKTtcblxuICBjb25zdCBjYW5kaWRhdGVzID0gYXdhaXQgZ2V0Q3JtQ29udGFjdHMoY29udGV4dCwgey4uLmlucHV0LmZpbHRlciwgb3B0ZWRJbk9ubHk6IHRydWV9KTtcbiAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0KChpbnB1dC51c2VySWRzIHx8IFtdKS5tYXAoKGlkKSA9PiBkb2NLZXkoaWQpKSk7XG4gIGNvbnN0IHJlY2lwaWVudHMgPSBjYW5kaWRhdGVzLmZpbHRlcigodXNlcikgPT5cbiAgICBCb29sZWFuKHVzZXIuZW1haWwpICYmICghc2VsZWN0ZWRJZHMuc2l6ZSB8fCBzZWxlY3RlZElkcy5oYXMoZG9jS2V5KHVzZXIudXNlcklkIHx8IHVzZXIuX2tleSkpKSk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBjYW1wYWlnbklkID0gY3JlYXRlSGFzaChgY3JtLWNhbXBhaWduLSR7dGltZXN0YW1wfS0ke3N1YmplY3R9YCwgbnVsbCk7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICBjb25zdCBjYW1wYWlnbiA9IHtcbiAgICBfa2V5OiBjYW1wYWlnbklkLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgY2FtcGFpZ25JZCxcbiAgICBjc3MsXG4gICAgZmFpbGVkQ291bnQ6IDAsXG4gICAgaHRtbDogYm9keUh0bWwsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICByZWNpcGllbnRDb3VudDogcmVjaXBpZW50cy5sZW5ndGgsXG4gICAgc2VudENvdW50OiAwLFxuICAgIHN0YXR1czogJ3NlbmRpbmcnLFxuICAgIHN1YmplY3RcbiAgfTtcbiAgYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYElOU0VSVCAke2NhbXBhaWdufSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0NBTVBBSUdOUyl9YCk7XG5cbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgbGV0IHNlbnRDb3VudCA9IDA7XG4gIGZvcihjb25zdCByZWNpcGllbnRzQmF0Y2ggb2YgY2h1bmsocmVjaXBpZW50cywgNTApKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlc1NlbmQoe1xuICAgICAgICBEZXN0aW5hdGlvbjoge0JjY0FkZHJlc3NlczogcmVjaXBpZW50c0JhdGNoLm1hcCgocmVjaXBpZW50KSA9PiBTdHJpbmcocmVjaXBpZW50LmVtYWlsKSl9LFxuICAgICAgICBNZXNzYWdlOiB7XG4gICAgICAgICAgQm9keToge0h0bWw6IHtEYXRhOiBgPHN0eWxlPiR7Y3NzfTwvc3R5bGU+JHtib2R5SHRtbH1gfSwgVGV4dDoge0RhdGE6IGh0bWxUb1RleHQoYm9keUh0bWwpfX0sXG4gICAgICAgICAgU3ViamVjdDoge0RhdGE6IHN1YmplY3R9XG4gICAgICAgIH0sXG4gICAgICAgIFNvdXJjZTogYFwiJHtjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydE5hbWUgfHwgJ1JlYWt0b3InfVwiIDwke2NvbnRleHQuY29uZmlnPy5kZXRhaWxzPy5zdXBwb3J0RW1haWwgfHwgJ3N1cHBvcnRAcmVha3Rvci5pbyd9PmBcbiAgICAgIH0pO1xuICAgICAgc2VudENvdW50ICs9IHJlY2lwaWVudHNCYXRjaC5sZW5ndGg7XG4gICAgfSBjYXRjaChfZXJyb3IpIHtcbiAgICAgIGZhaWxlZENvdW50ICs9IHJlY2lwaWVudHNCYXRjaC5sZW5ndGg7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHsuLi5jYW1wYWlnbiwgZmFpbGVkQ291bnQsIHNlbnRBdDogbm93KCksIHNlbnRDb3VudCwgc3RhdHVzOiBmYWlsZWRDb3VudCA/IChzZW50Q291bnQgPyAncGFydGlhbCcgOiAnZmFpbGVkJykgOiAnc2VudCd9O1xuICBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgVVBEQVRFICR7Y2FtcGFpZ25JZH0gV0lUSCAke3tcbiAgICAgIGZhaWxlZENvdW50OiByZXN1bHQuZmFpbGVkQ291bnQsXG4gICAgICBtb2RpZmllZDogcmVzdWx0LnNlbnRBdCxcbiAgICAgIHNlbnRBdDogcmVzdWx0LnNlbnRBdCxcbiAgICAgIHNlbnRDb3VudDogcmVzdWx0LnNlbnRDb3VudCxcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1c1xuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DUk1fQ0FNUEFJR05TKX1cbiAgYCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBzYXZlRWRnZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZWRnZUNvbGxlY3Rpb246IHN0cmluZyxcbiAgZWRnZUtleTogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgZWRnZSA9IHtcbiAgICBfZnJvbTogZnJvbSxcbiAgICBfa2V5OiBlZGdlS2V5LFxuICAgIF90bzogdG8sXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIC4uLmRhdGFcbiAgfTtcbiAgY29uc3QgcXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHtlZGdlS2V5fX1cbiAgICBJTlNFUlQgJHtlZGdlfVxuICAgIFVQREFURSAke2RhdGF9IElOICR7Y29sbGVjdGlvbihlZGdlQ29sbGVjdGlvbil9XG4gIGA7XG5cbiAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVNYWlsaW5nTGlzdCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8TWFpbGluZ0xpc3RUeXBlPlxuKTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IG1haWxpbmdMaXN0SWQgPSBkb2NLZXkoU3RyaW5nKGlucHV0Py5tYWlsaW5nTGlzdElkIHx8IGNyZWF0ZUhhc2goYG1haWxpbmctbGlzdC0ke2lucHV0Py5uYW1lfS0ke3RpbWVzdGFtcH1gKSkpO1xuICBjb25zdCBtYWlsaW5nTGlzdCA9IHtcbiAgICBfa2V5OiBtYWlsaW5nTGlzdElkLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgY3JlYXRlZEJ5VXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGRlc2NyaXB0aW9uOiBjbGVhblN0cmluZyhpbnB1dD8uZGVzY3JpcHRpb24sIDIwMDApLFxuICAgIG1haWxpbmdMaXN0SWQsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBuYW1lOiBjbGVhblN0cmluZyhpbnB1dD8ubmFtZSwgMTYwKSxcbiAgICBzdGF0dXM6IGlucHV0Py5zdGF0dXMgfHwgJ2FjdGl2ZSdcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke21haWxpbmdMaXN0SWR9fVxuICAgIElOU0VSVCAke21haWxpbmdMaXN0fVxuICAgIFVQREFURSAke3tcbiAgICAgIGRlc2NyaXB0aW9uOiBtYWlsaW5nTGlzdC5kZXNjcmlwdGlvbixcbiAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICBuYW1lOiBtYWlsaW5nTGlzdC5uYW1lLFxuICAgICAgc3RhdHVzOiBtYWlsaW5nTGlzdC5zdGF0dXNcbiAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWFpbGluZ0xpc3RzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBsaXN0IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTKX1cbiAgICAgIEZJTFRFUiBsaXN0LnN0YXR1cyAhPSBcImFyY2hpdmVkXCJcbiAgICAgIFNPUlQgbGlzdC5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbGlzdFxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRVc2VyVG9NYWlsaW5nTGlzdCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG1haWxpbmdMaXN0SWQ6IHN0cmluZyxcbiAgc291cmNlID0gJ21hbnVhbCdcbik6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KHVzZXJJZCk7XG4gIGNvbnN0IGxpc3RLZXkgPSBkb2NLZXkobWFpbGluZ0xpc3RJZCk7XG4gIGNvbnN0IGVkZ2VLZXkgPSBjcmVhdGVIYXNoKGBoYXNNYWlsaW5nTGlzdC0ke3VzZXJLZXl9LSR7bGlzdEtleX1gKTtcblxuICBhd2FpdCBzYXZlRWRnZShcbiAgICBjb250ZXh0LFxuICAgIEVER0VTLkhBU19NQUlMSU5HX0xJU1QsXG4gICAgZWRnZUtleSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUywgbGlzdEtleSksXG4gICAge1xuICAgICAgYWRkZWRCeVVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICAgIHNvdXJjZTogY2xlYW5TdHJpbmcoc291cmNlLCA4MCksXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnXG4gICAgfVxuICApO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSlcbiAgICAucXVlcnkoYXFsYFJFVFVSTiBET0NVTUVOVCgke2RvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIGxpc3RLZXkpfSlgKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVVzZXJGcm9tTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KHVzZXJJZCk7XG4gIGNvbnN0IGxpc3RLZXkgPSBkb2NLZXkobWFpbGluZ0xpc3RJZCk7XG4gIGNvbnN0IGVkZ2VLZXkgPSBjcmVhdGVIYXNoKGBoYXNNYWlsaW5nTGlzdC0ke3VzZXJLZXl9LSR7bGlzdEtleX1gKTtcbiAgY29uc3QgdXBkYXRlID0ge1xuICAgIG1vZGlmaWVkOiBub3coKSxcbiAgICByZW1vdmVkQXQ6IG5vdygpLFxuICAgIHN0YXR1czogJ3JlbW92ZWQnXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke2VkZ2VLZXl9IFdJVEggJHt1cGRhdGV9IElOICR7Y29sbGVjdGlvbihFREdFUy5IQVNfTUFJTElOR19MSVNUKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKS50aGVuKEJvb2xlYW4pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1haWxpbmdMaXN0VXNlcnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG1haWxpbmdMaXN0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGxpc3RJZCA9IGRvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgdXNlciwgZWRnZSBJTiAxLi4xIElOQk9VTkQgJHtsaXN0SWR9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfTUFJTElOR19MSVNUKX1cbiAgICAgIEZJTFRFUiBlZGdlLnN0YXR1cyA9PSBcImFjdGl2ZVwiXG4gICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICBSRVRVUk4gdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5UHVyY2hhc2VkUHJvZHVjdCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcHJvZHVjdElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBwcm9kdWN0S2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktcHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBvcmRlciBJTiAxLi4xIElOQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TSE9QSUZZX1BST0RVQ1RTLCBwcm9kdWN0S2V5KX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCl9XG4gICAgICBGT1IgdXNlciBJTiAxLi4xIElOQk9VTkQgb3JkZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICAgIFJFVFVSTiBESVNUSU5DVCB1c2VyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsaWdpYmxlTWFpbGluZ1VzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBvcHRpb25zOiB7cmVhZG9ubHkgbWFpbGluZ0xpc3RJZD86IHN0cmluZzsgcmVhZG9ubHkgcHJvZHVjdElkPzogc3RyaW5nOyByZWFkb25seSBleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzPzogYm9vbGVhbn0gPSB7fVxuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMgPSBvcHRpb25zLmV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMgIT09IGZhbHNlO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBMRVQgYmFzZVVzZXJzID0gKFxuICAgICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgICAgRklMVEVSIHVzZXIubWFya2V0aW5nT3B0SW4gPT0gdHJ1ZVxuICAgICAgICBGSUxURVIgdXNlci5lbWFpbCAhPSBudWxsICYmIHVzZXIuZW1haWwgIT0gXCJcIlxuICAgICAgICBGSUxURVIgdXNlci5lbWFpbERlbGl2ZXJ5U3RhdHVzID09IG51bGwgfHwgdXNlci5lbWFpbERlbGl2ZXJ5U3RhdHVzID09IFwidmFsaWRcIlxuICAgICAgICAke29wdGlvbnMubWFpbGluZ0xpc3RJZCA/IGFxbGBcbiAgICAgICAgICBGSUxURVIgTEVOR1RIKFxuICAgICAgICAgICAgRk9SIGxpc3QgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgICAgICAgICAgIEZJTFRFUiBsaXN0Ll9rZXkgPT0gJHtkb2NLZXkob3B0aW9ucy5tYWlsaW5nTGlzdElkKX1cbiAgICAgICAgICAgICAgUkVUVVJOIGxpc3RcbiAgICAgICAgICApID4gMFxuICAgICAgICBgIDogYXFsYGB9XG4gICAgICAgICR7b3B0aW9ucy5wcm9kdWN0SWQgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EIHVzZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgICAgICBGT1IgcHJvZHVjdCBJTiAxLi4xIE9VVEJPVU5EIG9yZGVyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1BVUkNIQVNFRF9QUk9EVUNUKX1cbiAgICAgICAgICAgICAgICBGSUxURVIgcHJvZHVjdC5wcm9kdWN0SWQgPT0gJHtTdHJpbmcob3B0aW9ucy5wcm9kdWN0SWQpfVxuICAgICAgICAgICAgICAgIFJFVFVSTiBwcm9kdWN0XG4gICAgICAgICAgKSA+IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICAke2V4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiB0aWNrZXQgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUKX1cbiAgICAgICAgICAgICAgRklMVEVSIHRpY2tldC5zdGF0dXMgSU4gW1wib3BlblwiLCBcImluX3Byb2dyZXNzXCIsIFwid2FpdGluZ19vbl9jdXN0b21lclwiLCBcIndhaXRpbmdfb25faW50ZXJuYWxcIl1cbiAgICAgICAgICAgICAgRklMVEVSIHRpY2tldC5wcmlvcml0eSBJTiBbXCJoaWdoXCIsIFwidXJnZW50XCJdXG4gICAgICAgICAgICAgIFJFVFVSTiB0aWNrZXRcbiAgICAgICAgICApID09IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICBSRVRVUk4gdXNlclxuICAgIClcbiAgICBGT1IgdXNlciBJTiBiYXNlVXNlcnNcbiAgICAgIFNPUlQgdXNlci5lbWFpbCBBU0NcbiAgICAgIFJFVFVSTiBESVNUSU5DVCB1c2VyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluZ2VzdFNob3BpZnlDdXN0b21lck9yZGVyID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogU2hvcGlmeUN1c3RvbWVyT3JkZXJJbnB1dFxuKTogUHJvbWlzZTxDdXN0b21lck9yZGVyVHlwZT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3Qgc2hvcGlmeUN1c3RvbWVySWQgPSBjbGVhbkV4dGVybmFsSWQoaW5wdXQuc2hvcGlmeUN1c3RvbWVySWQsIDE2MCk7XG4gIGNvbnN0IHNob3BpZnlPcmRlcklkID0gY2xlYW5FeHRlcm5hbElkKGlucHV0LnNob3BpZnlPcmRlcklkLCAxNjApO1xuICBjb25zdCBjdXN0b21lciA9IGlucHV0LmN1c3RvbWVyIHx8IHt9O1xuICBjb25zdCBlbWFpbCA9IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmVtYWlsLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHByb2R1Y3RJZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLihpbnB1dC5wcm9kdWN0SWRzIHx8IFtdKSwgLi4uKGlucHV0LnByb2R1Y3RzIHx8IFtdKS5tYXAoKHByb2R1Y3QpID0+IHByb2R1Y3QucHJvZHVjdElkKV1cbiAgICAubWFwKChwcm9kdWN0SWQpID0+IGNsZWFuRXh0ZXJuYWxJZChwcm9kdWN0SWQsIDMyMCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSkpO1xuXG4gIGlmKCFzaG9waWZ5Q3VzdG9tZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfc2hvcGlmeUN1c3RvbWVySWQnKTtcbiAgfVxuICBpZighc2hvcGlmeU9yZGVySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3Nob3BpZnlPcmRlcklkJyk7XG4gIH1cbiAgaWYoIWVtYWlsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9jdXN0b21lckVtYWlsJyk7XG4gIH1cblxuICBjb25zdCB1c2VyS2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktdXNlcicsIHNob3BpZnlDdXN0b21lcklkKTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiB1c2VyS2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5maXJzdE5hbWUsIDE2MCksXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmxhc3ROYW1lLCAxNjApLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6ICdzaG9waWZ5JyxcbiAgICBtYXJrZXRpbmdPcHRJbjogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUsXG4gICAgbWFya2V0aW5nT3B0SW5BdDogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZCxcbiAgICB0eXBlOiAnY3JtQ29udGFjdCcsXG4gICAgdXNlcklkOiB1c2VyS2V5XG4gIH07XG4gIGNvbnN0IHVzZXJVcGRhdGUgPSB7XG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5maXJzdE5hbWUsIDE2MCksXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmxhc3ROYW1lLCAxNjApLFxuICAgIGxhc3RQdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6ICdzaG9waWZ5JyxcbiAgICBtYXJrZXRpbmdPcHRJbjogY3VzdG9tZXIubWFya2V0aW5nT3B0SW4gPT09IHRydWUsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZFxuICB9O1xuICBjb25zdCB1c2VyUXVlcnkgPSBhcWxgXG4gICAgTEVUIGV4aXN0aW5nID0gRklSU1QoXG4gICAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgICBGSUxURVIgdXNlci5zaG9waWZ5Q3VzdG9tZXJJZCA9PSAke3Nob3BpZnlDdXN0b21lcklkfSB8fCB1c2VyLmVtYWlsID09ICR7ZW1haWx9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke3VzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3QgdXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeSh1c2VyUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGU7XG4gIGNvbnN0IHJlc29sdmVkVXNlcktleSA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgdXNlcktleSkpO1xuICBjb25zdCBvcmRlcktleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LW9yZGVyJywgc2hvcGlmeU9yZGVySWQpO1xuICBjb25zdCBvcmRlciA9IHtcbiAgICBfa2V5OiBvcmRlcktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGN1cnJlbmN5OiBjbGVhblN0cmluZyhpbnB1dC5jdXJyZW5jeSwgMykudG9VcHBlckNhc2UoKSxcbiAgICBjdXN0b21lck9yZGVySWQ6IG9yZGVyS2V5LFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJvZHVjdElkcyxcbiAgICBwdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkLFxuICAgIHNob3BpZnlPcmRlcklkLFxuICAgIHRvdGFsUHJpY2U6IE51bWJlcihpbnB1dC50b3RhbFByaWNlIHx8IDApLFxuICAgIHVzZXJJZDogcmVzb2x2ZWRVc2VyS2V5XG4gIH07XG4gIGNvbnN0IG9yZGVyUXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke29yZGVyS2V5fX1cbiAgICBJTlNFUlQgJHtvcmRlcn1cbiAgICBVUERBVEUgJHt7XG4gICAgICBjdXJyZW5jeTogb3JkZXIuY3VycmVuY3ksXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgcHJvZHVjdElkcyxcbiAgICAgIHB1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCxcbiAgICAgIHRvdGFsUHJpY2U6IG9yZGVyLnRvdGFsUHJpY2UsXG4gICAgICB1c2VySWQ6IHJlc29sdmVkVXNlcktleVxuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9PUkRFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRPcmRlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShvcmRlclF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIEN1c3RvbWVyT3JkZXJUeXBlO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX09SREVSLFxuICAgIGNyZWF0ZUhhc2goYGhhc0N1c3RvbWVyT3JkZXItJHtyZXNvbHZlZFVzZXJLZXl9LSR7b3JkZXJLZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTLCBvcmRlcktleSksXG4gICAge3B1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdCwgc2hvcGlmeUN1c3RvbWVySWQsIHNob3BpZnlPcmRlcklkfVxuICApO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHByb2R1Y3RJZHMubWFwKGFzeW5jIChwcm9kdWN0SWQpID0+IHtcbiAgICBjb25zdCBwcm9kdWN0ID0gKGlucHV0LnByb2R1Y3RzIHx8IFtdKS5maW5kKChpdGVtKSA9PiBpdGVtLnByb2R1Y3RJZCA9PT0gcHJvZHVjdElkKSB8fCB7cHJvZHVjdElkfTtcbiAgICBjb25zdCBwcm9kdWN0S2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktcHJvZHVjdCcsIHByb2R1Y3RJZCk7XG4gICAgY29uc3QgcHJvZHVjdERvYyA9IHtcbiAgICAgIF9rZXk6IHByb2R1Y3RLZXksXG4gICAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHByb2R1Y3RJZCxcbiAgICAgIHRpdGxlOiBjbGVhblN0cmluZyhwcm9kdWN0LnRpdGxlLCAzMjApLFxuICAgICAgdmFyaWFudElkOiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdC52YXJpYW50SWQsIDE2MClcbiAgICB9O1xuICAgIGNvbnN0IHByb2R1Y3RRdWVyeSA9IGFxbGBcbiAgICAgIFVQU0VSVCB7X2tleTogJHtwcm9kdWN0S2V5fX1cbiAgICAgIElOU0VSVCAke3Byb2R1Y3REb2N9XG4gICAgICBVUERBVEUgJHt7XG4gICAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICAgIHRpdGxlOiBwcm9kdWN0RG9jLnRpdGxlLFxuICAgICAgICB2YXJpYW50SWQ6IHByb2R1Y3REb2MudmFyaWFudElkXG4gICAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUyl9XG4gICAgYDtcbiAgICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocHJvZHVjdFF1ZXJ5KTtcbiAgICBhd2FpdCBzYXZlRWRnZShcbiAgICAgIGNvbnRleHQsXG4gICAgICBFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QsXG4gICAgICBjcmVhdGVIYXNoKGBoYXNQdXJjaGFzZWRQcm9kdWN0LSR7b3JkZXJLZXl9LSR7cHJvZHVjdEtleX1gKSxcbiAgICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUywgb3JkZXJLZXkpLFxuICAgICAgZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSksXG4gICAgICB7cHJvZHVjdElkLCBwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXR9XG4gICAgKTtcbiAgfSkpO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgVVBEQVRFICR7cmVzb2x2ZWRVc2VyS2V5fVxuICAgIFdJVEgge1xuICAgICAgbGFzdFB1cmNoYXNlZEF0OiAke29yZGVyLnB1cmNoYXNlZEF0fSxcbiAgICAgIHRvdGFsT3JkZXJDb3VudDogTEVOR1RIKFxuICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICBSRVRVUk4gb3JkZXJcbiAgICAgICksXG4gICAgICB0b3RhbFNwZW5kOiBTVU0oXG4gICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgIFJFVFVSTiBUT19OVU1CRVIob3JkZXIudG90YWxQcmljZSlcbiAgICAgIClcbiAgICB9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gIGApO1xuXG4gIHJldHVybiBzYXZlZE9yZGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1c3RvbWVyT3JkZXJzQnlVc2VyID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxDdXN0b21lck9yZGVyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgU09SVCBvcmRlci5wdXJjaGFzZWRBdCBERVNDXG4gICAgICBSRVRVUk4gb3JkZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldFR5cGVEYXRhPlxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnVzZXJJZCB8fCAnJykpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IHRpY2tldCA9IHtcbiAgICBfa2V5OiB0aWNrZXRLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBhc3NpZ25lZFRvVXNlcklkOiBkb2NLZXkoU3RyaW5nKGlucHV0LmFzc2lnbmVkVG9Vc2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQuZGVzY3JpcHRpb24sIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJpb3JpdHk6IGlucHV0LnByaW9yaXR5IHx8ICdub3JtYWwnLFxuICAgIHByb2R1Y3RJZDogY2xlYW5FeHRlcm5hbElkKGlucHV0LnByb2R1Y3RJZCwgMzIwKSxcbiAgICBzaG9waWZ5T3JkZXJJZDogY2xlYW5TdHJpbmcoaW5wdXQuc2hvcGlmeU9yZGVySWQsIDE2MCksXG4gICAgc3RhdHVzOiAnb3BlbicsXG4gICAgc3ViamVjdDogY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0eXBlOiBpbnB1dC50eXBlIHx8ICdnZW5lcmFsX3N1cHBvcnQnLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHt0aWNrZXR9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRUaWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldC0ke3VzZXJLZXl9LSR7dGlja2V0S2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAge3ByaW9yaXR5OiB0aWNrZXQucHJpb3JpdHksIHN0YXR1czogdGlja2V0LnN0YXR1cywgdHlwZTogdGlja2V0LnR5cGV9XG4gICk7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRFdmVudChjb250ZXh0LCB7XG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8IHVzZXJLZXkpKSxcbiAgICBldmVudFR5cGU6ICdjcmVhdGVkJyxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiB0aWNrZXQuc3RhdHVzXG4gIH0pO1xuXG4gIHJldHVybiBzYXZlZFRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZmlsdGVyczoge3JlYWRvbmx5IHN0YXR1cz86IHN0cmluZzsgcmVhZG9ubHkgdXNlcklkPzogc3RyaW5nfSA9IHt9XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB0aWNrZXQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgICAke2ZpbHRlcnMuc3RhdHVzID8gYXFsYEZJTFRFUiB0aWNrZXQuc3RhdHVzID09ICR7ZmlsdGVycy5zdGF0dXN9YCA6IGFxbGBgfVxuICAgICAgJHtmaWx0ZXJzLnVzZXJJZCA/IGFxbGBGSUxURVIgdGlja2V0LnVzZXJJZCA9PSAke2RvY0tleShmaWx0ZXJzLnVzZXJJZCl9YCA6IGFxbGBgfVxuICAgICAgTEVUIHVzZXIgPSBET0NVTUVOVCgke0NPTExFQ1RJT05TLlVTRVJTfSwgdGlja2V0LnVzZXJJZClcbiAgICAgIFNPUlQgdGlja2V0LmFkZGVkIERFU0NcbiAgICAgIFJFVFVSTiBNRVJHRSh0aWNrZXQsIHt1c2VyfSlcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmcsXG4gIHN0YXR1czogU3VwcG9ydFRpY2tldFN0YXR1cyxcbiAgcmVzb2x1dGlvblN1bW1hcnkgPSAnJ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KHN1cHBvcnRUaWNrZXRJZCk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKVxuICAgIC5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpfSlgKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFN1cHBvcnRUaWNrZXRUeXBlRGF0YSB8IG51bGw7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAuLi4oc3RhdHVzID09PSAncmVzb2x2ZWQnICYmIHtyZXNvbHZlZEF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAnY2xvc2VkJyAmJiB7Y2xvc2VkQXQ6IHRpbWVzdGFtcH0pLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc3RhdHVzXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke3RpY2tldEtleX0gV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgU3VwcG9ydFRpY2tldFR5cGVEYXRhO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIGVkZ2UgSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICBGSUxURVIgZWRnZS5fdG8gPT0gJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSl9XG4gICAgICBVUERBVEUgZWRnZSBXSVRIICR7e1xuICAgICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgICByZXNvbHZlZEF0OiBzdGF0dXMgPT09ICdyZXNvbHZlZCcgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1c1xuICAgICAgfX0gSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gIGApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGV2ZW50VHlwZTogJ3N0YXR1c19jaGFuZ2VkJyxcbiAgICBmcm9tVmFsdWU6IHByZXZpb3VzPy5zdGF0dXMsXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogc3RhdHVzXG4gIH0pO1xuXG4gIGlmKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJykge1xuICAgIGF3YWl0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uKGNvbnRleHQsIHtcbiAgICAgIGJvZHk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5IHx8ICdZb3VyIHN1cHBvcnQgdGlja2V0IGhhcyBiZWVuIHJlc29sdmVkLicsIDQwMDApLFxuICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIHN1YmplY3Q6IGBSZXNvbHZlZDogJHt0aWNrZXQuc3ViamVjdCB8fCAnU3VwcG9ydCB0aWNrZXQnfWAsXG4gICAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9yZXNvbHZlZCcsXG4gICAgICB1c2VySWQ6IHRpY2tldC51c2VySWRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpO1xuICBjb25zdCBtZXNzYWdlS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0TWVzc2FnZUlkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LW1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgX2tleTogbWVzc2FnZUtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGF1dGhvclVzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hdXRob3JVc2VySWQgfHwgY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgYm9keTogY2xlYW5TdHJpbmcoaW5wdXQuYm9keSwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICBzdXBwb3J0VGlja2V0TWVzc2FnZUlkOiBtZXNzYWdlS2V5LFxuICAgIHZpc2liaWxpdHk6IGlucHV0LnZpc2liaWxpdHkgfHwgJ2N1c3RvbWVyJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHttZXNzYWdlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRNZXNzYWdlID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldE1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7bWVzc2FnZUtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMsIG1lc3NhZ2VLZXkpLFxuICAgIHthdXRob3JVc2VySWQ6IG1lc3NhZ2UuYXV0aG9yVXNlcklkLCB2aXNpYmlsaXR5OiBtZXNzYWdlLnZpc2liaWxpdHl9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkTWVzc2FnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBtZXNzYWdlIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHN1cHBvcnRUaWNrZXRJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSl9XG4gICAgICBTT1JUIG1lc3NhZ2UuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gbWVzc2FnZVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSk7XG4gIGNvbnN0IGV2ZW50S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0RXZlbnRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC1ldmVudC0ke3RpY2tldEtleX0tJHt0aW1lc3RhbXB9LSR7aW5wdXQuZXZlbnRUeXBlfWApKSk7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIF9rZXk6IGV2ZW50S2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuYWN0b3JVc2VySWQgfHwgJycpKSxcbiAgICBldmVudFR5cGU6IGNsZWFuU3RyaW5nKGlucHV0LmV2ZW50VHlwZSwgMTYwKSxcbiAgICBmcm9tVmFsdWU6IGNsZWFuU3RyaW5nKGlucHV0LmZyb21WYWx1ZSwgMzIwKSxcbiAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEgfHwge30sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0RXZlbnRJZDogZXZlbnRLZXksXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogY2xlYW5TdHJpbmcoaW5wdXQudG9WYWx1ZSwgMzIwKVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtldmVudH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZEV2ZW50ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5ULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXRFdmVudC0ke3RpY2tldEtleX0tJHtldmVudEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTLCBldmVudEtleSksXG4gICAge2FjdG9yVXNlcklkOiBldmVudC5hY3RvclVzZXJJZCwgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGV9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkRXZlbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldEV2ZW50VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBldmVudCBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCBzdXBwb3J0VGlja2V0SWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UKX1cbiAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gZXZlbnRcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZT5cbik6IFByb21pc2U8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC51c2VySWQgfHwgJycpKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5jdXN0b21lck5vdGlmaWNhdGlvbklkIHx8IGNyZWF0ZUhhc2goYGN1c3RvbWVyLW5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICBfa2V5OiBub3RpZmljYXRpb25LZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBib2R5OiBjbGVhblN0cmluZyhpbnB1dC5ib2R5LCA0MDAwKSxcbiAgICBjdXN0b21lck5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25LZXksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzZW50QXQ6IGlucHV0LnNlbnRBdCxcbiAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyB8fCAncXVldWVkJyxcbiAgICBzdWJqZWN0OiBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKSxcbiAgICB0eXBlOiBjbGVhblN0cmluZyhpbnB1dC50eXBlLCAxNjApLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtub3RpZmljYXRpb259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkTm90aWZpY2F0aW9uID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7bm90aWZpY2F0aW9uS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TLCBub3RpZmljYXRpb25LZXkpLFxuICAgIHtcbiAgICAgIHN0YXR1czogbm90aWZpY2F0aW9uLnN0YXR1cyxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogbm90aWZpY2F0aW9uLnN1cHBvcnRUaWNrZXRJZCxcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBzYXZlZE5vdGlmaWNhdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBub3RpZmljYXRpb24gSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTil9XG4gICAgICBTT1JUIG5vdGlmaWNhdGlvbi5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbm90aWZpY2F0aW9uXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlUGhvbmUiLCJwYXJzZVN0cmluZyIsImFxbCIsImxpdGVyYWwiLCJDT0xMRUNUSU9OUyIsIkVER0VTIiwidXNlRGIiLCJpc0FkbWluVXNlciIsInNlc1NlbmQiLCJub3ciLCJEYXRlIiwiY29sbGVjdGlvbiIsIm5hbWUiLCJkb2NLZXkiLCJ2YWx1ZSIsIlN0cmluZyIsImRvY0lkIiwiY29sbGVjdGlvbk5hbWUiLCJrZXkiLCJleHRlcm5hbEtleSIsInByZWZpeCIsImlkIiwiY2xlYW5TdHJpbmciLCJsZW5ndGgiLCJjbGVhbkV4dGVybmFsSWQiLCJ0cmltIiwic2xpY2UiLCJyZXF1aXJlQ3JtQWRtaW4iLCJjb250ZXh0Iiwic2Vzc2lvbiIsIkVycm9yIiwiYWxsb3dlZENvbnRhY3RGaWVsZHMiLCJTZXQiLCJzYW5pdGl6ZUh0bWwiLCJyZXBsYWNlIiwic2FuaXRpemVDc3MiLCJodG1sVG9UZXh0IiwiY2h1bmsiLCJpdGVtcyIsInNpemUiLCJncm91cHMiLCJpbmRleCIsInB1c2giLCJzdWJtaXRDcm1Gb3JtIiwiaW5wdXQiLCJtYXJrZXRpbmdPcHRJbiIsImVtYWlsIiwidG9Mb3dlckNhc2UiLCJyYXdQaG9uZSIsInBob25lIiwiZGF0YWJhc2UiLCJkYXRhYmFzZU5hbWUiLCJ0aW1lc3RhbXAiLCJzb3VyY2UiLCJmb3JtSWQiLCJ2YWx1ZXMiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsImdlbmVyYXRlZFVzZXJLZXkiLCJjb25zZW50IiwibWFya2V0aW5nT3B0SW5BdCIsIm1hcmtldGluZ09wdE91dEF0IiwidXNlckluc2VydCIsIl9rZXkiLCJhY3RpdmUiLCJhZGRlZCIsIm1haWxpbmdMaXN0IiwibWFya2V0aW5nQ29uc2VudFNvdXJjZSIsIm1vZGlmaWVkIiwidHlwZSIsInVzZXJBY2Nlc3MiLCJ1c2VySWQiLCJ2ZXJpZmllZEVtYWlsIiwidmVyaWZpZWRQaG9uZSIsInVzZXJVcGRhdGUiLCJ1c2VyIiwicXVlcnkiLCJVU0VSUyIsInRoZW4iLCJjdXJzb3IiLCJuZXh0Iiwic3VibWlzc2lvbklkIiwic3VibWlzc2lvbiIsInNhdmVkIiwiQ1JNX0ZPUk1fU1VCTUlTU0lPTlMiLCJnZXRDcm1Gb3JtU3VibWlzc2lvbnMiLCJhbGwiLCJnZXRDcm1Db250YWN0cyIsImZpbHRlciIsInNlYXJjaCIsImZpZWxkIiwiaGFzIiwib3B0ZWRJbk9ubHkiLCJvcGVyYXRvciIsImluY2x1ZGVzIiwic2VuZENybUNhbXBhaWduIiwic3ViamVjdCIsImJvZHlIdG1sIiwiaHRtbCIsImNzcyIsImNhbmRpZGF0ZXMiLCJzZWxlY3RlZElkcyIsInVzZXJJZHMiLCJtYXAiLCJyZWNpcGllbnRzIiwiQm9vbGVhbiIsImNhbXBhaWduSWQiLCJjYW1wYWlnbiIsImZhaWxlZENvdW50IiwicmVjaXBpZW50Q291bnQiLCJzZW50Q291bnQiLCJzdGF0dXMiLCJDUk1fQ0FNUEFJR05TIiwicmVjaXBpZW50c0JhdGNoIiwiRGVzdGluYXRpb24iLCJCY2NBZGRyZXNzZXMiLCJyZWNpcGllbnQiLCJNZXNzYWdlIiwiQm9keSIsIkh0bWwiLCJEYXRhIiwiVGV4dCIsIlN1YmplY3QiLCJTb3VyY2UiLCJjb25maWciLCJkZXRhaWxzIiwic3VwcG9ydE5hbWUiLCJzdXBwb3J0RW1haWwiLCJfZXJyb3IiLCJyZXN1bHQiLCJzZW50QXQiLCJzYXZlRWRnZSIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUtleSIsImZyb20iLCJ0byIsImRhdGEiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJjcmVhdGVNYWlsaW5nTGlzdCIsIm1haWxpbmdMaXN0SWQiLCJjcmVhdGVkQnlVc2VySWQiLCJkZXNjcmlwdGlvbiIsIk1BSUxJTkdfTElTVFMiLCJnZXRNYWlsaW5nTGlzdHMiLCJhZGRVc2VyVG9NYWlsaW5nTGlzdCIsInVzZXJLZXkiLCJsaXN0S2V5IiwiSEFTX01BSUxJTkdfTElTVCIsImFkZGVkQnlVc2VySWQiLCJyZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0IiwidXBkYXRlIiwicmVtb3ZlZEF0IiwiZ2V0TWFpbGluZ0xpc3RVc2VycyIsImxpc3RJZCIsImdldFVzZXJzQnlQdXJjaGFzZWRQcm9kdWN0IiwicHJvZHVjdElkIiwicHJvZHVjdEtleSIsIlNIT1BJRllfUFJPRFVDVFMiLCJIQVNfUFVSQ0hBU0VEX1BST0RVQ1QiLCJIQVNfQ1VTVE9NRVJfT1JERVIiLCJnZXRFbGlnaWJsZU1haWxpbmdVc2VycyIsIm9wdGlvbnMiLCJleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzIiwiSEFTX1NVUFBPUlRfVElDS0VUIiwiaW5nZXN0U2hvcGlmeUN1c3RvbWVyT3JkZXIiLCJzaG9waWZ5Q3VzdG9tZXJJZCIsInNob3BpZnlPcmRlcklkIiwiY3VzdG9tZXIiLCJwcm9kdWN0SWRzIiwiQXJyYXkiLCJwcm9kdWN0cyIsInByb2R1Y3QiLCJ1bmRlZmluZWQiLCJsYXN0UHVyY2hhc2VkQXQiLCJwdXJjaGFzZWRBdCIsInVzZXJRdWVyeSIsInJlc29sdmVkVXNlcktleSIsIm9yZGVyS2V5Iiwib3JkZXIiLCJjdXJyZW5jeSIsInRvVXBwZXJDYXNlIiwiY3VzdG9tZXJPcmRlcklkIiwidG90YWxQcmljZSIsIk51bWJlciIsIm9yZGVyUXVlcnkiLCJDVVNUT01FUl9PUkRFUlMiLCJzYXZlZE9yZGVyIiwiUHJvbWlzZSIsImZpbmQiLCJpdGVtIiwicHJvZHVjdERvYyIsInRpdGxlIiwidmFyaWFudElkIiwicHJvZHVjdFF1ZXJ5IiwiZ2V0Q3VzdG9tZXJPcmRlcnNCeVVzZXIiLCJjcmVhdGVTdXBwb3J0VGlja2V0IiwidGlja2V0S2V5Iiwic3VwcG9ydFRpY2tldElkIiwidGlja2V0IiwiYXNzaWduZWRUb1VzZXJJZCIsInByaW9yaXR5IiwiU1VQUE9SVF9USUNLRVRTIiwic2F2ZWRUaWNrZXQiLCJhZGRTdXBwb3J0VGlja2V0RXZlbnQiLCJhY3RvclVzZXJJZCIsImV2ZW50VHlwZSIsInRvVmFsdWUiLCJnZXRTdXBwb3J0VGlja2V0cyIsImZpbHRlcnMiLCJ1cGRhdGVTdXBwb3J0VGlja2V0U3RhdHVzIiwicmVzb2x1dGlvblN1bW1hcnkiLCJwcmV2aW91cyIsInJlc29sdmVkQXQiLCJjbG9zZWRBdCIsImZyb21WYWx1ZSIsImNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uIiwiYm9keSIsImFkZFN1cHBvcnRUaWNrZXRNZXNzYWdlIiwibWVzc2FnZUtleSIsInN1cHBvcnRUaWNrZXRNZXNzYWdlSWQiLCJtZXNzYWdlIiwiYXV0aG9yVXNlcklkIiwidmlzaWJpbGl0eSIsIlNVUFBPUlRfVElDS0VUX01FU1NBR0VTIiwic2F2ZWRNZXNzYWdlIiwiSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UiLCJnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMiLCJldmVudEtleSIsInN1cHBvcnRUaWNrZXRFdmVudElkIiwiZXZlbnQiLCJtZXRhZGF0YSIsIlNVUFBPUlRfVElDS0VUX0VWRU5UUyIsInNhdmVkRXZlbnQiLCJIQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQiLCJnZXRTdXBwb3J0VGlja2V0RXZlbnRzIiwibm90aWZpY2F0aW9uS2V5IiwiY3VzdG9tZXJOb3RpZmljYXRpb25JZCIsIm5vdGlmaWNhdGlvbiIsIkNVU1RPTUVSX05PVElGSUNBVElPTlMiLCJzYXZlZE5vdGlmaWNhdGlvbiIsIkhBU19DVVNUT01FUl9OT1RJRklDQVRJT04iLCJnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDMUYsU0FB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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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