@cubist-labs/cubesigner-sdk 0.1.23
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/LICENSE-APACHE +177 -0
- package/LICENSE-MIT +25 -0
- package/NOTICE +13 -0
- package/README.md +470 -0
- package/dist/examples/ethers.d.ts +1 -0
- package/dist/examples/ethers.js +142 -0
- package/dist/spec/env/beta.json +9 -0
- package/dist/spec/env/gamma.json +9 -0
- package/dist/spec/env/prod.json +9 -0
- package/dist/src/client.d.ts +10 -0
- package/dist/src/client.js +21 -0
- package/dist/src/env.d.ts +15 -0
- package/dist/src/env.js +35 -0
- package/dist/src/ethers/index.d.ts +50 -0
- package/dist/src/ethers/index.js +122 -0
- package/dist/src/index.d.ts +114 -0
- package/dist/src/index.js +205 -0
- package/dist/src/key.d.ts +114 -0
- package/dist/src/key.js +201 -0
- package/dist/src/mfa.d.ts +23 -0
- package/dist/src/mfa.js +63 -0
- package/dist/src/org.d.ts +161 -0
- package/dist/src/org.js +264 -0
- package/dist/src/role.d.ts +224 -0
- package/dist/src/role.js +256 -0
- package/dist/src/schema.d.ts +3049 -0
- package/dist/src/schema.js +7 -0
- package/dist/src/session/generic.d.ts +47 -0
- package/dist/src/session/generic.js +3 -0
- package/dist/src/session/management_session_manager.d.ts +59 -0
- package/dist/src/session/management_session_manager.js +111 -0
- package/dist/src/session/oidc_session_manager.d.ts +78 -0
- package/dist/src/session/oidc_session_manager.js +142 -0
- package/dist/src/session/session_manager.d.ts +74 -0
- package/dist/src/session/session_manager.js +79 -0
- package/dist/src/session/session_storage.d.ts +47 -0
- package/dist/src/session/session_storage.js +76 -0
- package/dist/src/session/signer_session_manager.d.ts +88 -0
- package/dist/src/session/signer_session_manager.js +159 -0
- package/dist/src/sign.d.ts +114 -0
- package/dist/src/sign.js +248 -0
- package/dist/src/signer_session.d.ts +180 -0
- package/dist/src/signer_session.js +369 -0
- package/dist/src/util.d.ts +35 -0
- package/dist/src/util.js +75 -0
- package/dist/test/sessions.d.ts +35 -0
- package/dist/test/sessions.js +56 -0
- package/package.json +61 -0
- package/src/client.ts +12 -0
- package/src/env.ts +25 -0
- package/src/ethers/index.ts +131 -0
- package/src/index.ts +220 -0
- package/src/key.ts +249 -0
- package/src/org.ts +333 -0
- package/src/role.ts +385 -0
- package/src/schema.ts +3054 -0
- package/src/session/management_session_manager.ts +136 -0
- package/src/session/oidc_session_manager.ts +193 -0
- package/src/session/session_manager.ts +114 -0
- package/src/session/session_storage.ts +73 -0
- package/src/session/signer_session_manager.ts +211 -0
- package/src/signer_session.ts +464 -0
- package/src/util.ts +58 -0
- package/tsconfig.json +32 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { CubeSigner, Key, OidcSessionManager, OidcSessionStorage } from ".";
|
|
2
|
+
import { components, paths } from "./client";
|
|
3
|
+
import { SignerSessionManager, SignerSessionStorage } from "./session/signer_session_manager";
|
|
4
|
+
export type KeyInfo = components["schemas"]["KeyInfo"];
|
|
5
|
+
export type EvmSignRequest = paths["/v1/org/{org_id}/eth1/sign/{pubkey}"]["post"]["requestBody"]["content"]["application/json"];
|
|
6
|
+
export type Eth2SignRequest = paths["/v1/org/{org_id}/eth2/sign/{pubkey}"]["post"]["requestBody"]["content"]["application/json"];
|
|
7
|
+
export type Eth2StakeRequest = paths["/v1/org/{org_id}/eth2/stake"]["post"]["requestBody"]["content"]["application/json"];
|
|
8
|
+
export type Eth2UnstakeRequest = paths["/v1/org/{org_id}/eth2/unstake/{pubkey}"]["post"]["requestBody"]["content"]["application/json"];
|
|
9
|
+
export type BlobSignRequest = paths["/v1/org/{org_id}/blob/sign/{key_id}"]["post"]["requestBody"]["content"]["application/json"];
|
|
10
|
+
export type BtcSignRequest = paths["/v0/org/{org_id}/btc/sign/{pubkey}"]["post"]["requestBody"]["content"]["application/json"];
|
|
11
|
+
export type SolanaSignRequest = paths["/v1/org/{org_id}/solana/sign/{pubkey}"]["post"]["requestBody"]["content"]["application/json"];
|
|
12
|
+
export type EvmSignResponse = components["responses"]["Eth1SignResponse"]["content"]["application/json"];
|
|
13
|
+
export type Eth2SignResponse = components["responses"]["Eth2SignResponse"]["content"]["application/json"];
|
|
14
|
+
export type Eth2StakeResponse = components["responses"]["StakeResponse"]["content"]["application/json"];
|
|
15
|
+
export type Eth2UnstakeResponse = components["responses"]["UnstakeResponse"]["content"]["application/json"];
|
|
16
|
+
export type BlobSignResponse = components["responses"]["BlobSignResponse"]["content"]["application/json"];
|
|
17
|
+
export type BtcSignResponse = components["responses"]["BtcSignResponse"]["content"]["application/json"];
|
|
18
|
+
export type SolanaSignResponse = components["responses"]["SolanaSignResponse"]["content"]["application/json"];
|
|
19
|
+
export type MfaRequestInfo = components["responses"]["MfaRequestInfo"]["content"]["application/json"];
|
|
20
|
+
export type AcceptedResponse = components["schemas"]["AcceptedResponse"];
|
|
21
|
+
export type ErrorResponse = components["schemas"]["ErrorResponse"];
|
|
22
|
+
export type BtcSignatureKind = components["schemas"]["BtcSignatureKind"];
|
|
23
|
+
/** MFA request kind */
|
|
24
|
+
export type MfaType = components["schemas"]["MfaType"];
|
|
25
|
+
type SignFn<U> = (headers?: HeadersInit) => Promise<U | AcceptedResponse>;
|
|
26
|
+
/**
|
|
27
|
+
* A response of a signing request.
|
|
28
|
+
*/
|
|
29
|
+
export declare class SignResponse<U> {
|
|
30
|
+
#private;
|
|
31
|
+
/** @return {boolean} True if this signing request requires an MFA approval */
|
|
32
|
+
requiresMfa(): boolean;
|
|
33
|
+
/** @return {U} The signed data */
|
|
34
|
+
data(): U;
|
|
35
|
+
/**
|
|
36
|
+
* Approves the MFA request using a given signer session and a TOTP code.
|
|
37
|
+
*
|
|
38
|
+
* Note: This only works for MFA requests that require a single approval.
|
|
39
|
+
*
|
|
40
|
+
* @param {SignerSession} session Signer session to use
|
|
41
|
+
* @param {string} code 6-digit TOTP code
|
|
42
|
+
* @return {SignResponse<U>} The result of signing with the approval
|
|
43
|
+
*/
|
|
44
|
+
approveTotp(session: SignerSession, code: string): Promise<SignResponse<U>>;
|
|
45
|
+
/**
|
|
46
|
+
* Approves the MFA request using CubeSigner's management session.
|
|
47
|
+
*
|
|
48
|
+
* Note: This only works for MFA requests that require a single approval.
|
|
49
|
+
*
|
|
50
|
+
* @return {SignResponse<U>} The result of signing with the approval
|
|
51
|
+
*/
|
|
52
|
+
approve(): Promise<SignResponse<U>>;
|
|
53
|
+
/**
|
|
54
|
+
* Constructor.
|
|
55
|
+
*
|
|
56
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for requests
|
|
57
|
+
* @param {string} orgId The org id of the corresponding signing request
|
|
58
|
+
* @param {SignFn} signFn The signing function that this response is from.
|
|
59
|
+
* This argument is used to resend requests with
|
|
60
|
+
* different headers if needed.
|
|
61
|
+
* @param {U | AcceptedResponse} resp The response as returned by the OpenAPI
|
|
62
|
+
* client.
|
|
63
|
+
*/
|
|
64
|
+
constructor(cs: CubeSigner, orgId: string, signFn: SignFn<U>, resp: U | AcceptedResponse);
|
|
65
|
+
}
|
|
66
|
+
/** Signer session info. Can only be used to revoke a token, but not for authentication. */
|
|
67
|
+
export declare class SignerSessionInfo {
|
|
68
|
+
#private;
|
|
69
|
+
readonly purpose: string;
|
|
70
|
+
/** Revoke this token */
|
|
71
|
+
revoke(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Internal constructor.
|
|
74
|
+
* @param {CubeSigner} cs CubeSigner instance to use when calling `revoke`
|
|
75
|
+
* @param {string} orgId Organization ID
|
|
76
|
+
* @param {string} roleId Role ID
|
|
77
|
+
* @param {string} hash The hash of the token; can be used for revocation but not for auth
|
|
78
|
+
* @param {string} purpose Session purpose
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
81
|
+
constructor(cs: CubeSigner, orgId: string, roleId: string, hash: string, purpose: string);
|
|
82
|
+
}
|
|
83
|
+
/** Signer session. */
|
|
84
|
+
export declare class SignerSession {
|
|
85
|
+
#private;
|
|
86
|
+
readonly cs: CubeSigner;
|
|
87
|
+
sessionMgr: OidcSessionManager | SignerSessionManager;
|
|
88
|
+
/**
|
|
89
|
+
* Returns the list of keys that this token grants access to.
|
|
90
|
+
* @return {Key[]} The list of keys.
|
|
91
|
+
*/
|
|
92
|
+
keys(): Promise<Key[]>;
|
|
93
|
+
/**
|
|
94
|
+
* Approve a pending MFA request using TOTP.
|
|
95
|
+
*
|
|
96
|
+
* @param {string} mfaId The MFA request to approve
|
|
97
|
+
* @param {string} code The TOTP code
|
|
98
|
+
* @return {Promise<MfaRequestInfo>} The current status of the MFA request
|
|
99
|
+
*/
|
|
100
|
+
totpApprove(mfaId: string, code: string): Promise<MfaRequestInfo>;
|
|
101
|
+
/**
|
|
102
|
+
* Submit an EVM sign request.
|
|
103
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
104
|
+
* @param {EvmSignRequest} req What to sign.
|
|
105
|
+
* @return {Promise<EvmSignResponse | AcceptedResponse>} Signature
|
|
106
|
+
*/
|
|
107
|
+
signEvm(key: Key | string, req: EvmSignRequest): Promise<SignResponse<EvmSignResponse>>;
|
|
108
|
+
/**
|
|
109
|
+
* Submit an 'eth2' sign request.
|
|
110
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
111
|
+
* @param {Eth2SignRequest} req What to sign.
|
|
112
|
+
* @return {Promise<Eth2SignResponse | AcceptedResponse>} Signature
|
|
113
|
+
*/
|
|
114
|
+
signEth2(key: Key | string, req: Eth2SignRequest): Promise<SignResponse<Eth2SignResponse>>;
|
|
115
|
+
/**
|
|
116
|
+
* Sign a stake request.
|
|
117
|
+
* @param {Eth2StakeRequest} req The request to sign.
|
|
118
|
+
* @return {Promise<Eth2StakeResponse | AcceptedResponse>} The response.
|
|
119
|
+
*/
|
|
120
|
+
stake(req: Eth2StakeRequest): Promise<SignResponse<Eth2StakeResponse>>;
|
|
121
|
+
/**
|
|
122
|
+
* Sign an unstake request.
|
|
123
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
124
|
+
* @param {Eth2UnstakeRequest} req The request to sign.
|
|
125
|
+
* @return {Promise<Eth2UnstakeResponse | AcceptedResponse>} The response.
|
|
126
|
+
*/
|
|
127
|
+
unstake(key: Key | string, req: Eth2UnstakeRequest): Promise<SignResponse<Eth2UnstakeResponse>>;
|
|
128
|
+
/**
|
|
129
|
+
* Sign a raw blob.
|
|
130
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its ID).
|
|
131
|
+
* @param {BlobSignRequest} req What to sign
|
|
132
|
+
* @return {Promise<BlobSignResponse | AcceptedResponse>} The response.
|
|
133
|
+
*/
|
|
134
|
+
signBlob(key: Key | string, req: BlobSignRequest): Promise<SignResponse<BlobSignResponse>>;
|
|
135
|
+
/**
|
|
136
|
+
* Sign a bitcoin message.
|
|
137
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
138
|
+
* @param {BtcSignRequest} req What to sign
|
|
139
|
+
* @return {Promise<BtcSignResponse | AcceptedResponse>} The response.
|
|
140
|
+
*/
|
|
141
|
+
signBtc(key: Key | string, req: BtcSignRequest): Promise<SignResponse<BtcSignResponse>>;
|
|
142
|
+
/**
|
|
143
|
+
* Sign a solana message.
|
|
144
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
145
|
+
* @param {SolanaSignRequest} req What to sign
|
|
146
|
+
* @return {Promise<SolanaSignResponse | AcceptedResponse>} The response.
|
|
147
|
+
*/
|
|
148
|
+
signSolana(key: Key | string, req: SolanaSignRequest): Promise<SignResponse<SolanaSignResponse>>;
|
|
149
|
+
/**
|
|
150
|
+
* Loads an existing signer session from storage.
|
|
151
|
+
* @param {CubeSigner} cs The CubeSigner instance
|
|
152
|
+
* @param {SignerSessionStorage} storage The session storage to use
|
|
153
|
+
* @return {Promise<SingerSession>} New signer session
|
|
154
|
+
*/
|
|
155
|
+
static loadSignerSession(cs: CubeSigner, storage: SignerSessionStorage): Promise<SignerSession>;
|
|
156
|
+
/**
|
|
157
|
+
* Loads an existing OIDC session from storage
|
|
158
|
+
* @param {CubeSigner} cs The CubeSigner instance
|
|
159
|
+
* @param {OidcSessionStorage} storage The storage to use
|
|
160
|
+
* @return {Promise<SignerSession>} New signer session
|
|
161
|
+
*/
|
|
162
|
+
static loadOidcSession(cs: CubeSigner, storage: OidcSessionStorage): Promise<SignerSession>;
|
|
163
|
+
/**
|
|
164
|
+
* Constructor.
|
|
165
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for requests
|
|
166
|
+
* @param {OidcSessionManager | SignerSessionManager} sessionMgr The session manager to use
|
|
167
|
+
* @internal
|
|
168
|
+
*/
|
|
169
|
+
constructor(cs: CubeSigner, sessionMgr: OidcSessionManager | SignerSessionManager);
|
|
170
|
+
/**
|
|
171
|
+
* Static method for revoking a token (used both from {SignerSession} and {SignerSessionInfo}).
|
|
172
|
+
* @param {CubeSigner} cs CubeSigner instance
|
|
173
|
+
* @param {string} orgId Organization ID
|
|
174
|
+
* @param {string} roleId Role ID
|
|
175
|
+
* @param {string} sessionId Signer session ID
|
|
176
|
+
* @internal
|
|
177
|
+
*/
|
|
178
|
+
static revoke(cs: CubeSigner, orgId: string, roleId: string, sessionId: string): Promise<void>;
|
|
179
|
+
}
|
|
180
|
+
export {};
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _SignResponse_instances, _SignResponse_cs, _SignResponse_orgId, _SignResponse_signFn, _SignResponse_resp, _SignResponse_signWithMfaApproval, _SignResponse_mfaId, _SignerSessionInfo_cs, _SignerSessionInfo_orgId, _SignerSessionInfo_roleId, _SignerSessionInfo_sessionId, _SignerSession_orgId;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.SignerSession = exports.SignerSessionInfo = exports.SignResponse = void 0;
|
|
19
|
+
const assert_1 = __importDefault(require("assert"));
|
|
20
|
+
const _1 = require(".");
|
|
21
|
+
const util_1 = require("./util");
|
|
22
|
+
const signer_session_manager_1 = require("./session/signer_session_manager");
|
|
23
|
+
/**
|
|
24
|
+
* A response of a signing request.
|
|
25
|
+
*/
|
|
26
|
+
class SignResponse {
|
|
27
|
+
/** @return {boolean} True if this signing request requires an MFA approval */
|
|
28
|
+
requiresMfa() {
|
|
29
|
+
return __classPrivateFieldGet(this, _SignResponse_resp, "f").accepted?.MfaRequired !== undefined;
|
|
30
|
+
}
|
|
31
|
+
/** @return {U} The signed data */
|
|
32
|
+
data() {
|
|
33
|
+
return __classPrivateFieldGet(this, _SignResponse_resp, "f");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Approves the MFA request using a given signer session and a TOTP code.
|
|
37
|
+
*
|
|
38
|
+
* Note: This only works for MFA requests that require a single approval.
|
|
39
|
+
*
|
|
40
|
+
* @param {SignerSession} session Signer session to use
|
|
41
|
+
* @param {string} code 6-digit TOTP code
|
|
42
|
+
* @return {SignResponse<U>} The result of signing with the approval
|
|
43
|
+
*/
|
|
44
|
+
async approveTotp(session, code) {
|
|
45
|
+
const mfaId = __classPrivateFieldGet(this, _SignResponse_instances, "m", _SignResponse_mfaId).call(this);
|
|
46
|
+
const mfaApproval = await session.totpApprove(mfaId, code);
|
|
47
|
+
(0, assert_1.default)(mfaApproval.id === mfaId);
|
|
48
|
+
const mfaConf = mfaApproval.receipt?.confirmation;
|
|
49
|
+
if (!mfaConf) {
|
|
50
|
+
throw new Error("MfaRequest has not been approved yet");
|
|
51
|
+
}
|
|
52
|
+
return await __classPrivateFieldGet(this, _SignResponse_instances, "m", _SignResponse_signWithMfaApproval).call(this, mfaConf);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Approves the MFA request using CubeSigner's management session.
|
|
56
|
+
*
|
|
57
|
+
* Note: This only works for MFA requests that require a single approval.
|
|
58
|
+
*
|
|
59
|
+
* @return {SignResponse<U>} The result of signing with the approval
|
|
60
|
+
*/
|
|
61
|
+
async approve() {
|
|
62
|
+
const mfaId = __classPrivateFieldGet(this, _SignResponse_instances, "m", _SignResponse_mfaId).call(this);
|
|
63
|
+
const mfaApproval = await _1.Org.mfaApprove(__classPrivateFieldGet(this, _SignResponse_cs, "f"), __classPrivateFieldGet(this, _SignResponse_orgId, "f"), mfaId);
|
|
64
|
+
(0, assert_1.default)(mfaApproval.id === mfaId);
|
|
65
|
+
const mfaConf = mfaApproval.receipt?.confirmation;
|
|
66
|
+
if (!mfaConf) {
|
|
67
|
+
throw new Error("MfaRequest has not been approved yet");
|
|
68
|
+
}
|
|
69
|
+
return await __classPrivateFieldGet(this, _SignResponse_instances, "m", _SignResponse_signWithMfaApproval).call(this, mfaConf);
|
|
70
|
+
}
|
|
71
|
+
// --------------------------------------------------------------------------
|
|
72
|
+
// -- INTERNAL --------------------------------------------------------------
|
|
73
|
+
// --------------------------------------------------------------------------
|
|
74
|
+
/**
|
|
75
|
+
* Constructor.
|
|
76
|
+
*
|
|
77
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for requests
|
|
78
|
+
* @param {string} orgId The org id of the corresponding signing request
|
|
79
|
+
* @param {SignFn} signFn The signing function that this response is from.
|
|
80
|
+
* This argument is used to resend requests with
|
|
81
|
+
* different headers if needed.
|
|
82
|
+
* @param {U | AcceptedResponse} resp The response as returned by the OpenAPI
|
|
83
|
+
* client.
|
|
84
|
+
*/
|
|
85
|
+
constructor(cs, orgId, signFn, resp) {
|
|
86
|
+
_SignResponse_instances.add(this);
|
|
87
|
+
_SignResponse_cs.set(this, void 0);
|
|
88
|
+
_SignResponse_orgId.set(this, void 0);
|
|
89
|
+
_SignResponse_signFn.set(this, void 0);
|
|
90
|
+
_SignResponse_resp.set(this, void 0);
|
|
91
|
+
__classPrivateFieldSet(this, _SignResponse_cs, cs, "f");
|
|
92
|
+
__classPrivateFieldSet(this, _SignResponse_orgId, orgId, "f");
|
|
93
|
+
__classPrivateFieldSet(this, _SignResponse_signFn, signFn, "f");
|
|
94
|
+
__classPrivateFieldSet(this, _SignResponse_resp, resp, "f");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.SignResponse = SignResponse;
|
|
98
|
+
_SignResponse_cs = new WeakMap(), _SignResponse_orgId = new WeakMap(), _SignResponse_signFn = new WeakMap(), _SignResponse_resp = new WeakMap(), _SignResponse_instances = new WeakSet(), _SignResponse_signWithMfaApproval =
|
|
99
|
+
/**
|
|
100
|
+
* @param {string} mfaConf MFA request approval confirmation code
|
|
101
|
+
* @return {Promise<SignResponse<U>>} The result of signing after MFA approval
|
|
102
|
+
*/
|
|
103
|
+
async function _SignResponse_signWithMfaApproval(mfaConf) {
|
|
104
|
+
const mfaId = __classPrivateFieldGet(this, _SignResponse_instances, "m", _SignResponse_mfaId).call(this);
|
|
105
|
+
const headers = {
|
|
106
|
+
"x-cubist-mfa-id": mfaId,
|
|
107
|
+
"x-cubist-mfa-confirmation": mfaConf,
|
|
108
|
+
};
|
|
109
|
+
return new SignResponse(__classPrivateFieldGet(this, _SignResponse_cs, "f"), __classPrivateFieldGet(this, _SignResponse_orgId, "f"), __classPrivateFieldGet(this, _SignResponse_signFn, "f"), await __classPrivateFieldGet(this, _SignResponse_signFn, "f").call(this, headers));
|
|
110
|
+
}, _SignResponse_mfaId = function _SignResponse_mfaId() {
|
|
111
|
+
const mfaRequired = __classPrivateFieldGet(this, _SignResponse_resp, "f").accepted?.MfaRequired;
|
|
112
|
+
if (!mfaRequired) {
|
|
113
|
+
throw new Error("Request does not require MFA approval");
|
|
114
|
+
}
|
|
115
|
+
return mfaRequired.id;
|
|
116
|
+
};
|
|
117
|
+
/** Signer session info. Can only be used to revoke a token, but not for authentication. */
|
|
118
|
+
class SignerSessionInfo {
|
|
119
|
+
/** Revoke this token */
|
|
120
|
+
async revoke() {
|
|
121
|
+
await SignerSession.revoke(__classPrivateFieldGet(this, _SignerSessionInfo_cs, "f"), __classPrivateFieldGet(this, _SignerSessionInfo_orgId, "f"), __classPrivateFieldGet(this, _SignerSessionInfo_roleId, "f"), __classPrivateFieldGet(this, _SignerSessionInfo_sessionId, "f"));
|
|
122
|
+
}
|
|
123
|
+
// --------------------------------------------------------------------------
|
|
124
|
+
// -- INTERNAL --------------------------------------------------------------
|
|
125
|
+
// --------------------------------------------------------------------------
|
|
126
|
+
/**
|
|
127
|
+
* Internal constructor.
|
|
128
|
+
* @param {CubeSigner} cs CubeSigner instance to use when calling `revoke`
|
|
129
|
+
* @param {string} orgId Organization ID
|
|
130
|
+
* @param {string} roleId Role ID
|
|
131
|
+
* @param {string} hash The hash of the token; can be used for revocation but not for auth
|
|
132
|
+
* @param {string} purpose Session purpose
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
constructor(cs, orgId, roleId, hash, purpose) {
|
|
136
|
+
_SignerSessionInfo_cs.set(this, void 0);
|
|
137
|
+
_SignerSessionInfo_orgId.set(this, void 0);
|
|
138
|
+
_SignerSessionInfo_roleId.set(this, void 0);
|
|
139
|
+
_SignerSessionInfo_sessionId.set(this, void 0);
|
|
140
|
+
__classPrivateFieldSet(this, _SignerSessionInfo_cs, cs, "f");
|
|
141
|
+
__classPrivateFieldSet(this, _SignerSessionInfo_orgId, orgId, "f");
|
|
142
|
+
__classPrivateFieldSet(this, _SignerSessionInfo_roleId, roleId, "f");
|
|
143
|
+
__classPrivateFieldSet(this, _SignerSessionInfo_sessionId, hash, "f");
|
|
144
|
+
this.purpose = purpose;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.SignerSessionInfo = SignerSessionInfo;
|
|
148
|
+
_SignerSessionInfo_cs = new WeakMap(), _SignerSessionInfo_orgId = new WeakMap(), _SignerSessionInfo_roleId = new WeakMap(), _SignerSessionInfo_sessionId = new WeakMap();
|
|
149
|
+
/** Signer session. */
|
|
150
|
+
class SignerSession {
|
|
151
|
+
/**
|
|
152
|
+
* Returns the list of keys that this token grants access to.
|
|
153
|
+
* @return {Key[]} The list of keys.
|
|
154
|
+
*/
|
|
155
|
+
async keys() {
|
|
156
|
+
const resp = await (await this.sessionMgr.client()).get("/v0/org/{org_id}/token/keys", {
|
|
157
|
+
params: { path: { org_id: __classPrivateFieldGet(this, _SignerSession_orgId, "f") } },
|
|
158
|
+
parseAs: "json",
|
|
159
|
+
});
|
|
160
|
+
const data = (0, util_1.assertOk)(resp);
|
|
161
|
+
return data.keys.map((k) => new _1.Key(this.cs, __classPrivateFieldGet(this, _SignerSession_orgId, "f"), k));
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Approve a pending MFA request using TOTP.
|
|
165
|
+
*
|
|
166
|
+
* @param {string} mfaId The MFA request to approve
|
|
167
|
+
* @param {string} code The TOTP code
|
|
168
|
+
* @return {Promise<MfaRequestInfo>} The current status of the MFA request
|
|
169
|
+
*/
|
|
170
|
+
async totpApprove(mfaId, code) {
|
|
171
|
+
const resp = await (await this.sessionMgr.client()).patch("/v0/org/{org_id}/mfa/{mfa_id}/totp", {
|
|
172
|
+
params: { path: { org_id: __classPrivateFieldGet(this, _SignerSession_orgId, "f"), mfa_id: mfaId } },
|
|
173
|
+
body: { code },
|
|
174
|
+
parseAs: "json",
|
|
175
|
+
});
|
|
176
|
+
return (0, util_1.assertOk)(resp);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Submit an EVM sign request.
|
|
180
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
181
|
+
* @param {EvmSignRequest} req What to sign.
|
|
182
|
+
* @return {Promise<EvmSignResponse | AcceptedResponse>} Signature
|
|
183
|
+
*/
|
|
184
|
+
async signEvm(key, req) {
|
|
185
|
+
const pubkey = typeof key === "string" ? key : key.materialId;
|
|
186
|
+
const sign = async (headers) => {
|
|
187
|
+
const resp = await (await this.sessionMgr.client()).post("/v1/org/{org_id}/eth1/sign/{pubkey}", {
|
|
188
|
+
params: { path: { org_id: __classPrivateFieldGet(this, _SignerSession_orgId, "f"), pubkey } },
|
|
189
|
+
body: req,
|
|
190
|
+
headers,
|
|
191
|
+
parseAs: "json",
|
|
192
|
+
});
|
|
193
|
+
return (0, util_1.assertOk)(resp);
|
|
194
|
+
};
|
|
195
|
+
return new SignResponse(this.cs, __classPrivateFieldGet(this, _SignerSession_orgId, "f"), sign, await sign());
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Submit an 'eth2' sign request.
|
|
199
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
200
|
+
* @param {Eth2SignRequest} req What to sign.
|
|
201
|
+
* @return {Promise<Eth2SignResponse | AcceptedResponse>} Signature
|
|
202
|
+
*/
|
|
203
|
+
async signEth2(key, req) {
|
|
204
|
+
const pubkey = typeof key === "string" ? key : key.materialId;
|
|
205
|
+
const sign = async (headers) => {
|
|
206
|
+
const resp = await (await this.sessionMgr.client()).post("/v1/org/{org_id}/eth2/sign/{pubkey}", {
|
|
207
|
+
params: { path: { org_id: __classPrivateFieldGet(this, _SignerSession_orgId, "f"), pubkey } },
|
|
208
|
+
body: req,
|
|
209
|
+
headers,
|
|
210
|
+
parseAs: "json",
|
|
211
|
+
});
|
|
212
|
+
return (0, util_1.assertOk)(resp);
|
|
213
|
+
};
|
|
214
|
+
return new SignResponse(this.cs, __classPrivateFieldGet(this, _SignerSession_orgId, "f"), sign, await sign());
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Sign a stake request.
|
|
218
|
+
* @param {Eth2StakeRequest} req The request to sign.
|
|
219
|
+
* @return {Promise<Eth2StakeResponse | AcceptedResponse>} The response.
|
|
220
|
+
*/
|
|
221
|
+
async stake(req) {
|
|
222
|
+
const sign = async (headers) => {
|
|
223
|
+
const resp = await (await this.sessionMgr.client()).post("/v1/org/{org_id}/eth2/stake", {
|
|
224
|
+
params: { path: { org_id: __classPrivateFieldGet(this, _SignerSession_orgId, "f") } },
|
|
225
|
+
body: req,
|
|
226
|
+
headers,
|
|
227
|
+
parseAs: "json",
|
|
228
|
+
});
|
|
229
|
+
return (0, util_1.assertOk)(resp);
|
|
230
|
+
};
|
|
231
|
+
return new SignResponse(this.cs, __classPrivateFieldGet(this, _SignerSession_orgId, "f"), sign, await sign());
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Sign an unstake request.
|
|
235
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
236
|
+
* @param {Eth2UnstakeRequest} req The request to sign.
|
|
237
|
+
* @return {Promise<Eth2UnstakeResponse | AcceptedResponse>} The response.
|
|
238
|
+
*/
|
|
239
|
+
async unstake(key, req) {
|
|
240
|
+
const pubkey = typeof key === "string" ? key : key.materialId;
|
|
241
|
+
const sign = async (headers) => {
|
|
242
|
+
const resp = await (await this.sessionMgr.client()).post("/v1/org/{org_id}/eth2/unstake/{pubkey}", {
|
|
243
|
+
params: { path: { org_id: __classPrivateFieldGet(this, _SignerSession_orgId, "f"), pubkey } },
|
|
244
|
+
body: req,
|
|
245
|
+
headers,
|
|
246
|
+
parseAs: "json",
|
|
247
|
+
});
|
|
248
|
+
return (0, util_1.assertOk)(resp);
|
|
249
|
+
};
|
|
250
|
+
return new SignResponse(this.cs, __classPrivateFieldGet(this, _SignerSession_orgId, "f"), sign, await sign());
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Sign a raw blob.
|
|
254
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its ID).
|
|
255
|
+
* @param {BlobSignRequest} req What to sign
|
|
256
|
+
* @return {Promise<BlobSignResponse | AcceptedResponse>} The response.
|
|
257
|
+
*/
|
|
258
|
+
async signBlob(key, req) {
|
|
259
|
+
const key_id = typeof key === "string" ? key : key.id;
|
|
260
|
+
const sign = async (headers) => {
|
|
261
|
+
const resp = await (await this.sessionMgr.client()).post("/v1/org/{org_id}/blob/sign/{key_id}", {
|
|
262
|
+
params: {
|
|
263
|
+
path: { org_id: __classPrivateFieldGet(this, _SignerSession_orgId, "f"), key_id },
|
|
264
|
+
},
|
|
265
|
+
body: req,
|
|
266
|
+
headers,
|
|
267
|
+
parseAs: "json",
|
|
268
|
+
});
|
|
269
|
+
return (0, util_1.assertOk)(resp);
|
|
270
|
+
};
|
|
271
|
+
return new SignResponse(this.cs, __classPrivateFieldGet(this, _SignerSession_orgId, "f"), sign, await sign());
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Sign a bitcoin message.
|
|
275
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
276
|
+
* @param {BtcSignRequest} req What to sign
|
|
277
|
+
* @return {Promise<BtcSignResponse | AcceptedResponse>} The response.
|
|
278
|
+
*/
|
|
279
|
+
async signBtc(key, req) {
|
|
280
|
+
const pubkey = typeof key === "string" ? key : key.materialId;
|
|
281
|
+
const sign = async (headers) => {
|
|
282
|
+
const resp = await (await this.sessionMgr.client()).post("/v0/org/{org_id}/btc/sign/{pubkey}", {
|
|
283
|
+
params: {
|
|
284
|
+
path: { org_id: __classPrivateFieldGet(this, _SignerSession_orgId, "f"), pubkey },
|
|
285
|
+
},
|
|
286
|
+
body: req,
|
|
287
|
+
headers: headers,
|
|
288
|
+
parseAs: "json",
|
|
289
|
+
});
|
|
290
|
+
return (0, util_1.assertOk)(resp);
|
|
291
|
+
};
|
|
292
|
+
return new SignResponse(this.cs, __classPrivateFieldGet(this, _SignerSession_orgId, "f"), sign, await sign());
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Sign a solana message.
|
|
296
|
+
* @param {Key | string} key The key to sign with (either {@link Key} or its material ID).
|
|
297
|
+
* @param {SolanaSignRequest} req What to sign
|
|
298
|
+
* @return {Promise<SolanaSignResponse | AcceptedResponse>} The response.
|
|
299
|
+
*/
|
|
300
|
+
async signSolana(key, req) {
|
|
301
|
+
const pubkey = typeof key === "string" ? key : key.materialId;
|
|
302
|
+
const sign = async (headers) => {
|
|
303
|
+
const resp = await (await this.sessionMgr.client()).post("/v1/org/{org_id}/solana/sign/{pubkey}", {
|
|
304
|
+
params: { path: { org_id: __classPrivateFieldGet(this, _SignerSession_orgId, "f"), pubkey } },
|
|
305
|
+
body: req,
|
|
306
|
+
headers,
|
|
307
|
+
parseAs: "json",
|
|
308
|
+
});
|
|
309
|
+
return (0, util_1.assertOk)(resp);
|
|
310
|
+
};
|
|
311
|
+
return new SignResponse(this.cs, __classPrivateFieldGet(this, _SignerSession_orgId, "f"), sign, await sign());
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Loads an existing signer session from storage.
|
|
315
|
+
* @param {CubeSigner} cs The CubeSigner instance
|
|
316
|
+
* @param {SignerSessionStorage} storage The session storage to use
|
|
317
|
+
* @return {Promise<SingerSession>} New signer session
|
|
318
|
+
*/
|
|
319
|
+
static async loadSignerSession(cs, storage) {
|
|
320
|
+
const manager = await signer_session_manager_1.SignerSessionManager.loadFromStorage(cs, storage);
|
|
321
|
+
return new SignerSession(cs, manager);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Loads an existing OIDC session from storage
|
|
325
|
+
* @param {CubeSigner} cs The CubeSigner instance
|
|
326
|
+
* @param {OidcSessionStorage} storage The storage to use
|
|
327
|
+
* @return {Promise<SignerSession>} New signer session
|
|
328
|
+
*/
|
|
329
|
+
static async loadOidcSession(cs, storage) {
|
|
330
|
+
const manager = await _1.OidcSessionManager.loadFromStorage(storage);
|
|
331
|
+
return new SignerSession(cs, manager);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Constructor.
|
|
335
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for requests
|
|
336
|
+
* @param {OidcSessionManager | SignerSessionManager} sessionMgr The session manager to use
|
|
337
|
+
* @internal
|
|
338
|
+
*/
|
|
339
|
+
constructor(cs, sessionMgr) {
|
|
340
|
+
_SignerSession_orgId.set(this, void 0);
|
|
341
|
+
this.cs = cs;
|
|
342
|
+
this.sessionMgr = sessionMgr;
|
|
343
|
+
__classPrivateFieldSet(this, _SignerSession_orgId, sessionMgr.orgId, "f");
|
|
344
|
+
}
|
|
345
|
+
// --------------------------------------------------------------------------
|
|
346
|
+
// -- INTERNAL --------------------------------------------------------------
|
|
347
|
+
// --------------------------------------------------------------------------
|
|
348
|
+
/* eslint-disable require-jsdoc */
|
|
349
|
+
/**
|
|
350
|
+
* Static method for revoking a token (used both from {SignerSession} and {SignerSessionInfo}).
|
|
351
|
+
* @param {CubeSigner} cs CubeSigner instance
|
|
352
|
+
* @param {string} orgId Organization ID
|
|
353
|
+
* @param {string} roleId Role ID
|
|
354
|
+
* @param {string} sessionId Signer session ID
|
|
355
|
+
* @internal
|
|
356
|
+
*/
|
|
357
|
+
static async revoke(cs, orgId, roleId, sessionId) {
|
|
358
|
+
const resp = await (await cs.management()).del("/v0/org/{org_id}/roles/{role_id}/tokens/{session_id}", {
|
|
359
|
+
params: {
|
|
360
|
+
path: { org_id: orgId, role_id: roleId, session_id: sessionId },
|
|
361
|
+
},
|
|
362
|
+
parseAs: "json",
|
|
363
|
+
});
|
|
364
|
+
(0, util_1.assertOk)(resp);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
exports.SignerSession = SignerSession;
|
|
368
|
+
_SignerSession_orgId = new WeakMap();
|
|
369
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmVyX3Nlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2lnbmVyX3Nlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLHdCQUFpRjtBQUVqRixpQ0FBa0M7QUFDbEMsNkVBQThGO0FBK0M5Rjs7R0FFRztBQUNILE1BQWEsWUFBWTtJQU12Qiw4RUFBOEU7SUFDOUUsV0FBVztRQUNULE9BQVEsdUJBQUEsSUFBSSwwQkFBMkIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxLQUFLLFNBQVMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLElBQUk7UUFDRixPQUFPLHVCQUFBLElBQUksMEJBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQXNCLEVBQUUsSUFBWTtRQUNwRCxNQUFNLEtBQUssR0FBRyx1QkFBQSxJQUFJLG9EQUFPLE1BQVgsSUFBSSxDQUFTLENBQUM7UUFFNUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQztRQUVsRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ3pEO1FBRUQsT0FBTyxNQUFNLHVCQUFBLElBQUksa0VBQXFCLE1BQXpCLElBQUksRUFBc0IsT0FBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxLQUFLLEdBQUcsdUJBQUEsSUFBSSxvREFBTyxN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a0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEUsT0FBTyxJQUFJLGFBQWEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFjLEVBQUUsVUFBcUQ7UUF2T3hFLHVDQUFlO1FBd090QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLHVCQUFBLElBQUksd0JBQVUsVUFBVSxDQUFDLEtBQUssTUFBQSxDQUFDO0lBQ2pDLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUU3RSxrQ0FBa0M7SUFFbEM7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQWMsRUFBRSxLQUFhLEVBQUUsTUFBYyxFQUFFLFNBQWlCO1FBQ2xGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FDakIsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQ3RCLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxFQUFFO1lBQzVELE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRTthQUNoRTtZQUNELE9BQU8sRUFBRSxNQUFNO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUEsZUFBUSxFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQXpRRCxzQ0F5UUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IEN1YmVTaWduZXIsIEtleSwgT2lkY1Nlc3Npb25NYW5hZ2VyLCBPaWRjU2Vzc2lvblN0b3JhZ2UsIE9yZyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBjb21wb25lbnRzLCBwYXRocyB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHsgYXNzZXJ0T2sgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBTaWduZXJTZXNzaW9uTWFuYWdlciwgU2lnbmVyU2Vzc2lvblN0b3JhZ2UgfSBmcm9tIFwiLi9zZXNzaW9uL3NpZ25lcl9zZXNzaW9uX21hbmFnZXJcIjtcblxuZXhwb3J0IHR5cGUgS2V5SW5mbyA9IGNvbXBvbmVudHNbXCJzY2hlbWFzXCJdW1wiS2V5SW5mb1wiXTtcblxuLyogZXNsaW50LWRpc2FibGUgKi9cbmV4cG9ydCB0eXBlIEV2bVNpZ25SZXF1ZXN0ID1cbiAgcGF0aHNbXCIvdjEvb3JnL3tvcmdfaWR9L2V0aDEvc2lnbi97cHVia2V5fVwiXVtcInBvc3RcIl1bXCJyZXF1ZXN0Qm9keVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgRXRoMlNpZ25SZXF1ZXN0ID1cbiAgcGF0aHNbXCIvdjEvb3JnL3tvcmdfaWR9L2V0aDIvc2lnbi97cHVia2V5fVwiXVtcInBvc3RcIl1bXCJyZXF1ZXN0Qm9keVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgRXRoMlN0YWtlUmVxdWVzdCA9XG4gIHBhdGhzW1wiL3YxL29yZy97b3JnX2lkfS9ldGgyL3N0YWtlXCJdW1wicG9zdFwiXVtcInJlcXVlc3RCb2R5XCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5leHBvcnQgdHlwZSBFdGgyVW5zdGFrZVJlcXVlc3QgPVxuICBwYXRoc1tcIi92MS9vcmcve29yZ19pZH0vZXRoMi91bnN0YWtlL3twdWJrZXl9XCJdW1wicG9zdFwiXVtcInJlcXVlc3RCb2R5XCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5leHBvcnQgdHlwZSBCbG9iU2lnblJlcXVlc3QgPVxuICBwYXRoc1tcIi92MS9vcmcve29yZ19pZH0vYmxvYi9zaWduL3trZXlfaWR9XCJdW1wicG9zdFwiXVtcInJlcXVlc3RCb2R5XCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5leHBvcnQgdHlwZSBCdGNTaWduUmVxdWVzdCA9XG4gIHBhdGhzW1wiL3YwL29yZy97b3JnX2lkfS9idGMvc2lnbi97cHVia2V5fVwiXVtcInBvc3RcIl1bXCJyZXF1ZXN0Qm9keVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgU29sYW5hU2lnblJlcXVlc3QgPVxuICBwYXRoc1tcIi92MS9vcmcve29yZ19pZH0vc29sYW5hL3NpZ24ve3B1YmtleX1cIl1bXCJwb3N0XCJdW1wicmVxdWVzdEJvZHlcIl1bXCJjb250ZW50XCJdW1wiYXBwbGljYXRpb24vanNvblwiXTtcblxuZXhwb3J0IHR5cGUgRXZtU2lnblJlc3BvbnNlID1cbiAgY29tcG9uZW50c1tcInJlc3BvbnNlc1wiXVtcIkV0aDFTaWduUmVzcG9uc2VcIl1bXCJjb250ZW50XCJdW1wiYXBwbGljYXRpb24vanNvblwiXTtcbmV4cG9ydCB0eXBlIEV0aDJTaWduUmVzcG9uc2UgPVxuICBjb21wb25lbnRzW1wicmVzcG9uc2VzXCJdW1wiRXRoMlNpZ25SZXNwb25zZVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgRXRoMlN0YWtlUmVzcG9uc2UgPVxuICBjb21wb25lbnRzW1wicmVzcG9uc2VzXCJdW1wiU3Rha2VSZXNwb25zZVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgRXRoMlVuc3Rha2VSZXNwb25zZSA9XG4gIGNvbXBvbmVudHNbXCJyZXNwb25zZXNcIl1bXCJVbnN0YWtlUmVzcG9uc2VcIl1bXCJjb250ZW50XCJdW1wiYXBwbGljYXRpb24vanNvblwiXTtcbmV4cG9ydCB0eXBlIEJsb2JTaWduUmVzcG9uc2UgPVxuICBjb21wb25lbnRzW1wicmVzcG9uc2VzXCJdW1wiQmxvYlNpZ25SZXNwb25zZVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgQnRjU2lnblJlc3BvbnNlID1cbiAgY29tcG9uZW50c1tcInJlc3BvbnNlc1wiXVtcIkJ0Y1NpZ25SZXNwb25zZVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgU29sYW5hU2lnblJlc3BvbnNlID1cbiAgY29tcG9uZW50c1tcInJlc3BvbnNlc1wiXVtcIlNvbGFuYVNpZ25SZXNwb25zZVwiXVtcImNvbnRlbnRcIl1bXCJhcHBsaWNhdGlvbi9qc29uXCJdO1xuZXhwb3J0IHR5cGUgTWZhUmVxdWVzdEluZm8gPVxuICBjb21wb25lbnRzW1wicmVzcG9uc2VzXCJdW1wiTWZhUmVxdWVzdEluZm9cIl1bXCJjb250ZW50XCJdW1wiYXBwbGljYXRpb24vanNvblwiXTtcblxuZXhwb3J0IHR5cGUgQWNjZXB0ZWRSZXNwb25zZSA9IGNvbXBvbmVudHNbXCJzY2hlbWFzXCJdW1wiQWNjZXB0ZWRSZXNwb25zZVwiXTtcbmV4cG9ydCB0eXBlIEVycm9yUmVzcG9uc2UgPSBjb21wb25lbnRzW1wic2NoZW1hc1wiXVtcIkVycm9yUmVzcG9uc2VcIl07XG5leHBvcnQgdHlwZSBCdGNTaWduYXR1cmVLaW5kID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJCdGNTaWduYXR1cmVLaW5kXCJdO1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG4vKiogTUZBIHJlcXVlc3Qga2luZCAqL1xuZXhwb3J0IHR5cGUgTWZhVHlwZSA9IGNvbXBvbmVudHNbXCJzY2hlbWFzXCJdW1wiTWZhVHlwZVwiXTtcblxudHlwZSBTaWduRm48VT4gPSAoaGVhZGVycz86IEhlYWRlcnNJbml0KSA9PiBQcm9taXNlPFUgfCBBY2NlcHRlZFJlc3BvbnNlPjtcblxuLyoqXG4gKiBBIHJlc3BvbnNlIG9mIGEgc2lnbmluZyByZXF1ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgU2lnblJlc3BvbnNlPFU+IHtcbiAgcmVhZG9ubHkgI2NzOiBDdWJlU2lnbmVyO1xuICByZWFkb25seSAjb3JnSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgI3NpZ25GbjogU2lnbkZuPFU+O1xuICByZWFkb25seSAjcmVzcDogVSB8IEFjY2VwdGVkUmVzcG9uc2U7XG5cbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaWduaW5nIHJlcXVlc3QgcmVxdWlyZXMgYW4gTUZBIGFwcHJvdmFsICovXG4gIHJlcXVpcmVzTWZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy4jcmVzcCBhcyBBY2NlcHRlZFJlc3BvbnNlKS5hY2NlcHRlZD8uTWZhUmVxdWlyZWQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBAcmV0dXJuIHtVfSBUaGUgc2lnbmVkIGRhdGEgKi9cbiAgZGF0YSgpOiBVIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzcCBhcyBVO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcHJvdmVzIHRoZSBNRkEgcmVxdWVzdCB1c2luZyBhIGdpdmVuIHNpZ25lciBzZXNzaW9uIGFuZCBhIFRPVFAgY29kZS5cbiAgICpcbiAgICogTm90ZTogVGhpcyBvbmx5IHdvcmtzIGZvciBNRkEgcmVxdWVzdHMgdGhhdCByZXF1aXJlIGEgc2luZ2xlIGFwcHJvdmFsLlxuICAgKlxuICAgKiBAcGFyYW0ge1NpZ25lclNlc3Npb259IHNlc3Npb24gU2lnbmVyIHNlc3Npb24gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIDYtZGlnaXQgVE9UUCBjb2RlXG4gICAqIEByZXR1cm4ge1NpZ25SZXNwb25zZTxVPn0gVGhlIHJlc3VsdCBvZiBzaWduaW5nIHdpdGggdGhlIGFwcHJvdmFsXG4gICAqL1xuICBhc3luYyBhcHByb3ZlVG90cChzZXNzaW9uOiBTaWduZXJTZXNzaW9uLCBjb2RlOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25SZXNwb25zZTxVPj4ge1xuICAgIGNvbnN0IG1mYUlkID0gdGhpcy4jbWZhSWQoKTtcblxuICAgIGNvbnN0IG1mYUFwcHJvdmFsID0gYXdhaXQgc2Vzc2lvbi50b3RwQXBwcm92ZShtZmFJZCwgY29kZSk7XG4gICAgYXNzZXJ0KG1mYUFwcHJvdmFsLmlkID09PSBtZmFJZCk7XG4gICAgY29uc3QgbWZhQ29uZiA9IG1mYUFwcHJvdmFsLnJlY2VpcHQ/LmNvbmZpcm1hdGlvbjtcblxuICAgIGlmICghbWZhQ29uZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWZhUmVxdWVzdCBoYXMgbm90IGJlZW4gYXBwcm92ZWQgeWV0XCIpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLiNzaWduV2l0aE1mYUFwcHJvdmFsKG1mYUNvbmYhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlcyB0aGUgTUZBIHJlcXVlc3QgdXNpbmcgQ3ViZVNpZ25lcidzIG1hbmFnZW1lbnQgc2Vzc2lvbi5cbiAgICpcbiAgICogTm90ZTogVGhpcyBvbmx5IHdvcmtzIGZvciBNRkEgcmVxdWVzdHMgdGhhdCByZXF1aXJlIGEgc2luZ2xlIGFwcHJvdmFsLlxuICAgKlxuICAgKiBAcmV0dXJuIHtTaWduUmVzcG9uc2U8VT59IFRoZSByZXN1bHQgb2Ygc2lnbmluZyB3aXRoIHRoZSBhcHByb3ZhbFxuICAgKi9cbiAgYXN5bmMgYXBwcm92ZSgpOiBQcm9taXNlPFNpZ25SZXNwb25zZTxVPj4ge1xuICAgIGNvbnN0IG1mYUlkID0gdGhpcy4jbWZhSWQoKTtcblxuICAgIGNvbnN0IG1mYUFwcHJvdmFsID0gYXdhaXQgT3JnLm1mYUFwcHJvdmUodGhpcy4jY3MsIHRoaXMuI29yZ0lkLCBtZmFJZCk7XG4gICAgYXNzZXJ0KG1mYUFwcHJvdmFsLmlkID09PSBtZmFJZCk7XG4gICAgY29uc3QgbWZhQ29uZiA9IG1mYUFwcHJvdmFsLnJlY2VpcHQ/LmNvbmZpcm1hdGlvbjtcblxuICAgIGlmICghbWZhQ29uZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWZhUmVxdWVzdCBoYXMgbm90IGJlZW4gYXBwcm92ZWQgeWV0XCIpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLiNzaWduV2l0aE1mYUFwcHJvdmFsKG1mYUNvbmYpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0gSU5URVJOQUwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogQ29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3ViZVNpZ25lcn0gY3MgVGhlIEN1YmVTaWduZXIgaW5zdGFuY2UgdG8gdXNlIGZvciByZXF1ZXN0c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gb3JnSWQgVGhlIG9yZyBpZCBvZiB0aGUgY29ycmVzcG9uZGluZyBzaWduaW5nIHJlcXVlc3RcbiAgICogQHBhcmFtIHtTaWduRm59IHNpZ25GbiBUaGUgc2lnbmluZyBmdW5jdGlvbiB0aGF0IHRoaXMgcmVzcG9uc2UgaXMgZnJvbS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8gcmVzZW5kIHJlcXVlc3RzIHdpdGhcbiAgICogICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgaGVhZGVycyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7VSB8IEFjY2VwdGVkUmVzcG9uc2V9IHJlc3AgVGhlIHJlc3BvbnNlIGFzIHJldHVybmVkIGJ5IHRoZSBPcGVuQVBJXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LlxuICAgKi9cbiAgY29uc3RydWN0b3IoY3M6IEN1YmVTaWduZXIsIG9yZ0lkOiBzdHJpbmcsIHNpZ25GbjogU2lnbkZuPFU+LCByZXNwOiBVIHwgQWNjZXB0ZWRSZXNwb25zZSkge1xuICAgIHRoaXMuI2NzID0gY3M7XG4gICAgdGhpcy4jb3JnSWQgPSBvcmdJZDtcbiAgICB0aGlzLiNzaWduRm4gPSBzaWduRm47XG4gICAgdGhpcy4jcmVzcCA9IHJlc3A7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1mYUNvbmYgTUZBIHJlcXVlc3QgYXBwcm92YWwgY29uZmlybWF0aW9uIGNvZGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxTaWduUmVzcG9uc2U8VT4+fSBUaGUgcmVzdWx0IG9mIHNpZ25pbmcgYWZ0ZXIgTUZBIGFwcHJvdmFsXG4gICAqL1xuICBhc3luYyAjc2lnbldpdGhNZmFBcHByb3ZhbChtZmFDb25mOiBzdHJpbmcpOiBQcm9taXNlPFNpZ25SZXNwb25zZTxVPj4ge1xuICAgIGNvbnN0IG1mYUlkID0gdGhpcy4jbWZhSWQoKTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICBcIngtY3ViaXN0LW1mYS1pZFwiOiBtZmFJZCxcbiAgICAgIFwieC1jdWJpc3QtbWZhLWNvbmZpcm1hdGlvblwiOiBtZmFDb25mLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBTaWduUmVzcG9uc2UodGhpcy4jY3MsIHRoaXMuI29yZ0lkLCB0aGlzLiNzaWduRm4sIGF3YWl0IHRoaXMuI3NpZ25GbihoZWFkZXJzKSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7c3RyaW5nfSBNRkEgaWQgaWYgTUZBIGlzIHJlcXVpcmVkIGZvciB0aGlzIHJlc3BvbnNlOyB0aHJvd3Mgb3RoZXJ3aXNlLlxuICAgKi9cbiAgI21mYUlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbWZhUmVxdWlyZWQgPSAodGhpcy4jcmVzcCBhcyBBY2NlcHRlZFJlc3BvbnNlKS5hY2NlcHRlZD8uTWZhUmVxdWlyZWQ7XG4gICAgaWYgKCFtZmFSZXF1aXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVxdWVzdCBkb2VzIG5vdCByZXF1aXJlIE1GQSBhcHByb3ZhbFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG1mYVJlcXVpcmVkLmlkO1xuICB9XG59XG5cbi8qKiBTaWduZXIgc2Vzc2lvbiBpbmZvLiBDYW4gb25seSBiZSB1c2VkIHRvIHJldm9rZSBhIHRva2VuLCBidXQgbm90IGZvciBhdXRoZW50aWNhdGlvbi4gKi9cbmV4cG9ydCBjbGFzcyBTaWduZXJTZXNzaW9uSW5mbyB7XG4gIHJlYWRvbmx5ICNjczogQ3ViZVNpZ25lcjtcbiAgcmVhZG9ubHkgI29yZ0lkOiBzdHJpbmc7XG4gIHJlYWRvbmx5ICNyb2xlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgI3Nlc3Npb25JZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcHVycG9zZTogc3RyaW5nO1xuXG4gIC8qKiBSZXZva2UgdGhpcyB0b2tlbiAqL1xuICBhc3luYyByZXZva2UoKSB7XG4gICAgYXdhaXQgU2lnbmVyU2Vzc2lvbi5yZXZva2UodGhpcy4jY3MsIHRoaXMuI29yZ0lkLCB0aGlzLiNyb2xlSWQsIHRoaXMuI3Nlc3Npb25JZCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLSBJTlRFUk5BTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBDdWJlU2lnbmVyIGluc3RhbmNlIHRvIHVzZSB3aGVuIGNhbGxpbmcgYHJldm9rZWBcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9yZ0lkIE9yZ2FuaXphdGlvbiBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZUlkIFJvbGUgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhhc2ggVGhlIGhhc2ggb2YgdGhlIHRva2VuOyBjYW4gYmUgdXNlZCBmb3IgcmV2b2NhdGlvbiBidXQgbm90IGZvciBhdXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdXJwb3NlIFNlc3Npb24gcHVycG9zZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNzOiBDdWJlU2lnbmVyLCBvcmdJZDogc3RyaW5nLCByb2xlSWQ6IHN0cmluZywgaGFzaDogc3RyaW5nLCBwdXJwb3NlOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNjcyA9IGNzO1xuICAgIHRoaXMuI29yZ0lkID0gb3JnSWQ7XG4gICAgdGhpcy4jcm9sZUlkID0gcm9sZUlkO1xuICAgIHRoaXMuI3Nlc3Npb25JZCA9IGhhc2g7XG4gICAgdGhpcy5wdXJwb3NlID0gcHVycG9zZTtcbiAgfVxufVxuXG4vKiogU2lnbmVyIHNlc3Npb24uICovXG5leHBvcnQgY2xhc3MgU2lnbmVyU2Vzc2lvbiB7XG4gIHJlYWRvbmx5IGNzOiBDdWJlU2lnbmVyO1xuICBzZXNzaW9uTWdyOiBPaWRjU2Vzc2lvbk1hbmFnZXIgfCBTaWduZXJTZXNzaW9uTWFuYWdlcjtcbiAgcmVhZG9ubHkgI29yZ0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2Yga2V5cyB0aGF0IHRoaXMgdG9rZW4gZ3JhbnRzIGFjY2VzcyB0by5cbiAgICogQHJldHVybiB7S2V5W119IFRoZSBsaXN0IG9mIGtleXMuXG4gICAqL1xuICBhc3luYyBrZXlzKCk6IFByb21pc2U8S2V5W10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgYXdhaXQgdGhpcy5zZXNzaW9uTWdyLmNsaWVudCgpXG4gICAgKS5nZXQoXCIvdjAvb3JnL3tvcmdfaWR9L3Rva2VuL2tleXNcIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiB0aGlzLiNvcmdJZCB9IH0sXG4gICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXNzZXJ0T2socmVzcCk7XG4gICAgcmV0dXJuIGRhdGEua2V5cy5tYXAoKGs6IEtleUluZm8pID0+IG5ldyBLZXkodGhpcy5jcywgdGhpcy4jb3JnSWQsIGspKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIGEgcGVuZGluZyBNRkEgcmVxdWVzdCB1c2luZyBUT1RQLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWZhSWQgVGhlIE1GQSByZXF1ZXN0IHRvIGFwcHJvdmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgVGhlIFRPVFAgY29kZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1mYVJlcXVlc3RJbmZvPn0gVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBNRkEgcmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgdG90cEFwcHJvdmUobWZhSWQ6IHN0cmluZywgY29kZTogc3RyaW5nKTogUHJvbWlzZTxNZmFSZXF1ZXN0SW5mbz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLnNlc3Npb25NZ3IuY2xpZW50KClcbiAgICApLnBhdGNoKFwiL3YwL29yZy97b3JnX2lkfS9tZmEve21mYV9pZH0vdG90cFwiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuI29yZ0lkLCBtZmFfaWQ6IG1mYUlkIH0gfSxcbiAgICAgIGJvZHk6IHsgY29kZSB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIGFzc2VydE9rKHJlc3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhbiBFVk0gc2lnbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0tleSB8IHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gc2lnbiB3aXRoIChlaXRoZXIge0BsaW5rIEtleX0gb3IgaXRzIG1hdGVyaWFsIElEKS5cbiAgICogQHBhcmFtIHtFdm1TaWduUmVxdWVzdH0gcmVxIFdoYXQgdG8gc2lnbi5cbiAgICogQHJldHVybiB7UHJvbWlzZTxFdm1TaWduUmVzcG9uc2UgfCBBY2NlcHRlZFJlc3BvbnNlPn0gU2lnbmF0dXJlXG4gICAqL1xuICBhc3luYyBzaWduRXZtKGtleTogS2V5IHwgc3RyaW5nLCByZXE6IEV2bVNpZ25SZXF1ZXN0KTogUHJvbWlzZTxTaWduUmVzcG9uc2U8RXZtU2lnblJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHB1YmtleSA9IHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgPyAoa2V5IGFzIHN0cmluZykgOiBrZXkubWF0ZXJpYWxJZDtcbiAgICBjb25zdCBzaWduID0gYXN5bmMgKGhlYWRlcnM/OiBIZWFkZXJzSW5pdCkgPT4ge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgICAgYXdhaXQgdGhpcy5zZXNzaW9uTWdyLmNsaWVudCgpXG4gICAgICApLnBvc3QoXCIvdjEvb3JnL3tvcmdfaWR9L2V0aDEvc2lnbi97cHVia2V5fVwiLCB7XG4gICAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jb3JnSWQsIHB1YmtleSB9IH0sXG4gICAgICAgIGJvZHk6IHJlcSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgU2lnblJlc3BvbnNlKHRoaXMuY3MsIHRoaXMuI29yZ0lkLCBzaWduLCBhd2FpdCBzaWduKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhbiAnZXRoMicgc2lnbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0tleSB8IHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gc2lnbiB3aXRoIChlaXRoZXIge0BsaW5rIEtleX0gb3IgaXRzIG1hdGVyaWFsIElEKS5cbiAgICogQHBhcmFtIHtFdGgyU2lnblJlcXVlc3R9IHJlcSBXaGF0IHRvIHNpZ24uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXRoMlNpZ25SZXNwb25zZSB8IEFjY2VwdGVkUmVzcG9uc2U+fSBTaWduYXR1cmVcbiAgICovXG4gIGFzeW5jIHNpZ25FdGgyKGtleTogS2V5IHwgc3RyaW5nLCByZXE6IEV0aDJTaWduUmVxdWVzdCk6IFByb21pc2U8U2lnblJlc3BvbnNlPEV0aDJTaWduUmVzcG9uc2U+PiB7XG4gICAgY29uc3QgcHVia2V5ID0gdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiA/IChrZXkgYXMgc3RyaW5nKSA6IGtleS5tYXRlcmlhbElkO1xuICAgIGNvbnN0IHNpZ24gPSBhc3luYyAoaGVhZGVycz86IEhlYWRlcnNJbml0KSA9PiB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCB0aGlzLnNlc3Npb25NZ3IuY2xpZW50KClcbiAgICAgICkucG9zdChcIi92MS9vcmcve29yZ19pZH0vZXRoMi9zaWduL3twdWJrZXl9XCIsIHtcbiAgICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiB0aGlzLiNvcmdJZCwgcHVia2V5IH0gfSxcbiAgICAgICAgYm9keTogcmVxLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFzc2VydE9rKHJlc3ApO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBTaWduUmVzcG9uc2UodGhpcy5jcywgdGhpcy4jb3JnSWQsIHNpZ24sIGF3YWl0IHNpZ24oKSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHN0YWtlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7RXRoMlN0YWtlUmVxdWVzdH0gcmVxIFRoZSByZXF1ZXN0IHRvIHNpZ24uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXRoMlN0YWtlUmVzcG9uc2UgfCBBY2NlcHRlZFJlc3BvbnNlPn0gVGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgc3Rha2UocmVxOiBFdGgyU3Rha2VSZXF1ZXN0KTogUHJvbWlzZTxTaWduUmVzcG9uc2U8RXRoMlN0YWtlUmVzcG9uc2U+PiB7XG4gICAgY29uc3Qgc2lnbiA9IGFzeW5jIChoZWFkZXJzPzogSGVhZGVyc0luaXQpID0+IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IHRoaXMuc2Vzc2lvbk1nci5jbGllbnQoKVxuICAgICAgKS5wb3N0KFwiL3YxL29yZy97b3JnX2lkfS9ldGgyL3N0YWtlXCIsIHtcbiAgICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiB0aGlzLiNvcmdJZCB9IH0sXG4gICAgICAgIGJvZHk6IHJlcSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgU2lnblJlc3BvbnNlKHRoaXMuY3MsIHRoaXMuI29yZ0lkLCBzaWduLCBhd2FpdCBzaWduKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYW4gdW5zdGFrZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0tleSB8IHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gc2lnbiB3aXRoIChlaXRoZXIge0BsaW5rIEtleX0gb3IgaXRzIG1hdGVyaWFsIElEKS5cbiAgICogQHBhcmFtIHtFdGgyVW5zdGFrZVJlcXVlc3R9IHJlcSBUaGUgcmVxdWVzdCB0byBzaWduLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV0aDJVbnN0YWtlUmVzcG9uc2UgfCBBY2NlcHRlZFJlc3BvbnNlPn0gVGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgdW5zdGFrZShcbiAgICBrZXk6IEtleSB8IHN0cmluZyxcbiAgICByZXE6IEV0aDJVbnN0YWtlUmVxdWVzdCxcbiAgKTogUHJvbWlzZTxTaWduUmVzcG9uc2U8RXRoMlVuc3Rha2VSZXNwb25zZT4+IHtcbiAgICBjb25zdCBwdWJrZXkgPSB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiID8gKGtleSBhcyBzdHJpbmcpIDoga2V5Lm1hdGVyaWFsSWQ7XG4gICAgY29uc3Qgc2lnbiA9IGFzeW5jIChoZWFkZXJzPzogSGVhZGVyc0luaXQpID0+IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IHRoaXMuc2Vzc2lvbk1nci5jbGllbnQoKVxuICAgICAgKS5wb3N0KFwiL3YxL29yZy97b3JnX2lkfS9ldGgyL3Vuc3Rha2Uve3B1YmtleX1cIiwge1xuICAgICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuI29yZ0lkLCBwdWJrZXkgfSB9LFxuICAgICAgICBib2R5OiByZXEsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYXNzZXJ0T2socmVzcCk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFNpZ25SZXNwb25zZSh0aGlzLmNzLCB0aGlzLiNvcmdJZCwgc2lnbiwgYXdhaXQgc2lnbigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgcmF3IGJsb2IuXG4gICAqIEBwYXJhbSB7S2V5IHwgc3RyaW5nfSBrZXkgVGhlIGtleSB0byBzaWduIHdpdGggKGVpdGhlciB7QGxpbmsgS2V5fSBvciBpdHMgSUQpLlxuICAgKiBAcGFyYW0ge0Jsb2JTaWduUmVxdWVzdH0gcmVxIFdoYXQgdG8gc2lnblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEJsb2JTaWduUmVzcG9uc2UgfCBBY2NlcHRlZFJlc3BvbnNlPn0gVGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgc2lnbkJsb2Ioa2V5OiBLZXkgfCBzdHJpbmcsIHJlcTogQmxvYlNpZ25SZXF1ZXN0KTogUHJvbWlzZTxTaWduUmVzcG9uc2U8QmxvYlNpZ25SZXNwb25zZT4+IHtcbiAgICBjb25zdCBrZXlfaWQgPSB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiID8gKGtleSBhcyBzdHJpbmcpIDoga2V5LmlkO1xuICAgIGNvbnN0IHNpZ24gPSBhc3luYyAoaGVhZGVycz86IEhlYWRlcnNJbml0KSA9PiB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCB0aGlzLnNlc3Npb25NZ3IuY2xpZW50KClcbiAgICAgICkucG9zdChcIi92MS9vcmcve29yZ19pZH0vYmxvYi9zaWduL3trZXlfaWR9XCIsIHtcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcGF0aDogeyBvcmdfaWQ6IHRoaXMuI29yZ0lkLCBrZXlfaWQgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogcmVxLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFzc2VydE9rKHJlc3ApO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBTaWduUmVzcG9uc2UodGhpcy5jcywgdGhpcy4jb3JnSWQsIHNpZ24sIGF3YWl0IHNpZ24oKSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIGJpdGNvaW4gbWVzc2FnZS5cbiAgICogQHBhcmFtIHtLZXkgfCBzdHJpbmd9IGtleSBUaGUga2V5IHRvIHNpZ24gd2l0aCAoZWl0aGVyIHtAbGluayBLZXl9IG9yIGl0cyBtYXRlcmlhbCBJRCkuXG4gICAqIEBwYXJhbSB7QnRjU2lnblJlcXVlc3R9IHJlcSBXaGF0IHRvIHNpZ25cbiAgICogQHJldHVybiB7UHJvbWlzZTxCdGNTaWduUmVzcG9uc2UgfCBBY2NlcHRlZFJlc3BvbnNlPn0gVGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgc2lnbkJ0YyhrZXk6IEtleSB8IHN0cmluZywgcmVxOiBCdGNTaWduUmVxdWVzdCk6IFByb21pc2U8U2lnblJlc3BvbnNlPEJ0Y1NpZ25SZXNwb25zZT4+IHtcbiAgICBjb25zdCBwdWJrZXkgPSB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiID8gKGtleSBhcyBzdHJpbmcpIDoga2V5Lm1hdGVyaWFsSWQ7XG4gICAgY29uc3Qgc2lnbiA9IGFzeW5jIChoZWFkZXJzPzogSGVhZGVyc0luaXQpID0+IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IHRoaXMuc2Vzc2lvbk1nci5jbGllbnQoKVxuICAgICAgKS5wb3N0KFwiL3YwL29yZy97b3JnX2lkfS9idGMvc2lnbi97cHVia2V5fVwiLCB7XG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHBhdGg6IHsgb3JnX2lkOiB0aGlzLiNvcmdJZCwgcHVia2V5IH0sXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IHJlcSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgICB9O1xuICAgIHJldHVybiBuZXcgU2lnblJlc3BvbnNlKHRoaXMuY3MsIHRoaXMuI29yZ0lkLCBzaWduLCBhd2FpdCBzaWduKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBzb2xhbmEgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtLZXkgfCBzdHJpbmd9IGtleSBUaGUga2V5IHRvIHNpZ24gd2l0aCAoZWl0aGVyIHtAbGluayBLZXl9IG9yIGl0cyBtYXRlcmlhbCBJRCkuXG4gICAqIEBwYXJhbSB7U29sYW5hU2lnblJlcXVlc3R9IHJlcSBXaGF0IHRvIHNpZ25cbiAgICogQHJldHVybiB7UHJvbWlzZTxTb2xhbmFTaWduUmVzcG9uc2UgfCBBY2NlcHRlZFJlc3BvbnNlPn0gVGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgYXN5bmMgc2lnblNvbGFuYShcbiAgICBrZXk6IEtleSB8IHN0cmluZyxcbiAgICByZXE6IFNvbGFuYVNpZ25SZXF1ZXN0LFxuICApOiBQcm9taXNlPFNpZ25SZXNwb25zZTxTb2xhbmFTaWduUmVzcG9uc2U+PiB7XG4gICAgY29uc3QgcHVia2V5ID0gdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiA/IChrZXkgYXMgc3RyaW5nKSA6IGtleS5tYXRlcmlhbElkO1xuICAgIGNvbnN0IHNpZ24gPSBhc3luYyAoaGVhZGVycz86IEhlYWRlcnNJbml0KSA9PiB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCB0aGlzLnNlc3Npb25NZ3IuY2xpZW50KClcbiAgICAgICkucG9zdChcIi92MS9vcmcve29yZ19pZH0vc29sYW5hL3NpZ24ve3B1YmtleX1cIiwge1xuICAgICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuI29yZ0lkLCBwdWJrZXkgfSB9LFxuICAgICAgICBib2R5OiByZXEsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYXNzZXJ0T2socmVzcCk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFNpZ25SZXNwb25zZSh0aGlzLmNzLCB0aGlzLiNvcmdJZCwgc2lnbiwgYXdhaXQgc2lnbigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbiBleGlzdGluZyBzaWduZXIgc2Vzc2lvbiBmcm9tIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7Q3ViZVNpZ25lcn0gY3MgVGhlIEN1YmVTaWduZXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTaWduZXJTZXNzaW9uU3RvcmFnZX0gc3RvcmFnZSBUaGUgc2Vzc2lvbiBzdG9yYWdlIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNpbmdlclNlc3Npb24+fSBOZXcgc2lnbmVyIHNlc3Npb25cbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkU2lnbmVyU2Vzc2lvbihcbiAgICBjczogQ3ViZVNpZ25lcixcbiAgICBzdG9yYWdlOiBTaWduZXJTZXNzaW9uU3RvcmFnZSxcbiAgKTogUHJvbWlzZTxTaWduZXJTZXNzaW9uPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IGF3YWl0IFNpZ25lclNlc3Npb25NYW5hZ2VyLmxvYWRGcm9tU3RvcmFnZShjcywgc3RvcmFnZSk7XG4gICAgcmV0dXJuIG5ldyBTaWduZXJTZXNzaW9uKGNzLCBtYW5hZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbiBleGlzdGluZyBPSURDIHNlc3Npb24gZnJvbSBzdG9yYWdlXG4gICAqIEBwYXJhbSB7Q3ViZVNpZ25lcn0gY3MgVGhlIEN1YmVTaWduZXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtPaWRjU2Vzc2lvblN0b3JhZ2V9IHN0b3JhZ2UgVGhlIHN0b3JhZ2UgdG8gdXNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2lnbmVyU2Vzc2lvbj59IE5ldyBzaWduZXIgc2Vzc2lvblxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGxvYWRPaWRjU2Vzc2lvbihcbiAgICBjczogQ3ViZVNpZ25lcixcbiAgICBzdG9yYWdlOiBPaWRjU2Vzc2lvblN0b3JhZ2UsXG4gICk6IFByb21pc2U8U2lnbmVyU2Vzc2lvbj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBhd2FpdCBPaWRjU2Vzc2lvbk1hbmFnZXIubG9hZEZyb21TdG9yYWdlKHN0b3JhZ2UpO1xuICAgIHJldHVybiBuZXcgU2lnbmVyU2Vzc2lvbihjcywgbWFuYWdlcik7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7Q3ViZVNpZ25lcn0gY3MgVGhlIEN1YmVTaWduZXIgaW5zdGFuY2UgdG8gdXNlIGZvciByZXF1ZXN0c1xuICAgKiBAcGFyYW0ge09pZGNTZXNzaW9uTWFuYWdlciB8IFNpZ25lclNlc3Npb25NYW5hZ2VyfSBzZXNzaW9uTWdyIFRoZSBzZXNzaW9uIG1hbmFnZXIgdG8gdXNlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3IoY3M6IEN1YmVTaWduZXIsIHNlc3Npb25NZ3I6IE9pZGNTZXNzaW9uTWFuYWdlciB8IFNpZ25lclNlc3Npb25NYW5hZ2VyKSB7XG4gICAgdGhpcy5jcyA9IGNzO1xuICAgIHRoaXMuc2Vzc2lvbk1nciA9IHNlc3Npb25NZ3I7XG4gICAgdGhpcy4jb3JnSWQgPSBzZXNzaW9uTWdyLm9yZ0lkO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0gSU5URVJOQUwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWpzZG9jICovXG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2QgZm9yIHJldm9raW5nIGEgdG9rZW4gKHVzZWQgYm90aCBmcm9tIHtTaWduZXJTZXNzaW9ufSBhbmQge1NpZ25lclNlc3Npb25JbmZvfSkuXG4gICAqIEBwYXJhbSB7Q3ViZVNpZ25lcn0gY3MgQ3ViZVNpZ25lciBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3JnSWQgT3JnYW5pemF0aW9uIElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb2xlSWQgUm9sZSBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkIFNpZ25lciBzZXNzaW9uIElEXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJldm9rZShjczogQ3ViZVNpZ25lciwgb3JnSWQ6IHN0cmluZywgcm9sZUlkOiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IGNzLm1hbmFnZW1lbnQoKVxuICAgICkuZGVsKFwiL3YwL29yZy97b3JnX2lkfS9yb2xlcy97cm9sZV9pZH0vdG9rZW5zL3tzZXNzaW9uX2lkfVwiLCB7XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgcGF0aDogeyBvcmdfaWQ6IG9yZ0lkLCByb2xlX2lkOiByb2xlSWQsIHNlc3Npb25faWQ6IHNlc3Npb25JZCB9LFxuICAgICAgfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIGFzc2VydE9rKHJlc3ApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directory where CubeSigner stores config files.
|
|
3
|
+
* @return {string} Config dir
|
|
4
|
+
*/
|
|
5
|
+
export declare function configDir(): string;
|
|
6
|
+
type ResponseType<D, T> = {
|
|
7
|
+
data?: D;
|
|
8
|
+
error?: T;
|
|
9
|
+
response?: Response;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Error response type, thrown on non-successful responses.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ErrResponse extends Error {
|
|
15
|
+
/** Description */
|
|
16
|
+
readonly description?: string;
|
|
17
|
+
/** HTTP status code text (derived from `this.status`) */
|
|
18
|
+
readonly statusText?: string;
|
|
19
|
+
/** HTTP status code */
|
|
20
|
+
readonly status?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Constructor
|
|
23
|
+
* @param {Partial<ErrResponse>} init Initializer
|
|
24
|
+
*/
|
|
25
|
+
constructor(init: Partial<ErrResponse>);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Throw if on error response. Otherwise, return the response data.
|
|
29
|
+
* @param {ResponseType} resp The response to check
|
|
30
|
+
* @param {string} description Description to include in the thrown error
|
|
31
|
+
* @return {D} The response data.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
export declare function assertOk<D, T>(resp: ResponseType<D, T>, description?: string): D;
|
|
35
|
+
export {};
|