@nlabs/reaktor 1.12.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/GENERATION.md +75 -1
- package/lib/actions/contentGeneration.d.ts +7 -7
- package/lib/actions/contentGeneration.js +27 -8
- package/lib/actions/contentGenerationErrors.d.ts +6 -0
- package/lib/actions/contentGenerationErrors.js +6 -0
- package/lib/actions/ollamaGeneration.d.ts +3 -0
- package/lib/actions/ollamaGeneration.js +122 -0
- package/package.json +1 -1
package/docs/GENERATION.md
CHANGED
|
@@ -6,7 +6,7 @@ Reaktor provides reusable server actions and authenticated GraphQL mutations. Ap
|
|
|
6
6
|
|
|
7
7
|
| Operation | Explicit providers | GraphQL mutation |
|
|
8
8
|
| --- | --- | --- |
|
|
9
|
-
| Text | `claude`, `gemini`, `openai` | `contents.generateContent` |
|
|
9
|
+
| Text | `claude`, `gemini`, `openai`; `ollama` through the server action only | `contents.generateContent` (excludes Ollama) |
|
|
10
10
|
| Images | `gemini`, `higgsfield`, `openai` | `images.generateImage` |
|
|
11
11
|
| Video | `gemini`, `higgsfield` | `videos.generateVideo` |
|
|
12
12
|
|
|
@@ -196,3 +196,77 @@ input remains supported by the TypeScript action.
|
|
|
196
196
|
|
|
197
197
|
Protocol references: [WebSocket mode](https://developers.openai.com/api/docs/guides/websocket-mode)
|
|
198
198
|
and [mid-turn steering](https://developers.openai.com/api/docs/guides/steering).
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
### Gemini text output controls (1.13.0)
|
|
202
|
+
|
|
203
|
+
The TypeScript action accepts `responseFormat: {type: 'json_object'}` for Gemini
|
|
204
|
+
JSON output and `{type: 'text'}` for explicit plain text. These map to
|
|
205
|
+
`generationConfig.responseMimeType`. Optional `temperature` is accepted for Gemini
|
|
206
|
+
text generation in the range 0–2, including zero. Unspecified options are omitted;
|
|
207
|
+
callers own model-specific defaults. Existing prompt/system handling, token budgets,
|
|
208
|
+
timeouts, and completion validation are unchanged. Requests still use one submission.
|
|
209
|
+
|
|
210
|
+
Gemini JSON schemas, image-generation output controls, and temperature on other
|
|
211
|
+
providers are rejected before submission, rather than silently discarded. Messages
|
|
212
|
+
and reasoning effort remain OpenAI-only. This addition is generic provider transport;
|
|
213
|
+
it contains no application prompts, reviewer choices, or writing policies.
|
|
214
|
+
|
|
215
|
+
Reference: [Gemini generation configuration](https://ai.google.dev/api/generate-content#v1beta.GenerationConfig).
|
|
216
|
+
|
|
217
|
+
### Ollama text transport (next release)
|
|
218
|
+
|
|
219
|
+
The TypeScript action accepts `provider: 'ollama'` with an explicit model and a
|
|
220
|
+
server-owned `config.ollama` destination:
|
|
221
|
+
|
|
222
|
+
```ts
|
|
223
|
+
const result = await generateContent({
|
|
224
|
+
model: selectedModel,
|
|
225
|
+
prompt: userText,
|
|
226
|
+
provider: 'ollama',
|
|
227
|
+
system: systemText,
|
|
228
|
+
temperature: 0,
|
|
229
|
+
timeoutMs: 600000
|
|
230
|
+
}, {
|
|
231
|
+
ollama: {
|
|
232
|
+
endpoint: 'http://localhost:11434/api/generate',
|
|
233
|
+
protocol: 'generate'
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Protocols are `generate` (native `/api/generate` envelope), `chat` (native
|
|
239
|
+
`/api/chat` envelope), and `openai-chat` (OpenAI-compatible chat completions).
|
|
240
|
+
Supply the full endpoint URL, including any proxy prefix. Reaktor uses that URL
|
|
241
|
+
without appending or discovering paths. This supports `/v1/chat/completions`,
|
|
242
|
+
`/api/v1/chat/completions`, `/chat/completions`, and prefixed deployments without
|
|
243
|
+
rewriting them. URLs must use HTTP(S), without embedded credentials, query, or
|
|
244
|
+
fragment. No host/model defaults, model discovery, endpoint fallback, or model
|
|
245
|
+
switching are performed. Do not pass untrusted client input as server configuration.
|
|
246
|
+
|
|
247
|
+
Input is `prompt` plus optional `system`; message arrays, images, tools, search,
|
|
248
|
+
reasoning effort, and JSON schemas are outside this text-only operation. Optional
|
|
249
|
+
`maxTokens` maps to native `options.num_predict` or compatible `max_tokens`.
|
|
250
|
+
Nonnegative finite `temperature` preserves zero. Omitted token/temperature controls
|
|
251
|
+
remain omitted. Explicit `json_object` output maps to native `format: 'json'` or
|
|
252
|
+
compatible `response_format`; `text` uses the normal text output. Returned text is
|
|
253
|
+
not trimmed or reformatted.
|
|
254
|
+
|
|
255
|
+
The action submits once through Rip-Hunter. Native output requires `done: true`,
|
|
256
|
+
`done_reason: 'stop'`, and nonempty text; native chat also requires an assistant
|
|
257
|
+
message. Compatible output requires one completed assistant choice with
|
|
258
|
+
`finish_reason: 'stop'`. Refusal and tool/function-call output are rejected.
|
|
259
|
+
Older servers without a completion reason must use a compatible adapter that can
|
|
260
|
+
confirm completion; the action does not guess that incomplete envelopes succeeded.
|
|
261
|
+
|
|
262
|
+
Invalid destination/input fails before submission with
|
|
263
|
+
`ContentGenerationRejectedError`. Network/timeout failures and unusable responses
|
|
264
|
+
raise `ContentGenerationResponseError`. Rip-Hunter's JSON convenience API does not
|
|
265
|
+
expose HTTP status metadata, so provider error bodies (including model-not-found)
|
|
266
|
+
are conservatively unconfirmed, not proof that generation never began. The timeout
|
|
267
|
+
bounds the caller's wait; it does not confirm cancellation on the server. Callers
|
|
268
|
+
must not automatically resubmit, try another endpoint/model, or infer a safe retry
|
|
269
|
+
from an error string. Durable plans, discovery policy, request identities, and
|
|
270
|
+
saved-result reuse belong to the application.
|
|
271
|
+
|
|
272
|
+
Reference: [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md).
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
export { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
1
2
|
export interface ContentGenerationConfig {
|
|
2
3
|
claudeKey?: string;
|
|
3
4
|
claudeModel?: string;
|
|
4
5
|
geminiImageModel?: string;
|
|
5
6
|
geminiKey?: string;
|
|
6
7
|
geminiModel?: string;
|
|
8
|
+
ollama?: {
|
|
9
|
+
endpoint: string;
|
|
10
|
+
protocol: 'generate' | 'chat' | 'openai-chat';
|
|
11
|
+
};
|
|
7
12
|
openaiKey?: string;
|
|
8
13
|
openaiModel?: string;
|
|
9
14
|
}
|
|
@@ -40,11 +45,12 @@ export interface ContentGenerationInput {
|
|
|
40
45
|
modality?: 'image' | 'text';
|
|
41
46
|
model?: string;
|
|
42
47
|
prompt?: string;
|
|
43
|
-
provider: 'claude' | 'gemini' | 'openai';
|
|
48
|
+
provider: 'claude' | 'gemini' | 'ollama' | 'openai';
|
|
44
49
|
reasoningEffort?: ContentGenerationReasoningEffort;
|
|
45
50
|
responseFormat?: ContentGenerationResponseFormat;
|
|
46
51
|
search?: boolean;
|
|
47
52
|
system?: string;
|
|
53
|
+
temperature?: number;
|
|
48
54
|
timeoutMs?: number;
|
|
49
55
|
}
|
|
50
56
|
export interface GeneratedContent {
|
|
@@ -59,11 +65,5 @@ export interface GeneratedContent {
|
|
|
59
65
|
}[];
|
|
60
66
|
text: string;
|
|
61
67
|
}
|
|
62
|
-
/** A confirmed rejection is distinct from an unknown paid submission outcome. */
|
|
63
|
-
export declare class ContentGenerationRejectedError extends Error {
|
|
64
|
-
}
|
|
65
|
-
/** An accepted generation did not produce usable output; do not automatically resubmit it. */
|
|
66
|
-
export declare class ContentGenerationResponseError extends Error {
|
|
67
|
-
}
|
|
68
68
|
/** Single submission through Rip-Hunter; callers own durable jobs and reconciliation. */
|
|
69
69
|
export declare const generateContent: (input: ContentGenerationInput, config?: ContentGenerationConfig) => Promise<GeneratedContent>;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
+
import { generateOllamaContent } from './ollamaGeneration.js';
|
|
2
|
+
import { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
3
|
+
export { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
1
4
|
import { post } from '@nlabs/rip-hunter';
|
|
2
5
|
import { Config } from '../config.js';
|
|
3
|
-
/** A confirmed rejection is distinct from an unknown paid submission outcome. */ export class ContentGenerationRejectedError extends Error {
|
|
4
|
-
}
|
|
5
|
-
/** An accepted generation did not produce usable output; do not automatically resubmit it. */ export class ContentGenerationResponseError extends Error {
|
|
6
|
-
}
|
|
7
6
|
const validMessageContent = (message)=>{
|
|
8
7
|
if (typeof message.content === 'string') return !!message.content.trim();
|
|
9
8
|
return Array.isArray(message.content) && message.content.length > 0 && message.content.every((part)=>{
|
|
@@ -20,6 +19,7 @@ const validMessageContent = (message)=>{
|
|
|
20
19
|
if (![
|
|
21
20
|
'claude',
|
|
22
21
|
'gemini',
|
|
22
|
+
'ollama',
|
|
23
23
|
'openai'
|
|
24
24
|
].includes(input.provider)) {
|
|
25
25
|
throw new ContentGenerationRejectedError('A supported provider is required.');
|
|
@@ -36,8 +36,8 @@ const validMessageContent = (message)=>{
|
|
|
36
36
|
} else if (typeof input.prompt !== 'string' || !input.prompt.trim()) {
|
|
37
37
|
throw new ContentGenerationRejectedError('A non-empty prompt is required.');
|
|
38
38
|
}
|
|
39
|
-
if (input.provider !== 'openai' && (input.messages !== undefined || input.reasoningEffort !== undefined || input.responseFormat !== undefined)) {
|
|
40
|
-
throw new ContentGenerationRejectedError('Messages
|
|
39
|
+
if (input.provider !== 'openai' && (input.messages !== undefined || input.reasoningEffort !== undefined || input.provider === 'claude' && input.responseFormat !== undefined)) {
|
|
40
|
+
throw new ContentGenerationRejectedError('Messages and reasoning effort require OpenAI; Claude does not support response format options.');
|
|
41
41
|
}
|
|
42
42
|
if (input.timeoutMs !== undefined && (!Number.isInteger(input.timeoutMs) || input.timeoutMs < 1 || input.timeoutMs > 2_147_483_647)) {
|
|
43
43
|
throw new ContentGenerationRejectedError('timeoutMs must be a positive 32-bit integer.');
|
|
@@ -61,12 +61,25 @@ const validMessageContent = (message)=>{
|
|
|
61
61
|
].includes(format.type) || format.type === 'json_schema' && (typeof format.name !== 'string' || !/^[a-zA-Z0-9_-]{1,64}$/.test(format.name) || !format.schema || typeof format.schema !== 'object' || Array.isArray(format.schema) || format.strict !== undefined && typeof format.strict !== 'boolean'))) {
|
|
62
62
|
throw new ContentGenerationRejectedError('Invalid response format. JSON schemas require a name and schema object.');
|
|
63
63
|
}
|
|
64
|
+
if ([
|
|
65
|
+
'gemini',
|
|
66
|
+
'ollama'
|
|
67
|
+
].includes(input.provider) && format !== undefined && (format.type === 'json_schema' || input.modality === 'image')) {
|
|
68
|
+
throw new ContentGenerationRejectedError('This provider supports text or json_object for text generation only.');
|
|
69
|
+
}
|
|
70
|
+
if (input.temperature !== undefined && (![
|
|
71
|
+
'gemini',
|
|
72
|
+
'ollama'
|
|
73
|
+
].includes(input.provider) || input.modality === 'image' || !Number.isFinite(input.temperature) || input.temperature < 0 || input.provider === 'gemini' && input.temperature > 2)) {
|
|
74
|
+
throw new ContentGenerationRejectedError('temperature requires a nonnegative finite value for Ollama text or a value between 0 and 2 for Gemini text.');
|
|
75
|
+
}
|
|
64
76
|
if (input.maxTokens !== undefined && (!Number.isInteger(input.maxTokens) || input.maxTokens < 1)) {
|
|
65
77
|
throw new ContentGenerationRejectedError('maxTokens must be a positive integer.');
|
|
66
78
|
}
|
|
67
79
|
if (input.provider !== 'gemini' && (input.images?.length || input.modality === 'image' || input.search)) {
|
|
68
80
|
throw new ContentGenerationRejectedError('This provider operation supports text input and output only.');
|
|
69
81
|
}
|
|
82
|
+
if (input.provider === 'ollama') return generateOllamaContent(input, config);
|
|
70
83
|
const { prompt, images = [] } = input;
|
|
71
84
|
if (input.provider === 'claude') {
|
|
72
85
|
if (!config.claudeKey) {
|
|
@@ -218,7 +231,13 @@ const validMessageContent = (message)=>{
|
|
|
218
231
|
'IMAGE'
|
|
219
232
|
]
|
|
220
233
|
} : {
|
|
221
|
-
maxOutputTokens: input.maxTokens ?? 4096
|
|
234
|
+
maxOutputTokens: input.maxTokens ?? 4096,
|
|
235
|
+
...format ? {
|
|
236
|
+
responseMimeType: format.type === 'json_object' ? 'application/json' : 'text/plain'
|
|
237
|
+
} : {},
|
|
238
|
+
...input.temperature !== undefined ? {
|
|
239
|
+
temperature: input.temperature
|
|
240
|
+
} : {}
|
|
222
241
|
},
|
|
223
242
|
...input.search ? {
|
|
224
243
|
tools: [
|
|
@@ -290,4 +309,4 @@ const validMessageContent = (message)=>{
|
|
|
290
309
|
};
|
|
291
310
|
};
|
|
292
311
|
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Bvc3R9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBvcGVuYWlLZXk/OiBzdHJpbmc7XG4gIG9wZW5haU1vZGVsPzogc3RyaW5nO1xufVxuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25QYXJ0ID0ge3RleHQ6IHN0cmluZzsgdHlwZTogJ3RleHQnfSB8IHtcbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2hpZ2gnIHwgJ2xvdyc7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIHVybDogc3RyaW5nO1xufTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25NZXNzYWdlIHtcbiAgY29udGVudDogc3RyaW5nIHwgQ29udGVudEdlbmVyYXRpb25QYXJ0W107XG4gIHJvbGU6ICdhc3Npc3RhbnQnIHwgJ2RldmVsb3BlcicgfCAnc3lzdGVtJyB8ICd1c2VyJztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQgPSB7dHlwZTogJ2pzb25fb2JqZWN0JyB8ICd0ZXh0J30gfCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmljdD86IGJvb2xlYW47XG4gIHR5cGU6ICdqc29uX3NjaGVtYSc7XG59O1xuZXhwb3J0IHR5cGUgQ29udGVudEdlbmVyYXRpb25SZWFzb25pbmdFZmZvcnQgPSAnbm9uZScgfCAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3hoaWdoJyB8ICdtYXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQge1xuICBhc3BlY3RSYXRpbz86IHN0cmluZztcbiAgaW1hZ2VzPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6IHN0cmluZ31bXTtcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICBtZXNzYWdlcz86IENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZVtdO1xuICBtb2RhbGl0eT86ICdpbWFnZScgfCAndGV4dCc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBwcm9tcHQ/OiBzdHJpbmc7XG4gIHByb3ZpZGVyOiAnY2xhdWRlJyB8ICdnZW1pbmknIHwgJ29wZW5haSc7XG4gIHJlYXNvbmluZ0VmZm9ydD86IENvbnRlbnRHZW5lcmF0aW9uUmVhc29uaW5nRWZmb3J0O1xuICByZXNwb25zZUZvcm1hdD86IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQ7XG4gIHNlYXJjaD86IGJvb2xlYW47XG4gIHN5c3RlbT86IHN0cmluZztcbiAgdGltZW91dE1zPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWRDb250ZW50IHtcbiAgaW1hZ2U/OiB7Ynl0ZXM6IEJ1ZmZlcjsgbWltZTogJ2ltYWdlL2pwZWcnIHwgJ2ltYWdlL3BuZyd9O1xuICBzZWFyY2hTdWdnZXN0aW9uc0h0bWw/OiBzdHJpbmc7XG4gIHNvdXJjZXM6IHt0aXRsZTogc3RyaW5nOyB1cmw6IHN0cmluZ31bXTtcbiAgdGV4dDogc3RyaW5nO1xufVxuLyoqIEEgY29uZmlybWVkIHJlamVjdGlvbiBpcyBkaXN0aW5jdCBmcm9tIGFuIHVua25vd24gcGFpZCBzdWJtaXNzaW9uIG91dGNvbWUuICovXG5leHBvcnQgY2xhc3MgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige31cbi8qKiBBbiBhY2NlcHRlZCBnZW5lcmF0aW9uIGRpZCBub3QgcHJvZHVjZSB1c2FibGUgb3V0cHV0OyBkbyBub3QgYXV0b21hdGljYWxseSByZXN1Ym1pdCBpdC4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5pbnRlcmZhY2UgR2VtaW5pUGFydCB7aW5saW5lRGF0YT86IHtkYXRhOiBzdHJpbmc7IG1pbWVUeXBlOiBzdHJpbmd9OyB0ZXh0Pzogc3RyaW5nOyB0aG91Z2h0PzogYm9vbGVhbn1cbmludGVyZmFjZSBHZW1pbmlSZXNwb25zZSB7XG4gIGNhbmRpZGF0ZXM/OiB7XG4gICAgY29udGVudD86IHtwYXJ0cz86IEdlbWluaVBhcnRbXX07XG4gICAgZmluaXNoUmVhc29uPzogc3RyaW5nO1xuICAgIGdyb3VuZGluZ01ldGFkYXRhPzoge1xuICAgICAgZ3JvdW5kaW5nQ2h1bmtzPzoge3dlYj86IHt0aXRsZT86IHN0cmluZzsgdXJpPzogc3RyaW5nfX1bXTtcbiAgICAgIHNlYXJjaEVudHJ5UG9pbnQ/OiB7cmVuZGVyZWRDb250ZW50Pzogc3RyaW5nfTtcbiAgICB9O1xuICB9W107XG4gIGVycm9yPzoge2NvZGU/OiBudW1iZXJ9O1xuICBwcm9tcHRGZWVkYmFjaz86IHtibG9ja1JlYXNvbj86IHN0cmluZ307XG59XG5cbmNvbnN0IHZhbGlkTWVzc2FnZUNvbnRlbnQgPSAobWVzc2FnZTogQ29udGVudEdlbmVyYXRpb25NZXNzYWdlKTogYm9vbGVhbiA9PiB7XG4gIGlmKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09ICdzdHJpbmcnKSByZXR1cm4gISFtZXNzYWdlLmNvbnRlbnQudHJpbSgpO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpICYmIG1lc3NhZ2UuY29udGVudC5sZW5ndGggPiAwICYmIG1lc3NhZ2UuY29udGVudC5ldmVyeSgocGFydCkgPT4ge1xuICAgIGlmKCFwYXJ0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYocGFydC50eXBlID09PSAndGV4dCcpIHJldHVybiB0eXBlb2YgcGFydC50ZXh0ID09PSAnc3RyaW5nJyAmJiAhIXBhcnQudGV4dC50cmltKCk7XG4gICAgcmV0dXJuIHBhcnQudHlwZSA9PT0gJ2ltYWdlJyAmJiBtZXNzYWdlLnJvbGUgPT09ICd1c2VyJyAmJiB0eXBlb2YgcGFydC51cmwgPT09ICdzdHJpbmcnXG4gICAgICAmJiAvXihodHRwcz86XFwvXFwvW15cXHNdK3xkYXRhOmltYWdlXFwvKHBuZ3xqcGVnfHdlYnB8Z2lmKTtiYXNlNjQsW0EtWmEtejAtOSsvXSs9ezAsMn0pJC8udGVzdChwYXJ0LnVybClcbiAgICAgICYmIChwYXJ0LmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IFsnYXV0bycsICdoaWdoJywgJ2xvdyddLmluY2x1ZGVzKHBhcnQuZGV0YWlsKSk7XG4gIH0pO1xufTtcblxuLyoqIFNpbmdsZSBzdWJtaXNzaW9uIHRocm91Z2ggUmlwLUh1bnRlcjsgY2FsbGVycyBvd24gZHVyYWJsZSBqb2JzIGFuZCByZWNvbmNpbGlhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUNvbnRlbnQgPSBhc3luYyAoXG4gIGlucHV0OiBDb250ZW50R2VuZXJhdGlvbklucHV0LFxuICBjb25maWc6IENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnID0gQ29uZmlnLmdldDxDb250ZW50R2VuZXJhdGlvbkNvbmZpZz4oJ2NvbnRlbnRHZW5lcmF0aW9uJykgfHwge31cbik6IFByb21pc2U8R2VuZXJhdGVkQ29udGVudD4gPT4ge1xuICBpZighWydjbGF1ZGUnLCAnZ2VtaW5pJywgJ29wZW5haSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egc3VwcG9ydGVkIHByb3ZpZGVyIGlzIHJlcXVpcmVkLicpO1xuICB9XG4gIGlmKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZihpbnB1dC5wcm9tcHQgIT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXNzYWdlcykgfHwgIWlucHV0Lm1lc3NhZ2VzLmxlbmd0aCB8fCBpbnB1dC5tZXNzYWdlcy5zb21lKChtZXNzYWdlKSA9PlxuICAgICAgIW1lc3NhZ2UgfHwgIVsnYXNzaXN0YW50JywgJ2RldmVsb3BlcicsICdzeXN0ZW0nLCAndXNlciddLmluY2x1ZGVzKG1lc3NhZ2Uucm9sZSkgfHwgIXZhbGlkTWVzc2FnZUNvbnRlbnQobWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdTdXBwbHkgZWl0aGVyIGEgbm9uLWVtcHR5IHByb21wdCBvciBub24tZW1wdHkgdGV4dCBtZXNzYWdlcyB3aXRoIHN1cHBvcnRlZCByb2xlcy4nKTtcbiAgICB9XG4gIH0gZWxzZSBpZih0eXBlb2YgaW5wdXQucHJvbXB0ICE9PSAnc3RyaW5nJyB8fCAhaW5wdXQucHJvbXB0LnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egbm9uLWVtcHR5IHByb21wdCBpcyByZXF1aXJlZC4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ29wZW5haScgJiYgKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQgfHwgaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgfHwgaW5wdXQucmVzcG9uc2VGb3JtYXQgIT09IHVuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdNZXNzYWdlcywgcmVhc29uaW5nIGVmZm9ydCwgYW5kIHJlc3BvbnNlIGZvcm1hdCBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGJ5IE9wZW5BSS4nKTtcbiAgfVxuICBpZihpbnB1dC50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIoaW5wdXQudGltZW91dE1zKSB8fCBpbnB1dC50aW1lb3V0TXMgPCAxIHx8IGlucHV0LnRpbWVvdXRNcyA+IDJfMTQ3XzQ4M182NDcpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcigndGltZW91dE1zIG11c3QgYmUgYSBwb3NpdGl2ZSAzMi1iaXQgaW50ZWdlci4nKTtcbiAgfVxuICBpZihpbnB1dC5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZCAmJiAhWydub25lJywgJ21pbmltYWwnLCAnbG93JywgJ21lZGl1bScsICdoaWdoJywgJ3hoaWdoJywgJ21heCddLmluY2x1ZGVzKGlucHV0LnJlYXNvbmluZ0VmZm9ydCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdVbnN1cHBvcnRlZCByZWFzb25pbmcgZWZmb3J0LicpO1xuICB9XG4gIGNvbnN0IGZvcm1hdCA9IGlucHV0LnJlc3BvbnNlRm9ybWF0O1xuICBpZihmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiAoIWZvcm1hdCB8fCAhWyd0ZXh0JywgJ2pzb25fb2JqZWN0JywgJ2pzb25fc2NoZW1hJ10uaW5jbHVkZXMoZm9ybWF0LnR5cGUpIHx8IChmb3JtYXQudHlwZSA9PT0gJ2pzb25fc2NoZW1hJyAmJiAoXG4gICAgdHlwZW9mIGZvcm1hdC5uYW1lICE9PSAnc3RyaW5nJyB8fCAhL15bYS16QS1aMC05Xy1dezEsNjR9JC8udGVzdChmb3JtYXQubmFtZSkgfHwgIWZvcm1hdC5zY2hlbWEgfHwgdHlwZW9mIGZvcm1hdC5zY2hlbWEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZm9ybWF0LnNjaGVtYSlcbiAgICB8fCAoZm9ybWF0LnN0cmljdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBmb3JtYXQuc3RyaWN0ICE9PSAnYm9vbGVhbicpXG4gICkpKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0ludmFsaWQgcmVzcG9uc2UgZm9ybWF0LiBKU09OIHNjaGVtYXMgcmVxdWlyZSBhIG5hbWUgYW5kIHNjaGVtYSBvYmplY3QuJyk7XG4gIH1cbiAgaWYoaW5wdXQubWF4VG9rZW5zICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0Lm1heFRva2VucykgfHwgaW5wdXQubWF4VG9rZW5zIDwgMSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdtYXhUb2tlbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucHJvdmlkZXIgIT09ICdnZW1pbmknICYmIChpbnB1dC5pbWFnZXM/Lmxlbmd0aCB8fCBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyB8fCBpbnB1dC5zZWFyY2gpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBvcGVyYXRpb24gc3VwcG9ydHMgdGV4dCBpbnB1dCBhbmQgb3V0cHV0IG9ubHkuJyk7XG4gIH1cbiAgY29uc3Qge3Byb21wdCwgaW1hZ2VzID0gW119ID0gaW5wdXQ7XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnY2xhdWRlJykge1xuICAgIGlmKCFjb25maWcuY2xhdWRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdDbGF1ZGUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdCgnaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS92MS9tZXNzYWdlcycsIHtcbiAgICAgIG1heF90b2tlbnM6IGlucHV0Lm1heFRva2VucyA/PyA0MDk2LFxuICAgICAgbWVzc2FnZXM6IFt7Y29udGVudDogcHJvbXB0LCByb2xlOiAndXNlcid9XSxcbiAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCB8fCBjb25maWcuY2xhdWRlTW9kZWwgfHwgJ2NsYXVkZS1zb25uZXQtNScsXG4gICAgICBzeXN0ZW06IGlucHV0LnN5c3RlbVxuICAgIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsnYW50aHJvcGljLXZlcnNpb24nOiAnMjAyMy0wNi0wMScsICd4LWFwaS1rZXknOiBjb25maWcuY2xhdWRlS2V5fSksIHRpbWVvdXQ6IGlucHV0LnRpbWVvdXRNcyA/PyAxMjBfMDAwfSkgYXMge1xuICAgICAgY29udGVudD86IHt0ZXh0Pzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgZXJyb3I/OiB7dHlwZT86IHN0cmluZ307XG4gICAgICBzdG9wX3JlYXNvbj86IHN0cmluZztcbiAgICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBpZihyZXNwb25zZS5lcnJvciAmJiBbJ2F1dGhlbnRpY2F0aW9uX2Vycm9yJywgJ2ludmFsaWRfcmVxdWVzdF9lcnJvcicsICdub3RfZm91bmRfZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdDbGF1ZGUgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuJyk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSByZXNwb25zZS5jb250ZW50Py5maWx0ZXIoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3RleHQnKS5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignXFxuJykudHJpbSgpO1xuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnR5cGUgIT09ICdtZXNzYWdlJyB8fCByZXNwb25zZS5zdG9wX3JlYXNvbiAhPT0gJ2VuZF90dXJuJyB8fCAhdGV4dCkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignQ2xhdWRlIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKGlucHV0LnByb3ZpZGVyID09PSAnb3BlbmFpJykge1xuICAgIGlmKCFjb25maWcub3BlbmFpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPcGVuQUkgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdCgnaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MS9yZXNwb25zZXMnLCB7XG4gICAgICBpbnB1dDogaW5wdXQubWVzc2FnZXM/Lm1hcCgobWVzc2FnZSkgPT4gKHtjb250ZW50OiB0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSAnc3RyaW5nJyA/IG1lc3NhZ2UuY29udGVudCA6IG1lc3NhZ2UuY29udGVudC5tYXAoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3RleHQnXG4gICAgICAgID8ge3RleHQ6IHBhcnQudGV4dCwgdHlwZTogJ2lucHV0X3RleHQnfSA6IHtkZXRhaWw6IHBhcnQuZGV0YWlsID8/ICdhdXRvJywgaW1hZ2VfdXJsOiBwYXJ0LnVybCwgdHlwZTogJ2lucHV0X2ltYWdlJ30pLCByb2xlOiBtZXNzYWdlLnJvbGUgPT09ICdzeXN0ZW0nID8gJ2RldmVsb3BlcicgOiBtZXNzYWdlLnJvbGV9KSkgPz8gcHJvbXB0LFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnB1dC5zeXN0ZW0sXG4gICAgICBtYXhfb3V0cHV0X3Rva2VuczogaW5wdXQubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwgfHwgY29uZmlnLm9wZW5haU1vZGVsIHx8ICdncHQtNi1hc3RyYScsXG4gICAgICAuLi4oaW5wdXQucmVhc29uaW5nRWZmb3J0ID8ge3JlYXNvbmluZzoge2VmZm9ydDogaW5wdXQucmVhc29uaW5nRWZmb3J0fX0gOiB7fSksXG4gICAgICBzdG9yZTogZmFsc2UsXG4gICAgICAuLi4oZm9ybWF0ID8ge3RleHQ6IHtmb3JtYXR9fSA6IHt9KSxcbiAgICAgIHRydW5jYXRpb246ICdkaXNhYmxlZCdcbiAgICB9LCB7Y2FjaGU6IGZhbHNlLCBoZWFkZXJzOiBuZXcgSGVhZGVycyh7QXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NvbmZpZy5vcGVuYWlLZXl9YH0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIHtcbiAgICAgIGVycm9yPzoge2NvZGU/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9O1xuICAgICAgb3V0cHV0Pzoge2NvbnRlbnQ/OiB7dGV4dD86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTsgc3RhdHVzPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfVtdO1xuICAgICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIH07XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWydpbnZhbGlkX3JlcXVlc3RfZXJyb3InLCAnYXV0aGVudGljYXRpb25fZXJyb3InLCAncGVybWlzc2lvbl9lcnJvciddLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLnR5cGUgfHwgJycpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPcGVuQUkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSBtb2RlbCBhbmQgYWNjb3VudCBhY2Nlc3MuJyk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLmVycm9yIHx8IHJlc3BvbnNlLnN0YXR1cyAhPT0gJ2NvbXBsZXRlZCcgfHwgcmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2luY29tcGxldGUnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQ/LnNvbWUoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3JlZnVzYWwnKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSBkZWNsaW5lZCB0aGUgcmVxdWVzdC4nKTtcbiAgICB9XG4gICAgaWYocmVzcG9uc2Uub3V0cHV0Py5zb21lKChpdGVtKSA9PiBpdGVtLnR5cGUgJiYgIVsnbWVzc2FnZScsICdyZWFzb25pbmcnXS5pbmNsdWRlcyhpdGVtLnR5cGUpKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignT3BlbkFJIHJldHVybmVkIGFuIHVuc3VwcG9ydGVkIG91dHB1dCBpdGVtLicpO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2Uub3V0cHV0Py5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ21lc3NhZ2UnKS5mbGF0TWFwKChpdGVtKSA9PiBpdGVtLmNvbnRlbnQgfHwgW10pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdvdXRwdXRfdGV4dCcpLm1hcCgocGFydCkgPT4gcGFydC50ZXh0IHx8ICcnKS5qb2luKCcnKS50cmltKCk7XG4gICAgaWYoIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSByZXR1cm5lZCBlbXB0eSBvdXRwdXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c291cmNlczogW10sIHRleHR9O1xuICB9XG4gIGlmKCFjb25maWcuZ2VtaW5pS2V5KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignR2VtaW5pIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICB9XG4gIGNvbnN0IHBhcnRzOiB1bmtub3duW10gPSBbe3RleHQ6IHByb21wdH0sIC4uLmltYWdlcy5tYXAoKGltYWdlKSA9PiAoe2lubGluZURhdGE6IHtkYXRhOiBpbWFnZS5ieXRlcy50b1N0cmluZygnYmFzZTY0JyksIG1pbWVUeXBlOiBpbWFnZS5taW1lfX0pKV07XG4gIGNvbnN0IG1vZGVsID0gaW5wdXQubW9kZWwgfHwgKGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnID8gY29uZmlnLmdlbWluaUltYWdlTW9kZWwgfHwgJ2dlbWluaS0zLjEtZmxhc2gtaW1hZ2UnIDogY29uZmlnLmdlbWluaU1vZGVsIHx8ICdnZW1pbmktMy44LWZsYXNoJyk7XG4gIGlmKCEvXlthLXpBLVowLTkuXy1dKyQvLnRlc3QobW9kZWwpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignSW52YWxpZCBHZW1pbmkgbW9kZWwgY29uZmlndXJhdGlvbi4nKTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoYGh0dHBzOi8vZ2VuZXJhdGl2ZWxhbmd1YWdlLmdvb2dsZWFwaXMuY29tL3YxYmV0YS9tb2RlbHMvJHttb2RlbH06Z2VuZXJhdGVDb250ZW50YCwge1xuICAgIGNvbnRlbnRzOiBbe3BhcnRzLCByb2xlOiAndXNlcid9XSxcbiAgICAuLi4oaW5wdXQuc3lzdGVtID8ge3N5c3RlbUluc3RydWN0aW9uOiB7cGFydHM6IFt7dGV4dDogaW5wdXQuc3lzdGVtfV19fSA6IHt9KSxcbiAgICBnZW5lcmF0aW9uQ29uZmlnOiBpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/IHsuLi4oaW5wdXQuYXNwZWN0UmF0aW8gPyB7aW1hZ2VDb25maWc6IHthc3BlY3RSYXRpbzogaW5wdXQuYXNwZWN0UmF0aW99fSA6IHt9KSwgcmVzcG9uc2VNb2RhbGl0aWVzOiBbJ1RFWFQnLCAnSU1BR0UnXX0gOiB7bWF4T3V0cHV0VG9rZW5zOiBpbnB1dC5tYXhUb2tlbnMgPz8gNDA5Nn0sXG4gICAgLi4uKGlucHV0LnNlYXJjaCA/IHt0b29sczogW3tnb29nbGVTZWFyY2g6IHt9fV19IDoge30pXG4gIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsneC1nb29nLWFwaS1rZXknOiBjb25maWcuZ2VtaW5pS2V5fSksIHRpbWVvdXQ6IGlucHV0LnRpbWVvdXRNcyA/PyAxMjBfMDAwfSkgYXMgR2VtaW5pUmVzcG9uc2U7XG4gIGlmKHJlc3BvbnNlLmVycm9yICYmIFs0MDAsIDQwMSwgNDAzLCA0MDRdLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLmNvZGUgfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdHZW1pbmkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSByZWZlcmVuY2UgZm9ybWF0IGFuZCBtb2RlbCBhY2Nlc3MuJyk7XG4gIH1cbiAgaWYocmVzcG9uc2UucHJvbXB0RmVlZGJhY2s/LmJsb2NrUmVhc29uIHx8IHJlc3BvbnNlLmVycm9yIHx8ICFyZXNwb25zZS5jYW5kaWRhdGVzPy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdHZW1pbmkgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSByZXNwb25zZS5jYW5kaWRhdGVzWzBdITtcbiAgaWYoY2FuZGlkYXRlLmZpbmlzaFJlYXNvbiAhPT0gJ1NUT1AnKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignR2VtaW5pIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSAoY2FuZGlkYXRlLmNvbnRlbnQ/LnBhcnRzIHx8IFtdKS5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0LnRob3VnaHQpO1xuICBjb25zdCBpbmxpbmUgPSBvdXRwdXQuZmluZCgocGFydCkgPT4gcGFydC5pbmxpbmVEYXRhKT8uaW5saW5lRGF0YTtcbiAgbGV0IGltYWdlOiBHZW5lcmF0ZWRDb250ZW50WydpbWFnZSddO1xuICBpZihpbmxpbmUgJiYgWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddLmluY2x1ZGVzKGlubGluZS5taW1lVHlwZSkpIHtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGlubGluZS5kYXRhLCAnYmFzZTY0Jyk7XG4gICAgaWYoIWJ5dGVzLmxlbmd0aCB8fCBieXRlcy5sZW5ndGggPiAyMCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdJbnZhbGlkIGltYWdlIG91dHB1dC4nKTtcbiAgICB9XG4gICAgaW1hZ2UgPSB7Ynl0ZXMsIG1pbWU6IGlubGluZS5taW1lVHlwZSBhcyAnaW1hZ2UvcG5nJyB8ICdpbWFnZS9qcGVnJ307XG4gIH1cbiAgY29uc3QgdGV4dCA9IG91dHB1dC5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignXFxuJykudHJpbSgpO1xuICBpZihpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/ICFpbWFnZSA6ICF0ZXh0KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignVGhlIHJlcXVlc3RlZCBvdXRwdXQgd2FzIG5vdCByZXR1cm5lZC4nKTtcbiAgfVxuICBjb25zdCBzb3VyY2VzID0gKGNhbmRpZGF0ZS5ncm91bmRpbmdNZXRhZGF0YT8uZ3JvdW5kaW5nQ2h1bmtzIHx8IFtdKS5mbGF0TWFwKCh7d2VifSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdlYj8udXJpIHx8ICcnKTtcbiAgICAgIHJldHVybiB1cmwucHJvdG9jb2wgPT09ICdodHRwczonID8gW3t0aXRsZTogd2ViPy50aXRsZSB8fCB1cmwuaG9zdG5hbWUsIHVybDogdXJsLmhyZWZ9XSA6IFtdO1xuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpbWFnZSwgc2VhcmNoU3VnZ2VzdGlvbnNIdG1sOiBjYW5kaWRhdGUuZ3JvdW5kaW5nTWV0YWRhdGE/LnNlYXJjaEVudHJ5UG9pbnQ/LnJlbmRlcmVkQ29udGVudCwgc291cmNlcywgdGV4dFxuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJwb3N0IiwiQ29uZmlnIiwiQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yIiwiRXJyb3IiLCJDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IiLCJ2YWxpZE1lc3NhZ2VDb250ZW50IiwibWVzc2FnZSIsImNvbnRlbnQiLCJ0cmltIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiZXZlcnkiLCJwYXJ0IiwidHlwZSIsInRleHQiLCJyb2xlIiwidXJsIiwidGVzdCIsImRldGFpbCIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwiZ2VuZXJhdGVDb250ZW50IiwiaW5wdXQiLCJjb25maWciLCJnZXQiLCJwcm92aWRlciIsIm1lc3NhZ2VzIiwicHJvbXB0Iiwic29tZSIsInJlYXNvbmluZ0VmZm9ydCIsInJlc3BvbnNlRm9ybWF0IiwidGltZW91dE1zIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiZm9ybWF0IiwibmFtZSIsInNjaGVtYSIsInN0cmljdCIsIm1heFRva2VucyIsImltYWdlcyIsIm1vZGFsaXR5Iiwic2VhcmNoIiwiY2xhdWRlS2V5IiwicmVzcG9uc2UiLCJtYXhfdG9rZW5zIiwibW9kZWwiLCJjbGF1ZGVNb2RlbCIsInN5c3RlbSIsImNhY2hlIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJ0aW1lb3V0IiwiZXJyb3IiLCJmaWx0ZXIiLCJtYXAiLCJqb2luIiwic3RvcF9yZWFzb24iLCJzb3VyY2VzIiwib3BlbmFpS2V5IiwiaW1hZ2VfdXJsIiwiaW5zdHJ1Y3Rpb25zIiwibWF4X291dHB1dF90b2tlbnMiLCJvcGVuYWlNb2RlbCIsInJlYXNvbmluZyIsImVmZm9ydCIsInN0b3JlIiwidHJ1bmNhdGlvbiIsIkF1dGhvcml6YXRpb24iLCJzdGF0dXMiLCJvdXRwdXQiLCJpdGVtIiwiZmxhdE1hcCIsImdlbWluaUtleSIsInBhcnRzIiwiaW1hZ2UiLCJpbmxpbmVEYXRhIiwiZGF0YSIsImJ5dGVzIiwidG9TdHJpbmciLCJtaW1lVHlwZSIsIm1pbWUiLCJnZW1pbmlJbWFnZU1vZGVsIiwiZ2VtaW5pTW9kZWwiLCJjb250ZW50cyIsInN5c3RlbUluc3RydWN0aW9uIiwiZ2VuZXJhdGlvbkNvbmZpZyIsImFzcGVjdFJhdGlvIiwiaW1hZ2VDb25maWciLCJyZXNwb25zZU1vZGFsaXRpZXMiLCJtYXhPdXRwdXRUb2tlbnMiLCJ0b29scyIsImdvb2dsZVNlYXJjaCIsImNvZGUiLCJwcm9tcHRGZWVkYmFjayIsImJsb2NrUmVhc29uIiwiY2FuZGlkYXRlcyIsImNhbmRpZGF0ZSIsImZpbmlzaFJlYXNvbiIsInRob3VnaHQiLCJpbmxpbmUiLCJmaW5kIiwiQnVmZmVyIiwiZnJvbSIsImdyb3VuZGluZ01ldGFkYXRhIiwiZ3JvdW5kaW5nQ2h1bmtzIiwid2ViIiwiVVJMIiwidXJpIiwicHJvdG9jb2wiLCJ0aXRsZSIsImhvc3RuYW1lIiwiaHJlZiIsInNlYXJjaFN1Z2dlc3Rpb25zSHRtbCIsInNlYXJjaEVudHJ5UG9pbnQiLCJyZW5kZXJlZENvbnRlbnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLElBQUksUUFBTyxvQkFBb0I7QUFFdkMsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFrRHBDLCtFQUErRSxHQUMvRSxPQUFPLE1BQU1DLHVDQUF1Q0M7QUFBTztBQUMzRCw0RkFBNEYsR0FD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
|
|
312
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dlbmVyYXRlT2xsYW1hQ29udGVudH0gZnJvbSAnLi9vbGxhbWFHZW5lcmF0aW9uLmpzJztcbmltcG9ydCB7Q29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yLCBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3J9IGZyb20gJy4vY29udGVudEdlbmVyYXRpb25FcnJvcnMuanMnO1xuZXhwb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcn0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbkVycm9ycy5qcyc7XG5pbXBvcnQge3Bvc3R9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEdlbmVyYXRpb25Db25maWcge1xuICBjbGF1ZGVLZXk/OiBzdHJpbmc7XG4gIGNsYXVkZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlJbWFnZU1vZGVsPzogc3RyaW5nO1xuICBnZW1pbmlLZXk/OiBzdHJpbmc7XG4gIGdlbWluaU1vZGVsPzogc3RyaW5nO1xuICBvbGxhbWE/OiB7ZW5kcG9pbnQ6IHN0cmluZzsgcHJvdG9jb2w6ICdnZW5lcmF0ZScgfCAnY2hhdCcgfCAnb3BlbmFpLWNoYXQnfTtcbiAgb3BlbmFpS2V5Pzogc3RyaW5nO1xuICBvcGVuYWlNb2RlbD86IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUGFydCA9IHt0ZXh0OiBzdHJpbmc7IHR5cGU6ICd0ZXh0J30gfCB7XG4gIGRldGFpbD86ICdhdXRvJyB8ICdoaWdoJyB8ICdsb3cnO1xuICB0eXBlOiAnaW1hZ2UnO1xuICB1cmw6IHN0cmluZztcbn07XG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0aW9uTWVzc2FnZSB7XG4gIGNvbnRlbnQ6IHN0cmluZyB8IENvbnRlbnRHZW5lcmF0aW9uUGFydFtdO1xuICByb2xlOiAnYXNzaXN0YW50JyB8ICdkZXZlbG9wZXInIHwgJ3N5c3RlbScgfCAndXNlcic7XG59XG5leHBvcnQgdHlwZSBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRm9ybWF0ID0ge3R5cGU6ICdqc29uX29iamVjdCcgfCAndGV4dCd9IHwge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBzdHJpY3Q/OiBib29sZWFuO1xuICB0eXBlOiAnanNvbl9zY2hlbWEnO1xufTtcbmV4cG9ydCB0eXBlIENvbnRlbnRHZW5lcmF0aW9uUmVhc29uaW5nRWZmb3J0ID0gJ25vbmUnIHwgJ21pbmltYWwnIHwgJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICd4aGlnaCcgfCAnbWF4JztcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50R2VuZXJhdGlvbklucHV0IHtcbiAgYXNwZWN0UmF0aW8/OiBzdHJpbmc7XG4gIGltYWdlcz86IHtieXRlczogQnVmZmVyOyBtaW1lOiBzdHJpbmd9W107XG4gIG1heFRva2Vucz86IG51bWJlcjtcbiAgbWVzc2FnZXM/OiBDb250ZW50R2VuZXJhdGlvbk1lc3NhZ2VbXTtcbiAgbW9kYWxpdHk/OiAnaW1hZ2UnIHwgJ3RleHQnO1xuICBtb2RlbD86IHN0cmluZztcbiAgcHJvbXB0Pzogc3RyaW5nO1xuICBwcm92aWRlcjogJ2NsYXVkZScgfCAnZ2VtaW5pJyB8ICdvbGxhbWEnIHwgJ29wZW5haSc7XG4gIHJlYXNvbmluZ0VmZm9ydD86IENvbnRlbnRHZW5lcmF0aW9uUmVhc29uaW5nRWZmb3J0O1xuICByZXNwb25zZUZvcm1hdD86IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VGb3JtYXQ7XG4gIHNlYXJjaD86IGJvb2xlYW47XG4gIHN5c3RlbT86IHN0cmluZztcbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVkQ29udGVudCB7XG4gIGltYWdlPzoge2J5dGVzOiBCdWZmZXI7IG1pbWU6ICdpbWFnZS9qcGVnJyB8ICdpbWFnZS9wbmcnfTtcbiAgc2VhcmNoU3VnZ2VzdGlvbnNIdG1sPzogc3RyaW5nO1xuICBzb3VyY2VzOiB7dGl0bGU6IHN0cmluZzsgdXJsOiBzdHJpbmd9W107XG4gIHRleHQ6IHN0cmluZztcbn1cbmludGVyZmFjZSBHZW1pbmlQYXJ0IHtpbmxpbmVEYXRhPzoge2RhdGE6IHN0cmluZzsgbWltZVR5cGU6IHN0cmluZ307IHRleHQ/OiBzdHJpbmc7IHRob3VnaHQ/OiBib29sZWFufVxuaW50ZXJmYWNlIEdlbWluaVJlc3BvbnNlIHtcbiAgY2FuZGlkYXRlcz86IHtcbiAgICBjb250ZW50Pzoge3BhcnRzPzogR2VtaW5pUGFydFtdfTtcbiAgICBmaW5pc2hSZWFzb24/OiBzdHJpbmc7XG4gICAgZ3JvdW5kaW5nTWV0YWRhdGE/OiB7XG4gICAgICBncm91bmRpbmdDaHVua3M/OiB7d2ViPzoge3RpdGxlPzogc3RyaW5nOyB1cmk/OiBzdHJpbmd9fVtdO1xuICAgICAgc2VhcmNoRW50cnlQb2ludD86IHtyZW5kZXJlZENvbnRlbnQ/OiBzdHJpbmd9O1xuICAgIH07XG4gIH1bXTtcbiAgZXJyb3I/OiB7Y29kZT86IG51bWJlcn07XG4gIHByb21wdEZlZWRiYWNrPzoge2Jsb2NrUmVhc29uPzogc3RyaW5nfTtcbn1cblxuY29uc3QgdmFsaWRNZXNzYWdlQ29udGVudCA9IChtZXNzYWdlOiBDb250ZW50R2VuZXJhdGlvbk1lc3NhZ2UpOiBib29sZWFuID0+IHtcbiAgaWYodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gJ3N0cmluZycpIHJldHVybiAhIW1lc3NhZ2UuY29udGVudC50cmltKCk7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkgJiYgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA+IDAgJiYgbWVzc2FnZS5jb250ZW50LmV2ZXJ5KChwYXJ0KSA9PiB7XG4gICAgaWYoIXBhcnQpIHJldHVybiBmYWxzZTtcbiAgICBpZihwYXJ0LnR5cGUgPT09ICd0ZXh0JykgcmV0dXJuIHR5cGVvZiBwYXJ0LnRleHQgPT09ICdzdHJpbmcnICYmICEhcGFydC50ZXh0LnRyaW0oKTtcbiAgICByZXR1cm4gcGFydC50eXBlID09PSAnaW1hZ2UnICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ3VzZXInICYmIHR5cGVvZiBwYXJ0LnVybCA9PT0gJ3N0cmluZydcbiAgICAgICYmIC9eKGh0dHBzPzpcXC9cXC9bXlxcc10rfGRhdGE6aW1hZ2VcXC8ocG5nfGpwZWd8d2VicHxnaWYpO2Jhc2U2NCxbQS1aYS16MC05Ky9dKz17MCwyfSkkLy50ZXN0KHBhcnQudXJsKVxuICAgICAgJiYgKHBhcnQuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgWydhdXRvJywgJ2hpZ2gnLCAnbG93J10uaW5jbHVkZXMocGFydC5kZXRhaWwpKTtcbiAgfSk7XG59O1xuXG4vKiogU2luZ2xlIHN1Ym1pc3Npb24gdGhyb3VnaCBSaXAtSHVudGVyOyBjYWxsZXJzIG93biBkdXJhYmxlIGpvYnMgYW5kIHJlY29uY2lsaWF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQ29udGVudCA9IGFzeW5jIChcbiAgaW5wdXQ6IENvbnRlbnRHZW5lcmF0aW9uSW5wdXQsXG4gIGNvbmZpZzogQ29udGVudEdlbmVyYXRpb25Db25maWcgPSBDb25maWcuZ2V0PENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnPignY29udGVudEdlbmVyYXRpb24nKSB8fCB7fVxuKTogUHJvbWlzZTxHZW5lcmF0ZWRDb250ZW50PiA9PiB7XG4gIGlmKCFbJ2NsYXVkZScsICdnZW1pbmknLCAnb2xsYW1hJywgJ29wZW5haSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egc3VwcG9ydGVkIHByb3ZpZGVyIGlzIHJlcXVpcmVkLicpO1xuICB9XG4gIGlmKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZihpbnB1dC5wcm9tcHQgIT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShpbnB1dC5tZXNzYWdlcykgfHwgIWlucHV0Lm1lc3NhZ2VzLmxlbmd0aCB8fCBpbnB1dC5tZXNzYWdlcy5zb21lKChtZXNzYWdlKSA9PlxuICAgICAgIW1lc3NhZ2UgfHwgIVsnYXNzaXN0YW50JywgJ2RldmVsb3BlcicsICdzeXN0ZW0nLCAndXNlciddLmluY2x1ZGVzKG1lc3NhZ2Uucm9sZSkgfHwgIXZhbGlkTWVzc2FnZUNvbnRlbnQobWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdTdXBwbHkgZWl0aGVyIGEgbm9uLWVtcHR5IHByb21wdCBvciBub24tZW1wdHkgdGV4dCBtZXNzYWdlcyB3aXRoIHN1cHBvcnRlZCByb2xlcy4nKTtcbiAgICB9XG4gIH0gZWxzZSBpZih0eXBlb2YgaW5wdXQucHJvbXB0ICE9PSAnc3RyaW5nJyB8fCAhaW5wdXQucHJvbXB0LnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0Egbm9uLWVtcHR5IHByb21wdCBpcyByZXF1aXJlZC4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ29wZW5haScgJiYgKGlucHV0Lm1lc3NhZ2VzICE9PSB1bmRlZmluZWQgfHwgaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgfHwgKGlucHV0LnByb3ZpZGVyID09PSAnY2xhdWRlJyAmJiBpbnB1dC5yZXNwb25zZUZvcm1hdCAhPT0gdW5kZWZpbmVkKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdNZXNzYWdlcyBhbmQgcmVhc29uaW5nIGVmZm9ydCByZXF1aXJlIE9wZW5BSTsgQ2xhdWRlIGRvZXMgbm90IHN1cHBvcnQgcmVzcG9uc2UgZm9ybWF0IG9wdGlvbnMuJyk7XG4gIH1cbiAgaWYoaW5wdXQudGltZW91dE1zICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlucHV0LnRpbWVvdXRNcykgfHwgaW5wdXQudGltZW91dE1zIDwgMSB8fCBpbnB1dC50aW1lb3V0TXMgPiAyXzE0N180ODNfNjQ3KSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ3RpbWVvdXRNcyBtdXN0IGJlIGEgcG9zaXRpdmUgMzItYml0IGludGVnZXIuJyk7XG4gIH1cbiAgaWYoaW5wdXQucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgJiYgIVsnbm9uZScsICdtaW5pbWFsJywgJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICd4aGlnaCcsICdtYXgnXS5pbmNsdWRlcyhpbnB1dC5yZWFzb25pbmdFZmZvcnQpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVW5zdXBwb3J0ZWQgcmVhc29uaW5nIGVmZm9ydC4nKTtcbiAgfVxuICBjb25zdCBmb3JtYXQgPSBpbnB1dC5yZXNwb25zZUZvcm1hdDtcbiAgaWYoZm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgKCFmb3JtYXQgfHwgIVsndGV4dCcsICdqc29uX29iamVjdCcsICdqc29uX3NjaGVtYSddLmluY2x1ZGVzKGZvcm1hdC50eXBlKSB8fCAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgJiYgKFxuICAgIHR5cGVvZiBmb3JtYXQubmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW2EtekEtWjAtOV8tXXsxLDY0fSQvLnRlc3QoZm9ybWF0Lm5hbWUpIHx8ICFmb3JtYXQuc2NoZW1hIHx8IHR5cGVvZiBmb3JtYXQuc2NoZW1hICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGZvcm1hdC5zY2hlbWEpXG4gICAgfHwgKGZvcm1hdC5zdHJpY3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZm9ybWF0LnN0cmljdCAhPT0gJ2Jvb2xlYW4nKVxuICApKSkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdC4gSlNPTiBzY2hlbWFzIHJlcXVpcmUgYSBuYW1lIGFuZCBzY2hlbWEgb2JqZWN0LicpO1xuICB9XG4gIGlmKFsnZ2VtaW5pJywgJ29sbGFtYSddLmluY2x1ZGVzKGlucHV0LnByb3ZpZGVyKSAmJiBmb3JtYXQgIT09IHVuZGVmaW5lZCAmJiAoZm9ybWF0LnR5cGUgPT09ICdqc29uX3NjaGVtYScgfHwgaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignVGhpcyBwcm92aWRlciBzdXBwb3J0cyB0ZXh0IG9yIGpzb25fb2JqZWN0IGZvciB0ZXh0IGdlbmVyYXRpb24gb25seS4nKTtcbiAgfVxuICBpZihpbnB1dC50ZW1wZXJhdHVyZSAhPT0gdW5kZWZpbmVkICYmICghWydnZW1pbmknLCAnb2xsYW1hJ10uaW5jbHVkZXMoaW5wdXQucHJvdmlkZXIpIHx8IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnIHx8ICFOdW1iZXIuaXNGaW5pdGUoaW5wdXQudGVtcGVyYXR1cmUpIHx8IGlucHV0LnRlbXBlcmF0dXJlIDwgMCB8fCAoaW5wdXQucHJvdmlkZXIgPT09ICdnZW1pbmknICYmIGlucHV0LnRlbXBlcmF0dXJlID4gMikpKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcigndGVtcGVyYXR1cmUgcmVxdWlyZXMgYSBub25uZWdhdGl2ZSBmaW5pdGUgdmFsdWUgZm9yIE9sbGFtYSB0ZXh0IG9yIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyIGZvciBHZW1pbmkgdGV4dC4nKTtcbiAgfVxuICBpZihpbnB1dC5tYXhUb2tlbnMgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIoaW5wdXQubWF4VG9rZW5zKSB8fCBpbnB1dC5tYXhUb2tlbnMgPCAxKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ21heFRva2VucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciAhPT0gJ2dlbWluaScgJiYgKGlucHV0LmltYWdlcz8ubGVuZ3RoIHx8IGlucHV0Lm1vZGFsaXR5ID09PSAnaW1hZ2UnIHx8IGlucHV0LnNlYXJjaCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdUaGlzIHByb3ZpZGVyIG9wZXJhdGlvbiBzdXBwb3J0cyB0ZXh0IGlucHV0IGFuZCBvdXRwdXQgb25seS4nKTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciA9PT0gJ29sbGFtYScpIHJldHVybiBnZW5lcmF0ZU9sbGFtYUNvbnRlbnQoaW5wdXQsIGNvbmZpZyk7XG4gIGNvbnN0IHtwcm9tcHQsIGltYWdlcyA9IFtdfSA9IGlucHV0O1xuICBpZihpbnB1dC5wcm92aWRlciA9PT0gJ2NsYXVkZScpIHtcbiAgICBpZighY29uZmlnLmNsYXVkZUtleSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignQ2xhdWRlIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoJ2h0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vdjEvbWVzc2FnZXMnLCB7XG4gICAgICBtYXhfdG9rZW5zOiBpbnB1dC5tYXhUb2tlbnMgPz8gNDA5NixcbiAgICAgIG1lc3NhZ2VzOiBbe2NvbnRlbnQ6IHByb21wdCwgcm9sZTogJ3VzZXInfV0sXG4gICAgICBtb2RlbDogaW5wdXQubW9kZWwgfHwgY29uZmlnLmNsYXVkZU1vZGVsIHx8ICdjbGF1ZGUtc29ubmV0LTUnLFxuICAgICAgc3lzdGVtOiBpbnB1dC5zeXN0ZW1cbiAgICB9LCB7Y2FjaGU6IGZhbHNlLCBoZWFkZXJzOiBuZXcgSGVhZGVycyh7J2FudGhyb3BpYy12ZXJzaW9uJzogJzIwMjMtMDYtMDEnLCAneC1hcGkta2V5JzogY29uZmlnLmNsYXVkZUtleX0pLCB0aW1lb3V0OiBpbnB1dC50aW1lb3V0TXMgPz8gMTIwXzAwMH0pIGFzIHtcbiAgICAgIGNvbnRlbnQ/OiB7dGV4dD86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTtcbiAgICAgIGVycm9yPzoge3R5cGU/OiBzdHJpbmd9O1xuICAgICAgc3RvcF9yZWFzb24/OiBzdHJpbmc7XG4gICAgICB0eXBlPzogc3RyaW5nO1xuICAgIH07XG4gICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgWydhdXRoZW50aWNhdGlvbl9lcnJvcicsICdpbnZhbGlkX3JlcXVlc3RfZXJyb3InLCAnbm90X2ZvdW5kX2Vycm9yJywgJ3Blcm1pc3Npb25fZXJyb3InXS5pbmNsdWRlcyhyZXNwb25zZS5lcnJvci50eXBlIHx8ICcnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignQ2xhdWRlIHJlamVjdGVkIHRoZSByZXF1ZXN0LiBDaGVjayB0aGUgbW9kZWwgYW5kIGFjY291bnQgYWNjZXNzLicpO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2UuY29udGVudD8uZmlsdGVyKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICd0ZXh0JykubWFwKChwYXJ0KSA9PiBwYXJ0LnRleHQgfHwgJycpLmpvaW4oJ1xcbicpLnRyaW0oKTtcbiAgICBpZihyZXNwb25zZS5lcnJvciB8fCByZXNwb25zZS50eXBlICE9PSAnbWVzc2FnZScgfHwgcmVzcG9uc2Uuc3RvcF9yZWFzb24gIT09ICdlbmRfdHVybicgfHwgIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ0NsYXVkZSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkLicpO1xuICAgIH1cbiAgICByZXR1cm4ge3NvdXJjZXM6IFtdLCB0ZXh0fTtcbiAgfVxuICBpZihpbnB1dC5wcm92aWRlciA9PT0gJ29wZW5haScpIHtcbiAgICBpZighY29uZmlnLm9wZW5haUtleSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignT3BlbkFJIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgc2VydmVyLicpO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3QoJ2h0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvcmVzcG9uc2VzJywge1xuICAgICAgaW5wdXQ6IGlucHV0Lm1lc3NhZ2VzPy5tYXAoKG1lc3NhZ2UpID0+ICh7Y29udGVudDogdHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gJ3N0cmluZycgPyBtZXNzYWdlLmNvbnRlbnQgOiBtZXNzYWdlLmNvbnRlbnQubWFwKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICd0ZXh0J1xuICAgICAgICA/IHt0ZXh0OiBwYXJ0LnRleHQsIHR5cGU6ICdpbnB1dF90ZXh0J30gOiB7ZGV0YWlsOiBwYXJ0LmRldGFpbCA/PyAnYXV0bycsIGltYWdlX3VybDogcGFydC51cmwsIHR5cGU6ICdpbnB1dF9pbWFnZSd9KSwgcm9sZTogbWVzc2FnZS5yb2xlID09PSAnc3lzdGVtJyA/ICdkZXZlbG9wZXInIDogbWVzc2FnZS5yb2xlfSkpID8/IHByb21wdCxcbiAgICAgIGluc3RydWN0aW9uczogaW5wdXQuc3lzdGVtLFxuICAgICAgbWF4X291dHB1dF90b2tlbnM6IGlucHV0Lm1heFRva2VucyA/PyA0MDk2LFxuICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsIHx8IGNvbmZpZy5vcGVuYWlNb2RlbCB8fCAnZ3B0LTYtYXN0cmEnLFxuICAgICAgLi4uKGlucHV0LnJlYXNvbmluZ0VmZm9ydCA/IHtyZWFzb25pbmc6IHtlZmZvcnQ6IGlucHV0LnJlYXNvbmluZ0VmZm9ydH19IDoge30pLFxuICAgICAgc3RvcmU6IGZhbHNlLFxuICAgICAgLi4uKGZvcm1hdCA/IHt0ZXh0OiB7Zm9ybWF0fX0gOiB7fSksXG4gICAgICB0cnVuY2F0aW9uOiAnZGlzYWJsZWQnXG4gICAgfSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoe0F1dGhvcml6YXRpb246IGBCZWFyZXIgJHtjb25maWcub3BlbmFpS2V5fWB9KSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMF8wMDB9KSBhcyB7XG4gICAgICBlcnJvcj86IHtjb2RlPzogc3RyaW5nOyB0eXBlPzogc3RyaW5nfTtcbiAgICAgIG91dHB1dD86IHtjb250ZW50Pzoge3RleHQ/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmd9W107IHN0YXR1cz86IHN0cmluZzsgdHlwZT86IHN0cmluZ31bXTtcbiAgICAgIHN0YXR1cz86IHN0cmluZztcbiAgICB9O1xuICAgIGlmKHJlc3BvbnNlLmVycm9yICYmIFsnaW52YWxpZF9yZXF1ZXN0X2Vycm9yJywgJ2F1dGhlbnRpY2F0aW9uX2Vycm9yJywgJ3Blcm1pc3Npb25fZXJyb3InXS5pbmNsdWRlcyhyZXNwb25zZS5lcnJvci50eXBlIHx8ICcnKSkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignT3BlbkFJIHJlamVjdGVkIHRoZSByZXF1ZXN0LiBDaGVjayB0aGUgbW9kZWwgYW5kIGFjY291bnQgYWNjZXNzLicpO1xuICAgIH1cbiAgICBpZihyZXNwb25zZS5lcnJvciB8fCByZXNwb25zZS5zdGF0dXMgIT09ICdjb21wbGV0ZWQnIHx8IHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdpbmNvbXBsZXRlJykpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkOiBnZW5lcmF0aW9uIGRpZCBub3QgY29tcGxldGUuJyk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS5jb250ZW50Py5zb21lKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdyZWZ1c2FsJykpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdPcGVuQUkgZGVjbGluZWQgdGhlIHJlcXVlc3QuJyk7XG4gICAgfVxuICAgIGlmKHJlc3BvbnNlLm91dHB1dD8uc29tZSgoaXRlbSkgPT4gaXRlbS50eXBlICYmICFbJ21lc3NhZ2UnLCAncmVhc29uaW5nJ10uaW5jbHVkZXMoaXRlbS50eXBlKSkpIHtcbiAgICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09wZW5BSSByZXR1cm5lZCBhbiB1bnN1cHBvcnRlZCBvdXRwdXQgaXRlbS4nKTtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHJlc3BvbnNlLm91dHB1dD8uZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgPT09ICdtZXNzYWdlJykuZmxhdE1hcCgoaXRlbSkgPT4gaXRlbS5jb250ZW50IHx8IFtdKVxuICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydC50eXBlID09PSAnb3V0cHV0X3RleHQnKS5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignJykudHJpbSgpO1xuICAgIGlmKCF0ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdPcGVuQUkgcmV0dXJuZWQgZW1wdHkgb3V0cHV0LicpO1xuICAgIH1cbiAgICByZXR1cm4ge3NvdXJjZXM6IFtdLCB0ZXh0fTtcbiAgfVxuICBpZighY29uZmlnLmdlbWluaUtleSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0dlbWluaSBpcyBub3QgY29uZmlndXJlZCBvbiB0aGlzIHNlcnZlci4nKTtcbiAgfVxuICBjb25zdCBwYXJ0czogdW5rbm93bltdID0gW3t0ZXh0OiBwcm9tcHR9LCAuLi5pbWFnZXMubWFwKChpbWFnZSkgPT4gKHtpbmxpbmVEYXRhOiB7ZGF0YTogaW1hZ2UuYnl0ZXMudG9TdHJpbmcoJ2Jhc2U2NCcpLCBtaW1lVHlwZTogaW1hZ2UubWltZX19KSldO1xuICBjb25zdCBtb2RlbCA9IGlucHV0Lm1vZGVsIHx8IChpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/IGNvbmZpZy5nZW1pbmlJbWFnZU1vZGVsIHx8ICdnZW1pbmktMy4xLWZsYXNoLWltYWdlJyA6IGNvbmZpZy5nZW1pbmlNb2RlbCB8fCAnZ2VtaW5pLTMuOC1mbGFzaCcpO1xuICBpZighL15bYS16QS1aMC05Ll8tXSskLy50ZXN0KG1vZGVsKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0ludmFsaWQgR2VtaW5pIG1vZGVsIGNvbmZpZ3VyYXRpb24uJyk7XG4gIH1cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0KGBodHRwczovL2dlbmVyYXRpdmVsYW5ndWFnZS5nb29nbGVhcGlzLmNvbS92MWJldGEvbW9kZWxzLyR7bW9kZWx9OmdlbmVyYXRlQ29udGVudGAsIHtcbiAgICBjb250ZW50czogW3twYXJ0cywgcm9sZTogJ3VzZXInfV0sXG4gICAgLi4uKGlucHV0LnN5c3RlbSA/IHtzeXN0ZW1JbnN0cnVjdGlvbjoge3BhcnRzOiBbe3RleHQ6IGlucHV0LnN5c3RlbX1dfX0gOiB7fSksXG4gICAgZ2VuZXJhdGlvbkNvbmZpZzogaW5wdXQubW9kYWxpdHkgPT09ICdpbWFnZScgPyB7Li4uKGlucHV0LmFzcGVjdFJhdGlvID8ge2ltYWdlQ29uZmlnOiB7YXNwZWN0UmF0aW86IGlucHV0LmFzcGVjdFJhdGlvfX0gOiB7fSksIHJlc3BvbnNlTW9kYWxpdGllczogWydURVhUJywgJ0lNQUdFJ119IDoge1xuICAgICAgbWF4T3V0cHV0VG9rZW5zOiBpbnB1dC5tYXhUb2tlbnMgPz8gNDA5NixcbiAgICAgIC4uLihmb3JtYXQgPyB7cmVzcG9uc2VNaW1lVHlwZTogZm9ybWF0LnR5cGUgPT09ICdqc29uX29iamVjdCcgPyAnYXBwbGljYXRpb24vanNvbicgOiAndGV4dC9wbGFpbid9IDoge30pLFxuICAgICAgLi4uKGlucHV0LnRlbXBlcmF0dXJlICE9PSB1bmRlZmluZWQgPyB7dGVtcGVyYXR1cmU6IGlucHV0LnRlbXBlcmF0dXJlfSA6IHt9KVxuICAgIH0sXG4gICAgLi4uKGlucHV0LnNlYXJjaCA/IHt0b29sczogW3tnb29nbGVTZWFyY2g6IHt9fV19IDoge30pXG4gIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsneC1nb29nLWFwaS1rZXknOiBjb25maWcuZ2VtaW5pS2V5fSksIHRpbWVvdXQ6IGlucHV0LnRpbWVvdXRNcyA/PyAxMjBfMDAwfSkgYXMgR2VtaW5pUmVzcG9uc2U7XG4gIGlmKHJlc3BvbnNlLmVycm9yICYmIFs0MDAsIDQwMSwgNDAzLCA0MDRdLmluY2x1ZGVzKHJlc3BvbnNlLmVycm9yLmNvZGUgfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdHZW1pbmkgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuIENoZWNrIHRoZSByZWZlcmVuY2UgZm9ybWF0IGFuZCBtb2RlbCBhY2Nlc3MuJyk7XG4gIH1cbiAgaWYocmVzcG9uc2UucHJvbXB0RmVlZGJhY2s/LmJsb2NrUmVhc29uIHx8IHJlc3BvbnNlLmVycm9yIHx8ICFyZXNwb25zZS5jYW5kaWRhdGVzPy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdHZW1pbmkgcmVzcG9uc2UgY291bGQgbm90IGJlIGNvbmZpcm1lZC4nKTtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSByZXNwb25zZS5jYW5kaWRhdGVzWzBdITtcbiAgaWYoY2FuZGlkYXRlLmZpbmlzaFJlYXNvbiAhPT0gJ1NUT1AnKSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignR2VtaW5pIHJlc3BvbnNlIGNvdWxkIG5vdCBiZSBjb25maXJtZWQ6IGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZS4nKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSAoY2FuZGlkYXRlLmNvbnRlbnQ/LnBhcnRzIHx8IFtdKS5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0LnRob3VnaHQpO1xuICBjb25zdCBpbmxpbmUgPSBvdXRwdXQuZmluZCgocGFydCkgPT4gcGFydC5pbmxpbmVEYXRhKT8uaW5saW5lRGF0YTtcbiAgbGV0IGltYWdlOiBHZW5lcmF0ZWRDb250ZW50WydpbWFnZSddO1xuICBpZihpbmxpbmUgJiYgWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddLmluY2x1ZGVzKGlubGluZS5taW1lVHlwZSkpIHtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGlubGluZS5kYXRhLCAnYmFzZTY0Jyk7XG4gICAgaWYoIWJ5dGVzLmxlbmd0aCB8fCBieXRlcy5sZW5ndGggPiAyMCAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdJbnZhbGlkIGltYWdlIG91dHB1dC4nKTtcbiAgICB9XG4gICAgaW1hZ2UgPSB7Ynl0ZXMsIG1pbWU6IGlubGluZS5taW1lVHlwZSBhcyAnaW1hZ2UvcG5nJyB8ICdpbWFnZS9qcGVnJ307XG4gIH1cbiAgY29uc3QgdGV4dCA9IG91dHB1dC5tYXAoKHBhcnQpID0+IHBhcnQudGV4dCB8fCAnJykuam9pbignXFxuJykudHJpbSgpO1xuICBpZihpbnB1dC5tb2RhbGl0eSA9PT0gJ2ltYWdlJyA/ICFpbWFnZSA6ICF0ZXh0KSB7XG4gICAgdGhyb3cgbmV3IENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcignVGhlIHJlcXVlc3RlZCBvdXRwdXQgd2FzIG5vdCByZXR1cm5lZC4nKTtcbiAgfVxuICBjb25zdCBzb3VyY2VzID0gKGNhbmRpZGF0ZS5ncm91bmRpbmdNZXRhZGF0YT8uZ3JvdW5kaW5nQ2h1bmtzIHx8IFtdKS5mbGF0TWFwKCh7d2VifSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdlYj8udXJpIHx8ICcnKTtcbiAgICAgIHJldHVybiB1cmwucHJvdG9jb2wgPT09ICdodHRwczonID8gW3t0aXRsZTogd2ViPy50aXRsZSB8fCB1cmwuaG9zdG5hbWUsIHVybDogdXJsLmhyZWZ9XSA6IFtdO1xuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpbWFnZSwgc2VhcmNoU3VnZ2VzdGlvbnNIdG1sOiBjYW5kaWRhdGUuZ3JvdW5kaW5nTWV0YWRhdGE/LnNlYXJjaEVudHJ5UG9pbnQ/LnJlbmRlcmVkQ29udGVudCwgc291cmNlcywgdGV4dFxuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJnZW5lcmF0ZU9sbGFtYUNvbnRlbnQiLCJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IiLCJwb3N0IiwiQ29uZmlnIiwidmFsaWRNZXNzYWdlQ29udGVudCIsIm1lc3NhZ2UiLCJjb250ZW50IiwidHJpbSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImV2ZXJ5IiwicGFydCIsInR5cGUiLCJ0ZXh0Iiwicm9sZSIsInVybCIsInRlc3QiLCJkZXRhaWwiLCJ1bmRlZmluZWQiLCJpbmNsdWRlcyIsImdlbmVyYXRlQ29udGVudCIsImlucHV0IiwiY29uZmlnIiwiZ2V0IiwicHJvdmlkZXIiLCJtZXNzYWdlcyIsInByb21wdCIsInNvbWUiLCJyZWFzb25pbmdFZmZvcnQiLCJyZXNwb25zZUZvcm1hdCIsInRpbWVvdXRNcyIsIk51bWJlciIsImlzSW50ZWdlciIsImZvcm1hdCIsIm5hbWUiLCJzY2hlbWEiLCJzdHJpY3QiLCJtb2RhbGl0eSIsInRlbXBlcmF0dXJlIiwiaXNGaW5pdGUiLCJtYXhUb2tlbnMiLCJpbWFnZXMiLCJzZWFyY2giLCJjbGF1ZGVLZXkiLCJyZXNwb25zZSIsIm1heF90b2tlbnMiLCJtb2RlbCIsImNsYXVkZU1vZGVsIiwic3lzdGVtIiwiY2FjaGUiLCJoZWFkZXJzIiwiSGVhZGVycyIsInRpbWVvdXQiLCJlcnJvciIsImZpbHRlciIsIm1hcCIsImpvaW4iLCJzdG9wX3JlYXNvbiIsInNvdXJjZXMiLCJvcGVuYWlLZXkiLCJpbWFnZV91cmwiLCJpbnN0cnVjdGlvbnMiLCJtYXhfb3V0cHV0X3Rva2VucyIsIm9wZW5haU1vZGVsIiwicmVhc29uaW5nIiwiZWZmb3J0Iiwic3RvcmUiLCJ0cnVuY2F0aW9uIiwiQXV0aG9yaXphdGlvbiIsInN0YXR1cyIsIm91dHB1dCIsIml0ZW0iLCJmbGF0TWFwIiwiZ2VtaW5pS2V5IiwicGFydHMiLCJpbWFnZSIsImlubGluZURhdGEiLCJkYXRhIiwiYnl0ZXMiLCJ0b1N0cmluZyIsIm1pbWVUeXBlIiwibWltZSIsImdlbWluaUltYWdlTW9kZWwiLCJnZW1pbmlNb2RlbCIsImNvbnRlbnRzIiwic3lzdGVtSW5zdHJ1Y3Rpb24iLCJnZW5lcmF0aW9uQ29uZmlnIiwiYXNwZWN0UmF0aW8iLCJpbWFnZUNvbmZpZyIsInJlc3BvbnNlTW9kYWxpdGllcyIsIm1heE91dHB1dFRva2VucyIsInJlc3BvbnNlTWltZVR5cGUiLCJ0b29scyIsImdvb2dsZVNlYXJjaCIsImNvZGUiLCJwcm9tcHRGZWVkYmFjayIsImJsb2NrUmVhc29uIiwiY2FuZGlkYXRlcyIsImNhbmRpZGF0ZSIsImZpbmlzaFJlYXNvbiIsInRob3VnaHQiLCJpbmxpbmUiLCJmaW5kIiwiQnVmZmVyIiwiZnJvbSIsImdyb3VuZGluZ01ldGFkYXRhIiwiZ3JvdW5kaW5nQ2h1bmtzIiwid2ViIiwiVVJMIiwidXJpIiwicHJvdG9jb2wiLCJ0aXRsZSIsImhvc3RuYW1lIiwiaHJlZiIsInNlYXJjaFN1Z2dlc3Rpb25zSHRtbCIsInNlYXJjaEVudHJ5UG9pbnQiLCJyZW5kZXJlZENvbnRlbnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLHFCQUFxQixRQUFPLHdCQUF3QjtBQUM1RCxTQUFRQyw4QkFBOEIsRUFBRUMsOEJBQThCLFFBQU8sK0JBQStCO0FBQzVHLFNBQVFELDhCQUE4QixFQUFFQyw4QkFBOEIsUUFBTywrQkFBK0I7QUFDNUcsU0FBUUMsSUFBSSxRQUFPLG9CQUFvQjtBQUV2QyxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQWtFcEMsTUFBTUMsc0JBQXNCLENBQUNDO0lBQzNCLElBQUcsT0FBT0EsUUFBUUMsT0FBTyxLQUFLLFVBQVUsT0FBTyxDQUFDLENBQUNELFFBQVFDLE9BQU8sQ0FBQ0MsSUFBSTtJQUNyRSxPQUFPQyxNQUFNQyxPQUFPLENBQUNKLFFBQVFDLE9BQU8sS0FBS0QsUUFBUUMsT0FBTyxDQUFDSSxNQUFNLEdBQUcsS0FBS0wsUUFBUUMsT0FBTyxDQUFDSyxLQUFLLENBQUMsQ0FBQ0M7UUFDNUYsSUFBRyxDQUFDQSxNQUFNLE9BQU87UUFDakIsSUFBR0EsS0FBS0MsSUFBSSxLQUFLLFFBQVEsT0FBTyxPQUFPRCxLQUFLRSxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUNGLEtBQUtFLElBQUksQ0FBQ1AsSUFBSTtRQUNqRixPQUFPSyxLQUFLQyxJQUFJLEtBQUssV0FBV1IsUUFBUVUsSUFBSSxLQUFLLFVBQVUsT0FBT0gsS0FBS0ksR0FBRyxLQUFLLFlBQzFFLG9GQUFvRkMsSUFBSSxDQUFDTCxLQUFLSSxHQUFHLEtBQ2hHSixDQUFBQSxLQUFLTSxNQUFNLEtBQUtDLGFBQWE7WUFBQztZQUFRO1lBQVE7U0FBTSxDQUFDQyxRQUFRLENBQUNSLEtBQUtNLE1BQU0sQ0FBQTtJQUNqRjtBQUNGO0FBRUEsdUZBQXVGLEdBQ3ZGLE9B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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** A confirmed rejection is distinct from an unknown paid submission outcome. */
|
|
2
|
+
export declare class ContentGenerationRejectedError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/** An accepted generation did not produce usable output; do not automatically resubmit it. */
|
|
5
|
+
export declare class ContentGenerationResponseError extends Error {
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** A confirmed rejection is distinct from an unknown paid submission outcome. */ export class ContentGenerationRejectedError extends Error {
|
|
2
|
+
}
|
|
3
|
+
/** An accepted generation did not produce usable output; do not automatically resubmit it. */ export class ContentGenerationResponseError extends Error {
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb250ZW50R2VuZXJhdGlvbkVycm9ycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQSBjb25maXJtZWQgcmVqZWN0aW9uIGlzIGRpc3RpbmN0IGZyb20gYW4gdW5rbm93biBwYWlkIHN1Ym1pc3Npb24gb3V0Y29tZS4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuLyoqIEFuIGFjY2VwdGVkIGdlbmVyYXRpb24gZGlkIG5vdCBwcm9kdWNlIHVzYWJsZSBvdXRwdXQ7IGRvIG5vdCBhdXRvbWF0aWNhbGx5IHJlc3VibWl0IGl0LiAqL1xuZXhwb3J0IGNsYXNzIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbiJdLCJuYW1lcyI6WyJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJFcnJvciIsIkNvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUEsK0VBQStFLEdBQy9FLE9BQU8sTUFBTUEsdUNBQXVDQztBQUFPO0FBQzNELDRGQUE0RixHQUM1RixPQUFPLE1BQU1DLHVDQUF1Q0Q7QUFBTyJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ContentGenerationConfig, ContentGenerationInput, GeneratedContent } from './contentGeneration.js';
|
|
2
|
+
/** Caller-resolved destination and model. No discovery, alternate endpoints, or retries. */
|
|
3
|
+
export declare const generateOllamaContent: (input: ContentGenerationInput, config: ContentGenerationConfig) => Promise<GeneratedContent>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { post } from '@nlabs/rip-hunter';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { ContentGenerationRejectedError, ContentGenerationResponseError } from './contentGenerationErrors.js';
|
|
4
|
+
const text = z.string().refine((value)=>Boolean(value.trim()));
|
|
5
|
+
const message = z.object({
|
|
6
|
+
content: text,
|
|
7
|
+
function_call: z.null().optional(),
|
|
8
|
+
refusal: z.union([
|
|
9
|
+
z.null(),
|
|
10
|
+
z.literal('')
|
|
11
|
+
]).optional(),
|
|
12
|
+
role: z.literal('assistant'),
|
|
13
|
+
tool_calls: z.array(z.unknown()).max(0).optional()
|
|
14
|
+
});
|
|
15
|
+
const completed = z.object({
|
|
16
|
+
done: z.literal(true),
|
|
17
|
+
done_reason: z.literal('stop'),
|
|
18
|
+
error: z.never().optional()
|
|
19
|
+
});
|
|
20
|
+
const generated = completed.extend({
|
|
21
|
+
response: text
|
|
22
|
+
});
|
|
23
|
+
const chatted = completed.extend({
|
|
24
|
+
message
|
|
25
|
+
});
|
|
26
|
+
const compatible = z.object({
|
|
27
|
+
choices: z.array(z.object({
|
|
28
|
+
finish_reason: z.literal('stop'),
|
|
29
|
+
message
|
|
30
|
+
})).length(1),
|
|
31
|
+
error: z.never().optional()
|
|
32
|
+
});
|
|
33
|
+
/** Caller-resolved destination and model. No discovery, alternate endpoints, or retries. */ export const generateOllamaContent = async (input, config)=>{
|
|
34
|
+
const target = config.ollama;
|
|
35
|
+
let url;
|
|
36
|
+
try {
|
|
37
|
+
url = new URL(target?.endpoint || '');
|
|
38
|
+
} catch {
|
|
39
|
+
throw new ContentGenerationRejectedError('Ollama requires an explicit HTTP(S) endpoint.');
|
|
40
|
+
}
|
|
41
|
+
if (!target || ![
|
|
42
|
+
'generate',
|
|
43
|
+
'chat',
|
|
44
|
+
'openai-chat'
|
|
45
|
+
].includes(target.protocol) || ![
|
|
46
|
+
'http:',
|
|
47
|
+
'https:'
|
|
48
|
+
].includes(url.protocol) || url.username || url.password || url.search || url.hash || typeof input.model !== 'string' || !input.model.trim()) {
|
|
49
|
+
throw new ContentGenerationRejectedError('Ollama requires a protocol, model, and endpoint without credentials, query, or fragment.');
|
|
50
|
+
}
|
|
51
|
+
const messages = [
|
|
52
|
+
...input.system !== undefined ? [
|
|
53
|
+
{
|
|
54
|
+
content: input.system,
|
|
55
|
+
role: 'system'
|
|
56
|
+
}
|
|
57
|
+
] : [],
|
|
58
|
+
{
|
|
59
|
+
content: input.prompt,
|
|
60
|
+
role: 'user'
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
const options = {
|
|
64
|
+
...input.maxTokens !== undefined ? {
|
|
65
|
+
num_predict: input.maxTokens
|
|
66
|
+
} : {},
|
|
67
|
+
...input.temperature !== undefined ? {
|
|
68
|
+
temperature: input.temperature
|
|
69
|
+
} : {}
|
|
70
|
+
};
|
|
71
|
+
const native = {
|
|
72
|
+
...input.responseFormat?.type === 'json_object' ? {
|
|
73
|
+
format: 'json'
|
|
74
|
+
} : {},
|
|
75
|
+
model: input.model,
|
|
76
|
+
...Object.keys(options).length ? {
|
|
77
|
+
options
|
|
78
|
+
} : {},
|
|
79
|
+
stream: false
|
|
80
|
+
};
|
|
81
|
+
const payload = target.protocol === 'generate' ? {
|
|
82
|
+
...native,
|
|
83
|
+
prompt: input.prompt,
|
|
84
|
+
...input.system !== undefined ? {
|
|
85
|
+
system: input.system
|
|
86
|
+
} : {}
|
|
87
|
+
} : target.protocol === 'chat' ? {
|
|
88
|
+
...native,
|
|
89
|
+
messages
|
|
90
|
+
} : {
|
|
91
|
+
...input.maxTokens !== undefined ? {
|
|
92
|
+
max_tokens: input.maxTokens
|
|
93
|
+
} : {},
|
|
94
|
+
messages,
|
|
95
|
+
model: input.model,
|
|
96
|
+
...input.responseFormat?.type === 'json_object' ? {
|
|
97
|
+
response_format: input.responseFormat
|
|
98
|
+
} : {},
|
|
99
|
+
stream: false,
|
|
100
|
+
...input.temperature !== undefined ? {
|
|
101
|
+
temperature: input.temperature
|
|
102
|
+
} : {}
|
|
103
|
+
};
|
|
104
|
+
let response;
|
|
105
|
+
try {
|
|
106
|
+
response = await post(url.toString(), payload, {
|
|
107
|
+
cache: false,
|
|
108
|
+
timeout: input.timeoutMs ?? 120000
|
|
109
|
+
});
|
|
110
|
+
} catch {
|
|
111
|
+
throw new ContentGenerationResponseError('Ollama submission outcome is unknown; do not automatically retry.');
|
|
112
|
+
}
|
|
113
|
+
const parsed = (target.protocol === 'generate' ? generated : target.protocol === 'chat' ? chatted : compatible).safeParse(response);
|
|
114
|
+
if (!parsed.success) throw new ContentGenerationResponseError('Ollama response could not be confirmed; do not automatically retry.');
|
|
115
|
+
const result = parsed.data;
|
|
116
|
+
return {
|
|
117
|
+
sources: [],
|
|
118
|
+
text: 'response' in result ? result.response : 'message' in result ? result.message.content : result.choices[0].message.content
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9vbGxhbWFHZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cG9zdH0gZnJvbSAnQG5sYWJzL3JpcC1odW50ZXInO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHtDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IsIENvbnRlbnRHZW5lcmF0aW9uUmVzcG9uc2VFcnJvcn0gZnJvbSAnLi9jb250ZW50R2VuZXJhdGlvbkVycm9ycy5qcyc7XG5pbXBvcnQgdHlwZSB7Q29udGVudEdlbmVyYXRpb25Db25maWcsIENvbnRlbnRHZW5lcmF0aW9uSW5wdXQsIEdlbmVyYXRlZENvbnRlbnR9IGZyb20gJy4vY29udGVudEdlbmVyYXRpb24uanMnO1xuXG5jb25zdCB0ZXh0ID0gei5zdHJpbmcoKS5yZWZpbmUoKHZhbHVlKSA9PiBCb29sZWFuKHZhbHVlLnRyaW0oKSkpO1xuY29uc3QgbWVzc2FnZSA9IHoub2JqZWN0KHtcbiAgY29udGVudDogdGV4dCxcbiAgZnVuY3Rpb25fY2FsbDogei5udWxsKCkub3B0aW9uYWwoKSxcbiAgcmVmdXNhbDogei51bmlvbihbei5udWxsKCksIHoubGl0ZXJhbCgnJyldKS5vcHRpb25hbCgpLFxuICByb2xlOiB6LmxpdGVyYWwoJ2Fzc2lzdGFudCcpLFxuICB0b29sX2NhbGxzOiB6LmFycmF5KHoudW5rbm93bigpKS5tYXgoMCkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBjb21wbGV0ZWQgPSB6Lm9iamVjdCh7ZG9uZTogei5saXRlcmFsKHRydWUpLCBkb25lX3JlYXNvbjogei5saXRlcmFsKCdzdG9wJyksIGVycm9yOiB6Lm5ldmVyKCkub3B0aW9uYWwoKX0pO1xuY29uc3QgZ2VuZXJhdGVkID0gY29tcGxldGVkLmV4dGVuZCh7cmVzcG9uc2U6IHRleHR9KTtcbmNvbnN0IGNoYXR0ZWQgPSBjb21wbGV0ZWQuZXh0ZW5kKHttZXNzYWdlfSk7XG5jb25zdCBjb21wYXRpYmxlID0gei5vYmplY3Qoe2Nob2ljZXM6IHouYXJyYXkoei5vYmplY3Qoe2ZpbmlzaF9yZWFzb246IHoubGl0ZXJhbCgnc3RvcCcpLCBtZXNzYWdlfSkpLmxlbmd0aCgxKSwgZXJyb3I6IHoubmV2ZXIoKS5vcHRpb25hbCgpfSk7XG5cbi8qKiBDYWxsZXItcmVzb2x2ZWQgZGVzdGluYXRpb24gYW5kIG1vZGVsLiBObyBkaXNjb3ZlcnksIGFsdGVybmF0ZSBlbmRwb2ludHMsIG9yIHJldHJpZXMuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVPbGxhbWFDb250ZW50ID0gYXN5bmMgKGlucHV0OiBDb250ZW50R2VuZXJhdGlvbklucHV0LCBjb25maWc6IENvbnRlbnRHZW5lcmF0aW9uQ29uZmlnKTogUHJvbWlzZTxHZW5lcmF0ZWRDb250ZW50PiA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGNvbmZpZy5vbGxhbWE7XG4gIGxldCB1cmw6IFVSTDtcbiAgdHJ5IHtcbiAgICB1cmwgPSBuZXcgVVJMKHRhcmdldD8uZW5kcG9pbnQgfHwgJycpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdPbGxhbWEgcmVxdWlyZXMgYW4gZXhwbGljaXQgSFRUUChTKSBlbmRwb2ludC4nKTtcbiAgfVxuICBpZighdGFyZ2V0IHx8ICFbJ2dlbmVyYXRlJywgJ2NoYXQnLCAnb3BlbmFpLWNoYXQnXS5pbmNsdWRlcyh0YXJnZXQucHJvdG9jb2wpIHx8ICFbJ2h0dHA6JywgJ2h0dHBzOiddLmluY2x1ZGVzKHVybC5wcm90b2NvbCkgfHwgdXJsLnVzZXJuYW1lIHx8IHVybC5wYXNzd29yZCB8fCB1cmwuc2VhcmNoIHx8IHVybC5oYXNoIHx8IHR5cGVvZiBpbnB1dC5tb2RlbCAhPT0gJ3N0cmluZycgfHwgIWlucHV0Lm1vZGVsLnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ09sbGFtYSByZXF1aXJlcyBhIHByb3RvY29sLCBtb2RlbCwgYW5kIGVuZHBvaW50IHdpdGhvdXQgY3JlZGVudGlhbHMsIHF1ZXJ5LCBvciBmcmFnbWVudC4nKTtcbiAgfVxuICBjb25zdCBtZXNzYWdlcyA9IFsuLi4oaW5wdXQuc3lzdGVtICE9PSB1bmRlZmluZWQgPyBbe2NvbnRlbnQ6IGlucHV0LnN5c3RlbSwgcm9sZTogJ3N5c3RlbSd9XSA6IFtdKSwge2NvbnRlbnQ6IGlucHV0LnByb21wdCwgcm9sZTogJ3VzZXInfV07XG4gIGNvbnN0IG9wdGlvbnMgPSB7Li4uKGlucHV0Lm1heFRva2VucyAhPT0gdW5kZWZpbmVkID8ge251bV9wcmVkaWN0OiBpbnB1dC5tYXhUb2tlbnN9IDoge30pLCAuLi4oaW5wdXQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCA/IHt0ZW1wZXJhdHVyZTogaW5wdXQudGVtcGVyYXR1cmV9IDoge30pfTtcbiAgY29uc3QgbmF0aXZlID0ge1xuICAgIC4uLihpbnB1dC5yZXNwb25zZUZvcm1hdD8udHlwZSA9PT0gJ2pzb25fb2JqZWN0JyA/IHtmb3JtYXQ6ICdqc29uJ30gOiB7fSksXG4gICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgIC4uLihPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGggPyB7b3B0aW9uc30gOiB7fSksXG4gICAgc3RyZWFtOiBmYWxzZVxuICB9O1xuICBjb25zdCBwYXlsb2FkID0gdGFyZ2V0LnByb3RvY29sID09PSAnZ2VuZXJhdGUnXG4gICAgPyB7Li4ubmF0aXZlLCBwcm9tcHQ6IGlucHV0LnByb21wdCwgLi4uKGlucHV0LnN5c3RlbSAhPT0gdW5kZWZpbmVkID8ge3N5c3RlbTogaW5wdXQuc3lzdGVtfSA6IHt9KX1cbiAgICA6IHRhcmdldC5wcm90b2NvbCA9PT0gJ2NoYXQnID8gey4uLm5hdGl2ZSwgbWVzc2FnZXN9IDoge1xuICAgICAgLi4uKGlucHV0Lm1heFRva2VucyAhPT0gdW5kZWZpbmVkID8ge21heF90b2tlbnM6IGlucHV0Lm1heFRva2Vuc30gOiB7fSksXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCxcbiAgICAgIC4uLihpbnB1dC5yZXNwb25zZUZvcm1hdD8udHlwZSA9PT0gJ2pzb25fb2JqZWN0JyA/IHtyZXNwb25zZV9mb3JtYXQ6IGlucHV0LnJlc3BvbnNlRm9ybWF0fSA6IHt9KSxcbiAgICAgIHN0cmVhbTogZmFsc2UsXG4gICAgICAuLi4oaW5wdXQudGVtcGVyYXR1cmUgIT09IHVuZGVmaW5lZCA/IHt0ZW1wZXJhdHVyZTogaW5wdXQudGVtcGVyYXR1cmV9IDoge30pXG4gICAgfTtcbiAgbGV0IHJlc3BvbnNlOiB1bmtub3duO1xuICB0cnkge1xuICAgIHJlc3BvbnNlID0gYXdhaXQgcG9zdCh1cmwudG9TdHJpbmcoKSwgcGF5bG9hZCwge2NhY2hlOiBmYWxzZSwgdGltZW91dDogaW5wdXQudGltZW91dE1zID8/IDEyMDAwMH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgQ29udGVudEdlbmVyYXRpb25SZXNwb25zZUVycm9yKCdPbGxhbWEgc3VibWlzc2lvbiBvdXRjb21lIGlzIHVua25vd247IGRvIG5vdCBhdXRvbWF0aWNhbGx5IHJldHJ5LicpO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9ICh0YXJnZXQucHJvdG9jb2wgPT09ICdnZW5lcmF0ZScgPyBnZW5lcmF0ZWQgOiB0YXJnZXQucHJvdG9jb2wgPT09ICdjaGF0JyA/IGNoYXR0ZWQgOiBjb21wYXRpYmxlKS5zYWZlUGFyc2UocmVzcG9uc2UpO1xuICBpZighcGFyc2VkLnN1Y2Nlc3MpIHRocm93IG5ldyBDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IoJ09sbGFtYSByZXNwb25zZSBjb3VsZCBub3QgYmUgY29uZmlybWVkOyBkbyBub3QgYXV0b21hdGljYWxseSByZXRyeS4nKTtcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VkLmRhdGE7XG4gIHJldHVybiB7c291cmNlczogW10sIHRleHQ6ICdyZXNwb25zZScgaW4gcmVzdWx0ID8gcmVzdWx0LnJlc3BvbnNlIDogJ21lc3NhZ2UnIGluIHJlc3VsdCA/IHJlc3VsdC5tZXNzYWdlLmNvbnRlbnQgOiByZXN1bHQuY2hvaWNlc1swXSEubWVzc2FnZS5jb250ZW50fTtcbn07XG4iXSwibmFtZXMiOlsicG9zdCIsInoiLCJDb250ZW50R2VuZXJhdGlvblJlamVjdGVkRXJyb3IiLCJDb250ZW50R2VuZXJhdGlvblJlc3BvbnNlRXJyb3IiLCJ0ZXh0Iiwic3RyaW5nIiwicmVmaW5lIiwidmFsdWUiLCJCb29sZWFuIiwidHJpbSIsIm1lc3NhZ2UiLCJvYmplY3QiLCJjb250ZW50IiwiZnVuY3Rpb25fY2FsbCIsIm51bGwiLCJvcHRpb25hbCIsInJlZnVzYWwiLCJ1bmlvbiIsImxpdGVyYWwiLCJyb2xlIiwidG9vbF9jYWxscyIsImFycmF5IiwidW5rbm93biIsIm1heCIsImNvbXBsZXRlZCIsImRvbmUiLCJkb25lX3JlYXNvbiIsImVycm9yIiwibmV2ZXIiLCJnZW5lcmF0ZWQiLCJleHRlbmQiLCJyZXNwb25zZSIsImNoYXR0ZWQiLCJjb21wYXRpYmxlIiwiY2hvaWNlcyIsImZpbmlzaF9yZWFzb24iLCJsZW5ndGgiLCJnZW5lcmF0ZU9sbGFtYUNvbnRlbnQiLCJpbnB1dCIsImNvbmZpZyIsInRhcmdldCIsIm9sbGFtYSIsInVybCIsIlVSTCIsImVuZHBvaW50IiwiaW5jbHVkZXMiLCJwcm90b2NvbCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJzZWFyY2giLCJoYXNoIiwibW9kZWwiLCJtZXNzYWdlcyIsInN5c3RlbSIsInVuZGVmaW5lZCIsInByb21wdCIsIm9wdGlvbnMiLCJtYXhUb2tlbnMiLCJudW1fcHJlZGljdCIsInRlbXBlcmF0dXJlIiwibmF0aXZlIiwicmVzcG9uc2VGb3JtYXQiLCJ0eXBlIiwiZm9ybWF0IiwiT2JqZWN0Iiwia2V5cyIsInN0cmVhbSIsInBheWxvYWQiLCJtYXhfdG9rZW5zIiwicmVzcG9uc2VfZm9ybWF0IiwidG9TdHJpbmciLCJjYWNoZSIsInRpbWVvdXQiLCJ0aW1lb3V0TXMiLCJwYXJzZWQiLCJzYWZlUGFyc2UiLCJzdWNjZXNzIiwicmVzdWx0IiwiZGF0YSIsInNvdXJjZXMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLElBQUksUUFBTyxvQkFBb0I7QUFDdkMsU0FBUUMsQ0FBQyxRQUFPLE1BQU07QUFDdEIsU0FBUUMsOEJBQThCLEVBQUVDLDhCQUE4QixRQUFPLCtCQUErQjtBQUc1RyxNQUFNQyxPQUFPSCxFQUFFSSxNQUFNLEdBQUdDLE1BQU0sQ0FBQyxDQUFDQyxRQUFVQyxRQUFRRCxNQUFNRSxJQUFJO0FBQzVELE1BQU1DLFVBQVVULEVBQUVVLE1BQU0sQ0FBQztJQUN2QkMsU0FBU1I7SUFDVFMsZUFBZVosRUFBRWEsSUFBSSxHQUFHQyxRQUFRO0lBQ2hDQyxTQUFTZixFQUFFZ0IsS0FBSyxDQUFDO1FBQUNoQixFQUFFYSxJQUFJO1FBQUliLEVBQUVpQixPQUFPLENBQUM7S0FBSSxFQUFFSCxRQUFRO0lBQ3BESSxNQUFNbEIsRUFBRWlCLE9BQU8sQ0FBQztJQUNoQkUsWUFBWW5CLEVBQUVvQixLQUFLLENBQUNwQixFQUFFcUIsT0FBTyxJQUFJQyxHQUFHLENBQUMsR0FBR1IsUUFBUTtBQUNsRDtBQUNBLE1BQU1TLFlBQVl2QixFQUFFVSxNQUFNLENBQUM7SUFBQ2MsTUFBTXhCLEVBQUVpQixPQUFPLENBQUM7SUFBT1EsYUFBYXpCLEVBQUVpQixPQUFPLENBQUM7SUFBU1MsT0FBTzFCLEVBQUUyQixLQUFLLEdBQUdiLFFBQVE7QUFBRTtBQUM5RyxNQUFNYyxZQUFZTCxVQUFVTSxNQUFNLENBQUM7SUFBQ0MsVUFBVTNCO0FBQUk7QUFDbEQsTUFBTTRCLFVBQVVSLFVBQVVNLE1BQU0sQ0FBQztJQUFDcEI7QUFBTztBQUN6QyxNQUFNdUIsYUFBYWhDLEVBQUVVLE1BQU0sQ0FBQztJQUFDdUIsU0FBU2pDLEVBQUVvQixLQUFLLENBQUNwQixFQUFFVSxNQUFNLENBQUM7UUFBQ3dCLGVBQWVsQyxF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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nlabs/reaktor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"description": "GraphQL and ArangoDB application platform for typed actions, authentication, billing, media, messaging, and realtime services.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"type": "module",
|