@lifeready/core 1.0.12 → 1.0.15

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 (219) hide show
  1. package/README.md +62 -62
  2. package/bundles/lifeready-core.umd.js +14315 -14315
  3. package/bundles/lifeready-core.umd.js.map +1 -1
  4. package/bundles/lifeready-core.umd.min.js.map +1 -1
  5. package/esm2015/lib/_common/ast.js +40 -40
  6. package/esm2015/lib/_common/deferred-promise.js +24 -24
  7. package/esm2015/lib/_common/exceptions.js +157 -157
  8. package/esm2015/lib/_common/queries.gql.js +190 -190
  9. package/esm2015/lib/_common/run-outside-angular.js +79 -79
  10. package/esm2015/lib/_common/types.js +1 -1
  11. package/esm2015/lib/_common/utils.js +52 -52
  12. package/esm2015/lib/api/contact-card.gql.js +79 -79
  13. package/esm2015/lib/api/contact-card.service.js +154 -154
  14. package/esm2015/lib/api/contact-card2.gql.js +60 -60
  15. package/esm2015/lib/api/contact-card2.service.js +103 -103
  16. package/esm2015/lib/api/file.service.js +74 -74
  17. package/esm2015/lib/api/key-exchange.gql.js +188 -188
  18. package/esm2015/lib/api/key-exchange.service.js +442 -442
  19. package/esm2015/lib/api/key-exchange.types.js +18 -18
  20. package/esm2015/lib/api/key-exchange2.gql.js +171 -171
  21. package/esm2015/lib/api/key-exchange2.service.js +479 -479
  22. package/esm2015/lib/api/lock.gql.js +40 -40
  23. package/esm2015/lib/api/lock.service.js +64 -64
  24. package/esm2015/lib/api/lr-apollo.service.js +46 -46
  25. package/esm2015/lib/api/lr-graphql/index.js +6 -6
  26. package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -155
  27. package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -213
  28. package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -51
  29. package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -48
  30. package/esm2015/lib/api/lr-graphql/lr.service.js +18 -18
  31. package/esm2015/lib/api/message.service.js +138 -138
  32. package/esm2015/lib/api/persist.service.js +181 -181
  33. package/esm2015/lib/api/query-processor/common-processors.service.js +93 -93
  34. package/esm2015/lib/api/query-processor/index.js +3 -3
  35. package/esm2015/lib/api/query-processor/query-processor.service.js +262 -262
  36. package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -109
  37. package/esm2015/lib/api/shared-contact-card.service.js +119 -119
  38. package/esm2015/lib/api/shared-contact-card2.gql.js +41 -41
  39. package/esm2015/lib/api/shared-contact-card2.service.js +117 -117
  40. package/esm2015/lib/api/time.service.js +146 -146
  41. package/esm2015/lib/api/types/graphql.types.js +7 -7
  42. package/esm2015/lib/api/types/index.js +3 -3
  43. package/esm2015/lib/api/types/lr-graphql.types.js +101 -101
  44. package/esm2015/lib/auth/auth.config.js +57 -57
  45. package/esm2015/lib/auth/auth.gql.js +48 -48
  46. package/esm2015/lib/auth/auth.types.js +27 -27
  47. package/esm2015/lib/auth/idle.service.js +168 -168
  48. package/esm2015/lib/auth/idle.types.js +7 -7
  49. package/esm2015/lib/auth/lbop.service.js +355 -355
  50. package/esm2015/lib/auth/life-ready-auth.service.js +488 -488
  51. package/esm2015/lib/auth/password.service.js +320 -320
  52. package/esm2015/lib/auth/register.service.js +172 -172
  53. package/esm2015/lib/auth/two-factor.service.js +74 -74
  54. package/esm2015/lib/category/category-meta.service.js +99 -99
  55. package/esm2015/lib/category/category.gql.js +406 -406
  56. package/esm2015/lib/category/category.service.js +390 -390
  57. package/esm2015/lib/category/category.types.js +29 -29
  58. package/esm2015/lib/cryptography/cryptography.types.js +11 -11
  59. package/esm2015/lib/cryptography/encryption.service.js +189 -189
  60. package/esm2015/lib/cryptography/key-factory.service.js +237 -237
  61. package/esm2015/lib/cryptography/key-graph.service.js +299 -299
  62. package/esm2015/lib/cryptography/key-meta.service.js +200 -200
  63. package/esm2015/lib/cryptography/key.service.js +124 -124
  64. package/esm2015/lib/cryptography/slip39.service.js +169 -169
  65. package/esm2015/lib/cryptography/web-crypto.service.js +29 -29
  66. package/esm2015/lib/items2/item2.gql.js +139 -139
  67. package/esm2015/lib/items2/item2.service.js +498 -498
  68. package/esm2015/lib/items2/item2.types.js +1 -1
  69. package/esm2015/lib/life-ready.config.js +84 -84
  70. package/esm2015/lib/life-ready.module.js +74 -74
  71. package/esm2015/lib/notification/notification.gql.js +43 -43
  72. package/esm2015/lib/notification/notification.service.js +118 -118
  73. package/esm2015/lib/plan/plan.gql.js +123 -123
  74. package/esm2015/lib/plan/plan.service.js +149 -149
  75. package/esm2015/lib/plan/plan.types.js +11 -11
  76. package/esm2015/lib/record/record-attachment.service.js +101 -101
  77. package/esm2015/lib/record/record.gql.js +179 -179
  78. package/esm2015/lib/record/record.service.js +206 -206
  79. package/esm2015/lib/record/record.types.js +15 -15
  80. package/esm2015/lib/record-type/record-type.service.js +75 -75
  81. package/esm2015/lib/record-type/record-type.types.js +28 -28
  82. package/esm2015/lib/scenario/scenario.constants.js +2 -2
  83. package/esm2015/lib/scenario/scenario.controller.js +34 -34
  84. package/esm2015/lib/scenario/scenario.gql.js +72 -72
  85. package/esm2015/lib/scenario/scenario.gql.private.js +198 -198
  86. package/esm2015/lib/scenario/scenario.service.js +538 -538
  87. package/esm2015/lib/scenario/scenario.types.js +1 -1
  88. package/esm2015/lib/trusted-parties/tp-assembly.gql.private.js +22 -22
  89. package/esm2015/lib/trusted-parties/tp-assembly.js +362 -362
  90. package/esm2015/lib/trusted-parties/tp-assembly.types.js +1 -1
  91. package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +113 -113
  92. package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +129 -129
  93. package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +4 -4
  94. package/esm2015/lib/trusted-parties/tp-password-reset.controller.js +34 -34
  95. package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +236 -236
  96. package/esm2015/lib/trusted-parties/tp-password-reset.service.js +95 -95
  97. package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -148
  98. package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -326
  99. package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -41
  100. package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -87
  101. package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -215
  102. package/esm2015/lib/users/profile-details.service.js +214 -214
  103. package/esm2015/lib/users/profile.gql.js +97 -97
  104. package/esm2015/lib/users/profile.service.js +169 -169
  105. package/esm2015/lib/users/profile.types.js +34 -34
  106. package/esm2015/lib/users/user.gql.js +60 -60
  107. package/esm2015/lib/users/user.service.js +79 -79
  108. package/esm2015/lib/users/user.types.js +5 -5
  109. package/esm2015/lifeready-core.js +13 -13
  110. package/esm2015/public-api.js +71 -71
  111. package/fesm2015/lifeready-core.js +12258 -12258
  112. package/fesm2015/lifeready-core.js.map +1 -1
  113. package/lib/_common/ast.d.ts +11 -11
  114. package/lib/_common/deferred-promise.d.ts +12 -12
  115. package/lib/_common/exceptions.d.ts +109 -109
  116. package/lib/_common/queries.gql.d.ts +10 -10
  117. package/lib/_common/run-outside-angular.d.ts +14 -14
  118. package/lib/_common/types.d.ts +10 -10
  119. package/lib/_common/utils.d.ts +9 -9
  120. package/lib/api/contact-card.gql.d.ts +7 -7
  121. package/lib/api/contact-card.service.d.ts +52 -52
  122. package/lib/api/contact-card2.gql.d.ts +34 -34
  123. package/lib/api/contact-card2.service.d.ts +49 -49
  124. package/lib/api/file.service.d.ts +18 -18
  125. package/lib/api/key-exchange.gql.d.ts +9 -9
  126. package/lib/api/key-exchange.service.d.ts +39 -39
  127. package/lib/api/key-exchange.types.d.ts +196 -196
  128. package/lib/api/key-exchange2.gql.d.ts +125 -125
  129. package/lib/api/key-exchange2.service.d.ts +187 -187
  130. package/lib/api/lock.gql.d.ts +27 -27
  131. package/lib/api/lock.service.d.ts +34 -34
  132. package/lib/api/lr-apollo.service.d.ts +15 -15
  133. package/lib/api/lr-graphql/index.d.ts +5 -5
  134. package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -60
  135. package/lib/api/lr-graphql/lr-merged-mutation.d.ts +28 -28
  136. package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -28
  137. package/lib/api/lr-graphql/lr-mutation.d.ts +8 -8
  138. package/lib/api/lr-graphql/lr.service.d.ts +9 -9
  139. package/lib/api/message.service.d.ts +58 -58
  140. package/lib/api/persist.service.d.ts +31 -31
  141. package/lib/api/query-processor/common-processors.service.d.ts +36 -36
  142. package/lib/api/query-processor/index.d.ts +2 -2
  143. package/lib/api/query-processor/query-processor.service.d.ts +18 -18
  144. package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -15
  145. package/lib/api/shared-contact-card.service.d.ts +33 -33
  146. package/lib/api/shared-contact-card2.gql.d.ts +36 -36
  147. package/lib/api/shared-contact-card2.service.d.ts +45 -45
  148. package/lib/api/time.service.d.ts +16 -16
  149. package/lib/api/types/graphql.types.d.ts +29 -29
  150. package/lib/api/types/index.d.ts +2 -2
  151. package/lib/api/types/lr-graphql.types.d.ts +502 -502
  152. package/lib/auth/auth.config.d.ts +5 -5
  153. package/lib/auth/auth.gql.d.ts +15 -15
  154. package/lib/auth/auth.types.d.ts +66 -66
  155. package/lib/auth/idle.service.d.ts +40 -40
  156. package/lib/auth/idle.types.d.ts +10 -10
  157. package/lib/auth/lbop.service.d.ts +91 -91
  158. package/lib/auth/life-ready-auth.service.d.ts +61 -61
  159. package/lib/auth/password.service.d.ts +78 -78
  160. package/lib/auth/register.service.d.ts +25 -25
  161. package/lib/auth/two-factor.service.d.ts +15 -15
  162. package/lib/category/category-meta.service.d.ts +23 -23
  163. package/lib/category/category.gql.d.ts +45 -45
  164. package/lib/category/category.service.d.ts +67 -67
  165. package/lib/category/category.types.d.ts +79 -79
  166. package/lib/cryptography/cryptography.types.d.ts +83 -83
  167. package/lib/cryptography/encryption.service.d.ts +41 -41
  168. package/lib/cryptography/key-factory.service.d.ts +38 -38
  169. package/lib/cryptography/key-graph.service.d.ts +41 -41
  170. package/lib/cryptography/key-meta.service.d.ts +44 -44
  171. package/lib/cryptography/key.service.d.ts +36 -36
  172. package/lib/cryptography/slip39.service.d.ts +43 -43
  173. package/lib/cryptography/web-crypto.service.d.ts +5 -5
  174. package/lib/items2/item2.gql.d.ts +123 -123
  175. package/lib/items2/item2.service.d.ts +203 -203
  176. package/lib/items2/item2.types.d.ts +70 -70
  177. package/lib/life-ready.config.d.ts +14 -14
  178. package/lib/life-ready.module.d.ts +5 -5
  179. package/lib/notification/notification.gql.d.ts +37 -37
  180. package/lib/notification/notification.service.d.ts +63 -63
  181. package/lib/plan/plan.gql.d.ts +11 -11
  182. package/lib/plan/plan.service.d.ts +33 -33
  183. package/lib/plan/plan.types.d.ts +31 -31
  184. package/lib/record/record-attachment.service.d.ts +16 -16
  185. package/lib/record/record.gql.d.ts +14 -14
  186. package/lib/record/record.service.d.ts +25 -25
  187. package/lib/record/record.types.d.ts +57 -57
  188. package/lib/record-type/record-type.service.d.ts +11 -11
  189. package/lib/record-type/record-type.types.d.ts +50 -50
  190. package/lib/scenario/scenario.constants.d.ts +1 -1
  191. package/lib/scenario/scenario.controller.d.ts +10 -10
  192. package/lib/scenario/scenario.gql.d.ts +62 -62
  193. package/lib/scenario/scenario.gql.private.d.ts +16 -16
  194. package/lib/scenario/scenario.service.d.ts +233 -233
  195. package/lib/scenario/scenario.types.d.ts +50 -50
  196. package/lib/trusted-parties/tp-assembly.d.ts +177 -177
  197. package/lib/trusted-parties/tp-assembly.gql.private.d.ts +5 -5
  198. package/lib/trusted-parties/tp-assembly.types.d.ts +38 -38
  199. package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -20
  200. package/lib/trusted-parties/tp-password-reset-user.service.d.ts +35 -35
  201. package/lib/trusted-parties/tp-password-reset.constants.d.ts +3 -3
  202. package/lib/trusted-parties/tp-password-reset.controller.d.ts +10 -10
  203. package/lib/trusted-parties/tp-password-reset.gql.d.ts +223 -223
  204. package/lib/trusted-parties/tp-password-reset.service.d.ts +188 -188
  205. package/lib/trusted-parties/trusted-party.gql.d.ts +9 -9
  206. package/lib/trusted-parties/trusted-party.service.d.ts +44 -44
  207. package/lib/trusted-parties/trusted-party.types.d.ts +102 -102
  208. package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -79
  209. package/lib/trusted-parties/trusted-party2.service.d.ts +114 -114
  210. package/lib/users/profile-details.service.d.ts +21 -21
  211. package/lib/users/profile.gql.d.ts +11 -11
  212. package/lib/users/profile.service.d.ts +35 -35
  213. package/lib/users/profile.types.d.ts +96 -96
  214. package/lib/users/user.gql.d.ts +9 -9
  215. package/lib/users/user.service.d.ts +12 -12
  216. package/lib/users/user.types.d.ts +23 -23
  217. package/lifeready-core.d.ts +12 -12
  218. package/package.json +1 -1
  219. package/public-api.d.ts +67 -67
