@anansi/core 0.22.2 → 0.22.4

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/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.22.4](/github.com/ntucker/anansi/compare/@anansi/core@0.22.3...@anansi/core@0.22.4) (2026-01-10)
7
+
8
+ ### 📦 Package
9
+
10
+ * Update all non-major dependencies ([#2930](/github.com/ntucker/anansi/issues/2930)) ([6162e2b](/github.com/ntucker/anansi/commit/6162e2bfff24989e670d57e62ec93d6a1d42d839))
11
+
12
+ ## [0.22.3](/github.com/ntucker/anansi/compare/@anansi/core@0.22.2...@anansi/core@0.22.3) (2026-01-02)
13
+
14
+ ### 💅 Enhancement
15
+
16
+ * Improve webpack proxy handling ([0413bc6](/github.com/ntucker/anansi/commit/0413bc6ff3ea9eb107d4ca5259c21e1b7efef29c))
17
+
18
+ ### 📝 Documentation
19
+
20
+ * Update readme ([b42d500](/github.com/ntucker/anansi/commit/b42d50069157979ac2c21fce92c4750f3219461a))
21
+
6
22
  ## [0.22.2](/github.com/ntucker/anansi/compare/@anansi/core@0.22.1...@anansi/core@0.22.2) (2025-12-31)
7
23
 
8
24
  ### 🐛 Bug Fix
package/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # @anansi/core
2
2
 
3
- <!--[![CircleCI](https://circleci.com/gh/notwillk/pojo-router.svg?style=shield)](https://circleci.com/gh/notwillk/pojo-router)-->
4
-
5
3
  [![npm downloads](https://img.shields.io/npm/dm/@anansi/core.svg?style=flat-square)](https://www.npmjs.com/package/@anansi/core)
6
4
  [![bundle size](https://img.shields.io/bundlephobia/minzip/@anansi/core?style=flat-square)](https://bundlephobia.com/result?p=@anansi/core)
7
5
  [![npm version](https://img.shields.io/npm/v/@anansi/core.svg?style=flat-square)](https://www.npmjs.com/package/@anansi/core)
@@ -12,106 +10,404 @@
12
10
  > Out came the sun, and dried up all the rain,
13
11
  > and the itsy bitsy spider went up the spout again
14
12
 
15
- ## Entry
13
+ React 19 framework with streaming SSR support, built on a composable "spouts" architecture.
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ yarn add @anansi/core
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ Anansi uses a dual-entry pattern for SSR: one entry for the server and one for the client.
16
24
 
17
25
  ```bash
18
- yarn start-anansi./src/index.tsx
26
+ yarn start-anansi ./src/index.tsx
19
27
  ```
20
28
 
21
- This script uses two entry points for client/server.
29
+ This automatically uses `./src/index.tsx` for the client and `./src/index.server.tsx` for the server.
30
+
31
+ ## Concepts
32
+
33
+ ### Spouts
34
+
35
+ Spouts are composable middleware for building React applications. They handle concerns like routing, data fetching, document structure, and more.
22
36
 
23
- <details open><summary>index.server.tsx</summary>
37
+ - **Server**: `laySpouts()` - Lays out the spouts for SSR, streaming React to the response
38
+ - **Client**: `floodSpouts()` - Hydrates the application on the client
39
+
40
+ The spout pattern allows you to compose functionality in a declarative, nested structure where each spout can:
41
+ - Inject props to downstream spouts
42
+ - Wrap the rendered application with providers
43
+ - Serialize data for hydration
44
+
45
+ ## Entry Points
46
+
47
+ ### Client Entry (`index.tsx`)
24
48
 
25
49
  ```tsx
26
50
  import { useController } from '@data-client/react';
27
51
  import {
28
- laySpouts,
52
+ floodSpouts,
29
53
  documentSpout,
30
54
  dataClientSpout,
31
- prefetchSpout,
32
55
  routerSpout,
33
56
  JSONSpout,
34
57
  appSpout,
35
- } from '@anansi/core/server';
36
-
37
- import app from 'app';
58
+ navigatorSpout,
59
+ } from '@anansi/core';
38
60
 
61
+ import App from './App';
39
62
  import { createRouter } from './routing';
40
63
 
41
- const spouts = prefetchSpout('controller')(
42
- documentSpout({ title: 'anansi' })(
43
- JSONSpout()(
64
+ const spouts = documentSpout({ title: 'My App' })(
65
+ JSONSpout()(
66
+ navigatorSpout()(
44
67
  dataClientSpout()(
45
68
  routerSpout({ useResolveWith: useController, createRouter })(
46
- appSpout(app),
69
+ appSpout(<App />),
47
70
  ),
48
71
  ),
49
72
  ),
50
73
  ),
51
74
  );
52
75
 
53
- export default laySpouts(spouts);
76
+ floodSpouts(spouts);
54
77
  ```
55
78
 
56
- </details>
57
-
58
- <details open><summary>index.tsx</summary>
79
+ ### Server Entry (`index.server.tsx`)
59
80
 
60
81
  ```tsx
61
82
  import { useController } from '@data-client/react';
62
83
  import {
63
- floodSpouts,
84
+ laySpouts,
64
85
  documentSpout,
65
86
  dataClientSpout,
87
+ prefetchSpout,
66
88
  routerSpout,
67
89
  JSONSpout,
68
90
  appSpout,
69
- } from '@anansi/core';
70
-
71
- import app from 'app';
91
+ navigatorSpout,
92
+ } from '@anansi/core/server';
72
93
 
94
+ import App from './App';
73
95
  import { createRouter } from './routing';
74
96
 
75
- const appSpout = () => Promise.resolve({ app });
76
-
77
- const spouts = documentSpout({ title: 'anansi' })(
78
- JSONSpout()(
79
- dataClientSpout()(
80
- routerSpout({ useResolveWith: useController, createRouter })(
81
- appSpout(app),
97
+ const spouts = prefetchSpout('controller')(
98
+ documentSpout({ title: 'My App' })(
99
+ JSONSpout()(
100
+ navigatorSpout()(
101
+ dataClientSpout()(
102
+ routerSpout({ useResolveWith: useController, createRouter })(
103
+ appSpout(<App />),
104
+ ),
105
+ ),
82
106
  ),
83
107
  ),
84
108
  ),
85
109
  );
86
110
 
87
- floodSpouts(spouts);
111
+ export default laySpouts(spouts);
112
+ ```
113
+
114
+ ## Spouts Reference
115
+
116
+ ### appSpout
117
+
118
+ The innermost spout that wraps your React application.
119
+
120
+ ```tsx
121
+ import { appSpout } from '@anansi/core';
122
+
123
+ appSpout(<App />)
124
+ ```
125
+
126
+ ### documentSpout
127
+
128
+ Generates the HTML document structure with proper asset loading.
129
+
130
+ ```tsx
131
+ import { documentSpout } from '@anansi/core';
132
+
133
+ documentSpout({
134
+ title: 'My App', // Page title
135
+ head?: ReactNode, // Additional head elements
136
+ lang?: string, // HTML lang attribute (default: undefined)
137
+ rootId?: string, // Root element ID (default: 'anansi-root')
138
+ charSet?: string, // Character set (default: 'utf-8')
139
+ csPolicy?: CSPolicy, // Content Security Policy
140
+ })
141
+ ```
142
+
143
+ #### Content Security Policy
144
+
145
+ The `csPolicy` option configures CSP headers. In production, it sets `Content-Security-Policy`; in development, it uses `Content-Security-Policy-Report-Only`.
146
+
147
+ ```tsx
148
+ const csPolicy = {
149
+ 'base-uri': "'self'",
150
+ 'object-src': "'none'",
151
+ 'script-src': ["'self'", "'unsafe-inline'"],
152
+ 'style-src': ["'unsafe-inline'", "'self'"],
153
+ };
154
+
155
+ documentSpout({ title: 'My App', csPolicy })
88
156
  ```
89
157
 
90
- </details>
158
+ Nonces are automatically injected into `script-src` for inline scripts.
159
+
160
+ ### routerSpout
91
161
 
92
- Anansi can quickly traverse spouts setup by a user.
162
+ Integrates [@anansi/router](https://github.com/ntucker/anansi/tree/master/packages/router) for client-side navigation.
93
163
 
94
- The server lays the spouts for anansi to travel in. Once delivered to the client, the spouts can be flooded (hydration).
164
+ ```tsx
165
+ import { routerSpout } from '@anansi/core';
166
+
167
+ routerSpout({
168
+ useResolveWith: () => any, // Hook returning data passed to route resolvers
169
+ createRouter: (history) => RouteController, // Router factory function
170
+ onChange?: (update, callback) => void, // Client-only: navigation callback
171
+ })
172
+ ```
95
173
 
96
- In both cases, we need the route and application data.
174
+ **Provides to downstream spouts:**
175
+ - `matchedRoutes` - Array of matched route objects
176
+ - `router` - RouteController instance
177
+ - `searchParams` - URLSearchParams from the current URL
97
178
 
179
+ ### dataClientSpout
180
+
181
+ Integrates [@data-client/react](https://dataclient.io) for data fetching with automatic SSR hydration.
182
+
183
+ ```tsx
184
+ import { dataClientSpout } from '@anansi/core';
185
+
186
+ dataClientSpout({
187
+ getManagers?: () => Manager[], // Custom managers (default: [NetworkManager])
188
+ })
189
+ ```
190
+
191
+ Server-side, it creates a persisted store and serializes state for hydration. Client-side, it hydrates from the serialized state.
192
+
193
+ ### JSONSpout
194
+
195
+ Serializes data from upstream spouts into `<script type="application/json">` tags for hydration.
196
+
197
+ ```tsx
198
+ import { JSONSpout } from '@anansi/core';
199
+
200
+ JSONSpout({
201
+ id?: string, // Base ID for script tags (default: 'anansi-json')
202
+ })
203
+ ```
204
+
205
+ ### navigatorSpout
206
+
207
+ Provides browser navigator-like properties (language preferences) that work on both server and client.
208
+
209
+ ```tsx
210
+ import { navigatorSpout, useNavigator } from '@anansi/core';
211
+
212
+ // In spouts config
213
+ navigatorSpout()
214
+
215
+ // In components
216
+ function MyComponent() {
217
+ const { language, languages } = useNavigator();
218
+ // language: string - Primary language (e.g., 'en-US')
219
+ // languages: readonly string[] - All accepted languages by preference
220
+ }
221
+ ```
98
222
 
99
- ## Scripts
223
+ ### prefetchSpout (Server Only)
224
+
225
+ Prefetches route data before rendering. Must wrap `routerSpout`.
226
+
227
+ ```tsx
228
+ import { prefetchSpout } from '@anansi/core/server';
229
+
230
+ // 'controller' is the field name from dataClientSpout to use for resolving routes
231
+ prefetchSpout('controller')(
232
+ // ... other spouts including routerSpout
233
+ )
234
+ ```
235
+
236
+ This calls `route.resolveData()` and `route.component.preload()` for all matched routes before SSR.
237
+
238
+ ### antdSpout (Ant Design)
239
+
240
+ Integrates Ant Design's CSS-in-JS with SSR support.
241
+
242
+ ```tsx
243
+ // Client
244
+ import { antdSpout } from '@anansi/core/antd';
245
+
246
+ // Server
247
+ import { antdSpout } from '@anansi/core/antd/server';
248
+
249
+ antdSpout()
250
+ ```
251
+
252
+ ## Core Functions
253
+
254
+ ### laySpouts (Server)
255
+
256
+ Wraps spouts for server-side rendering with streaming support.
257
+
258
+ ```tsx
259
+ import { laySpouts } from '@anansi/core/server';
260
+
261
+ export default laySpouts(spouts, {
262
+ timeoutMS?: number, // SSR timeout (default: 10000)
263
+ onError?: (error) => void, // Error callback
264
+ });
265
+ ```
266
+
267
+ Returns a render function compatible with Express: `(clientManifest, req, res) => Promise<void>`
268
+
269
+ ### floodSpouts (Client)
270
+
271
+ Hydrates the application on the client.
272
+
273
+ ```tsx
274
+ import { floodSpouts } from '@anansi/core';
275
+
276
+ floodSpouts(spouts, {
277
+ rootId?: string, // Root element ID (default: 'anansi-root')
278
+ });
279
+ ```
280
+
281
+ ## CLI Commands
282
+
283
+ ### start-anansi
284
+
285
+ Development server with hot module replacement for both client and server.
286
+
287
+ ```bash
288
+ yarn start-anansi ./src/index.tsx
289
+ ```
290
+
291
+ Features:
292
+ - Dual webpack compilation (client + server)
293
+ - In-memory filesystem for fast rebuilds
294
+ - Hot reloading for both bundles
295
+ - Automatic SSR on all non-asset routes
296
+ - Proxy support from webpack devServer config
297
+
298
+ ### serve-anansi
299
+
300
+ Production server for pre-built applications.
301
+
302
+ ```bash
303
+ yarn serve-anansi ./dist-server/App.js
304
+ ```
305
+
306
+ ## Scripts API
307
+
308
+ For programmatic usage:
309
+
310
+ ```ts
311
+ import { serve, devServe } from '@anansi/core/scripts';
312
+ ```
100
313
 
101
314
  ### serve(entry, options?)
102
315
 
316
+ Starts a production server.
317
+
318
+ ```ts
319
+ serve('./dist-server/App.js', {
320
+ serveAssets?: boolean, // Serve static assets (default: false)
321
+ serveProxy?: boolean, // Enable proxy from webpack config (default: false)
322
+ });
323
+ ```
324
+
325
+ **Environment Variables:**
326
+ - `PORT` - Server port (default: 8080)
327
+ - `WEBPACK_PUBLIC_PATH` - Public path for assets
328
+
329
+ #### Options
330
+
331
+ | Option | Type | Description |
332
+ |--------|------|-------------|
333
+ | `serveAssets` | `boolean` | Serve static assets from the build output. Useful for local validation; use a dedicated HTTP server in production. |
334
+ | `serveProxy` | `boolean` | Enable proxying based on webpack devServer config. Useful for local validation; use a reverse proxy in production. |
335
+
336
+ ### devServe(entry, env?)
337
+
338
+ Starts a development server with HMR.
339
+
340
+ ```ts
341
+ devServe('./src/index.tsx', {
342
+ // Additional env variables passed to webpack config
343
+ });
344
+ ```
345
+
346
+ ## Types
347
+
348
+ ### ServerProps
349
+
350
+ Props available to server-side spouts:
351
+
352
+ ```ts
353
+ interface ServerProps {
354
+ req: Request | IncomingMessage;
355
+ res: Response | ServerResponse;
356
+ clientManifest: StatsCompilation;
357
+ nonce: string;
358
+ }
359
+ ```
360
+
361
+ ### Spout Types
362
+
103
363
  ```ts
104
- import { serve } from '@anansi/core/scripts';
364
+ import type { Spout, ServerProps, NavigatorProperties } from '@anansi/core';
365
+ ```
366
+
367
+ ### CSPolicy
368
+
369
+ Content Security Policy configuration:
105
370
 
106
- serve('./dist-server/App.js');
371
+ ```ts
372
+ interface CSPolicy {
373
+ [directive: string]: string | string[];
374
+ }
107
375
  ```
108
376
 
109
- #### serveAssets: boolean
377
+ ## Exports
378
+
379
+ ### `@anansi/core`
380
+
381
+ Client-side exports:
382
+
383
+ - `floodSpouts` - Hydrate the application
384
+ - `documentSpout` - Document structure
385
+ - `dataClientSpout` - Data Client integration
386
+ - `routerSpout` - Router integration
387
+ - `JSONSpout` - JSON serialization for hydration
388
+ - `appSpout` - Application wrapper
389
+ - `navigatorSpout` - Navigator properties
390
+ - `useNavigator` - Hook for navigator properties
391
+
392
+ ### `@anansi/core/server`
393
+
394
+ Server-side exports (all client exports plus):
395
+
396
+ - `laySpouts` - SSR render function
397
+ - `prefetchSpout` - Route data prefetching
398
+ - `CSPolicy` - CSP type
399
+
400
+ ### `@anansi/core/scripts`
401
+
402
+ Build/dev scripts:
403
+
404
+ - `serve` - Production server
405
+ - `devServe` - Development server
406
+
407
+ ### `@anansi/core/antd`
110
408
 
111
- Serves static assets. This is typically useful when validating server builds locally; but you
112
- typically want to use a dedicated HTTP server for static assets in production.
409
+ Ant Design integration (client-side).
113
410
 
114
- #### serveProxy: boolean
411
+ ### `@anansi/core/antd/server`
115
412
 
116
- Proxy requested based on webpack config devConfig. Useful for validating server builds locally.
117
- In production it is much more performant to use a separate reverse proxy.
413
+ Ant Design integration (server-side).
@@ -0,0 +1,17 @@
1
+ import type { ProxyConfigArray } from 'webpack-dev-server';
2
+ /**
3
+ * Extracts route patterns from webpack-dev-server proxy configuration.
4
+ *
5
+ * Handles the webpack-dev-server proxy array format:
6
+ * ```
7
+ * proxy: [
8
+ * { context: ['/api'], target: 'http://localhost:3000' },
9
+ * { context: '/ws', target: 'http://localhost:3001' },
10
+ * { path: '/legacy', target: 'http://localhost:3002' },
11
+ * ]
12
+ * ```
13
+ *
14
+ * @see https://webpack.js.org/configuration/dev-server/#devserverproxy
15
+ */
16
+ export declare function extractProxyRoutes(proxy: ProxyConfigArray | undefined): string[];
17
+ //# sourceMappingURL=proxyUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxyUtils.d.ts","sourceRoot":"","sources":["../../src/scripts/proxyUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAClC,MAAM,EAAE,CAgBV"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Extracts route patterns from webpack-dev-server proxy configuration.
3
+ *
4
+ * Handles the webpack-dev-server proxy array format:
5
+ * ```
6
+ * proxy: [
7
+ * { context: ['/api'], target: 'http://localhost:3000' },
8
+ * { context: '/ws', target: 'http://localhost:3001' },
9
+ * { path: '/legacy', target: 'http://localhost:3002' },
10
+ * ]
11
+ * ```
12
+ *
13
+ * @see https://webpack.js.org/configuration/dev-server/#devserverproxy
14
+ */
15
+ export function extractProxyRoutes(proxy) {
16
+ if (!proxy) return [];
17
+ return proxy.filter(item => typeof item === 'object' && item !== null).flatMap(item => {
18
+ // webpack-dev-server proxy supports both 'context' and 'path' properties
19
+ // and each can be a string or an array of strings
20
+ const context = item.context ?? item.path;
21
+ if (Array.isArray(context)) return context;
22
+ if (typeof context === 'string') return [context];
23
+ return [];
24
+ });
25
+ }
26
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRyYWN0UHJveHlSb3V0ZXMiLCJwcm94eSIsImZpbHRlciIsIml0ZW0iLCJmbGF0TWFwIiwiY29udGV4dCIsInBhdGgiLCJBcnJheSIsImlzQXJyYXkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9wcm94eVV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJveHlDb25maWdBcnJheSB9IGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbi8qKlxuICogRXh0cmFjdHMgcm91dGUgcGF0dGVybnMgZnJvbSB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBIYW5kbGVzIHRoZSB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgYXJyYXkgZm9ybWF0OlxuICogYGBgXG4gKiBwcm94eTogW1xuICogICB7IGNvbnRleHQ6IFsnL2FwaSddLCB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAnIH0sXG4gKiAgIHsgY29udGV4dDogJy93cycsIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMScgfSxcbiAqICAgeyBwYXRoOiAnL2xlZ2FjeScsIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMicgfSxcbiAqIF1cbiAqIGBgYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93ZWJwYWNrLmpzLm9yZy9jb25maWd1cmF0aW9uL2Rldi1zZXJ2ZXIvI2RldnNlcnZlcnByb3h5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UHJveHlSb3V0ZXMoXG4gIHByb3h5OiBQcm94eUNvbmZpZ0FycmF5IHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nW10ge1xuICBpZiAoIXByb3h5KSByZXR1cm4gW107XG5cbiAgcmV0dXJuIHByb3h5XG4gICAgLmZpbHRlcihcbiAgICAgIChpdGVtKTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCxcbiAgICApXG4gICAgLmZsYXRNYXAoaXRlbSA9PiB7XG4gICAgICAvLyB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgc3VwcG9ydHMgYm90aCAnY29udGV4dCcgYW5kICdwYXRoJyBwcm9wZXJ0aWVzXG4gICAgICAvLyBhbmQgZWFjaCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgY29uc3QgY29udGV4dCA9IGl0ZW0uY29udGV4dCA/PyBpdGVtLnBhdGg7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0KSkgcmV0dXJuIGNvbnRleHQgYXMgc3RyaW5nW107XG4gICAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSByZXR1cm4gW2NvbnRleHRdO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTQSxrQkFBa0JBLENBQ2hDQyxLQUFtQyxFQUN6QjtFQUNWLElBQUksQ0FBQ0EsS0FBSyxFQUFFLE9BQU8sRUFBRTtFQUVyQixPQUFPQSxLQUFLLENBQ1RDLE1BQU0sQ0FDSkMsSUFBSSxJQUNILE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUlBLElBQUksS0FBSyxJQUN6QyxDQUFDLENBQ0FDLE9BQU8sQ0FBQ0QsSUFBSSxJQUFJO0lBQ2Y7SUFDQTtJQUNBLE1BQU1FLE9BQU8sR0FBR0YsSUFBSSxDQUFDRSxPQUFPLElBQUlGLElBQUksQ0FBQ0csSUFBSTtJQUN6QyxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0gsT0FBTyxDQUFDLEVBQUUsT0FBT0EsT0FBTztJQUMxQyxJQUFJLE9BQU9BLE9BQU8sS0FBSyxRQUFRLEVBQUUsT0FBTyxDQUFDQSxPQUFPLENBQUM7SUFDakQsT0FBTyxFQUFFO0VBQ1gsQ0FBQyxDQUFDO0FBQ04iLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Extracts route patterns from webpack-dev-server proxy configuration.
3
+ *
4
+ * Handles the webpack-dev-server proxy array format:
5
+ * ```
6
+ * proxy: [
7
+ * { context: ['/api'], target: 'http://localhost:3000' },
8
+ * { context: '/ws', target: 'http://localhost:3001' },
9
+ * { path: '/legacy', target: 'http://localhost:3002' },
10
+ * ]
11
+ * ```
12
+ *
13
+ * @see https://webpack.js.org/configuration/dev-server/#devserverproxy
14
+ */
15
+ export function extractProxyRoutes(proxy) {
16
+ if (!proxy) return [];
17
+ return proxy.filter(item => typeof item === 'object' && item !== null).flatMap(item => {
18
+ // webpack-dev-server proxy supports both 'context' and 'path' properties
19
+ // and each can be a string or an array of strings
20
+ const context = item.context ?? item.path;
21
+ if (Array.isArray(context)) return context;
22
+ if (typeof context === 'string') return [context];
23
+ return [];
24
+ });
25
+ }
26
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRyYWN0UHJveHlSb3V0ZXMiLCJwcm94eSIsImZpbHRlciIsIml0ZW0iLCJmbGF0TWFwIiwiY29udGV4dCIsInBhdGgiLCJBcnJheSIsImlzQXJyYXkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9wcm94eVV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJveHlDb25maWdBcnJheSB9IGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbi8qKlxuICogRXh0cmFjdHMgcm91dGUgcGF0dGVybnMgZnJvbSB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBIYW5kbGVzIHRoZSB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgYXJyYXkgZm9ybWF0OlxuICogYGBgXG4gKiBwcm94eTogW1xuICogICB7IGNvbnRleHQ6IFsnL2FwaSddLCB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAnIH0sXG4gKiAgIHsgY29udGV4dDogJy93cycsIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMScgfSxcbiAqICAgeyBwYXRoOiAnL2xlZ2FjeScsIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMicgfSxcbiAqIF1cbiAqIGBgYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93ZWJwYWNrLmpzLm9yZy9jb25maWd1cmF0aW9uL2Rldi1zZXJ2ZXIvI2RldnNlcnZlcnByb3h5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UHJveHlSb3V0ZXMoXG4gIHByb3h5OiBQcm94eUNvbmZpZ0FycmF5IHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nW10ge1xuICBpZiAoIXByb3h5KSByZXR1cm4gW107XG5cbiAgcmV0dXJuIHByb3h5XG4gICAgLmZpbHRlcihcbiAgICAgIChpdGVtKTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCxcbiAgICApXG4gICAgLmZsYXRNYXAoaXRlbSA9PiB7XG4gICAgICAvLyB3ZWJwYWNrLWRldi1zZXJ2ZXIgcHJveHkgc3VwcG9ydHMgYm90aCAnY29udGV4dCcgYW5kICdwYXRoJyBwcm9wZXJ0aWVzXG4gICAgICAvLyBhbmQgZWFjaCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgY29uc3QgY29udGV4dCA9IGl0ZW0uY29udGV4dCA/PyBpdGVtLnBhdGg7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0KSkgcmV0dXJuIGNvbnRleHQgYXMgc3RyaW5nW107XG4gICAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSByZXR1cm4gW2NvbnRleHRdO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTQSxrQkFBa0JBLENBQ2hDQyxLQUFtQyxFQUN6QjtFQUNWLElBQUksQ0FBQ0EsS0FBSyxFQUFFLE9BQU8sRUFBRTtFQUVyQixPQUFPQSxLQUFLLENBQ1RDLE1BQU0sQ0FDSkMsSUFBSSxJQUNILE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUlBLElBQUksS0FBSyxJQUN6QyxDQUFDLENBQ0FDLE9BQU8sQ0FBQ0QsSUFBSSxJQUFJO0lBQ2Y7SUFDQTtJQUNBLE1BQU1FLE9BQU8sR0FBR0YsSUFBSSxDQUFDRSxPQUFPLElBQUlGLElBQUksQ0FBQ0csSUFBSTtJQUN6QyxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0gsT0FBTyxDQUFDLEVBQUUsT0FBT0EsT0FBTztJQUMxQyxJQUFJLE9BQU9BLE9BQU8sS0FBSyxRQUFRLEVBQUUsT0FBTyxDQUFDQSxPQUFPLENBQUM7SUFDakQsT0FBTyxFQUFFO0VBQ1gsQ0FBQyxDQUFDO0FBQ04iLCJpZ25vcmVMaXN0IjpbXX0=
@@ -15,6 +15,7 @@ import WebpackDevServer from 'webpack-dev-server';
15
15
  import 'cross-fetch/dist/node-polyfill.js';
16
16
  import { createHybridRequire } from './createHybridRequire.js';
17
17
  import { getWebpackConfig } from './getWebpackConfig.js';
18
+ import { extractProxyRoutes } from './proxyUtils.js';
18
19
  import { getErrorStatus, renderErrorPage } from './ssrErrorHandler.js';
19
20
  // run directly from node
20
21
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -171,7 +172,7 @@ export default async function startDevServer(entrypoint, env = {}) {
171
172
  if (!devServer) {
172
173
  throw new Error('webpack-dev-server is not defined');
173
174
  }
174
- const otherRoutes = [process.env.WEBPACK_PUBLIC_PATH, ...(webpackConfigs[0].devServer?.proxy?.filter(proxy => typeof proxy === 'object')?.flatMap(proxy => proxy.context) ?? [])];
175
+ const otherRoutes = [process.env.WEBPACK_PUBLIC_PATH, ...extractProxyRoutes(webpackConfigs[0].devServer?.proxy)];
175
176
  // serve SSR for non-WEBPACK_PUBLIC_PATH
176
177
  devServer.app?.get(new RegExp(`^(?!${otherRoutes.join('|')})`), handleErrors(async function (req, res) {
177
178
  if (req.url.endsWith('favicon.ico')) {
@@ -243,4 +244,4 @@ export default async function startDevServer(entrypoint, env = {}) {
243
244
  });
244
245
  runServer();
245
246
  }
246
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJnZXRFcnJvclN0YXR1cyIsInJlbmRlckVycm9yUGFnZSIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJfbmV4dCIsImV4cHJlc3NSZXMiLCJoZWFkZXJzU2VudCIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwic2hvd1N0YWNrIiwiYmFkZ2UiLCJoaW50IiwiaW5pdFJlbmRlciIsInJlbmRlciIsImFyZ3MiLCJwdXNoIiwiaW1wb3J0UmVuZGVyIiwic3RhdHMiLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5mbyIsImNsaWVudE1hbmlmZXN0IiwidGhlbiIsImJ1ZiIsInRvU3RyaW5nIiwia2V5cyIsImNhY2hlIiwiZm9yRWFjaCIsImRlZmF1bHQiLCJiaW5kIiwidW5kZWZpbmVkIiwiaW5pdCIsImUiLCJkZXZTZXJ2ZXIiLCJkZXZNaWRkbGV3YXJlIiwib3V0cHV0RmlsZVN5c3RlbSIsInNldHVwTWlkZGxld2FyZXMiLCJtaWRkbGV3YXJlcyIsIkVycm9yIiwib3RoZXJSb3V0ZXMiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwicHJveHkiLCJmaWx0ZXIiLCJmbGF0TWFwIiwiY29udGV4dCIsImFwcCIsImdldCIsIlJlZ0V4cCIsImVuZHNXaXRoIiwic29ja2V0Iiwib24iLCJjb2RlIiwicnVuU2VydmVyIiwic3RhcnQiLCJob29rcyIsImRvbmUiLCJ0YXAiLCJtdWx0aVN0YXRzIiwiZmluZGVyIiwiZmlsZVRleHQiLCJ0ZXh0Um93cyIsInNwbGl0IiwibWF0Y2giLCJzdGFjayIsIm1hdGNoQWxsIiwicm93IiwiTnVtYmVyIiwicGFyc2VJbnQiLCJjb2wiLCJiYXNlbmFtZSIsIndyaXRlRmlsZVN5bmMiLCJzdG9wU2VydmVyIiwic3RvcCIsIndhcm4iXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9zdGFydERldnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5PYmplY3QuaGFzT3duID1cbiAgT2JqZWN0Lmhhc093biB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG4gIH07XG5pbXBvcnQgdHlwZSB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBjcmVhdGVGc0Zyb21Wb2x1bWUsIFZvbHVtZSB9IGZyb20gJ21lbWZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHNvdXJjZU1hcFN1cHBvcnQgZnJvbSAnc291cmNlLW1hcC1zdXBwb3J0JztcbmltcG9ydCB0bXAgZnJvbSAndG1wJztcbmltcG9ydCB7IHVmcyB9IGZyb20gJ3VuaW9uZnMnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgd2VicGFjaywgeyB0eXBlIENvbmZpZ3VyYXRpb24sIHR5cGUgTXVsdGlDb25maWd1cmF0aW9uIH0gZnJvbSAnd2VicGFjayc7XG5pbXBvcnQgbG9nZ2luZyBmcm9tICd3ZWJwYWNrL2xpYi9sb2dnaW5nL3J1bnRpbWUuanMnO1xuaW1wb3J0IFdlYnBhY2tEZXZTZXJ2ZXIgZnJvbSAnd2VicGFjay1kZXYtc2VydmVyJztcblxuaW1wb3J0ICdjcm9zcy1mZXRjaC9kaXN0L25vZGUtcG9seWZpbGwuanMnO1xuaW1wb3J0IHsgY3JlYXRlSHlicmlkUmVxdWlyZSB9IGZyb20gJy4vY3JlYXRlSHlicmlkUmVxdWlyZS5qcyc7XG5pbXBvcnQgeyBnZXRXZWJwYWNrQ29uZmlnIH0gZnJvbSAnLi9nZXRXZWJwYWNrQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldEVycm9yU3RhdHVzLCByZW5kZXJFcnJvclBhZ2UgfSBmcm9tICcuL3NzckVycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBCb3VuZFJlbmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBydW4gZGlyZWN0bHkgZnJvbSBub2RlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogc3RhcnQtYW5hbnNpIDxlbnRyeXBvaW50LWZpbGU+YCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHN0YXJ0RGV2U2VydmVyKGVudHJ5cG9pbnQpO1xufVxuXG5sZXQgc2VydmVyRmlsZUNvbnRlbnRzOiBQcm9taXNlPHN0cmluZz4gPSBQcm9taXNlLnJlc29sdmUoJycpO1xubGV0IHNlcnZlckVudHJ5ID0gJyc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKFxuICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gIGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbikge1xuICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja0NvbmZpZygpO1xuXG4gIGNvbnN0IGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhbmFuc2ktZGV2c2VydmVyJyk7XG5cbiAgLy8gU2V0IHVwIGluIG1lbW9yeSBmaWxlc3lzdGVtXG4gIGNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbiAgY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbiAgdWZzLnVzZShkaXNrRnMpLnVzZShmcyBhcyBhbnkpO1xuXG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUh5YnJpZFJlcXVpcmUodWZzKTtcblxuICBjb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xuICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG4gIGZ1bmN0aW9uIGhvdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gICAgY29uc3QgZ2VuZXJhdGVkRW50cnlwb2ludCA9IHRtcC5maWxlU3luYyh7IHBvc3RmaXg6ICcuanMnIH0pO1xuICAgIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgICAgYFxuICBpbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbiAgaWYgKGltcG9ydC5tZXRhLndlYnBhY2tIb3QpIHtcbiAgICBpbXBvcnQubWV0YS53ZWJwYWNrSG90LmFjY2VwdCgpO1xuICB9XG5cbiAgZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gICAgYCxcbiAgICApO1xuICAgIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xuICB9XG5cbiAgY29uc3Qgd2VicGFja0NvbmZpZ3M6IENvbmZpZ3VyYXRpb25bXSA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXTtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyBhcyB1bmtub3duIGFzIE11bHRpQ29uZmlndXJhdGlvbik7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgX25leHQ6IE5leHRGdW5jdGlvbixcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmbihyZXEsIHJlcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoJ1NTUiByZW5kZXJpbmcgZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICAgIC8vIFJldHVybiBlcnJvciByZXNwb25zZSB3aXRoIHN0YXR1cyBmcm9tIGVycm9yIGlmIGF2YWlsYWJsZVxuICAgICAgICBjb25zdCBleHByZXNzUmVzID0gcmVzIGFzIGFueTtcbiAgICAgICAgaWYgKCFleHByZXNzUmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IGdldEVycm9yU3RhdHVzKGVycm9yKTtcbiAgICAgICAgICBleHByZXNzUmVzLnN0YXR1cyhzdGF0dXNDb2RlKTtcbiAgICAgICAgICBleHByZXNzUmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc2VuZChcbiAgICAgICAgICAgIHJlbmRlckVycm9yUGFnZShlcnJvciwgcmVxLnVybCA/PyAnLycsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICAgICAgc2hvd1N0YWNrOiB0cnVlLFxuICAgICAgICAgICAgICBiYWRnZTogJ0RFViBNT0RFJyxcbiAgICAgICAgICAgICAgaGludDogJ1RoZSBkZXYgc2VydmVyIGlzIHN0aWxsIHJ1bm5pbmcuIEZpeCB0aGUgZXJyb3IgYW5kIHJldHJ5LCBvciBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBkZXRhaWxzLicsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGxldCBpbml0UmVuZGVyOlxuICAgIHwgeyBhcmdzOiBQYXJhbWV0ZXJzPEJvdW5kUmVuZGVyPjsgcmVzb2x2ZTogKCkgPT4gdm9pZCB9W11cbiAgICB8IHVuZGVmaW5lZCA9IFtdO1xuICBsZXQgcmVuZGVyOiBCb3VuZFJlbmRlciA9ICguLi5hcmdzKSA9PlxuICAgIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaW5pdFJlbmRlcj8ucHVzaCh7IGFyZ3MsIHJlc29sdmUgfSk7XG4gICAgfSk7XG5cbiAgZnVuY3Rpb24gaW1wb3J0UmVuZGVyKHN0YXRzOiB3ZWJwYWNrLlN0YXRzW10pIHtcbiAgICBjb25zdCBbY2xpZW50U3RhdHMsIHNlcnZlclN0YXRzXSA9IHN0YXRzO1xuICAgIGlmIChcbiAgICAgIGNsaWVudFN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGggfHxcbiAgICAgIHNlcnZlclN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGhcbiAgICApIHtcbiAgICAgIGxvZy5lcnJvcignRXJyb3JzIGZvciBjbGllbnQgYnVpbGQ6ICcgKyBjbGllbnRTdGF0cy5jb21waWxhdGlvbi5lcnJvcnMpO1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIHNlcnZlciBidWlsZDogJyArIHNlcnZlclN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICAvLyBmaXJzdCB0aW1lLCByYXRoZXIgdGhhbiByZS1yZW5kZXJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGluaXRSZW5kZXIpKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IoJ0Fib3ZlIGNvbXBpbGVyIGVycm9ycyBibG9ja2luZyByZWxvYWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oJ0xhdW5jaGluZyBTU1InKTtcbiAgICB9XG5cbiAgICAvLyBBU1NFVFNcbiAgICBjb25zdCBjbGllbnRNYW5pZmVzdCA9IGNsaWVudFN0YXRzLnRvSnNvbigpO1xuXG4gICAgc2VydmVyRW50cnkgPSBnZXRTZXJ2ZXJCdW5kbGUoc2VydmVyU3RhdHMpO1xuICAgIHNlcnZlckZpbGVDb250ZW50cyA9IHJlYWRGaWxlKHNlcnZlckVudHJ5KS50aGVuKGJ1ZiA9PiBidWYudG9TdHJpbmcoKSk7XG4gICAgLy8gcmVsb2FkIG1vZHVsZXNcbiAgICBPYmplY3Qua2V5cyhmc1JlcXVpcmUuY2FjaGUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGRlbGV0ZSBmc1JlcXVpcmUuY2FjaGVba2V5XTtcbiAgICB9KTtcbiAgICByZW5kZXIgPSAoZnNSZXF1aXJlKHNlcnZlckVudHJ5KSBhcyBhbnkpLmRlZmF1bHQuYmluZChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsaWVudE1hbmlmZXN0LFxuICAgICk7XG4gICAgLy8gU0VSVkVSIFNJREUgRU5UUllQT0lOVFxuICAgIGlmIChBcnJheS5pc0FycmF5KGluaXRSZW5kZXIpKSB7XG4gICAgICBpbml0UmVuZGVyLmZvckVhY2goYXN5bmMgaW5pdCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nLmluZm8oJ1Jlc29sdmluZyBxdWV1ZWQgcmVxdWVzdHMnKTtcbiAgICAgICAgICBhd2FpdCByZW5kZXIoLi4uaW5pdC5hcmdzKTtcbiAgICAgICAgICBpbml0LnJlc29sdmUoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy5lcnJvcignRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIHJlbmRlciBxdWV1ZWQgcmVxdWVzdHMnKTtcbiAgICAgICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaW5pdFJlbmRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXZTZXJ2ZXIgPSBuZXcgV2VicGFja0RldlNlcnZlcihcbiAgICAvLyB3cml0ZSB0byBtZW1vcnkgZmlsZXN5c3RlbSBzbyB3ZSBjYW4gaW1wb3J0XG4gICAge1xuICAgICAgLi4ud2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyLFxuICAgICAgZGV2TWlkZGxld2FyZToge1xuICAgICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXT8uZGV2U2VydmVyPy5kZXZNaWRkbGV3YXJlLFxuICAgICAgICBvdXRwdXRGaWxlU3lzdGVtOiB7XG4gICAgICAgICAgLi4uZnMsXG4gICAgICAgICAgam9pbjogcGF0aC5qb2luIGFzIGFueSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9LFxuICAgICAgc2V0dXBNaWRkbGV3YXJlczogKG1pZGRsZXdhcmVzLCBkZXZTZXJ2ZXIpID0+IHtcbiAgICAgICAgaWYgKCFkZXZTZXJ2ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dlYnBhY2stZGV2LXNlcnZlciBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3RoZXJSb3V0ZXMgPSBbXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCxcbiAgICAgICAgICAuLi4od2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyPy5wcm94eVxuICAgICAgICAgICAgPy5maWx0ZXIocHJveHkgPT4gdHlwZW9mIHByb3h5ID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgID8uZmxhdE1hcChwcm94eSA9PiBwcm94eS5jb250ZXh0KSA/PyBbXSksXG4gICAgICAgIF07XG4gICAgICAgIC8vIHNlcnZlIFNTUiBmb3Igbm9uLVdFQlBBQ0tfUFVCTElDX1BBVEhcbiAgICAgICAgZGV2U2VydmVyLmFwcD8uZ2V0KFxuICAgICAgICAgIG5ldyBSZWdFeHAoYF4oPyEke290aGVyUm91dGVzLmpvaW4oJ3wnKX0pYCksXG4gICAgICAgICAgaGFuZGxlRXJyb3JzKGFzeW5jIGZ1bmN0aW9uIChyZXE6IGFueSwgcmVzOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChyZXEudXJsLmVuZHNXaXRoKCdmYXZpY29uLmljbycpKSB7XG4gICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgIHJlcy5zZW5kKCdub3QgZm91bmQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnNvY2tldC5vbignZXJyb3InLCAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgbG9nLmVycm9yKCdGYXRhbDonLCBlcnJvcik7XG4gICAgICAgICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRUNPTk5SRVNFVCcpIHtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAnRUNPTk5SRVNFVCBpcyB1c3VhbGx5IGR1ZSB0byBicm93c2VyIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24nLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCByZW5kZXIocmVxLCByZXMpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnNldHVwTWlkZGxld2FyZXMpIHtcbiAgICAgICAgICByZXR1cm4gd2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyLnNldHVwTWlkZGxld2FyZXMoXG4gICAgICAgICAgICBtaWRkbGV3YXJlcyxcbiAgICAgICAgICAgIGRldlNlcnZlcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmVzO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbXBpbGVyLFxuICApO1xuICBjb25zdCBydW5TZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZGV2U2VydmVyLnN0YXJ0KCk7XG4gICAgZGV2U2VydmVyLmNvbXBpbGVyLmhvb2tzLmRvbmUudGFwKFxuICAgICAgJ0FuYW5zaSBTZXJ2ZXInLFxuICAgICAgKG11bHRpU3RhdHM6IHdlYnBhY2suTXVsdGlTdGF0cyB8IHdlYnBhY2suU3RhdHMpID0+IHtcbiAgICAgICAgaWYgKCFtdWx0aVN0YXRzKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdzdGF0cyBub3Qgc2VuZCcpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIU9iamVjdC5oYXNPd24obXVsdGlTdGF0cywgJ3N0YXRzJykpIHJldHVybjtcbiAgICAgICAgaWYgKChtdWx0aVN0YXRzIGFzIHdlYnBhY2suTXVsdGlTdGF0cykuc3RhdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbXBvcnRSZW5kZXIoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHNlcnZlIGVudHJ5cG9pbnQnKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbmRlciA9IG5ldyBSZWdFeHAoYCR7c2VydmVyRW50cnl9OihbXFxcXGRdKyk6KFtcXFxcZF0rKWAsICdnJyk7XG4gICAgICAgICAgICBzZXJ2ZXJGaWxlQ29udGVudHMudGhlbihmaWxlVGV4dCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRleHRSb3dzID0gZmlsZVRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJz4+PiBTdGFjayBDb250ZXh0IFtzZXJ2ZSBlbnRyeXBvaW50XSA8PDwnKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBlLnN0YWNrLm1hdGNoQWxsKGZpbmRlcikgPz8gW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IE51bWJlci5wYXJzZUludChtYXRjaFsyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHBhdGguYmFzZW5hbWUoc2VydmVyRW50cnkpICsgJyAnICsgcm93ICsgJzonICsgY29sKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93IC0gMl0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAxXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKEFycmF5KGNvbCkuam9pbignICcpICsgJ14nKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93XSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyArIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRpc2tGcy53cml0ZUZpbGVTeW5jKHNlcnZlckVudHJ5LCBmaWxlVGV4dCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdPbmx5IGNvbXBpbGVyIG9uZSBzdGF0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcbiAgY29uc3Qgc3RvcFNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBsb2cuaW5mbygnU3RvcHBpbmcgc2VydmVyLi4uJyk7XG4gICAgYXdhaXQgZGV2U2VydmVyLnN0b3AoKTtcbiAgICBsb2cuaW5mbygnU2VydmVyIGNsb3NlZCcpO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBsb2cud2FybignUmVjZWl2ZWQgU0lHSU5ULCBkZXZzZXJ2ZXIgc2h1dHRpbmcgZG93bicpO1xuICAgIHN0b3BTZXJ2ZXIoKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9KTtcblxuICBydW5TZXJ2ZXIoKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFD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
247
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJleHRyYWN0UHJveHlSb3V0ZXMiLCJnZXRFcnJvclN0YXR1cyIsInJlbmRlckVycm9yUGFnZSIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJfbmV4dCIsImV4cHJlc3NSZXMiLCJoZWFkZXJzU2VudCIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwic2hvd1N0YWNrIiwiYmFkZ2UiLCJoaW50IiwiaW5pdFJlbmRlciIsInJlbmRlciIsImFyZ3MiLCJwdXNoIiwiaW1wb3J0UmVuZGVyIiwic3RhdHMiLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5mbyIsImNsaWVudE1hbmlmZXN0IiwidGhlbiIsImJ1ZiIsInRvU3RyaW5nIiwia2V5cyIsImNhY2hlIiwiZm9yRWFjaCIsImRlZmF1bHQiLCJiaW5kIiwidW5kZWZpbmVkIiwiaW5pdCIsImUiLCJkZXZTZXJ2ZXIiLCJkZXZNaWRkbGV3YXJlIiwib3V0cHV0RmlsZVN5c3RlbSIsInNldHVwTWlkZGxld2FyZXMiLCJtaWRkbGV3YXJlcyIsIkVycm9yIiwib3RoZXJSb3V0ZXMiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwicHJveHkiLCJhcHAiLCJnZXQiLCJSZWdFeHAiLCJlbmRzV2l0aCIsInNvY2tldCIsIm9uIiwiY29kZSIsInJ1blNlcnZlciIsInN0YXJ0IiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsImZpbmRlciIsImZpbGVUZXh0IiwidGV4dFJvd3MiLCJzcGxpdCIsIm1hdGNoIiwic3RhY2siLCJtYXRjaEFsbCIsInJvdyIsIk51bWJlciIsInBhcnNlSW50IiwiY29sIiwiYmFzZW5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHR5cGUgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgdHlwZSBDb25maWd1cmF0aW9uLCB0eXBlIE11bHRpQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUh5YnJpZFJlcXVpcmUgfSBmcm9tICcuL2NyZWF0ZUh5YnJpZFJlcXVpcmUuanMnO1xuaW1wb3J0IHsgZ2V0V2VicGFja0NvbmZpZyB9IGZyb20gJy4vZ2V0V2VicGFja0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0UHJveHlSb3V0ZXMgfSBmcm9tICcuL3Byb3h5VXRpbHMuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JTdGF0dXMsIHJlbmRlckVycm9yUGFnZSB9IGZyb20gJy4vc3NyRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEJvdW5kUmVuZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIHJ1biBkaXJlY3RseSBmcm9tIG5vZGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IGVudHJ5cG9pbnQgPSBwcm9jZXNzLmFyZ3ZbMl07XG5cbiAgaWYgKCFlbnRyeXBvaW50KSB7XG4gICAgY29uc29sZS5sb2coYFVzYWdlOiBzdGFydC1hbmFuc2kgPGVudHJ5cG9pbnQtZmlsZT5gKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc3RhcnREZXZTZXJ2ZXIoZW50cnlwb2ludCk7XG59XG5cbmxldCBzZXJ2ZXJGaWxlQ29udGVudHM6IFByb21pc2U8c3RyaW5nPiA9IFByb21pc2UucmVzb2x2ZSgnJyk7XG5sZXQgc2VydmVyRW50cnkgPSAnJztcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc3RhcnREZXZTZXJ2ZXIoXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuKSB7XG4gIGNvbnN0IHdlYnBhY2tDb25maWcgPSBhd2FpdCBnZXRXZWJwYWNrQ29uZmlnKCk7XG5cbiAgY29uc3QgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2FuYW5zaS1kZXZzZXJ2ZXInKTtcblxuICAvLyBTZXQgdXAgaW4gbWVtb3J5IGZpbGVzeXN0ZW1cbiAgY29uc3Qgdm9sdW1lID0gbmV3IFZvbHVtZSgpO1xuICBjb25zdCBmcyA9IGNyZWF0ZUZzRnJvbVZvbHVtZSh2b2x1bWUpO1xuICB1ZnMudXNlKGRpc2tGcykudXNlKGZzIGFzIGFueSk7XG5cbiAgY29uc3QgZnNSZXF1aXJlID0gY3JlYXRlSHlicmlkUmVxdWlyZSh1ZnMpO1xuXG4gIGNvbnN0IHJlYWRGaWxlID0gcHJvbWlzaWZ5KHVmcy5yZWFkRmlsZSk7XG4gIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUgc28gd2UgY2FuIGhvdCByZWxvYWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb25cbiAgZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvLyBAdHMtaWdub3JlIGZvciBzb21lIHJlYXNvbiBpdCdzIG5vdCBwaWNraW5nIHVwIHRoYXQgb3RoZXIgb3B0aW9ucyBhcmUgb3B0aW9uYWxcbiAgICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gICAgZGlza0ZzLndyaXRlU3luYyhcbiAgICAgIGdlbmVyYXRlZEVudHJ5cG9pbnQuZmQsXG4gICAgICBgXG4gIGltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuICBpZiAoaW1wb3J0Lm1ldGEud2VicGFja0hvdCkge1xuICAgIGltcG9ydC5tZXRhLndlYnBhY2tIb3QuYWNjZXB0KCk7XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBlbnRyeTtcbiAgICBgLFxuICAgICk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZEVudHJ5cG9pbnQ7XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrQ29uZmlnczogQ29uZmlndXJhdGlvbltdID0gW1xuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBob3RFbnRyeShlbnRyeXBvaW50KS5uYW1lLFxuICAgICAgICBuYW1lOiAnY2xpZW50JyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcgfSxcbiAgICApLFxuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBlbnRyeXBvaW50LnJlcGxhY2UoJy50c3gnLCAnLnNlcnZlci50c3gnKSxcbiAgICAgICAgbmFtZTogJ3NlcnZlcicsXG4gICAgICAgIEJST1dTRVJTTElTVF9FTlY6ICdjdXJyZW50IG5vZGUnLFxuICAgICAgfSxcbiAgICAgIHsgbW9kZTogJ2RldmVsb3BtZW50JywgdGFyZ2V0OiAnbm9kZScgfSxcbiAgICApLFxuICBdO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXJcbiAgY29uc3QgY29tcGlsZXIgPSB3ZWJwYWNrKHdlYnBhY2tDb25maWdzIGFzIHVua25vd24gYXMgTXVsdGlDb25maWd1cmF0aW9uKTtcbiAgaWYgKCFjb21waWxlcikge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXInKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc291cmNlTWFwU3VwcG9ydC5pbnN0YWxsKHsgaG9va1JlcXVpcmU6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzOiB3ZWJwYWNrLlN0YXRzKSB7XG4gICAgY29uc3Qgc2VydmVySnNvbiA9IHNlcnZlclN0YXRzLnRvSnNvbih7IGFzc2V0czogdHJ1ZSB9KTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHNlcnZlckpzb24ub3V0cHV0UGF0aCA/PyAnJywgJ3NlcnZlci5qcycpO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZUVycm9yczxcbiAgICBGIGV4dGVuZHMgKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgPihmbjogRikge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICAgICBfbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcignU1NSIHJlbmRlcmluZyBlcnJvcjonLCBlcnJvcik7XG5cbiAgICAgICAgLy8gUmV0dXJuIGVycm9yIHJlc3BvbnNlIHdpdGggc3RhdHVzIGZyb20gZXJyb3IgaWYgYXZhaWxhYmxlXG4gICAgICAgIGNvbnN0IGV4cHJlc3NSZXMgPSByZXMgYXMgYW55O1xuICAgICAgICBpZiAoIWV4cHJlc3NSZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gZ2V0RXJyb3JTdGF0dXMoZXJyb3IpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc3RhdHVzKHN0YXR1c0NvZGUpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgZXhwcmVzc1Jlcy5zZW5kKFxuICAgICAgICAgICAgcmVuZGVyRXJyb3JQYWdlKGVycm9yLCByZXEudXJsID8/ICcvJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgICBzaG93U3RhY2s6IHRydWUsXG4gICAgICAgICAgICAgIGJhZGdlOiAnREVWIE1PREUnLFxuICAgICAgICAgICAgICBoaW50OiAnVGhlIGRldiBzZXJ2ZXIgaXMgc3RpbGwgcnVubmluZy4gRml4IHRoZSBlcnJvciBhbmQgcmV0cnksIG9yIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGRldGFpbHMuJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLmV4dHJhY3RQcm94eVJvdXRlcyh3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5KSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH0pO1xuXG4gIHJ1blNlcnZlcigpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBQSxNQUFNLENBQUNDLE1BQU0sR0FDWEQsTUFBTSxDQUFDQyxNQUFNLElBQ2Is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
@@ -1 +1 @@
1
- {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAmBA,OAAO,mCAAmC,CAAC;AAuB3C,wBAA8B,cAAc,CAC1C,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,iBA4QlC"}
1
+ {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAmBA,OAAO,mCAAmC,CAAC;AAwB3C,wBAA8B,cAAc,CAC1C,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,iBA0QlC"}
@@ -15,6 +15,7 @@ import WebpackDevServer from 'webpack-dev-server';
15
15
  import 'cross-fetch/dist/node-polyfill.js';
16
16
  import { createHybridRequire } from './createHybridRequire.js';
17
17
  import { getWebpackConfig } from './getWebpackConfig.js';
18
+ import { extractProxyRoutes } from './proxyUtils.js';
18
19
  import { getErrorStatus, renderErrorPage } from './ssrErrorHandler.js';
19
20
  // run directly from node
20
21
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -171,7 +172,7 @@ export default async function startDevServer(entrypoint, env = {}) {
171
172
  if (!devServer) {
172
173
  throw new Error('webpack-dev-server is not defined');
173
174
  }
174
- const otherRoutes = [process.env.WEBPACK_PUBLIC_PATH, ...(webpackConfigs[0].devServer?.proxy?.filter(proxy => typeof proxy === 'object')?.flatMap(proxy => proxy.context) ?? [])];
175
+ const otherRoutes = [process.env.WEBPACK_PUBLIC_PATH, ...extractProxyRoutes(webpackConfigs[0].devServer?.proxy)];
175
176
  // serve SSR for non-WEBPACK_PUBLIC_PATH
176
177
  devServer.app?.get(new RegExp(`^(?!${otherRoutes.join('|')})`), handleErrors(async function (req, res) {
177
178
  if (req.url.endsWith('favicon.ico')) {
@@ -243,4 +244,4 @@ export default async function startDevServer(entrypoint, env = {}) {
243
244
  });
244
245
  runServer();
245
246
  }
246
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJnZXRFcnJvclN0YXR1cyIsInJlbmRlckVycm9yUGFnZSIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJfbmV4dCIsImV4cHJlc3NSZXMiLCJoZWFkZXJzU2VudCIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwic2hvd1N0YWNrIiwiYmFkZ2UiLCJoaW50IiwiaW5pdFJlbmRlciIsInJlbmRlciIsImFyZ3MiLCJwdXNoIiwiaW1wb3J0UmVuZGVyIiwic3RhdHMiLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5mbyIsImNsaWVudE1hbmlmZXN0IiwidGhlbiIsImJ1ZiIsInRvU3RyaW5nIiwia2V5cyIsImNhY2hlIiwiZm9yRWFjaCIsImRlZmF1bHQiLCJiaW5kIiwidW5kZWZpbmVkIiwiaW5pdCIsImUiLCJkZXZTZXJ2ZXIiLCJkZXZNaWRkbGV3YXJlIiwib3V0cHV0RmlsZVN5c3RlbSIsInNldHVwTWlkZGxld2FyZXMiLCJtaWRkbGV3YXJlcyIsIkVycm9yIiwib3RoZXJSb3V0ZXMiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwicHJveHkiLCJmaWx0ZXIiLCJmbGF0TWFwIiwiY29udGV4dCIsImFwcCIsImdldCIsIlJlZ0V4cCIsImVuZHNXaXRoIiwic29ja2V0Iiwib24iLCJjb2RlIiwicnVuU2VydmVyIiwic3RhcnQiLCJob29rcyIsImRvbmUiLCJ0YXAiLCJtdWx0aVN0YXRzIiwiZmluZGVyIiwiZmlsZVRleHQiLCJ0ZXh0Um93cyIsInNwbGl0IiwibWF0Y2giLCJzdGFjayIsIm1hdGNoQWxsIiwicm93IiwiTnVtYmVyIiwicGFyc2VJbnQiLCJjb2wiLCJiYXNlbmFtZSIsIndyaXRlRmlsZVN5bmMiLCJzdG9wU2VydmVyIiwic3RvcCIsIndhcm4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9zdGFydERldnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5PYmplY3QuaGFzT3duID1cbiAgT2JqZWN0Lmhhc093biB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG4gIH07XG5pbXBvcnQgdHlwZSB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBjcmVhdGVGc0Zyb21Wb2x1bWUsIFZvbHVtZSB9IGZyb20gJ21lbWZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHNvdXJjZU1hcFN1cHBvcnQgZnJvbSAnc291cmNlLW1hcC1zdXBwb3J0JztcbmltcG9ydCB0bXAgZnJvbSAndG1wJztcbmltcG9ydCB7IHVmcyB9IGZyb20gJ3VuaW9uZnMnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgd2VicGFjaywgeyB0eXBlIENvbmZpZ3VyYXRpb24sIHR5cGUgTXVsdGlDb25maWd1cmF0aW9uIH0gZnJvbSAnd2VicGFjayc7XG5pbXBvcnQgbG9nZ2luZyBmcm9tICd3ZWJwYWNrL2xpYi9sb2dnaW5nL3J1bnRpbWUuanMnO1xuaW1wb3J0IFdlYnBhY2tEZXZTZXJ2ZXIgZnJvbSAnd2VicGFjay1kZXYtc2VydmVyJztcblxuaW1wb3J0ICdjcm9zcy1mZXRjaC9kaXN0L25vZGUtcG9seWZpbGwuanMnO1xuaW1wb3J0IHsgY3JlYXRlSHlicmlkUmVxdWlyZSB9IGZyb20gJy4vY3JlYXRlSHlicmlkUmVxdWlyZS5qcyc7XG5pbXBvcnQgeyBnZXRXZWJwYWNrQ29uZmlnIH0gZnJvbSAnLi9nZXRXZWJwYWNrQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldEVycm9yU3RhdHVzLCByZW5kZXJFcnJvclBhZ2UgfSBmcm9tICcuL3NzckVycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBCb3VuZFJlbmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBydW4gZGlyZWN0bHkgZnJvbSBub2RlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogc3RhcnQtYW5hbnNpIDxlbnRyeXBvaW50LWZpbGU+YCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHN0YXJ0RGV2U2VydmVyKGVudHJ5cG9pbnQpO1xufVxuXG5sZXQgc2VydmVyRmlsZUNvbnRlbnRzOiBQcm9taXNlPHN0cmluZz4gPSBQcm9taXNlLnJlc29sdmUoJycpO1xubGV0IHNlcnZlckVudHJ5ID0gJyc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKFxuICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gIGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbikge1xuICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja0NvbmZpZygpO1xuXG4gIGNvbnN0IGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhbmFuc2ktZGV2c2VydmVyJyk7XG5cbiAgLy8gU2V0IHVwIGluIG1lbW9yeSBmaWxlc3lzdGVtXG4gIGNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbiAgY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbiAgdWZzLnVzZShkaXNrRnMpLnVzZShmcyBhcyBhbnkpO1xuXG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUh5YnJpZFJlcXVpcmUodWZzKTtcblxuICBjb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xuICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG4gIGZ1bmN0aW9uIGhvdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gICAgY29uc3QgZ2VuZXJhdGVkRW50cnlwb2ludCA9IHRtcC5maWxlU3luYyh7IHBvc3RmaXg6ICcuanMnIH0pO1xuICAgIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgICAgYFxuICBpbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbiAgaWYgKGltcG9ydC5tZXRhLndlYnBhY2tIb3QpIHtcbiAgICBpbXBvcnQubWV0YS53ZWJwYWNrSG90LmFjY2VwdCgpO1xuICB9XG5cbiAgZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gICAgYCxcbiAgICApO1xuICAgIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xuICB9XG5cbiAgY29uc3Qgd2VicGFja0NvbmZpZ3M6IENvbmZpZ3VyYXRpb25bXSA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXTtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyBhcyB1bmtub3duIGFzIE11bHRpQ29uZmlndXJhdGlvbik7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgX25leHQ6IE5leHRGdW5jdGlvbixcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmbihyZXEsIHJlcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoJ1NTUiByZW5kZXJpbmcgZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICAgIC8vIFJldHVybiBlcnJvciByZXNwb25zZSB3aXRoIHN0YXR1cyBmcm9tIGVycm9yIGlmIGF2YWlsYWJsZVxuICAgICAgICBjb25zdCBleHByZXNzUmVzID0gcmVzIGFzIGFueTtcbiAgICAgICAgaWYgKCFleHByZXNzUmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IGdldEVycm9yU3RhdHVzKGVycm9yKTtcbiAgICAgICAgICBleHByZXNzUmVzLnN0YXR1cyhzdGF0dXNDb2RlKTtcbiAgICAgICAgICBleHByZXNzUmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc2VuZChcbiAgICAgICAgICAgIHJlbmRlckVycm9yUGFnZShlcnJvciwgcmVxLnVybCA/PyAnLycsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICAgICAgc2hvd1N0YWNrOiB0cnVlLFxuICAgICAgICAgICAgICBiYWRnZTogJ0RFViBNT0RFJyxcbiAgICAgICAgICAgICAgaGludDogJ1RoZSBkZXYgc2VydmVyIGlzIHN0aWxsIHJ1bm5pbmcuIEZpeCB0aGUgZXJyb3IgYW5kIHJldHJ5LCBvciBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBkZXRhaWxzLicsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGxldCBpbml0UmVuZGVyOlxuICAgIHwgeyBhcmdzOiBQYXJhbWV0ZXJzPEJvdW5kUmVuZGVyPjsgcmVzb2x2ZTogKCkgPT4gdm9pZCB9W11cbiAgICB8IHVuZGVmaW5lZCA9IFtdO1xuICBsZXQgcmVuZGVyOiBCb3VuZFJlbmRlciA9ICguLi5hcmdzKSA9PlxuICAgIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaW5pdFJlbmRlcj8ucHVzaCh7IGFyZ3MsIHJlc29sdmUgfSk7XG4gICAgfSk7XG5cbiAgZnVuY3Rpb24gaW1wb3J0UmVuZGVyKHN0YXRzOiB3ZWJwYWNrLlN0YXRzW10pIHtcbiAgICBjb25zdCBbY2xpZW50U3RhdHMsIHNlcnZlclN0YXRzXSA9IHN0YXRzO1xuICAgIGlmIChcbiAgICAgIGNsaWVudFN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGggfHxcbiAgICAgIHNlcnZlclN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGhcbiAgICApIHtcbiAgICAgIGxvZy5lcnJvcignRXJyb3JzIGZvciBjbGllbnQgYnVpbGQ6ICcgKyBjbGllbnRTdGF0cy5jb21waWxhdGlvbi5lcnJvcnMpO1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIHNlcnZlciBidWlsZDogJyArIHNlcnZlclN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICAvLyBmaXJzdCB0aW1lLCByYXRoZXIgdGhhbiByZS1yZW5kZXJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGluaXRSZW5kZXIpKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IoJ0Fib3ZlIGNvbXBpbGVyIGVycm9ycyBibG9ja2luZyByZWxvYWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oJ0xhdW5jaGluZyBTU1InKTtcbiAgICB9XG5cbiAgICAvLyBBU1NFVFNcbiAgICBjb25zdCBjbGllbnRNYW5pZmVzdCA9IGNsaWVudFN0YXRzLnRvSnNvbigpO1xuXG4gICAgc2VydmVyRW50cnkgPSBnZXRTZXJ2ZXJCdW5kbGUoc2VydmVyU3RhdHMpO1xuICAgIHNlcnZlckZpbGVDb250ZW50cyA9IHJlYWRGaWxlKHNlcnZlckVudHJ5KS50aGVuKGJ1ZiA9PiBidWYudG9TdHJpbmcoKSk7XG4gICAgLy8gcmVsb2FkIG1vZHVsZXNcbiAgICBPYmplY3Qua2V5cyhmc1JlcXVpcmUuY2FjaGUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGRlbGV0ZSBmc1JlcXVpcmUuY2FjaGVba2V5XTtcbiAgICB9KTtcbiAgICByZW5kZXIgPSAoZnNSZXF1aXJlKHNlcnZlckVudHJ5KSBhcyBhbnkpLmRlZmF1bHQuYmluZChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNsaWVudE1hbmlmZXN0LFxuICAgICk7XG4gICAgLy8gU0VSVkVSIFNJREUgRU5UUllQT0lOVFxuICAgIGlmIChBcnJheS5pc0FycmF5KGluaXRSZW5kZXIpKSB7XG4gICAgICBpbml0UmVuZGVyLmZvckVhY2goYXN5bmMgaW5pdCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nLmluZm8oJ1Jlc29sdmluZyBxdWV1ZWQgcmVxdWVzdHMnKTtcbiAgICAgICAgICBhd2FpdCByZW5kZXIoLi4uaW5pdC5hcmdzKTtcbiAgICAgICAgICBpbml0LnJlc29sdmUoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy5lcnJvcignRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIHJlbmRlciBxdWV1ZWQgcmVxdWVzdHMnKTtcbiAgICAgICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaW5pdFJlbmRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXZTZXJ2ZXIgPSBuZXcgV2VicGFja0RldlNlcnZlcihcbiAgICAvLyB3cml0ZSB0byBtZW1vcnkgZmlsZXN5c3RlbSBzbyB3ZSBjYW4gaW1wb3J0XG4gICAge1xuICAgICAgLi4ud2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyLFxuICAgICAgZGV2TWlkZGxld2FyZToge1xuICAgICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXT8uZGV2U2VydmVyPy5kZXZNaWRkbGV3YXJlLFxuICAgICAgICBvdXRwdXRGaWxlU3lzdGVtOiB7XG4gICAgICAgICAgLi4uZnMsXG4gICAgICAgICAgam9pbjogcGF0aC5qb2luIGFzIGFueSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9LFxuICAgICAgc2V0dXBNaWRkbGV3YXJlczogKG1pZGRsZXdhcmVzLCBkZXZTZXJ2ZXIpID0+IHtcbiAgICAgICAgaWYgKCFkZXZTZXJ2ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dlYnBhY2stZGV2LXNlcnZlciBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3RoZXJSb3V0ZXMgPSBbXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCxcbiAgICAgICAgICAuLi4od2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyPy5wcm94eVxuICAgICAgICAgICAgPy5maWx0ZXIocHJveHkgPT4gdHlwZW9mIHByb3h5ID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgID8uZmxhdE1hcChwcm94eSA9PiBwcm94eS5jb250ZXh0KSA/PyBbXSksXG4gICAgICAgIF07XG4gICAgICAgIC8vIHNlcnZlIFNTUiBmb3Igbm9uLVdFQlBBQ0tfUFVCTElDX1BBVEhcbiAgICAgICAgZGV2U2VydmVyLmFwcD8uZ2V0KFxuICAgICAgICAgIG5ldyBSZWdFeHAoYF4oPyEke290aGVyUm91dGVzLmpvaW4oJ3wnKX0pYCksXG4gICAgICAgICAgaGFuZGxlRXJyb3JzKGFzeW5jIGZ1bmN0aW9uIChyZXE6IGFueSwgcmVzOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChyZXEudXJsLmVuZHNXaXRoKCdmYXZpY29uLmljbycpKSB7XG4gICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgIHJlcy5zZW5kKCdub3QgZm91bmQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnNvY2tldC5vbignZXJyb3InLCAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgbG9nLmVycm9yKCdGYXRhbDonLCBlcnJvcik7XG4gICAgICAgICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRUNPTk5SRVNFVCcpIHtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAnRUNPTk5SRVNFVCBpcyB1c3VhbGx5IGR1ZSB0byBicm93c2VyIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24nLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCByZW5kZXIocmVxLCByZXMpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnNldHVwTWlkZGxld2FyZXMpIHtcbiAgICAgICAgICByZXR1cm4gd2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyLnNldHVwTWlkZGxld2FyZXMoXG4gICAgICAgICAgICBtaWRkbGV3YXJlcyxcbiAgICAgICAgICAgIGRldlNlcnZlcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmVzO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbXBpbGVyLFxuICApO1xuICBjb25zdCBydW5TZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZGV2U2VydmVyLnN0YXJ0KCk7XG4gICAgZGV2U2VydmVyLmNvbXBpbGVyLmhvb2tzLmRvbmUudGFwKFxuICAgICAgJ0FuYW5zaSBTZXJ2ZXInLFxuICAgICAgKG11bHRpU3RhdHM6IHdlYnBhY2suTXVsdGlTdGF0cyB8IHdlYnBhY2suU3RhdHMpID0+IHtcbiAgICAgICAgaWYgKCFtdWx0aVN0YXRzKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdzdGF0cyBub3Qgc2VuZCcpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIU9iamVjdC5oYXNPd24obXVsdGlTdGF0cywgJ3N0YXRzJykpIHJldHVybjtcbiAgICAgICAgaWYgKChtdWx0aVN0YXRzIGFzIHdlYnBhY2suTXVsdGlTdGF0cykuc3RhdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbXBvcnRSZW5kZXIoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHNlcnZlIGVudHJ5cG9pbnQnKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbmRlciA9IG5ldyBSZWdFeHAoYCR7c2VydmVyRW50cnl9OihbXFxcXGRdKyk6KFtcXFxcZF0rKWAsICdnJyk7XG4gICAgICAgICAgICBzZXJ2ZXJGaWxlQ29udGVudHMudGhlbihmaWxlVGV4dCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRleHRSb3dzID0gZmlsZVRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJz4+PiBTdGFjayBDb250ZXh0IFtzZXJ2ZSBlbnRyeXBvaW50XSA8PDwnKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBlLnN0YWNrLm1hdGNoQWxsKGZpbmRlcikgPz8gW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IE51bWJlci5wYXJzZUludChtYXRjaFsyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHBhdGguYmFzZW5hbWUoc2VydmVyRW50cnkpICsgJyAnICsgcm93ICsgJzonICsgY29sKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93IC0gMl0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAxXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKEFycmF5KGNvbCkuam9pbignICcpICsgJ14nKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93XSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyArIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRpc2tGcy53cml0ZUZpbGVTeW5jKHNlcnZlckVudHJ5LCBmaWxlVGV4dCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdPbmx5IGNvbXBpbGVyIG9uZSBzdGF0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcbiAgY29uc3Qgc3RvcFNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBsb2cuaW5mbygnU3RvcHBpbmcgc2VydmVyLi4uJyk7XG4gICAgYXdhaXQgZGV2U2VydmVyLnN0b3AoKTtcbiAgICBsb2cuaW5mbygnU2VydmVyIGNsb3NlZCcpO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBsb2cud2FybignUmVjZWl2ZWQgU0lHSU5ULCBkZXZzZXJ2ZXIgc2h1dHRpbmcgZG93bicpO1xuICAgIHN0b3BTZXJ2ZXIoKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9KTtcblxuICBydW5TZXJ2ZXIoKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQUEs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
247
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJleHRyYWN0UHJveHlSb3V0ZXMiLCJnZXRFcnJvclN0YXR1cyIsInJlbmRlckVycm9yUGFnZSIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJfbmV4dCIsImV4cHJlc3NSZXMiLCJoZWFkZXJzU2VudCIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwic2hvd1N0YWNrIiwiYmFkZ2UiLCJoaW50IiwiaW5pdFJlbmRlciIsInJlbmRlciIsImFyZ3MiLCJwdXNoIiwiaW1wb3J0UmVuZGVyIiwic3RhdHMiLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5mbyIsImNsaWVudE1hbmlmZXN0IiwidGhlbiIsImJ1ZiIsInRvU3RyaW5nIiwia2V5cyIsImNhY2hlIiwiZm9yRWFjaCIsImRlZmF1bHQiLCJiaW5kIiwidW5kZWZpbmVkIiwiaW5pdCIsImUiLCJkZXZTZXJ2ZXIiLCJkZXZNaWRkbGV3YXJlIiwib3V0cHV0RmlsZVN5c3RlbSIsInNldHVwTWlkZGxld2FyZXMiLCJtaWRkbGV3YXJlcyIsIkVycm9yIiwib3RoZXJSb3V0ZXMiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwicHJveHkiLCJhcHAiLCJnZXQiLCJSZWdFeHAiLCJlbmRzV2l0aCIsInNvY2tldCIsIm9uIiwiY29kZSIsInJ1blNlcnZlciIsInN0YXJ0IiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsImZpbmRlciIsImZpbGVUZXh0IiwidGV4dFJvd3MiLCJzcGxpdCIsIm1hdGNoIiwic3RhY2siLCJtYXRjaEFsbCIsInJvdyIsIk51bWJlciIsInBhcnNlSW50IiwiY29sIiwiYmFzZW5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHR5cGUgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgdHlwZSBDb25maWd1cmF0aW9uLCB0eXBlIE11bHRpQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUh5YnJpZFJlcXVpcmUgfSBmcm9tICcuL2NyZWF0ZUh5YnJpZFJlcXVpcmUuanMnO1xuaW1wb3J0IHsgZ2V0V2VicGFja0NvbmZpZyB9IGZyb20gJy4vZ2V0V2VicGFja0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0UHJveHlSb3V0ZXMgfSBmcm9tICcuL3Byb3h5VXRpbHMuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JTdGF0dXMsIHJlbmRlckVycm9yUGFnZSB9IGZyb20gJy4vc3NyRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEJvdW5kUmVuZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIHJ1biBkaXJlY3RseSBmcm9tIG5vZGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IGVudHJ5cG9pbnQgPSBwcm9jZXNzLmFyZ3ZbMl07XG5cbiAgaWYgKCFlbnRyeXBvaW50KSB7XG4gICAgY29uc29sZS5sb2coYFVzYWdlOiBzdGFydC1hbmFuc2kgPGVudHJ5cG9pbnQtZmlsZT5gKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc3RhcnREZXZTZXJ2ZXIoZW50cnlwb2ludCk7XG59XG5cbmxldCBzZXJ2ZXJGaWxlQ29udGVudHM6IFByb21pc2U8c3RyaW5nPiA9IFByb21pc2UucmVzb2x2ZSgnJyk7XG5sZXQgc2VydmVyRW50cnkgPSAnJztcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc3RhcnREZXZTZXJ2ZXIoXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuKSB7XG4gIGNvbnN0IHdlYnBhY2tDb25maWcgPSBhd2FpdCBnZXRXZWJwYWNrQ29uZmlnKCk7XG5cbiAgY29uc3QgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2FuYW5zaS1kZXZzZXJ2ZXInKTtcblxuICAvLyBTZXQgdXAgaW4gbWVtb3J5IGZpbGVzeXN0ZW1cbiAgY29uc3Qgdm9sdW1lID0gbmV3IFZvbHVtZSgpO1xuICBjb25zdCBmcyA9IGNyZWF0ZUZzRnJvbVZvbHVtZSh2b2x1bWUpO1xuICB1ZnMudXNlKGRpc2tGcykudXNlKGZzIGFzIGFueSk7XG5cbiAgY29uc3QgZnNSZXF1aXJlID0gY3JlYXRlSHlicmlkUmVxdWlyZSh1ZnMpO1xuXG4gIGNvbnN0IHJlYWRGaWxlID0gcHJvbWlzaWZ5KHVmcy5yZWFkRmlsZSk7XG4gIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUgc28gd2UgY2FuIGhvdCByZWxvYWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb25cbiAgZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvLyBAdHMtaWdub3JlIGZvciBzb21lIHJlYXNvbiBpdCdzIG5vdCBwaWNraW5nIHVwIHRoYXQgb3RoZXIgb3B0aW9ucyBhcmUgb3B0aW9uYWxcbiAgICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gICAgZGlza0ZzLndyaXRlU3luYyhcbiAgICAgIGdlbmVyYXRlZEVudHJ5cG9pbnQuZmQsXG4gICAgICBgXG4gIGltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuICBpZiAoaW1wb3J0Lm1ldGEud2VicGFja0hvdCkge1xuICAgIGltcG9ydC5tZXRhLndlYnBhY2tIb3QuYWNjZXB0KCk7XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBlbnRyeTtcbiAgICBgLFxuICAgICk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZEVudHJ5cG9pbnQ7XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrQ29uZmlnczogQ29uZmlndXJhdGlvbltdID0gW1xuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBob3RFbnRyeShlbnRyeXBvaW50KS5uYW1lLFxuICAgICAgICBuYW1lOiAnY2xpZW50JyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcgfSxcbiAgICApLFxuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBlbnRyeXBvaW50LnJlcGxhY2UoJy50c3gnLCAnLnNlcnZlci50c3gnKSxcbiAgICAgICAgbmFtZTogJ3NlcnZlcicsXG4gICAgICAgIEJST1dTRVJTTElTVF9FTlY6ICdjdXJyZW50IG5vZGUnLFxuICAgICAgfSxcbiAgICAgIHsgbW9kZTogJ2RldmVsb3BtZW50JywgdGFyZ2V0OiAnbm9kZScgfSxcbiAgICApLFxuICBdO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXJcbiAgY29uc3QgY29tcGlsZXIgPSB3ZWJwYWNrKHdlYnBhY2tDb25maWdzIGFzIHVua25vd24gYXMgTXVsdGlDb25maWd1cmF0aW9uKTtcbiAgaWYgKCFjb21waWxlcikge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXInKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc291cmNlTWFwU3VwcG9ydC5pbnN0YWxsKHsgaG9va1JlcXVpcmU6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzOiB3ZWJwYWNrLlN0YXRzKSB7XG4gICAgY29uc3Qgc2VydmVySnNvbiA9IHNlcnZlclN0YXRzLnRvSnNvbih7IGFzc2V0czogdHJ1ZSB9KTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHNlcnZlckpzb24ub3V0cHV0UGF0aCA/PyAnJywgJ3NlcnZlci5qcycpO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZUVycm9yczxcbiAgICBGIGV4dGVuZHMgKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgPihmbjogRikge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICAgICBfbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcignU1NSIHJlbmRlcmluZyBlcnJvcjonLCBlcnJvcik7XG5cbiAgICAgICAgLy8gUmV0dXJuIGVycm9yIHJlc3BvbnNlIHdpdGggc3RhdHVzIGZyb20gZXJyb3IgaWYgYXZhaWxhYmxlXG4gICAgICAgIGNvbnN0IGV4cHJlc3NSZXMgPSByZXMgYXMgYW55O1xuICAgICAgICBpZiAoIWV4cHJlc3NSZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gZ2V0RXJyb3JTdGF0dXMoZXJyb3IpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc3RhdHVzKHN0YXR1c0NvZGUpO1xuICAgICAgICAgIGV4cHJlc3NSZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgZXhwcmVzc1Jlcy5zZW5kKFxuICAgICAgICAgICAgcmVuZGVyRXJyb3JQYWdlKGVycm9yLCByZXEudXJsID8/ICcvJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgICBzaG93U3RhY2s6IHRydWUsXG4gICAgICAgICAgICAgIGJhZGdlOiAnREVWIE1PREUnLFxuICAgICAgICAgICAgICBoaW50OiAnVGhlIGRldiBzZXJ2ZXIgaXMgc3RpbGwgcnVubmluZy4gRml4IHRoZSBlcnJvciBhbmQgcmV0cnksIG9yIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGRldGFpbHMuJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLmV4dHJhY3RQcm94eVJvdXRlcyh3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5KSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH0pO1xuXG4gIHJ1blNlcnZlcigpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBQSxNQUFNLENBQUNDLE1BQU0sR0FDWEQsTUFBTSxDQUFDQyxNQUFNLElBQ2IsMEJB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anansi/core",
3
- "version": "0.22.2",
3
+ "version": "0.22.4",
4
4
  "description": "React 19 Framework",
5
5
  "homepage": "https://github.com/ntucker/anansi/tree/master/packages/core#readme",
6
6
  "repository": {
@@ -82,7 +82,7 @@
82
82
  "@types/compression": "1.8.1",
83
83
  "@types/express": "^4.17.17",
84
84
  "@types/node": "^24.0.0",
85
- "@types/react": "19.2.7",
85
+ "@types/react": "19.2.8",
86
86
  "@types/react-dom": "19.2.3",
87
87
  "@types/source-map-support": "0.5.10",
88
88
  "@types/tmp": "0.2.6",
@@ -0,0 +1,89 @@
1
+ import { extractProxyRoutes } from '../proxyUtils';
2
+
3
+ describe('extractProxyRoutes', () => {
4
+ it('should return empty array for undefined proxy', () => {
5
+ expect(extractProxyRoutes(undefined)).toEqual([]);
6
+ });
7
+
8
+ it('should return empty array for empty proxy array', () => {
9
+ expect(extractProxyRoutes([])).toEqual([]);
10
+ });
11
+
12
+ it('should extract context as array of strings', () => {
13
+ const proxy = [{ context: ['/api'], target: 'http://localhost:3000' }];
14
+ expect(extractProxyRoutes(proxy)).toEqual(['/api']);
15
+ });
16
+
17
+ it('should extract multiple contexts from array', () => {
18
+ const proxy = [
19
+ { context: ['/api', '/graphql'], target: 'http://localhost:3000' },
20
+ ];
21
+ expect(extractProxyRoutes(proxy)).toEqual(['/api', '/graphql']);
22
+ });
23
+
24
+ it('should extract context as single string', () => {
25
+ const proxy = [{ context: '/api', target: 'http://localhost:3000' }];
26
+ expect(extractProxyRoutes(proxy)).toEqual(['/api']);
27
+ });
28
+
29
+ it('should extract path property (legacy format)', () => {
30
+ const proxy = [{ path: '/legacy', target: 'http://localhost:3000' }];
31
+ expect(extractProxyRoutes(proxy)).toEqual(['/legacy']);
32
+ });
33
+
34
+ it('should extract path as array', () => {
35
+ const proxy = [
36
+ { path: ['/legacy', '/old-api'], target: 'http://localhost:3000' },
37
+ ];
38
+ expect(extractProxyRoutes(proxy)).toEqual(['/legacy', '/old-api']);
39
+ });
40
+
41
+ it('should prefer context over path', () => {
42
+ const proxy = [
43
+ { context: '/api', path: '/legacy', target: 'http://localhost:3000' },
44
+ ];
45
+ expect(extractProxyRoutes(proxy)).toEqual(['/api']);
46
+ });
47
+
48
+ it('should handle multiple proxy entries', () => {
49
+ const proxy = [
50
+ { context: ['/api'], target: 'http://localhost:3000' },
51
+ { context: '/ws', target: 'http://localhost:3001' },
52
+ { path: '/legacy', target: 'http://localhost:3002' },
53
+ ];
54
+ expect(extractProxyRoutes(proxy)).toEqual(['/api', '/ws', '/legacy']);
55
+ });
56
+
57
+ it('should skip function entries', () => {
58
+ const proxy = [
59
+ { context: ['/api'], target: 'http://localhost:3000' },
60
+ () => ({ context: '/dynamic', target: 'http://localhost:3001' }),
61
+ ];
62
+ // Functions are filtered out since we can't statically analyze them
63
+ expect(extractProxyRoutes(proxy as any)).toEqual(['/api']);
64
+ });
65
+
66
+ it('should skip entries without context or path', () => {
67
+ const proxy = [
68
+ { context: ['/api'], target: 'http://localhost:3000' },
69
+ { target: 'http://localhost:3001', router: {} }, // router-based proxy without context
70
+ ];
71
+ expect(extractProxyRoutes(proxy)).toEqual(['/api']);
72
+ });
73
+
74
+ it('should handle null entries gracefully', () => {
75
+ const proxy = [
76
+ { context: ['/api'], target: 'http://localhost:3000' },
77
+ null as any,
78
+ ];
79
+ expect(extractProxyRoutes(proxy)).toEqual(['/api']);
80
+ });
81
+
82
+ it('should handle mixed context types across entries', () => {
83
+ const proxy = [
84
+ { context: ['/api', '/graphql'], target: 'http://localhost:3000' },
85
+ { context: '/ws', target: 'http://localhost:3001' },
86
+ ];
87
+ expect(extractProxyRoutes(proxy)).toEqual(['/api', '/graphql', '/ws']);
88
+ });
89
+ });
@@ -0,0 +1,35 @@
1
+ import type { ProxyConfigArray } from 'webpack-dev-server';
2
+
3
+ /**
4
+ * Extracts route patterns from webpack-dev-server proxy configuration.
5
+ *
6
+ * Handles the webpack-dev-server proxy array format:
7
+ * ```
8
+ * proxy: [
9
+ * { context: ['/api'], target: 'http://localhost:3000' },
10
+ * { context: '/ws', target: 'http://localhost:3001' },
11
+ * { path: '/legacy', target: 'http://localhost:3002' },
12
+ * ]
13
+ * ```
14
+ *
15
+ * @see https://webpack.js.org/configuration/dev-server/#devserverproxy
16
+ */
17
+ export function extractProxyRoutes(
18
+ proxy: ProxyConfigArray | undefined,
19
+ ): string[] {
20
+ if (!proxy) return [];
21
+
22
+ return proxy
23
+ .filter(
24
+ (item): item is Record<string, unknown> =>
25
+ typeof item === 'object' && item !== null,
26
+ )
27
+ .flatMap(item => {
28
+ // webpack-dev-server proxy supports both 'context' and 'path' properties
29
+ // and each can be a string or an array of strings
30
+ const context = item.context ?? item.path;
31
+ if (Array.isArray(context)) return context as string[];
32
+ if (typeof context === 'string') return [context];
33
+ return [];
34
+ });
35
+ }
@@ -20,6 +20,7 @@ import WebpackDevServer from 'webpack-dev-server';
20
20
  import 'cross-fetch/dist/node-polyfill.js';
21
21
  import { createHybridRequire } from './createHybridRequire.js';
22
22
  import { getWebpackConfig } from './getWebpackConfig.js';
23
+ import { extractProxyRoutes } from './proxyUtils.js';
23
24
  import { getErrorStatus, renderErrorPage } from './ssrErrorHandler.js';
24
25
  import { BoundRender } from './types.js';
25
26
 
@@ -216,9 +217,7 @@ export default async function startDevServer(
216
217
 
217
218
  const otherRoutes = [
218
219
  process.env.WEBPACK_PUBLIC_PATH,
219
- ...(webpackConfigs[0].devServer?.proxy
220
- ?.filter(proxy => typeof proxy === 'object')
221
- ?.flatMap(proxy => proxy.context) ?? []),
220
+ ...extractProxyRoutes(webpackConfigs[0].devServer?.proxy),
222
221
  ];
223
222
  // serve SSR for non-WEBPACK_PUBLIC_PATH
224
223
  devServer.app?.get(