@lifeready/core 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -62
- package/bundles/lifeready-core.umd.js +15445 -15445
- package/bundles/lifeready-core.umd.js.map +1 -1
- package/bundles/lifeready-core.umd.min.js.map +1 -1
- package/esm2015/lib/_common/ast.js +40 -40
- package/esm2015/lib/_common/deferred-promise.js +24 -24
- package/esm2015/lib/_common/exceptions.js +157 -157
- package/esm2015/lib/_common/queries.gql.js +190 -190
- package/esm2015/lib/_common/run-outside-angular.js +79 -79
- package/esm2015/lib/_common/types.js +1 -1
- package/esm2015/lib/_common/utils.js +44 -44
- package/esm2015/lib/api/contact-card.gql.js +79 -79
- package/esm2015/lib/api/contact-card.service.js +154 -154
- package/esm2015/lib/api/contact-card2.gql.js +60 -60
- package/esm2015/lib/api/contact-card2.service.js +103 -103
- package/esm2015/lib/api/file.service.js +74 -74
- package/esm2015/lib/api/item2.gql.js +110 -110
- package/esm2015/lib/api/item2.service.js +311 -311
- package/esm2015/lib/api/key-exchange.gql.js +188 -188
- package/esm2015/lib/api/key-exchange.service.js +442 -442
- package/esm2015/lib/api/key-exchange.types.js +18 -18
- package/esm2015/lib/api/key-exchange2.gql.js +171 -171
- package/esm2015/lib/api/key-exchange2.service.js +479 -479
- package/esm2015/lib/api/lock.gql.js +40 -40
- package/esm2015/lib/api/lock.service.js +64 -64
- package/esm2015/lib/api/lr-apollo.service.js +46 -46
- package/esm2015/lib/api/lr-graphql/index.js +6 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -155
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -213
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -48
- package/esm2015/lib/api/lr-graphql/lr.service.js +18 -18
- package/esm2015/lib/api/message.service.js +138 -138
- package/esm2015/lib/api/persist.service.js +181 -181
- package/esm2015/lib/api/query-processor/common-processors.service.js +93 -93
- package/esm2015/lib/api/query-processor/index.js +3 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +192 -192
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -109
- package/esm2015/lib/api/shared-contact-card.service.js +119 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +41 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +117 -117
- package/esm2015/lib/api/time.service.js +146 -146
- package/esm2015/lib/api/types/graphql.types.js +7 -7
- package/esm2015/lib/api/types/index.js +3 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +71 -71
- package/esm2015/lib/auth/auth.config.js +57 -57
- package/esm2015/lib/auth/auth.gql.js +48 -48
- package/esm2015/lib/auth/auth.types.js +27 -27
- package/esm2015/lib/auth/idle.service.js +168 -168
- package/esm2015/lib/auth/idle.types.js +7 -7
- package/esm2015/lib/auth/lbop.service.js +355 -355
- package/esm2015/lib/auth/life-ready-auth.service.js +500 -500
- package/esm2015/lib/auth/password.service.js +320 -320
- package/esm2015/lib/auth/register.service.js +172 -172
- package/esm2015/lib/auth/two-factor.service.js +74 -74
- package/esm2015/lib/category/category-meta.service.js +99 -99
- package/esm2015/lib/category/category.gql.js +406 -406
- package/esm2015/lib/category/category.service.js +390 -390
- package/esm2015/lib/category/category.types.js +29 -29
- package/esm2015/lib/cryptography/cryptography.types.js +11 -11
- package/esm2015/lib/cryptography/encryption.service.js +189 -189
- package/esm2015/lib/cryptography/key-factory.service.js +237 -237
- package/esm2015/lib/cryptography/key-graph.service.js +280 -280
- package/esm2015/lib/cryptography/key-meta.service.js +200 -200
- package/esm2015/lib/cryptography/key.service.js +124 -124
- package/esm2015/lib/cryptography/slip39.service.js +169 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +29 -29
- package/esm2015/lib/life-ready.config.js +84 -84
- package/esm2015/lib/life-ready.module.js +74 -74
- package/esm2015/lib/plan/plan.gql.js +123 -123
- package/esm2015/lib/plan/plan.service.js +149 -149
- package/esm2015/lib/plan/plan.types.js +11 -11
- package/esm2015/lib/record/record-attachment.service.js +101 -101
- package/esm2015/lib/record/record.gql.js +179 -179
- package/esm2015/lib/record/record.service.js +206 -206
- package/esm2015/lib/record/record.types.js +15 -15
- package/esm2015/lib/record-type/record-type.service.js +75 -75
- package/esm2015/lib/record-type/record-type.types.js +28 -28
- package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -105
- package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -1
- package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -300
- package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -52
- package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -97
- package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -1
- package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -150
- package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -229
- package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -1
- package/esm2015/lib/scenario/scenario-setup.service.js +269 -269
- package/esm2015/lib/scenario/scenario.gql.js +368 -368
- package/esm2015/lib/scenario/scenario.service.js +611 -611
- package/esm2015/lib/scenario/scenario.types.js +64 -64
- package/esm2015/lib/search/search.gql.js +62 -62
- package/esm2015/lib/search/search.service.js +156 -156
- package/esm2015/lib/search/search.types.js +6 -6
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -112
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +129 -129
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +4 -4
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -232
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +299 -299
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -215
- package/esm2015/lib/users/profile-details.service.js +214 -214
- package/esm2015/lib/users/profile.gql.js +97 -97
- package/esm2015/lib/users/profile.service.js +169 -169
- package/esm2015/lib/users/profile.types.js +34 -34
- package/esm2015/lib/users/user.gql.js +60 -60
- package/esm2015/lib/users/user.service.js +79 -79
- package/esm2015/lib/users/user.types.js +5 -5
- package/esm2015/lifeready-core.js +10 -10
- package/esm2015/public-api.js +81 -81
- package/fesm2015/lifeready-core.js +13088 -13088
- package/fesm2015/lifeready-core.js.map +1 -1
- package/lib/_common/ast.d.ts +11 -11
- package/lib/_common/deferred-promise.d.ts +12 -12
- package/lib/_common/exceptions.d.ts +109 -109
- package/lib/_common/queries.gql.d.ts +10 -10
- package/lib/_common/run-outside-angular.d.ts +14 -14
- package/lib/_common/types.d.ts +10 -10
- package/lib/_common/utils.d.ts +3 -3
- package/lib/api/contact-card.gql.d.ts +7 -7
- package/lib/api/contact-card.service.d.ts +52 -52
- package/lib/api/contact-card2.gql.d.ts +34 -34
- package/lib/api/contact-card2.service.d.ts +49 -49
- package/lib/api/file.service.d.ts +18 -18
- package/lib/api/item2.gql.d.ts +96 -96
- package/lib/api/item2.service.d.ts +177 -177
- package/lib/api/key-exchange.gql.d.ts +9 -9
- package/lib/api/key-exchange.service.d.ts +39 -39
- package/lib/api/key-exchange.types.d.ts +196 -196
- package/lib/api/key-exchange2.gql.d.ts +125 -125
- package/lib/api/key-exchange2.service.d.ts +187 -187
- package/lib/api/lock.gql.d.ts +27 -27
- package/lib/api/lock.service.d.ts +25 -25
- package/lib/api/lr-apollo.service.d.ts +15 -15
- package/lib/api/lr-graphql/index.d.ts +5 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -60
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -27
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +8 -8
- package/lib/api/lr-graphql/lr.service.d.ts +9 -9
- package/lib/api/message.service.d.ts +58 -58
- package/lib/api/persist.service.d.ts +31 -31
- package/lib/api/query-processor/common-processors.service.d.ts +36 -36
- package/lib/api/query-processor/index.d.ts +2 -2
- package/lib/api/query-processor/query-processor.service.d.ts +18 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -15
- package/lib/api/shared-contact-card.service.d.ts +33 -33
- package/lib/api/shared-contact-card2.gql.d.ts +36 -36
- package/lib/api/shared-contact-card2.service.d.ts +45 -45
- package/lib/api/time.service.d.ts +16 -16
- package/lib/api/types/graphql.types.d.ts +29 -29
- package/lib/api/types/index.d.ts +2 -2
- package/lib/api/types/lr-graphql.types.d.ts +385 -385
- package/lib/auth/auth.config.d.ts +5 -5
- package/lib/auth/auth.gql.d.ts +15 -15
- package/lib/auth/auth.types.d.ts +66 -66
- package/lib/auth/idle.service.d.ts +40 -40
- package/lib/auth/idle.types.d.ts +10 -10
- package/lib/auth/lbop.service.d.ts +91 -91
- package/lib/auth/life-ready-auth.service.d.ts +59 -59
- package/lib/auth/password.service.d.ts +78 -78
- package/lib/auth/register.service.d.ts +25 -25
- package/lib/auth/two-factor.service.d.ts +15 -15
- package/lib/category/category-meta.service.d.ts +23 -23
- package/lib/category/category.gql.d.ts +45 -45
- package/lib/category/category.service.d.ts +67 -67
- package/lib/category/category.types.d.ts +79 -79
- package/lib/cryptography/cryptography.types.d.ts +83 -83
- package/lib/cryptography/encryption.service.d.ts +41 -41
- package/lib/cryptography/key-factory.service.d.ts +38 -38
- package/lib/cryptography/key-graph.service.d.ts +33 -33
- package/lib/cryptography/key-meta.service.d.ts +44 -44
- package/lib/cryptography/key.service.d.ts +36 -36
- package/lib/cryptography/slip39.service.d.ts +43 -43
- package/lib/cryptography/web-crypto.service.d.ts +5 -5
- package/lib/life-ready.config.d.ts +14 -14
- package/lib/life-ready.module.d.ts +5 -5
- package/lib/plan/plan.gql.d.ts +11 -11
- package/lib/plan/plan.service.d.ts +33 -33
- package/lib/plan/plan.types.d.ts +31 -31
- package/lib/record/record-attachment.service.d.ts +16 -16
- package/lib/record/record.gql.d.ts +14 -14
- package/lib/record/record.service.d.ts +25 -25
- package/lib/record/record.types.d.ts +57 -57
- package/lib/record-type/record-type.service.d.ts +11 -11
- package/lib/record-type/record-type.types.d.ts +50 -50
- package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -7
- package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -63
- package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -32
- package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -5
- package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -17
- package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -18
- package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -8
- package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -30
- package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -54
- package/lib/scenario/scenario-setup.service.d.ts +22 -22
- package/lib/scenario/scenario.gql.d.ts +34 -34
- package/lib/scenario/scenario.service.d.ts +58 -58
- package/lib/scenario/scenario.types.d.ts +217 -217
- package/lib/search/search.gql.d.ts +1 -1
- package/lib/search/search.service.d.ts +25 -25
- package/lib/search/search.types.d.ts +20 -20
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -20
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +35 -35
- package/lib/trusted-parties/tp-password-reset.constants.d.ts +3 -3
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -218
- package/lib/trusted-parties/tp-password-reset.service.d.ts +130 -130
- package/lib/trusted-parties/trusted-party.gql.d.ts +9 -9
- package/lib/trusted-parties/trusted-party.service.d.ts +44 -44
- package/lib/trusted-parties/trusted-party.types.d.ts +102 -102
- package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -79
- package/lib/trusted-parties/trusted-party2.service.d.ts +114 -114
- package/lib/users/profile-details.service.d.ts +21 -21
- package/lib/users/profile.gql.d.ts +11 -11
- package/lib/users/profile.service.d.ts +35 -35
- package/lib/users/profile.types.d.ts +96 -96
- package/lib/users/user.gql.d.ts +9 -9
- package/lib/users/user.service.d.ts +12 -12
- package/lib/users/user.types.d.ts +23 -23
- package/lifeready-core.d.ts +9 -9
- package/package.json +1 -1
- package/public-api.d.ts +77 -77
|
@@ -1,326 +1,326 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import { KeyExchangeService } from '../api/key-exchange.service';
|
|
5
|
-
import { LrApolloService } from '../api/lr-apollo.service';
|
|
6
|
-
import { SharedContactCardService } from '../api/shared-contact-card.service';
|
|
7
|
-
import { LifeReadyAuthService } from '../auth/life-ready-auth.service';
|
|
8
|
-
import { EncryptionService } from '../cryptography/encryption.service';
|
|
9
|
-
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
10
|
-
import { KeyService } from '../cryptography/key.service';
|
|
11
|
-
import { UserService } from '../users/user.service';
|
|
12
|
-
import { ContactCardName } from '../users/profile.types';
|
|
13
|
-
import { CancelTrustedPartyInvitationMutation, DeclineTrustedPartyInvitationMutation, DeleteTrustedPartyMutation, GetAllTrustedPartiesQuery, GetTrustedPartiesQuery, GetTrustedPartyQuery, ShareCategoryMutation, UnshareCategoryMutation, } from './trusted-party.gql';
|
|
14
|
-
import { TrustedPartyInviteStatus, TrustedPartyType, TrustedPartyRoleType, } from './trusted-party.types';
|
|
15
|
-
import { KeyFactoryService } from '../cryptography/key-factory.service';
|
|
16
|
-
import * as i0 from "@angular/core";
|
|
17
|
-
import * as i1 from "@angular/common/http";
|
|
18
|
-
import * as i2 from "../api/lr-apollo.service";
|
|
19
|
-
import * as i3 from "../api/shared-contact-card.service";
|
|
20
|
-
import * as i4 from "../users/user.service";
|
|
21
|
-
import * as i5 from "../auth/life-ready-auth.service";
|
|
22
|
-
import * as i6 from "../api/key-exchange.service";
|
|
23
|
-
import * as i7 from "../cryptography/key-graph.service";
|
|
24
|
-
import * as i8 from "../cryptography/key.service";
|
|
25
|
-
import * as i9 from "../cryptography/key-factory.service";
|
|
26
|
-
import * as i10 from "../cryptography/encryption.service";
|
|
27
|
-
export class TrustedPartyService {
|
|
28
|
-
constructor(http, lrApollo, sharedContactCardService, userService, authService, keyExchangeService, keyGraphService, keyService, keyFactory, encryptionService) {
|
|
29
|
-
this.http = http;
|
|
30
|
-
this.lrApollo = lrApollo;
|
|
31
|
-
this.sharedContactCardService = sharedContactCardService;
|
|
32
|
-
this.userService = userService;
|
|
33
|
-
this.authService = authService;
|
|
34
|
-
this.keyExchangeService = keyExchangeService;
|
|
35
|
-
this.keyGraphService = keyGraphService;
|
|
36
|
-
this.keyService = keyService;
|
|
37
|
-
this.keyFactory = keyFactory;
|
|
38
|
-
this.encryptionService = encryptionService;
|
|
39
|
-
}
|
|
40
|
-
getTrustedParties() {
|
|
41
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
-
const { tps } = yield this.lrApollo.query({
|
|
43
|
-
query: GetTrustedPartiesQuery,
|
|
44
|
-
});
|
|
45
|
-
return yield Promise.all(tps.edges.map((x) => this.mapTrustedParty(x.node)));
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
getAllTrustedParties() {
|
|
49
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
-
const user = yield this.authService.getUser();
|
|
51
|
-
const { tps, invites, sentInvites } = yield this.lrApollo.query({
|
|
52
|
-
query: GetAllTrustedPartiesQuery,
|
|
53
|
-
variables: {
|
|
54
|
-
userId: user.id,
|
|
55
|
-
isExpired: false,
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
return {
|
|
59
|
-
parties: (yield Promise.all(tps.edges.map((x) => this.mapTrustedParty(x.node)))).filter((x) => x),
|
|
60
|
-
invites: (yield Promise.all(invites.edges.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
-
return this.mapInvite(yield this.keyExchangeService.decryptKeyExchange(x.node));
|
|
62
|
-
}))))
|
|
63
|
-
.filter((x) => x.status !== TrustedPartyInviteStatus.Completed)
|
|
64
|
-
.filter((x) => x.status !== TrustedPartyInviteStatus.Invited || x.actionRequired),
|
|
65
|
-
sentInvites: (yield Promise.all(sentInvites.edges.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
66
|
-
return this.mapInvite(yield this.keyExchangeService.decryptKeyExchange(x.node));
|
|
67
|
-
})))).filter((x) => x.status !== TrustedPartyInviteStatus.Completed),
|
|
68
|
-
};
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
getTrustedParty(partyId) {
|
|
72
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
-
const { tp } = yield this.lrApollo.query({
|
|
74
|
-
query: GetTrustedPartyQuery,
|
|
75
|
-
variables: { partyId },
|
|
76
|
-
});
|
|
77
|
-
return yield this.mapTrustedParty(tp);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
getTrustedPartyRoles(roleType = TrustedPartyRoleType.General) {
|
|
81
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
-
if (!this.trustedPartyRoles) {
|
|
83
|
-
this.trustedPartyRoles = yield this.http
|
|
84
|
-
.get('/assets/meta/trusted-party-roles.json')
|
|
85
|
-
.toPromise();
|
|
86
|
-
}
|
|
87
|
-
return Promise.resolve(this.trustedPartyRoles.filter((x) => x.roleType === roleType));
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
findByEmail(email) {
|
|
91
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
-
try {
|
|
93
|
-
const user = yield this.userService.getUserByEmail(email);
|
|
94
|
-
return user
|
|
95
|
-
? {
|
|
96
|
-
id: user.id,
|
|
97
|
-
email,
|
|
98
|
-
username: user.username,
|
|
99
|
-
isTrustedParty: user.haveTp,
|
|
100
|
-
isMe: user.isCurrentUser,
|
|
101
|
-
}
|
|
102
|
-
: null;
|
|
103
|
-
}
|
|
104
|
-
catch (e) {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
inviteTrustedParty(invite) {
|
|
110
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
-
const params = {
|
|
112
|
-
responderUsername: invite.party.username,
|
|
113
|
-
email: invite.party.email,
|
|
114
|
-
message: {
|
|
115
|
-
name: invite.party.name,
|
|
116
|
-
email: invite.party.email,
|
|
117
|
-
message: invite.party.message,
|
|
118
|
-
permissions: invite.permissions,
|
|
119
|
-
},
|
|
120
|
-
contactCard: {
|
|
121
|
-
plainOwnerCipherDataJson: null,
|
|
122
|
-
plainSharedCipherDataJson: invite.mySharedDetails,
|
|
123
|
-
ownerPlainData: {
|
|
124
|
-
name: new ContactCardName(invite.mySharedDetails.name),
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
yield this.keyExchangeService.initiateOtk(params);
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
cancelInvitation(inviteId) {
|
|
132
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
-
yield this.lrApollo.mutate({
|
|
134
|
-
mutation: CancelTrustedPartyInvitationMutation,
|
|
135
|
-
variables: {
|
|
136
|
-
input: {
|
|
137
|
-
id: inviteId,
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
getInvitation(inviteId, inviteToken, key) {
|
|
144
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
-
const exchange = yield this.keyExchangeService.getKeyExchange(inviteId, {
|
|
146
|
-
token: inviteToken,
|
|
147
|
-
otKeyK: key,
|
|
148
|
-
});
|
|
149
|
-
return this.mapInvite(exchange);
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
acceptInvitation(invite) {
|
|
153
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
-
const params = {
|
|
155
|
-
id: invite.inviteId,
|
|
156
|
-
token: invite.inviteToken,
|
|
157
|
-
decryptedOtk: invite.decryptedOtk,
|
|
158
|
-
initiatorContactCard: null,
|
|
159
|
-
responderContactCard: {
|
|
160
|
-
plainOwnerCipherDataJson: null,
|
|
161
|
-
plainSharedCipherDataJson: invite.mySharedDetails,
|
|
162
|
-
ownerPlainData: {
|
|
163
|
-
name: new ContactCardName(invite.mySharedDetails.name),
|
|
164
|
-
},
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
const { tp } = yield this.keyExchangeService.respondOtk(params);
|
|
168
|
-
return tp.id;
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
declineInvitation(inviteId, inviteToken) {
|
|
172
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
-
yield this.lrApollo.mutate({
|
|
174
|
-
mutation: DeclineTrustedPartyInvitationMutation,
|
|
175
|
-
variables: {
|
|
176
|
-
input: {
|
|
177
|
-
id: inviteId,
|
|
178
|
-
token: inviteToken,
|
|
179
|
-
},
|
|
180
|
-
},
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
confirmInvitation(confirm) {
|
|
185
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
186
|
-
const { tp } = yield this.keyExchangeService.completeOtk(confirm.inviteId, confirm.initiatorRootKeyCipher, confirm.initiatorOneTimePbkCipher, null);
|
|
187
|
-
return tp.id;
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
removeTrustedParty(partyId) {
|
|
191
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
192
|
-
yield this.lrApollo.mutate({
|
|
193
|
-
mutation: DeleteTrustedPartyMutation,
|
|
194
|
-
variables: {
|
|
195
|
-
input: {
|
|
196
|
-
id: partyId,
|
|
197
|
-
},
|
|
198
|
-
},
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
setCategoryAccessLevel(categoryId, keyId, trustedParty, accessLevel) {
|
|
203
|
-
return accessLevel
|
|
204
|
-
? this.shareDirectory(categoryId, keyId, trustedParty, accessLevel)
|
|
205
|
-
: this.unshareDirectory(categoryId, trustedParty.id);
|
|
206
|
-
}
|
|
207
|
-
setRecordAccessLevel(recordId, keyId, trustedParty, accessLevel) {
|
|
208
|
-
return accessLevel
|
|
209
|
-
? this.shareDirectory(recordId, keyId, trustedParty, accessLevel)
|
|
210
|
-
: this.unshareDirectory(recordId, trustedParty.id);
|
|
211
|
-
}
|
|
212
|
-
shareDirectory(directoryId, keyId, trustedParty, accessLevel) {
|
|
213
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
214
|
-
const key = yield this.keyGraphService.getKey(keyId);
|
|
215
|
-
const wrappingKey = yield this.keyGraphService.getKey(trustedParty.userSharedKey.sharedKey.id);
|
|
216
|
-
const wrappedKey = yield this.encryptionService.encrypt(wrappingKey.jwk, key.jwk.toJSON(true));
|
|
217
|
-
yield this.lrApollo.mutate({
|
|
218
|
-
mutation: ShareCategoryMutation,
|
|
219
|
-
variables: {
|
|
220
|
-
input: {
|
|
221
|
-
id: directoryId,
|
|
222
|
-
tpId: trustedParty.id,
|
|
223
|
-
accessRole: accessLevel,
|
|
224
|
-
keyId: key.id,
|
|
225
|
-
wrappingKeyId: wrappingKey.id,
|
|
226
|
-
wrappedKey: JSON.stringify(wrappedKey),
|
|
227
|
-
},
|
|
228
|
-
},
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
unshareDirectory(directoryId, trustedPartyId) {
|
|
233
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
234
|
-
yield this.lrApollo.mutate({
|
|
235
|
-
mutation: UnshareCategoryMutation,
|
|
236
|
-
variables: {
|
|
237
|
-
input: {
|
|
238
|
-
id: directoryId,
|
|
239
|
-
tpId: trustedPartyId,
|
|
240
|
-
},
|
|
241
|
-
},
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
mapTrustedParty(tp) {
|
|
246
|
-
var _a;
|
|
247
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
248
|
-
try {
|
|
249
|
-
const contactCard = tp.sharedContactCard &&
|
|
250
|
-
(yield this.sharedContactCardService.decryptTrustedPartyDetails(tp.sharedContactCard));
|
|
251
|
-
const myContactCard = tp.myContactCard &&
|
|
252
|
-
(yield this.sharedContactCardService.decryptSharedTrustedPartyDetails(tp.myContactCard));
|
|
253
|
-
return {
|
|
254
|
-
id: tp.id,
|
|
255
|
-
type: TrustedPartyType.User,
|
|
256
|
-
hasScenarios: !!tp.sharedScenarios.edges.length,
|
|
257
|
-
hasSharedVault: !!tp.sharedItems.directories.edges.length,
|
|
258
|
-
name: contactCard && contactCard.name && contactCard.name.name,
|
|
259
|
-
details: contactCard,
|
|
260
|
-
mySharedDetails: myContactCard,
|
|
261
|
-
userSharedKey: tp.currentUserSharedKey.userSharedKey,
|
|
262
|
-
username: tp.other.username,
|
|
263
|
-
features: {
|
|
264
|
-
sharedVault: {
|
|
265
|
-
hasAccess: (((_a = tp.other.features) === null || _a === void 0 ? void 0 : _a.shareVault) || ['noaccess'])[0] === 'access',
|
|
266
|
-
},
|
|
267
|
-
},
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
catch (e) {
|
|
271
|
-
console.error('Failed to decrypt Trusted Party.', e, tp);
|
|
272
|
-
return null;
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
mapInvite(exchange) {
|
|
277
|
-
var _a, _b;
|
|
278
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
279
|
-
const contactCard = exchange.contactCard;
|
|
280
|
-
const name = exchange.isInitiator
|
|
281
|
-
? (_a = exchange.myMessage) === null || _a === void 0 ? void 0 : _a.name : contactCard && contactCard.name && contactCard.name.name;
|
|
282
|
-
const email = exchange.isInitiator
|
|
283
|
-
? (_b = exchange.myMessage) === null || _b === void 0 ? void 0 : _b.email : (contactCard && contactCard.email) || exchange.responderEmailAddress;
|
|
284
|
-
return {
|
|
285
|
-
id: exchange.id,
|
|
286
|
-
type: TrustedPartyType.User,
|
|
287
|
-
status: exchange.state,
|
|
288
|
-
token: exchange.token,
|
|
289
|
-
tokenExpiry: exchange.tokenExpiryTime,
|
|
290
|
-
decryptedOtk: exchange.decryptedOtk,
|
|
291
|
-
name,
|
|
292
|
-
email,
|
|
293
|
-
isSender: exchange.isInitiator,
|
|
294
|
-
actionRequired: exchange.isInitiator
|
|
295
|
-
? exchange.initiatorActionRequired
|
|
296
|
-
: exchange.responderActionRequired,
|
|
297
|
-
rootKeyCipher: exchange.initiatorRootKeyCipher,
|
|
298
|
-
pbkCipher: exchange.otk.initiatorOneTimePbkCipher,
|
|
299
|
-
isExpired: exchange.isExpired,
|
|
300
|
-
details: contactCard,
|
|
301
|
-
message: exchange.message,
|
|
302
|
-
mySharedDetails: exchange.myContactCard,
|
|
303
|
-
mySharedMessage: exchange.myMessage,
|
|
304
|
-
};
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
TrustedPartyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TrustedPartyService_Factory() { return new TrustedPartyService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.LrApolloService), i0.ɵɵinject(i3.SharedContactCardService), i0.ɵɵinject(i4.UserService), i0.ɵɵinject(i5.LifeReadyAuthService), i0.ɵɵinject(i6.KeyExchangeService), i0.ɵɵinject(i7.KeyGraphService), i0.ɵɵinject(i8.KeyService), i0.ɵɵinject(i9.KeyFactoryService), i0.ɵɵinject(i10.EncryptionService)); }, token: TrustedPartyService, providedIn: "root" });
|
|
309
|
-
TrustedPartyService.decorators = [
|
|
310
|
-
{ type: Injectable, args: [{
|
|
311
|
-
providedIn: 'root',
|
|
312
|
-
},] }
|
|
313
|
-
];
|
|
314
|
-
TrustedPartyService.ctorParameters = () => [
|
|
315
|
-
{ type: HttpClient },
|
|
316
|
-
{ type: LrApolloService },
|
|
317
|
-
{ type: SharedContactCardService },
|
|
318
|
-
{ type: UserService },
|
|
319
|
-
{ type: LifeReadyAuthService },
|
|
320
|
-
{ type: KeyExchangeService },
|
|
321
|
-
{ type: KeyGraphService },
|
|
322
|
-
{ type: KeyService },
|
|
323
|
-
{ type: KeyFactoryService },
|
|
324
|
-
{ type: EncryptionService }
|
|
325
|
-
];
|
|
326
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1wYXJ0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi90cnVzdGVkLXBhcnRpZXMvdHJ1c3RlZC1wYXJ0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUtqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMscUNBQXFDLEVBQ3JDLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsdUJBQXVCLEdBQ3hCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQVFMLHdCQUF3QixFQUV4QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7Ozs7OztBQUt4RSxNQUFNLE9BQU8sbUJBQW1CO0lBRzlCLFlBQ1UsSUFBZ0IsRUFDaEIsUUFBeUIsRUFDekIsd0JBQWtELEVBQ2xELFdBQXdCLEVBQ3hCLFdBQWlDLEVBQ2pDLGtCQUFzQyxFQUN0QyxlQUFnQyxFQUNoQyxVQUFzQixFQUN0QixVQUE2QixFQUM3QixpQkFBb0M7UUFUcEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFzQjtRQUNqQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFDM0MsQ0FBQztJQUVTLGlCQUFpQjs7WUFDNUIsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQU07Z0JBQzdDLEtBQUssRUFBRSxzQkFBc0I7YUFDOUIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3RCLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNuRCxDQUFDO1FBQ0osQ0FBQztLQUFBO0lBRVksb0JBQW9COztZQUMvQixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDOUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBTTtnQkFDbkUsS0FBSyxFQUFFLHlCQUF5QjtnQkFDaEMsU0FBUyxFQUFFO29CQUNULE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDZixTQUFTLEVBQUUsS0FBSztpQkFDakI7YUFDRixDQUFDLENBQUM7WUFFSCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUNQLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDbkQsQ0FDRixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixPQUFPLEVBQUUsQ0FDUCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBTyxDQUFDLEVBQUUsRUFBRTtvQkFDNUIsT0FBQSxJQUFJLENBQUMsU0FBUyxDQUNaLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDekQsQ0FBQTtrQkFBQSxDQUNGLENBQ0YsQ0FDRjtxQkFDRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssd0JBQXdCLENBQUMsU0FBUyxDQUFDO3FCQUM5RCxNQUFNLENBQ0wsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxNQUFNLEtBQUssd0JBQXdCLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQ3BFO2dCQUNILFdBQVcsRUFBRSxDQUNYLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFPLENBQUMsRUFBRSxFQUFFO29CQUNoQyxPQUFBLElBQUksQ0FBQyxTQUFTLENBQ1osTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUN6RCxDQUFBO2tCQUFBLENBQ0YsQ0FDRixDQUNGLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLHdCQUF3QixDQUFDLFNBQVMsQ0FBQzthQUNqRSxDQUFDO1FBQ0osQ0FBQztLQUFBO0lBRVksZUFBZSxDQUFDLE9BQWU7O1lBQzFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFNO2dCQUM1QyxLQUFLLEVBQUUsb0JBQW9CO2dCQUMzQixTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUU7YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsQ0FBQztLQUFBO0lBRVksb0JBQW9CLENBQy9CLFdBQWlDLG9CQUFvQixDQUFDLE9BQU87O1lBRTdELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJO3FCQUNyQyxHQUFHLENBQXFCLHVDQUF1QyxDQUFDO3FCQUNoRSxTQUFTLEVBQUUsQ0FBQzthQUNoQjtZQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FDOUQsQ0FBQztRQUNKLENBQUM7S0FBQTtJQUVZLFdBQVcsQ0FBQyxLQUFhOztZQUNwQyxJQUFJO2dCQUNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTFELE9BQU8sSUFBSTtvQkFDVCxDQUFDLENBQUM7d0JBQ0UsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO3dCQUNYLEtBQUs7d0JBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO3dCQUN2QixjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU07d0JBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYTtxQkFDekI7b0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUNWO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxJQUFJLENBQUM7YUFDYjtRQUNILENBQUM7S0FBQTtJQUVZLGtCQUFrQixDQUFDLE1BQTBCOztZQUN4RCxNQUFNLE1BQU0sR0FBRztnQkFDYixpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUs7Z0JBQ3pCLE9BQU8sRUFBRTtvQkFDUCxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJO29CQUN2QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLO29CQUN6QixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPO29CQUM3QixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7aUJBQ2hDO2dCQUNELFdBQVcsRUFBRTtvQkFDWCx3QkFBd0IsRUFBRSxJQUFJO29CQUM5Qix5QkFBeUIsRUFBRSxNQUFNLENBQUMsZUFBZTtvQkFDakQsY0FBYyxFQUFFO3dCQUNkLElBQUksRUFBRSxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztxQkFDdkQ7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELENBQUM7S0FBQTtJQUVZLGdCQUFnQixDQUFDLFFBQWdCOztZQUM1QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUN6QixRQUFRLEVBQUUsb0NBQW9DO2dCQUM5QyxTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFO3dCQUNMLEVBQUUsRUFBRSxRQUFRO3FCQUNiO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0lBRVksYUFBYSxDQUN4QixRQUFnQixFQUNoQixXQUFtQixFQUNuQixHQUFXOztZQUVYLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3RFLEtBQUssRUFBRSxXQUFXO2dCQUNsQixNQUFNLEVBQUUsR0FBRzthQUNaLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDO0tBQUE7SUFFWSxnQkFBZ0IsQ0FDM0IsTUFBZ0M7O1lBRWhDLE1BQU0sTUFBTSxHQUFvQjtnQkFDOUIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUNuQixLQUFLLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQ3pCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtnQkFDakMsb0JBQW9CLEVBQUUsSUFBSTtnQkFDMUIsb0JBQW9CLEVBQUU7b0JBQ3BCLHdCQUF3QixFQUFFLElBQUk7b0JBQzlCLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyxlQUFlO29CQUNqRCxjQUFjLEVBQUU7d0JBQ2QsSUFBSSxFQUFFLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO3FCQUN2RDtpQkFDRjthQUNGLENBQUM7WUFFRixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWhFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNmLENBQUM7S0FBQTtJQUVZLGlCQUFpQixDQUM1QixRQUFnQixFQUNoQixXQUFtQjs7WUFFbkIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDekIsUUFBUSxFQUFFLHFDQUFxQztnQkFDL0MsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRTt3QkFDTCxFQUFFLEVBQUUsUUFBUTt3QkFDWixLQUFLLEVBQUUsV0FBVztxQkFDbkI7aUJBQ0Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7SUFFWSxpQkFBaUIsQ0FDNUIsT0FBa0M7O1lBRWxDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQ3RELE9BQU8sQ0FBQyxRQUFRLEVBQ2hCLE9BQU8sQ0FBQyxzQkFBc0IsRUFDOUIsT0FBTyxDQUFDLHlCQUF5QixFQUNqQyxJQUFJLENBQ0wsQ0FBQztZQUNGLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNmLENBQUM7S0FBQTtJQUVZLGtCQUFrQixDQUFDLE9BQWU7O1lBQzdDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3pCLFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLFNBQVMsRUFBRTtvQkFDVCxLQUFLLEVBQUU7d0JBQ0wsRUFBRSxFQUFFLE9BQU87cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7SUFFTSxzQkFBc0IsQ0FDM0IsVUFBa0IsRUFDbEIsS0FBYSxFQUNiLFlBQTBCLEVBQzFCLFdBQXlCO1FBRXpCLE9BQU8sV0FBVztZQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUM7WUFDbkUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSxvQkFBb0IsQ0FDekIsUUFBZ0IsRUFDaEIsS0FBYSxFQUNiLFlBQTBCLEVBQzFCLFdBQXdCO1FBRXhCLE9BQU8sV0FBVztZQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUM7WUFDakUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFYSxjQUFjLENBQzFCLFdBQW1CLEVBQ25CLEtBQWEsRUFDYixZQUEwQixFQUMxQixXQUF3Qjs7WUFFeEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUNuRCxZQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQ3hDLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQ3JELFdBQVcsQ0FBQyxHQUFHLEVBQ2YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ3JCLENBQUM7WUFFRixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUN6QixRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFO3dCQUNMLEVBQUUsRUFBRSxXQUFXO3dCQUNmLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRTt3QkFDckIsVUFBVSxFQUFFLFdBQVc7d0JBQ3ZCLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTt3QkFDYixhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQUU7d0JBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztxQkFDdkM7aUJBQ0Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7SUFFYSxnQkFBZ0IsQ0FDNUIsV0FBbUIsRUFDbkIsY0FBc0I7O1lBRXRCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3pCLFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLFNBQVMsRUFBRTtvQkFDVCxLQUFLLEVBQUU7d0JBQ0wsRUFBRSxFQUFFLFdBQVc7d0JBQ2YsSUFBSSxFQUFFLGNBQWM7cUJBQ3JCO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0lBRVksZUFBZSxDQUFDLEVBQU87OztZQUNsQyxJQUFJO2dCQUNGLE1BQU0sV0FBVyxHQUNmLEVBQUUsQ0FBQyxpQkFBaUI7b0JBQ3BCLENBQUMsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsMEJBQTBCLENBQzdELEVBQUUsQ0FBQyxpQkFBaUIsQ0FDckIsQ0FBQyxDQUFDO2dCQUNMLE1BQU0sYUFBYSxHQUNqQixFQUFFLENBQUMsYUFBYTtvQkFDaEIsQ0FBQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQ0FBZ0MsQ0FDbkUsRUFBRSxDQUFDLGFBQWEsQ0FDakIsQ0FBQyxDQUFDO2dCQUVMLE9BQU87b0JBQ0wsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO29CQUNULElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJO29CQUMzQixZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU07b0JBQy9DLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU07b0JBQ3pELElBQUksRUFBRSxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQzlELE9BQU8sRUFBRSxXQUFXO29CQUNwQixlQUFlLEVBQUUsYUFBYTtvQkFDOUIsYUFBYSxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhO29CQUNwRCxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRO29CQUMzQixRQUFRLEVBQUU7d0JBQ1IsV0FBVyxFQUFFOzRCQUNYLFNBQVMsRUFDUCxDQUFDLE9BQUEsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLDBDQUFFLFVBQVUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUTt5QkFDbEU7cUJBQ0Y7aUJBQ0YsQ0FBQzthQUNIO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pELE9BQU8sSUFBSSxDQUFDO2FBQ2I7O0tBQ0Y7SUFFYSxTQUFTLENBQ3JCLFFBQThCOzs7WUFFOUIsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUN6QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsV0FBVztnQkFDL0IsQ0FBQyxPQUFDLFFBQVEsQ0FBQyxTQUFTLDBDQUFFLElBQUksQ0FDMUIsQ0FBQyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXO2dCQUNoQyxDQUFDLE9BQUMsUUFBUSxDQUFDLFNBQVMsMENBQUUsS0FBSyxDQUMzQixDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztZQUV6RSxPQUFPO2dCQUNMLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDZixJQUFJLEVBQUUsZ0JBQWdCLENBQUMsSUFBSTtnQkFDM0IsTUFBTSxFQUFHLFFBQVEsQ0FBQyxLQUE2QztnQkFDL0QsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO2dCQUNyQixXQUFXLEVBQUUsUUFBUSxDQUFDLGVBQWU7Z0JBQ3JDLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtnQkFDbkMsSUFBSTtnQkFDSixLQUFLO2dCQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsV0FBVztnQkFDOUIsY0FBYyxFQUFFLFFBQVEsQ0FBQyxXQUFXO29CQUNsQyxDQUFDLENBQUMsUUFBUSxDQUFDLHVCQUF1QjtvQkFDbEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUI7Z0JBQ3BDLGFBQWEsRUFBRSxRQUFRLENBQUMsc0JBQXNCO2dCQUM5QyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUI7Z0JBQ2pELFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDN0IsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztnQkFDekIsZUFBZSxFQUFFLFFBQVEsQ0FBQyxhQUFhO2dCQUN2QyxlQUFlLEVBQUUsUUFBUSxDQUFDLFNBQVM7YUFDcEMsQ0FBQzs7S0FDSDs7OztZQTdWRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQTdDUSxVQUFVO1lBU1YsZUFBZTtZQUNmLHdCQUF3QjtZQU14QixXQUFXO1lBTFgsb0JBQW9CO1lBUHBCLGtCQUFrQjtZQVVsQixlQUFlO1lBQ2YsVUFBVTtZQTBCVixpQkFBaUI7WUE1QmpCLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xuaW1wb3J0IHsgbWF0ZXJpYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBLZXlFeGNoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi9hcGkva2V5LWV4Y2hhbmdlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgRGVjcnlwdGVkS2V5RXhjaGFuZ2UsXG4gIFJlc3BvbmRPdGtJbnB1dCxcbn0gZnJvbSAnLi4vYXBpL2tleS1leGNoYW5nZS50eXBlcyc7XG5pbXBvcnQgeyBMckFwb2xsb1NlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItYXBvbGxvLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2hhcmVkQ29udGFjdENhcmRTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL3NoYXJlZC1jb250YWN0LWNhcmQuc2VydmljZSc7XG5pbXBvcnQgeyBMaWZlUmVhZHlBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGgvbGlmZS1yZWFkeS1hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWNjZXNzTGV2ZWwgfSBmcm9tICcuLi9jYXRlZ29yeS9jYXRlZ29yeS50eXBlcyc7XG5pbXBvcnQgeyBFbmNyeXB0aW9uU2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9lbmNyeXB0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5R3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS1ncmFwaC5zZXJ2aWNlJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi91c2Vycy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGFjdENhcmROYW1lIH0gZnJvbSAnLi4vdXNlcnMvcHJvZmlsZS50eXBlcyc7XG5pbXBvcnQge1xuICBDYW5jZWxUcnVzdGVkUGFydHlJbnZpdGF0aW9uTXV0YXRpb24sXG4gIERlY2xpbmVUcnVzdGVkUGFydHlJbnZpdGF0aW9uTXV0YXRpb24sXG4gIERlbGV0ZVRydXN0ZWRQYXJ0eU11dGF0aW9uLFxuICBHZXRBbGxUcnVzdGVkUGFydGllc1F1ZXJ5LFxuICBHZXRUcnVzdGVkUGFydGllc1F1ZXJ5LFxuICBHZXRUcnVzdGVkUGFydHlRdWVyeSxcbiAgU2hhcmVDYXRlZ29yeU11dGF0aW9uLFxuICBVbnNoYXJlQ2F0ZWdvcnlNdXRhdGlvbixcbn0gZnJvbSAnLi90cnVzdGVkLXBhcnR5LmdxbCc7XG5pbXBvcnQge1xuICBBY2NlcHRUcnVzdGVkUGFydHlJbnZpdGUsXG4gIENvbmZpcm1UcnVzdGVkUGFydHlJbnZpdGUsXG4gIEZvdW5kVHJ1c3RlZFBhcnR5LFxuICBJbnZpdGVUcnVzdGVkUGFydHksXG4gIFRydXN0ZWRQYXJ0aWVzLFxuICBUcnVzdGVkUGFydHksXG4gIFRydXN0ZWRQYXJ0eUludml0ZSxcbiAgVHJ1c3RlZFBhcnR5SW52aXRlU3RhdHVzLFxuICBUcnVzdGVkUGFydHlSb2xlLFxuICBUcnVzdGVkUGFydHlUeXBlLFxuICBUcnVzdGVkUGFydHlSb2xlVHlwZSxcbn0gZnJvbSAnLi90cnVzdGVkLXBhcnR5LnR5cGVzJztcbmltcG9ydCB7IEtleUZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS1mYWN0b3J5LnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVHJ1c3RlZFBhcnR5U2VydmljZSB7XG4gIHByaXZhdGUgdHJ1c3RlZFBhcnR5Um9sZXM6IFRydXN0ZWRQYXJ0eVJvbGVbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBsckFwb2xsbzogTHJBcG9sbG9TZXJ2aWNlLFxuICAgIHByaXZhdGUgc2hhcmVkQ29udGFjdENhcmRTZXJ2aWNlOiBTaGFyZWRDb250YWN0Q2FyZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogTGlmZVJlYWR5QXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBrZXlFeGNoYW5nZVNlcnZpY2U6IEtleUV4Y2hhbmdlU2VydmljZSxcbiAgICBwcml2YXRlIGtleUdyYXBoU2VydmljZTogS2V5R3JhcGhTZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcbiAgICBwcml2YXRlIGtleUZhY3Rvcnk6IEtleUZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgYXN5bmMgZ2V0VHJ1c3RlZFBhcnRpZXMoKTogUHJvbWlzZTxUcnVzdGVkUGFydHlbXT4ge1xuICAgIGNvbnN0IHsgdHBzIH0gPSBhd2FpdCB0aGlzLmxyQXBvbGxvLnF1ZXJ5PGFueT4oe1xuICAgICAgcXVlcnk6IEdldFRydXN0ZWRQYXJ0aWVzUXVlcnksXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHBzLmVkZ2VzLm1hcCgoeCkgPT4gdGhpcy5tYXBUcnVzdGVkUGFydHkoeC5ub2RlKSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFsbFRydXN0ZWRQYXJ0aWVzKCk6IFByb21pc2U8VHJ1c3RlZFBhcnRpZXM+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoU2VydmljZS5nZXRVc2VyKCk7XG4gICAgY29uc3QgeyB0cHMsIGludml0ZXMsIHNlbnRJbnZpdGVzIH0gPSBhd2FpdCB0aGlzLmxyQXBvbGxvLnF1ZXJ5PGFueT4oe1xuICAgICAgcXVlcnk6IEdldEFsbFRydXN0ZWRQYXJ0aWVzUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgdXNlcklkOiB1c2VyLmlkLFxuICAgICAgICBpc0V4cGlyZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXJ0aWVzOiAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsPFRydXN0ZWRQYXJ0eT4oXG4gICAgICAgICAgdHBzLmVkZ2VzLm1hcCgoeCkgPT4gdGhpcy5tYXBUcnVzdGVkUGFydHkoeC5ub2RlKSlcbiAgICAgICAgKVxuICAgICAgKS5maWx0ZXIoKHgpID0+IHgpLFxuICAgICAgaW52aXRlczogKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbDxUcnVzdGVkUGFydHlJbnZpdGU+KFxuICAgICAgICAgIGludml0ZXMuZWRnZXMubWFwKGFzeW5jICh4KSA9PlxuICAgICAgICAgICAgdGhpcy5tYXBJbnZpdGUoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMua2V5RXhjaGFuZ2VTZXJ2aWNlLmRlY3J5cHRLZXlFeGNoYW5nZSh4Lm5vZGUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguc3RhdHVzICE9PSBUcnVzdGVkUGFydHlJbnZpdGVTdGF0dXMuQ29tcGxldGVkKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgeC5zdGF0dXMgIT09IFRydXN0ZWRQYXJ0eUludml0ZVN0YXR1cy5JbnZpdGVkIHx8IHguYWN0aW9uUmVxdWlyZWRcbiAgICAgICAgKSxcbiAgICAgIHNlbnRJbnZpdGVzOiAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsPFRydXN0ZWRQYXJ0eUludml0ZT4oXG4gICAgICAgICAgc2VudEludml0ZXMuZWRnZXMubWFwKGFzeW5jICh4KSA9PlxuICAgICAgICAgICAgdGhpcy5tYXBJbnZpdGUoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMua2V5RXhjaGFuZ2VTZXJ2aWNlLmRlY3J5cHRLZXlFeGNoYW5nZSh4Lm5vZGUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLmZpbHRlcigoeCkgPT4geC5zdGF0dXMgIT09IFRydXN0ZWRQYXJ0eUludml0ZVN0YXR1cy5Db21wbGV0ZWQpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VHJ1c3RlZFBhcnR5KHBhcnR5SWQ6IHN0cmluZyk6IFByb21pc2U8VHJ1c3RlZFBhcnR5PiB7XG4gICAgY29uc3QgeyB0cCB9ID0gYXdhaXQgdGhpcy5sckFwb2xsby5xdWVyeTxhbnk+KHtcbiAgICAgIHF1ZXJ5OiBHZXRUcnVzdGVkUGFydHlRdWVyeSxcbiAgICAgIHZhcmlhYmxlczogeyBwYXJ0eUlkIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubWFwVHJ1c3RlZFBhcnR5KHRwKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcnVzdGVkUGFydHlSb2xlcyhcbiAgICByb2xlVHlwZTogVHJ1c3RlZFBhcnR5Um9sZVR5cGUgPSBUcnVzdGVkUGFydHlSb2xlVHlwZS5HZW5lcmFsXG4gICk6IFByb21pc2U8VHJ1c3RlZFBhcnR5Um9sZVtdPiB7XG4gICAgaWYgKCF0aGlzLnRydXN0ZWRQYXJ0eVJvbGVzKSB7XG4gICAgICB0aGlzLnRydXN0ZWRQYXJ0eVJvbGVzID0gYXdhaXQgdGhpcy5odHRwXG4gICAgICAgIC5nZXQ8VHJ1c3RlZFBhcnR5Um9sZVtdPignL2Fzc2V0cy9tZXRhL3RydXN0ZWQtcGFydHktcm9sZXMuanNvbicpXG4gICAgICAgIC50b1Byb21pc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIHRoaXMudHJ1c3RlZFBhcnR5Um9sZXMuZmlsdGVyKCh4KSA9PiB4LnJvbGVUeXBlID09PSByb2xlVHlwZSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbmRCeUVtYWlsKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPEZvdW5kVHJ1c3RlZFBhcnR5PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJCeUVtYWlsKGVtYWlsKTtcblxuICAgICAgcmV0dXJuIHVzZXJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpZDogdXNlci5pZCxcbiAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXIudXNlcm5hbWUsXG4gICAgICAgICAgICBpc1RydXN0ZWRQYXJ0eTogdXNlci5oYXZlVHAsXG4gICAgICAgICAgICBpc01lOiB1c2VyLmlzQ3VycmVudFVzZXIsXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGludml0ZVRydXN0ZWRQYXJ0eShpbnZpdGU6IEludml0ZVRydXN0ZWRQYXJ0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHJlc3BvbmRlclVzZXJuYW1lOiBpbnZpdGUucGFydHkudXNlcm5hbWUsXG4gICAgICBlbWFpbDogaW52aXRlLnBhcnR5LmVtYWlsLFxuICAgICAgbWVzc2FnZToge1xuICAgICAgICBuYW1lOiBpbnZpdGUucGFydHkubmFtZSxcbiAgICAgICAgZW1haWw6IGludml0ZS5wYXJ0eS5lbWFpbCxcbiAgICAgICAgbWVzc2FnZTogaW52aXRlLnBhcnR5Lm1lc3NhZ2UsXG4gICAgICAgIHBlcm1pc3Npb25zOiBpbnZpdGUucGVybWlzc2lvbnMsXG4gICAgICB9LFxuICAgICAgY29udGFjdENhcmQ6IHtcbiAgICAgICAgcGxhaW5Pd25lckNpcGhlckRhdGFKc29uOiBudWxsLFxuICAgICAgICBwbGFpblNoYXJlZENpcGhlckRhdGFKc29uOiBpbnZpdGUubXlTaGFyZWREZXRhaWxzLFxuICAgICAgICBvd25lclBsYWluRGF0YToge1xuICAgICAgICAgIG5hbWU6IG5ldyBDb250YWN0Q2FyZE5hbWUoaW52aXRlLm15U2hhcmVkRGV0YWlscy5uYW1lKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5pbml0aWF0ZU90ayhwYXJhbXMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNhbmNlbEludml0YXRpb24oaW52aXRlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcbiAgICAgIG11dGF0aW9uOiBDYW5jZWxUcnVzdGVkUGFydHlJbnZpdGF0aW9uTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBpZDogaW52aXRlSWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEludml0YXRpb24oXG4gICAgaW52aXRlSWQ6IHN0cmluZyxcbiAgICBpbnZpdGVUb2tlbjogc3RyaW5nLFxuICAgIGtleTogc3RyaW5nXG4gICk6IFByb21pc2U8VHJ1c3RlZFBhcnR5SW52aXRlPiB7XG4gICAgY29uc3QgZXhjaGFuZ2UgPSBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5nZXRLZXlFeGNoYW5nZShpbnZpdGVJZCwge1xuICAgICAgdG9rZW46IGludml0ZVRva2VuLFxuICAgICAgb3RLZXlLOiBrZXksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5tYXBJbnZpdGUoZXhjaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjY2VwdEludml0YXRpb24oXG4gICAgaW52aXRlOiBBY2NlcHRUcnVzdGVkUGFydHlJbnZpdGVcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbXM6IFJlc3BvbmRPdGtJbnB1dCA9IHtcbiAgICAgIGlkOiBpbnZpdGUuaW52aXRlSWQsXG4gICAgICB0b2tlbjogaW52aXRlLmludml0ZVRva2VuLFxuICAgICAgZGVjcnlwdGVkT3RrOiBpbnZpdGUuZGVjcnlwdGVkT3RrLFxuICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmQ6IG51bGwsXG4gICAgICByZXNwb25kZXJDb250YWN0Q2FyZDoge1xuICAgICAgICBwbGFpbk93bmVyQ2lwaGVyRGF0YUpzb246IG51bGwsXG4gICAgICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IGludml0ZS5teVNoYXJlZERldGFpbHMsXG4gICAgICAgIG93bmVyUGxhaW5EYXRhOiB7XG4gICAgICAgICAgbmFtZTogbmV3IENvbnRhY3RDYXJkTmFtZShpbnZpdGUubXlTaGFyZWREZXRhaWxzLm5hbWUpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyB0cCB9ID0gYXdhaXQgdGhpcy5rZXlFeGNoYW5nZVNlcnZpY2UucmVzcG9uZE90ayhwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRwLmlkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlY2xpbmVJbnZpdGF0aW9uKFxuICAgIGludml0ZUlkOiBzdHJpbmcsXG4gICAgaW52aXRlVG9rZW46IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxyQXBvbGxvLm11dGF0ZSh7XG4gICAgICBtdXRhdGlvbjogRGVjbGluZVRydXN0ZWRQYXJ0eUludml0YXRpb25NdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGlkOiBpbnZpdGVJZCxcbiAgICAgICAgICB0b2tlbjogaW52aXRlVG9rZW4sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbmZpcm1JbnZpdGF0aW9uKFxuICAgIGNvbmZpcm06IENvbmZpcm1UcnVzdGVkUGFydHlJbnZpdGVcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IHRwIH0gPSBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5jb21wbGV0ZU90ayhcbiAgICAgIGNvbmZpcm0uaW52aXRlSWQsXG4gICAgICBjb25maXJtLmluaXRpYXRvclJvb3RLZXlDaXBoZXIsXG4gICAgICBjb25maXJtLmluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIsXG4gICAgICBudWxsXG4gICAgKTtcbiAgICByZXR1cm4gdHAuaWQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVtb3ZlVHJ1c3RlZFBhcnR5KHBhcnR5SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcbiAgICAgIG11dGF0aW9uOiBEZWxldGVUcnVzdGVkUGFydHlNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGlkOiBwYXJ0eUlkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDYXRlZ29yeUFjY2Vzc0xldmVsKFxuICAgIGNhdGVnb3J5SWQ6IHN0cmluZyxcbiAgICBrZXlJZDogc3RyaW5nLFxuICAgIHRydXN0ZWRQYXJ0eTogVHJ1c3RlZFBhcnR5LFxuICAgIGFjY2Vzc0xldmVsPzogQWNjZXNzTGV2ZWxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGFjY2Vzc0xldmVsXG4gICAgICA/IHRoaXMuc2hhcmVEaXJlY3RvcnkoY2F0ZWdvcnlJZCwga2V5SWQsIHRydXN0ZWRQYXJ0eSwgYWNjZXNzTGV2ZWwpXG4gICAgICA6IHRoaXMudW5zaGFyZURpcmVjdG9yeShjYXRlZ29yeUlkLCB0cnVzdGVkUGFydHkuaWQpO1xuICB9XG5cbiAgcHVibGljIHNldFJlY29yZEFjY2Vzc0xldmVsKFxuICAgIHJlY29yZElkOiBzdHJpbmcsXG4gICAga2V5SWQ6IHN0cmluZyxcbiAgICB0cnVzdGVkUGFydHk6IFRydXN0ZWRQYXJ0eSxcbiAgICBhY2Nlc3NMZXZlbDogQWNjZXNzTGV2ZWxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGFjY2Vzc0xldmVsXG4gICAgICA/IHRoaXMuc2hhcmVEaXJlY3RvcnkocmVjb3JkSWQsIGtleUlkLCB0cnVzdGVkUGFydHksIGFjY2Vzc0xldmVsKVxuICAgICAgOiB0aGlzLnVuc2hhcmVEaXJlY3RvcnkocmVjb3JkSWQsIHRydXN0ZWRQYXJ0eS5pZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNoYXJlRGlyZWN0b3J5KFxuICAgIGRpcmVjdG9yeUlkOiBzdHJpbmcsXG4gICAga2V5SWQ6IHN0cmluZyxcbiAgICB0cnVzdGVkUGFydHk6IFRydXN0ZWRQYXJ0eSxcbiAgICBhY2Nlc3NMZXZlbDogQWNjZXNzTGV2ZWxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaFNlcnZpY2UuZ2V0S2V5KGtleUlkKTtcbiAgICBjb25zdCB3cmFwcGluZ0tleSA9IGF3YWl0IHRoaXMua2V5R3JhcGhTZXJ2aWNlLmdldEtleShcbiAgICAgIHRydXN0ZWRQYXJ0eS51c2VyU2hhcmVkS2V5LnNoYXJlZEtleS5pZFxuICAgICk7XG4gICAgY29uc3Qgd3JhcHBlZEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIHdyYXBwaW5nS2V5Lmp3ayxcbiAgICAgIGtleS5qd2sudG9KU09OKHRydWUpXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcbiAgICAgIG11dGF0aW9uOiBTaGFyZUNhdGVnb3J5TXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBpZDogZGlyZWN0b3J5SWQsXG4gICAgICAgICAgdHBJZDogdHJ1c3RlZFBhcnR5LmlkLFxuICAgICAgICAgIGFjY2Vzc1JvbGU6IGFjY2Vzc0xldmVsLFxuICAgICAgICAgIGtleUlkOiBrZXkuaWQsXG4gICAgICAgICAgd3JhcHBpbmdLZXlJZDogd3JhcHBpbmdLZXkuaWQsXG4gICAgICAgICAgd3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkod3JhcHBlZEtleSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1bnNoYXJlRGlyZWN0b3J5KFxuICAgIGRpcmVjdG9yeUlkOiBzdHJpbmcsXG4gICAgdHJ1c3RlZFBhcnR5SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxyQXBvbGxvLm11dGF0ZSh7XG4gICAgICBtdXRhdGlvbjogVW5zaGFyZUNhdGVnb3J5TXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBpZDogZGlyZWN0b3J5SWQsXG4gICAgICAgICAgdHBJZDogdHJ1c3RlZFBhcnR5SWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG1hcFRydXN0ZWRQYXJ0eSh0cDogYW55KTogUHJvbWlzZTxUcnVzdGVkUGFydHk+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGFjdENhcmQgPVxuICAgICAgICB0cC5zaGFyZWRDb250YWN0Q2FyZCAmJlxuICAgICAgICAoYXdhaXQgdGhpcy5zaGFyZWRDb250YWN0Q2FyZFNlcnZpY2UuZGVjcnlwdFRydXN0ZWRQYXJ0eURldGFpbHMoXG4gICAgICAgICAgdHAuc2hhcmVkQ29udGFjdENhcmRcbiAgICAgICAgKSk7XG4gICAgICBjb25zdCBteUNvbnRhY3RDYXJkID1cbiAgICAgICAgdHAubXlDb250YWN0Q2FyZCAmJlxuICAgICAgICAoYXdhaXQgdGhpcy5zaGFyZWRDb250YWN0Q2FyZFNlcnZpY2UuZGVjcnlwdFNoYXJlZFRydXN0ZWRQYXJ0eURldGFpbHMoXG4gICAgICAgICAgdHAubXlDb250YWN0Q2FyZFxuICAgICAgICApKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHRwLmlkLFxuICAgICAgICB0eXBlOiBUcnVzdGVkUGFydHlUeXBlLlVzZXIsIC8vIFRPRE86IHdoZW4gcGFydG5lcnNcbiAgICAgICAgaGFzU2NlbmFyaW9zOiAhIXRwLnNoYXJlZFNjZW5hcmlvcy5lZGdlcy5sZW5ndGgsXG4gICAgICAgIGhhc1NoYXJlZFZhdWx0OiAhIXRwLnNoYXJlZEl0ZW1zLmRpcmVjdG9yaWVzLmVkZ2VzLmxlbmd0aCxcbiAgICAgICAgbmFtZTogY29udGFjdENhcmQgJiYgY29udGFjdENhcmQubmFtZSAmJiBjb250YWN0Q2FyZC5uYW1lLm5hbWUsXG4gICAgICAgIGRldGFpbHM6IGNvbnRhY3RDYXJkLFxuICAgICAgICBteVNoYXJlZERldGFpbHM6IG15Q29udGFjdENhcmQsXG4gICAgICAgIHVzZXJTaGFyZWRLZXk6IHRwLmN1cnJlbnRVc2VyU2hhcmVkS2V5LnVzZXJTaGFyZWRLZXksXG4gICAgICAgIHVzZXJuYW1lOiB0cC5vdGhlci51c2VybmFtZSxcbiAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICBzaGFyZWRWYXVsdDoge1xuICAgICAgICAgICAgaGFzQWNjZXNzOlxuICAgICAgICAgICAgICAodHAub3RoZXIuZmVhdHVyZXM/LnNoYXJlVmF1bHQgfHwgWydub2FjY2VzcyddKVswXSA9PT0gJ2FjY2VzcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRlY3J5cHQgVHJ1c3RlZCBQYXJ0eS4nLCBlLCB0cCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1hcEludml0ZShcbiAgICBleGNoYW5nZTogRGVjcnlwdGVkS2V5RXhjaGFuZ2VcbiAgKTogUHJvbWlzZTxUcnVzdGVkUGFydHlJbnZpdGU+IHtcbiAgICBjb25zdCBjb250YWN0Q2FyZCA9IGV4Y2hhbmdlLmNvbnRhY3RDYXJkO1xuICAgIGNvbnN0IG5hbWUgPSBleGNoYW5nZS5pc0luaXRpYXRvclxuICAgICAgPyBleGNoYW5nZS5teU1lc3NhZ2U/Lm5hbWVcbiAgICAgIDogY29udGFjdENhcmQgJiYgY29udGFjdENhcmQubmFtZSAmJiBjb250YWN0Q2FyZC5uYW1lLm5hbWU7XG4gICAgY29uc3QgZW1haWwgPSBleGNoYW5nZS5pc0luaXRpYXRvclxuICAgICAgPyBleGNoYW5nZS5teU1lc3NhZ2U/LmVtYWlsXG4gICAgICA6IChjb250YWN0Q2FyZCAmJiBjb250YWN0Q2FyZC5lbWFpbCkgfHwgZXhjaGFuZ2UucmVzcG9uZGVyRW1haWxBZGRyZXNzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBleGNoYW5nZS5pZCxcbiAgICAgIHR5cGU6IFRydXN0ZWRQYXJ0eVR5cGUuVXNlciwgLy8gdG9kbyB3aGVuIHBhcnRuZXJzXG4gICAgICBzdGF0dXM6IChleGNoYW5nZS5zdGF0ZSBhcyB1bmtub3duKSBhcyBUcnVzdGVkUGFydHlJbnZpdGVTdGF0dXMsXG4gICAgICB0b2tlbjogZXhjaGFuZ2UudG9rZW4sXG4gICAgICB0b2tlbkV4cGlyeTogZXhjaGFuZ2UudG9rZW5FeHBpcnlUaW1lLFxuICAgICAgZGVjcnlwdGVkT3RrOiBleGNoYW5nZS5kZWNyeXB0ZWRPdGssXG4gICAgICBuYW1lLFxuICAgICAgZW1haWwsXG4gICAgICBpc1NlbmRlcjogZXhjaGFuZ2UuaXNJbml0aWF0b3IsXG4gICAgICBhY3Rpb25SZXF1aXJlZDogZXhjaGFuZ2UuaXNJbml0aWF0b3JcbiAgICAgICAgPyBleGNoYW5nZS5pbml0aWF0b3JBY3Rpb25SZXF1aXJlZFxuICAgICAgICA6IGV4Y2hhbmdlLnJlc3BvbmRlckFjdGlvblJlcXVpcmVkLFxuICAgICAgcm9vdEtleUNpcGhlcjogZXhjaGFuZ2UuaW5pdGlhdG9yUm9vdEtleUNpcGhlcixcbiAgICAgIHBia0NpcGhlcjogZXhjaGFuZ2Uub3RrLmluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIsXG4gICAgICBpc0V4cGlyZWQ6IGV4Y2hhbmdlLmlzRXhwaXJlZCxcbiAgICAgIGRldGFpbHM6IGNvbnRhY3RDYXJkLFxuICAgICAgbWVzc2FnZTogZXhjaGFuZ2UubWVzc2FnZSxcbiAgICAgIG15U2hhcmVkRGV0YWlsczogZXhjaGFuZ2UubXlDb250YWN0Q2FyZCxcbiAgICAgIG15U2hhcmVkTWVzc2FnZTogZXhjaGFuZ2UubXlNZXNzYWdlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Injectable } from '@angular/core';
|
|
4
|
+
import { KeyExchangeService } from '../api/key-exchange.service';
|
|
5
|
+
import { LrApolloService } from '../api/lr-apollo.service';
|
|
6
|
+
import { SharedContactCardService } from '../api/shared-contact-card.service';
|
|
7
|
+
import { LifeReadyAuthService } from '../auth/life-ready-auth.service';
|
|
8
|
+
import { EncryptionService } from '../cryptography/encryption.service';
|
|
9
|
+
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
10
|
+
import { KeyService } from '../cryptography/key.service';
|
|
11
|
+
import { UserService } from '../users/user.service';
|
|
12
|
+
import { ContactCardName } from '../users/profile.types';
|
|
13
|
+
import { CancelTrustedPartyInvitationMutation, DeclineTrustedPartyInvitationMutation, DeleteTrustedPartyMutation, GetAllTrustedPartiesQuery, GetTrustedPartiesQuery, GetTrustedPartyQuery, ShareCategoryMutation, UnshareCategoryMutation, } from './trusted-party.gql';
|
|
14
|
+
import { TrustedPartyInviteStatus, TrustedPartyType, TrustedPartyRoleType, } from './trusted-party.types';
|
|
15
|
+
import { KeyFactoryService } from '../cryptography/key-factory.service';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "@angular/common/http";
|
|
18
|
+
import * as i2 from "../api/lr-apollo.service";
|
|
19
|
+
import * as i3 from "../api/shared-contact-card.service";
|
|
20
|
+
import * as i4 from "../users/user.service";
|
|
21
|
+
import * as i5 from "../auth/life-ready-auth.service";
|
|
22
|
+
import * as i6 from "../api/key-exchange.service";
|
|
23
|
+
import * as i7 from "../cryptography/key-graph.service";
|
|
24
|
+
import * as i8 from "../cryptography/key.service";
|
|
25
|
+
import * as i9 from "../cryptography/key-factory.service";
|
|
26
|
+
import * as i10 from "../cryptography/encryption.service";
|
|
27
|
+
export class TrustedPartyService {
|
|
28
|
+
constructor(http, lrApollo, sharedContactCardService, userService, authService, keyExchangeService, keyGraphService, keyService, keyFactory, encryptionService) {
|
|
29
|
+
this.http = http;
|
|
30
|
+
this.lrApollo = lrApollo;
|
|
31
|
+
this.sharedContactCardService = sharedContactCardService;
|
|
32
|
+
this.userService = userService;
|
|
33
|
+
this.authService = authService;
|
|
34
|
+
this.keyExchangeService = keyExchangeService;
|
|
35
|
+
this.keyGraphService = keyGraphService;
|
|
36
|
+
this.keyService = keyService;
|
|
37
|
+
this.keyFactory = keyFactory;
|
|
38
|
+
this.encryptionService = encryptionService;
|
|
39
|
+
}
|
|
40
|
+
getTrustedParties() {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
const { tps } = yield this.lrApollo.query({
|
|
43
|
+
query: GetTrustedPartiesQuery,
|
|
44
|
+
});
|
|
45
|
+
return yield Promise.all(tps.edges.map((x) => this.mapTrustedParty(x.node)));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
getAllTrustedParties() {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
const user = yield this.authService.getUser();
|
|
51
|
+
const { tps, invites, sentInvites } = yield this.lrApollo.query({
|
|
52
|
+
query: GetAllTrustedPartiesQuery,
|
|
53
|
+
variables: {
|
|
54
|
+
userId: user.id,
|
|
55
|
+
isExpired: false,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
parties: (yield Promise.all(tps.edges.map((x) => this.mapTrustedParty(x.node)))).filter((x) => x),
|
|
60
|
+
invites: (yield Promise.all(invites.edges.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
return this.mapInvite(yield this.keyExchangeService.decryptKeyExchange(x.node));
|
|
62
|
+
}))))
|
|
63
|
+
.filter((x) => x.status !== TrustedPartyInviteStatus.Completed)
|
|
64
|
+
.filter((x) => x.status !== TrustedPartyInviteStatus.Invited || x.actionRequired),
|
|
65
|
+
sentInvites: (yield Promise.all(sentInvites.edges.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
return this.mapInvite(yield this.keyExchangeService.decryptKeyExchange(x.node));
|
|
67
|
+
})))).filter((x) => x.status !== TrustedPartyInviteStatus.Completed),
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
getTrustedParty(partyId) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
const { tp } = yield this.lrApollo.query({
|
|
74
|
+
query: GetTrustedPartyQuery,
|
|
75
|
+
variables: { partyId },
|
|
76
|
+
});
|
|
77
|
+
return yield this.mapTrustedParty(tp);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
getTrustedPartyRoles(roleType = TrustedPartyRoleType.General) {
|
|
81
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
if (!this.trustedPartyRoles) {
|
|
83
|
+
this.trustedPartyRoles = yield this.http
|
|
84
|
+
.get('/assets/meta/trusted-party-roles.json')
|
|
85
|
+
.toPromise();
|
|
86
|
+
}
|
|
87
|
+
return Promise.resolve(this.trustedPartyRoles.filter((x) => x.roleType === roleType));
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
findByEmail(email) {
|
|
91
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
+
try {
|
|
93
|
+
const user = yield this.userService.getUserByEmail(email);
|
|
94
|
+
return user
|
|
95
|
+
? {
|
|
96
|
+
id: user.id,
|
|
97
|
+
email,
|
|
98
|
+
username: user.username,
|
|
99
|
+
isTrustedParty: user.haveTp,
|
|
100
|
+
isMe: user.isCurrentUser,
|
|
101
|
+
}
|
|
102
|
+
: null;
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
inviteTrustedParty(invite) {
|
|
110
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
const params = {
|
|
112
|
+
responderUsername: invite.party.username,
|
|
113
|
+
email: invite.party.email,
|
|
114
|
+
message: {
|
|
115
|
+
name: invite.party.name,
|
|
116
|
+
email: invite.party.email,
|
|
117
|
+
message: invite.party.message,
|
|
118
|
+
permissions: invite.permissions,
|
|
119
|
+
},
|
|
120
|
+
contactCard: {
|
|
121
|
+
plainOwnerCipherDataJson: null,
|
|
122
|
+
plainSharedCipherDataJson: invite.mySharedDetails,
|
|
123
|
+
ownerPlainData: {
|
|
124
|
+
name: new ContactCardName(invite.mySharedDetails.name),
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
yield this.keyExchangeService.initiateOtk(params);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
cancelInvitation(inviteId) {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
+
yield this.lrApollo.mutate({
|
|
134
|
+
mutation: CancelTrustedPartyInvitationMutation,
|
|
135
|
+
variables: {
|
|
136
|
+
input: {
|
|
137
|
+
id: inviteId,
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
getInvitation(inviteId, inviteToken, key) {
|
|
144
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
+
const exchange = yield this.keyExchangeService.getKeyExchange(inviteId, {
|
|
146
|
+
token: inviteToken,
|
|
147
|
+
otKeyK: key,
|
|
148
|
+
});
|
|
149
|
+
return this.mapInvite(exchange);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
acceptInvitation(invite) {
|
|
153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
+
const params = {
|
|
155
|
+
id: invite.inviteId,
|
|
156
|
+
token: invite.inviteToken,
|
|
157
|
+
decryptedOtk: invite.decryptedOtk,
|
|
158
|
+
initiatorContactCard: null,
|
|
159
|
+
responderContactCard: {
|
|
160
|
+
plainOwnerCipherDataJson: null,
|
|
161
|
+
plainSharedCipherDataJson: invite.mySharedDetails,
|
|
162
|
+
ownerPlainData: {
|
|
163
|
+
name: new ContactCardName(invite.mySharedDetails.name),
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
const { tp } = yield this.keyExchangeService.respondOtk(params);
|
|
168
|
+
return tp.id;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
declineInvitation(inviteId, inviteToken) {
|
|
172
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
+
yield this.lrApollo.mutate({
|
|
174
|
+
mutation: DeclineTrustedPartyInvitationMutation,
|
|
175
|
+
variables: {
|
|
176
|
+
input: {
|
|
177
|
+
id: inviteId,
|
|
178
|
+
token: inviteToken,
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
confirmInvitation(confirm) {
|
|
185
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
186
|
+
const { tp } = yield this.keyExchangeService.completeOtk(confirm.inviteId, confirm.initiatorRootKeyCipher, confirm.initiatorOneTimePbkCipher, null);
|
|
187
|
+
return tp.id;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
removeTrustedParty(partyId) {
|
|
191
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
192
|
+
yield this.lrApollo.mutate({
|
|
193
|
+
mutation: DeleteTrustedPartyMutation,
|
|
194
|
+
variables: {
|
|
195
|
+
input: {
|
|
196
|
+
id: partyId,
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
setCategoryAccessLevel(categoryId, keyId, trustedParty, accessLevel) {
|
|
203
|
+
return accessLevel
|
|
204
|
+
? this.shareDirectory(categoryId, keyId, trustedParty, accessLevel)
|
|
205
|
+
: this.unshareDirectory(categoryId, trustedParty.id);
|
|
206
|
+
}
|
|
207
|
+
setRecordAccessLevel(recordId, keyId, trustedParty, accessLevel) {
|
|
208
|
+
return accessLevel
|
|
209
|
+
? this.shareDirectory(recordId, keyId, trustedParty, accessLevel)
|
|
210
|
+
: this.unshareDirectory(recordId, trustedParty.id);
|
|
211
|
+
}
|
|
212
|
+
shareDirectory(directoryId, keyId, trustedParty, accessLevel) {
|
|
213
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
214
|
+
const key = yield this.keyGraphService.getKey(keyId);
|
|
215
|
+
const wrappingKey = yield this.keyGraphService.getKey(trustedParty.userSharedKey.sharedKey.id);
|
|
216
|
+
const wrappedKey = yield this.encryptionService.encrypt(wrappingKey.jwk, key.jwk.toJSON(true));
|
|
217
|
+
yield this.lrApollo.mutate({
|
|
218
|
+
mutation: ShareCategoryMutation,
|
|
219
|
+
variables: {
|
|
220
|
+
input: {
|
|
221
|
+
id: directoryId,
|
|
222
|
+
tpId: trustedParty.id,
|
|
223
|
+
accessRole: accessLevel,
|
|
224
|
+
keyId: key.id,
|
|
225
|
+
wrappingKeyId: wrappingKey.id,
|
|
226
|
+
wrappedKey: JSON.stringify(wrappedKey),
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
unshareDirectory(directoryId, trustedPartyId) {
|
|
233
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
234
|
+
yield this.lrApollo.mutate({
|
|
235
|
+
mutation: UnshareCategoryMutation,
|
|
236
|
+
variables: {
|
|
237
|
+
input: {
|
|
238
|
+
id: directoryId,
|
|
239
|
+
tpId: trustedPartyId,
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
mapTrustedParty(tp) {
|
|
246
|
+
var _a;
|
|
247
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
248
|
+
try {
|
|
249
|
+
const contactCard = tp.sharedContactCard &&
|
|
250
|
+
(yield this.sharedContactCardService.decryptTrustedPartyDetails(tp.sharedContactCard));
|
|
251
|
+
const myContactCard = tp.myContactCard &&
|
|
252
|
+
(yield this.sharedContactCardService.decryptSharedTrustedPartyDetails(tp.myContactCard));
|
|
253
|
+
return {
|
|
254
|
+
id: tp.id,
|
|
255
|
+
type: TrustedPartyType.User,
|
|
256
|
+
hasScenarios: !!tp.sharedScenarios.edges.length,
|
|
257
|
+
hasSharedVault: !!tp.sharedItems.directories.edges.length,
|
|
258
|
+
name: contactCard && contactCard.name && contactCard.name.name,
|
|
259
|
+
details: contactCard,
|
|
260
|
+
mySharedDetails: myContactCard,
|
|
261
|
+
userSharedKey: tp.currentUserSharedKey.userSharedKey,
|
|
262
|
+
username: tp.other.username,
|
|
263
|
+
features: {
|
|
264
|
+
sharedVault: {
|
|
265
|
+
hasAccess: (((_a = tp.other.features) === null || _a === void 0 ? void 0 : _a.shareVault) || ['noaccess'])[0] === 'access',
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (e) {
|
|
271
|
+
console.error('Failed to decrypt Trusted Party.', e, tp);
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
mapInvite(exchange) {
|
|
277
|
+
var _a, _b;
|
|
278
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
279
|
+
const contactCard = exchange.contactCard;
|
|
280
|
+
const name = exchange.isInitiator
|
|
281
|
+
? (_a = exchange.myMessage) === null || _a === void 0 ? void 0 : _a.name : contactCard && contactCard.name && contactCard.name.name;
|
|
282
|
+
const email = exchange.isInitiator
|
|
283
|
+
? (_b = exchange.myMessage) === null || _b === void 0 ? void 0 : _b.email : (contactCard && contactCard.email) || exchange.responderEmailAddress;
|
|
284
|
+
return {
|
|
285
|
+
id: exchange.id,
|
|
286
|
+
type: TrustedPartyType.User,
|
|
287
|
+
status: exchange.state,
|
|
288
|
+
token: exchange.token,
|
|
289
|
+
tokenExpiry: exchange.tokenExpiryTime,
|
|
290
|
+
decryptedOtk: exchange.decryptedOtk,
|
|
291
|
+
name,
|
|
292
|
+
email,
|
|
293
|
+
isSender: exchange.isInitiator,
|
|
294
|
+
actionRequired: exchange.isInitiator
|
|
295
|
+
? exchange.initiatorActionRequired
|
|
296
|
+
: exchange.responderActionRequired,
|
|
297
|
+
rootKeyCipher: exchange.initiatorRootKeyCipher,
|
|
298
|
+
pbkCipher: exchange.otk.initiatorOneTimePbkCipher,
|
|
299
|
+
isExpired: exchange.isExpired,
|
|
300
|
+
details: contactCard,
|
|
301
|
+
message: exchange.message,
|
|
302
|
+
mySharedDetails: exchange.myContactCard,
|
|
303
|
+
mySharedMessage: exchange.myMessage,
|
|
304
|
+
};
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
TrustedPartyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TrustedPartyService_Factory() { return new TrustedPartyService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.LrApolloService), i0.ɵɵinject(i3.SharedContactCardService), i0.ɵɵinject(i4.UserService), i0.ɵɵinject(i5.LifeReadyAuthService), i0.ɵɵinject(i6.KeyExchangeService), i0.ɵɵinject(i7.KeyGraphService), i0.ɵɵinject(i8.KeyService), i0.ɵɵinject(i9.KeyFactoryService), i0.ɵɵinject(i10.EncryptionService)); }, token: TrustedPartyService, providedIn: "root" });
|
|
309
|
+
TrustedPartyService.decorators = [
|
|
310
|
+
{ type: Injectable, args: [{
|
|
311
|
+
providedIn: 'root',
|
|
312
|
+
},] }
|
|
313
|
+
];
|
|
314
|
+
TrustedPartyService.ctorParameters = () => [
|
|
315
|
+
{ type: HttpClient },
|
|
316
|
+
{ type: LrApolloService },
|
|
317
|
+
{ type: SharedContactCardService },
|
|
318
|
+
{ type: UserService },
|
|
319
|
+
{ type: LifeReadyAuthService },
|
|
320
|
+
{ type: KeyExchangeService },
|
|
321
|
+
{ type: KeyGraphService },
|
|
322
|
+
{ type: KeyService },
|
|
323
|
+
{ type: KeyFactoryService },
|
|
324
|
+
{ type: EncryptionService }
|
|
325
|
+
];
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1wYXJ0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2plY3RzL25ld3JlcG8va2MtY2xpZW50L3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL3RydXN0ZWQtcGFydGllcy90cnVzdGVkLXBhcnR5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBS2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUNMLG9DQUFvQyxFQUNwQyxxQ0FBcUMsRUFDckMsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQix1QkFBdUIsR0FDeEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBUUwsd0JBQXdCLEVBRXhCLGdCQUFnQixFQUNoQixvQkFBb0IsR0FDckIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsaUJB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Q0FBQyxzQkFBc0I7Z0JBQzlDLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLHlCQUF5QjtnQkFDakQsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO2dCQUM3QixPQUFPLEVBQUUsV0FBVztnQkFDcEIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO2dCQUN6QixlQUFlLEVBQUUsUUFBUSxDQUFDLGFBQWE7Z0JBQ3ZDLGVBQWUsRUFBRSxRQUFRLENBQUMsU0FBUzthQUNwQyxDQUFDOztLQUNIOzs7O1lBN1ZGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBN0NRLFVBQVU7WUFTVixlQUFlO1lBQ2Ysd0JBQXdCO1lBTXhCLFdBQVc7WUFMWCxvQkFBb0I7WUFQcEIsa0JBQWtCO1lBVWxCLGVBQWU7WUFDZixVQUFVO1lBMEJWLGlCQUFpQjtZQTVCakIsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgS2V5RXhjaGFuZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2tleS1leGNoYW5nZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBEZWNyeXB0ZWRLZXlFeGNoYW5nZSxcclxuICBSZXNwb25kT3RrSW5wdXQsXHJcbn0gZnJvbSAnLi4vYXBpL2tleS1leGNoYW5nZS50eXBlcyc7XHJcbmltcG9ydCB7IExyQXBvbGxvU2VydmljZSB9IGZyb20gJy4uL2FwaS9sci1hcG9sbG8uc2VydmljZSc7XHJcbmltcG9ydCB7IFNoYXJlZENvbnRhY3RDYXJkU2VydmljZSB9IGZyb20gJy4uL2FwaS9zaGFyZWQtY29udGFjdC1jYXJkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMaWZlUmVhZHlBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGgvbGlmZS1yZWFkeS1hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBY2Nlc3NMZXZlbCB9IGZyb20gJy4uL2NhdGVnb3J5L2NhdGVnb3J5LnR5cGVzJztcclxuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkvZW5jcnlwdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgS2V5R3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS1ncmFwaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXkuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vdXNlcnMvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29udGFjdENhcmROYW1lIH0gZnJvbSAnLi4vdXNlcnMvcHJvZmlsZS50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQ2FuY2VsVHJ1c3RlZFBhcnR5SW52aXRhdGlvbk11dGF0aW9uLFxyXG4gIERlY2xpbmVUcnVzdGVkUGFydHlJbnZpdGF0aW9uTXV0YXRpb24sXHJcbiAgRGVsZXRlVHJ1c3RlZFBhcnR5TXV0YXRpb24sXHJcbiAgR2V0QWxsVHJ1c3RlZFBhcnRpZXNRdWVyeSxcclxuICBHZXRUcnVzdGVkUGFydGllc1F1ZXJ5LFxyXG4gIEdldFRydXN0ZWRQYXJ0eVF1ZXJ5LFxyXG4gIFNoYXJlQ2F0ZWdvcnlNdXRhdGlvbixcclxuICBVbnNoYXJlQ2F0ZWdvcnlNdXRhdGlvbixcclxufSBmcm9tICcuL3RydXN0ZWQtcGFydHkuZ3FsJztcclxuaW1wb3J0IHtcclxuICBBY2NlcHRUcnVzdGVkUGFydHlJbnZpdGUsXHJcbiAgQ29uZmlybVRydXN0ZWRQYXJ0eUludml0ZSxcclxuICBGb3VuZFRydXN0ZWRQYXJ0eSxcclxuICBJbnZpdGVUcnVzdGVkUGFydHksXHJcbiAgVHJ1c3RlZFBhcnRpZXMsXHJcbiAgVHJ1c3RlZFBhcnR5LFxyXG4gIFRydXN0ZWRQYXJ0eUludml0ZSxcclxuICBUcnVzdGVkUGFydHlJbnZpdGVTdGF0dXMsXHJcbiAgVHJ1c3RlZFBhcnR5Um9sZSxcclxuICBUcnVzdGVkUGFydHlUeXBlLFxyXG4gIFRydXN0ZWRQYXJ0eVJvbGVUeXBlLFxyXG59IGZyb20gJy4vdHJ1c3RlZC1wYXJ0eS50eXBlcyc7XHJcbmltcG9ydCB7IEtleUZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS1mYWN0b3J5LnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRydXN0ZWRQYXJ0eVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgdHJ1c3RlZFBhcnR5Um9sZXM6IFRydXN0ZWRQYXJ0eVJvbGVbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGxyQXBvbGxvOiBMckFwb2xsb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNoYXJlZENvbnRhY3RDYXJkU2VydmljZTogU2hhcmVkQ29udGFjdENhcmRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBMaWZlUmVhZHlBdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUga2V5RXhjaGFuZ2VTZXJ2aWNlOiBLZXlFeGNoYW5nZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGtleUdyYXBoU2VydmljZTogS2V5R3JhcGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBrZXlGYWN0b3J5OiBLZXlGYWN0b3J5U2VydmljZSxcclxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VHJ1c3RlZFBhcnRpZXMoKTogUHJvbWlzZTxUcnVzdGVkUGFydHlbXT4ge1xyXG4gICAgY29uc3QgeyB0cHMgfSA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8YW55Pih7XHJcbiAgICAgIHF1ZXJ5OiBHZXRUcnVzdGVkUGFydGllc1F1ZXJ5LFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIHRwcy5lZGdlcy5tYXAoKHgpID0+IHRoaXMubWFwVHJ1c3RlZFBhcnR5KHgubm9kZSkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFsbFRydXN0ZWRQYXJ0aWVzKCk6IFByb21pc2U8VHJ1c3RlZFBhcnRpZXM+IHtcclxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXIoKTtcclxuICAgIGNvbnN0IHsgdHBzLCBpbnZpdGVzLCBzZW50SW52aXRlcyB9ID0gYXdhaXQgdGhpcy5sckFwb2xsby5xdWVyeTxhbnk+KHtcclxuICAgICAgcXVlcnk6IEdldEFsbFRydXN0ZWRQYXJ0aWVzUXVlcnksXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIHVzZXJJZDogdXNlci5pZCxcclxuICAgICAgICBpc0V4cGlyZWQ6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcGFydGllczogKFxyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsPFRydXN0ZWRQYXJ0eT4oXHJcbiAgICAgICAgICB0cHMuZWRnZXMubWFwKCh4KSA9PiB0aGlzLm1hcFRydXN0ZWRQYXJ0eSh4Lm5vZGUpKVxyXG4gICAgICAgIClcclxuICAgICAgKS5maWx0ZXIoKHgpID0+IHgpLFxyXG4gICAgICBpbnZpdGVzOiAoXHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGw8VHJ1c3RlZFBhcnR5SW52aXRlPihcclxuICAgICAgICAgIGludml0ZXMuZWRnZXMubWFwKGFzeW5jICh4KSA9PlxyXG4gICAgICAgICAgICB0aGlzLm1hcEludml0ZShcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5kZWNyeXB0S2V5RXhjaGFuZ2UoeC5ub2RlKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICAgICAgLmZpbHRlcigoeCkgPT4geC5zdGF0dXMgIT09IFRydXN0ZWRQYXJ0eUludml0ZVN0YXR1cy5Db21wbGV0ZWQpXHJcbiAgICAgICAgLmZpbHRlcihcclxuICAgICAgICAgICh4KSA9PlxyXG4gICAgICAgICAgICB4LnN0YXR1cyAhPT0gVHJ1c3RlZFBhcnR5SW52aXRlU3RhdHVzLkludml0ZWQgfHwgeC5hY3Rpb25SZXF1aXJlZFxyXG4gICAgICAgICksXHJcbiAgICAgIHNlbnRJbnZpdGVzOiAoXHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGw8VHJ1c3RlZFBhcnR5SW52aXRlPihcclxuICAgICAgICAgIHNlbnRJbnZpdGVzLmVkZ2VzLm1hcChhc3luYyAoeCkgPT5cclxuICAgICAgICAgICAgdGhpcy5tYXBJbnZpdGUoXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5rZXlFeGNoYW5nZVNlcnZpY2UuZGVjcnlwdEtleUV4Y2hhbmdlKHgubm9kZSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKS5maWx0ZXIoKHgpID0+IHguc3RhdHVzICE9PSBUcnVzdGVkUGFydHlJbnZpdGVTdGF0dXMuQ29tcGxldGVkKSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VHJ1c3RlZFBhcnR5KHBhcnR5SWQ6IHN0cmluZyk6IFByb21pc2U8VHJ1c3RlZFBhcnR5PiB7XHJcbiAgICBjb25zdCB7IHRwIH0gPSBhd2FpdCB0aGlzLmxyQXBvbGxvLnF1ZXJ5PGFueT4oe1xyXG4gICAgICBxdWVyeTogR2V0VHJ1c3RlZFBhcnR5UXVlcnksXHJcbiAgICAgIHZhcmlhYmxlczogeyBwYXJ0eUlkIH0sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLm1hcFRydXN0ZWRQYXJ0eSh0cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VHJ1c3RlZFBhcnR5Um9sZXMoXHJcbiAgICByb2xlVHlwZTogVHJ1c3RlZFBhcnR5Um9sZVR5cGUgPSBUcnVzdGVkUGFydHlSb2xlVHlwZS5HZW5lcmFsXHJcbiAgKTogUHJvbWlzZTxUcnVzdGVkUGFydHlSb2xlW10+IHtcclxuICAgIGlmICghdGhpcy50cnVzdGVkUGFydHlSb2xlcykge1xyXG4gICAgICB0aGlzLnRydXN0ZWRQYXJ0eVJvbGVzID0gYXdhaXQgdGhpcy5odHRwXHJcbiAgICAgICAgLmdldDxUcnVzdGVkUGFydHlSb2xlW10+KCcvYXNzZXRzL21ldGEvdHJ1c3RlZC1wYXJ0eS1yb2xlcy5qc29uJylcclxuICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxyXG4gICAgICB0aGlzLnRydXN0ZWRQYXJ0eVJvbGVzLmZpbHRlcigoeCkgPT4geC5yb2xlVHlwZSA9PT0gcm9sZVR5cGUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGZpbmRCeUVtYWlsKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPEZvdW5kVHJ1c3RlZFBhcnR5PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VyQnlFbWFpbChlbWFpbCk7XHJcblxyXG4gICAgICByZXR1cm4gdXNlclxyXG4gICAgICAgID8ge1xyXG4gICAgICAgICAgICBpZDogdXNlci5pZCxcclxuICAgICAgICAgICAgZW1haWwsXHJcbiAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lLFxyXG4gICAgICAgICAgICBpc1RydXN0ZWRQYXJ0eTogdXNlci5oYXZlVHAsXHJcbiAgICAgICAgICAgIGlzTWU6IHVzZXIuaXNDdXJyZW50VXNlcixcclxuICAgICAgICAgIH1cclxuICAgICAgICA6IG51bGw7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGludml0ZVRydXN0ZWRQYXJ0eShpbnZpdGU6IEludml0ZVRydXN0ZWRQYXJ0eSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICByZXNwb25kZXJVc2VybmFtZTogaW52aXRlLnBhcnR5LnVzZXJuYW1lLFxyXG4gICAgICBlbWFpbDogaW52aXRlLnBhcnR5LmVtYWlsLFxyXG4gICAgICBtZXNzYWdlOiB7XHJcbiAgICAgICAgbmFtZTogaW52aXRlLnBhcnR5Lm5hbWUsXHJcbiAgICAgICAgZW1haWw6IGludml0ZS5wYXJ0eS5lbWFpbCxcclxuICAgICAgICBtZXNzYWdlOiBpbnZpdGUucGFydHkubWVzc2FnZSxcclxuICAgICAgICBwZXJtaXNzaW9uczogaW52aXRlLnBlcm1pc3Npb25zLFxyXG4gICAgICB9LFxyXG4gICAgICBjb250YWN0Q2FyZDoge1xyXG4gICAgICAgIHBsYWluT3duZXJDaXBoZXJEYXRhSnNvbjogbnVsbCxcclxuICAgICAgICBwbGFpblNoYXJlZENpcGhlckRhdGFKc29uOiBpbnZpdGUubXlTaGFyZWREZXRhaWxzLFxyXG4gICAgICAgIG93bmVyUGxhaW5EYXRhOiB7XHJcbiAgICAgICAgICBuYW1lOiBuZXcgQ29udGFjdENhcmROYW1lKGludml0ZS5teVNoYXJlZERldGFpbHMubmFtZSksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5pbml0aWF0ZU90ayhwYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNhbmNlbEludml0YXRpb24oaW52aXRlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sckFwb2xsby5tdXRhdGUoe1xyXG4gICAgICBtdXRhdGlvbjogQ2FuY2VsVHJ1c3RlZFBhcnR5SW52aXRhdGlvbk11dGF0aW9uLFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBpbnB1dDoge1xyXG4gICAgICAgICAgaWQ6IGludml0ZUlkLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRJbnZpdGF0aW9uKFxyXG4gICAgaW52aXRlSWQ6IHN0cmluZyxcclxuICAgIGludml0ZVRva2VuOiBzdHJpbmcsXHJcbiAgICBrZXk6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8VHJ1c3RlZFBhcnR5SW52aXRlPiB7XHJcbiAgICBjb25zdCBleGNoYW5nZSA9IGF3YWl0IHRoaXMua2V5RXhjaGFuZ2VTZXJ2aWNlLmdldEtleUV4Y2hhbmdlKGludml0ZUlkLCB7XHJcbiAgICAgIHRva2VuOiBpbnZpdGVUb2tlbixcclxuICAgICAgb3RLZXlLOiBrZXksXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBJbnZpdGUoZXhjaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFjY2VwdEludml0YXRpb24oXHJcbiAgICBpbnZpdGU6IEFjY2VwdFRydXN0ZWRQYXJ0eUludml0ZVxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBwYXJhbXM6IFJlc3BvbmRPdGtJbnB1dCA9IHtcclxuICAgICAgaWQ6IGludml0ZS5pbnZpdGVJZCxcclxuICAgICAgdG9rZW46IGludml0ZS5pbnZpdGVUb2tlbixcclxuICAgICAgZGVjcnlwdGVkT3RrOiBpbnZpdGUuZGVjcnlwdGVkT3RrLFxyXG4gICAgICBpbml0aWF0b3JDb250YWN0Q2FyZDogbnVsbCxcclxuICAgICAgcmVzcG9uZGVyQ29udGFjdENhcmQ6IHtcclxuICAgICAgICBwbGFpbk93bmVyQ2lwaGVyRGF0YUpzb246IG51bGwsXHJcbiAgICAgICAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbjogaW52aXRlLm15U2hhcmVkRGV0YWlscyxcclxuICAgICAgICBvd25lclBsYWluRGF0YToge1xyXG4gICAgICAgICAgbmFtZTogbmV3IENvbnRhY3RDYXJkTmFtZShpbnZpdGUubXlTaGFyZWREZXRhaWxzLm5hbWUpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdHAgfSA9IGF3YWl0IHRoaXMua2V5RXhjaGFuZ2VTZXJ2aWNlLnJlc3BvbmRPdGsocGFyYW1zKTtcclxuXHJcbiAgICByZXR1cm4gdHAuaWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVjbGluZUludml0YXRpb24oXHJcbiAgICBpbnZpdGVJZDogc3RyaW5nLFxyXG4gICAgaW52aXRlVG9rZW46IHN0cmluZ1xyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sckFwb2xsby5tdXRhdGUoe1xyXG4gICAgICBtdXRhdGlvbjogRGVjbGluZVRydXN0ZWRQYXJ0eUludml0YXRpb25NdXRhdGlvbixcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIGlkOiBpbnZpdGVJZCxcclxuICAgICAgICAgIHRva2VuOiBpbnZpdGVUb2tlbixcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY29uZmlybUludml0YXRpb24oXHJcbiAgICBjb25maXJtOiBDb25maXJtVHJ1c3RlZFBhcnR5SW52aXRlXHJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHsgdHAgfSA9IGF3YWl0IHRoaXMua2V5RXhjaGFuZ2VTZXJ2aWNlLmNvbXBsZXRlT3RrKFxyXG4gICAgICBjb25maXJtLmludml0ZUlkLFxyXG4gICAgICBjb25maXJtLmluaXRpYXRvclJvb3RLZXlDaXBoZXIsXHJcbiAgICAgIGNvbmZpcm0uaW5pdGlhdG9yT25lVGltZVBia0NpcGhlcixcclxuICAgICAgbnVsbFxyXG4gICAgKTtcclxuICAgIHJldHVybiB0cC5pZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyByZW1vdmVUcnVzdGVkUGFydHkocGFydHlJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmxyQXBvbGxvLm11dGF0ZSh7XHJcbiAgICAgIG11dGF0aW9uOiBEZWxldGVUcnVzdGVkUGFydHlNdXRhdGlvbixcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIGlkOiBwYXJ0eUlkLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDYXRlZ29yeUFjY2Vzc0xldmVsKFxyXG4gICAgY2F0ZWdvcnlJZDogc3RyaW5nLFxyXG4gICAga2V5SWQ6IHN0cmluZyxcclxuICAgIHRydXN0ZWRQYXJ0eTogVHJ1c3RlZFBhcnR5LFxyXG4gICAgYWNjZXNzTGV2ZWw/OiBBY2Nlc3NMZXZlbFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGFjY2Vzc0xldmVsXHJcbiAgICAgID8gdGhpcy5zaGFyZURpcmVjdG9yeShjYXRlZ29yeUlkLCBrZXlJZCwgdHJ1c3RlZFBhcnR5LCBhY2Nlc3NMZXZlbClcclxuICAgICAgOiB0aGlzLnVuc2hhcmVEaXJlY3RvcnkoY2F0ZWdvcnlJZCwgdHJ1c3RlZFBhcnR5LmlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRSZWNvcmRBY2Nlc3NMZXZlbChcclxuICAgIHJlY29yZElkOiBzdHJpbmcsXHJcbiAgICBrZXlJZDogc3RyaW5nLFxyXG4gICAgdHJ1c3RlZFBhcnR5OiBUcnVzdGVkUGFydHksXHJcbiAgICBhY2Nlc3NMZXZlbDogQWNjZXNzTGV2ZWxcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhY2Nlc3NMZXZlbFxyXG4gICAgICA/IHRoaXMuc2hhcmVEaXJlY3RvcnkocmVjb3JkSWQsIGtleUlkLCB0cnVzdGVkUGFydHksIGFjY2Vzc0xldmVsKVxyXG4gICAgICA6IHRoaXMudW5zaGFyZURpcmVjdG9yeShyZWNvcmRJZCwgdHJ1c3RlZFBhcnR5LmlkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2hhcmVEaXJlY3RvcnkoXHJcbiAgICBkaXJlY3RvcnlJZDogc3RyaW5nLFxyXG4gICAga2V5SWQ6IHN0cmluZyxcclxuICAgIHRydXN0ZWRQYXJ0eTogVHJ1c3RlZFBhcnR5LFxyXG4gICAgYWNjZXNzTGV2ZWw6IEFjY2Vzc0xldmVsXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoU2VydmljZS5nZXRLZXkoa2V5SWQpO1xyXG4gICAgY29uc3Qgd3JhcHBpbmdLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoU2VydmljZS5nZXRLZXkoXHJcbiAgICAgIHRydXN0ZWRQYXJ0eS51c2VyU2hhcmVkS2V5LnNoYXJlZEtleS5pZFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHdyYXBwZWRLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgIHdyYXBwaW5nS2V5Lmp3ayxcclxuICAgICAga2V5Lmp3ay50b0pTT04odHJ1ZSlcclxuICAgICk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5sckFwb2xsby5tdXRhdGUoe1xyXG4gICAgICBtdXRhdGlvbjogU2hhcmVDYXRlZ29yeU11dGF0aW9uLFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBpbnB1dDoge1xyXG4gICAgICAgICAgaWQ6IGRpcmVjdG9yeUlkLFxyXG4gICAgICAgICAgdHBJZDogdHJ1c3RlZFBhcnR5LmlkLFxyXG4gICAgICAgICAgYWNjZXNzUm9sZTogYWNjZXNzTGV2ZWwsXHJcbiAgICAgICAgICBrZXlJZDoga2V5LmlkLFxyXG4gICAgICAgICAgd3JhcHBpbmdLZXlJZDogd3JhcHBpbmdLZXkuaWQsXHJcbiAgICAgICAgICB3cmFwcGVkS2V5OiBKU09OLnN0cmluZ2lmeSh3cmFwcGVkS2V5KSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHVuc2hhcmVEaXJlY3RvcnkoXHJcbiAgICBkaXJlY3RvcnlJZDogc3RyaW5nLFxyXG4gICAgdHJ1c3RlZFBhcnR5SWQ6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sckFwb2xsby5tdXRhdGUoe1xyXG4gICAgICBtdXRhdGlvbjogVW5zaGFyZUNhdGVnb3J5TXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICBpZDogZGlyZWN0b3J5SWQsXHJcbiAgICAgICAgICB0cElkOiB0cnVzdGVkUGFydHlJZCxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbWFwVHJ1c3RlZFBhcnR5KHRwOiBhbnkpOiBQcm9taXNlPFRydXN0ZWRQYXJ0eT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgY29udGFjdENhcmQgPVxyXG4gICAgICAgIHRwLnNoYXJlZENvbnRhY3RDYXJkICYmXHJcbiAgICAgICAgKGF3YWl0IHRoaXMuc2hhcmVkQ29udGFjdENhcmRTZXJ2aWNlLmRlY3J5cHRUcnVzdGVkUGFydHlEZXRhaWxzKFxyXG4gICAgICAgICAgdHAuc2hhcmVkQ29udGFjdENhcmRcclxuICAgICAgICApKTtcclxuICAgICAgY29uc3QgbXlDb250YWN0Q2FyZCA9XHJcbiAgICAgICAgdHAubXlDb250YWN0Q2FyZCAmJlxyXG4gICAgICAgIChhd2FpdCB0aGlzLnNoYXJlZENvbnRhY3RDYXJkU2VydmljZS5kZWNyeXB0U2hhcmVkVHJ1c3RlZFBhcnR5RGV0YWlscyhcclxuICAgICAgICAgIHRwLm15Q29udGFjdENhcmRcclxuICAgICAgICApKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaWQ6IHRwLmlkLFxyXG4gICAgICAgIHR5cGU6IFRydXN0ZWRQYXJ0eVR5cGUuVXNlciwgLy8gVE9ETzogd2hlbiBwYXJ0bmVyc1xyXG4gICAgICAgIGhhc1NjZW5hcmlvczogISF0cC5zaGFyZWRTY2VuYXJpb3MuZWRnZXMubGVuZ3RoLFxyXG4gICAgICAgIGhhc1NoYXJlZFZhdWx0OiAhIXRwLnNoYXJlZEl0ZW1zLmRpcmVjdG9yaWVzLmVkZ2VzLmxlbmd0aCxcclxuICAgICAgICBuYW1lOiBjb250YWN0Q2FyZCAmJiBjb250YWN0Q2FyZC5uYW1lICYmIGNvbnRhY3RDYXJkLm5hbWUubmFtZSxcclxuICAgICAgICBkZXRhaWxzOiBjb250YWN0Q2FyZCxcclxuICAgICAgICBteVNoYXJlZERldGFpbHM6IG15Q29udGFjdENhcmQsXHJcbiAgICAgICAgdXNlclNoYXJlZEtleTogdHAuY3VycmVudFVzZXJTaGFyZWRLZXkudXNlclNoYXJlZEtleSxcclxuICAgICAgICB1c2VybmFtZTogdHAub3RoZXIudXNlcm5hbWUsXHJcbiAgICAgICAgZmVhdHVyZXM6IHtcclxuICAgICAgICAgIHNoYXJlZFZhdWx0OiB7XHJcbiAgICAgICAgICAgIGhhc0FjY2VzczpcclxuICAgICAgICAgICAgICAodHAub3RoZXIuZmVhdHVyZXM/LnNoYXJlVmF1bHQgfHwgWydub2FjY2VzcyddKVswXSA9PT0gJ2FjY2VzcycsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWNyeXB0IFRydXN0ZWQgUGFydHkuJywgZSwgdHApO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbWFwSW52aXRlKFxyXG4gICAgZXhjaGFuZ2U6IERlY3J5cHRlZEtleUV4Y2hhbmdlXHJcbiAgKTogUHJvbWlzZTxUcnVzdGVkUGFydHlJbnZpdGU+IHtcclxuICAgIGNvbnN0IGNvbnRhY3RDYXJkID0gZXhjaGFuZ2UuY29udGFjdENhcmQ7XHJcbiAgICBjb25zdCBuYW1lID0gZXhjaGFuZ2UuaXNJbml0aWF0b3JcclxuICAgICAgPyBleGNoYW5nZS5teU1lc3NhZ2U/Lm5hbWVcclxuICAgICAgOiBjb250YWN0Q2FyZCAmJiBjb250YWN0Q2FyZC5uYW1lICYmIGNvbnRhY3RDYXJkLm5hbWUubmFtZTtcclxuICAgIGNvbnN0IGVtYWlsID0gZXhjaGFuZ2UuaXNJbml0aWF0b3JcclxuICAgICAgPyBleGNoYW5nZS5teU1lc3NhZ2U/LmVtYWlsXHJcbiAgICAgIDogKGNvbnRhY3RDYXJkICYmIGNvbnRhY3RDYXJkLmVtYWlsKSB8fCBleGNoYW5nZS5yZXNwb25kZXJFbWFpbEFkZHJlc3M7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IGV4Y2hhbmdlLmlkLFxyXG4gICAgICB0eXBlOiBUcnVzdGVkUGFydHlUeXBlLlVzZXIsIC8vIHRvZG8gd2hlbiBwYXJ0bmVyc1xyXG4gICAgICBzdGF0dXM6IChleGNoYW5nZS5zdGF0ZSBhcyB1bmtub3duKSBhcyBUcnVzdGVkUGFydHlJbnZpdGVTdGF0dXMsXHJcbiAgICAgIHRva2VuOiBleGNoYW5nZS50b2tlbixcclxuICAgICAgdG9rZW5FeHBpcnk6IGV4Y2hhbmdlLnRva2VuRXhwaXJ5VGltZSxcclxuICAgICAgZGVjcnlwdGVkT3RrOiBleGNoYW5nZS5kZWNyeXB0ZWRPdGssXHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGVtYWlsLFxyXG4gICAgICBpc1NlbmRlcjogZXhjaGFuZ2UuaXNJbml0aWF0b3IsXHJcbiAgICAgIGFjdGlvblJlcXVpcmVkOiBleGNoYW5nZS5pc0luaXRpYXRvclxyXG4gICAgICAgID8gZXhjaGFuZ2UuaW5pdGlhdG9yQWN0aW9uUmVxdWlyZWRcclxuICAgICAgICA6IGV4Y2hhbmdlLnJlc3BvbmRlckFjdGlvblJlcXVpcmVkLFxyXG4gICAgICByb290S2V5Q2lwaGVyOiBleGNoYW5nZS5pbml0aWF0b3JSb290S2V5Q2lwaGVyLFxyXG4gICAgICBwYmtDaXBoZXI6IGV4Y2hhbmdlLm90ay5pbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLFxyXG4gICAgICBpc0V4cGlyZWQ6IGV4Y2hhbmdlLmlzRXhwaXJlZCxcclxuICAgICAgZGV0YWlsczogY29udGFjdENhcmQsXHJcbiAgICAgIG1lc3NhZ2U6IGV4Y2hhbmdlLm1lc3NhZ2UsXHJcbiAgICAgIG15U2hhcmVkRGV0YWlsczogZXhjaGFuZ2UubXlDb250YWN0Q2FyZCxcclxuICAgICAgbXlTaGFyZWRNZXNzYWdlOiBleGNoYW5nZS5teU1lc3NhZ2UsXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=
|