@@ -1,538 +1,538 @@
1
- import { __awaiter, __decorate } from "tslib";
2
- import { Injectable, Injector, NgZone } from '@angular/core';
3
- import { LrMergedMutation, LrMutation, LrService } from '../api/lr-graphql';
4
- import { mapEdges, ScenarioState, TpClaimApproverState, } from '../api/types';
5
- import { KeyGraphService } from '../cryptography/key-graph.service';
6
- import { LrBadArgumentException, LrBadStateException, } from '../_common/exceptions';
7
- import { RunOutsideAngular } from '../_common/run-outside-angular';
8
- import { DeleteScenarioMutation, CreateScenarioClaimMutation, UpdateScenarioMutation, CreateScenarioMutation, ReceiveScenarioClaimMutation, ApproveScenarioClaimMutation, CancelScenarioClaimMutation, RejectScenarioClaimMutation, } from './scenario.gql';
9
- import { Item2Service } from '../items2/item2.service';
10
- import { ScenarioAssemblyController } from './scenario.controller';
11
- import { EncryptionService } from '../cryptography/encryption.service';
12
- import { ScenarioQuery, SharedScenarioQuery } from './scenario.gql.private';
13
- import { TpsKeysQuery } from '../trusted-parties/tp-assembly.gql.private';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "../cryptography/key-graph.service";
16
- import * as i2 from "../items2/item2.service";
17
- import * as i3 from "./scenario.controller";
18
- import * as i4 from "../cryptography/encryption.service";
19
- export function throwClaimIdMismatch() {
20
- throw new LrBadArgumentException('claimId does not match with the current claimId of the scenario');
21
- }
22
- export function throwClaimNotApproved() {
23
- throw new LrBadStateException('Scenario claim has not been approved');
24
- }
25
- let ScenarioService = class ScenarioService extends LrService {
26
- constructor(ngZone, injector, keyGraph, item2Service, assemblyController, encryptionService) {
27
- super(injector);
28
- this.ngZone = ngZone;
29
- this.injector = injector;
30
- this.keyGraph = keyGraph;
31
- this.item2Service = item2Service;
32
- this.assemblyController = assemblyController;
33
- this.encryptionService = encryptionService;
34
- this.prepareAddReceiverDirectory = this.prepareReceiverDirectory;
35
- this.prepareUpdateReceiverDirectory = this.prepareReceiverDirectory;
36
- }
37
- // Scenarios
38
- createScenario(options) {
39
- return __awaiter(this, void 0, void 0, function* () {
40
- return this.mutate(this.createScenarioMutation(options));
41
- });
42
- }
43
- createScenarioMutation(options) {
44
- return __awaiter(this, void 0, void 0, function* () {
45
- const input = yield this.prepareCreateScenarioMutation(options);
46
- return new LrMutation({
47
- mutation: CreateScenarioMutation,
48
- variables: {
49
- input,
50
- },
51
- });
52
- });
53
- }
54
- updateScenario(options) {
55
- return __awaiter(this, void 0, void 0, function* () {
56
- return this.mutate(this.updateScenarioMutation(options));
57
- });
58
- }
59
- // TODO auto add the missing existing receivers and directories
60
- updateScenarioMutation(options) {
61
- return __awaiter(this, void 0, void 0, function* () {
62
- const scenario = (yield this.getScenario(options.scenarioId)).scenario;
63
- const input = yield this.prepareUpdateScenario(options, scenario);
64
- return new LrMutation({
65
- mutation: UpdateScenarioMutation,
66
- variables: {
67
- input,
68
- },
69
- });
70
- });
71
- }
72
- resetScenario(options) {
73
- return __awaiter(this, void 0, void 0, function* () {
74
- return this.mutate(this.resetScenarioMutation(options));
75
- });
76
- }
77
- resetScenarioMutation(options) {
78
- return __awaiter(this, void 0, void 0, function* () {
79
- const scenario = (yield this.getScenario(options.scenarioId)).scenario;
80
- const { assembly } = scenario;
81
- // Just need to do an update without changing approvers. This will recreate
82
- // all assembly keys.
83
- const updateSubAssemblies = mapEdges(assembly.subAssemblies).map((sa) => {
84
- const approverTps = mapEdges(sa.approvers).map((approver) => ({
85
- tpId: approver.tp.id,
86
- }));
87
- return {
88
- id: sa.id,
89
- quorum: sa.quorum,
90
- singleReject: sa.singleReject,
91
- subjectCipherDataClearJson: sa.subjectCipherDataClearJson,
92
- approverTps,
93
- };
94
- });
95
- const input = yield this.prepareUpdateScenario({
96
- scenarioId: options.scenarioId,
97
- enabled: options.enabled,
98
- updateAssembly: {
99
- quorum: assembly.quorum,
100
- singleReject: assembly.singleReject,
101
- updateSubAssemblies,
102
- },
103
- }, scenario);
104
- return new LrMutation({
105
- mutation: UpdateScenarioMutation,
106
- variables: {
107
- input,
108
- },
109
- });
110
- });
111
- }
112
- deleteScenario(scenarioId) {
113
- return __awaiter(this, void 0, void 0, function* () {
114
- return this.lrGraphQL.lrMutate(this.deleteScenarioMutation(scenarioId));
115
- });
116
- }
117
- deleteScenarioMutation(scenarioId) {
118
- return __awaiter(this, void 0, void 0, function* () {
119
- return new LrMutation({
120
- mutation: DeleteScenarioMutation,
121
- variables: { input: { scenarioId } },
122
- });
123
- });
124
- }
125
- // Claims
126
- createClaim(scenarioId) {
127
- return __awaiter(this, void 0, void 0, function* () {
128
- return this.mutate(this.createClaimMutation(scenarioId));
129
- });
130
- }
131
- createClaimMutation(scenarioId) {
132
- return __awaiter(this, void 0, void 0, function* () {
133
- return new LrMutation({
134
- mutation: CreateScenarioClaimMutation,
135
- variables: { input: { scenarioId } },
136
- });
137
- });
138
- }
139
- cancelClaim(claimId) {
140
- return __awaiter(this, void 0, void 0, function* () {
141
- return this.mutate(this.cancelClaimMutation(claimId));
142
- });
143
- }
144
- cancelClaimMutation(claimId) {
145
- return __awaiter(this, void 0, void 0, function* () {
146
- return new LrMutation({
147
- mutation: CancelScenarioClaimMutation,
148
- variables: { input: { claimId } },
149
- });
150
- });
151
- }
152
- rejectClaim(sharedScenarioId, claimId) {
153
- return __awaiter(this, void 0, void 0, function* () {
154
- return this.mutate(this.rejectClaimMutation(sharedScenarioId, claimId));
155
- });
156
- }
157
- rejectClaimMutation(sharedScenarioId, claimId) {
158
- return __awaiter(this, void 0, void 0, function* () {
159
- const mutations = yield this.prepareRejectClaimMutations(sharedScenarioId, claimId);
160
- return LrMergedMutation.create(yield Promise.all(mutations));
161
- });
162
- }
163
- approveClaim(sharedScenarioId, sharedClaimId) {
164
- return __awaiter(this, void 0, void 0, function* () {
165
- return this.mutate(this.approveClaimMutation(sharedScenarioId, sharedClaimId));
166
- });
167
- }
168
- approveClaimMutation(sharedScenarioId, sharedClaimId) {
169
- return __awaiter(this, void 0, void 0, function* () {
170
- const mutations = yield this.prepareApproveClaimMutations(sharedScenarioId, sharedClaimId);
171
- return LrMergedMutation.create(yield Promise.all(mutations));
172
- });
173
- }
174
- receiveClaim(scenarioId, sharedClaimId) {
175
- return __awaiter(this, void 0, void 0, function* () {
176
- return this.mutate(this.receiveClaimMutation(scenarioId, sharedClaimId));
177
- });
178
- }
179
- receiveClaimMutation(scenarioId, sharedClaimId) {
180
- return __awaiter(this, void 0, void 0, function* () {
181
- return new LrMutation({
182
- mutation: ReceiveScenarioClaimMutation,
183
- variables: {
184
- input: yield this.prepareClaim(scenarioId, sharedClaimId),
185
- },
186
- });
187
- });
188
- }
189
- // --------------------------------------------------------------------------------
190
- // --------------------------------------------------------------------------------
191
- // Helpers
192
- // --------------------------------------------------------------------------------
193
- // --------------------------------------------------------------------------------
194
- getScenario(scenarioId) {
195
- return __awaiter(this, void 0, void 0, function* () {
196
- return this.query({
197
- query: ScenarioQuery,
198
- variables: { scenarioId },
199
- });
200
- });
201
- }
202
- getSharedScenario(scenarioId, claimId) {
203
- return __awaiter(this, void 0, void 0, function* () {
204
- const ret = yield this.query({
205
- query: SharedScenarioQuery,
206
- variables: {
207
- scenarioId,
208
- },
209
- });
210
- if (claimId && ret.sharedScenario.sharedClaim.id !== claimId) {
211
- throwClaimIdMismatch();
212
- }
213
- return ret;
214
- });
215
- }
216
- getParticipantTpsKeys(options) {
217
- return __awaiter(this, void 0, void 0, function* () {
218
- const tpIds = options.map((x) => x.tpId);
219
- // This should contain all the TPs that we need to update the assembly.
220
- const tps = mapEdges((yield this.lrGraphQL.query({
221
- query: TpsKeysQuery,
222
- variables: {
223
- ids: tpIds,
224
- },
225
- })).tps);
226
- return tps;
227
- });
228
- }
229
- fillTpSharedKeyId(options, tps) {
230
- options.forEach((participant) => {
231
- if (!participant.tpSharedKeyId) {
232
- const tp = tps.find((x) => x.id === participant.tpId);
233
- participant.tpSharedKeyId =
234
- tp.currentUserSharedKey.userSharedKey.sharedKey.id;
235
- }
236
- });
237
- }
238
- prepareCreateScenarioMutation(options) {
239
- return __awaiter(this, void 0, void 0, function* () {
240
- const { assemblyKey, mutationInput: createAssembly } = yield this.assemblyController.prepareCreate(options.createAssembly);
241
- const createReceiversOptions = options.createReceivers || [];
242
- const createClaimantsOptions = options.createClaimants || [];
243
- // Fetch all the TPs so we don't have to pass in tpSharedKeyId
244
- const creatParticipantsOptions = createReceiversOptions.concat(createClaimantsOptions);
245
- const tps = yield this.getParticipantTpsKeys(creatParticipantsOptions);
246
- this.fillTpSharedKeyId(creatParticipantsOptions, tps);
247
- const createReceivers = yield Promise.all(createReceiversOptions.map((receiver) => this.prepareCreateReceiver(receiver, assemblyKey)));
248
- const createClaimants = yield Promise.all(createClaimantsOptions.map((x) => this.prepareCreateClaimant(x)));
249
- return {
250
- enabled: options.enabled,
251
- createAssembly,
252
- createReceivers,
253
- createClaimants,
254
- };
255
- });
256
- }
257
- prepareUpdateScenario(options, scenario) {
258
- return __awaiter(this, void 0, void 0, function* () {
259
- let assemblyKey = yield this.keyGraph.getJwkKey(scenario.assembly.assemblyKey.id);
260
- let updateAssembly;
261
- if (options.updateAssembly) {
262
- // Assembly key is always rotated when updating assembly.
263
- const result = yield this.assemblyController.prepareUpdate(options.updateAssembly, scenario.assembly);
264
- updateAssembly = result.mutationInput;
265
- assemblyKey = result.assemblyKey;
266
- }
267
- const createReceiversOptions = options.createReceivers || [];
268
- const createClaimantsOptions = options.createClaimants || [];
269
- // Fetch all the TPs so we don't have to pass in tpSharedKeyId
270
- const creatParticipantsOptions = createReceiversOptions.concat(createClaimantsOptions);
271
- const tps = yield this.getParticipantTpsKeys(creatParticipantsOptions);
272
- this.fillTpSharedKeyId(creatParticipantsOptions, tps);
273
- const createReceivers = options.createReceivers &&
274
- (yield Promise.all(options.createReceivers.map((x) => this.prepareCreateReceiver(x, assemblyKey))));
275
- const existingReceivers = mapEdges(scenario.receivers);
276
- let updateReceivers = options.updateReceivers
277
- ? yield Promise.all(options.updateReceivers.map((updateReceiver) => {
278
- // Find the receiver we are updating
279
- const existingReceiver = existingReceivers.find((x) => x.tp.id === updateReceiver.tpId);
280
- return this.prepareUpdateReceiver(updateReceiver, assemblyKey, existingReceiver);
281
- }))
282
- : [];
283
- // Fill in any missing receivers when updating assembly.
284
- if (options.updateAssembly) {
285
- // Filter out the receivers that will be deleted or already updated.
286
- const existing = existingReceivers.filter((existingReceiver) => !(options.deleteReceivers || []).includes(existingReceiver.tp.id) &&
287
- !updateReceivers.some((updateReceiver) => updateReceiver.tpId === existingReceiver.tp.id));
288
- updateReceivers = updateReceivers.concat(yield this.prepareExistingReceivers(existing, assemblyKey));
289
- }
290
- const createClaimants = options.createClaimants &&
291
- (yield Promise.all(options.createClaimants.map((x) => this.prepareCreateClaimant(x))));
292
- const existingClaimants = mapEdges(scenario.claimants);
293
- const updateClaimants = options.updateClaimants &&
294
- (yield Promise.all(options.updateClaimants.map((x) => {
295
- // Find the claimant we are updating
296
- const claimant = existingClaimants.find((existingClaimant) => existingClaimant.tp.id === x.tpId);
297
- return this.prepareUpdateClaimant(x, claimant.sharedKey.id);
298
- })));
299
- return {
300
- scenarioId: options.scenarioId,
301
- enabled: options.enabled,
302
- updateAssembly,
303
- createReceivers,
304
- updateReceivers,
305
- deleteReceivers: options.deleteReceivers,
306
- createClaimants,
307
- updateClaimants,
308
- deleteClaimants: options.deleteClaimants,
309
- };
310
- });
311
- }
312
- prepareReceiverDirectory(options, receiverSharedKey, assemblyKey) {
313
- return __awaiter(this, void 0, void 0, function* () {
314
- // TODO this should be batched
315
- const directoryKey = yield this.item2Service.getDirectoryKey(options.directoryId, options.directoryKeyId);
316
- const sharedCipherData = yield this.keyGraph.encryptToString(receiverSharedKey, options.sharedCipherDataClearJson);
317
- let wrappedItemKey = yield this.keyGraph.encryptToString(receiverSharedKey, directoryKey.jwk.toJSON(true));
318
- // TODO fetch assemblyKeyId. We are changing it such that there is always an assembly
319
- // before receivers can be added.
320
- wrappedItemKey = yield this.keyGraph.encryptToString(assemblyKey, wrappedItemKey);
321
- return {
322
- directoryId: options.directoryId,
323
- wrappedItemKey,
324
- accessRole: options.accessRole,
325
- sharedCipherData,
326
- };
327
- });
328
- }
329
- prepareCreateReceiver(options, assemblyKey) {
330
- return __awaiter(this, void 0, void 0, function* () {
331
- const { sharedKey, mutationInput } = yield this.prepareCreateParticipant(options);
332
- const addDirectories = options.addDirectories &&
333
- (yield Promise.all(options.addDirectories.map((x) => this.prepareAddReceiverDirectory(x, sharedKey.key, assemblyKey))));
334
- return Object.assign(Object.assign({}, mutationInput), { addDirectories });
335
- });
336
- }
337
- prepareUpdateReceiver(options, assemblyKey, existingReceiver) {
338
- return __awaiter(this, void 0, void 0, function* () {
339
- const sharedKeyId = existingReceiver.sharedKey.id;
340
- const deleteDirectoriesOptions = options.deleteDirectories || [];
341
- const updateDirectoriesOptions = options.updateDirectories || [];
342
- // Fill in any missing update directories
343
- mapEdges(existingReceiver.receiverDirectories).forEach((existingDirectory) => {
344
- if (deleteDirectoriesOptions.includes(existingDirectory.directory.id)) {
345
- return;
346
- }
347
- if (updateDirectoriesOptions.find((x) => x.directoryId === existingDirectory.directory.id)) {
348
- return;
349
- }
350
- updateDirectoriesOptions.push({
351
- accessRole: existingDirectory.accessRole,
352
- directoryId: existingDirectory.directory.id,
353
- sharedCipherDataClearJson: existingDirectory.sharedCipherDataClearJson,
354
- });
355
- });
356
- const { sharedKey, mutationInput } = yield this.prepareUpdateParticipant(options, sharedKeyId);
357
- const addDirectories = options.addDirectories &&
358
- (yield Promise.all(options.addDirectories.map((x) => this.prepareAddReceiverDirectory(x, sharedKey, assemblyKey))));
359
- const updateDirectories = yield Promise.all(updateDirectoriesOptions.map((x) => this.prepareUpdateReceiverDirectory(x, sharedKey, assemblyKey)));
360
- return Object.assign(Object.assign({}, mutationInput), { addDirectories,
361
- updateDirectories, deleteDirectories: options.deleteDirectories });
362
- });
363
- }
364
- prepareExistingReceiver(existingReceiver, assemblyKey) {
365
- return __awaiter(this, void 0, void 0, function* () {
366
- const updateDirectories = mapEdges(existingReceiver.receiverDirectories).map((receiverDirectory) => ({
367
- directoryId: receiverDirectory.directory.id,
368
- directoryKeyId: receiverDirectory.directory.keyId,
369
- accessRole: receiverDirectory.accessRole,
370
- sharedCipherDataClearJson: receiverDirectory.sharedCipherDataClearJson,
371
- }));
372
- // Fill it in with existing receiver.
373
- return this.prepareUpdateReceiver({
374
- tpId: existingReceiver.tp.id,
375
- sharedCipherDataClearJson: existingReceiver.sharedCipherDataClearJson,
376
- updateDirectories,
377
- }, assemblyKey, existingReceiver);
378
- });
379
- }
380
- prepareExistingReceivers(existingReceivers, assemblyKey) {
381
- return __awaiter(this, void 0, void 0, function* () {
382
- return Promise.all(existingReceivers.map((existingReceiver) => this.prepareExistingReceiver(existingReceiver, assemblyKey)));
383
- });
384
- }
385
- prepareCreateParticipant(options) {
386
- return __awaiter(this, void 0, void 0, function* () {
387
- const sharedKey = yield this.keyGraph.encryptWithNewKey(options.tpSharedKeyId, options.sharedCipherDataClearJson);
388
- return {
389
- sharedKey,
390
- mutationInput: {
391
- tpId: options.tpId,
392
- tpSharedKeyId: options.tpSharedKeyId,
393
- tpSharedKeyWrappedSharedKey: sharedKey.wrappedKey,
394
- sharedCipherData: sharedKey.cipher,
395
- },
396
- };
397
- });
398
- }
399
- prepareUpdateParticipant(options, sharedKeyId) {
400
- return __awaiter(this, void 0, void 0, function* () {
401
- const sharedKey = yield this.keyGraph.getJwkKey(sharedKeyId);
402
- const sharedCipherData = yield this.keyGraph.encryptToString(sharedKey, options.sharedCipherDataClearJson);
403
- return {
404
- sharedKey,
405
- mutationInput: {
406
- tpId: options.tpId,
407
- sharedKeyId,
408
- sharedCipherData,
409
- },
410
- };
411
- });
412
- }
413
- prepareCreateClaimant(options) {
414
- return __awaiter(this, void 0, void 0, function* () {
415
- const { mutationInput } = yield this.prepareCreateParticipant(options);
416
- return mutationInput;
417
- });
418
- }
419
- prepareUpdateClaimant(options, sharedKeyId) {
420
- return __awaiter(this, void 0, void 0, function* () {
421
- const { mutationInput } = yield this.prepareUpdateParticipant(options, sharedKeyId);
422
- return mutationInput;
423
- });
424
- }
425
- prepareClaim(scenarioId, sharedClaimId) {
426
- return __awaiter(this, void 0, void 0, function* () {
427
- // Get all the shared items
428
- const sharedScenario = (yield this.getSharedScenario(scenarioId, sharedClaimId)).sharedScenario;
429
- if (sharedScenario.state !== ScenarioState.APPROVED) {
430
- throwClaimNotApproved();
431
- }
432
- const approvals = mapEdges(sharedScenario.sharedClaim.asClaimReceiver.approvals);
433
- const assemblyKey = yield this.recoverAssemblyKey(approvals);
434
- console.log('receiveClaimMutation assemblyKey', assemblyKey);
435
- // Decrypt all items
436
- const receiverDirectories = yield Promise.all(sharedScenario.asReceiver.receiverDirectories.edges
437
- .map((edge) => edge.node)
438
- .map((receiverDirectory) => __awaiter(this, void 0, void 0, function* () {
439
- const wrappedItemKey = yield this.encryptionService.decrypt(assemblyKey, receiverDirectory.wrappedItemKey);
440
- return {
441
- receiverDirectoryId: receiverDirectory.id,
442
- receiverSharedKeyWrappedItemKey: wrappedItemKey,
443
- };
444
- })));
445
- return {
446
- scenarioClaimId: sharedClaimId,
447
- receiverDirectories,
448
- };
449
- });
450
- }
451
- recoverAssemblyKey(approvals) {
452
- return __awaiter(this, void 0, void 0, function* () {
453
- const partials = yield Promise.all(approvals.map((approval) => this.keyGraph.decryptFromString(approval.pxk.id, approval.receiverCipherPartialAssemblyKey)));
454
- return this.assemblyController.recoverAssemblyKey(partials);
455
- });
456
- }
457
- asClaimApprovers(sharedScenarioId, claimId, state) {
458
- return __awaiter(this, void 0, void 0, function* () {
459
- const sharedScenario = (yield this.getSharedScenario(sharedScenarioId, claimId)).sharedScenario;
460
- return mapEdges(sharedScenario.sharedClaim.claim.asClaimApprovers).filter((asClaimApprover) => asClaimApprover.state === state);
461
- });
462
- }
463
- prepareApproveClaimMutations(sharedScenarioId, claimId) {
464
- return __awaiter(this, void 0, void 0, function* () {
465
- // The current user may be acting as approvers in multiple sub-assemblies so
466
- // we approve them all.
467
- const asClaimApprovers = yield this.asClaimApprovers(sharedScenarioId, claimId, TpClaimApproverState.CLAIMED);
468
- return asClaimApprovers.map((asClaimApprover) => __awaiter(this, void 0, void 0, function* () {
469
- return new LrMutation({
470
- mutation: ApproveScenarioClaimMutation,
471
- variables: {
472
- input: yield this.prepareApproveClaim(asClaimApprover),
473
- },
474
- });
475
- }));
476
- });
477
- }
478
- prepareApproveClaim(asClaimApprover) {
479
- return __awaiter(this, void 0, void 0, function* () {
480
- const receiverApprovals = yield Promise.all(mapEdges(asClaimApprover.receiverApprovals).map((receiverApproval) => this.prepareReceiverApproval({
481
- receiverApprovalId: receiverApproval.id,
482
- receiverApprovalPxkId: receiverApproval.pxk.id,
483
- sharedCipherPartialAssemblyKeyClearJson: asClaimApprover.sharedCipherPartialAssemblyKeyClearJson,
484
- })));
485
- return {
486
- claimApproverId: asClaimApprover.id,
487
- receiverApprovals,
488
- };
489
- });
490
- }
491
- prepareReceiverApproval(options) {
492
- return __awaiter(this, void 0, void 0, function* () {
493
- return {
494
- receiverApprovalId: options.receiverApprovalId,
495
- // TODO allow sending of messages to receiver.
496
- receiverCipher: '',
497
- receiverCipherPartialAssemblyKey: yield this.keyGraph.encryptToString(options.receiverApprovalPxkId, options.sharedCipherPartialAssemblyKeyClearJson),
498
- };
499
- });
500
- }
501
- prepareRejectClaimMutations(sharedScenarioId, claimId) {
502
- return __awaiter(this, void 0, void 0, function* () {
503
- // The current user may be acting as approvers in multiple sub-assemblies so
504
- // we reject them all.
505
- const asClaimApprovers = yield this.asClaimApprovers(sharedScenarioId, claimId, TpClaimApproverState.CLAIMED);
506
- return asClaimApprovers.map((asClaimApprover) => __awaiter(this, void 0, void 0, function* () {
507
- return new LrMutation({
508
- mutation: RejectScenarioClaimMutation,
509
- variables: {
510
- input: { claimApproverId: asClaimApprover.id },
511
- },
512
- });
513
- }));
514
- });
515
- }
516
- };
517
- ScenarioService.SLIP39_PASSPHRASE = 'lifeready';
518
- ScenarioService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ScenarioService_Factory() { return new ScenarioService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.KeyGraphService), i0.ɵɵinject(i2.Item2Service), i0.ɵɵinject(i3.ScenarioAssemblyController), i0.ɵɵinject(i4.EncryptionService)); }, token: ScenarioService, providedIn: "root" });
519
- ScenarioService.decorators = [
520
- { type: Injectable, args: [{
521
- providedIn: 'root',
522
- },] }
523
- ];
524
- ScenarioService.ctorParameters = () => [
525
- { type: NgZone },
526
- { type: Injector },
527
- { type: KeyGraphService },
528
- { type: Item2Service },
529
- { type: ScenarioAssemblyController },
530
- { type: EncryptionService }
531
- ];
532
- ScenarioService = __decorate([
533
- RunOutsideAngular({
534
- ngZoneName: 'ngZone',
535
- })
536
- ], ScenarioService);
537
- export { ScenarioService };
538
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmFyaW8uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvb3B0L2F0bGFzc2lhbi9waXBlbGluZXMvYWdlbnQvYnVpbGQvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvc2NlbmFyaW8vc2NlbmFyaW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUUsT0FBTyxFQUNMLFFBQVEsRUFHUixhQUFhLEVBR2Isb0JBQW9CLEdBRXJCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixHQUNwQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsNEJBQTRCLEVBQzVCLDRCQUE0QixFQUM1QiwyQkFBMkIsRUFDM0IsMkJBQTJCLEdBQzVCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBYW5FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7OztBQUUxRSxN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RTtZQUM1RSxzQkFBc0I7WUFDdEIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbEQsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxvQkFBb0IsQ0FBQyxPQUFPLENBQzdCLENBQUM7WUFFRixPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FDekIsQ0FBTyxlQUFlLEVBQUUsRUFBRTtnQkFDeEIsT0FBQSxJQUFJLFVBQVUsQ0FBQztvQkFDYixRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxTQUFTLEVBQUU7d0JBQ1QsS0FBSyxFQUFFLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQyxFQUFFLEVBQUU7cUJBQy9DO2lCQUNGLENBQUMsQ0FBQTtjQUFBLENBQ0wsQ0FBQztRQUNKLENBQUM7S0FBQTtDQUNGLENBQUE7QUF0c0JlLGlDQUFpQixHQUFHLFdBQVcsQ0FBQzs7O1lBZC9DLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBL0Q4QixNQUFNO1lBQWhCLFFBQVE7WUFhcEIsZUFBZTtZQWdCZixZQUFZO1lBQ1osMEJBQTBCO1lBYTFCLGlCQUFpQjs7QUFxQmIsZUFBZTtJQU4zQixpQkFBaUIsQ0FBQztRQUNqQixVQUFVLEVBQUUsUUFBUTtLQUNyQixDQUFDO0dBSVcsZUFBZSxDQWl0QjNCO1NBanRCWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcbmltcG9ydCB7IExyTWVyZ2VkTXV0YXRpb24sIExyTXV0YXRpb24sIExyU2VydmljZSB9IGZyb20gJy4uL2FwaS9sci1ncmFwaHFsJztcbmltcG9ydCB7XG4gIG1hcEVkZ2VzLFxuICBTY2VuYXJpb05vZGUsXG4gIFNjZW5hcmlvUmVjZWl2ZXJOb2RlLFxuICBTY2VuYXJpb1N0YXRlLFxuICBTaGFyZWRTY2VuYXJpb0NsYWltUmVjZWl2ZWRBcHByb3ZhbE5vZGUsXG4gIFNoYXJlZFRwQ2xhaW1BcHByb3Zlck5vZGUsXG4gIFRwQ2xhaW1BcHByb3ZlclN0YXRlLFxuICBUcE5vZGUsXG59IGZyb20gJy4uL2FwaS90eXBlcyc7XG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbixcbiAgTHJCYWRTdGF0ZUV4Y2VwdGlvbixcbn0gZnJvbSAnLi4vX2NvbW1vbi9leGNlcHRpb25zJztcbmltcG9ydCB7IFJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi4vX2NvbW1vbi9ydW4tb3V0c2lkZS1hbmd1bGFyJztcbmltcG9ydCB7XG4gIERlbGV0ZVNjZW5hcmlvTXV0YXRpb24sXG4gIENyZWF0ZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgVXBkYXRlU2NlbmFyaW9NdXRhdGlvbixcbiAgQ3JlYXRlU2NlbmFyaW9NdXRhdGlvbixcbiAgUmVjZWl2ZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgQXBwcm92ZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgQ2FuY2VsU2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICBSZWplY3RTY2VuYXJpb0NsYWltTXV0YXRpb24sXG59IGZyb20gJy4vc2NlbmFyaW8uZ3FsJztcbmltcG9ydCB7IEl0ZW0yU2VydmljZSB9IGZyb20gJy4uL2l0ZW1zMi9pdGVtMi5zZXJ2aWNlJztcbmltcG9ydCB7IFNjZW5hcmlvQXNzZW1ibHlDb250cm9sbGVyIH0gZnJvbSAnLi9zY2VuYXJpby5jb250cm9sbGVyJztcbmltcG9ydCB7XG4gIENyZWF0ZUNsYWltYW50T3B0aW9ucyxcbiAgQ3JlYXRlUGFydGljaXBhbnRPcHRpb25zLFxuICBDcmVhdGVSZWNlaXZlck9wdGlvbnMsXG4gIENyZWF0ZVNjZW5hcmlvT3B0aW9ucyxcbiAgUGFydGljaXBhbnRPcHRpb25zLFxuICBSZWNlaXZlckRpcmVjdG9yeU9wdGlvbnMsXG4gIFJlc2V0U2NlbmFyaW9PcHRpb25zLFxuICBVcGRhdGVDbGFpbWFudE9wdGlvbnMsXG4gIFVwZGF0ZVJlY2VpdmVyT3B0aW9ucyxcbiAgVXBkYXRlU2NlbmFyaW9PcHRpb25zLFxufSBmcm9tICcuL3NjZW5hcmlvLnR5cGVzJztcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBTY2VuYXJpb1F1ZXJ5LCBTaGFyZWRTY2VuYXJpb1F1ZXJ5IH0gZnJvbSAnLi9zY2VuYXJpby5ncWwucHJpdmF0ZSc7XG5pbXBvcnQgeyBQYXJ0aWFsQXNzZW1ibHlLZXkgfSBmcm9tICcuLi90cnVzdGVkLXBhcnRpZXMvdHAtYXNzZW1ibHkudHlwZXMnO1xuaW1wb3J0IHsgVHBzS2V5c1F1ZXJ5IH0gZnJvbSAnLi4vdHJ1c3RlZC1wYXJ0aWVzL3RwLWFzc2VtYmx5LmdxbC5wcml2YXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93Q2xhaW1JZE1pc21hdGNoKCkge1xuICB0aHJvdyBuZXcgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbihcbiAgICAnY2xhaW1JZCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBjdXJyZW50IGNsYWltSWQgb2YgdGhlIHNjZW5hcmlvJ1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dDbGFpbU5vdEFwcHJvdmVkKCkge1xuICB0aHJvdyBuZXcgTHJCYWRTdGF0ZUV4Y2VwdGlvbignU2NlbmFyaW8gY2xhaW0gaGFzIG5vdCBiZWVuIGFwcHJvdmVkJyk7XG59XG5cbkBSdW5PdXRzaWRlQW5ndWxhcih7XG4gIG5nWm9uZU5hbWU6ICduZ1pvbmUnLFxufSlcbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTY2VuYXJpb1NlcnZpY2UgZXh0ZW5kcyBMclNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUga2V5R3JhcGg6IEtleUdyYXBoU2VydmljZSxcbiAgICBwcml2YXRlIGl0ZW0yU2VydmljZTogSXRlbTJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXNzZW1ibHlDb250cm9sbGVyOiBTY2VuYXJpb0Fzc2VtYmx5Q29udHJvbGxlcixcbiAgICBwcml2YXRlIGVuY3J5cHRpb25TZXJ2aWNlOiBFbmNyeXB0aW9uU2VydmljZVxuICApIHtcbiAgICBzdXBlcihpbmplY3Rvcik7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBTTElQMzlfUEFTU1BIUkFTRSA9ICdsaWZlcmVhZHknO1xuXG4gIHByaXZhdGUgcHJlcGFyZUFkZFJlY2VpdmVyRGlyZWN0b3J5ID0gdGhpcy5wcmVwYXJlUmVjZWl2ZXJEaXJlY3Rvcnk7XG4gIHByaXZhdGUgcHJlcGFyZVVwZGF0ZVJlY2VpdmVyRGlyZWN0b3J5ID0gdGhpcy5wcmVwYXJlUmVjZWl2ZXJEaXJlY3Rvcnk7XG5cbiAgLy8gU2NlbmFyaW9zXG4gIGFzeW5jIGNyZWF0ZVNjZW5hcmlvKG9wdGlvbnM6IENyZWF0ZVNjZW5hcmlvT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmNyZWF0ZVNjZW5hcmlvTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zOiBDcmVhdGVTY2VuYXJpb09wdGlvbnMpIHtcbiAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMucHJlcGFyZUNyZWF0ZVNjZW5hcmlvTXV0YXRpb24ob3B0aW9ucyk7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBDcmVhdGVTY2VuYXJpb011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVNjZW5hcmlvKG9wdGlvbnM6IFVwZGF0ZVNjZW5hcmlvT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnVwZGF0ZVNjZW5hcmlvTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgLy8gVE9ETyBhdXRvIGFkZCB0aGUgbWlzc2luZyBleGlzdGluZyByZWNlaXZlcnMgYW5kIGRpcmVjdG9yaWVzXG4gIGFzeW5jIHVwZGF0ZVNjZW5hcmlvTXV0YXRpb24ob3B0aW9uczogVXBkYXRlU2NlbmFyaW9PcHRpb25zKSB7XG4gICAgY29uc3Qgc2NlbmFyaW8gPSAoYXdhaXQgdGhpcy5nZXRTY2VuYXJpbyhvcHRpb25zLnNjZW5hcmlvSWQpKS5zY2VuYXJpbztcbiAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZVNjZW5hcmlvKG9wdGlvbnMsIHNjZW5hcmlvKTtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFVwZGF0ZVNjZW5hcmlvTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVzZXRTY2VuYXJpbyhvcHRpb25zOiBSZXNldFNjZW5hcmlvT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnJlc2V0U2NlbmFyaW9NdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyByZXNldFNjZW5hcmlvTXV0YXRpb24ob3B0aW9uczogUmVzZXRTY2VuYXJpb09wdGlvbnMpIHtcbiAgICBjb25zdCBzY2VuYXJpbyA9IChhd2FpdCB0aGlzLmdldFNjZW5hcmlvKG9wdGlvbnMuc2NlbmFyaW9JZCkpLnNjZW5hcmlvO1xuXG4gICAgY29uc3QgeyBhc3NlbWJseSB9ID0gc2NlbmFyaW87XG5cbiAgICAvLyBKdXN0IG5lZWQgdG8gZG8gYW4gdXBkYXRlIHdpdGhvdXQgY2hhbmdpbmcgYXBwcm92ZXJzLiBUaGlzIHdpbGwgcmVjcmVhdGVcbiAgICAvLyBhbGwgYXNzZW1ibHkga2V5cy5cbiAgICBjb25zdCB1cGRhdGVTdWJBc3NlbWJsaWVzID0gbWFwRWRnZXMoYXNzZW1ibHkuc3ViQXNzZW1ibGllcykubWFwKChzYSkgPT4ge1xuICAgICAgY29uc3QgYXBwcm92ZXJUcHMgPSBtYXBFZGdlcyhzYS5hcHByb3ZlcnMpLm1hcCgoYXBwcm92ZXIpID0+ICh7XG4gICAgICAgIHRwSWQ6IGFwcHJvdmVyLnRwLmlkLFxuICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogc2EuaWQsXG4gICAgICAgIHF1b3J1bTogc2EucXVvcnVtLFxuICAgICAgICBzaW5nbGVSZWplY3Q6IHNhLnNpbmdsZVJlamVjdCxcbiAgICAgICAgc3ViamVjdENpcGhlckRhdGFDbGVhckpzb246IHNhLnN1YmplY3RDaXBoZXJEYXRhQ2xlYXJKc29uLFxuICAgICAgICBhcHByb3ZlclRwcyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZVNjZW5hcmlvKFxuICAgICAge1xuICAgICAgICBzY2VuYXJpb0lkOiBvcHRpb25zLnNjZW5hcmlvSWQsXG4gICAgICAgIGVuYWJsZWQ6IG9wdGlvbnMuZW5hYmxlZCxcbiAgICAgICAgdXBkYXRlQXNzZW1ibHk6IHtcbiAgICAgICAgICBxdW9ydW06IGFzc2VtYmx5LnF1b3J1bSxcbiAgICAgICAgICBzaW5nbGVSZWplY3Q6IGFzc2VtYmx5LnNpbmdsZVJlamVjdCxcbiAgICAgICAgICB1cGRhdGVTdWJBc3NlbWJsaWVzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjZW5hcmlvXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlU2NlbmFyaW9NdXRhdGlvbiwgLy8gdXBkYXRpbmcgc2NlbmFyaW8gcmVzZXRzIGl0XG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2NlbmFyaW8oc2NlbmFyaW9JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubHJHcmFwaFFMLmxyTXV0YXRlKHRoaXMuZGVsZXRlU2NlbmFyaW9NdXRhdGlvbihzY2VuYXJpb0lkKSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVTY2VuYXJpb011dGF0aW9uKHNjZW5hcmlvSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogRGVsZXRlU2NlbmFyaW9NdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczogeyBpbnB1dDogeyBzY2VuYXJpb0lkIH0gfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENsYWltc1xuICBhc3luYyBjcmVhdGVDbGFpbShzY2VuYXJpb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5jcmVhdGVDbGFpbU11dGF0aW9uKHNjZW5hcmlvSWQpKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNsYWltTXV0YXRpb24oc2NlbmFyaW9JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBDcmVhdGVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHsgaW5wdXQ6IHsgc2NlbmFyaW9JZCB9IH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjYW5jZWxDbGFpbShjbGFpbUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5jYW5jZWxDbGFpbU11dGF0aW9uKGNsYWltSWQpKTtcbiAgfVxuXG4gIGFzeW5jIGNhbmNlbENsYWltTXV0YXRpb24oY2xhaW1JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBDYW5jZWxTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHsgaW5wdXQ6IHsgY2xhaW1JZCB9IH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWplY3RDbGFpbShzaGFyZWRTY2VuYXJpb0lkOiBzdHJpbmcsIGNsYWltSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnJlamVjdENsYWltTXV0YXRpb24oc2hhcmVkU2NlbmFyaW9JZCwgY2xhaW1JZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVqZWN0Q2xhaW1NdXRhdGlvbihzaGFyZWRTY2VuYXJpb0lkOiBzdHJpbmcsIGNsYWltSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG11dGF0aW9ucyA9IGF3YWl0IHRoaXMucHJlcGFyZVJlamVjdENsYWltTXV0YXRpb25zKFxuICAgICAgc2hhcmVkU2NlbmFyaW9JZCxcbiAgICAgIGNsYWltSWRcbiAgICApO1xuICAgIHJldHVybiBMck1lcmdlZE11dGF0aW9uLmNyZWF0ZShhd2FpdCBQcm9taXNlLmFsbChtdXRhdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIGFwcHJvdmVDbGFpbShzaGFyZWRTY2VuYXJpb0lkOiBzdHJpbmcsIHNoYXJlZENsYWltSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZShcbiAgICAgIHRoaXMuYXBwcm92ZUNsYWltTXV0YXRpb24oc2hhcmVkU2NlbmFyaW9JZCwgc2hhcmVkQ2xhaW1JZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYXBwcm92ZUNsYWltTXV0YXRpb24oc2hhcmVkU2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtdXRhdGlvbnMgPSBhd2FpdCB0aGlzLnByZXBhcmVBcHByb3ZlQ2xhaW1NdXRhdGlvbnMoXG4gICAgICBzaGFyZWRTY2VuYXJpb0lkLFxuICAgICAgc2hhcmVkQ2xhaW1JZFxuICAgICk7XG4gICAgcmV0dXJuIExyTWVyZ2VkTXV0YXRpb24uY3JlYXRlKGF3YWl0IFByb21pc2UuYWxsKG11dGF0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgcmVjZWl2ZUNsYWltKHNjZW5hcmlvSWQ6IHN0cmluZywgc2hhcmVkQ2xhaW1JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMucmVjZWl2ZUNsYWltTXV0YXRpb24oc2NlbmFyaW9JZCwgc2hhcmVkQ2xhaW1JZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVjZWl2ZUNsYWltTXV0YXRpb24oc2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFJlY2VpdmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IGF3YWl0IHRoaXMucHJlcGFyZUNsYWltKHNjZW5hcmlvSWQsIHNoYXJlZENsYWltSWQpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEhlbHBlcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBhc3luYyBnZXRTY2VuYXJpbyhzY2VuYXJpb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSh7XG4gICAgICBxdWVyeTogU2NlbmFyaW9RdWVyeSxcbiAgICAgIHZhcmlhYmxlczogeyBzY2VuYXJpb0lkIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFNoYXJlZFNjZW5hcmlvKHNjZW5hcmlvSWQ6IHN0cmluZywgY2xhaW1JZD86IHN0cmluZykge1xuICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMucXVlcnkoe1xuICAgICAgcXVlcnk6IFNoYXJlZFNjZW5hcmlvUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgc2NlbmFyaW9JZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoY2xhaW1JZCAmJiByZXQuc2hhcmVkU2NlbmFyaW8uc2hhcmVkQ2xhaW0uaWQgIT09IGNsYWltSWQpIHtcbiAgICAgIHRocm93Q2xhaW1JZE1pc21hdGNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UGFydGljaXBhbnRUcHNLZXlzKG9wdGlvbnM6IENyZWF0ZVBhcnRpY2lwYW50T3B0aW9uc1tdKSB7XG4gICAgY29uc3QgdHBJZHMgPSBvcHRpb25zLm1hcCgoeCkgPT4geC50cElkKTtcblxuICAgIC8vIFRoaXMgc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSBUUHMgdGhhdCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYXNzZW1ibHkuXG4gICAgY29uc3QgdHBzID0gbWFwRWRnZXMoXG4gICAgICAoXG4gICAgICAgIGF3YWl0IHRoaXMubHJHcmFwaFFMLnF1ZXJ5KHtcbiAgICAgICAgICBxdWVyeTogVHBzS2V5c1F1ZXJ5LFxuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgaWRzOiB0cElkcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKS50cHNcbiAgICApO1xuXG4gICAgcmV0dXJuIHRwcztcbiAgfVxuXG4gIHByaXZhdGUgZmlsbFRwU2hhcmVkS2V5SWQoXG4gICAgb3B0aW9uczogQ3JlYXRlUGFydGljaXBhbnRPcHRpb25zW10sXG4gICAgdHBzOiBUcE5vZGVbXVxuICApIHtcbiAgICBvcHRpb25zLmZvckVhY2goKHBhcnRpY2lwYW50KSA9PiB7XG4gICAgICBpZiAoIXBhcnRpY2lwYW50LnRwU2hhcmVkS2V5SWQpIHtcbiAgICAgICAgY29uc3QgdHAgPSB0cHMuZmluZCgoeCkgPT4geC5pZCA9PT0gcGFydGljaXBhbnQudHBJZCk7XG4gICAgICAgIHBhcnRpY2lwYW50LnRwU2hhcmVkS2V5SWQgPVxuICAgICAgICAgIHRwLmN1cnJlbnRVc2VyU2hhcmVkS2V5LnVzZXJTaGFyZWRLZXkuc2hhcmVkS2V5LmlkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zOiBDcmVhdGVTY2VuYXJpb09wdGlvbnMpIHtcbiAgICBjb25zdCB7IGFzc2VtYmx5S2V5LCBtdXRhdGlvbklucHV0OiBjcmVhdGVBc3NlbWJseSB9ID1cbiAgICAgIGF3YWl0IHRoaXMuYXNzZW1ibHlDb250cm9sbGVyLnByZXBhcmVDcmVhdGUob3B0aW9ucy5jcmVhdGVBc3NlbWJseSk7XG5cbiAgICBjb25zdCBjcmVhdGVSZWNlaXZlcnNPcHRpb25zID0gb3B0aW9ucy5jcmVhdGVSZWNlaXZlcnMgfHwgW107XG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzT3B0aW9ucyA9IG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzIHx8IFtdO1xuXG4gICAgLy8gRmV0Y2ggYWxsIHRoZSBUUHMgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXNzIGluIHRwU2hhcmVkS2V5SWRcbiAgICBjb25zdCBjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMgPSBjcmVhdGVSZWNlaXZlcnNPcHRpb25zLmNvbmNhdChcbiAgICAgIGNyZWF0ZUNsYWltYW50c09wdGlvbnNcbiAgICApO1xuXG4gICAgY29uc3QgdHBzID0gYXdhaXQgdGhpcy5nZXRQYXJ0aWNpcGFudFRwc0tleXMoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zKTtcblxuICAgIHRoaXMuZmlsbFRwU2hhcmVkS2V5SWQoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zLCB0cHMpO1xuXG4gICAgY29uc3QgY3JlYXRlUmVjZWl2ZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjcmVhdGVSZWNlaXZlcnNPcHRpb25zLm1hcCgocmVjZWl2ZXIpID0+XG4gICAgICAgIHRoaXMucHJlcGFyZUNyZWF0ZVJlY2VpdmVyKHJlY2VpdmVyLCBhc3NlbWJseUtleSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjcmVhdGVDbGFpbWFudHNPcHRpb25zLm1hcCgoeCkgPT4gdGhpcy5wcmVwYXJlQ3JlYXRlQ2xhaW1hbnQoeCkpXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQsXG4gICAgICBjcmVhdGVBc3NlbWJseSxcbiAgICAgIGNyZWF0ZVJlY2VpdmVycyxcbiAgICAgIGNyZWF0ZUNsYWltYW50cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlVXBkYXRlU2NlbmFyaW8oXG4gICAgb3B0aW9uczogVXBkYXRlU2NlbmFyaW9PcHRpb25zLFxuICAgIHNjZW5hcmlvOiBTY2VuYXJpb05vZGVcbiAgKSB7XG4gICAgbGV0IGFzc2VtYmx5S2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRKd2tLZXkoXG4gICAgICBzY2VuYXJpby5hc3NlbWJseS5hc3NlbWJseUtleS5pZFxuICAgICk7XG4gICAgbGV0IHVwZGF0ZUFzc2VtYmx5OiBhbnk7XG5cbiAgICBpZiAob3B0aW9ucy51cGRhdGVBc3NlbWJseSkge1xuICAgICAgLy8gQXNzZW1ibHkga2V5IGlzIGFsd2F5cyByb3RhdGVkIHdoZW4gdXBkYXRpbmcgYXNzZW1ibHkuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzc2VtYmx5Q29udHJvbGxlci5wcmVwYXJlVXBkYXRlKFxuICAgICAgICBvcHRpb25zLnVwZGF0ZUFzc2VtYmx5LFxuICAgICAgICBzY2VuYXJpby5hc3NlbWJseVxuICAgICAgKTtcbiAgICAgIHVwZGF0ZUFzc2VtYmx5ID0gcmVzdWx0Lm11dGF0aW9uSW5wdXQ7XG4gICAgICBhc3NlbWJseUtleSA9IHJlc3VsdC5hc3NlbWJseUtleTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVSZWNlaXZlcnNPcHRpb25zID0gb3B0aW9ucy5jcmVhdGVSZWNlaXZlcnMgfHwgW107XG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzT3B0aW9ucyA9IG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzIHx8IFtdO1xuXG4gICAgLy8gRmV0Y2ggYWxsIHRoZSBUUHMgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXNzIGluIHRwU2hhcmVkS2V5SWRcbiAgICBjb25zdCBjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMgPSBjcmVhdGVSZWNlaXZlcnNPcHRpb25zLmNvbmNhdChcbiAgICAgIGNyZWF0ZUNsYWltYW50c09wdGlvbnNcbiAgICApO1xuXG4gICAgY29uc3QgdHBzID0gYXdhaXQgdGhpcy5nZXRQYXJ0aWNpcGFudFRwc0tleXMoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zKTtcblxuICAgIHRoaXMuZmlsbFRwU2hhcmVkS2V5SWQoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zLCB0cHMpO1xuXG4gICAgY29uc3QgY3JlYXRlUmVjZWl2ZXJzID1cbiAgICAgIG9wdGlvbnMuY3JlYXRlUmVjZWl2ZXJzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMuY3JlYXRlUmVjZWl2ZXJzLm1hcCgoeCkgPT5cbiAgICAgICAgICB0aGlzLnByZXBhcmVDcmVhdGVSZWNlaXZlcih4LCBhc3NlbWJseUtleSlcbiAgICAgICAgKVxuICAgICAgKSk7XG5cbiAgICBjb25zdCBleGlzdGluZ1JlY2VpdmVycyA9IG1hcEVkZ2VzKHNjZW5hcmlvLnJlY2VpdmVycyk7XG4gICAgbGV0IHVwZGF0ZVJlY2VpdmVycyA9IG9wdGlvbnMudXBkYXRlUmVjZWl2ZXJzXG4gICAgICA/IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIG9wdGlvbnMudXBkYXRlUmVjZWl2ZXJzLm1hcCgodXBkYXRlUmVjZWl2ZXIpID0+IHtcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHJlY2VpdmVyIHdlIGFyZSB1cGRhdGluZ1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdSZWNlaXZlciA9IGV4aXN0aW5nUmVjZWl2ZXJzLmZpbmQoXG4gICAgICAgICAgICAgICh4KSA9PiB4LnRwLmlkID09PSB1cGRhdGVSZWNlaXZlci50cElkXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlVXBkYXRlUmVjZWl2ZXIoXG4gICAgICAgICAgICAgIHVwZGF0ZVJlY2VpdmVyLFxuICAgICAgICAgICAgICBhc3NlbWJseUtleSxcbiAgICAgICAgICAgICAgZXhpc3RpbmdSZWNlaXZlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICA6IFtdO1xuXG4gICAgLy8gRmlsbCBpbiBhbnkgbWlzc2luZyByZWNlaXZlcnMgd2hlbiB1cGRhdGluZyBhc3NlbWJseS5cbiAgICBpZiAob3B0aW9ucy51cGRhdGVBc3NlbWJseSkge1xuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgcmVjZWl2ZXJzIHRoYXQgd2lsbCBiZSBkZWxldGVkIG9yIGFscmVhZHkgdXBkYXRlZC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gZXhpc3RpbmdSZWNlaXZlcnMuZmlsdGVyKFxuICAgICAgICAoZXhpc3RpbmdSZWNlaXZlcikgPT5cbiAgICAgICAgICAhKG9wdGlvbnMuZGVsZXRlUmVjZWl2ZXJzIHx8IFtdKS5pbmNsdWRlcyhleGlzdGluZ1JlY2VpdmVyLnRwLmlkKSAmJlxuICAgICAgICAgICF1cGRhdGVSZWNlaXZlcnMuc29tZShcbiAgICAgICAgICAgICh1cGRhdGVSZWNlaXZlcikgPT4gdXBkYXRlUmVjZWl2ZXIudHBJZCA9PT0gZXhpc3RpbmdSZWNlaXZlci50cC5pZFxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgICB1cGRhdGVSZWNlaXZlcnMgPSB1cGRhdGVSZWNlaXZlcnMuY29uY2F0KFxuICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVFeGlzdGluZ1JlY2VpdmVycyhleGlzdGluZywgYXNzZW1ibHlLZXkpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZUNsYWltYW50cyA9XG4gICAgICBvcHRpb25zLmNyZWF0ZUNsYWltYW50cyAmJlxuICAgICAgKGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBvcHRpb25zLmNyZWF0ZUNsYWltYW50cy5tYXAoKHgpID0+IHRoaXMucHJlcGFyZUNyZWF0ZUNsYWltYW50KHgpKVxuICAgICAgKSk7XG5cbiAgICBjb25zdCBleGlzdGluZ0NsYWltYW50cyA9IG1hcEVkZ2VzKHNjZW5hcmlvLmNsYWltYW50cyk7XG4gICAgY29uc3QgdXBkYXRlQ2xhaW1hbnRzID1cbiAgICAgIG9wdGlvbnMudXBkYXRlQ2xhaW1hbnRzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMudXBkYXRlQ2xhaW1hbnRzLm1hcCgoeCkgPT4ge1xuICAgICAgICAgIC8vIEZpbmQgdGhlIGNsYWltYW50IHdlIGFyZSB1cGRhdGluZ1xuICAgICAgICAgIGNvbnN0IGNsYWltYW50ID0gZXhpc3RpbmdDbGFpbWFudHMuZmluZChcbiAgICAgICAgICAgIChleGlzdGluZ0NsYWltYW50KSA9PiBleGlzdGluZ0NsYWltYW50LnRwLmlkID09PSB4LnRwSWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVVcGRhdGVDbGFpbWFudCh4LCBjbGFpbWFudC5zaGFyZWRLZXkuaWQpO1xuICAgICAgICB9KVxuICAgICAgKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2NlbmFyaW9JZDogb3B0aW9ucy5zY2VuYXJpb0lkLFxuICAgICAgZW5hYmxlZDogb3B0aW9ucy5lbmFibGVkLFxuICAgICAgdXBkYXRlQXNzZW1ibHksXG4gICAgICBjcmVhdGVSZWNlaXZlcnMsXG4gICAgICB1cGRhdGVSZWNlaXZlcnMsXG4gICAgICBkZWxldGVSZWNlaXZlcnM6IG9wdGlvbnMuZGVsZXRlUmVjZWl2ZXJzLFxuICAgICAgY3JlYXRlQ2xhaW1hbnRzLFxuICAgICAgdXBkYXRlQ2xhaW1hbnRzLFxuICAgICAgZGVsZXRlQ2xhaW1hbnRzOiBvcHRpb25zLmRlbGV0ZUNsYWltYW50cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlUmVjZWl2ZXJEaXJlY3RvcnkoXG4gICAgb3B0aW9uczogUmVjZWl2ZXJEaXJlY3RvcnlPcHRpb25zLFxuICAgIHJlY2VpdmVyU2hhcmVkS2V5OiBKV0suS2V5LFxuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5XG4gICkge1xuICAgIC8vIFRPRE8gdGhpcyBzaG91bGQgYmUgYmF0Y2hlZFxuICAgIGNvbnN0IGRpcmVjdG9yeUtleSA9IGF3YWl0IHRoaXMuaXRlbTJTZXJ2aWNlLmdldERpcmVjdG9yeUtleShcbiAgICAgIG9wdGlvbnMuZGlyZWN0b3J5SWQsXG4gICAgICBvcHRpb25zLmRpcmVjdG9yeUtleUlkXG4gICAgKTtcblxuICAgIGNvbnN0IHNoYXJlZENpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgIHJlY2VpdmVyU2hhcmVkS2V5LFxuICAgICAgb3B0aW9ucy5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uXG4gICAgKTtcblxuICAgIGxldCB3cmFwcGVkSXRlbUtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgcmVjZWl2ZXJTaGFyZWRLZXksXG4gICAgICBkaXJlY3RvcnlLZXkuandrLnRvSlNPTih0cnVlKVxuICAgICk7XG5cbiAgICAvLyBUT0RPIGZldGNoIGFzc2VtYmx5S2V5SWQuIFdlIGFyZSBjaGFuZ2luZyBpdCBzdWNoIHRoYXQgdGhlcmUgaXMgYWx3YXlzIGFuIGFzc2VtYmx5XG4gICAgLy8gYmVmb3JlIHJlY2VpdmVycyBjYW4gYmUgYWRkZWQuXG4gICAgd3JhcHBlZEl0ZW1LZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgd3JhcHBlZEl0ZW1LZXlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpcmVjdG9yeUlkOiBvcHRpb25zLmRpcmVjdG9yeUlkLFxuICAgICAgd3JhcHBlZEl0ZW1LZXksXG4gICAgICBhY2Nlc3NSb2xlOiBvcHRpb25zLmFjY2Vzc1JvbGUsXG4gICAgICBzaGFyZWRDaXBoZXJEYXRhLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVDcmVhdGVSZWNlaXZlcihcbiAgICBvcHRpb25zOiBDcmVhdGVSZWNlaXZlck9wdGlvbnMsXG4gICAgYXNzZW1ibHlLZXk6IEpXSy5LZXlcbiAgKSB7XG4gICAgY29uc3QgeyBzaGFyZWRLZXksIG11dGF0aW9uSW5wdXQgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUNyZWF0ZVBhcnRpY2lwYW50KFxuICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBhZGREaXJlY3RvcmllcyA9XG4gICAgICBvcHRpb25zLmFkZERpcmVjdG9yaWVzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMuYWRkRGlyZWN0b3JpZXMubWFwKCh4KSA9PlxuICAgICAgICAgIHRoaXMucHJlcGFyZUFkZFJlY2VpdmVyRGlyZWN0b3J5KHgsIHNoYXJlZEtleS5rZXksIGFzc2VtYmx5S2V5KVxuICAgICAgICApXG4gICAgICApKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5tdXRhdGlvbklucHV0LFxuICAgICAgYWRkRGlyZWN0b3JpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVVwZGF0ZVJlY2VpdmVyKFxuICAgIG9wdGlvbnM6IFVwZGF0ZVJlY2VpdmVyT3B0aW9ucyxcbiAgICBhc3NlbWJseUtleTogSldLLktleSxcbiAgICBleGlzdGluZ1JlY2VpdmVyOiBTY2VuYXJpb1JlY2VpdmVyTm9kZVxuICApIHtcbiAgICBjb25zdCBzaGFyZWRLZXlJZCA9IGV4aXN0aW5nUmVjZWl2ZXIuc2hhcmVkS2V5LmlkO1xuXG4gICAgY29uc3QgZGVsZXRlRGlyZWN0b3JpZXNPcHRpb25zID0gb3B0aW9ucy5kZWxldGVEaXJlY3RvcmllcyB8fCBbXTtcbiAgICBjb25zdCB1cGRhdGVEaXJlY3Rvcmllc09wdGlvbnMgPSBvcHRpb25zLnVwZGF0ZURpcmVjdG9yaWVzIHx8IFtdO1xuXG4gICAgLy8gRmlsbCBpbiBhbnkgbWlzc2luZyB1cGRhdGUgZGlyZWN0b3JpZXNcbiAgICBtYXBFZGdlcyhleGlzdGluZ1JlY2VpdmVyLnJlY2VpdmVyRGlyZWN0b3JpZXMpLmZvckVhY2goXG4gICAgICAoZXhpc3RpbmdEaXJlY3RvcnkpID0+IHtcbiAgICAgICAgaWYgKGRlbGV0ZURpcmVjdG9yaWVzT3B0aW9ucy5pbmNsdWRlcyhleGlzdGluZ0RpcmVjdG9yeS5kaXJlY3RvcnkuaWQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVwZGF0ZURpcmVjdG9yaWVzT3B0aW9ucy5maW5kKFxuICAgICAgICAgICAgKHgpID0+IHguZGlyZWN0b3J5SWQgPT09IGV4aXN0aW5nRGlyZWN0b3J5LmRpcmVjdG9yeS5pZFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlRGlyZWN0b3JpZXNPcHRpb25zLnB1c2goe1xuICAgICAgICAgIGFjY2Vzc1JvbGU6IGV4aXN0aW5nRGlyZWN0b3J5LmFjY2Vzc1JvbGUsXG4gICAgICAgICAgZGlyZWN0b3J5SWQ6IGV4aXN0aW5nRGlyZWN0b3J5LmRpcmVjdG9yeS5pZCxcbiAgICAgICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uOlxuICAgICAgICAgICAgZXhpc3RpbmdEaXJlY3Rvcnkuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2hhcmVkS2V5LCBtdXRhdGlvbklucHV0IH0gPSBhd2FpdCB0aGlzLnByZXBhcmVVcGRhdGVQYXJ0aWNpcGFudChcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzaGFyZWRLZXlJZFxuICAgICk7XG5cbiAgICBjb25zdCBhZGREaXJlY3RvcmllcyA9XG4gICAgICBvcHRpb25zLmFkZERpcmVjdG9yaWVzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMuYWRkRGlyZWN0b3JpZXMubWFwKCh4KSA9PlxuICAgICAgICAgIHRoaXMucHJlcGFyZUFkZFJlY2VpdmVyRGlyZWN0b3J5KHgsIHNoYXJlZEtleSwgYXNzZW1ibHlLZXkpXG4gICAgICAgIClcbiAgICAgICkpO1xuXG4gICAgY29uc3QgdXBkYXRlRGlyZWN0b3JpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHVwZGF0ZURpcmVjdG9yaWVzT3B0aW9ucy5tYXAoKHgpID0+XG4gICAgICAgIHRoaXMucHJlcGFyZVVwZGF0ZVJlY2VpdmVyRGlyZWN0b3J5KHgsIHNoYXJlZEtleSwgYXNzZW1ibHlLZXkpXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5tdXRhdGlvbklucHV0LFxuICAgICAgYWRkRGlyZWN0b3JpZXMsXG4gICAgICB1cGRhdGVEaXJlY3RvcmllcyxcbiAgICAgIGRlbGV0ZURpcmVjdG9yaWVzOiBvcHRpb25zLmRlbGV0ZURpcmVjdG9yaWVzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVFeGlzdGluZ1JlY2VpdmVyKFxuICAgIGV4aXN0aW5nUmVjZWl2ZXI6IFNjZW5hcmlvUmVjZWl2ZXJOb2RlLFxuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5XG4gICkge1xuICAgIGNvbnN0IHVwZGF0ZURpcmVjdG9yaWVzID0gbWFwRWRnZXMoXG4gICAgICBleGlzdGluZ1JlY2VpdmVyLnJlY2VpdmVyRGlyZWN0b3JpZXNcbiAgICApLm1hcCgocmVjZWl2ZXJEaXJlY3RvcnkpID0+ICh7XG4gICAgICBkaXJlY3RvcnlJZDogcmVjZWl2ZXJEaXJlY3RvcnkuZGlyZWN0b3J5LmlkLFxuICAgICAgZGlyZWN0b3J5S2V5SWQ6IHJlY2VpdmVyRGlyZWN0b3J5LmRpcmVjdG9yeS5rZXlJZCxcbiAgICAgIGFjY2Vzc1JvbGU6IHJlY2VpdmVyRGlyZWN0b3J5LmFjY2Vzc1JvbGUsXG4gICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uOiByZWNlaXZlckRpcmVjdG9yeS5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uLFxuICAgIH0pKTtcblxuICAgIC8vIEZpbGwgaXQgaW4gd2l0aCBleGlzdGluZyByZWNlaXZlci5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlVXBkYXRlUmVjZWl2ZXIoXG4gICAgICB7XG4gICAgICAgIHRwSWQ6IGV4aXN0aW5nUmVjZWl2ZXIudHAuaWQsXG4gICAgICAgIHNoYXJlZENpcGhlckRhdGFDbGVhckpzb246IGV4aXN0aW5nUmVjZWl2ZXIuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbixcbiAgICAgICAgdXBkYXRlRGlyZWN0b3JpZXMsXG4gICAgICB9LFxuICAgICAgYXNzZW1ibHlLZXksXG4gICAgICBleGlzdGluZ1JlY2VpdmVyXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUV4aXN0aW5nUmVjZWl2ZXJzKFxuICAgIGV4aXN0aW5nUmVjZWl2ZXJzOiBTY2VuYXJpb1JlY2VpdmVyTm9kZVtdLFxuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5XG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGV4aXN0aW5nUmVjZWl2ZXJzLm1hcCgoZXhpc3RpbmdSZWNlaXZlcikgPT5cbiAgICAgICAgdGhpcy5wcmVwYXJlRXhpc3RpbmdSZWNlaXZlcihleGlzdGluZ1JlY2VpdmVyLCBhc3NlbWJseUtleSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ3JlYXRlUGFydGljaXBhbnQob3B0aW9uczogQ3JlYXRlUGFydGljaXBhbnRPcHRpb25zKSB7XG4gICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0V2l0aE5ld0tleShcbiAgICAgIG9wdGlvbnMudHBTaGFyZWRLZXlJZCxcbiAgICAgIG9wdGlvbnMuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvblxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZEtleSxcbiAgICAgIG11dGF0aW9uSW5wdXQ6IHtcbiAgICAgICAgdHBJZDogb3B0aW9ucy50cElkLFxuICAgICAgICB0cFNoYXJlZEtleUlkOiBvcHRpb25zLnRwU2hhcmVkS2V5SWQsXG4gICAgICAgIHRwU2hhcmVkS2V5V3JhcHBlZFNoYXJlZEtleTogc2hhcmVkS2V5LndyYXBwZWRLZXksXG4gICAgICAgIHNoYXJlZENpcGhlckRhdGE6IHNoYXJlZEtleS5jaXBoZXIsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVVcGRhdGVQYXJ0aWNpcGFudChcbiAgICBvcHRpb25zOiBQYXJ0aWNpcGFudE9wdGlvbnMsXG4gICAgc2hhcmVkS2V5SWQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShzaGFyZWRLZXlJZCk7XG5cbiAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBzaGFyZWRLZXksXG4gICAgICBvcHRpb25zLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb25cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZEtleSxcbiAgICAgIG11dGF0aW9uSW5wdXQ6IHtcbiAgICAgICAgdHBJZDogb3B0aW9ucy50cElkLFxuICAgICAgICBzaGFyZWRLZXlJZCxcbiAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUNyZWF0ZUNsYWltYW50KG9wdGlvbnM6IENyZWF0ZUNsYWltYW50T3B0aW9ucykge1xuICAgIGNvbnN0IHsgbXV0YXRpb25JbnB1dCB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlUGFydGljaXBhbnQob3B0aW9ucyk7XG4gICAgcmV0dXJuIG11dGF0aW9uSW5wdXQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVVcGRhdGVDbGFpbWFudChcbiAgICBvcHRpb25zOiBVcGRhdGVDbGFpbWFudE9wdGlvbnMsXG4gICAgc2hhcmVkS2V5SWQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCB7IG11dGF0aW9uSW5wdXQgfSA9IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZVBhcnRpY2lwYW50KFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHNoYXJlZEtleUlkXG4gICAgKTtcblxuICAgIHJldHVybiBtdXRhdGlvbklucHV0O1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZUNsYWltKHNjZW5hcmlvSWQ6IHN0cmluZywgc2hhcmVkQ2xhaW1JZDogc3RyaW5nKSB7XG4gICAgLy8gR2V0IGFsbCB0aGUgc2hhcmVkIGl0ZW1zXG4gICAgY29uc3Qgc2hhcmVkU2NlbmFyaW8gPSAoXG4gICAgICBhd2FpdCB0aGlzLmdldFNoYXJlZFNjZW5hcmlvKHNjZW5hcmlvSWQsIHNoYXJlZENsYWltSWQpXG4gICAgKS5zaGFyZWRTY2VuYXJpbztcblxuICAgIGlmIChzaGFyZWRTY2VuYXJpby5zdGF0ZSAhPT0gU2NlbmFyaW9TdGF0ZS5BUFBST1ZFRCkge1xuICAgICAgdGhyb3dDbGFpbU5vdEFwcHJvdmVkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwcm92YWxzID0gbWFwRWRnZXMoXG4gICAgICBzaGFyZWRTY2VuYXJpby5zaGFyZWRDbGFpbS5hc0NsYWltUmVjZWl2ZXIuYXBwcm92YWxzXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VtYmx5S2V5ID0gYXdhaXQgdGhpcy5yZWNvdmVyQXNzZW1ibHlLZXkoYXBwcm92YWxzKTtcbiAgICBjb25zb2xlLmxvZygncmVjZWl2ZUNsYWltTXV0YXRpb24gYXNzZW1ibHlLZXknLCBhc3NlbWJseUtleSk7XG5cbiAgICAvLyBEZWNyeXB0IGFsbCBpdGVtc1xuICAgIGNvbnN0IHJlY2VpdmVyRGlyZWN0b3JpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHNoYXJlZFNjZW5hcmlvLmFzUmVjZWl2ZXIucmVjZWl2ZXJEaXJlY3Rvcmllcy5lZGdlc1xuICAgICAgICAubWFwKChlZGdlKSA9PiBlZGdlLm5vZGUpXG4gICAgICAgIC5tYXAoYXN5bmMgKHJlY2VpdmVyRGlyZWN0b3J5KSA9PiB7XG4gICAgICAgICAgY29uc3Qgd3JhcHBlZEl0ZW1LZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICAgICAgICBhc3NlbWJseUtleSxcbiAgICAgICAgICAgIHJlY2VpdmVyRGlyZWN0b3J5LndyYXBwZWRJdGVtS2V5XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWNlaXZlckRpcmVjdG9yeUlkOiByZWNlaXZlckRpcmVjdG9yeS5pZCxcbiAgICAgICAgICAgIHJlY2VpdmVyU2hhcmVkS2V5V3JhcHBlZEl0ZW1LZXk6IHdyYXBwZWRJdGVtS2V5LCAvLyB0aGUgd3JhcHBlZEl0ZW1LZXkgaXMgYWxyZWFkeSB3cmFwcGVkIGJ5IHJlY2VpdmVyU2hhcmVkS2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjZW5hcmlvQ2xhaW1JZDogc2hhcmVkQ2xhaW1JZCxcbiAgICAgIHJlY2VpdmVyRGlyZWN0b3JpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlckFzc2VtYmx5S2V5KFxuICAgIGFwcHJvdmFsczogU2hhcmVkU2NlbmFyaW9DbGFpbVJlY2VpdmVkQXBwcm92YWxOb2RlW11cbiAgKSB7XG4gICAgY29uc3QgcGFydGlhbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFwcHJvdmFscy5tYXAoKGFwcHJvdmFsKSA9PlxuICAgICAgICB0aGlzLmtleUdyYXBoLmRlY3J5cHRGcm9tU3RyaW5nPFBhcnRpYWxBc3NlbWJseUtleT4oXG4gICAgICAgICAgYXBwcm92YWwucHhrLmlkLFxuICAgICAgICAgIGFwcHJvdmFsLnJlY2VpdmVyQ2lwaGVyUGFydGlhbEFzc2VtYmx5S2V5XG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuYXNzZW1ibHlDb250cm9sbGVyLnJlY292ZXJBc3NlbWJseUtleShwYXJ0aWFscyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFzQ2xhaW1BcHByb3ZlcnMoXG4gICAgc2hhcmVkU2NlbmFyaW9JZCxcbiAgICBjbGFpbUlkLFxuICAgIHN0YXRlOiBUcENsYWltQXBwcm92ZXJTdGF0ZVxuICApIHtcbiAgICBjb25zdCBzaGFyZWRTY2VuYXJpbyA9IChcbiAgICAgIGF3YWl0IHRoaXMuZ2V0U2hhcmVkU2NlbmFyaW8oc2hhcmVkU2NlbmFyaW9JZCwgY2xhaW1JZClcbiAgICApLnNoYXJlZFNjZW5hcmlvO1xuXG4gICAgcmV0dXJuIG1hcEVkZ2VzKHNoYXJlZFNjZW5hcmlvLnNoYXJlZENsYWltLmNsYWltLmFzQ2xhaW1BcHByb3ZlcnMpLmZpbHRlcihcbiAgICAgIChhc0NsYWltQXBwcm92ZXIpID0+IGFzQ2xhaW1BcHByb3Zlci5zdGF0ZSA9PT0gc3RhdGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQXBwcm92ZUNsYWltTXV0YXRpb25zKFxuICAgIHNoYXJlZFNjZW5hcmlvSWQ6IHN0cmluZyxcbiAgICBjbGFpbUlkOiBzdHJpbmdcbiAgKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgdXNlciBtYXkgYmUgYWN0aW5nIGFzIGFwcHJvdmVycyBpbiBtdWx0aXBsZSBzdWItYXNzZW1ibGllcyBzb1xuICAgIC8vIHdlIGFwcHJvdmUgdGhlbSBhbGwuXG4gICAgY29uc3QgYXNDbGFpbUFwcHJvdmVycyA9IGF3YWl0IHRoaXMuYXNDbGFpbUFwcHJvdmVycyhcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXG4gICAgICBjbGFpbUlkLFxuICAgICAgVHBDbGFpbUFwcHJvdmVyU3RhdGUuQ0xBSU1FRFxuICAgICk7XG5cbiAgICByZXR1cm4gYXNDbGFpbUFwcHJvdmVycy5tYXAoXG4gICAgICBhc3luYyAoYXNDbGFpbUFwcHJvdmVyKSA9PlxuICAgICAgICBuZXcgTHJNdXRhdGlvbih7XG4gICAgICAgICAgbXV0YXRpb246IEFwcHJvdmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBpbnB1dDogYXdhaXQgdGhpcy5wcmVwYXJlQXBwcm92ZUNsYWltKGFzQ2xhaW1BcHByb3ZlciksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQXBwcm92ZUNsYWltKFxuICAgIGFzQ2xhaW1BcHByb3ZlcjogU2hhcmVkVHBDbGFpbUFwcHJvdmVyTm9kZVxuICApIHtcbiAgICBjb25zdCByZWNlaXZlckFwcHJvdmFscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFwRWRnZXMoYXNDbGFpbUFwcHJvdmVyLnJlY2VpdmVyQXBwcm92YWxzKS5tYXAoKHJlY2VpdmVyQXBwcm92YWwpID0+XG4gICAgICAgIHRoaXMucHJlcGFyZVJlY2VpdmVyQXBwcm92YWwoe1xuICAgICAgICAgIHJlY2VpdmVyQXBwcm92YWxJZDogcmVjZWl2ZXJBcHByb3ZhbC5pZCxcbiAgICAgICAgICByZWNlaXZlckFwcHJvdmFsUHhrSWQ6IHJlY2VpdmVyQXBwcm92YWwucHhrLmlkLFxuICAgICAgICAgIHNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleUNsZWFySnNvbjpcbiAgICAgICAgICAgIGFzQ2xhaW1BcHByb3Zlci5zaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXlDbGVhckpzb24sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjbGFpbUFwcHJvdmVySWQ6IGFzQ2xhaW1BcHByb3Zlci5pZCxcbiAgICAgIHJlY2VpdmVyQXBwcm92YWxzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWNlaXZlckFwcHJvdmFsKG9wdGlvbnM6IHtcbiAgICByZWNlaXZlckFwcHJvdmFsSWQ6IHN0cmluZztcbiAgICByZWNlaXZlckFwcHJvdmFsUHhrSWQ6IHN0cmluZztcbiAgICBzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXlDbGVhckpzb246IGFueTtcbiAgfSkge1xuICAgIHJldHVybiB7XG4gICAgICByZWNlaXZlckFwcHJvdmFsSWQ6IG9wdGlvbnMucmVjZWl2ZXJBcHByb3ZhbElkLFxuICAgICAgLy8gVE9ETyBhbGxvdyBzZW5kaW5nIG9mIG1lc3NhZ2VzIHRvIHJlY2VpdmVyLlxuICAgICAgcmVjZWl2ZXJDaXBoZXI6ICcnLFxuICAgICAgcmVjZWl2ZXJDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXk6IGF3YWl0IHRoaXMua2V5R3JhcGguZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICBvcHRpb25zLnJlY2VpdmVyQXBwcm92YWxQeGtJZCxcbiAgICAgICAgb3B0aW9ucy5zaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXlDbGVhckpzb25cbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVJlamVjdENsYWltTXV0YXRpb25zKFxuICAgIHNoYXJlZFNjZW5hcmlvSWQ6IHN0cmluZyxcbiAgICBjbGFpbUlkOiBzdHJpbmdcbiAgKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgdXNlciBtYXkgYmUgYWN0aW5nIGFzIGFwcHJvdmVycyBpbiBtdWx0aXBsZSBzdWItYXNzZW1ibGllcyBzb1xuICAgIC8vIHdlIHJlamVjdCB0aGVtIGFsbC5cbiAgICBjb25zdCBhc0NsYWltQXBwcm92ZXJzID0gYXdhaXQgdGhpcy5hc0NsYWltQXBwcm92ZXJzKFxuICAgICAgc2hhcmVkU2NlbmFyaW9JZCxcbiAgICAgIGNsYWltSWQsXG4gICAgICBUcENsYWltQXBwcm92ZXJTdGF0ZS5DTEFJTUVEXG4gICAgKTtcblxuICAgIHJldHVybiBhc0NsYWltQXBwcm92ZXJzLm1hcChcbiAgICAgIGFzeW5jIChhc0NsYWltQXBwcm92ZXIpID0+XG4gICAgICAgIG5ldyBMck11dGF0aW9uKHtcbiAgICAgICAgICBtdXRhdGlvbjogUmVqZWN0U2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgaW5wdXQ6IHsgY2xhaW1BcHByb3ZlcklkOiBhc0NsYWltQXBwcm92ZXIuaWQgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
1
+ import { __awaiter, __decorate } from "tslib";
2
+ import { Injectable, Injector, NgZone } from '@angular/core';
3
+ import { LrMergedMutation, LrMutation, LrService } from '../api/lr-graphql';
4
+ import { mapEdges, ScenarioState, TpClaimApproverState, } from '../api/types';
5
+ import { KeyGraphService } from '../cryptography/key-graph.service';
6
+ import { LrBadArgumentException, LrBadStateException, } from '../_common/exceptions';
7
+ import { RunOutsideAngular } from '../_common/run-outside-angular';
8
+ import { DeleteScenarioMutation, CreateScenarioClaimMutation, UpdateScenarioMutation, CreateScenarioMutation, ReceiveScenarioClaimMutation, ApproveScenarioClaimMutation, CancelScenarioClaimMutation, RejectScenarioClaimMutation, } from './scenario.gql';
9
+ import { Item2Service } from '../items2/item2.service';
10
+ import { ScenarioAssemblyController } from './scenario.controller';
11
+ import { EncryptionService } from '../cryptography/encryption.service';
12
+ import { ScenarioQuery, SharedScenarioQuery } from './scenario.gql.private';
13
+ import { TpsKeysQuery } from '../trusted-parties/tp-assembly.gql.private';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "../cryptography/key-graph.service";
16
+ import * as i2 from "../items2/item2.service";
17
+ import * as i3 from "./scenario.controller";
18
+ import * as i4 from "../cryptography/encryption.service";
19
+ export function throwClaimIdMismatch() {
20
+ throw new LrBadArgumentException('claimId does not match with the current claimId of the scenario');
21
+ }
22
+ export function throwClaimNotApproved() {
23
+ throw new LrBadStateException('Scenario claim has not been approved');
24
+ }
25
+ let ScenarioService = class ScenarioService extends LrService {
26
+ constructor(ngZone, injector, keyGraph, item2Service, assemblyController, encryptionService) {
27
+ super(injector);
28
+ this.ngZone = ngZone;
29
+ this.injector = injector;
30
+ this.keyGraph = keyGraph;
31
+ this.item2Service = item2Service;
32
+ this.assemblyController = assemblyController;
33
+ this.encryptionService = encryptionService;
34
+ this.prepareAddReceiverDirectory = this.prepareReceiverDirectory;
35
+ this.prepareUpdateReceiverDirectory = this.prepareReceiverDirectory;
36
+ }
37
+ // Scenarios
38
+ createScenario(options) {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ return this.mutate(this.createScenarioMutation(options));
41
+ });
42
+ }
43
+ createScenarioMutation(options) {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ const input = yield this.prepareCreateScenarioMutation(options);
46
+ return new LrMutation({
47
+ mutation: CreateScenarioMutation,
48
+ variables: {
49
+ input,
50
+ },
51
+ });
52
+ });
53
+ }
54
+ updateScenario(options) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ return this.mutate(this.updateScenarioMutation(options));
57
+ });
58
+ }
59
+ // TODO auto add the missing existing receivers and directories
60
+ updateScenarioMutation(options) {
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ const scenario = (yield this.getScenario(options.scenarioId)).scenario;
63
+ const input = yield this.prepareUpdateScenario(options, scenario);
64
+ return new LrMutation({
65
+ mutation: UpdateScenarioMutation,
66
+ variables: {
67
+ input,
68
+ },
69
+ });
70
+ });
71
+ }
72
+ resetScenario(options) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ return this.mutate(this.resetScenarioMutation(options));
75
+ });
76
+ }
77
+ resetScenarioMutation(options) {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ const scenario = (yield this.getScenario(options.scenarioId)).scenario;
80
+ const { assembly } = scenario;
81
+ // Just need to do an update without changing approvers. This will recreate
82
+ // all assembly keys.
83
+ const updateSubAssemblies = mapEdges(assembly.subAssemblies).map((sa) => {
84
+ const approverTps = mapEdges(sa.approvers).map((approver) => ({
85
+ tpId: approver.tp.id,
86
+ }));
87
+ return {
88
+ id: sa.id,
89
+ quorum: sa.quorum,
90
+ singleReject: sa.singleReject,
91
+ subjectCipherDataClearJson: sa.subjectCipherDataClearJson,
92
+ approverTps,
93
+ };
94
+ });
95
+ const input = yield this.prepareUpdateScenario({
96
+ scenarioId: options.scenarioId,
97
+ enabled: options.enabled,
98
+ updateAssembly: {
99
+ quorum: assembly.quorum,
100
+ singleReject: assembly.singleReject,
101
+ updateSubAssemblies,
102
+ },
103
+ }, scenario);
104
+ return new LrMutation({
105
+ mutation: UpdateScenarioMutation,
106
+ variables: {
107
+ input,
108
+ },
109
+ });
110
+ });
111
+ }
112
+ deleteScenario(scenarioId) {
113
+ return __awaiter(this, void 0, void 0, function* () {
114
+ return this.lrGraphQL.lrMutate(this.deleteScenarioMutation(scenarioId));
115
+ });
116
+ }
117
+ deleteScenarioMutation(scenarioId) {
118
+ return __awaiter(this, void 0, void 0, function* () {
119
+ return new LrMutation({
120
+ mutation: DeleteScenarioMutation,
121
+ variables: { input: { scenarioId } },
122
+ });
123
+ });
124
+ }
125
+ // Claims
126
+ createClaim(scenarioId) {
127
+ return __awaiter(this, void 0, void 0, function* () {
128
+ return this.mutate(this.createClaimMutation(scenarioId));
129
+ });
130
+ }
131
+ createClaimMutation(scenarioId) {
132
+ return __awaiter(this, void 0, void 0, function* () {
133
+ return new LrMutation({
134
+ mutation: CreateScenarioClaimMutation,
135
+ variables: { input: { scenarioId } },
136
+ });
137
+ });
138
+ }
139
+ cancelClaim(claimId) {
140
+ return __awaiter(this, void 0, void 0, function* () {
141
+ return this.mutate(this.cancelClaimMutation(claimId));
142
+ });
143
+ }
144
+ cancelClaimMutation(claimId) {
145
+ return __awaiter(this, void 0, void 0, function* () {
146
+ return new LrMutation({
147
+ mutation: CancelScenarioClaimMutation,
148
+ variables: { input: { claimId } },
149
+ });
150
+ });
151
+ }
152
+ rejectClaim(sharedScenarioId, claimId) {
153
+ return __awaiter(this, void 0, void 0, function* () {
154
+ return this.mutate(this.rejectClaimMutation(sharedScenarioId, claimId));
155
+ });
156
+ }
157
+ rejectClaimMutation(sharedScenarioId, claimId) {
158
+ return __awaiter(this, void 0, void 0, function* () {
159
+ const mutations = yield this.prepareRejectClaimMutations(sharedScenarioId, claimId);
160
+ return LrMergedMutation.create(yield Promise.all(mutations));
161
+ });
162
+ }
163
+ approveClaim(sharedScenarioId, sharedClaimId) {
164
+ return __awaiter(this, void 0, void 0, function* () {
165
+ return this.mutate(this.approveClaimMutation(sharedScenarioId, sharedClaimId));
166
+ });
167
+ }
168
+ approveClaimMutation(sharedScenarioId, sharedClaimId) {
169
+ return __awaiter(this, void 0, void 0, function* () {
170
+ const mutations = yield this.prepareApproveClaimMutations(sharedScenarioId, sharedClaimId);
171
+ return LrMergedMutation.create(yield Promise.all(mutations));
172
+ });
173
+ }
174
+ receiveClaim(scenarioId, sharedClaimId) {
175
+ return __awaiter(this, void 0, void 0, function* () {
176
+ return this.mutate(this.receiveClaimMutation(scenarioId, sharedClaimId));
177
+ });
178
+ }
179
+ receiveClaimMutation(scenarioId, sharedClaimId) {
180
+ return __awaiter(this, void 0, void 0, function* () {
181
+ return new LrMutation({
182
+ mutation: ReceiveScenarioClaimMutation,
183
+ variables: {
184
+ input: yield this.prepareClaim(scenarioId, sharedClaimId),
185
+ },
186
+ });
187
+ });
188
+ }
189
+ // --------------------------------------------------------------------------------
190
+ // --------------------------------------------------------------------------------
191
+ // Helpers
192
+ // --------------------------------------------------------------------------------
193
+ // --------------------------------------------------------------------------------
194
+ getScenario(scenarioId) {
195
+ return __awaiter(this, void 0, void 0, function* () {
196
+ return this.query({
197
+ query: ScenarioQuery,
198
+ variables: { scenarioId },
199
+ });
200
+ });
201
+ }
202
+ getSharedScenario(scenarioId, claimId) {
203
+ return __awaiter(this, void 0, void 0, function* () {
204
+ const ret = yield this.query({
205
+ query: SharedScenarioQuery,
206
+ variables: {
207
+ scenarioId,
208
+ },
209
+ });
210
+ if (claimId && ret.sharedScenario.sharedClaim.id !== claimId) {
211
+ throwClaimIdMismatch();
212
+ }
213
+ return ret;
214
+ });
215
+ }
216
+ getParticipantTpsKeys(options) {
217
+ return __awaiter(this, void 0, void 0, function* () {
218
+ const tpIds = options.map((x) => x.tpId);
219
+ // This should contain all the TPs that we need to update the assembly.
220
+ const tps = mapEdges((yield this.lrGraphQL.query({
221
+ query: TpsKeysQuery,
222
+ variables: {
223
+ ids: tpIds,
224
+ },
225
+ })).tps);
226
+ return tps;
227
+ });
228
+ }
229
+ fillTpSharedKeyId(options, tps) {
230
+ options.forEach((participant) => {
231
+ if (!participant.tpSharedKeyId) {
232
+ const tp = tps.find((x) => x.id === participant.tpId);
233
+ participant.tpSharedKeyId =
234
+ tp.currentUserSharedKey.userSharedKey.sharedKey.id;
235
+ }
236
+ });
237
+ }
238
+ prepareCreateScenarioMutation(options) {
239
+ return __awaiter(this, void 0, void 0, function* () {
240
+ const { assemblyKey, mutationInput: createAssembly } = yield this.assemblyController.prepareCreate(options.createAssembly);
241
+ const createReceiversOptions = options.createReceivers || [];
242
+ const createClaimantsOptions = options.createClaimants || [];
243
+ // Fetch all the TPs so we don't have to pass in tpSharedKeyId
244
+ const creatParticipantsOptions = createReceiversOptions.concat(createClaimantsOptions);
245
+ const tps = yield this.getParticipantTpsKeys(creatParticipantsOptions);
246
+ this.fillTpSharedKeyId(creatParticipantsOptions, tps);
247
+ const createReceivers = yield Promise.all(createReceiversOptions.map((receiver) => this.prepareCreateReceiver(receiver, assemblyKey)));
248
+ const createClaimants = yield Promise.all(createClaimantsOptions.map((x) => this.prepareCreateClaimant(x)));
249
+ return {
250
+ enabled: options.enabled,
251
+ createAssembly,
252
+ createReceivers,
253
+ createClaimants,
254
+ };
255
+ });
256
+ }
257
+ prepareUpdateScenario(options, scenario) {
258
+ return __awaiter(this, void 0, void 0, function* () {
259
+ let assemblyKey = yield this.keyGraph.getJwkKey(scenario.assembly.assemblyKey.id);
260
+ let updateAssembly;
261
+ if (options.updateAssembly) {
262
+ // Assembly key is always rotated when updating assembly.
263
+ const result = yield this.assemblyController.prepareUpdate(options.updateAssembly, scenario.assembly);
264
+ updateAssembly = result.mutationInput;
265
+ assemblyKey = result.assemblyKey;
266
+ }
267
+ const createReceiversOptions = options.createReceivers || [];
268
+ const createClaimantsOptions = options.createClaimants || [];
269
+ // Fetch all the TPs so we don't have to pass in tpSharedKeyId
270
+ const creatParticipantsOptions = createReceiversOptions.concat(createClaimantsOptions);
271
+ const tps = yield this.getParticipantTpsKeys(creatParticipantsOptions);
272
+ this.fillTpSharedKeyId(creatParticipantsOptions, tps);
273
+ const createReceivers = options.createReceivers &&
274
+ (yield Promise.all(options.createReceivers.map((x) => this.prepareCreateReceiver(x, assemblyKey))));
275
+ const existingReceivers = mapEdges(scenario.receivers);
276
+ let updateReceivers = options.updateReceivers
277
+ ? yield Promise.all(options.updateReceivers.map((updateReceiver) => {
278
+ // Find the receiver we are updating
279
+ const existingReceiver = existingReceivers.find((x) => x.tp.id === updateReceiver.tpId);
280
+ return this.prepareUpdateReceiver(updateReceiver, assemblyKey, existingReceiver);
281
+ }))
282
+ : [];
283
+ // Fill in any missing receivers when updating assembly.
284
+ if (options.updateAssembly) {
285
+ // Filter out the receivers that will be deleted or already updated.
286
+ const existing = existingReceivers.filter((existingReceiver) => !(options.deleteReceivers || []).includes(existingReceiver.tp.id) &&
287
+ !updateReceivers.some((updateReceiver) => updateReceiver.tpId === existingReceiver.tp.id));
288
+ updateReceivers = updateReceivers.concat(yield this.prepareExistingReceivers(existing, assemblyKey));
289
+ }
290
+ const createClaimants = options.createClaimants &&
291
+ (yield Promise.all(options.createClaimants.map((x) => this.prepareCreateClaimant(x))));
292
+ const existingClaimants = mapEdges(scenario.claimants);
293
+ const updateClaimants = options.updateClaimants &&
294
+ (yield Promise.all(options.updateClaimants.map((x) => {
295
+ // Find the claimant we are updating
296
+ const claimant = existingClaimants.find((existingClaimant) => existingClaimant.tp.id === x.tpId);
297
+ return this.prepareUpdateClaimant(x, claimant.sharedKey.id);
298
+ })));
299
+ return {
300
+ scenarioId: options.scenarioId,
301
+ enabled: options.enabled,
302
+ updateAssembly,
303
+ createReceivers,
304
+ updateReceivers,
305
+ deleteReceivers: options.deleteReceivers,
306
+ createClaimants,
307
+ updateClaimants,
308
+ deleteClaimants: options.deleteClaimants,
309
+ };
310
+ });
311
+ }
312
+ prepareReceiverDirectory(options, receiverSharedKey, assemblyKey) {
313
+ return __awaiter(this, void 0, void 0, function* () {
314
+ // TODO this should be batched
315
+ const directoryKey = yield this.item2Service.getDirectoryKey(options.directoryId, options.directoryKeyId);
316
+ const sharedCipherData = yield this.keyGraph.encryptToString(receiverSharedKey, options.sharedCipherDataClearJson);
317
+ let wrappedItemKey = yield this.keyGraph.encryptToString(receiverSharedKey, directoryKey.jwk.toJSON(true));
318
+ // TODO fetch assemblyKeyId. We are changing it such that there is always an assembly
319
+ // before receivers can be added.
320
+ wrappedItemKey = yield this.keyGraph.encryptToString(assemblyKey, wrappedItemKey);
321
+ return {
322
+ directoryId: options.directoryId,
323
+ wrappedItemKey,
324
+ accessRole: options.accessRole,
325
+ sharedCipherData,
326
+ };
327
+ });
328
+ }
329
+ prepareCreateReceiver(options, assemblyKey) {
330
+ return __awaiter(this, void 0, void 0, function* () {
331
+ const { sharedKey, mutationInput } = yield this.prepareCreateParticipant(options);
332
+ const addDirectories = options.addDirectories &&
333
+ (yield Promise.all(options.addDirectories.map((x) => this.prepareAddReceiverDirectory(x, sharedKey.key, assemblyKey))));
334
+ return Object.assign(Object.assign({}, mutationInput), { addDirectories });
335
+ });
336
+ }
337
+ prepareUpdateReceiver(options, assemblyKey, existingReceiver) {
338
+ return __awaiter(this, void 0, void 0, function* () {
339
+ const sharedKeyId = existingReceiver.sharedKey.id;
340
+ const deleteDirectoriesOptions = options.deleteDirectories || [];
341
+ const updateDirectoriesOptions = options.updateDirectories || [];
342
+ // Fill in any missing update directories
343
+ mapEdges(existingReceiver.receiverDirectories).forEach((existingDirectory) => {
344
+ if (deleteDirectoriesOptions.includes(existingDirectory.directory.id)) {
345
+ return;
346
+ }
347
+ if (updateDirectoriesOptions.find((x) => x.directoryId === existingDirectory.directory.id)) {
348
+ return;
349
+ }
350
+ updateDirectoriesOptions.push({
351
+ accessRole: existingDirectory.accessRole,
352
+ directoryId: existingDirectory.directory.id,
353
+ sharedCipherDataClearJson: existingDirectory.sharedCipherDataClearJson,
354
+ });
355
+ });
356
+ const { sharedKey, mutationInput } = yield this.prepareUpdateParticipant(options, sharedKeyId);
357
+ const addDirectories = options.addDirectories &&
358
+ (yield Promise.all(options.addDirectories.map((x) => this.prepareAddReceiverDirectory(x, sharedKey, assemblyKey))));
359
+ const updateDirectories = yield Promise.all(updateDirectoriesOptions.map((x) => this.prepareUpdateReceiverDirectory(x, sharedKey, assemblyKey)));
360
+ return Object.assign(Object.assign({}, mutationInput), { addDirectories,
361
+ updateDirectories, deleteDirectories: options.deleteDirectories });
362
+ });
363
+ }
364
+ prepareExistingReceiver(existingReceiver, assemblyKey) {
365
+ return __awaiter(this, void 0, void 0, function* () {
366
+ const updateDirectories = mapEdges(existingReceiver.receiverDirectories).map((receiverDirectory) => ({
367
+ directoryId: receiverDirectory.directory.id,
368
+ directoryKeyId: receiverDirectory.directory.keyId,
369
+ accessRole: receiverDirectory.accessRole,
370
+ sharedCipherDataClearJson: receiverDirectory.sharedCipherDataClearJson,
371
+ }));
372
+ // Fill it in with existing receiver.
373
+ return this.prepareUpdateReceiver({
374
+ tpId: existingReceiver.tp.id,
375
+ sharedCipherDataClearJson: existingReceiver.sharedCipherDataClearJson,
376
+ updateDirectories,
377
+ }, assemblyKey, existingReceiver);
378
+ });
379
+ }
380
+ prepareExistingReceivers(existingReceivers, assemblyKey) {
381
+ return __awaiter(this, void 0, void 0, function* () {
382
+ return Promise.all(existingReceivers.map((existingReceiver) => this.prepareExistingReceiver(existingReceiver, assemblyKey)));
383
+ });
384
+ }
385
+ prepareCreateParticipant(options) {
386
+ return __awaiter(this, void 0, void 0, function* () {
387
+ const sharedKey = yield this.keyGraph.encryptWithNewKey(options.tpSharedKeyId, options.sharedCipherDataClearJson);
388
+ return {
389
+ sharedKey,
390
+ mutationInput: {
391
+ tpId: options.tpId,
392
+ tpSharedKeyId: options.tpSharedKeyId,
393
+ tpSharedKeyWrappedSharedKey: sharedKey.wrappedKey,
394
+ sharedCipherData: sharedKey.cipher,
395
+ },
396
+ };
397
+ });
398
+ }
399
+ prepareUpdateParticipant(options, sharedKeyId) {
400
+ return __awaiter(this, void 0, void 0, function* () {
401
+ const sharedKey = yield this.keyGraph.getJwkKey(sharedKeyId);
402
+ const sharedCipherData = yield this.keyGraph.encryptToString(sharedKey, options.sharedCipherDataClearJson);
403
+ return {
404
+ sharedKey,
405
+ mutationInput: {
406
+ tpId: options.tpId,
407
+ sharedKeyId,
408
+ sharedCipherData,
409
+ },
410
+ };
411
+ });
412
+ }
413
+ prepareCreateClaimant(options) {
414
+ return __awaiter(this, void 0, void 0, function* () {
415
+ const { mutationInput } = yield this.prepareCreateParticipant(options);
416
+ return mutationInput;
417
+ });
418
+ }
419
+ prepareUpdateClaimant(options, sharedKeyId) {
420
+ return __awaiter(this, void 0, void 0, function* () {
421
+ const { mutationInput } = yield this.prepareUpdateParticipant(options, sharedKeyId);
422
+ return mutationInput;
423
+ });
424
+ }
425
+ prepareClaim(scenarioId, sharedClaimId) {
426
+ return __awaiter(this, void 0, void 0, function* () {
427
+ // Get all the shared items
428
+ const sharedScenario = (yield this.getSharedScenario(scenarioId, sharedClaimId)).sharedScenario;
429
+ if (sharedScenario.state !== ScenarioState.APPROVED) {
430
+ throwClaimNotApproved();
431
+ }
432
+ const approvals = mapEdges(sharedScenario.sharedClaim.asClaimReceiver.approvals);
433
+ const assemblyKey = yield this.recoverAssemblyKey(approvals);
434
+ console.log('receiveClaimMutation assemblyKey', assemblyKey);
435
+ // Decrypt all items
436
+ const receiverDirectories = yield Promise.all(sharedScenario.asReceiver.receiverDirectories.edges
437
+ .map((edge) => edge.node)
438
+ .map((receiverDirectory) => __awaiter(this, void 0, void 0, function* () {
439
+ const wrappedItemKey = yield this.encryptionService.decrypt(assemblyKey, receiverDirectory.wrappedItemKey);
440
+ return {
441
+ receiverDirectoryId: receiverDirectory.id,
442
+ receiverSharedKeyWrappedItemKey: wrappedItemKey,
443
+ };
444
+ })));
445
+ return {
446
+ scenarioClaimId: sharedClaimId,
447
+ receiverDirectories,
448
+ };
449
+ });
450
+ }
451
+ recoverAssemblyKey(approvals) {
452
+ return __awaiter(this, void 0, void 0, function* () {
453
+ const partials = yield Promise.all(approvals.map((approval) => this.keyGraph.decryptFromString(approval.pxk.id, approval.receiverCipherPartialAssemblyKey)));
454
+ return this.assemblyController.recoverAssemblyKey(partials);
455
+ });
456
+ }
457
+ asClaimApprovers(sharedScenarioId, claimId, state) {
458
+ return __awaiter(this, void 0, void 0, function* () {
459
+ const sharedScenario = (yield this.getSharedScenario(sharedScenarioId, claimId)).sharedScenario;
460
+ return mapEdges(sharedScenario.sharedClaim.claim.asClaimApprovers).filter((asClaimApprover) => asClaimApprover.state === state);
461
+ });
462
+ }
463
+ prepareApproveClaimMutations(sharedScenarioId, claimId) {
464
+ return __awaiter(this, void 0, void 0, function* () {
465
+ // The current user may be acting as approvers in multiple sub-assemblies so
466
+ // we approve them all.
467
+ const asClaimApprovers = yield this.asClaimApprovers(sharedScenarioId, claimId, TpClaimApproverState.CLAIMED);
468
+ return asClaimApprovers.map((asClaimApprover) => __awaiter(this, void 0, void 0, function* () {
469
+ return new LrMutation({
470
+ mutation: ApproveScenarioClaimMutation,
471
+ variables: {
472
+ input: yield this.prepareApproveClaim(asClaimApprover),
473
+ },
474
+ });
475
+ }));
476
+ });
477
+ }
478
+ prepareApproveClaim(asClaimApprover) {
479
+ return __awaiter(this, void 0, void 0, function* () {
480
+ const receiverApprovals = yield Promise.all(mapEdges(asClaimApprover.receiverApprovals).map((receiverApproval) => this.prepareReceiverApproval({
481
+ receiverApprovalId: receiverApproval.id,
482
+ receiverApprovalPxkId: receiverApproval.pxk.id,
483
+ sharedCipherPartialAssemblyKeyClearJson: asClaimApprover.sharedCipherPartialAssemblyKeyClearJson,
484
+ })));
485
+ return {
486
+ claimApproverId: asClaimApprover.id,
487
+ receiverApprovals,
488
+ };
489
+ });
490
+ }
491
+ prepareReceiverApproval(options) {
492
+ return __awaiter(this, void 0, void 0, function* () {
493
+ return {
494
+ receiverApprovalId: options.receiverApprovalId,
495
+ // TODO allow sending of messages to receiver.
496
+ receiverCipher: '',
497
+ receiverCipherPartialAssemblyKey: yield this.keyGraph.encryptToString(options.receiverApprovalPxkId, options.sharedCipherPartialAssemblyKeyClearJson),
498
+ };
499
+ });
500
+ }
501
+ prepareRejectClaimMutations(sharedScenarioId, claimId) {
502
+ return __awaiter(this, void 0, void 0, function* () {
503
+ // The current user may be acting as approvers in multiple sub-assemblies so
504
+ // we reject them all.
505
+ const asClaimApprovers = yield this.asClaimApprovers(sharedScenarioId, claimId, TpClaimApproverState.CLAIMED);
506
+ return asClaimApprovers.map((asClaimApprover) => __awaiter(this, void 0, void 0, function* () {
507
+ return new LrMutation({
508
+ mutation: RejectScenarioClaimMutation,
509
+ variables: {
510
+ input: { claimApproverId: asClaimApprover.id },
511
+ },
512
+ });
513
+ }));
514
+ });
515
+ }
516
+ };
517
+ ScenarioService.SLIP39_PASSPHRASE = 'lifeready';
518
+ ScenarioService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ScenarioService_Factory() { return new ScenarioService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.KeyGraphService), i0.ɵɵinject(i2.Item2Service), i0.ɵɵinject(i3.ScenarioAssemblyController), i0.ɵɵinject(i4.EncryptionService)); }, token: ScenarioService, providedIn: "root" });
519
+ ScenarioService.decorators = [
520
+ { type: Injectable, args: [{
521
+ providedIn: 'root',
522
+ },] }
523
+ ];
524
+ ScenarioService.ctorParameters = () => [
525
+ { type: NgZone },
526
+ { type: Injector },
527
+ { type: KeyGraphService },
528
+ { type: Item2Service },
529
+ { type: ScenarioAssemblyController },
530
+ { type: EncryptionService }
531
+ ];
532
+ ScenarioService = __decorate([
533
+ RunOutsideAngular({
534
+ ngZoneName: 'ngZone',
535
+ })
536
+ ], ScenarioService);
537
+ export { ScenarioService };
538
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmFyaW8uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWN0cy9rYy1jbGllbnQvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvc2NlbmFyaW8vc2NlbmFyaW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUUsT0FBTyxFQUNMLFFBQVEsRUFHUixhQUFhLEVBR2Isb0JBQW9CLEdBRXJCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixHQUNwQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsNEJBQTRCLEVBQzVCLDRCQUE0QixFQUM1QiwyQkFBMkIsRUFDM0IsMkJBQTJCLEdBQzVCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBYW5FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7OztBQUUxRSxNQUFNLFVBQVUsb0JBQW9C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WUFDdEIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbEQsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxvQkFBb0IsQ0FBQyxPQUFPLENBQzdCLENBQUM7WUFFRixPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FDekIsQ0FBTyxlQUFlLEVBQUUsRUFBRTtnQkFDeEIsT0FBQSxJQUFJLFVBQVUsQ0FBQztvQkFDYixRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxTQUFTLEVBQUU7d0JBQ1QsS0FBSyxFQUFFLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQyxFQUFFLEVBQUU7cUJBQy9DO2lCQUNGLENBQUMsQ0FBQTtjQUFBLENBQ0wsQ0FBQztRQUNKLENBQUM7S0FBQTtDQUNGLENBQUE7QUF0c0JlLGlDQUFpQixHQUFHLFdBQVcsQ0FBQzs7O1lBZC9DLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBL0Q4QixNQUFNO1lBQWhCLFFBQVE7WUFhcEIsZUFBZTtZQWdCZixZQUFZO1lBQ1osMEJBQTBCO1lBYTFCLGlCQUFpQjs7QUFxQmIsZUFBZTtJQU4zQixpQkFBaUIsQ0FBQztRQUNqQixVQUFVLEVBQUUsUUFBUTtLQUNyQixDQUFDO0dBSVcsZUFBZSxDQWl0QjNCO1NBanRCWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xyXG5pbXBvcnQgeyBMck1lcmdlZE11dGF0aW9uLCBMck11dGF0aW9uLCBMclNlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItZ3JhcGhxbCc7XHJcbmltcG9ydCB7XHJcbiAgbWFwRWRnZXMsXHJcbiAgU2NlbmFyaW9Ob2RlLFxyXG4gIFNjZW5hcmlvUmVjZWl2ZXJOb2RlLFxyXG4gIFNjZW5hcmlvU3RhdGUsXHJcbiAgU2hhcmVkU2NlbmFyaW9DbGFpbVJlY2VpdmVkQXBwcm92YWxOb2RlLFxyXG4gIFNoYXJlZFRwQ2xhaW1BcHByb3Zlck5vZGUsXHJcbiAgVHBDbGFpbUFwcHJvdmVyU3RhdGUsXHJcbiAgVHBOb2RlLFxyXG59IGZyb20gJy4uL2FwaS90eXBlcyc7XHJcbmltcG9ydCB7IEtleUdyYXBoU2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXktZ3JhcGguc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbixcclxuICBMckJhZFN0YXRlRXhjZXB0aW9uLFxyXG59IGZyb20gJy4uL19jb21tb24vZXhjZXB0aW9ucyc7XHJcbmltcG9ydCB7IFJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi4vX2NvbW1vbi9ydW4tb3V0c2lkZS1hbmd1bGFyJztcclxuaW1wb3J0IHtcclxuICBEZWxldGVTY2VuYXJpb011dGF0aW9uLFxyXG4gIENyZWF0ZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcclxuICBVcGRhdGVTY2VuYXJpb011dGF0aW9uLFxyXG4gIENyZWF0ZVNjZW5hcmlvTXV0YXRpb24sXHJcbiAgUmVjZWl2ZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcclxuICBBcHByb3ZlU2NlbmFyaW9DbGFpbU11dGF0aW9uLFxyXG4gIENhbmNlbFNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcclxuICBSZWplY3RTY2VuYXJpb0NsYWltTXV0YXRpb24sXHJcbn0gZnJvbSAnLi9zY2VuYXJpby5ncWwnO1xyXG5pbXBvcnQgeyBJdGVtMlNlcnZpY2UgfSBmcm9tICcuLi9pdGVtczIvaXRlbTIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNjZW5hcmlvQXNzZW1ibHlDb250cm9sbGVyIH0gZnJvbSAnLi9zY2VuYXJpby5jb250cm9sbGVyJztcclxuaW1wb3J0IHtcclxuICBDcmVhdGVDbGFpbWFudE9wdGlvbnMsXHJcbiAgQ3JlYXRlUGFydGljaXBhbnRPcHRpb25zLFxyXG4gIENyZWF0ZVJlY2VpdmVyT3B0aW9ucyxcclxuICBDcmVhdGVTY2VuYXJpb09wdGlvbnMsXHJcbiAgUGFydGljaXBhbnRPcHRpb25zLFxyXG4gIFJlY2VpdmVyRGlyZWN0b3J5T3B0aW9ucyxcclxuICBSZXNldFNjZW5hcmlvT3B0aW9ucyxcclxuICBVcGRhdGVDbGFpbWFudE9wdGlvbnMsXHJcbiAgVXBkYXRlUmVjZWl2ZXJPcHRpb25zLFxyXG4gIFVwZGF0ZVNjZW5hcmlvT3B0aW9ucyxcclxufSBmcm9tICcuL3NjZW5hcmlvLnR5cGVzJztcclxuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkvZW5jcnlwdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2NlbmFyaW9RdWVyeSwgU2hhcmVkU2NlbmFyaW9RdWVyeSB9IGZyb20gJy4vc2NlbmFyaW8uZ3FsLnByaXZhdGUnO1xyXG5pbXBvcnQgeyBQYXJ0aWFsQXNzZW1ibHlLZXkgfSBmcm9tICcuLi90cnVzdGVkLXBhcnRpZXMvdHAtYXNzZW1ibHkudHlwZXMnO1xyXG5pbXBvcnQgeyBUcHNLZXlzUXVlcnkgfSBmcm9tICcuLi90cnVzdGVkLXBhcnRpZXMvdHAtYXNzZW1ibHkuZ3FsLnByaXZhdGUnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRocm93Q2xhaW1JZE1pc21hdGNoKCkge1xyXG4gIHRocm93IG5ldyBMckJhZEFyZ3VtZW50RXhjZXB0aW9uKFxyXG4gICAgJ2NsYWltSWQgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgY3VycmVudCBjbGFpbUlkIG9mIHRoZSBzY2VuYXJpbydcclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dDbGFpbU5vdEFwcHJvdmVkKCkge1xyXG4gIHRocm93IG5ldyBMckJhZFN0YXRlRXhjZXB0aW9uKCdTY2VuYXJpbyBjbGFpbSBoYXMgbm90IGJlZW4gYXBwcm92ZWQnKTtcclxufVxyXG5cclxuQFJ1bk91dHNpZGVBbmd1bGFyKHtcclxuICBuZ1pvbmVOYW1lOiAnbmdab25lJyxcclxufSlcclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNjZW5hcmlvU2VydmljZSBleHRlbmRzIExyU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIGtleUdyYXBoOiBLZXlHcmFwaFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGl0ZW0yU2VydmljZTogSXRlbTJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhc3NlbWJseUNvbnRyb2xsZXI6IFNjZW5hcmlvQXNzZW1ibHlDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBlbmNyeXB0aW9uU2VydmljZTogRW5jcnlwdGlvblNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGluamVjdG9yKTtcclxuICB9XHJcbiAgcHVibGljIHN0YXRpYyBTTElQMzlfUEFTU1BIUkFTRSA9ICdsaWZlcmVhZHknO1xyXG5cclxuICBwcml2YXRlIHByZXBhcmVBZGRSZWNlaXZlckRpcmVjdG9yeSA9IHRoaXMucHJlcGFyZVJlY2VpdmVyRGlyZWN0b3J5O1xyXG4gIHByaXZhdGUgcHJlcGFyZVVwZGF0ZVJlY2VpdmVyRGlyZWN0b3J5ID0gdGhpcy5wcmVwYXJlUmVjZWl2ZXJEaXJlY3Rvcnk7XHJcblxyXG4gIC8vIFNjZW5hcmlvc1xyXG4gIGFzeW5jIGNyZWF0ZVNjZW5hcmlvKG9wdGlvbnM6IENyZWF0ZVNjZW5hcmlvT3B0aW9ucykge1xyXG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVTY2VuYXJpb011dGF0aW9uKG9wdGlvbnM6IENyZWF0ZVNjZW5hcmlvT3B0aW9ucykge1xyXG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLnByZXBhcmVDcmVhdGVTY2VuYXJpb011dGF0aW9uKG9wdGlvbnMpO1xyXG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcclxuICAgICAgbXV0YXRpb246IENyZWF0ZVNjZW5hcmlvTXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVTY2VuYXJpbyhvcHRpb25zOiBVcGRhdGVTY2VuYXJpb09wdGlvbnMpIHtcclxuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnVwZGF0ZVNjZW5hcmlvTXV0YXRpb24ob3B0aW9ucykpO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyBhdXRvIGFkZCB0aGUgbWlzc2luZyBleGlzdGluZyByZWNlaXZlcnMgYW5kIGRpcmVjdG9yaWVzXHJcbiAgYXN5bmMgdXBkYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zOiBVcGRhdGVTY2VuYXJpb09wdGlvbnMpIHtcclxuICAgIGNvbnN0IHNjZW5hcmlvID0gKGF3YWl0IHRoaXMuZ2V0U2NlbmFyaW8ob3B0aW9ucy5zY2VuYXJpb0lkKSkuc2NlbmFyaW87XHJcbiAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZVNjZW5hcmlvKG9wdGlvbnMsIHNjZW5hcmlvKTtcclxuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XHJcbiAgICAgIG11dGF0aW9uOiBVcGRhdGVTY2VuYXJpb011dGF0aW9uLFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBpbnB1dCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVzZXRTY2VuYXJpbyhvcHRpb25zOiBSZXNldFNjZW5hcmlvT3B0aW9ucykge1xyXG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMucmVzZXRTY2VuYXJpb011dGF0aW9uKG9wdGlvbnMpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlc2V0U2NlbmFyaW9NdXRhdGlvbihvcHRpb25zOiBSZXNldFNjZW5hcmlvT3B0aW9ucykge1xyXG4gICAgY29uc3Qgc2NlbmFyaW8gPSAoYXdhaXQgdGhpcy5nZXRTY2VuYXJpbyhvcHRpb25zLnNjZW5hcmlvSWQpKS5zY2VuYXJpbztcclxuXHJcbiAgICBjb25zdCB7IGFzc2VtYmx5IH0gPSBzY2VuYXJpbztcclxuXHJcbiAgICAvLyBKdXN0IG5lZWQgdG8gZG8gYW4gdXBkYXRlIHdpdGhvdXQgY2hhbmdpbmcgYXBwcm92ZXJzLiBUaGlzIHdpbGwgcmVjcmVhdGVcclxuICAgIC8vIGFsbCBhc3NlbWJseSBrZXlzLlxyXG4gICAgY29uc3QgdXBkYXRlU3ViQXNzZW1ibGllcyA9IG1hcEVkZ2VzKGFzc2VtYmx5LnN1YkFzc2VtYmxpZXMpLm1hcCgoc2EpID0+IHtcclxuICAgICAgY29uc3QgYXBwcm92ZXJUcHMgPSBtYXBFZGdlcyhzYS5hcHByb3ZlcnMpLm1hcCgoYXBwcm92ZXIpID0+ICh7XHJcbiAgICAgICAgdHBJZDogYXBwcm92ZXIudHAuaWQsXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaWQ6IHNhLmlkLFxyXG4gICAgICAgIHF1b3J1bTogc2EucXVvcnVtLFxyXG4gICAgICAgIHNpbmdsZVJlamVjdDogc2Euc2luZ2xlUmVqZWN0LFxyXG4gICAgICAgIHN1YmplY3RDaXBoZXJEYXRhQ2xlYXJKc29uOiBzYS5zdWJqZWN0Q2lwaGVyRGF0YUNsZWFySnNvbixcclxuICAgICAgICBhcHByb3ZlclRwcyxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5wcmVwYXJlVXBkYXRlU2NlbmFyaW8oXHJcbiAgICAgIHtcclxuICAgICAgICBzY2VuYXJpb0lkOiBvcHRpb25zLnNjZW5hcmlvSWQsXHJcbiAgICAgICAgZW5hYmxlZDogb3B0aW9ucy5lbmFibGVkLFxyXG4gICAgICAgIHVwZGF0ZUFzc2VtYmx5OiB7XHJcbiAgICAgICAgICBxdW9ydW06IGFzc2VtYmx5LnF1b3J1bSxcclxuICAgICAgICAgIHNpbmdsZVJlamVjdDogYXNzZW1ibHkuc2luZ2xlUmVqZWN0LFxyXG4gICAgICAgICAgdXBkYXRlU3ViQXNzZW1ibGllcyxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICBzY2VuYXJpb1xyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xyXG4gICAgICBtdXRhdGlvbjogVXBkYXRlU2NlbmFyaW9NdXRhdGlvbiwgLy8gdXBkYXRpbmcgc2NlbmFyaW8gcmVzZXRzIGl0XHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGVTY2VuYXJpbyhzY2VuYXJpb0lkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmxyR3JhcGhRTC5sck11dGF0ZSh0aGlzLmRlbGV0ZVNjZW5hcmlvTXV0YXRpb24oc2NlbmFyaW9JZCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGVsZXRlU2NlbmFyaW9NdXRhdGlvbihzY2VuYXJpb0lkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XHJcbiAgICAgIG11dGF0aW9uOiBEZWxldGVTY2VuYXJpb011dGF0aW9uLFxyXG4gICAgICB2YXJpYWJsZXM6IHsgaW5wdXQ6IHsgc2NlbmFyaW9JZCB9IH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIENsYWltc1xyXG4gIGFzeW5jIGNyZWF0ZUNsYWltKHNjZW5hcmlvSWQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY3JlYXRlQ2xhaW1NdXRhdGlvbihzY2VuYXJpb0lkKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVDbGFpbU11dGF0aW9uKHNjZW5hcmlvSWQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcclxuICAgICAgbXV0YXRpb246IENyZWF0ZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcclxuICAgICAgdmFyaWFibGVzOiB7IGlucHV0OiB7IHNjZW5hcmlvSWQgfSB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5jZWxDbGFpbShjbGFpbUlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmNhbmNlbENsYWltTXV0YXRpb24oY2xhaW1JZCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuY2VsQ2xhaW1NdXRhdGlvbihjbGFpbUlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XHJcbiAgICAgIG11dGF0aW9uOiBDYW5jZWxTY2VuYXJpb0NsYWltTXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczogeyBpbnB1dDogeyBjbGFpbUlkIH0gfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVqZWN0Q2xhaW0oc2hhcmVkU2NlbmFyaW9JZDogc3RyaW5nLCBjbGFpbUlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnJlamVjdENsYWltTXV0YXRpb24oc2hhcmVkU2NlbmFyaW9JZCwgY2xhaW1JZCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVqZWN0Q2xhaW1NdXRhdGlvbihzaGFyZWRTY2VuYXJpb0lkOiBzdHJpbmcsIGNsYWltSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgbXV0YXRpb25zID0gYXdhaXQgdGhpcy5wcmVwYXJlUmVqZWN0Q2xhaW1NdXRhdGlvbnMoXHJcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXHJcbiAgICAgIGNsYWltSWRcclxuICAgICk7XHJcbiAgICByZXR1cm4gTHJNZXJnZWRNdXRhdGlvbi5jcmVhdGUoYXdhaXQgUHJvbWlzZS5hbGwobXV0YXRpb25zKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhcHByb3ZlQ2xhaW0oc2hhcmVkU2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLm11dGF0ZShcclxuICAgICAgdGhpcy5hcHByb3ZlQ2xhaW1NdXRhdGlvbihzaGFyZWRTY2VuYXJpb0lkLCBzaGFyZWRDbGFpbUlkKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFwcHJvdmVDbGFpbU11dGF0aW9uKHNoYXJlZFNjZW5hcmlvSWQ6IHN0cmluZywgc2hhcmVkQ2xhaW1JZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBtdXRhdGlvbnMgPSBhd2FpdCB0aGlzLnByZXBhcmVBcHByb3ZlQ2xhaW1NdXRhdGlvbnMoXHJcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXHJcbiAgICAgIHNoYXJlZENsYWltSWRcclxuICAgICk7XHJcbiAgICByZXR1cm4gTHJNZXJnZWRNdXRhdGlvbi5jcmVhdGUoYXdhaXQgUHJvbWlzZS5hbGwobXV0YXRpb25zKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWNlaXZlQ2xhaW0oc2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnJlY2VpdmVDbGFpbU11dGF0aW9uKHNjZW5hcmlvSWQsIHNoYXJlZENsYWltSWQpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlY2VpdmVDbGFpbU11dGF0aW9uKHNjZW5hcmlvSWQ6IHN0cmluZywgc2hhcmVkQ2xhaW1JZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xyXG4gICAgICBtdXRhdGlvbjogUmVjZWl2ZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgaW5wdXQ6IGF3YWl0IHRoaXMucHJlcGFyZUNsYWltKHNjZW5hcmlvSWQsIHNoYXJlZENsYWltSWQpLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gSGVscGVyc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBwcml2YXRlIGFzeW5jIGdldFNjZW5hcmlvKHNjZW5hcmlvSWQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMucXVlcnkoe1xyXG4gICAgICBxdWVyeTogU2NlbmFyaW9RdWVyeSxcclxuICAgICAgdmFyaWFibGVzOiB7IHNjZW5hcmlvSWQgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRTaGFyZWRTY2VuYXJpbyhzY2VuYXJpb0lkOiBzdHJpbmcsIGNsYWltSWQ/OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMucXVlcnkoe1xyXG4gICAgICBxdWVyeTogU2hhcmVkU2NlbmFyaW9RdWVyeSxcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgc2NlbmFyaW9JZCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChjbGFpbUlkICYmIHJldC5zaGFyZWRTY2VuYXJpby5zaGFyZWRDbGFpbS5pZCAhPT0gY2xhaW1JZCkge1xyXG4gICAgICB0aHJvd0NsYWltSWRNaXNtYXRjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFBhcnRpY2lwYW50VHBzS2V5cyhvcHRpb25zOiBDcmVhdGVQYXJ0aWNpcGFudE9wdGlvbnNbXSkge1xyXG4gICAgY29uc3QgdHBJZHMgPSBvcHRpb25zLm1hcCgoeCkgPT4geC50cElkKTtcclxuXHJcbiAgICAvLyBUaGlzIHNob3VsZCBjb250YWluIGFsbCB0aGUgVFBzIHRoYXQgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGFzc2VtYmx5LlxyXG4gICAgY29uc3QgdHBzID0gbWFwRWRnZXMoXHJcbiAgICAgIChcclxuICAgICAgICBhd2FpdCB0aGlzLmxyR3JhcGhRTC5xdWVyeSh7XHJcbiAgICAgICAgICBxdWVyeTogVHBzS2V5c1F1ZXJ5LFxyXG4gICAgICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgICAgIGlkczogdHBJZHMsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pXHJcbiAgICAgICkudHBzXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB0cHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGxUcFNoYXJlZEtleUlkKFxyXG4gICAgb3B0aW9uczogQ3JlYXRlUGFydGljaXBhbnRPcHRpb25zW10sXHJcbiAgICB0cHM6IFRwTm9kZVtdXHJcbiAgKSB7XHJcbiAgICBvcHRpb25zLmZvckVhY2goKHBhcnRpY2lwYW50KSA9PiB7XHJcbiAgICAgIGlmICghcGFydGljaXBhbnQudHBTaGFyZWRLZXlJZCkge1xyXG4gICAgICAgIGNvbnN0IHRwID0gdHBzLmZpbmQoKHgpID0+IHguaWQgPT09IHBhcnRpY2lwYW50LnRwSWQpO1xyXG4gICAgICAgIHBhcnRpY2lwYW50LnRwU2hhcmVkS2V5SWQgPVxyXG4gICAgICAgICAgdHAuY3VycmVudFVzZXJTaGFyZWRLZXkudXNlclNoYXJlZEtleS5zaGFyZWRLZXkuaWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zOiBDcmVhdGVTY2VuYXJpb09wdGlvbnMpIHtcclxuICAgIGNvbnN0IHsgYXNzZW1ibHlLZXksIG11dGF0aW9uSW5wdXQ6IGNyZWF0ZUFzc2VtYmx5IH0gPVxyXG4gICAgICBhd2FpdCB0aGlzLmFzc2VtYmx5Q29udHJvbGxlci5wcmVwYXJlQ3JlYXRlKG9wdGlvbnMuY3JlYXRlQXNzZW1ibHkpO1xyXG5cclxuICAgIGNvbnN0IGNyZWF0ZVJlY2VpdmVyc09wdGlvbnMgPSBvcHRpb25zLmNyZWF0ZVJlY2VpdmVycyB8fCBbXTtcclxuICAgIGNvbnN0IGNyZWF0ZUNsYWltYW50c09wdGlvbnMgPSBvcHRpb25zLmNyZWF0ZUNsYWltYW50cyB8fCBbXTtcclxuXHJcbiAgICAvLyBGZXRjaCBhbGwgdGhlIFRQcyBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhc3MgaW4gdHBTaGFyZWRLZXlJZFxyXG4gICAgY29uc3QgY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zID0gY3JlYXRlUmVjZWl2ZXJzT3B0aW9ucy5jb25jYXQoXHJcbiAgICAgIGNyZWF0ZUNsYWltYW50c09wdGlvbnNcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgdHBzID0gYXdhaXQgdGhpcy5nZXRQYXJ0aWNpcGFudFRwc0tleXMoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLmZpbGxUcFNoYXJlZEtleUlkKGNyZWF0UGFydGljaXBhbnRzT3B0aW9ucywgdHBzKTtcclxuXHJcbiAgICBjb25zdCBjcmVhdGVSZWNlaXZlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgY3JlYXRlUmVjZWl2ZXJzT3B0aW9ucy5tYXAoKHJlY2VpdmVyKSA9PlxyXG4gICAgICAgIHRoaXMucHJlcGFyZUNyZWF0ZVJlY2VpdmVyKHJlY2VpdmVyLCBhc3NlbWJseUtleSlcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBjcmVhdGVDbGFpbWFudHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgY3JlYXRlQ2xhaW1hbnRzT3B0aW9ucy5tYXAoKHgpID0+IHRoaXMucHJlcGFyZUNyZWF0ZUNsYWltYW50KHgpKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQsXHJcbiAgICAgIGNyZWF0ZUFzc2VtYmx5LFxyXG4gICAgICBjcmVhdGVSZWNlaXZlcnMsXHJcbiAgICAgIGNyZWF0ZUNsYWltYW50cyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVVcGRhdGVTY2VuYXJpbyhcclxuICAgIG9wdGlvbnM6IFVwZGF0ZVNjZW5hcmlvT3B0aW9ucyxcclxuICAgIHNjZW5hcmlvOiBTY2VuYXJpb05vZGVcclxuICApIHtcclxuICAgIGxldCBhc3NlbWJseUtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0SndrS2V5KFxyXG4gICAgICBzY2VuYXJpby5hc3NlbWJseS5hc3NlbWJseUtleS5pZFxyXG4gICAgKTtcclxuICAgIGxldCB1cGRhdGVBc3NlbWJseTogYW55O1xyXG5cclxuICAgIGlmIChvcHRpb25zLnVwZGF0ZUFzc2VtYmx5KSB7XHJcbiAgICAgIC8vIEFzc2VtYmx5IGtleSBpcyBhbHdheXMgcm90YXRlZCB3aGVuIHVwZGF0aW5nIGFzc2VtYmx5LlxyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzc2VtYmx5Q29udHJvbGxlci5wcmVwYXJlVXBkYXRlKFxyXG4gICAgICAgIG9wdGlvbnMudXBkYXRlQXNzZW1ibHksXHJcbiAgICAgICAgc2NlbmFyaW8uYXNzZW1ibHlcclxuICAgICAgKTtcclxuICAgICAgdXBkYXRlQXNzZW1ibHkgPSByZXN1bHQubXV0YXRpb25JbnB1dDtcclxuICAgICAgYXNzZW1ibHlLZXkgPSByZXN1bHQuYXNzZW1ibHlLZXk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3JlYXRlUmVjZWl2ZXJzT3B0aW9ucyA9IG9wdGlvbnMuY3JlYXRlUmVjZWl2ZXJzIHx8IFtdO1xyXG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzT3B0aW9ucyA9IG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzIHx8IFtdO1xyXG5cclxuICAgIC8vIEZldGNoIGFsbCB0aGUgVFBzIHNvIHdlIGRvbid0IGhhdmUgdG8gcGFzcyBpbiB0cFNoYXJlZEtleUlkXHJcbiAgICBjb25zdCBjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMgPSBjcmVhdGVSZWNlaXZlcnNPcHRpb25zLmNvbmNhdChcclxuICAgICAgY3JlYXRlQ2xhaW1hbnRzT3B0aW9uc1xyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCB0cHMgPSBhd2FpdCB0aGlzLmdldFBhcnRpY2lwYW50VHBzS2V5cyhjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMpO1xyXG5cclxuICAgIHRoaXMuZmlsbFRwU2hhcmVkS2V5SWQoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zLCB0cHMpO1xyXG5cclxuICAgIGNvbnN0IGNyZWF0ZVJlY2VpdmVycyA9XHJcbiAgICAgIG9wdGlvbnMuY3JlYXRlUmVjZWl2ZXJzICYmXHJcbiAgICAgIChhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICBvcHRpb25zLmNyZWF0ZVJlY2VpdmVycy5tYXAoKHgpID0+XHJcbiAgICAgICAgICB0aGlzLnByZXBhcmVDcmVhdGVSZWNlaXZlcih4LCBhc3NlbWJseUtleSlcclxuICAgICAgICApXHJcbiAgICAgICkpO1xyXG5cclxuICAgIGNvbnN0IGV4aXN0aW5nUmVjZWl2ZXJzID0gbWFwRWRnZXMoc2NlbmFyaW8ucmVjZWl2ZXJzKTtcclxuICAgIGxldCB1cGRhdGVSZWNlaXZlcnMgPSBvcHRpb25zLnVwZGF0ZVJlY2VpdmVyc1xyXG4gICAgICA/IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgb3B0aW9ucy51cGRhdGVSZWNlaXZlcnMubWFwKCh1cGRhdGVSZWNlaXZlcikgPT4ge1xyXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSByZWNlaXZlciB3ZSBhcmUgdXBkYXRpbmdcclxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdSZWNlaXZlciA9IGV4aXN0aW5nUmVjZWl2ZXJzLmZpbmQoXHJcbiAgICAgICAgICAgICAgKHgpID0+IHgudHAuaWQgPT09IHVwZGF0ZVJlY2VpdmVyLnRwSWRcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVVcGRhdGVSZWNlaXZlcihcclxuICAgICAgICAgICAgICB1cGRhdGVSZWNlaXZlcixcclxuICAgICAgICAgICAgICBhc3NlbWJseUtleSxcclxuICAgICAgICAgICAgICBleGlzdGluZ1JlY2VpdmVyXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgOiBbXTtcclxuXHJcbiAgICAvLyBGaWxsIGluIGFueSBtaXNzaW5nIHJlY2VpdmVycyB3aGVuIHVwZGF0aW5nIGFzc2VtYmx5LlxyXG4gICAgaWYgKG9wdGlvbnMudXBkYXRlQXNzZW1ibHkpIHtcclxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgcmVjZWl2ZXJzIHRoYXQgd2lsbCBiZSBkZWxldGVkIG9yIGFscmVhZHkgdXBkYXRlZC5cclxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBleGlzdGluZ1JlY2VpdmVycy5maWx0ZXIoXHJcbiAgICAgICAgKGV4aXN0aW5nUmVjZWl2ZXIpID0+XHJcbiAgICAgICAgICAhKG9wdGlvbnMuZGVsZXRlUmVjZWl2ZXJzIHx8IFtdKS5pbmNsdWRlcyhleGlzdGluZ1JlY2VpdmVyLnRwLmlkKSAmJlxyXG4gICAgICAgICAgIXVwZGF0ZVJlY2VpdmVycy5zb21lKFxyXG4gICAgICAgICAgICAodXBkYXRlUmVjZWl2ZXIpID0+IHVwZGF0ZVJlY2VpdmVyLnRwSWQgPT09IGV4aXN0aW5nUmVjZWl2ZXIudHAuaWRcclxuICAgICAgICAgIClcclxuICAgICAgKTtcclxuICAgICAgdXBkYXRlUmVjZWl2ZXJzID0gdXBkYXRlUmVjZWl2ZXJzLmNvbmNhdChcclxuICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVFeGlzdGluZ1JlY2VpdmVycyhleGlzdGluZywgYXNzZW1ibHlLZXkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzID1cclxuICAgICAgb3B0aW9ucy5jcmVhdGVDbGFpbWFudHMgJiZcclxuICAgICAgKGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgIG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzLm1hcCgoeCkgPT4gdGhpcy5wcmVwYXJlQ3JlYXRlQ2xhaW1hbnQoeCkpXHJcbiAgICAgICkpO1xyXG5cclxuICAgIGNvbnN0IGV4aXN0aW5nQ2xhaW1hbnRzID0gbWFwRWRnZXMoc2NlbmFyaW8uY2xhaW1hbnRzKTtcclxuICAgIGNvbnN0IHVwZGF0ZUNsYWltYW50cyA9XHJcbiAgICAgIG9wdGlvbnMudXBkYXRlQ2xhaW1hbnRzICYmXHJcbiAgICAgIChhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICBvcHRpb25zLnVwZGF0ZUNsYWltYW50cy5tYXAoKHgpID0+IHtcclxuICAgICAgICAgIC8vIEZpbmQgdGhlIGNsYWltYW50IHdlIGFyZSB1cGRhdGluZ1xyXG4gICAgICAgICAgY29uc3QgY2xhaW1hbnQgPSBleGlzdGluZ0NsYWltYW50cy5maW5kKFxyXG4gICAgICAgICAgICAoZXhpc3RpbmdDbGFpbWFudCkgPT4gZXhpc3RpbmdDbGFpbWFudC50cC5pZCA9PT0geC50cElkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVVwZGF0ZUNsYWltYW50KHgsIGNsYWltYW50LnNoYXJlZEtleS5pZCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2NlbmFyaW9JZDogb3B0aW9ucy5zY2VuYXJpb0lkLFxyXG4gICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQsXHJcbiAgICAgIHVwZGF0ZUFzc2VtYmx5LFxyXG4gICAgICBjcmVhdGVSZWNlaXZlcnMsXHJcbiAgICAgIHVwZGF0ZVJlY2VpdmVycyxcclxuICAgICAgZGVsZXRlUmVjZWl2ZXJzOiBvcHRpb25zLmRlbGV0ZVJlY2VpdmVycyxcclxuICAgICAgY3JlYXRlQ2xhaW1hbnRzLFxyXG4gICAgICB1cGRhdGVDbGFpbWFudHMsXHJcbiAgICAgIGRlbGV0ZUNsYWltYW50czogb3B0aW9ucy5kZWxldGVDbGFpbWFudHMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlUmVjZWl2ZXJEaXJlY3RvcnkoXHJcbiAgICBvcHRpb25zOiBSZWNlaXZlckRpcmVjdG9yeU9wdGlvbnMsXHJcbiAgICByZWNlaXZlclNoYXJlZEtleTogSldLLktleSxcclxuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5XHJcbiAgKSB7XHJcbiAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGJlIGJhdGNoZWRcclxuICAgIGNvbnN0IGRpcmVjdG9yeUtleSA9IGF3YWl0IHRoaXMuaXRlbTJTZXJ2aWNlLmdldERpcmVjdG9yeUtleShcclxuICAgICAgb3B0aW9ucy5kaXJlY3RvcnlJZCxcclxuICAgICAgb3B0aW9ucy5kaXJlY3RvcnlLZXlJZFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgIHJlY2VpdmVyU2hhcmVkS2V5LFxyXG4gICAgICBvcHRpb25zLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb25cclxuICAgICk7XHJcblxyXG4gICAgbGV0IHdyYXBwZWRJdGVtS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgIHJlY2VpdmVyU2hhcmVkS2V5LFxyXG4gICAgICBkaXJlY3RvcnlLZXkuandrLnRvSlNPTih0cnVlKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBUT0RPIGZldGNoIGFzc2VtYmx5S2V5SWQuIFdlIGFyZSBjaGFuZ2luZyBpdCBzdWNoIHRoYXQgdGhlcmUgaXMgYWx3YXlzIGFuIGFzc2VtYmx5XHJcbiAgICAvLyBiZWZvcmUgcmVjZWl2ZXJzIGNhbiBiZSBhZGRlZC5cclxuICAgIHdyYXBwZWRJdGVtS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgIGFzc2VtYmx5S2V5LFxyXG4gICAgICB3cmFwcGVkSXRlbUtleVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkaXJlY3RvcnlJZDogb3B0aW9ucy5kaXJlY3RvcnlJZCxcclxuICAgICAgd3JhcHBlZEl0ZW1LZXksXHJcbiAgICAgIGFjY2Vzc1JvbGU6IG9wdGlvbnMuYWNjZXNzUm9sZSxcclxuICAgICAgc2hhcmVkQ2lwaGVyRGF0YSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVDcmVhdGVSZWNlaXZlcihcclxuICAgIG9wdGlvbnM6IENyZWF0ZVJlY2VpdmVyT3B0aW9ucyxcclxuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5XHJcbiAgKSB7XHJcbiAgICBjb25zdCB7IHNoYXJlZEtleSwgbXV0YXRpb25JbnB1dCB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlUGFydGljaXBhbnQoXHJcbiAgICAgIG9wdGlvbnNcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgYWRkRGlyZWN0b3JpZXMgPVxyXG4gICAgICBvcHRpb25zLmFkZERpcmVjdG9yaWVzICYmXHJcbiAgICAgIChhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICBvcHRpb25zLmFkZERpcmVjdG9yaWVzLm1hcCgoeCkgPT5cclxuICAgICAgICAgIHRoaXMucHJlcGFyZUFkZFJlY2VpdmVyRGlyZWN0b3J5KHgsIHNoYXJlZEtleS5rZXksIGFzc2VtYmx5S2V5KVxyXG4gICAgICAgIClcclxuICAgICAgKSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ubXV0YXRpb25JbnB1dCxcclxuICAgICAgYWRkRGlyZWN0b3JpZXMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlVXBkYXRlUmVjZWl2ZXIoXHJcbiAgICBvcHRpb25zOiBVcGRhdGVSZWNlaXZlck9wdGlvbnMsXHJcbiAgICBhc3NlbWJseUtleTogSldLLktleSxcclxuICAgIGV4aXN0aW5nUmVjZWl2ZXI6IFNjZW5hcmlvUmVjZWl2ZXJOb2RlXHJcbiAgKSB7XHJcbiAgICBjb25zdCBzaGFyZWRLZXlJZCA9IGV4aXN0aW5nUmVjZWl2ZXIuc2hhcmVkS2V5LmlkO1xyXG5cclxuICAgIGNvbnN0IGRlbGV0ZURpcmVjdG9yaWVzT3B0aW9ucyA9IG9wdGlvbnMuZGVsZXRlRGlyZWN0b3JpZXMgfHwgW107XHJcbiAgICBjb25zdCB1cGRhdGVEaXJlY3Rvcmllc09wdGlvbnMgPSBvcHRpb25zLnVwZGF0ZURpcmVjdG9yaWVzIHx8IFtdO1xyXG5cclxuICAgIC8vIEZpbGwgaW4gYW55IG1pc3NpbmcgdXBkYXRlIGRpcmVjdG9yaWVzXHJcbiAgICBtYXBFZGdlcyhleGlzdGluZ1JlY2VpdmVyLnJlY2VpdmVyRGlyZWN0b3JpZXMpLmZvckVhY2goXHJcbiAgICAgIChleGlzdGluZ0RpcmVjdG9yeSkgPT4ge1xyXG4gICAgICAgIGlmIChkZWxldGVEaXJlY3Rvcmllc09wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdEaXJlY3RvcnkuZGlyZWN0b3J5LmlkKSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdXBkYXRlRGlyZWN0b3JpZXNPcHRpb25zLmZpbmQoXHJcbiAgICAgICAgICAgICh4KSA9PiB4LmRpcmVjdG9yeUlkID09PSBleGlzdGluZ0RpcmVjdG9yeS5kaXJlY3RvcnkuaWRcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVwZGF0ZURpcmVjdG9yaWVzT3B0aW9ucy5wdXNoKHtcclxuICAgICAgICAgIGFjY2Vzc1JvbGU6IGV4aXN0aW5nRGlyZWN0b3J5LmFjY2Vzc1JvbGUsXHJcbiAgICAgICAgICBkaXJlY3RvcnlJZDogZXhpc3RpbmdEaXJlY3RvcnkuZGlyZWN0b3J5LmlkLFxyXG4gICAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbjpcclxuICAgICAgICAgICAgZXhpc3RpbmdEaXJlY3Rvcnkuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbixcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCB7IHNoYXJlZEtleSwgbXV0YXRpb25JbnB1dCB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlVXBkYXRlUGFydGljaXBhbnQoXHJcbiAgICAgIG9wdGlvbnMsXHJcbiAgICAgIHNoYXJlZEtleUlkXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGFkZERpcmVjdG9yaWVzID1cclxuICAgICAgb3B0aW9ucy5hZGREaXJlY3RvcmllcyAmJlxyXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgb3B0aW9ucy5hZGREaXJlY3Rvcmllcy5tYXAoKHgpID0+XHJcbiAgICAgICAgICB0aGlzLnByZXBhcmVBZGRSZWNlaXZlckRpcmVjdG9yeSh4LCBzaGFyZWRLZXksIGFzc2VtYmx5S2V5KVxyXG4gICAgICAgIClcclxuICAgICAgKSk7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlRGlyZWN0b3JpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgdXBkYXRlRGlyZWN0b3JpZXNPcHRpb25zLm1hcCgoeCkgPT5cclxuICAgICAgICB0aGlzLnByZXBhcmVVcGRhdGVSZWNlaXZlckRpcmVjdG9yeSh4LCBzaGFyZWRLZXksIGFzc2VtYmx5S2V5KVxyXG4gICAgICApXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLm11dGF0aW9uSW5wdXQsXHJcbiAgICAgIGFkZERpcmVjdG9yaWVzLFxyXG4gICAgICB1cGRhdGVEaXJlY3RvcmllcyxcclxuICAgICAgZGVsZXRlRGlyZWN0b3JpZXM6IG9wdGlvbnMuZGVsZXRlRGlyZWN0b3JpZXMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlRXhpc3RpbmdSZWNlaXZlcihcclxuICAgIGV4aXN0aW5nUmVjZWl2ZXI6IFNjZW5hcmlvUmVjZWl2ZXJOb2RlLFxyXG4gICAgYXNzZW1ibHlLZXk6IEpXSy5LZXlcclxuICApIHtcclxuICAgIGNvbnN0IHVwZGF0ZURpcmVjdG9yaWVzID0gbWFwRWRnZXMoXHJcbiAgICAgIGV4aXN0aW5nUmVjZWl2ZXIucmVjZWl2ZXJEaXJlY3Rvcmllc1xyXG4gICAgKS5tYXAoKHJlY2VpdmVyRGlyZWN0b3J5KSA9PiAoe1xyXG4gICAgICBkaXJlY3RvcnlJZDogcmVjZWl2ZXJEaXJlY3RvcnkuZGlyZWN0b3J5LmlkLFxyXG4gICAgICBkaXJlY3RvcnlLZXlJZDogcmVjZWl2ZXJEaXJlY3RvcnkuZGlyZWN0b3J5LmtleUlkLFxyXG4gICAgICBhY2Nlc3NSb2xlOiByZWNlaXZlckRpcmVjdG9yeS5hY2Nlc3NSb2xlLFxyXG4gICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uOiByZWNlaXZlckRpcmVjdG9yeS5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uLFxyXG4gICAgfSkpO1xyXG5cclxuICAgIC8vIEZpbGwgaXQgaW4gd2l0aCBleGlzdGluZyByZWNlaXZlci5cclxuICAgIHJldHVybiB0aGlzLnByZXBhcmVVcGRhdGVSZWNlaXZlcihcclxuICAgICAge1xyXG4gICAgICAgIHRwSWQ6IGV4aXN0aW5nUmVjZWl2ZXIudHAuaWQsXHJcbiAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbjogZXhpc3RpbmdSZWNlaXZlci5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uLFxyXG4gICAgICAgIHVwZGF0ZURpcmVjdG9yaWVzLFxyXG4gICAgICB9LFxyXG4gICAgICBhc3NlbWJseUtleSxcclxuICAgICAgZXhpc3RpbmdSZWNlaXZlclxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUV4aXN0aW5nUmVjZWl2ZXJzKFxyXG4gICAgZXhpc3RpbmdSZWNlaXZlcnM6IFNjZW5hcmlvUmVjZWl2ZXJOb2RlW10sXHJcbiAgICBhc3NlbWJseUtleTogSldLLktleVxyXG4gICkge1xyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxyXG4gICAgICBleGlzdGluZ1JlY2VpdmVycy5tYXAoKGV4aXN0aW5nUmVjZWl2ZXIpID0+XHJcbiAgICAgICAgdGhpcy5wcmVwYXJlRXhpc3RpbmdSZWNlaXZlcihleGlzdGluZ1JlY2VpdmVyLCBhc3NlbWJseUtleSlcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUNyZWF0ZVBhcnRpY2lwYW50KG9wdGlvbnM6IENyZWF0ZVBhcnRpY2lwYW50T3B0aW9ucykge1xyXG4gICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0V2l0aE5ld0tleShcclxuICAgICAgb3B0aW9ucy50cFNoYXJlZEtleUlkLFxyXG4gICAgICBvcHRpb25zLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb25cclxuICAgICk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzaGFyZWRLZXksXHJcbiAgICAgIG11dGF0aW9uSW5wdXQ6IHtcclxuICAgICAgICB0cElkOiBvcHRpb25zLnRwSWQsXHJcbiAgICAgICAgdHBTaGFyZWRLZXlJZDogb3B0aW9ucy50cFNoYXJlZEtleUlkLFxyXG4gICAgICAgIHRwU2hhcmVkS2V5V3JhcHBlZFNoYXJlZEtleTogc2hhcmVkS2V5LndyYXBwZWRLZXksXHJcbiAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YTogc2hhcmVkS2V5LmNpcGhlcixcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVVcGRhdGVQYXJ0aWNpcGFudChcclxuICAgIG9wdGlvbnM6IFBhcnRpY2lwYW50T3B0aW9ucyxcclxuICAgIHNoYXJlZEtleUlkOiBzdHJpbmdcclxuICApIHtcclxuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0SndrS2V5KHNoYXJlZEtleUlkKTtcclxuXHJcbiAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgIHNoYXJlZEtleSxcclxuICAgICAgb3B0aW9ucy5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNoYXJlZEtleSxcclxuICAgICAgbXV0YXRpb25JbnB1dDoge1xyXG4gICAgICAgIHRwSWQ6IG9wdGlvbnMudHBJZCxcclxuICAgICAgICBzaGFyZWRLZXlJZCxcclxuICAgICAgICBzaGFyZWRDaXBoZXJEYXRhLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUNyZWF0ZUNsYWltYW50KG9wdGlvbnM6IENyZWF0ZUNsYWltYW50T3B0aW9ucykge1xyXG4gICAgY29uc3QgeyBtdXRhdGlvbklucHV0IH0gPSBhd2FpdCB0aGlzLnByZXBhcmVDcmVhdGVQYXJ0aWNpcGFudChvcHRpb25zKTtcclxuICAgIHJldHVybiBtdXRhdGlvbklucHV0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlVXBkYXRlQ2xhaW1hbnQoXHJcbiAgICBvcHRpb25zOiBVcGRhdGVDbGFpbWFudE9wdGlvbnMsXHJcbiAgICBzaGFyZWRLZXlJZDogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBjb25zdCB7IG11dGF0aW9uSW5wdXQgfSA9IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZVBhcnRpY2lwYW50KFxyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICBzaGFyZWRLZXlJZFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gbXV0YXRpb25JbnB1dDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHByZXBhcmVDbGFpbShzY2VuYXJpb0lkOiBzdHJpbmcsIHNoYXJlZENsYWltSWQ6IHN0cmluZykge1xyXG4gICAgLy8gR2V0IGFsbCB0aGUgc2hhcmVkIGl0ZW1zXHJcbiAgICBjb25zdCBzaGFyZWRTY2VuYXJpbyA9IChcclxuICAgICAgYXdhaXQgdGhpcy5nZXRTaGFyZWRTY2VuYXJpbyhzY2VuYXJpb0lkLCBzaGFyZWRDbGFpbUlkKVxyXG4gICAgKS5zaGFyZWRTY2VuYXJpbztcclxuXHJcbiAgICBpZiAoc2hhcmVkU2NlbmFyaW8uc3RhdGUgIT09IFNjZW5hcmlvU3RhdGUuQVBQUk9WRUQpIHtcclxuICAgICAgdGhyb3dDbGFpbU5vdEFwcHJvdmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXBwcm92YWxzID0gbWFwRWRnZXMoXHJcbiAgICAgIHNoYXJlZFNjZW5hcmlvLnNoYXJlZENsYWltLmFzQ2xhaW1SZWNlaXZlci5hcHByb3ZhbHNcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgYXNzZW1ibHlLZXkgPSBhd2FpdCB0aGlzLnJlY292ZXJBc3NlbWJseUtleShhcHByb3ZhbHMpO1xyXG4gICAgY29uc29sZS5sb2coJ3JlY2VpdmVDbGFpbU11dGF0aW9uIGFzc2VtYmx5S2V5JywgYXNzZW1ibHlLZXkpO1xyXG5cclxuICAgIC8vIERlY3J5cHQgYWxsIGl0ZW1zXHJcbiAgICBjb25zdCByZWNlaXZlckRpcmVjdG9yaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHNoYXJlZFNjZW5hcmlvLmFzUmVjZWl2ZXIucmVjZWl2ZXJEaXJlY3Rvcmllcy5lZGdlc1xyXG4gICAgICAgIC5tYXAoKGVkZ2UpID0+IGVkZ2Uubm9kZSlcclxuICAgICAgICAubWFwKGFzeW5jIChyZWNlaXZlckRpcmVjdG9yeSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgd3JhcHBlZEl0ZW1LZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXHJcbiAgICAgICAgICAgIGFzc2VtYmx5S2V5LFxyXG4gICAgICAgICAgICByZWNlaXZlckRpcmVjdG9yeS53cmFwcGVkSXRlbUtleVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZWNlaXZlckRpcmVjdG9yeUlkOiByZWNlaXZlckRpcmVjdG9yeS5pZCxcclxuICAgICAgICAgICAgcmVjZWl2ZXJTaGFyZWRLZXlXcmFwcGVkSXRlbUtleTogd3JhcHBlZEl0ZW1LZXksIC8vIHRoZSB3cmFwcGVkSXRlbUtleSBpcyBhbHJlYWR5IHdyYXBwZWQgYnkgcmVjZWl2ZXJTaGFyZWRLZXlcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2NlbmFyaW9DbGFpbUlkOiBzaGFyZWRDbGFpbUlkLFxyXG4gICAgICByZWNlaXZlckRpcmVjdG9yaWVzLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlckFzc2VtYmx5S2V5KFxyXG4gICAgYXBwcm92YWxzOiBTaGFyZWRTY2VuYXJpb0NsYWltUmVjZWl2ZWRBcHByb3ZhbE5vZGVbXVxyXG4gICkge1xyXG4gICAgY29uc3QgcGFydGlhbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgYXBwcm92YWxzLm1hcCgoYXBwcm92YWwpID0+XHJcbiAgICAgICAgdGhpcy5rZXlHcmFwaC5kZWNyeXB0RnJvbVN0cmluZzxQYXJ0aWFsQXNzZW1ibHlLZXk+KFxyXG4gICAgICAgICAgYXBwcm92YWwucHhrLmlkLFxyXG4gICAgICAgICAgYXBwcm92YWwucmVjZWl2ZXJDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXlcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYXNzZW1ibHlDb250cm9sbGVyLnJlY292ZXJBc3NlbWJseUtleShwYXJ0aWFscyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGFzQ2xhaW1BcHByb3ZlcnMoXHJcbiAgICBzaGFyZWRTY2VuYXJpb0lkLFxyXG4gICAgY2xhaW1JZCxcclxuICAgIHN0YXRlOiBUcENsYWltQXBwcm92ZXJTdGF0ZVxyXG4gICkge1xyXG4gICAgY29uc3Qgc2hhcmVkU2NlbmFyaW8gPSAoXHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0U2hhcmVkU2NlbmFyaW8oc2hhcmVkU2NlbmFyaW9JZCwgY2xhaW1JZClcclxuICAgICkuc2hhcmVkU2NlbmFyaW87XHJcblxyXG4gICAgcmV0dXJuIG1hcEVkZ2VzKHNoYXJlZFNjZW5hcmlvLnNoYXJlZENsYWltLmNsYWltLmFzQ2xhaW1BcHByb3ZlcnMpLmZpbHRlcihcclxuICAgICAgKGFzQ2xhaW1BcHByb3ZlcikgPT4gYXNDbGFpbUFwcHJvdmVyLnN0YXRlID09PSBzdGF0ZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUFwcHJvdmVDbGFpbU11dGF0aW9ucyhcclxuICAgIHNoYXJlZFNjZW5hcmlvSWQ6IHN0cmluZyxcclxuICAgIGNsYWltSWQ6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgLy8gVGhlIGN1cnJlbnQgdXNlciBtYXkgYmUgYWN0aW5nIGFzIGFwcHJvdmVycyBpbiBtdWx0aXBsZSBzdWItYXNzZW1ibGllcyBzb1xyXG4gICAgLy8gd2UgYXBwcm92ZSB0aGVtIGFsbC5cclxuICAgIGNvbnN0IGFzQ2xhaW1BcHByb3ZlcnMgPSBhd2FpdCB0aGlzLmFzQ2xhaW1BcHByb3ZlcnMoXHJcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXHJcbiAgICAgIGNsYWltSWQsXHJcbiAgICAgIFRwQ2xhaW1BcHByb3ZlclN0YXRlLkNMQUlNRURcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIGFzQ2xhaW1BcHByb3ZlcnMubWFwKFxyXG4gICAgICBhc3luYyAoYXNDbGFpbUFwcHJvdmVyKSA9PlxyXG4gICAgICAgIG5ldyBMck11dGF0aW9uKHtcclxuICAgICAgICAgIG11dGF0aW9uOiBBcHByb3ZlU2NlbmFyaW9DbGFpbU11dGF0aW9uLFxyXG4gICAgICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgICAgIGlucHV0OiBhd2FpdCB0aGlzLnByZXBhcmVBcHByb3ZlQ2xhaW0oYXNDbGFpbUFwcHJvdmVyKSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVBcHByb3ZlQ2xhaW0oXHJcbiAgICBhc0NsYWltQXBwcm92ZXI6IFNoYXJlZFRwQ2xhaW1BcHByb3Zlck5vZGVcclxuICApIHtcclxuICAgIGNvbnN0IHJlY2VpdmVyQXBwcm92YWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIG1hcEVkZ2VzKGFzQ2xhaW1BcHByb3Zlci5yZWNlaXZlckFwcHJvdmFscykubWFwKChyZWNlaXZlckFwcHJvdmFsKSA9PlxyXG4gICAgICAgIHRoaXMucHJlcGFyZVJlY2VpdmVyQXBwcm92YWwoe1xyXG4gICAgICAgICAgcmVjZWl2ZXJBcHByb3ZhbElkOiByZWNlaXZlckFwcHJvdmFsLmlkLFxyXG4gICAgICAgICAgcmVjZWl2ZXJBcHByb3ZhbFB4a0lkOiByZWNlaXZlckFwcHJvdmFsLnB4ay5pZCxcclxuICAgICAgICAgIHNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleUNsZWFySnNvbjpcclxuICAgICAgICAgICAgYXNDbGFpbUFwcHJvdmVyLnNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleUNsZWFySnNvbixcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNsYWltQXBwcm92ZXJJZDogYXNDbGFpbUFwcHJvdmVyLmlkLFxyXG4gICAgICByZWNlaXZlckFwcHJvdmFscyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWNlaXZlckFwcHJvdmFsKG9wdGlvbnM6IHtcclxuICAgIHJlY2VpdmVyQXBwcm92YWxJZDogc3RyaW5nO1xyXG4gICAgcmVjZWl2ZXJBcHByb3ZhbFB4a0lkOiBzdHJpbmc7XHJcbiAgICBzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXlDbGVhckpzb246IGFueTtcclxuICB9KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZWNlaXZlckFwcHJvdmFsSWQ6IG9wdGlvbnMucmVjZWl2ZXJBcHByb3ZhbElkLFxyXG4gICAgICAvLyBUT0RPIGFsbG93IHNlbmRpbmcgb2YgbWVzc2FnZXMgdG8gcmVjZWl2ZXIuXHJcbiAgICAgIHJlY2VpdmVyQ2lwaGVyOiAnJyxcclxuICAgICAgcmVjZWl2ZXJDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXk6IGF3YWl0IHRoaXMua2V5R3JhcGguZW5jcnlwdFRvU3RyaW5nKFxyXG4gICAgICAgIG9wdGlvbnMucmVjZWl2ZXJBcHByb3ZhbFB4a0lkLFxyXG4gICAgICAgIG9wdGlvbnMuc2hhcmVkQ2lwaGVyUGFydGlhbEFzc2VtYmx5S2V5Q2xlYXJKc29uXHJcbiAgICAgICksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlUmVqZWN0Q2xhaW1NdXRhdGlvbnMoXHJcbiAgICBzaGFyZWRTY2VuYXJpb0lkOiBzdHJpbmcsXHJcbiAgICBjbGFpbUlkOiBzdHJpbmdcclxuICApIHtcclxuICAgIC8vIFRoZSBjdXJyZW50IHVzZXIgbWF5IGJlIGFjdGluZyBhcyBhcHByb3ZlcnMgaW4gbXVsdGlwbGUgc3ViLWFzc2VtYmxpZXMgc29cclxuICAgIC8vIHdlIHJlamVjdCB0aGVtIGFsbC5cclxuICAgIGNvbnN0IGFzQ2xhaW1BcHByb3ZlcnMgPSBhd2FpdCB0aGlzLmFzQ2xhaW1BcHByb3ZlcnMoXHJcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXHJcbiAgICAgIGNsYWltSWQsXHJcbiAgICAgIFRwQ2xhaW1BcHByb3ZlclN0YXRlLkNMQUlNRURcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIGFzQ2xhaW1BcHByb3ZlcnMubWFwKFxyXG4gICAgICBhc3luYyAoYXNDbGFpbUFwcHJvdmVyKSA9PlxyXG4gICAgICAgIG5ldyBMck11dGF0aW9uKHtcclxuICAgICAgICAgIG11dGF0aW9uOiBSZWplY3RTY2VuYXJpb0NsYWltTXV0YXRpb24sXHJcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICAgICAgaW5wdXQ6IHsgY2xhaW1BcHByb3ZlcklkOiBhc0NsYWltQXBwcm92ZXIuaWQgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==