@privateconnect/sdk 0.6.24 → 0.7.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/dist/index.d.ts +72 -76
- package/dist/index.js +154 -120
- package/package.json +8 -7
- package/LICENSE +0 -110
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Private Connect SDK
|
|
3
3
|
*
|
|
4
|
-
* Programmatic access to Private Connect services and agent orchestration.
|
|
4
|
+
* Programmatic access to Private Connect services, grants, and agent orchestration.
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
* ```typescript
|
|
@@ -9,15 +9,21 @@
|
|
|
9
9
|
*
|
|
10
10
|
* const pc = new PrivateConnect({ apiKey: 'your-api-key' });
|
|
11
11
|
*
|
|
12
|
-
* // Connect to a service
|
|
12
|
+
* // Connect to a service (assumes tunnel is already open)
|
|
13
13
|
* const db = await pc.connect('postgres-prod');
|
|
14
14
|
* console.log(db.connectionString); // postgres://localhost:5432/...
|
|
15
15
|
*
|
|
16
|
+
* // Grant an AI agent temporary access
|
|
17
|
+
* const grant = await pc.grants.create({
|
|
18
|
+
* agentLabel: 'claude',
|
|
19
|
+
* resourceType: 'db',
|
|
20
|
+
* resourceName: 'postgres',
|
|
21
|
+
* ttl: '5m',
|
|
22
|
+
* });
|
|
23
|
+
* console.log(grant.token); // gnt_...
|
|
24
|
+
*
|
|
16
25
|
* // List all agents
|
|
17
26
|
* const agents = await pc.agents.list();
|
|
18
|
-
*
|
|
19
|
-
* // Send message to another agent
|
|
20
|
-
* await pc.agents.sendMessage(targetAgentId, { action: 'deploy' });
|
|
21
27
|
* ```
|
|
22
28
|
*/
|
|
23
29
|
export interface PrivateConnectConfig {
|
|
@@ -25,7 +31,7 @@ export interface PrivateConnectConfig {
|
|
|
25
31
|
apiKey: string;
|
|
26
32
|
/** Hub URL (default: https://api.privateconnect.co) */
|
|
27
33
|
hubUrl?: string;
|
|
28
|
-
/** Agent ID (auto-detected from config if not provided) */
|
|
34
|
+
/** Agent ID (auto-detected from local config if not provided) */
|
|
29
35
|
agentId?: string;
|
|
30
36
|
/** Disable usage tracking (default: false) */
|
|
31
37
|
disableTracking?: boolean;
|
|
@@ -55,6 +61,10 @@ export interface Connection {
|
|
|
55
61
|
port: number;
|
|
56
62
|
connectionString: string;
|
|
57
63
|
envVar: string;
|
|
64
|
+
/** Present when using a grant-based connection */
|
|
65
|
+
grantToken?: string;
|
|
66
|
+
/** Present when using a grant-based connection */
|
|
67
|
+
grantEndpoint?: string;
|
|
58
68
|
}
|
|
59
69
|
export interface Message {
|
|
60
70
|
id: string;
|
|
@@ -69,137 +79,123 @@ export interface Message {
|
|
|
69
79
|
createdAt: string;
|
|
70
80
|
isRead: boolean;
|
|
71
81
|
}
|
|
72
|
-
export interface
|
|
82
|
+
export interface Grant {
|
|
73
83
|
id: string;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
84
|
+
agentLabel: string;
|
|
85
|
+
resourceType: string;
|
|
86
|
+
resourceName: string;
|
|
87
|
+
scope: string;
|
|
77
88
|
expiresAt: string;
|
|
78
|
-
|
|
89
|
+
expiresInMinutes?: number;
|
|
90
|
+
token?: string;
|
|
91
|
+
endpoint?: string;
|
|
92
|
+
}
|
|
93
|
+
export interface GrantCreateOptions {
|
|
94
|
+
agentLabel: string;
|
|
95
|
+
resourceType: 'db' | 'api' | 'path';
|
|
96
|
+
resourceName: string;
|
|
97
|
+
scope?: 'read-only' | 'full';
|
|
98
|
+
/** Duration string: 60s, 5m, 1h, 1d */
|
|
99
|
+
ttl: string;
|
|
79
100
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Agents API for discovery and orchestration
|
|
82
|
-
*/
|
|
83
101
|
export declare class AgentsAPI {
|
|
84
102
|
private client;
|
|
85
103
|
constructor(client: PrivateConnect);
|
|
86
|
-
/**
|
|
87
|
-
* List all agents in the workspace
|
|
88
|
-
*/
|
|
89
104
|
list(options?: {
|
|
90
105
|
onlineOnly?: boolean;
|
|
91
106
|
}): Promise<Agent[]>;
|
|
92
|
-
/**
|
|
93
|
-
* Find agents by capability
|
|
94
|
-
*/
|
|
95
107
|
findByCapability(capability: string): Promise<Agent[]>;
|
|
96
|
-
/**
|
|
97
|
-
* Register capabilities for this agent
|
|
98
|
-
*/
|
|
99
108
|
registerCapabilities(capabilities: Array<{
|
|
100
109
|
name: string;
|
|
101
110
|
metadata?: Record<string, unknown>;
|
|
102
111
|
}>): Promise<void>;
|
|
103
|
-
/**
|
|
104
|
-
* Send a message to another agent
|
|
105
|
-
*/
|
|
106
112
|
sendMessage(toAgentId: string, payload: Record<string, unknown>, options?: {
|
|
107
113
|
channel?: string;
|
|
108
114
|
type?: 'request' | 'response' | 'event';
|
|
109
115
|
}): Promise<{
|
|
110
116
|
messageId: string;
|
|
111
117
|
}>;
|
|
112
|
-
/**
|
|
113
|
-
* Broadcast a message to all online agents
|
|
114
|
-
*/
|
|
115
118
|
broadcast(payload: Record<string, unknown>, options?: {
|
|
116
119
|
channel?: string;
|
|
117
120
|
}): Promise<{
|
|
118
121
|
sent: number;
|
|
119
122
|
}>;
|
|
120
|
-
/**
|
|
121
|
-
* Get messages for this agent
|
|
122
|
-
*/
|
|
123
123
|
getMessages(options?: {
|
|
124
124
|
channel?: string;
|
|
125
125
|
unreadOnly?: boolean;
|
|
126
126
|
limit?: number;
|
|
127
127
|
}): Promise<Message[]>;
|
|
128
|
-
/**
|
|
129
|
-
* Mark messages as read
|
|
130
|
-
*/
|
|
131
128
|
markRead(messageIds: string[]): Promise<void>;
|
|
132
129
|
}
|
|
133
|
-
/**
|
|
134
|
-
* Services API for connecting to and managing services
|
|
135
|
-
*/
|
|
136
130
|
export declare class ServicesAPI {
|
|
137
131
|
private client;
|
|
138
132
|
constructor(client: PrivateConnect);
|
|
139
|
-
/**
|
|
140
|
-
* List all services
|
|
141
|
-
*/
|
|
142
133
|
list(): Promise<Service[]>;
|
|
143
|
-
/**
|
|
144
|
-
* Get a specific service by name
|
|
145
|
-
*/
|
|
146
134
|
get(name: string): Promise<Service | null>;
|
|
147
135
|
/**
|
|
148
|
-
* Get connection details for a service
|
|
136
|
+
* Get connection details for a service.
|
|
137
|
+
*
|
|
138
|
+
* If `grantToken` is provided, returns a proxied connection via the hub's
|
|
139
|
+
* grant endpoint instead of assuming a local tunnel.
|
|
149
140
|
*/
|
|
150
|
-
getConnection(serviceName: string
|
|
141
|
+
getConnection(serviceName: string, options?: {
|
|
142
|
+
grantToken?: string;
|
|
143
|
+
}): Promise<Connection>;
|
|
144
|
+
private getGrantConnection;
|
|
151
145
|
}
|
|
152
|
-
|
|
153
|
-
* Sessions API for ephemeral orchestration sessions
|
|
154
|
-
*/
|
|
155
|
-
export declare class SessionsAPI {
|
|
146
|
+
export declare class GrantsAPI {
|
|
156
147
|
private client;
|
|
157
|
-
private activeSessions;
|
|
158
148
|
constructor(client: PrivateConnect);
|
|
159
149
|
/**
|
|
160
|
-
* Create an
|
|
150
|
+
* Create a time-limited access grant for an AI agent or external consumer.
|
|
161
151
|
*/
|
|
162
|
-
create(
|
|
163
|
-
ttlMinutes?: number;
|
|
164
|
-
metadata?: Record<string, unknown>;
|
|
165
|
-
}): Promise<Session>;
|
|
152
|
+
create(options: GrantCreateOptions): Promise<Grant>;
|
|
166
153
|
/**
|
|
167
|
-
*
|
|
154
|
+
* List active grants in the workspace.
|
|
168
155
|
*/
|
|
169
|
-
|
|
156
|
+
list(options?: {
|
|
157
|
+
includeExpired?: boolean;
|
|
158
|
+
}): Promise<Grant[]>;
|
|
159
|
+
/**
|
|
160
|
+
* Revoke an active grant immediately.
|
|
161
|
+
*/
|
|
162
|
+
revoke(grantId: string): Promise<void>;
|
|
170
163
|
/**
|
|
171
|
-
*
|
|
164
|
+
* Validate a grant token (public endpoint — no API key required).
|
|
165
|
+
* Returns the grant if valid, null otherwise.
|
|
172
166
|
*/
|
|
173
|
-
|
|
167
|
+
validate(token: string): Promise<Grant | null>;
|
|
174
168
|
}
|
|
175
|
-
/**
|
|
176
|
-
* Main Private Connect SDK client
|
|
177
|
-
*/
|
|
178
169
|
export declare class PrivateConnect {
|
|
179
170
|
private config;
|
|
180
171
|
/** Agents API for discovery and orchestration */
|
|
181
172
|
agents: AgentsAPI;
|
|
182
173
|
/** Services API for connecting to services */
|
|
183
174
|
services: ServicesAPI;
|
|
184
|
-
/**
|
|
185
|
-
|
|
175
|
+
/** Grants API for managing time-limited access tokens */
|
|
176
|
+
grants: GrantsAPI;
|
|
186
177
|
constructor(config: PrivateConnectConfig);
|
|
187
|
-
/**
|
|
188
|
-
* Get the agent ID
|
|
189
|
-
*/
|
|
178
|
+
/** The resolved agent ID, or undefined if not configured. */
|
|
190
179
|
get agentId(): string | undefined;
|
|
180
|
+
/** The hub URL this client is connected to. */
|
|
181
|
+
get hubUrl(): string;
|
|
191
182
|
/**
|
|
192
|
-
*
|
|
183
|
+
* Shorthand: get connection details for a service.
|
|
184
|
+
* Pass `grantToken` to connect via the grant proxy instead of a local tunnel.
|
|
193
185
|
*/
|
|
194
|
-
connect(serviceName: string
|
|
186
|
+
connect(serviceName: string, options?: {
|
|
187
|
+
grantToken?: string;
|
|
188
|
+
}): Promise<Connection>;
|
|
195
189
|
/**
|
|
196
|
-
*
|
|
190
|
+
* Returns the agent ID or throws if not configured.
|
|
191
|
+
* Used by APIs that require an authenticated agent identity.
|
|
197
192
|
*/
|
|
193
|
+
requireAgentId(): string;
|
|
194
|
+
/** Internal fetch with API key auth. */
|
|
198
195
|
fetch(path: string, options?: RequestInit): Promise<Response>;
|
|
199
|
-
/**
|
|
200
|
-
* Try to detect agent ID from local config
|
|
201
|
-
*/
|
|
202
|
-
private detectAgentId;
|
|
203
196
|
}
|
|
204
197
|
export default PrivateConnect;
|
|
205
|
-
|
|
198
|
+
/** Convenience function for quick one-off connections. */
|
|
199
|
+
export declare function connect(serviceName: string, config?: PrivateConnectConfig & {
|
|
200
|
+
grantToken?: string;
|
|
201
|
+
}): Promise<Connection>;
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Private Connect SDK
|
|
4
4
|
*
|
|
5
|
-
* Programmatic access to Private Connect services and agent orchestration.
|
|
5
|
+
* Programmatic access to Private Connect services, grants, and agent orchestration.
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```typescript
|
|
@@ -10,21 +10,32 @@
|
|
|
10
10
|
*
|
|
11
11
|
* const pc = new PrivateConnect({ apiKey: 'your-api-key' });
|
|
12
12
|
*
|
|
13
|
-
* // Connect to a service
|
|
13
|
+
* // Connect to a service (assumes tunnel is already open)
|
|
14
14
|
* const db = await pc.connect('postgres-prod');
|
|
15
15
|
* console.log(db.connectionString); // postgres://localhost:5432/...
|
|
16
16
|
*
|
|
17
|
+
* // Grant an AI agent temporary access
|
|
18
|
+
* const grant = await pc.grants.create({
|
|
19
|
+
* agentLabel: 'claude',
|
|
20
|
+
* resourceType: 'db',
|
|
21
|
+
* resourceName: 'postgres',
|
|
22
|
+
* ttl: '5m',
|
|
23
|
+
* });
|
|
24
|
+
* console.log(grant.token); // gnt_...
|
|
25
|
+
*
|
|
17
26
|
* // List all agents
|
|
18
27
|
* const agents = await pc.agents.list();
|
|
19
|
-
*
|
|
20
|
-
* // Send message to another agent
|
|
21
|
-
* await pc.agents.sendMessage(targetAgentId, { action: 'deploy' });
|
|
22
28
|
* ```
|
|
23
29
|
*/
|
|
24
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.PrivateConnect = exports.
|
|
31
|
+
exports.PrivateConnect = exports.GrantsAPI = exports.ServicesAPI = exports.AgentsAPI = void 0;
|
|
26
32
|
exports.connect = connect;
|
|
27
|
-
|
|
33
|
+
const fs = require("fs");
|
|
34
|
+
const path = require("path");
|
|
35
|
+
const os = require("os");
|
|
36
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
37
|
+
// Tracking
|
|
38
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
28
39
|
function trackSdkUsage(hubUrl) {
|
|
29
40
|
const data = JSON.stringify({
|
|
30
41
|
os: typeof process !== 'undefined' ? process.platform : 'browser',
|
|
@@ -36,18 +47,44 @@ function trackSdkUsage(hubUrl) {
|
|
|
36
47
|
method: 'POST',
|
|
37
48
|
headers: { 'Content-Type': 'application/json' },
|
|
38
49
|
body: data,
|
|
39
|
-
}).catch(() => { });
|
|
50
|
+
}).catch(() => { });
|
|
40
51
|
}
|
|
52
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
53
|
+
// Agent ID Detection
|
|
54
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
55
|
+
const CONFIG_PATH = path.join(os.homedir(), '.private-connect', 'config.json');
|
|
41
56
|
/**
|
|
42
|
-
*
|
|
57
|
+
* Detect the agent ID from local config or environment.
|
|
58
|
+
* Returns undefined if no agent is configured — callers that need an agent ID
|
|
59
|
+
* should surface a clear error rather than using a fake one.
|
|
43
60
|
*/
|
|
61
|
+
function detectAgentId() {
|
|
62
|
+
// 1. Environment variables (highest priority — useful in CI)
|
|
63
|
+
const envId = process.env.PRIVATECONNECT_AGENT_ID || process.env.CONNECT_AGENT_ID;
|
|
64
|
+
if (envId)
|
|
65
|
+
return envId;
|
|
66
|
+
// 2. Local config file (~/.private-connect/config.json)
|
|
67
|
+
try {
|
|
68
|
+
if (fs.existsSync(CONFIG_PATH)) {
|
|
69
|
+
const raw = fs.readFileSync(CONFIG_PATH, 'utf-8');
|
|
70
|
+
const config = JSON.parse(raw);
|
|
71
|
+
if (config.agentId && typeof config.agentId === 'string') {
|
|
72
|
+
return config.agentId;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Config unreadable or malformed — fall through
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
82
|
+
// Agents API
|
|
83
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
44
84
|
class AgentsAPI {
|
|
45
85
|
constructor(client) {
|
|
46
86
|
this.client = client;
|
|
47
87
|
}
|
|
48
|
-
/**
|
|
49
|
-
* List all agents in the workspace
|
|
50
|
-
*/
|
|
51
88
|
async list(options) {
|
|
52
89
|
const response = await this.client.fetch('/v1/agents/orchestration');
|
|
53
90
|
const data = await response.json();
|
|
@@ -65,47 +102,36 @@ class AgentsAPI {
|
|
|
65
102
|
services: a.services?.map((s) => s.name) || [],
|
|
66
103
|
}));
|
|
67
104
|
}
|
|
68
|
-
/**
|
|
69
|
-
* Find agents by capability
|
|
70
|
-
*/
|
|
71
105
|
async findByCapability(capability) {
|
|
72
106
|
const response = await this.client.fetch(`/v1/agents/by-capability/${encodeURIComponent(capability)}`);
|
|
73
107
|
const data = await response.json();
|
|
74
108
|
return data.agents || [];
|
|
75
109
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Register capabilities for this agent
|
|
78
|
-
*/
|
|
79
110
|
async registerCapabilities(capabilities) {
|
|
80
|
-
|
|
111
|
+
const agentId = this.client.requireAgentId();
|
|
112
|
+
await this.client.fetch(`/v1/agents/${agentId}/capabilities`, {
|
|
81
113
|
method: 'POST',
|
|
82
114
|
body: JSON.stringify({ capabilities }),
|
|
83
115
|
});
|
|
84
116
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Send a message to another agent
|
|
87
|
-
*/
|
|
88
117
|
async sendMessage(toAgentId, payload, options) {
|
|
89
|
-
const
|
|
118
|
+
const agentId = this.client.requireAgentId();
|
|
119
|
+
const response = await this.client.fetch(`/v1/agents/${agentId}/messages/send`, {
|
|
90
120
|
method: 'POST',
|
|
91
121
|
body: JSON.stringify({ toAgentId, payload, ...options }),
|
|
92
122
|
});
|
|
93
123
|
return response.json();
|
|
94
124
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Broadcast a message to all online agents
|
|
97
|
-
*/
|
|
98
125
|
async broadcast(payload, options) {
|
|
99
|
-
const
|
|
126
|
+
const agentId = this.client.requireAgentId();
|
|
127
|
+
const response = await this.client.fetch(`/v1/agents/${agentId}/messages/broadcast`, {
|
|
100
128
|
method: 'POST',
|
|
101
129
|
body: JSON.stringify({ payload, ...options }),
|
|
102
130
|
});
|
|
103
131
|
return response.json();
|
|
104
132
|
}
|
|
105
|
-
/**
|
|
106
|
-
* Get messages for this agent
|
|
107
|
-
*/
|
|
108
133
|
async getMessages(options) {
|
|
134
|
+
const agentId = this.client.requireAgentId();
|
|
109
135
|
const params = new URLSearchParams();
|
|
110
136
|
if (options?.channel)
|
|
111
137
|
params.set('channel', options.channel);
|
|
@@ -113,46 +139,44 @@ class AgentsAPI {
|
|
|
113
139
|
params.set('unreadOnly', String(options.unreadOnly));
|
|
114
140
|
if (options?.limit)
|
|
115
141
|
params.set('limit', String(options.limit));
|
|
116
|
-
const response = await this.client.fetch(`/v1/agents/${
|
|
142
|
+
const response = await this.client.fetch(`/v1/agents/${agentId}/messages?${params}`);
|
|
117
143
|
const data = await response.json();
|
|
118
144
|
return data.messages || [];
|
|
119
145
|
}
|
|
120
|
-
/**
|
|
121
|
-
* Mark messages as read
|
|
122
|
-
*/
|
|
123
146
|
async markRead(messageIds) {
|
|
124
|
-
|
|
147
|
+
const agentId = this.client.requireAgentId();
|
|
148
|
+
await this.client.fetch(`/v1/agents/${agentId}/messages/read`, {
|
|
125
149
|
method: 'POST',
|
|
126
150
|
body: JSON.stringify({ messageIds }),
|
|
127
151
|
});
|
|
128
152
|
}
|
|
129
153
|
}
|
|
130
154
|
exports.AgentsAPI = AgentsAPI;
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
155
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
156
|
+
// Services API
|
|
157
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
134
158
|
class ServicesAPI {
|
|
135
159
|
constructor(client) {
|
|
136
160
|
this.client = client;
|
|
137
161
|
}
|
|
138
|
-
/**
|
|
139
|
-
* List all services
|
|
140
|
-
*/
|
|
141
162
|
async list() {
|
|
142
163
|
const response = await this.client.fetch('/v1/services');
|
|
143
164
|
return response.json();
|
|
144
165
|
}
|
|
145
|
-
/**
|
|
146
|
-
* Get a specific service by name
|
|
147
|
-
*/
|
|
148
166
|
async get(name) {
|
|
149
167
|
const services = await this.list();
|
|
150
168
|
return services.find(s => s.name.toLowerCase() === name.toLowerCase()) || null;
|
|
151
169
|
}
|
|
152
170
|
/**
|
|
153
|
-
* Get connection details for a service
|
|
171
|
+
* Get connection details for a service.
|
|
172
|
+
*
|
|
173
|
+
* If `grantToken` is provided, returns a proxied connection via the hub's
|
|
174
|
+
* grant endpoint instead of assuming a local tunnel.
|
|
154
175
|
*/
|
|
155
|
-
async getConnection(serviceName) {
|
|
176
|
+
async getConnection(serviceName, options) {
|
|
177
|
+
if (options?.grantToken) {
|
|
178
|
+
return this.getGrantConnection(serviceName, options.grantToken);
|
|
179
|
+
}
|
|
156
180
|
const service = await this.get(serviceName);
|
|
157
181
|
if (!service) {
|
|
158
182
|
throw new Error(`Service "${serviceName}" not found`);
|
|
@@ -185,108 +209,127 @@ class ServicesAPI {
|
|
|
185
209
|
connectionString = `tcp://${host}:${port}`;
|
|
186
210
|
envVar = `${serviceName.toUpperCase().replace(/-/g, '_')}_URL`;
|
|
187
211
|
}
|
|
212
|
+
return { service: serviceName, host, port, connectionString, envVar };
|
|
213
|
+
}
|
|
214
|
+
getGrantConnection(serviceName, grantToken) {
|
|
215
|
+
const hubUrl = this.client.hubUrl;
|
|
216
|
+
const grantEndpoint = `${hubUrl}/grant/${encodeURIComponent(serviceName)}`;
|
|
188
217
|
return {
|
|
189
218
|
service: serviceName,
|
|
190
|
-
host,
|
|
191
|
-
port,
|
|
192
|
-
connectionString,
|
|
193
|
-
envVar,
|
|
219
|
+
host: new URL(hubUrl).hostname,
|
|
220
|
+
port: new URL(hubUrl).port ? parseInt(new URL(hubUrl).port, 10) : 443,
|
|
221
|
+
connectionString: grantEndpoint,
|
|
222
|
+
envVar: 'GRANT_URL',
|
|
223
|
+
grantToken,
|
|
224
|
+
grantEndpoint,
|
|
194
225
|
};
|
|
195
226
|
}
|
|
196
227
|
}
|
|
197
228
|
exports.ServicesAPI = ServicesAPI;
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
class
|
|
229
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
230
|
+
// Grants API
|
|
231
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
232
|
+
class GrantsAPI {
|
|
202
233
|
constructor(client) {
|
|
203
234
|
this.client = client;
|
|
204
|
-
this.activeSessions = new Map();
|
|
205
235
|
}
|
|
206
236
|
/**
|
|
207
|
-
* Create an
|
|
237
|
+
* Create a time-limited access grant for an AI agent or external consumer.
|
|
208
238
|
*/
|
|
209
|
-
async create(
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
createdBy: this.client.agentId,
|
|
217
|
-
createdAt: new Date().toISOString(),
|
|
218
|
-
expiresAt: expiresAt.toISOString(),
|
|
219
|
-
metadata: options?.metadata,
|
|
220
|
-
};
|
|
221
|
-
this.activeSessions.set(sessionId, session);
|
|
222
|
-
// Broadcast session creation
|
|
223
|
-
await this.client.agents.broadcast({ type: 'session:created', session }, { channel: 'orchestration' });
|
|
224
|
-
return session;
|
|
239
|
+
async create(options) {
|
|
240
|
+
const response = await this.client.fetch('/v1/grants', {
|
|
241
|
+
method: 'POST',
|
|
242
|
+
body: JSON.stringify(options),
|
|
243
|
+
});
|
|
244
|
+
const data = await response.json();
|
|
245
|
+
return data.grant;
|
|
225
246
|
}
|
|
226
247
|
/**
|
|
227
|
-
*
|
|
248
|
+
* List active grants in the workspace.
|
|
228
249
|
*/
|
|
229
|
-
async
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
endedAt: new Date().toISOString(),
|
|
237
|
-
}, { channel: 'orchestration' });
|
|
250
|
+
async list(options) {
|
|
251
|
+
const params = new URLSearchParams();
|
|
252
|
+
if (options?.includeExpired)
|
|
253
|
+
params.set('includeExpired', 'true');
|
|
254
|
+
const response = await this.client.fetch(`/v1/grants?${params}`);
|
|
255
|
+
const data = await response.json();
|
|
256
|
+
return data.grants || [];
|
|
238
257
|
}
|
|
239
258
|
/**
|
|
240
|
-
*
|
|
259
|
+
* Revoke an active grant immediately.
|
|
241
260
|
*/
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
261
|
+
async revoke(grantId) {
|
|
262
|
+
await this.client.fetch(`/v1/grants/${grantId}`, { method: 'DELETE' });
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Validate a grant token (public endpoint — no API key required).
|
|
266
|
+
* Returns the grant if valid, null otherwise.
|
|
267
|
+
*/
|
|
268
|
+
async validate(token) {
|
|
269
|
+
try {
|
|
270
|
+
const url = `${this.client.hubUrl}/v1/grants/validate`;
|
|
271
|
+
const response = await fetch(url, {
|
|
272
|
+
method: 'POST',
|
|
273
|
+
headers: { 'Content-Type': 'application/json' },
|
|
274
|
+
body: JSON.stringify({ token }),
|
|
275
|
+
});
|
|
276
|
+
if (!response.ok)
|
|
277
|
+
return null;
|
|
278
|
+
const data = await response.json();
|
|
279
|
+
return data.valid ? data.grant : null;
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return null;
|
|
252
283
|
}
|
|
253
|
-
return active;
|
|
254
284
|
}
|
|
255
285
|
}
|
|
256
|
-
exports.
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
286
|
+
exports.GrantsAPI = GrantsAPI;
|
|
287
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
288
|
+
// Main Client
|
|
289
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
260
290
|
class PrivateConnect {
|
|
261
291
|
constructor(config) {
|
|
262
292
|
this.config = {
|
|
263
293
|
apiKey: config.apiKey,
|
|
264
294
|
hubUrl: config.hubUrl || 'https://api.privateconnect.co',
|
|
265
|
-
agentId: config.agentId ||
|
|
295
|
+
agentId: config.agentId || detectAgentId(),
|
|
266
296
|
};
|
|
267
297
|
this.agents = new AgentsAPI(this);
|
|
268
298
|
this.services = new ServicesAPI(this);
|
|
269
|
-
this.
|
|
270
|
-
// Track SDK usage (non-blocking)
|
|
299
|
+
this.grants = new GrantsAPI(this);
|
|
271
300
|
if (!config.disableTracking) {
|
|
272
301
|
trackSdkUsage(this.config.hubUrl);
|
|
273
302
|
}
|
|
274
303
|
}
|
|
275
|
-
/**
|
|
276
|
-
* Get the agent ID
|
|
277
|
-
*/
|
|
304
|
+
/** The resolved agent ID, or undefined if not configured. */
|
|
278
305
|
get agentId() {
|
|
279
306
|
return this.config.agentId;
|
|
280
307
|
}
|
|
308
|
+
/** The hub URL this client is connected to. */
|
|
309
|
+
get hubUrl() {
|
|
310
|
+
return this.config.hubUrl;
|
|
311
|
+
}
|
|
281
312
|
/**
|
|
282
|
-
*
|
|
313
|
+
* Shorthand: get connection details for a service.
|
|
314
|
+
* Pass `grantToken` to connect via the grant proxy instead of a local tunnel.
|
|
283
315
|
*/
|
|
284
|
-
async connect(serviceName) {
|
|
285
|
-
return this.services.getConnection(serviceName);
|
|
316
|
+
async connect(serviceName, options) {
|
|
317
|
+
return this.services.getConnection(serviceName, options);
|
|
286
318
|
}
|
|
287
319
|
/**
|
|
288
|
-
*
|
|
320
|
+
* Returns the agent ID or throws if not configured.
|
|
321
|
+
* Used by APIs that require an authenticated agent identity.
|
|
289
322
|
*/
|
|
323
|
+
requireAgentId() {
|
|
324
|
+
if (!this.config.agentId) {
|
|
325
|
+
throw new Error('Agent ID not found. Either:\n' +
|
|
326
|
+
' 1. Run "connect up" to register this machine, or\n' +
|
|
327
|
+
' 2. Set PRIVATECONNECT_AGENT_ID environment variable, or\n' +
|
|
328
|
+
' 3. Pass agentId in the PrivateConnect constructor.');
|
|
329
|
+
}
|
|
330
|
+
return this.config.agentId;
|
|
331
|
+
}
|
|
332
|
+
/** Internal fetch with API key auth. */
|
|
290
333
|
async fetch(path, options) {
|
|
291
334
|
const url = `${this.config.hubUrl}${path}`;
|
|
292
335
|
const response = await fetch(url, {
|
|
@@ -303,25 +346,16 @@ class PrivateConnect {
|
|
|
303
346
|
}
|
|
304
347
|
return response;
|
|
305
348
|
}
|
|
306
|
-
/**
|
|
307
|
-
* Try to detect agent ID from local config
|
|
308
|
-
*/
|
|
309
|
-
detectAgentId() {
|
|
310
|
-
// In a real implementation, this would read from ~/.connect/config.json
|
|
311
|
-
// For now, generate a default ID
|
|
312
|
-
return `sdk-${Date.now()}`;
|
|
313
|
-
}
|
|
314
349
|
}
|
|
315
350
|
exports.PrivateConnect = PrivateConnect;
|
|
316
|
-
// Default export
|
|
317
351
|
exports.default = PrivateConnect;
|
|
318
|
-
|
|
352
|
+
/** Convenience function for quick one-off connections. */
|
|
319
353
|
async function connect(serviceName, config) {
|
|
320
354
|
const apiKey = config?.apiKey || process.env.PRIVATECONNECT_API_KEY;
|
|
321
355
|
if (!apiKey) {
|
|
322
356
|
throw new Error('API key required. Set PRIVATECONNECT_API_KEY or pass config.apiKey');
|
|
323
357
|
}
|
|
324
358
|
const client = new PrivateConnect({ ...config, apiKey });
|
|
325
|
-
return client.connect(serviceName);
|
|
359
|
+
return client.connect(serviceName, { grantToken: config?.grantToken });
|
|
326
360
|
}
|
|
327
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7OztBQWlaSCwwQkFRQztBQTVZRCxvQ0FBb0M7QUFDcEMsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLEVBQUUsRUFBRSxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsSUFBSSxFQUFFLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMvRixPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLEdBQUcsTUFBTSxvQkFBb0IsRUFBRTtRQUNuQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7QUFDL0MsQ0FBQztBQWtERDs7R0FFRztBQUNILE1BQWEsU0FBUztJQUNwQixZQUFvQixNQUFzQjtRQUF0QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtJQUFHLENBQUM7SUFFOUM7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWtDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNyRSxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUUvQixJQUFJLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ1IsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO1lBQ2QsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO1lBQ3BCLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTtZQUN4QixZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzNELFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7U0FDcEQsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBa0I7UUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFlBQXlFO1FBQ2xHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sZUFBZSxFQUFFO1lBQ3hFLE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQztTQUN2QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNmLFNBQWlCLEVBQ2pCLE9BQWdDLEVBQ2hDLE9BQXVFO1FBRXZFLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sZ0JBQWdCLEVBQUU7WUFDMUYsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztTQUN6RCxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUNiLE9BQWdDLEVBQ2hDLE9BQThCO1FBRTlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8scUJBQXFCLEVBQUU7WUFDL0YsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1NBQzlDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBb0U7UUFDcEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE9BQU8sRUFBRSxPQUFPO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELElBQUksT0FBTyxFQUFFLFVBQVUsS0FBSyxTQUFTO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzVGLElBQUksT0FBTyxFQUFFLEtBQUs7WUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFL0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxhQUFhLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDakcsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQW9CO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sZ0JBQWdCLEVBQUU7WUFDekUsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDO1NBQ3JDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpHRCw4QkFpR0M7QUFFRDs7R0FFRztBQUNILE1BQWEsV0FBVztJQUN0QixZQUFvQixNQUFzQjtRQUF0QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtJQUFHLENBQUM7SUFFOUM7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekQsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFZO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2pGLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBbUI7UUFDckMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxXQUFXLGFBQWEsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDdEQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDO1FBRXpCLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksTUFBTSxHQUFHLGFBQWEsQ0FBQztRQUUzQixJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDbkUsZ0JBQWdCLEdBQUcsY0FBYyxJQUFJLElBQUksSUFBSSxXQUFXLENBQUM7WUFDekQsTUFBTSxHQUFHLGNBQWMsQ0FBQztRQUMxQixDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3ZFLGdCQUFnQixHQUFHLFdBQVcsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdDLE1BQU0sR0FBRyxjQUFjLENBQUM7UUFDMUIsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN2RSxnQkFBZ0IsR0FBRyxXQUFXLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssS0FBSyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUUsZ0JBQWdCLEdBQUcsYUFBYSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxHQUFHLGFBQWEsQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3ZFLGdCQUFnQixHQUFHLFVBQVUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzVDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDckIsQ0FBQzthQUFNLENBQUM7WUFDTixnQkFBZ0IsR0FBRyxTQUFTLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMzQyxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2pFLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLFdBQVc7WUFDcEIsSUFBSTtZQUNKLElBQUk7WUFDSixnQkFBZ0I7WUFDaEIsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE5REQsa0NBOERDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLFdBQVc7SUFHdEIsWUFBb0IsTUFBc0I7UUFBdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFGbEMsbUJBQWMsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUVQLENBQUM7SUFFOUM7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVksRUFBRSxPQUFxRTtRQUM5RixNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RyxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUVoRSxNQUFNLE9BQU8sR0FBWTtZQUN2QixFQUFFLEVBQUUsU0FBUztZQUNiLElBQUk7WUFDSixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRO1lBQy9CLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUNsQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVE7U0FDNUIsQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU1Qyw2QkFBNkI7UUFDN0IsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ2hDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxFQUNwQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FDN0IsQ0FBQztRQUVGLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBaUI7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdEMsd0JBQXdCO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUNoQztZQUNFLElBQUksRUFBRSxlQUFlO1lBQ3JCLFNBQVM7WUFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQzVCLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtTQUNsQyxFQUNELEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxDQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNQLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxNQUFNLEdBQWMsRUFBRSxDQUFDO1FBRTdCLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDaEQsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBcEVELGtDQW9FQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxjQUFjO0lBWXpCLFlBQVksTUFBNEI7UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSwrQkFBK0I7WUFDeEQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtTQUNoRCxDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUIsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFtQjtRQUMvQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBWSxFQUFFLE9BQXFCO1FBQzdDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2hDLEdBQUcsT0FBTztZQUNWLE9BQU8sRUFBRTtnQkFDUCxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2dCQUMvQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxHQUFHLE9BQU8sRUFBRSxPQUFPO2FBQ3BCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLG1CQUFtQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYTtRQUNuQix3RUFBd0U7UUFDeEUsaUNBQWlDO1FBQ2pDLE9BQU8sT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUF6RUQsd0NBeUVDO0FBRUQsaUJBQWlCO0FBQ2pCLGtCQUFlLGNBQWMsQ0FBQztBQUU5Qix1QkFBdUI7QUFDaEIsS0FBSyxVQUFVLE9BQU8sQ0FBQyxXQUFtQixFQUFFLE1BQTZCO0lBQzlFLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJpdmF0ZSBDb25uZWN0IFNES1xuICogXG4gKiBQcm9ncmFtbWF0aWMgYWNjZXNzIHRvIFByaXZhdGUgQ29ubmVjdCBzZXJ2aWNlcyBhbmQgYWdlbnQgb3JjaGVzdHJhdGlvbi5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFByaXZhdGVDb25uZWN0IH0gZnJvbSAnQHByaXZhdGVjb25uZWN0L3Nkayc7XG4gKiBcbiAqIGNvbnN0IHBjID0gbmV3IFByaXZhdGVDb25uZWN0KHsgYXBpS2V5OiAneW91ci1hcGkta2V5JyB9KTtcbiAqIFxuICogLy8gQ29ubmVjdCB0byBhIHNlcnZpY2VcbiAqIGNvbnN0IGRiID0gYXdhaXQgcGMuY29ubmVjdCgncG9zdGdyZXMtcHJvZCcpO1xuICogY29uc29sZS5sb2coZGIuY29ubmVjdGlvblN0cmluZyk7IC8vIHBvc3RncmVzOi8vbG9jYWxob3N0OjU0MzIvLi4uXG4gKiBcbiAqIC8vIExpc3QgYWxsIGFnZW50c1xuICogY29uc3QgYWdlbnRzID0gYXdhaXQgcGMuYWdlbnRzLmxpc3QoKTtcbiAqIFxuICogLy8gU2VuZCBtZXNzYWdlIHRvIGFub3RoZXIgYWdlbnRcbiAqIGF3YWl0IHBjLmFnZW50cy5zZW5kTWVzc2FnZSh0YXJnZXRBZ2VudElkLCB7IGFjdGlvbjogJ2RlcGxveScgfSk7XG4gKiBgYGBcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVDb25uZWN0Q29uZmlnIHtcbiAgLyoqIEFQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uICovXG4gIGFwaUtleTogc3RyaW5nO1xuICAvKiogSHViIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9hcGkucHJpdmF0ZWNvbm5lY3QuY28pICovXG4gIGh1YlVybD86IHN0cmluZztcbiAgLyoqIEFnZW50IElEIChhdXRvLWRldGVjdGVkIGZyb20gY29uZmlnIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgYWdlbnRJZD86IHN0cmluZztcbiAgLyoqIERpc2FibGUgdXNhZ2UgdHJhY2tpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBkaXNhYmxlVHJhY2tpbmc/OiBib29sZWFuO1xufVxuXG4vLyBUcmFjayBTREsgdXNhZ2UgKGZpcmUgYW5kIGZvcmdldClcbmZ1bmN0aW9uIHRyYWNrU2RrVXNhZ2UoaHViVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBvczogdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnID8gcHJvY2Vzcy5wbGF0Zm9ybSA6ICdicm93c2VyJyxcbiAgICBhcmNoOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnID8gJ2FybTY0JyA6ICd4NjQnKSA6ICd1bmtub3duJyxcbiAgICB2ZXJzaW9uOiAnc2RrJyxcbiAgICBzb3VyY2U6ICdzZGsnLFxuICB9KTtcbiAgXG4gIGZldGNoKGAke2h1YlVybH0vdjEvZXZlbnRzL2luc3RhbGxgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogZGF0YSxcbiAgfSkuY2F0Y2goKCkgPT4ge30pOyAvLyBTaWxlbnRseSBpZ25vcmUgZXJyb3JzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0SG9zdDogc3RyaW5nO1xuICB0YXJnZXRQb3J0OiBudW1iZXI7XG4gIHR1bm5lbFBvcnQ/OiBudW1iZXI7XG4gIHByb3RvY29sOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBhZ2VudExhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaXNPbmxpbmU6IGJvb2xlYW47XG4gIGxhc3RTZWVuQXQ6IHN0cmluZztcbiAgY2FwYWJpbGl0aWVzOiBzdHJpbmdbXTtcbiAgc2VydmljZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XG4gIGVudlZhcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICBpZDogc3RyaW5nO1xuICBmcm9tOiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH07XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIGlzUmVhZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIGV4cGlyZXNBdDogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvblxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRzQVBJIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBhZ2VudHMgaW4gdGhlIHdvcmtzcGFjZVxuICAgKi9cbiAgYXN5bmMgbGlzdChvcHRpb25zPzogeyBvbmxpbmVPbmx5PzogYm9vbGVhbiB9KTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL2FnZW50cy9vcmNoZXN0cmF0aW9uJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBsZXQgYWdlbnRzID0gZGF0YS5hZ2VudHMgfHwgW107XG4gICAgXG4gICAgaWYgKG9wdGlvbnM/Lm9ubGluZU9ubHkpIHtcbiAgICAgIGFnZW50cyA9IGFnZW50cy5maWx0ZXIoKGE6IGFueSkgPT4gYS5pc09ubGluZSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhZ2VudHMubWFwKChhOiBhbnkpID0+ICh7XG4gICAgICBpZDogYS5pZCxcbiAgICAgIG5hbWU6IGEubmFtZSxcbiAgICAgIGxhYmVsOiBhLmxhYmVsLFxuICAgICAgaXNPbmxpbmU6IGEuaXNPbmxpbmUsXG4gICAgICBsYXN0U2VlbkF0OiBhLmxhc3RTZWVuQXQsXG4gICAgICBjYXBhYmlsaXRpZXM6IGEuY2FwYWJpbGl0aWVzPy5tYXAoKGM6IGFueSkgPT4gYy5uYW1lKSB8fCBbXSxcbiAgICAgIHNlcnZpY2VzOiBhLnNlcnZpY2VzPy5tYXAoKHM6IGFueSkgPT4gcy5uYW1lKSB8fCBbXSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhZ2VudHMgYnkgY2FwYWJpbGl0eVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5Q2FwYWJpbGl0eShjYXBhYmlsaXR5OiBzdHJpbmcpOiBQcm9taXNlPEFnZW50W10+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzL2J5LWNhcGFiaWxpdHkvJHtlbmNvZGVVUklDb21wb25lbnQoY2FwYWJpbGl0eSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4gZGF0YS5hZ2VudHMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGFnZW50XG4gICAqL1xuICBhc3luYyByZWdpc3RlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHt0aGlzLmNsaWVudC5hZ2VudElkfS9jYXBhYmlsaXRpZXNgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY2FwYWJpbGl0aWVzIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBtZXNzYWdlIHRvIGFub3RoZXIgYWdlbnRcbiAgICovXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIHRvQWdlbnRJZDogc3RyaW5nLFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XG4gICk6IFByb21pc2U8eyBtZXNzYWdlSWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke3RoaXMuY2xpZW50LmFnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9BZ2VudElkLCBwYXlsb2FkLCAuLi5vcHRpb25zIH0pLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byBhbGwgb25saW5lIGFnZW50c1xuICAgKi9cbiAgYXN5bmMgYnJvYWRjYXN0KFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPHsgc2VudDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7dGhpcy5jbGllbnQuYWdlbnRJZH0vbWVzc2FnZXMvYnJvYWRjYXN0YCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBheWxvYWQsIC4uLm9wdGlvbnMgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZXMgZm9yIHRoaXMgYWdlbnRcbiAgICovXG4gIGFzeW5jIGdldE1lc3NhZ2VzKG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHVucmVhZE9ubHk/OiBib29sZWFuOyBsaW1pdD86IG51bWJlciB9KTogUHJvbWlzZTxNZXNzYWdlW10+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgaWYgKG9wdGlvbnM/LmNoYW5uZWwpIHBhcmFtcy5zZXQoJ2NoYW5uZWwnLCBvcHRpb25zLmNoYW5uZWwpO1xuICAgIGlmIChvcHRpb25zPy51bnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ3VucmVhZE9ubHknLCBTdHJpbmcob3B0aW9ucy51bnJlYWRPbmx5KSk7XG4gICAgaWYgKG9wdGlvbnM/LmxpbWl0KSBwYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhvcHRpb25zLmxpbWl0KSk7XG4gICAgXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke3RoaXMuY2xpZW50LmFnZW50SWR9L21lc3NhZ2VzPyR7cGFyYW1zfWApO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIGRhdGEubWVzc2FnZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogTWFyayBtZXNzYWdlcyBhcyByZWFkXG4gICAqL1xuICBhc3luYyBtYXJrUmVhZChtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7dGhpcy5jbGllbnQuYWdlbnRJZH0vbWVzc2FnZXMvcmVhZGAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXNzYWdlSWRzIH0pLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2VydmljZXMgQVBJIGZvciBjb25uZWN0aW5nIHRvIGFuZCBtYW5hZ2luZyBzZXJ2aWNlc1xuICovXG5leHBvcnQgY2xhc3MgU2VydmljZXNBUEkge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUHJpdmF0ZUNvbm5lY3QpIHt9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIHNlcnZpY2VzXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8U2VydmljZVtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzcGVjaWZpYyBzZXJ2aWNlIGJ5IG5hbWVcbiAgICovXG4gIGFzeW5jIGdldChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFNlcnZpY2UgfCBudWxsPiB7XG4gICAgY29uc3Qgc2VydmljZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbm5lY3Rpb24gZGV0YWlscyBmb3IgYSBzZXJ2aWNlXG4gICAqL1xuICBhc3luYyBnZXRDb25uZWN0aW9uKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXQoc2VydmljZU5hbWUpO1xuICAgIGlmICghc2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJ2aWNlIFwiJHtzZXJ2aWNlTmFtZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gc2VydmljZS50dW5uZWxQb3J0IHx8IHNlcnZpY2UudGFyZ2V0UG9ydDtcbiAgICBjb25zdCBob3N0ID0gJ2xvY2FsaG9zdCc7XG4gICAgXG4gICAgbGV0IGNvbm5lY3Rpb25TdHJpbmcgPSAnJztcbiAgICBsZXQgZW52VmFyID0gJ1NFUlZJQ0VfVVJMJztcbiAgICBcbiAgICBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA1NDMyIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdwb3N0Z3JlcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgcG9zdGdyZXM6Ly8ke2hvc3R9OiR7cG9ydH0vcG9zdGdyZXNgO1xuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDMzMDYgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ215c3FsJykge1xuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBteXNxbDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnREFUQUJBU0VfVVJMJztcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gNjM3OSB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAncmVkaXMnKSB7XG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHJlZGlzOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9ICdSRURJU19VUkwnO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSAyNzAxNyB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbW9uZ29kYicpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgbW9uZ29kYjovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnTU9OR09EQl9VUkknO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHAnIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdodHRwcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgaHR0cDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnQVBJX1VSTCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgdGNwOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9IGAke3NlcnZpY2VOYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpfV9VUkxgO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSxcbiAgICAgIGhvc3QsXG4gICAgICBwb3J0LFxuICAgICAgY29ubmVjdGlvblN0cmluZyxcbiAgICAgIGVudlZhcixcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU2Vzc2lvbnMgQVBJIGZvciBlcGhlbWVyYWwgb3JjaGVzdHJhdGlvbiBzZXNzaW9uc1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbnNBUEkge1xuICBwcml2YXRlIGFjdGl2ZVNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIFNlc3Npb24+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gb3JjaGVzdHJhdGlvbiBzZXNzaW9uXG4gICAqL1xuICBhc3luYyBjcmVhdGUobmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyB0dGxNaW51dGVzPzogbnVtYmVyOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPFNlc3Npb24+IHtcbiAgICBjb25zdCB0dGxNaW51dGVzID0gb3B0aW9ucz8udHRsTWludXRlcyB8fCA2MDtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSBgJHt0aGlzLmNsaWVudC5hZ2VudElkfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDgpfWA7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIHR0bE1pbnV0ZXMgKiA2MCAqIDEwMDApO1xuXG4gICAgY29uc3Qgc2Vzc2lvbjogU2Vzc2lvbiA9IHtcbiAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICBuYW1lLFxuICAgICAgY3JlYXRlZEJ5OiB0aGlzLmNsaWVudC5hZ2VudElkISxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZXhwaXJlc0F0OiBleHBpcmVzQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zPy5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgdGhpcy5hY3RpdmVTZXNzaW9ucy5zZXQoc2Vzc2lvbklkLCBzZXNzaW9uKTtcblxuICAgIC8vIEJyb2FkY2FzdCBzZXNzaW9uIGNyZWF0aW9uXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuYWdlbnRzLmJyb2FkY2FzdChcbiAgICAgIHsgdHlwZTogJ3Nlc3Npb246Y3JlYXRlZCcsIHNlc3Npb24gfSxcbiAgICAgIHsgY2hhbm5lbDogJ29yY2hlc3RyYXRpb24nIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogRW5kIGFuIG9yY2hlc3RyYXRpb24gc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgZW5kKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hY3RpdmVTZXNzaW9ucy5kZWxldGUoc2Vzc2lvbklkKTtcblxuICAgIC8vIEJyb2FkY2FzdCBzZXNzaW9uIGVuZFxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmFnZW50cy5icm9hZGNhc3QoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdzZXNzaW9uOmVuZGVkJyxcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBlbmRlZEJ5OiB0aGlzLmNsaWVudC5hZ2VudElkLFxuICAgICAgICBlbmRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9LFxuICAgICAgeyBjaGFubmVsOiAnb3JjaGVzdHJhdGlvbicgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFjdGl2ZSBzZXNzaW9uc1xuICAgKi9cbiAgZ2V0QWN0aXZlKCk6IFNlc3Npb25bXSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBhY3RpdmU6IFNlc3Npb25bXSA9IFtdO1xuICAgIFxuICAgIGZvciAoY29uc3QgW2lkLCBzZXNzaW9uXSBvZiB0aGlzLmFjdGl2ZVNlc3Npb25zKSB7XG4gICAgICBpZiAobmV3IERhdGUoc2Vzc2lvbi5leHBpcmVzQXQpID4gbm93KSB7XG4gICAgICAgIGFjdGl2ZS5wdXNoKHNlc3Npb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTZXNzaW9ucy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYWN0aXZlO1xuICB9XG59XG5cbi8qKlxuICogTWFpbiBQcml2YXRlIENvbm5lY3QgU0RLIGNsaWVudFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZUNvbm5lY3Qge1xuICBwcml2YXRlIGNvbmZpZzogeyBhcGlLZXk6IHN0cmluZzsgaHViVXJsOiBzdHJpbmc7IGFnZW50SWQ6IHN0cmluZyB9O1xuICBcbiAgLyoqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvbiAqL1xuICBwdWJsaWMgYWdlbnRzOiBBZ2VudHNBUEk7XG4gIFxuICAvKiogU2VydmljZXMgQVBJIGZvciBjb25uZWN0aW5nIHRvIHNlcnZpY2VzICovXG4gIHB1YmxpYyBzZXJ2aWNlczogU2VydmljZXNBUEk7XG4gIFxuICAvKiogU2Vzc2lvbnMgQVBJIGZvciBlcGhlbWVyYWwgb3JjaGVzdHJhdGlvbiAqL1xuICBwdWJsaWMgc2Vzc2lvbnM6IFNlc3Npb25zQVBJO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUHJpdmF0ZUNvbm5lY3RDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcbiAgICAgIGh1YlVybDogY29uZmlnLmh1YlVybCB8fCAnaHR0cHM6Ly9hcGkucHJpdmF0ZWNvbm5lY3QuY28nLFxuICAgICAgYWdlbnRJZDogY29uZmlnLmFnZW50SWQgfHwgdGhpcy5kZXRlY3RBZ2VudElkKCksXG4gICAgfTtcblxuICAgIHRoaXMuYWdlbnRzID0gbmV3IEFnZW50c0FQSSh0aGlzKTtcbiAgICB0aGlzLnNlcnZpY2VzID0gbmV3IFNlcnZpY2VzQVBJKHRoaXMpO1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2Vzc2lvbnNBUEkodGhpcyk7XG5cbiAgICAvLyBUcmFjayBTREsgdXNhZ2UgKG5vbi1ibG9ja2luZylcbiAgICBpZiAoIWNvbmZpZy5kaXNhYmxlVHJhY2tpbmcpIHtcbiAgICAgIHRyYWNrU2RrVXNhZ2UodGhpcy5jb25maWcuaHViVXJsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhZ2VudCBJRFxuICAgKi9cbiAgZ2V0IGFnZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIGEgc2VydmljZSBhbmQgZ2V0IGNvbm5lY3Rpb24gZGV0YWlsc1xuICAgKi9cbiAgYXN5bmMgY29ubmVjdChzZXJ2aWNlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgZmV0Y2ggaGVscGVyXG4gICAqL1xuICBhc3luYyBmZXRjaChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5odWJVcmx9JHtwYXRofWA7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICd4LWFwaS1rZXknOiB0aGlzLmNvbmZpZy5hcGlLZXksXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgbWVzc2FnZTogJ1Vua25vd24gZXJyb3InIH0pKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlIHx8IGBSZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBkZXRlY3QgYWdlbnQgSUQgZnJvbSBsb2NhbCBjb25maWdcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0QWdlbnRJZCgpOiBzdHJpbmcge1xuICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCByZWFkIGZyb20gfi8uY29ubmVjdC9jb25maWcuanNvblxuICAgIC8vIEZvciBub3csIGdlbmVyYXRlIGEgZGVmYXVsdCBJRFxuICAgIHJldHVybiBgc2RrLSR7RGF0ZS5ub3coKX1gO1xuICB9XG59XG5cbi8vIERlZmF1bHQgZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBQcml2YXRlQ29ubmVjdDtcblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb25cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnKTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gIGNvbnN0IGFwaUtleSA9IGNvbmZpZz8uYXBpS2V5IHx8IHByb2Nlc3MuZW52LlBSSVZBVEVDT05ORUNUX0FQSV9LRVk7XG4gIGlmICghYXBpS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBUEkga2V5IHJlcXVpcmVkLiBTZXQgUFJJVkFURUNPTk5FQ1RfQVBJX0tFWSBvciBwYXNzIGNvbmZpZy5hcGlLZXknKTtcbiAgfVxuICBcbiAgY29uc3QgY2xpZW50ID0gbmV3IFByaXZhdGVDb25uZWN0KHsgLi4uY29uZmlnLCBhcGlLZXkgfSk7XG4gIHJldHVybiBjbGllbnQuY29ubmVjdChzZXJ2aWNlTmFtZSk7XG59XG5cbiJdfQ==
|
|
361
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7OztBQWljSCwwQkFXQztBQTFjRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQWlGekIsZ0ZBQWdGO0FBQ2hGLFdBQVc7QUFDWCxnRkFBZ0Y7QUFFaEYsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLEVBQUUsRUFBRSxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsSUFBSSxFQUFFLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMvRixPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLEdBQUcsTUFBTSxvQkFBb0IsRUFBRTtRQUNuQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixxQkFBcUI7QUFDckIsZ0ZBQWdGO0FBRWhGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFD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RUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRjtBQWpGRCx3Q0FpRkM7QUFFRCxrQkFBZSxjQUFjLENBQUM7QUFFOUIsMERBQTBEO0FBQ25ELEtBQUssVUFBVSxPQUFPLENBQzNCLFdBQW1CLEVBQ25CLE1BQXVEO0lBRXZELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByaXZhdGUgQ29ubmVjdCBTREtcbiAqXG4gKiBQcm9ncmFtbWF0aWMgYWNjZXNzIHRvIFByaXZhdGUgQ29ubmVjdCBzZXJ2aWNlcywgZ3JhbnRzLCBhbmQgYWdlbnQgb3JjaGVzdHJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgUHJpdmF0ZUNvbm5lY3QgfSBmcm9tICdAcHJpdmF0ZWNvbm5lY3Qvc2RrJztcbiAqXG4gKiBjb25zdCBwYyA9IG5ldyBQcml2YXRlQ29ubmVjdCh7IGFwaUtleTogJ3lvdXItYXBpLWtleScgfSk7XG4gKlxuICogLy8gQ29ubmVjdCB0byBhIHNlcnZpY2UgKGFzc3VtZXMgdHVubmVsIGlzIGFscmVhZHkgb3BlbilcbiAqIGNvbnN0IGRiID0gYXdhaXQgcGMuY29ubmVjdCgncG9zdGdyZXMtcHJvZCcpO1xuICogY29uc29sZS5sb2coZGIuY29ubmVjdGlvblN0cmluZyk7IC8vIHBvc3RncmVzOi8vbG9jYWxob3N0OjU0MzIvLi4uXG4gKlxuICogLy8gR3JhbnQgYW4gQUkgYWdlbnQgdGVtcG9yYXJ5IGFjY2Vzc1xuICogY29uc3QgZ3JhbnQgPSBhd2FpdCBwYy5ncmFudHMuY3JlYXRlKHtcbiAqICAgYWdlbnRMYWJlbDogJ2NsYXVkZScsXG4gKiAgIHJlc291cmNlVHlwZTogJ2RiJyxcbiAqICAgcmVzb3VyY2VOYW1lOiAncG9zdGdyZXMnLFxuICogICB0dGw6ICc1bScsXG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKGdyYW50LnRva2VuKTsgLy8gZ250Xy4uLlxuICpcbiAqIC8vIExpc3QgYWxsIGFnZW50c1xuICogY29uc3QgYWdlbnRzID0gYXdhaXQgcGMuYWdlbnRzLmxpc3QoKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVHlwZXNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVDb25uZWN0Q29uZmlnIHtcbiAgLyoqIEFQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uICovXG4gIGFwaUtleTogc3RyaW5nO1xuICAvKiogSHViIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9hcGkucHJpdmF0ZWNvbm5lY3QuY28pICovXG4gIGh1YlVybD86IHN0cmluZztcbiAgLyoqIEFnZW50IElEIChhdXRvLWRldGVjdGVkIGZyb20gbG9jYWwgY29uZmlnIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgYWdlbnRJZD86IHN0cmluZztcbiAgLyoqIERpc2FibGUgdXNhZ2UgdHJhY2tpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBkaXNhYmxlVHJhY2tpbmc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2Uge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhcmdldEhvc3Q6IHN0cmluZztcbiAgdGFyZ2V0UG9ydDogbnVtYmVyO1xuICB0dW5uZWxQb3J0PzogbnVtYmVyO1xuICBwcm90b2NvbDogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgYWdlbnRMYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGlzT25saW5lOiBib29sZWFuO1xuICBsYXN0U2VlbkF0OiBzdHJpbmc7XG4gIGNhcGFiaWxpdGllczogc3RyaW5nW107XG4gIHNlcnZpY2VzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcbiAgc2VydmljZTogc3RyaW5nO1xuICBob3N0OiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbiAgY29ubmVjdGlvblN0cmluZzogc3RyaW5nO1xuICBlbnZWYXI6IHN0cmluZztcbiAgLyoqIFByZXNlbnQgd2hlbiB1c2luZyBhIGdyYW50LWJhc2VkIGNvbm5lY3Rpb24gKi9cbiAgZ3JhbnRUb2tlbj86IHN0cmluZztcbiAgLyoqIFByZXNlbnQgd2hlbiB1c2luZyBhIGdyYW50LWJhc2VkIGNvbm5lY3Rpb24gKi9cbiAgZ3JhbnRFbmRwb2ludD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgaWQ6IHN0cmluZztcbiAgZnJvbTogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9O1xuICBjaGFubmVsOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICBpc1JlYWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JhbnQge1xuICBpZDogc3RyaW5nO1xuICBhZ2VudExhYmVsOiBzdHJpbmc7XG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbiAgZXhwaXJlc0F0OiBzdHJpbmc7XG4gIGV4cGlyZXNJbk1pbnV0ZXM/OiBudW1iZXI7XG4gIHRva2VuPzogc3RyaW5nO1xuICBlbmRwb2ludD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmFudENyZWF0ZU9wdGlvbnMge1xuICBhZ2VudExhYmVsOiBzdHJpbmc7XG4gIHJlc291cmNlVHlwZTogJ2RiJyB8ICdhcGknIHwgJ3BhdGgnO1xuICByZXNvdXJjZU5hbWU6IHN0cmluZztcbiAgc2NvcGU/OiAncmVhZC1vbmx5JyB8ICdmdWxsJztcbiAgLyoqIER1cmF0aW9uIHN0cmluZzogNjBzLCA1bSwgMWgsIDFkICovXG4gIHR0bDogc3RyaW5nO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFRyYWNraW5nXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gdHJhY2tTZGtVc2FnZShodWJVcmw6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIG9zOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzLnBsYXRmb3JtIDogJ2Jyb3dzZXInLFxuICAgIGFyY2g6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IChwcm9jZXNzLmFyY2ggPT09ICdhcm02NCcgPyAnYXJtNjQnIDogJ3g2NCcpIDogJ3Vua25vd24nLFxuICAgIHZlcnNpb246ICdzZGsnLFxuICAgIHNvdXJjZTogJ3NkaycsXG4gIH0pO1xuXG4gIGZldGNoKGAke2h1YlVybH0vdjEvZXZlbnRzL2luc3RhbGxgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogZGF0YSxcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFnZW50IElEIERldGVjdGlvblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IENPTkZJR19QQVRIID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5wcml2YXRlLWNvbm5lY3QnLCAnY29uZmlnLmpzb24nKTtcblxuLyoqXG4gKiBEZXRlY3QgdGhlIGFnZW50IElEIGZyb20gbG9jYWwgY29uZmlnIG9yIGVudmlyb25tZW50LlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm8gYWdlbnQgaXMgY29uZmlndXJlZCDigJQgY2FsbGVycyB0aGF0IG5lZWQgYW4gYWdlbnQgSURcbiAqIHNob3VsZCBzdXJmYWNlIGEgY2xlYXIgZXJyb3IgcmF0aGVyIHRoYW4gdXNpbmcgYSBmYWtlIG9uZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0QWdlbnRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyAxLiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKGhpZ2hlc3QgcHJpb3JpdHkg4oCUIHVzZWZ1bCBpbiBDSSlcbiAgY29uc3QgZW52SWQgPSBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BR0VOVF9JRCB8fCBwcm9jZXNzLmVudi5DT05ORUNUX0FHRU5UX0lEO1xuICBpZiAoZW52SWQpIHJldHVybiBlbnZJZDtcblxuICAvLyAyLiBMb2NhbCBjb25maWcgZmlsZSAofi8ucHJpdmF0ZS1jb25uZWN0L2NvbmZpZy5qc29uKVxuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKENPTkZJR19QQVRIKSkge1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19QQVRILCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIGlmIChjb25maWcuYWdlbnRJZCAmJiB0eXBlb2YgY29uZmlnLmFnZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBjb25maWcuYWdlbnRJZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIENvbmZpZyB1bnJlYWRhYmxlIG9yIG1hbGZvcm1lZCDigJQgZmFsbCB0aHJvdWdoXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFnZW50cyBBUElcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgQWdlbnRzQVBJIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIGFzeW5jIGxpc3Qob3B0aW9ucz86IHsgb25saW5lT25seT86IGJvb2xlYW4gfSk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9hZ2VudHMvb3JjaGVzdHJhdGlvbicpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgbGV0IGFnZW50cyA9IGRhdGEuYWdlbnRzIHx8IFtdO1xuXG4gICAgaWYgKG9wdGlvbnM/Lm9ubGluZU9ubHkpIHtcbiAgICAgIGFnZW50cyA9IGFnZW50cy5maWx0ZXIoKGE6IGFueSkgPT4gYS5pc09ubGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFnZW50cy5tYXAoKGE6IGFueSkgPT4gKHtcbiAgICAgIGlkOiBhLmlkLFxuICAgICAgbmFtZTogYS5uYW1lLFxuICAgICAgbGFiZWw6IGEubGFiZWwsXG4gICAgICBpc09ubGluZTogYS5pc09ubGluZSxcbiAgICAgIGxhc3RTZWVuQXQ6IGEubGFzdFNlZW5BdCxcbiAgICAgIGNhcGFiaWxpdGllczogYS5jYXBhYmlsaXRpZXM/Lm1hcCgoYzogYW55KSA9PiBjLm5hbWUpIHx8IFtdLFxuICAgICAgc2VydmljZXM6IGEuc2VydmljZXM/Lm1hcCgoczogYW55KSA9PiBzLm5hbWUpIHx8IFtdLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRCeUNhcGFiaWxpdHkoY2FwYWJpbGl0eTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy9ieS1jYXBhYmlsaXR5LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhcGFiaWxpdHkpfWApO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIGRhdGEuYWdlbnRzIHx8IFtdO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vY2FwYWJpbGl0aWVzYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNhcGFiaWxpdGllcyB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIHRvQWdlbnRJZDogc3RyaW5nLFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XG4gICk6IFByb21pc2U8eyBtZXNzYWdlSWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9BZ2VudElkLCBwYXlsb2FkLCAuLi5vcHRpb25zIH0pLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gIH1cblxuICBhc3luYyBicm9hZGNhc3QoXG4gICAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgb3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8eyBzZW50OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcy9icm9hZGNhc3RgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF5bG9hZCwgLi4ub3B0aW9ucyB9KSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWVzc2FnZXMob3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZzsgdW5yZWFkT25seT86IGJvb2xlYW47IGxpbWl0PzogbnVtYmVyIH0pOiBQcm9taXNlPE1lc3NhZ2VbXT4ge1xuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAob3B0aW9ucz8uY2hhbm5lbCkgcGFyYW1zLnNldCgnY2hhbm5lbCcsIG9wdGlvbnMuY2hhbm5lbCk7XG4gICAgaWYgKG9wdGlvbnM/LnVucmVhZE9ubHkgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgndW5yZWFkT25seScsIFN0cmluZyhvcHRpb25zLnVucmVhZE9ubHkpKTtcbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdGlvbnMubGltaXQpKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcz8ke3BhcmFtc31gKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBkYXRhLm1lc3NhZ2VzIHx8IFtdO1xuICB9XG5cbiAgYXN5bmMgbWFya1JlYWQobWVzc2FnZUlkczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3JlYWRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZUlkcyB9KSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNlcnZpY2VzIEFQSVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlc0FQSSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cblxuICBhc3luYyBsaXN0KCk6IFByb21pc2U8U2VydmljZVtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIGFzeW5jIGdldChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFNlcnZpY2UgfCBudWxsPiB7XG4gICAgY29uc3Qgc2VydmljZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbm5lY3Rpb24gZGV0YWlscyBmb3IgYSBzZXJ2aWNlLlxuICAgKlxuICAgKiBJZiBgZ3JhbnRUb2tlbmAgaXMgcHJvdmlkZWQsIHJldHVybnMgYSBwcm94aWVkIGNvbm5lY3Rpb24gdmlhIHRoZSBodWInc1xuICAgKiBncmFudCBlbmRwb2ludCBpbnN0ZWFkIG9mIGFzc3VtaW5nIGEgbG9jYWwgdHVubmVsLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBncmFudFRva2VuPzogc3RyaW5nIH0pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcbiAgICBpZiAob3B0aW9ucz8uZ3JhbnRUb2tlbikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0R3JhbnRDb25uZWN0aW9uKHNlcnZpY2VOYW1lLCBvcHRpb25zLmdyYW50VG9rZW4pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBhd2FpdCB0aGlzLmdldChzZXJ2aWNlTmFtZSk7XG4gICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlcnZpY2UgXCIke3NlcnZpY2VOYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBzZXJ2aWNlLnR1bm5lbFBvcnQgfHwgc2VydmljZS50YXJnZXRQb3J0O1xuICAgIGNvbnN0IGhvc3QgPSAnbG9jYWxob3N0JztcblxuICAgIGxldCBjb25uZWN0aW9uU3RyaW5nID0gJyc7XG4gICAgbGV0IGVudlZhciA9ICdTRVJWSUNFX1VSTCc7XG5cbiAgICBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA1NDMyIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdwb3N0Z3JlcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgcG9zdGdyZXM6Ly8ke2hvc3R9OiR7cG9ydH0vcG9zdGdyZXNgO1xuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDMzMDYgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ215c3FsJykge1xuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBteXNxbDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnREFUQUJBU0VfVVJMJztcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gNjM3OSB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAncmVkaXMnKSB7XG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHJlZGlzOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9ICdSRURJU19VUkwnO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSAyNzAxNyB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbW9uZ29kYicpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgbW9uZ29kYjovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnTU9OR09EQl9VUkknO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHAnIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdodHRwcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgaHR0cDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnQVBJX1VSTCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgdGNwOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9IGAke3NlcnZpY2VOYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpfV9VUkxgO1xuICAgIH1cblxuICAgIHJldHVybiB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCBob3N0LCBwb3J0LCBjb25uZWN0aW9uU3RyaW5nLCBlbnZWYXIgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JhbnRDb25uZWN0aW9uKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGdyYW50VG9rZW46IHN0cmluZyk6IENvbm5lY3Rpb24ge1xuICAgIGNvbnN0IGh1YlVybCA9IHRoaXMuY2xpZW50Lmh1YlVybDtcbiAgICBjb25zdCBncmFudEVuZHBvaW50ID0gYCR7aHViVXJsfS9ncmFudC8ke2VuY29kZVVSSUNvbXBvbmVudChzZXJ2aWNlTmFtZSl9YDtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSxcbiAgICAgIGhvc3Q6IG5ldyBVUkwoaHViVXJsKS5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IG5ldyBVUkwoaHViVXJsKS5wb3J0ID8gcGFyc2VJbnQobmV3IFVSTChodWJVcmwpLnBvcnQsIDEwKSA6IDQ0MyxcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmc6IGdyYW50RW5kcG9pbnQsXG4gICAgICBlbnZWYXI6ICdHUkFOVF9VUkwnLFxuICAgICAgZ3JhbnRUb2tlbixcbiAgICAgIGdyYW50RW5kcG9pbnQsXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEdyYW50cyBBUElcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgR3JhbnRzQVBJIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0aW1lLWxpbWl0ZWQgYWNjZXNzIGdyYW50IGZvciBhbiBBSSBhZ2VudCBvciBleHRlcm5hbCBjb25zdW1lci5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBHcmFudENyZWF0ZU9wdGlvbnMpOiBQcm9taXNlPEdyYW50PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL2dyYW50cycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkob3B0aW9ucyksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4gZGF0YS5ncmFudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFjdGl2ZSBncmFudHMgaW4gdGhlIHdvcmtzcGFjZS5cbiAgICovXG4gIGFzeW5jIGxpc3Qob3B0aW9ucz86IHsgaW5jbHVkZUV4cGlyZWQ/OiBib29sZWFuIH0pOiBQcm9taXNlPEdyYW50W10+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgaWYgKG9wdGlvbnM/LmluY2x1ZGVFeHBpcmVkKSBwYXJhbXMuc2V0KCdpbmNsdWRlRXhwaXJlZCcsICd0cnVlJyk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2dyYW50cz8ke3BhcmFtc31gKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBkYXRhLmdyYW50cyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2UgYW4gYWN0aXZlIGdyYW50IGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgcmV2b2tlKGdyYW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvZ3JhbnRzLyR7Z3JhbnRJZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBncmFudCB0b2tlbiAocHVibGljIGVuZHBvaW50IOKAlCBubyBBUEkga2V5IHJlcXVpcmVkKS5cbiAgICogUmV0dXJucyB0aGUgZ3JhbnQgaWYgdmFsaWQsIG51bGwgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGUodG9rZW46IHN0cmluZyk6IFByb21pc2U8R3JhbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY2xpZW50Lmh1YlVybH0vdjEvZ3JhbnRzL3ZhbGlkYXRlYDtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0b2tlbiB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgcmV0dXJuIGRhdGEudmFsaWQgPyBkYXRhLmdyYW50IDogbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIE1haW4gQ2xpZW50XG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIFByaXZhdGVDb25uZWN0IHtcbiAgcHJpdmF0ZSBjb25maWc6IHsgYXBpS2V5OiBzdHJpbmc7IGh1YlVybDogc3RyaW5nOyBhZ2VudElkPzogc3RyaW5nIH07XG5cbiAgLyoqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvbiAqL1xuICBwdWJsaWMgYWdlbnRzOiBBZ2VudHNBUEk7XG5cbiAgLyoqIFNlcnZpY2VzIEFQSSBmb3IgY29ubmVjdGluZyB0byBzZXJ2aWNlcyAqL1xuICBwdWJsaWMgc2VydmljZXM6IFNlcnZpY2VzQVBJO1xuXG4gIC8qKiBHcmFudHMgQVBJIGZvciBtYW5hZ2luZyB0aW1lLWxpbWl0ZWQgYWNjZXNzIHRva2VucyAqL1xuICBwdWJsaWMgZ3JhbnRzOiBHcmFudHNBUEk7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQcml2YXRlQ29ubmVjdENvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LFxuICAgICAgaHViVXJsOiBjb25maWcuaHViVXJsIHx8ICdodHRwczovL2FwaS5wcml2YXRlY29ubmVjdC5jbycsXG4gICAgICBhZ2VudElkOiBjb25maWcuYWdlbnRJZCB8fCBkZXRlY3RBZ2VudElkKCksXG4gICAgfTtcblxuICAgIHRoaXMuYWdlbnRzID0gbmV3IEFnZW50c0FQSSh0aGlzKTtcbiAgICB0aGlzLnNlcnZpY2VzID0gbmV3IFNlcnZpY2VzQVBJKHRoaXMpO1xuICAgIHRoaXMuZ3JhbnRzID0gbmV3IEdyYW50c0FQSSh0aGlzKTtcblxuICAgIGlmICghY29uZmlnLmRpc2FibGVUcmFja2luZykge1xuICAgICAgdHJhY2tTZGtVc2FnZSh0aGlzLmNvbmZpZy5odWJVcmwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgcmVzb2x2ZWQgYWdlbnQgSUQsIG9yIHVuZGVmaW5lZCBpZiBub3QgY29uZmlndXJlZC4gKi9cbiAgZ2V0IGFnZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcbiAgfVxuXG4gIC8qKiBUaGUgaHViIFVSTCB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8uICovXG4gIGdldCBodWJVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaHViVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3J0aGFuZDogZ2V0IGNvbm5lY3Rpb24gZGV0YWlscyBmb3IgYSBzZXJ2aWNlLlxuICAgKiBQYXNzIGBncmFudFRva2VuYCB0byBjb25uZWN0IHZpYSB0aGUgZ3JhbnQgcHJveHkgaW5zdGVhZCBvZiBhIGxvY2FsIHR1bm5lbC5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3Qoc2VydmljZU5hbWU6IHN0cmluZywgb3B0aW9ucz86IHsgZ3JhbnRUb2tlbj86IHN0cmluZyB9KTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYWdlbnQgSUQgb3IgdGhyb3dzIGlmIG5vdCBjb25maWd1cmVkLlxuICAgKiBVc2VkIGJ5IEFQSXMgdGhhdCByZXF1aXJlIGFuIGF1dGhlbnRpY2F0ZWQgYWdlbnQgaWRlbnRpdHkuXG4gICAqL1xuICByZXF1aXJlQWdlbnRJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb25maWcuYWdlbnRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQWdlbnQgSUQgbm90IGZvdW5kLiBFaXRoZXI6XFxuJyArXG4gICAgICAgICcgIDEuIFJ1biBcImNvbm5lY3QgdXBcIiB0byByZWdpc3RlciB0aGlzIG1hY2hpbmUsIG9yXFxuJyArXG4gICAgICAgICcgIDIuIFNldCBQUklWQVRFQ09OTkVDVF9BR0VOVF9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3JcXG4nICtcbiAgICAgICAgJyAgMy4gUGFzcyBhZ2VudElkIGluIHRoZSBQcml2YXRlQ29ubmVjdCBjb25zdHJ1Y3Rvci4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcbiAgfVxuXG4gIC8qKiBJbnRlcm5hbCBmZXRjaCB3aXRoIEFQSSBrZXkgYXV0aC4gKi9cbiAgYXN5bmMgZmV0Y2gocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5jb25maWcuaHViVXJsfSR7cGF0aH1gO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAneC1hcGkta2V5JzogdGhpcy5jb25maWcuYXBpS2V5LFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICdVbmtub3duIGVycm9yJyB9KSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBgUmVxdWVzdCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQcml2YXRlQ29ubmVjdDtcblxuLyoqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBxdWljayBvbmUtb2ZmIGNvbm5lY3Rpb25zLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QoXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnICYgeyBncmFudFRva2VuPzogc3RyaW5nIH0sXG4pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcbiAgY29uc3QgYXBpS2V5ID0gY29uZmlnPy5hcGlLZXkgfHwgcHJvY2Vzcy5lbnYuUFJJVkFURUNPTk5FQ1RfQVBJX0tFWTtcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FQSSBrZXkgcmVxdWlyZWQuIFNldCBQUklWQVRFQ09OTkVDVF9BUElfS0VZIG9yIHBhc3MgY29uZmlnLmFwaUtleScpO1xuICB9XG5cbiAgY29uc3QgY2xpZW50ID0gbmV3IFByaXZhdGVDb25uZWN0KHsgLi4uY29uZmlnLCBhcGlLZXkgfSk7XG4gIHJldHVybiBjbGllbnQuY29ubmVjdChzZXJ2aWNlTmFtZSwgeyBncmFudFRva2VuOiBjb25maWc/LmdyYW50VG9rZW4gfSk7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@privateconnect/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.3",
|
|
4
4
|
"description": "TypeScript SDK for Private Connect - programmatic access to services and agent orchestration",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"files": [
|
|
8
8
|
"dist"
|
|
9
9
|
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc -w",
|
|
13
|
+
"clean": "rm -rf dist"
|
|
14
|
+
},
|
|
10
15
|
"keywords": [
|
|
11
16
|
"private-connect",
|
|
12
17
|
"tunnel",
|
|
@@ -23,10 +28,6 @@
|
|
|
23
28
|
"devDependencies": {
|
|
24
29
|
"@types/node": "^20.0.0",
|
|
25
30
|
"typescript": "^5.0.0"
|
|
26
|
-
},
|
|
27
|
-
"scripts": {
|
|
28
|
-
"build": "tsc",
|
|
29
|
-
"dev": "tsc -w",
|
|
30
|
-
"clean": "rm -rf dist"
|
|
31
31
|
}
|
|
32
|
-
}
|
|
32
|
+
}
|
|
33
|
+
|
package/LICENSE
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
# Functional Source License, Version 1.1
|
|
2
|
-
|
|
3
|
-
## Abbreviation
|
|
4
|
-
|
|
5
|
-
FSL-1.1-MIT
|
|
6
|
-
|
|
7
|
-
## Notice
|
|
8
|
-
|
|
9
|
-
Copyright (c) 2026 Treadie, Inc
|
|
10
|
-
|
|
11
|
-
## Terms and Conditions
|
|
12
|
-
|
|
13
|
-
### Licensor ("We")
|
|
14
|
-
|
|
15
|
-
The party offering the Software under these Terms and Conditions.
|
|
16
|
-
|
|
17
|
-
### The Software
|
|
18
|
-
|
|
19
|
-
The "Software" is each version of the software that we make available under
|
|
20
|
-
these Terms and Conditions, as indicated by our inclusion of these Terms and
|
|
21
|
-
Conditions with the Software.
|
|
22
|
-
|
|
23
|
-
### License Grant
|
|
24
|
-
|
|
25
|
-
Subject to your compliance with this License Grant and the Patents,
|
|
26
|
-
Redistribution and Trademark clauses below, we hereby grant you the right to
|
|
27
|
-
use, copy, modify, create derivative works, publicly perform, publicly display
|
|
28
|
-
and redistribute the Software for any Permitted Purpose identified below.
|
|
29
|
-
|
|
30
|
-
### Permitted Purpose
|
|
31
|
-
|
|
32
|
-
A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
|
|
33
|
-
means making the Software available to others in a commercial product or
|
|
34
|
-
service that:
|
|
35
|
-
|
|
36
|
-
1. substitutes for the Software;
|
|
37
|
-
|
|
38
|
-
2. substitutes for any other product or service we offer using the Software
|
|
39
|
-
that exists as of the date we make the Software available; or
|
|
40
|
-
|
|
41
|
-
3. offers the same or substantially similar functionality as the Software.
|
|
42
|
-
|
|
43
|
-
Permitted Purposes specifically include using the Software:
|
|
44
|
-
|
|
45
|
-
1. for your internal use and access;
|
|
46
|
-
|
|
47
|
-
2. for non-commercial education;
|
|
48
|
-
|
|
49
|
-
3. for non-commercial research; and
|
|
50
|
-
|
|
51
|
-
4. in connection with professional services that you provide to a licensee
|
|
52
|
-
using the Software in accordance with these Terms and Conditions.
|
|
53
|
-
|
|
54
|
-
### Patents
|
|
55
|
-
|
|
56
|
-
To the extent your use for a Permitted Purpose would necessarily infringe our
|
|
57
|
-
patents, the license grant above includes a license under our patents. If you
|
|
58
|
-
make a claim against any party that the Software infringes or contributes to
|
|
59
|
-
the infringement of any patent, then your patent license to the Software ends
|
|
60
|
-
immediately.
|
|
61
|
-
|
|
62
|
-
### Redistribution
|
|
63
|
-
|
|
64
|
-
The Terms and Conditions apply to all copies, modifications and derivatives of
|
|
65
|
-
the Software.
|
|
66
|
-
|
|
67
|
-
If you redistribute any copies, modifications or derivatives of the Software,
|
|
68
|
-
you must include a copy of or a link to these Terms and Conditions and not
|
|
69
|
-
remove any copyright notices provided in or with the Software.
|
|
70
|
-
|
|
71
|
-
### Disclaimer
|
|
72
|
-
|
|
73
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
|
|
74
|
-
IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
|
|
75
|
-
PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
|
|
76
|
-
|
|
77
|
-
IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
|
|
78
|
-
SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
|
|
79
|
-
EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
|
|
80
|
-
|
|
81
|
-
### Trademarks
|
|
82
|
-
|
|
83
|
-
Except for displaying the License Details and identifying us as the origin of
|
|
84
|
-
the Software, you have no right under these Terms and Conditions to use our
|
|
85
|
-
trademarks, trade names, service marks or product names.
|
|
86
|
-
|
|
87
|
-
## Grant of Future License
|
|
88
|
-
|
|
89
|
-
We hereby irrevocably grant you an additional license to use the Software under
|
|
90
|
-
the MIT license that is effective on the second anniversary of the date we make
|
|
91
|
-
the Software available. On or after that date, you may use the Software under
|
|
92
|
-
the MIT license, in which case the following will apply:
|
|
93
|
-
|
|
94
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
95
|
-
this software and associated documentation files (the "Software"), to deal in
|
|
96
|
-
the Software without restriction, including without limitation the rights to
|
|
97
|
-
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
98
|
-
of the Software, and to permit persons to whom the Software is furnished to do
|
|
99
|
-
so, subject to the following conditions:
|
|
100
|
-
|
|
101
|
-
The above copyright notice and this permission notice shall be included in all
|
|
102
|
-
copies or substantial portions of the Software.
|
|
103
|
-
|
|
104
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
105
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
106
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
107
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
108
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
109
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
110
|
-
SOFTWARE.
|