valtech-components 2.0.842 → 2.0.844
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -244
- package/esm2022/lib/services/firebase/storage.service.mjs +5 -2
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +5 -2
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/lib/services/firebase/firebase-messaging-sw.js +0 -145
package/README.md
CHANGED
|
@@ -5,28 +5,11 @@
|
|
|
5
5
|
[](https://www.npmjs.com/package/valtech-components)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
|
|
8
|
-
**
|
|
8
|
+
Component library for Angular + Ionic + Capacitor apps. **145 components** and **23+ services** for auth, Firebase, i18n, and more.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
**[Full documentation → ui.myvaltech.com](https://ui.myvaltech.com)**
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
- **134 UI Components** — Atoms, molecules, organisms, and templates ready to use
|
|
15
|
-
- **Authentication System** — Complete auth with OAuth (Google, Apple), session management, and token handling
|
|
16
|
-
- **Firebase Integration** — Analytics, Firestore, Cloud Messaging, and Storage services
|
|
17
|
-
- **i18n with Signals** — Modern internationalization using Angular Signals for reactive translations
|
|
18
|
-
- **Remote App Configuration** — Feature flags and remote config management
|
|
19
|
-
- **Google Ad Manager** — Built-in ad slot integration
|
|
20
|
-
- **User Feedback System** — Collect and manage user feedback
|
|
21
|
-
- **Storybook Documentation** — Interactive component documentation
|
|
22
|
-
|
|
23
|
-
## Technologies
|
|
24
|
-
|
|
25
|
-
- Angular 18+
|
|
26
|
-
- Ionic 8+
|
|
27
|
-
- Capacitor 6+
|
|
28
|
-
- Firebase 10+
|
|
29
|
-
- RxJS 7.8+
|
|
12
|
+
---
|
|
30
13
|
|
|
31
14
|
## Installation
|
|
32
15
|
|
|
@@ -34,35 +17,29 @@ A comprehensive component library for building modern web and hybrid application
|
|
|
34
17
|
npm install valtech-components
|
|
35
18
|
```
|
|
36
19
|
|
|
37
|
-
|
|
20
|
+
**Peer dependencies (required):**
|
|
38
21
|
|
|
39
22
|
```bash
|
|
40
|
-
npm install @angular/
|
|
23
|
+
npm install @angular/common @angular/core @ionic/angular ionicons rxjs
|
|
41
24
|
```
|
|
42
25
|
|
|
43
|
-
Optional
|
|
26
|
+
**Optional — only if you use these features:**
|
|
44
27
|
|
|
45
28
|
```bash
|
|
46
|
-
# Firebase services
|
|
47
|
-
npm install @
|
|
48
|
-
|
|
49
|
-
#
|
|
50
|
-
npm install
|
|
51
|
-
|
|
52
|
-
# Code highlighting
|
|
53
|
-
npm install prismjs
|
|
54
|
-
|
|
55
|
-
# Carousel support
|
|
56
|
-
npm install swiper
|
|
29
|
+
npm install @angular/fire firebase # Firebase services
|
|
30
|
+
npm install @capacitor/app @capacitor/clipboard # Native features
|
|
31
|
+
npm install qr-code-styling # QR code component
|
|
32
|
+
npm install prismjs # Code highlighting
|
|
33
|
+
npm install swiper # Carousel component
|
|
57
34
|
```
|
|
58
35
|
|
|
59
|
-
|
|
36
|
+
---
|
|
60
37
|
|
|
61
|
-
|
|
38
|
+
## Usage
|
|
62
39
|
|
|
63
|
-
### UI
|
|
40
|
+
### UI only (no backend needed)
|
|
64
41
|
|
|
65
|
-
|
|
42
|
+
144 of 145 components work standalone — no Firebase, no backend:
|
|
66
43
|
|
|
67
44
|
```typescript
|
|
68
45
|
import { ButtonComponent, CardComponent, TextComponent } from 'valtech-components';
|
|
@@ -80,11 +57,9 @@ import { ButtonComponent, CardComponent, TextComponent } from 'valtech-component
|
|
|
80
57
|
export class MyComponent {}
|
|
81
58
|
```
|
|
82
59
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
### Full Integration
|
|
60
|
+
### Full integration (auth + Firebase + i18n)
|
|
86
61
|
|
|
87
|
-
|
|
62
|
+
Add providers in `main.ts`:
|
|
88
63
|
|
|
89
64
|
```typescript
|
|
90
65
|
import {
|
|
@@ -99,234 +74,59 @@ bootstrapApplication(AppComponent, {
|
|
|
99
74
|
providers: [
|
|
100
75
|
provideValtechFirebase(createFirebaseConfig(firebaseConfig)),
|
|
101
76
|
provideValtechAuth({ apiUrl: 'https://api.yourapp.com' }),
|
|
102
|
-
provideValtechI18n({ defaultLang: 'en', supportedLangs: ['en', 'es'] }),
|
|
77
|
+
provideValtechI18n({ defaultLang: 'en', supportedLangs: ['en', 'es', 'pt'] }),
|
|
103
78
|
],
|
|
104
79
|
});
|
|
105
80
|
```
|
|
106
81
|
|
|
107
|
-
**[Full Integration Guide](https://ui.myvaltech.com/docs/guides/firebase-setup)** — Firebase setup, Auth configuration, i18n, and more.
|
|
108
|
-
|
|
109
|
-
### Components Requiring Backend
|
|
110
|
-
|
|
111
|
-
| Component | Requirement |
|
|
112
|
-
|-----------|-------------|
|
|
113
|
-
| `LoginComponent` | `AuthService` configured with API endpoint |
|
|
114
|
-
| `ContentReactionComponent` | `FeedbackService` configured with API endpoint |
|
|
115
|
-
|
|
116
|
-
All other 132 components are fully standalone.
|
|
117
|
-
|
|
118
82
|
---
|
|
119
83
|
|
|
120
84
|
## Components
|
|
121
85
|
|
|
122
|
-
| Category | Count |
|
|
123
|
-
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
|
|
|
127
|
-
|
|
|
128
|
-
|
|
129
|
-
> **[View full component catalog](https://ui.myvaltech.com)**
|
|
130
|
-
|
|
131
|
-
## Services
|
|
132
|
-
|
|
133
|
-
### Basic Services (No Configuration Required)
|
|
134
|
-
|
|
135
|
-
These services work out of the box:
|
|
136
|
-
|
|
137
|
-
| Service | Description |
|
|
138
|
-
|---------|-------------|
|
|
139
|
-
| `ThemeService` | Theme management (light/dark mode) |
|
|
140
|
-
| `ToastService` | Toast notifications |
|
|
141
|
-
| `NavigationService` | Routing utilities |
|
|
142
|
-
| `DownloadService` | File download helpers |
|
|
143
|
-
| `IconsService` | Ionicons management |
|
|
144
|
-
| `LocaleService` | Simple locale management with localStorage |
|
|
145
|
-
| `LocalStorageService` | localStorage abstraction |
|
|
146
|
-
| `LinkProcessorService` | Automatic URL and markdown link processing |
|
|
147
|
-
| `InAppBrowserService` | Capacitor in-app browser |
|
|
148
|
-
| `ModalService` | Modal dialog management |
|
|
149
|
-
| `ConfirmationDialogService` | Confirmation dialogs |
|
|
150
|
-
| `QrGeneratorService` | QR code generation |
|
|
151
|
-
| `PresetService` | Reusable configuration presets |
|
|
152
|
-
| `PaginationService` | Pagination state management |
|
|
153
|
-
| `SkeletonService` | Skeleton loading states |
|
|
154
|
-
|
|
155
|
-
### Authentication Services (Requires `provideValtechAuth`)
|
|
156
|
-
|
|
157
|
-
Requires backend API. See [Auth Setup Guide](https://ui.myvaltech.com/docs/guides/auth-setup).
|
|
158
|
-
|
|
159
|
-
| Service | Description |
|
|
160
|
-
|---------|-------------|
|
|
161
|
-
| `AuthService` | Main authentication service |
|
|
162
|
-
| `OAuthService` | OAuth providers (Google, Apple) |
|
|
163
|
-
| `SessionService` | Session management |
|
|
164
|
-
| `TokenService` | JWT token handling |
|
|
165
|
-
| `AuthStateService` | Authentication state management |
|
|
166
|
-
| `DeviceService` | Device information |
|
|
167
|
-
|
|
168
|
-
### Firebase Services (Requires `provideValtechFirebase`)
|
|
169
|
-
|
|
170
|
-
Requires Firebase project. See [Firebase Setup Guide](https://ui.myvaltech.com/docs/guides/firebase-setup).
|
|
171
|
-
|
|
172
|
-
| Service | Description |
|
|
173
|
-
|---------|-------------|
|
|
174
|
-
| `FirebaseService` | Firebase initialization |
|
|
175
|
-
| `AnalyticsService` | Firebase Analytics with custom events |
|
|
176
|
-
| `FirestoreService` | Firestore database operations |
|
|
177
|
-
| `MessagingService` | Cloud Messaging (push notifications) |
|
|
178
|
-
| `NotificationsService` | Notification management |
|
|
179
|
-
| `FirebaseStorageService` | Firebase Storage operations |
|
|
180
|
-
|
|
181
|
-
### i18n Service (Requires `provideValtechI18n`)
|
|
182
|
-
|
|
183
|
-
| Service | Description |
|
|
184
|
-
|---------|-------------|
|
|
185
|
-
| `I18nService` | Internationalization with Angular Signals |
|
|
186
|
-
|
|
187
|
-
### Backend-Dependent Services
|
|
188
|
-
|
|
189
|
-
These services require a configured backend API:
|
|
190
|
-
|
|
191
|
-
| Service | Description |
|
|
192
|
-
|---------|-------------|
|
|
193
|
-
| `AppConfigService` | Remote configuration and feature flags |
|
|
194
|
-
| `FeedbackService` | User feedback collection |
|
|
195
|
-
|
|
196
|
-
## Quick Start
|
|
197
|
-
|
|
198
|
-
### Basic Component Usage
|
|
199
|
-
|
|
200
|
-
```typescript
|
|
201
|
-
import { Component } from '@angular/core';
|
|
202
|
-
import { TextComponent, ButtonComponent, CardComponent } from 'valtech-components';
|
|
203
|
-
|
|
204
|
-
@Component({
|
|
205
|
-
selector: 'app-example',
|
|
206
|
-
standalone: true,
|
|
207
|
-
imports: [TextComponent, ButtonComponent, CardComponent],
|
|
208
|
-
template: `
|
|
209
|
-
<val-card [props]="{ title: 'Welcome' }">
|
|
210
|
-
<val-text [props]="{ content: 'Hello, World!', size: 'medium' }" />
|
|
211
|
-
<val-button
|
|
212
|
-
[props]="{ text: 'Get Started', color: 'primary' }"
|
|
213
|
-
(onClick)="handleClick()"
|
|
214
|
-
/>
|
|
215
|
-
</val-card>
|
|
216
|
-
`
|
|
217
|
-
})
|
|
218
|
-
export class ExampleComponent {
|
|
219
|
-
handleClick() {
|
|
220
|
-
console.log('Button clicked');
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
### i18n with Signals
|
|
86
|
+
| Category | Count | Includes |
|
|
87
|
+
|----------|------:|---------|
|
|
88
|
+
| Atoms | 24 | avatar, button, icon, text, image, skeleton, progress-bar, qr-code… |
|
|
89
|
+
| Molecules | 81 | inputs (text, email, phone, pin, date), cards, tabs, accordion, pagination… |
|
|
90
|
+
| Organisms | 31 | forms, data-table, menu, toolbar, login, comment-section, infinite-list… |
|
|
91
|
+
| Templates | 9 | page-wrapper, page-content, docs-shell, auth-background, maintenance-page… |
|
|
92
|
+
| **Total** | **145** | |
|
|
226
93
|
|
|
227
|
-
|
|
228
|
-
import { Component, inject, computed } from '@angular/core';
|
|
229
|
-
import { I18nService, TextComponent } from 'valtech-components';
|
|
94
|
+
Components requiring a backend API: `LoginComponent`, `ContentReactionComponent`.
|
|
230
95
|
|
|
231
|
-
|
|
232
|
-
selector: 'app-i18n-example',
|
|
233
|
-
standalone: true,
|
|
234
|
-
imports: [TextComponent],
|
|
235
|
-
template: `
|
|
236
|
-
<val-text [props]="{ content: welcomeText() }" />
|
|
237
|
-
`
|
|
238
|
-
})
|
|
239
|
-
export class I18nExampleComponent {
|
|
240
|
-
private i18n = inject(I18nService);
|
|
96
|
+
---
|
|
241
97
|
|
|
242
|
-
|
|
243
|
-
welcomeText = computed(() => this.i18n.t('home.welcome'));
|
|
244
|
-
}
|
|
245
|
-
```
|
|
98
|
+
## Services
|
|
246
99
|
|
|
247
|
-
|
|
100
|
+
**No setup required:**
|
|
101
|
+
`ThemeService` · `ToastService` · `NavigationService` · `DownloadService` · `IconsService` · `LocaleService` · `LocalStorageService` · `ModalService` · `ConfirmationDialogService` · `QrGeneratorService` · `PaginationService` · `SkeletonService`
|
|
248
102
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
import { AuthService } from 'valtech-components';
|
|
103
|
+
**Requires `provideValtechAuth`:**
|
|
104
|
+
`AuthService` · `OAuthService` · `SessionService` · `TokenService` · `AuthStateService` · `DeviceService`
|
|
252
105
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
template: `...`
|
|
256
|
-
})
|
|
257
|
-
export class AuthExampleComponent {
|
|
258
|
-
private auth = inject(AuthService);
|
|
106
|
+
**Requires `provideValtechFirebase`:**
|
|
107
|
+
`FirebaseService` · `AnalyticsService` · `FirestoreService` · `MessagingService` · `NotificationsService` · `FirebaseStorageService`
|
|
259
108
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
}
|
|
109
|
+
**Requires `provideValtechI18n`:**
|
|
110
|
+
`I18nService`
|
|
263
111
|
|
|
264
|
-
|
|
265
|
-
await this.auth.logout();
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
get isAuthenticated() {
|
|
269
|
-
return this.auth.isAuthenticated();
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
```
|
|
112
|
+
---
|
|
273
113
|
|
|
274
|
-
|
|
114
|
+
## Technologies
|
|
275
115
|
|
|
276
|
-
|
|
277
|
-
import { Component, inject } from '@angular/core';
|
|
278
|
-
import { AnalyticsService } from 'valtech-components';
|
|
116
|
+
Angular 18+ · Ionic 8+ · Capacitor 6+ · Firebase 10+ · RxJS 7.8+
|
|
279
117
|
|
|
280
|
-
|
|
281
|
-
selector: 'app-analytics-example',
|
|
282
|
-
template: `...`
|
|
283
|
-
})
|
|
284
|
-
export class AnalyticsExampleComponent {
|
|
285
|
-
private analytics = inject(AnalyticsService);
|
|
286
|
-
|
|
287
|
-
trackEvent() {
|
|
288
|
-
this.analytics.logEvent('button_click', {
|
|
289
|
-
button_name: 'signup',
|
|
290
|
-
page: 'home'
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
```
|
|
118
|
+
---
|
|
295
119
|
|
|
296
120
|
## Development
|
|
297
121
|
|
|
298
|
-
### Prerequisites
|
|
299
|
-
|
|
300
|
-
- Node.js 18+
|
|
301
|
-
- npm 9+
|
|
302
|
-
|
|
303
|
-
### Setup
|
|
304
|
-
|
|
305
122
|
```bash
|
|
306
|
-
# Install dependencies
|
|
307
123
|
npm install
|
|
308
|
-
|
|
309
|
-
#
|
|
310
|
-
npm run
|
|
311
|
-
# Open http://localhost:6006
|
|
124
|
+
npm run storybook # http://localhost:6006
|
|
125
|
+
npm run build # build library
|
|
126
|
+
npm run test # unit tests
|
|
312
127
|
```
|
|
313
128
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
| Command | Description |
|
|
317
|
-
|---------|-------------|
|
|
318
|
-
| `npm run build` | Build the library |
|
|
319
|
-
| `npm run build:prod` | Production build (optimized) |
|
|
320
|
-
| `npm run storybook` | Start Storybook dev server (port 6006) |
|
|
321
|
-
| `npm run build-storybook` | Build static Storybook |
|
|
322
|
-
| `npm run test` | Run unit tests |
|
|
323
|
-
| `npm run prettier` | Format source files |
|
|
324
|
-
|
|
325
|
-
## Documentation
|
|
326
|
-
|
|
327
|
-
For complete documentation, examples, and API reference, visit:
|
|
328
|
-
|
|
329
|
-
**[https://ui.myvaltech.com](https://ui.myvaltech.com)**
|
|
129
|
+
---
|
|
330
130
|
|
|
331
131
|
## License
|
|
332
132
|
|
|
@@ -88,7 +88,10 @@ export class StorageService {
|
|
|
88
88
|
const uploadMetadata = {
|
|
89
89
|
contentType: metadata?.contentType || (file instanceof File ? file.type : undefined),
|
|
90
90
|
customMetadata: metadata?.customMetadata,
|
|
91
|
-
|
|
91
|
+
// Default agresivo: getDownloadURL devuelve URLs con token único por
|
|
92
|
+
// versión del objeto → re-subir el archivo cambia el URL (cache-bust
|
|
93
|
+
// natural). El consumidor puede override pasando cacheControl explícito.
|
|
94
|
+
cacheControl: metadata?.cacheControl ?? 'public, max-age=31536000',
|
|
92
95
|
};
|
|
93
96
|
const task = uploadBytesResumable(storageRef, file, uploadMetadata);
|
|
94
97
|
const progress$ = new BehaviorSubject({
|
|
@@ -481,4 +484,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
481
484
|
type: Injectable,
|
|
482
485
|
args: [{ providedIn: 'root' }]
|
|
483
486
|
}], ctorParameters: () => [{ type: i1.Storage }] });
|
|
484
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9maXJlYmFzZS9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGNBQWMsRUFDZCxXQUFXLEVBQ1gsT0FBTyxFQUNQLEdBQUcsRUFFSCxvQkFBb0IsR0FHckIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7O0FBU25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFFSCxNQUFNLE9BQU8sY0FBYztJQUd6QixZQUFvQixPQUFnQjtRQUFoQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBRjVCLFdBQU0sR0FBRyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU5QixDQUFDO0lBRXhDOzs7Ozs7O09BT0c7SUFDSyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDeEQsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuRCxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxTQUFTO0lBQ1QsOEVBQThFO0lBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0JHO0lBQ0gsTUFBTSxDQUFDLElBQVksRUFBRSxJQUFpQixFQUFFLFFBQTBC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O0lBQy9DLENBQUM7K0dBM2RVLGNBQWM7bUhBQWQsY0FBYyxjQURELE1BQU07OzRGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RvcmFnZSBTZXJ2aWNlXG4gKlxuICogU2VydmljaW8gcGFyYSBvcGVyYWNpb25lcyBkZSBGaXJlYmFzZSBTdG9yYWdlLlxuICogU29wb3J0YSB1cGxvYWQgY29uIHRyYWNraW5nIGRlIHByb2dyZXNvLCBkb3dubG9hZCB5IGdlc3Rpw7NuIGRlIGFyY2hpdm9zLlxuICovXG5cbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgZGVsZXRlT2JqZWN0LFxuICBnZXREb3dubG9hZFVSTCxcbiAgZ2V0TWV0YWRhdGEsXG4gIGxpc3RBbGwsXG4gIHJlZixcbiAgU3RvcmFnZSxcbiAgdXBsb2FkQnl0ZXNSZXN1bWFibGUsXG4gIFVwbG9hZE1ldGFkYXRhLFxuICBVcGxvYWRUYXNrU25hcHNob3QsXG59IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvc3RvcmFnZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9GSVJFQkFTRV9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBTdG9yYWdlTGlzdFJlc3VsdCxcbiAgU3RvcmFnZU1ldGFkYXRhLFxuICBVcGxvYWRQcm9ncmVzcyxcbiAgVXBsb2FkUmVzdWx0LFxuICBVcGxvYWRTdGF0ZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBGaXJlYmFzZSBTdG9yYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRDb21wb25lbnQge1xuICogICBwcml2YXRlIHN0b3JhZ2UgPSBpbmplY3QoU3RvcmFnZVNlcnZpY2UpO1xuICpcbiAqICAgdXBsb2FkUHJvZ3Jlc3MgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAqICAgZG93bmxvYWRVcmwgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gKlxuICogICBhc3luYyBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcbiAqICAgICBjb25zdCBmaWxlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcz8uWzBdO1xuICogICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICpcbiAqICAgICAvLyBVcGxvYWQgY29uIHByb2dyZXNvXG4gKiAgICAgdGhpcy5zdG9yYWdlLnVwbG9hZChgdXBsb2Fkcy8ke2ZpbGUubmFtZX1gLCBmaWxlKS5zdWJzY3JpYmUoe1xuICogICAgICAgbmV4dDogKHByb2dyZXNzKSA9PiB0aGlzLnVwbG9hZFByb2dyZXNzLnNldChwcm9ncmVzcy5wZXJjZW50YWdlKSxcbiAqICAgICAgIGNvbXBsZXRlOiBhc3luYyAoKSA9PiB7XG4gKiAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXREb3dubG9hZFVybChgdXBsb2Fkcy8ke2ZpbGUubmFtZX1gKTtcbiAqICAgICAgICAgdGhpcy5kb3dubG9hZFVybC5zZXQodXJsKTtcbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgU3RvcmFnZVNlcnZpY2Uge1xuICBwcml2YXRlIGNvbmZpZyA9IGluamVjdChWQUxURUNIX0ZJUkVCQVNFX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2UpIHt9XG5cbiAgLyoqXG4gICAqIFByZWZpamEgZWwgcGF0aCBkZSBzdG9yYWdlIGNvbiBlbCBhcHBJZCBzaSBlc3TDoSBjb25maWd1cmFkby5cbiAgICogU2kgbm8gaGF5IGFwcElkIG8gc2tpcFByZWZpeCBlcyB0cnVlLCByZXRvcm5hIGVsIHBhdGggc2luIG1vZGlmaWNhci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIG9yaWdpbmFsXG4gICAqIEBwYXJhbSBza2lwUHJlZml4IC0gU2kgZXMgdHJ1ZSwgbm8gYXBsaWNhIGVsIHByZWZpeCAow7p0aWwgcGFyYSBwYXRocyBjb21wYXJ0aWRvcyBjb21vIGF2YXRhcmVzKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgcHJlZml4U3RvcmFnZVBhdGgocGF0aDogc3RyaW5nLCBza2lwUHJlZml4ID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGlmIChza2lwUHJlZml4IHx8ICF0aGlzLmNvbmZpZz8uYXBwSWQpIHJldHVybiBwYXRoO1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5hcHBJZH0vJHtwYXRofWA7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVBMT0FEXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTdWJlIHVuIGFyY2hpdm8gY29uIHRyYWNraW5nIGRlIHByb2dyZXNvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZW4gU3RvcmFnZSBkb25kZSBndWFyZGFyIGVsIGFyY2hpdm9cbiAgICogQHBhcmFtIGZpbGUgLSBBcmNoaXZvIGEgc3ViaXIgKEZpbGUgbyBCbG9iKVxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBNZXRhZGF0YSBvcGNpb25hbCAoY29udGVudFR5cGUsIGN1c3RvbU1ldGFkYXRhKVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHF1ZSBlbWl0ZSBlbCBwcm9ncmVzbyB5IGNvbXBsZXRhIGN1YW5kbyB0ZXJtaW5hXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXBsb2FkIGLDoXNpY29cbiAgICogc3RvcmFnZS51cGxvYWQoJ2ltYWdlcy9waG90by5qcGcnLCBmaWxlKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChwcm9ncmVzcykgPT4gY29uc29sZS5sb2coYCR7cHJvZ3Jlc3MucGVyY2VudGFnZX0lYCksXG4gICAqICAgY29tcGxldGU6ICgpID0+IGNvbnNvbGUubG9nKCdVcGxvYWQgY29tcGxldGFkbycpXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBDb24gbWV0YWRhdGFcbiAgICogc3RvcmFnZS51cGxvYWQoJ2RvY3MvcmVwb3J0LnBkZicsIGZpbGUsIHtcbiAgICogICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAqICAgY3VzdG9tTWV0YWRhdGE6IHsgdXBsb2FkZWRCeTogJ3VzZXIxMjMnIH1cbiAgICogfSkuc3Vic2NyaWJlKC4uLik7XG4gICAqIGBgYFxuICAgKi9cbiAgdXBsb2FkKHBhdGg6IHN0cmluZywgZmlsZTogRmlsZSB8IEJsb2IsIG1ldGFkYXRhPzogU3RvcmFnZU1ldGFkYXRhKTogT2JzZXJ2YWJsZTxVcGxvYWRQcm9ncmVzcz4ge1xuICAgIGNvbnN0IHByZWZpeGVkUGF0aCA9IHRoaXMucHJlZml4U3RvcmFnZVBhdGgocGF0aCwgbWV0YWRhdGE/LnNraXBQcmVmaXgpO1xuICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwcmVmaXhlZFBhdGgpO1xuICAgIGNvbnN0IHVwbG9hZE1ldGFkYXRhOiBVcGxvYWRNZXRhZGF0YSA9IHtcbiAgICAgIGNvbnRlbnRUeXBlOiBtZXRhZGF0YT8uY29udGVudFR5cGUgfHwgKGZpbGUgaW5zdGFuY2VvZiBGaWxlID8gZmlsZS50eXBlIDogdW5kZWZpbmVkKSxcbiAgICAgIGN1c3RvbU1ldGFkYXRhOiBtZXRhZGF0YT8uY3VzdG9tTWV0YWRhdGEsXG4gICAgICBjYWNoZUNvbnRyb2w6IG1ldGFkYXRhPy5jYWNoZUNvbnRyb2wsXG4gICAgfTtcblxuICAgIGNvbnN0IHRhc2sgPSB1cGxvYWRCeXRlc1Jlc3VtYWJsZShzdG9yYWdlUmVmLCBmaWxlLCB1cGxvYWRNZXRhZGF0YSk7XG4gICAgY29uc3QgcHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVcGxvYWRQcm9ncmVzcz4oe1xuICAgICAgYnl0ZXNUcmFuc2ZlcnJlZDogMCxcbiAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgIHBlcmNlbnRhZ2U6IDAsXG4gICAgICBzdGF0ZTogJ3J1bm5pbmcnLFxuICAgIH0pO1xuXG4gICAgdGFzay5vbihcbiAgICAgICdzdGF0ZV9jaGFuZ2VkJyxcbiAgICAgIChzbmFwc2hvdDogVXBsb2FkVGFza1NuYXBzaG90KSA9PiB7XG4gICAgICAgIHByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICBieXRlc1RyYW5zZmVycmVkOiBzbmFwc2hvdC5ieXRlc1RyYW5zZmVycmVkLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IHNuYXBzaG90LnRvdGFsQnl0ZXMsXG4gICAgICAgICAgcGVyY2VudGFnZTogTWF0aC5yb3VuZCgoc25hcHNob3QuYnl0ZXNUcmFuc2ZlcnJlZCAvIHNuYXBzaG90LnRvdGFsQnl0ZXMpICogMTAwKSxcbiAgICAgICAgICBzdGF0ZTogdGhpcy5tYXBUYXNrU3RhdGUoc25hcHNob3Quc3RhdGUpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIHByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICBieXRlc1RyYW5zZmVycmVkOiAwLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgICAgICBwZXJjZW50YWdlOiAwLFxuICAgICAgICAgIHN0YXRlOiAnZXJyb3InLFxuICAgICAgICB9KTtcbiAgICAgICAgcHJvZ3Jlc3MkLmVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBwcm9ncmVzcyQubmV4dCh7XG4gICAgICAgICAgYnl0ZXNUcmFuc2ZlcnJlZDogZmlsZS5zaXplLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgICAgICBwZXJjZW50YWdlOiAxMDAsXG4gICAgICAgICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHByb2dyZXNzJC5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gcHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmUgdW4gYXJjaGl2byB5IHJldG9ybmEgbGEgVVJMIGRlIGRlc2NhcmdhIGFsIGNvbXBsZXRhci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIGVuIFN0b3JhZ2VcbiAgICogQHBhcmFtIGZpbGUgLSBBcmNoaXZvIGEgc3ViaXJcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gTWV0YWRhdGEgb3BjaW9uYWxcbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCB1cGxvYWQgY29uIFVSTCBkZSBkZXNjYXJnYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UudXBsb2FkQW5kR2V0VXJsKCdhdmF0YXJzL3VzZXIxMjMuanBnJywgZmlsZSk7XG4gICAqIGNvbnNvbGUubG9nKCdVUkw6JywgcmVzdWx0LmRvd25sb2FkVXJsKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB1cGxvYWRBbmRHZXRVcmwoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUgfCBCbG9iLFxuICAgIG1ldGFkYXRhPzogU3RvcmFnZU1ldGFkYXRhXG4gICk6IFByb21pc2U8VXBsb2FkUmVzdWx0PiB7XG4gICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhTdG9yYWdlUGF0aChwYXRoLCBtZXRhZGF0YT8uc2tpcFByZWZpeCk7XG4gICAgY29uc29sZS5sb2coJ1tTdG9yYWdlXSB1cGxvYWRBbmRHZXRVcmwgc3RhcnQ6JywgeyBwYXRoOiBwcmVmaXhlZFBhdGgsIHNpemU6IGZpbGUuc2l6ZSB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy51cGxvYWQocGF0aCwgZmlsZSwgbWV0YWRhdGEpLnN1YnNjcmliZSh7XG4gICAgICAgIGNvbXBsZXRlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwcmVmaXhlZFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgZG93bmxvYWRVcmwgPSBhd2FpdCBnZXREb3dubG9hZFVSTChzdG9yYWdlUmVmKTtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZE1ldGFkYXRhID0gYXdhaXQgZ2V0TWV0YWRhdGEoc3RvcmFnZVJlZik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1N0b3JhZ2VdIHVwbG9hZCBPSzonLCB7XG4gICAgICAgICAgICAgIHBhdGg6IHByZWZpeGVkUGF0aCxcbiAgICAgICAgICAgICAgdXJsOiBkb3dubG9hZFVybC5zbGljZSgwLCA2MCkgKyAn4oCmJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIGRvd25sb2FkVXJsLFxuICAgICAgICAgICAgICBmdWxsUGF0aDogc3RvcmVkTWV0YWRhdGEuZnVsbFBhdGgsXG4gICAgICAgICAgICAgIG5hbWU6IHN0b3JlZE1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICAgIHNpemU6IHN0b3JlZE1ldGFkYXRhLnNpemUsXG4gICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdG9yZWRNZXRhZGF0YS5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHN0b3JlZE1ldGFkYXRhLmN1c3RvbU1ldGFkYXRhIHx8IHt9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTdG9yYWdlXSBnZXREb3dubG9hZFVSTC9tZXRhZGF0YSBmYWlsZWQ6Jywge1xuICAgICAgICAgICAgICBwYXRoOiBwcmVmaXhlZFBhdGgsXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZWplY3QodGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1N0b3JhZ2VdIHVwbG9hZCBmYWlsZWQ6JywgeyBwYXRoOiBwcmVmaXhlZFBhdGgsIGVycm9yIH0pO1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJlIHVuIGFyY2hpdm8gZGVzZGUgdW5hIERhdGEgVVJMIChiYXNlNjQpLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZW4gU3RvcmFnZVxuICAgKiBAcGFyYW0gZGF0YVVybCAtIERhdGEgVVJMIChlajogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwuLi4nKVxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBNZXRhZGF0YSBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBSZXN1bHRhZG8gZGVsIHVwbG9hZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlc2RlIGNhbnZhc1xuICAgKiBjb25zdCBkYXRhVXJsID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UudXBsb2FkRnJvbURhdGFVcmwoJ2ltYWdlcy9kcmF3aW5nLnBuZycsIGRhdGFVcmwpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVwbG9hZEZyb21EYXRhVXJsKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBkYXRhVXJsOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBTdG9yYWdlTWV0YWRhdGFcbiAgKTogUHJvbWlzZTxVcGxvYWRSZXN1bHQ+IHtcbiAgICAvLyBFeHRyYWVyIGNvbnRlbnQgdHlwZSB5IGRhdG9zIGJhc2U2NFxuICAgIGNvbnN0IG1hdGNoZXMgPSBkYXRhVXJsLm1hdGNoKC9eZGF0YTooW147XSspO2Jhc2U2NCwoLispJC8pO1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIFVSTCBpbnbDoWxpZGEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50VHlwZSA9IG1hdGNoZXNbMV07XG4gICAgY29uc3QgYmFzZTY0RGF0YSA9IG1hdGNoZXNbMl07XG5cbiAgICAvLyBDb252ZXJ0aXIgYmFzZTY0IGEgQmxvYlxuICAgIGNvbnN0IGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiYXNlNjREYXRhKTtcbiAgICBjb25zdCBieXRlTnVtYmVycyA9IG5ldyBBcnJheShieXRlQ2hhcmFjdGVycy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUNoYXJhY3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJ5dGVOdW1iZXJzW2ldID0gYnl0ZUNoYXJhY3RlcnMuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnl0ZUFycmF5XSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcblxuICAgIHJldHVybiB0aGlzLnVwbG9hZEFuZEdldFVybChwYXRoLCBibG9iLCB7XG4gICAgICBjb250ZW50VHlwZSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERPV05MT0FEXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIFVSTCBkZSBkZXNjYXJnYSBkZSB1biBhcmNoaXZvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZGVsIGFyY2hpdm8gZW4gU3RvcmFnZVxuICAgKiBAcmV0dXJucyBVUkwgZGUgZGVzY2FyZ2FcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1cmwgPSBhd2FpdCBzdG9yYWdlLmdldERvd25sb2FkVXJsKCdpbWFnZXMvcGhvdG8uanBnJyk7XG4gICAqIC8vIFVzYXIgZW4gPGltZyBbc3JjXT1cInVybFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldERvd25sb2FkVXJsKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByZWZpeGVkUGF0aCA9IHRoaXMucHJlZml4U3RvcmFnZVBhdGgocGF0aCk7XG4gICAgICBjb25zdCBzdG9yYWdlUmVmID0gcmVmKHRoaXMuc3RvcmFnZSwgcHJlZml4ZWRQYXRoKTtcbiAgICAgIHJldHVybiBhd2FpdCBnZXREb3dubG9hZFVSTChzdG9yYWdlUmVmKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgbWV0YWRhdGEgZGUgdW4gYXJjaGl2by5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIGRlbCBhcmNoaXZvXG4gICAqIEByZXR1cm5zIE1ldGFkYXRhIGRlbCBhcmNoaXZvXG4gICAqL1xuICBhc3luYyBnZXRNZXRhZGF0YShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFN0b3JhZ2VNZXRhZGF0YSAmIHsgc2l6ZTogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeFN0b3JhZ2VQYXRoKHBhdGgpO1xuICAgICAgY29uc3Qgc3RvcmFnZVJlZiA9IHJlZih0aGlzLnN0b3JhZ2UsIHByZWZpeGVkUGF0aCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGdldE1ldGFkYXRhKHN0b3JhZ2VSZWYpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudFR5cGU6IG1ldGFkYXRhLmNvbnRlbnRUeXBlLFxuICAgICAgICBjdXN0b21NZXRhZGF0YTogbWV0YWRhdGEuY3VzdG9tTWV0YWRhdGEsXG4gICAgICAgIGNhY2hlQ29udHJvbDogbWV0YWRhdGEuY2FjaGVDb250cm9sLFxuICAgICAgICBzaXplOiBtZXRhZGF0YS5zaXplLFxuICAgICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERFTEVURVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRWxpbWluYSB1biBhcmNoaXZvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZGVsIGFyY2hpdm8gYSBlbGltaW5hclxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHN0b3JhZ2UuZGVsZXRlKCdpbWFnZXMvb2xkLXBob3RvLmpwZycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhTdG9yYWdlUGF0aChwYXRoKTtcbiAgICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwcmVmaXhlZFBhdGgpO1xuICAgICAgYXdhaXQgZGVsZXRlT2JqZWN0KHN0b3JhZ2VSZWYpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBtw7psdGlwbGVzIGFyY2hpdm9zLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aHMgLSBBcnJheSBkZSBydXRhcyBhIGVsaW1pbmFyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgc3RvcmFnZS5kZWxldGVNdWx0aXBsZShbXG4gICAqICAgJ2ltYWdlcy9waG90bzEuanBnJyxcbiAgICogICAnaW1hZ2VzL3Bob3RvMi5qcGcnXG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRlbGV0ZU11bHRpcGxlKHBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHBhdGhzLm1hcChwYXRoID0+IHRoaXMuZGVsZXRlKHBhdGgpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTElTVFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTGlzdGEgYXJjaGl2b3MgZW4gdW4gZGlyZWN0b3Jpby5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIGRlbCBkaXJlY3RvcmlvXG4gICAqIEByZXR1cm5zIExpc3RhIGRlIHJ1dGFzIGRlIGFyY2hpdm9zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5saXN0KCdpbWFnZXMvJyk7XG4gICAqIGNvbnNvbGUubG9nKHJlc3VsdC5pdGVtcyk7IC8vIFsnaW1hZ2VzL3Bob3RvMS5qcGcnLCAnaW1hZ2VzL3Bob3RvMi5qcGcnXVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpc3QocGF0aDogc3RyaW5nKTogUHJvbWlzZTxTdG9yYWdlTGlzdFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeFN0b3JhZ2VQYXRoKHBhdGgpO1xuICAgICAgY29uc3Qgc3RvcmFnZVJlZiA9IHJlZih0aGlzLnN0b3JhZ2UsIHByZWZpeGVkUGF0aCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsaXN0QWxsKHN0b3JhZ2VSZWYpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpdGVtczogcmVzdWx0Lml0ZW1zLm1hcChpdGVtID0+IGl0ZW0uZnVsbFBhdGgpLFxuICAgICAgICBuZXh0UGFnZVRva2VuOiB1bmRlZmluZWQsIC8vIGxpc3RBbGwgbm8gc29wb3J0YSBwYWdpbmFjacOzblxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVUSUxJREFERVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdlbmVyYSB1biBub21icmUgZGUgYXJjaGl2byDDum5pY28gY29uIHRpbWVzdGFtcC5cbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSAtIE5vbWJyZSBvcmlnaW5hbCBkZWwgYXJjaGl2b1xuICAgKiBAcGFyYW0gcHJlZml4IC0gUHJlZmlqbyBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBOb21icmUgw7puaWNvXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdW5pcXVlTmFtZSA9IHN0b3JhZ2UuZ2VuZXJhdGVGaWxlTmFtZSgncGhvdG8uanBnJywgJ3VzZXIxMjMnKTtcbiAgICogLy8gPT4gJ3VzZXIxMjNfMTcwMzA5MTIzNDU2N19waG90by5qcGcnXG4gICAqIGBgYFxuICAgKi9cbiAgZ2VuZXJhdGVGaWxlTmFtZShvcmlnaW5hbE5hbWU6IHN0cmluZywgcHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBvcmlnaW5hbE5hbWUucmVwbGFjZSgvW15hLXpBLVowLTkuLV0vZywgJ18nKTtcblxuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIHJldHVybiBgJHtwcmVmaXh9XyR7dGltZXN0YW1wfV8ke3Nhbml0aXplZE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RpbWVzdGFtcH1fJHtzYW5pdGl6ZWROYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhIHVuYSBydXRhIMO6bmljYSBwYXJhIHVuIGFyY2hpdm8uXG4gICAqXG4gICAqIEBwYXJhbSBkaXJlY3RvcnkgLSBEaXJlY3RvcmlvIGJhc2VcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSAtIE5vbWJyZSBvcmlnaW5hbFxuICAgKiBAcGFyYW0gcHJlZml4IC0gUHJlZmlqbyBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBSdXRhIGNvbXBsZXRhIMO6bmljYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHBhdGggPSBzdG9yYWdlLmdlbmVyYXRlUGF0aCgndXBsb2FkcycsICdwaG90by5qcGcnLCAndXNlcjEyMycpO1xuICAgKiAvLyA9PiAndXBsb2Fkcy91c2VyMTIzXzE3MDMwOTEyMzQ1NjdfcGhvdG8uanBnJ1xuICAgKiBgYGBcbiAgICovXG4gIGdlbmVyYXRlUGF0aChkaXJlY3Rvcnk6IHN0cmluZywgb3JpZ2luYWxOYW1lOiBzdHJpbmcsIHByZWZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmdlbmVyYXRlRmlsZU5hbWUob3JpZ2luYWxOYW1lLCBwcmVmaXgpO1xuICAgIGNvbnN0IGNsZWFuRGlyID0gZGlyZWN0b3J5LnJlcGxhY2UoL1xcLyskLywgJycpOyAvLyBSZW1vdmVyIC8gZmluYWxcbiAgICByZXR1cm4gYCR7Y2xlYW5EaXJ9LyR7ZmlsZU5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGV4dGVuc2nDs24gZGUgdW4gYXJjaGl2by5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVuYW1lIC0gTm9tYnJlIGRlbCBhcmNoaXZvXG4gICAqIEByZXR1cm5zIEV4dGVuc2nDs24gKHNpbiBlbCBwdW50bylcbiAgICovXG4gIGdldEV4dGVuc2lvbihmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IGZpbGVuYW1lLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5wb3AoKSEudG9Mb3dlckNhc2UoKSA6ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGFyY2hpdm8gZXMgdW5hIGltYWdlbiBiYXPDoW5kb3NlIGVuIHN1IGV4dGVuc2nDs24uXG4gICAqL1xuICBpc0ltYWdlKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBleHQgPSB0aGlzLmdldEV4dGVuc2lvbihmaWxlbmFtZSk7XG4gICAgcmV0dXJuIFsnanBnJywgJ2pwZWcnLCAncG5nJywgJ2dpZicsICd3ZWJwJywgJ3N2ZycsICdibXAnXS5pbmNsdWRlcyhleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGFyY2hpdm8gZXMgdW4gZG9jdW1lbnRvLlxuICAgKi9cbiAgaXNEb2N1bWVudChmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXh0ID0gdGhpcy5nZXRFeHRlbnNpb24oZmlsZW5hbWUpO1xuICAgIHJldHVybiBbJ3BkZicsICdkb2MnLCAnZG9jeCcsICd4bHMnLCAneGxzeCcsICdwcHQnLCAncHB0eCcsICd0eHQnXS5pbmNsdWRlcyhleHQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVTRVIgQVZBVEFSIEhFTFBFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENvbnN0cnV5ZSBsYSBVUkwgZGUgYXZhdGFyIGRlIHVuIHVzdWFyaW8uXG4gICAqXG4gICAqIExvcyBhdmF0YXJlcyBzZSBhbG1hY2VuYW4gZW4gcGF0aHMgcHJlZGVjaWJsZXM6IGB1c2Vycy97dXNlcklkfS9hdmF0YXIuanBnYFxuICAgKiBFc3RvIHBlcm1pdGUgcXVlIGN1YWxxdWllciBhcHAgcHVlZGEgbW9zdHJhciBhdmF0YXJlcyBzaW4gcGVkaXIgbGEgVVJMIGFsIGJhY2tlbmQsXG4gICAqIHNvbG8gbmVjZXNpdGEgZWwgdXNlcklkLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIC0gSUQgZGVsIHVzdWFyaW8gKFVMSUQpXG4gICAqIEBwYXJhbSB0eXBlIC0gJ2F2YXRhcicgcGFyYSBpbWFnZW4gY29tcGxldGEsICd0aHVtYicgcGFyYSB0aHVtYm5haWxcbiAgICogQHJldHVybnMgVVJMIGRpcmVjdGEgZGUgRmlyZWJhc2UgU3RvcmFnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIE1vc3RyYXIgYXZhdGFyIGRlIGN1YWxxdWllciB1c3VhcmlvXG4gICAqIGNvbnN0IGF2YXRhclVybCA9IHN0b3JhZ2UuZ2V0VXNlckF2YXRhclVybCgnMDFBQkNELi4uJyk7XG4gICAqIGNvbnN0IHRodW1iVXJsID0gc3RvcmFnZS5nZXRVc2VyQXZhdGFyVXJsKCcwMUFCQ0QuLi4nLCAndGh1bWInKTtcbiAgICpcbiAgICogLy8gQ29uIGNhY2hlLWJ1c3RpbmdcbiAgICogY29uc3QgZnJlc2hVcmwgPSBzdG9yYWdlLmdldFVzZXJBdmF0YXJVcmwodXNlcklkKSArIGAmdD0ke0RhdGUubm93KCl9YDtcbiAgICogYGBgXG4gICAqL1xuICBnZXRVc2VyQXZhdGFyVXJsKHVzZXJJZDogc3RyaW5nLCB0eXBlOiAnYXZhdGFyJyB8ICd0aHVtYicgPSAnYXZhdGFyJyk6IHN0cmluZyB7XG4gICAgY29uc3QgYnVja2V0ID0gdGhpcy5jb25maWc/LmZpcmViYXNlPy5zdG9yYWdlQnVja2V0IHx8ICdteXZhbHRlY2gtZGV2LmZpcmViYXNlc3RvcmFnZS5hcHAnO1xuICAgIGNvbnN0IHBhdGggPSBgdXNlcnMvJHt1c2VySWR9LyR7dHlwZX0uanBnYDtcbiAgICByZXR1cm4gYGh0dHBzOi8vZmlyZWJhc2VzdG9yYWdlLmdvb2dsZWFwaXMuY29tL3YwL2IvJHtidWNrZXR9L28vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9P2FsdD1tZWRpYWA7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTcOJVE9ET1MgUFJJVkFET1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE1hcGVhIGVsIGVzdGFkbyBkZSBsYSB0YXJlYSBkZSB1cGxvYWRcbiAgICovXG4gIHByaXZhdGUgbWFwVGFza1N0YXRlKHN0YXRlOiBzdHJpbmcpOiBVcGxvYWRTdGF0ZSB7XG4gICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgY2FzZSAncnVubmluZyc6XG4gICAgICAgIHJldHVybiAncnVubmluZyc7XG4gICAgICBjYXNlICdwYXVzZWQnOlxuICAgICAgICByZXR1cm4gJ3BhdXNlZCc7XG4gICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgcmV0dXJuICdzdWNjZXNzJztcbiAgICAgIGNhc2UgJ2NhbmNlbGVkJzpcbiAgICAgICAgcmV0dXJuICdjYW5jZWxlZCc7XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHJldHVybiAnZXJyb3InO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdydW5uaW5nJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmllcnRlIGVycm9yZXMgZGUgU3RvcmFnZSBhIG1lbnNhamVzIGVuIGVzcGHDsW9sXG4gICAqL1xuICBwcml2YXRlIGdldEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSAoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGU7XG5cbiAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICBjYXNlICdzdG9yYWdlL29iamVjdC1ub3QtZm91bmQnOlxuICAgICAgICAgIHJldHVybiAnRWwgYXJjaGl2byBubyBleGlzdGUnO1xuICAgICAgICBjYXNlICdzdG9yYWdlL3VuYXV0aG9yaXplZCc6XG4gICAgICAgICAgcmV0dXJuICdObyB0aWVuZXMgcGVybWlzbyBwYXJhIGFjY2VkZXIgYSBlc3RlIGFyY2hpdm8nO1xuICAgICAgICBjYXNlICdzdG9yYWdlL2NhbmNlbGVkJzpcbiAgICAgICAgICByZXR1cm4gJ0xhIG9wZXJhY2nDs24gZnVlIGNhbmNlbGFkYSc7XG4gICAgICAgIGNhc2UgJ3N0b3JhZ2UvcXVvdGEtZXhjZWVkZWQnOlxuICAgICAgICAgIHJldHVybiAnU2UgaGEgZXhjZWRpZG8gbGEgY3VvdGEgZGUgYWxtYWNlbmFtaWVudG8nO1xuICAgICAgICBjYXNlICdzdG9yYWdlL2ludmFsaWQtY2hlY2tzdW0nOlxuICAgICAgICAgIHJldHVybiAnRWwgYXJjaGl2byBlc3TDoSBjb3JydXB0byc7XG4gICAgICAgIGNhc2UgJ3N0b3JhZ2UvcmV0cnktbGltaXQtZXhjZWVkZWQnOlxuICAgICAgICAgIHJldHVybiAnRXJyb3IgZGUgY29uZXhpw7NuLiBJbnRlbnRhIGRlIG51ZXZvJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9pbnZhbGlkLXVybCc6XG4gICAgICAgICAgcmV0dXJuICdVUkwgZGUgYXJjaGl2byBpbnbDoWxpZGEnO1xuICAgICAgICBjYXNlICdzdG9yYWdlL2ludmFsaWQtYXJndW1lbnQnOlxuICAgICAgICAgIHJldHVybiAnQXJndW1lbnRvIGludsOhbGlkbyc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yIGRlIGFsbWFjZW5hbWllbnRvIGRlc2Nvbm9jaWRvJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJ0Vycm9yIGRlIGFsbWFjZW5hbWllbnRvIGRlc2Nvbm9jaWRvJztcbiAgfVxufVxuIl19
|
|
487
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9maXJlYmFzZS9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGNBQWMsRUFDZCxXQUFXLEVBQ1gsT0FBTyxFQUNQLEdBQUcsRUFFSCxvQkFBb0IsR0FHckIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7O0FBU25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFFSCxNQUFNLE9BQU8sY0FBYztJQUd6QixZQUFvQixPQUFnQjtRQUFoQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBRjVCLFdBQU0sR0FBRyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU5QixDQUFDO0lBRXhDOzs7Ozs7O09BT0c7SUFDSyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDeEQsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuRCxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxTQUFTO0lBQ1QsOEVBQThFO0lBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0JHO0lBQ0gsTUFBTSxDQUFDLElBQVksRUFBRSxJQUFpQixFQUFFLFFBQTBC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QXFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLHFDQUFxQyxDQUFDO0lBQy9DLENBQUM7K0dBOWRVLGNBQWM7bUhBQWQsY0FBYyxjQURELE1BQU07OzRGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RvcmFnZSBTZXJ2aWNlXG4gKlxuICogU2VydmljaW8gcGFyYSBvcGVyYWNpb25lcyBkZSBGaXJlYmFzZSBTdG9yYWdlLlxuICogU29wb3J0YSB1cGxvYWQgY29uIHRyYWNraW5nIGRlIHByb2dyZXNvLCBkb3dubG9hZCB5IGdlc3Rpw7NuIGRlIGFyY2hpdm9zLlxuICovXG5cbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgZGVsZXRlT2JqZWN0LFxuICBnZXREb3dubG9hZFVSTCxcbiAgZ2V0TWV0YWRhdGEsXG4gIGxpc3RBbGwsXG4gIHJlZixcbiAgU3RvcmFnZSxcbiAgdXBsb2FkQnl0ZXNSZXN1bWFibGUsXG4gIFVwbG9hZE1ldGFkYXRhLFxuICBVcGxvYWRUYXNrU25hcHNob3QsXG59IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvc3RvcmFnZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9GSVJFQkFTRV9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBTdG9yYWdlTGlzdFJlc3VsdCxcbiAgU3RvcmFnZU1ldGFkYXRhLFxuICBVcGxvYWRQcm9ncmVzcyxcbiAgVXBsb2FkUmVzdWx0LFxuICBVcGxvYWRTdGF0ZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBGaXJlYmFzZSBTdG9yYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRDb21wb25lbnQge1xuICogICBwcml2YXRlIHN0b3JhZ2UgPSBpbmplY3QoU3RvcmFnZVNlcnZpY2UpO1xuICpcbiAqICAgdXBsb2FkUHJvZ3Jlc3MgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAqICAgZG93bmxvYWRVcmwgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gKlxuICogICBhc3luYyBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcbiAqICAgICBjb25zdCBmaWxlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcz8uWzBdO1xuICogICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICpcbiAqICAgICAvLyBVcGxvYWQgY29uIHByb2dyZXNvXG4gKiAgICAgdGhpcy5zdG9yYWdlLnVwbG9hZChgdXBsb2Fkcy8ke2ZpbGUubmFtZX1gLCBmaWxlKS5zdWJzY3JpYmUoe1xuICogICAgICAgbmV4dDogKHByb2dyZXNzKSA9PiB0aGlzLnVwbG9hZFByb2dyZXNzLnNldChwcm9ncmVzcy5wZXJjZW50YWdlKSxcbiAqICAgICAgIGNvbXBsZXRlOiBhc3luYyAoKSA9PiB7XG4gKiAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXREb3dubG9hZFVybChgdXBsb2Fkcy8ke2ZpbGUubmFtZX1gKTtcbiAqICAgICAgICAgdGhpcy5kb3dubG9hZFVybC5zZXQodXJsKTtcbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgU3RvcmFnZVNlcnZpY2Uge1xuICBwcml2YXRlIGNvbmZpZyA9IGluamVjdChWQUxURUNIX0ZJUkVCQVNFX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2UpIHt9XG5cbiAgLyoqXG4gICAqIFByZWZpamEgZWwgcGF0aCBkZSBzdG9yYWdlIGNvbiBlbCBhcHBJZCBzaSBlc3TDoSBjb25maWd1cmFkby5cbiAgICogU2kgbm8gaGF5IGFwcElkIG8gc2tpcFByZWZpeCBlcyB0cnVlLCByZXRvcm5hIGVsIHBhdGggc2luIG1vZGlmaWNhci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIG9yaWdpbmFsXG4gICAqIEBwYXJhbSBza2lwUHJlZml4IC0gU2kgZXMgdHJ1ZSwgbm8gYXBsaWNhIGVsIHByZWZpeCAow7p0aWwgcGFyYSBwYXRocyBjb21wYXJ0aWRvcyBjb21vIGF2YXRhcmVzKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgcHJlZml4U3RvcmFnZVBhdGgocGF0aDogc3RyaW5nLCBza2lwUHJlZml4ID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGlmIChza2lwUHJlZml4IHx8ICF0aGlzLmNvbmZpZz8uYXBwSWQpIHJldHVybiBwYXRoO1xuICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5hcHBJZH0vJHtwYXRofWA7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVBMT0FEXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTdWJlIHVuIGFyY2hpdm8gY29uIHRyYWNraW5nIGRlIHByb2dyZXNvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZW4gU3RvcmFnZSBkb25kZSBndWFyZGFyIGVsIGFyY2hpdm9cbiAgICogQHBhcmFtIGZpbGUgLSBBcmNoaXZvIGEgc3ViaXIgKEZpbGUgbyBCbG9iKVxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBNZXRhZGF0YSBvcGNpb25hbCAoY29udGVudFR5cGUsIGN1c3RvbU1ldGFkYXRhKVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHF1ZSBlbWl0ZSBlbCBwcm9ncmVzbyB5IGNvbXBsZXRhIGN1YW5kbyB0ZXJtaW5hXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXBsb2FkIGLDoXNpY29cbiAgICogc3RvcmFnZS51cGxvYWQoJ2ltYWdlcy9waG90by5qcGcnLCBmaWxlKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChwcm9ncmVzcykgPT4gY29uc29sZS5sb2coYCR7cHJvZ3Jlc3MucGVyY2VudGFnZX0lYCksXG4gICAqICAgY29tcGxldGU6ICgpID0+IGNvbnNvbGUubG9nKCdVcGxvYWQgY29tcGxldGFkbycpXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBDb24gbWV0YWRhdGFcbiAgICogc3RvcmFnZS51cGxvYWQoJ2RvY3MvcmVwb3J0LnBkZicsIGZpbGUsIHtcbiAgICogICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAqICAgY3VzdG9tTWV0YWRhdGE6IHsgdXBsb2FkZWRCeTogJ3VzZXIxMjMnIH1cbiAgICogfSkuc3Vic2NyaWJlKC4uLik7XG4gICAqIGBgYFxuICAgKi9cbiAgdXBsb2FkKHBhdGg6IHN0cmluZywgZmlsZTogRmlsZSB8IEJsb2IsIG1ldGFkYXRhPzogU3RvcmFnZU1ldGFkYXRhKTogT2JzZXJ2YWJsZTxVcGxvYWRQcm9ncmVzcz4ge1xuICAgIGNvbnN0IHByZWZpeGVkUGF0aCA9IHRoaXMucHJlZml4U3RvcmFnZVBhdGgocGF0aCwgbWV0YWRhdGE/LnNraXBQcmVmaXgpO1xuICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwcmVmaXhlZFBhdGgpO1xuICAgIGNvbnN0IHVwbG9hZE1ldGFkYXRhOiBVcGxvYWRNZXRhZGF0YSA9IHtcbiAgICAgIGNvbnRlbnRUeXBlOiBtZXRhZGF0YT8uY29udGVudFR5cGUgfHwgKGZpbGUgaW5zdGFuY2VvZiBGaWxlID8gZmlsZS50eXBlIDogdW5kZWZpbmVkKSxcbiAgICAgIGN1c3RvbU1ldGFkYXRhOiBtZXRhZGF0YT8uY3VzdG9tTWV0YWRhdGEsXG4gICAgICAvLyBEZWZhdWx0IGFncmVzaXZvOiBnZXREb3dubG9hZFVSTCBkZXZ1ZWx2ZSBVUkxzIGNvbiB0b2tlbiDDum5pY28gcG9yXG4gICAgICAvLyB2ZXJzacOzbiBkZWwgb2JqZXRvIOKGkiByZS1zdWJpciBlbCBhcmNoaXZvIGNhbWJpYSBlbCBVUkwgKGNhY2hlLWJ1c3RcbiAgICAgIC8vIG5hdHVyYWwpLiBFbCBjb25zdW1pZG9yIHB1ZWRlIG92ZXJyaWRlIHBhc2FuZG8gY2FjaGVDb250cm9sIGV4cGzDrWNpdG8uXG4gICAgICBjYWNoZUNvbnRyb2w6IG1ldGFkYXRhPy5jYWNoZUNvbnRyb2wgPz8gJ3B1YmxpYywgbWF4LWFnZT0zMTUzNjAwMCcsXG4gICAgfTtcblxuICAgIGNvbnN0IHRhc2sgPSB1cGxvYWRCeXRlc1Jlc3VtYWJsZShzdG9yYWdlUmVmLCBmaWxlLCB1cGxvYWRNZXRhZGF0YSk7XG4gICAgY29uc3QgcHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVcGxvYWRQcm9ncmVzcz4oe1xuICAgICAgYnl0ZXNUcmFuc2ZlcnJlZDogMCxcbiAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgIHBlcmNlbnRhZ2U6IDAsXG4gICAgICBzdGF0ZTogJ3J1bm5pbmcnLFxuICAgIH0pO1xuXG4gICAgdGFzay5vbihcbiAgICAgICdzdGF0ZV9jaGFuZ2VkJyxcbiAgICAgIChzbmFwc2hvdDogVXBsb2FkVGFza1NuYXBzaG90KSA9PiB7XG4gICAgICAgIHByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICBieXRlc1RyYW5zZmVycmVkOiBzbmFwc2hvdC5ieXRlc1RyYW5zZmVycmVkLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IHNuYXBzaG90LnRvdGFsQnl0ZXMsXG4gICAgICAgICAgcGVyY2VudGFnZTogTWF0aC5yb3VuZCgoc25hcHNob3QuYnl0ZXNUcmFuc2ZlcnJlZCAvIHNuYXBzaG90LnRvdGFsQnl0ZXMpICogMTAwKSxcbiAgICAgICAgICBzdGF0ZTogdGhpcy5tYXBUYXNrU3RhdGUoc25hcHNob3Quc3RhdGUpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIHByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICBieXRlc1RyYW5zZmVycmVkOiAwLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgICAgICBwZXJjZW50YWdlOiAwLFxuICAgICAgICAgIHN0YXRlOiAnZXJyb3InLFxuICAgICAgICB9KTtcbiAgICAgICAgcHJvZ3Jlc3MkLmVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBwcm9ncmVzcyQubmV4dCh7XG4gICAgICAgICAgYnl0ZXNUcmFuc2ZlcnJlZDogZmlsZS5zaXplLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgICAgICBwZXJjZW50YWdlOiAxMDAsXG4gICAgICAgICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHByb2dyZXNzJC5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gcHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmUgdW4gYXJjaGl2byB5IHJldG9ybmEgbGEgVVJMIGRlIGRlc2NhcmdhIGFsIGNvbXBsZXRhci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIGVuIFN0b3JhZ2VcbiAgICogQHBhcmFtIGZpbGUgLSBBcmNoaXZvIGEgc3ViaXJcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gTWV0YWRhdGEgb3BjaW9uYWxcbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCB1cGxvYWQgY29uIFVSTCBkZSBkZXNjYXJnYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UudXBsb2FkQW5kR2V0VXJsKCdhdmF0YXJzL3VzZXIxMjMuanBnJywgZmlsZSk7XG4gICAqIGNvbnNvbGUubG9nKCdVUkw6JywgcmVzdWx0LmRvd25sb2FkVXJsKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB1cGxvYWRBbmRHZXRVcmwoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUgfCBCbG9iLFxuICAgIG1ldGFkYXRhPzogU3RvcmFnZU1ldGFkYXRhXG4gICk6IFByb21pc2U8VXBsb2FkUmVzdWx0PiB7XG4gICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhTdG9yYWdlUGF0aChwYXRoLCBtZXRhZGF0YT8uc2tpcFByZWZpeCk7XG4gICAgY29uc29sZS5sb2coJ1tTdG9yYWdlXSB1cGxvYWRBbmRHZXRVcmwgc3RhcnQ6JywgeyBwYXRoOiBwcmVmaXhlZFBhdGgsIHNpemU6IGZpbGUuc2l6ZSB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy51cGxvYWQocGF0aCwgZmlsZSwgbWV0YWRhdGEpLnN1YnNjcmliZSh7XG4gICAgICAgIGNvbXBsZXRlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwcmVmaXhlZFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgZG93bmxvYWRVcmwgPSBhd2FpdCBnZXREb3dubG9hZFVSTChzdG9yYWdlUmVmKTtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZE1ldGFkYXRhID0gYXdhaXQgZ2V0TWV0YWRhdGEoc3RvcmFnZVJlZik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1N0b3JhZ2VdIHVwbG9hZCBPSzonLCB7XG4gICAgICAgICAgICAgIHBhdGg6IHByZWZpeGVkUGF0aCxcbiAgICAgICAgICAgICAgdXJsOiBkb3dubG9hZFVybC5zbGljZSgwLCA2MCkgKyAn4oCmJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIGRvd25sb2FkVXJsLFxuICAgICAgICAgICAgICBmdWxsUGF0aDogc3RvcmVkTWV0YWRhdGEuZnVsbFBhdGgsXG4gICAgICAgICAgICAgIG5hbWU6IHN0b3JlZE1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICAgIHNpemU6IHN0b3JlZE1ldGFkYXRhLnNpemUsXG4gICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdG9yZWRNZXRhZGF0YS5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHN0b3JlZE1ldGFkYXRhLmN1c3RvbU1ldGFkYXRhIHx8IHt9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTdG9yYWdlXSBnZXREb3dubG9hZFVSTC9tZXRhZGF0YSBmYWlsZWQ6Jywge1xuICAgICAgICAgICAgICBwYXRoOiBwcmVmaXhlZFBhdGgsXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZWplY3QodGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1N0b3JhZ2VdIHVwbG9hZCBmYWlsZWQ6JywgeyBwYXRoOiBwcmVmaXhlZFBhdGgsIGVycm9yIH0pO1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJlIHVuIGFyY2hpdm8gZGVzZGUgdW5hIERhdGEgVVJMIChiYXNlNjQpLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZW4gU3RvcmFnZVxuICAgKiBAcGFyYW0gZGF0YVVybCAtIERhdGEgVVJMIChlajogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwuLi4nKVxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBNZXRhZGF0YSBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBSZXN1bHRhZG8gZGVsIHVwbG9hZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlc2RlIGNhbnZhc1xuICAgKiBjb25zdCBkYXRhVXJsID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UudXBsb2FkRnJvbURhdGFVcmwoJ2ltYWdlcy9kcmF3aW5nLnBuZycsIGRhdGFVcmwpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVwbG9hZEZyb21EYXRhVXJsKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBkYXRhVXJsOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBTdG9yYWdlTWV0YWRhdGFcbiAgKTogUHJvbWlzZTxVcGxvYWRSZXN1bHQ+IHtcbiAgICAvLyBFeHRyYWVyIGNvbnRlbnQgdHlwZSB5IGRhdG9zIGJhc2U2NFxuICAgIGNvbnN0IG1hdGNoZXMgPSBkYXRhVXJsLm1hdGNoKC9eZGF0YTooW147XSspO2Jhc2U2NCwoLispJC8pO1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIFVSTCBpbnbDoWxpZGEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50VHlwZSA9IG1hdGNoZXNbMV07XG4gICAgY29uc3QgYmFzZTY0RGF0YSA9IG1hdGNoZXNbMl07XG5cbiAgICAvLyBDb252ZXJ0aXIgYmFzZTY0IGEgQmxvYlxuICAgIGNvbnN0IGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiYXNlNjREYXRhKTtcbiAgICBjb25zdCBieXRlTnVtYmVycyA9IG5ldyBBcnJheShieXRlQ2hhcmFjdGVycy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUNoYXJhY3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJ5dGVOdW1iZXJzW2ldID0gYnl0ZUNoYXJhY3RlcnMuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnl0ZUFycmF5XSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcblxuICAgIHJldHVybiB0aGlzLnVwbG9hZEFuZEdldFVybChwYXRoLCBibG9iLCB7XG4gICAgICBjb250ZW50VHlwZSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERPV05MT0FEXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIFVSTCBkZSBkZXNjYXJnYSBkZSB1biBhcmNoaXZvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZGVsIGFyY2hpdm8gZW4gU3RvcmFnZVxuICAgKiBAcmV0dXJucyBVUkwgZGUgZGVzY2FyZ2FcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1cmwgPSBhd2FpdCBzdG9yYWdlLmdldERvd25sb2FkVXJsKCdpbWFnZXMvcGhvdG8uanBnJyk7XG4gICAqIC8vIFVzYXIgZW4gPGltZyBbc3JjXT1cInVybFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldERvd25sb2FkVXJsKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByZWZpeGVkUGF0aCA9IHRoaXMucHJlZml4U3RvcmFnZVBhdGgocGF0aCk7XG4gICAgICBjb25zdCBzdG9yYWdlUmVmID0gcmVmKHRoaXMuc3RvcmFnZSwgcHJlZml4ZWRQYXRoKTtcbiAgICAgIHJldHVybiBhd2FpdCBnZXREb3dubG9hZFVSTChzdG9yYWdlUmVmKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgbWV0YWRhdGEgZGUgdW4gYXJjaGl2by5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIGRlbCBhcmNoaXZvXG4gICAqIEByZXR1cm5zIE1ldGFkYXRhIGRlbCBhcmNoaXZvXG4gICAqL1xuICBhc3luYyBnZXRNZXRhZGF0YShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFN0b3JhZ2VNZXRhZGF0YSAmIHsgc2l6ZTogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeFN0b3JhZ2VQYXRoKHBhdGgpO1xuICAgICAgY29uc3Qgc3RvcmFnZVJlZiA9IHJlZih0aGlzLnN0b3JhZ2UsIHByZWZpeGVkUGF0aCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGdldE1ldGFkYXRhKHN0b3JhZ2VSZWYpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudFR5cGU6IG1ldGFkYXRhLmNvbnRlbnRUeXBlLFxuICAgICAgICBjdXN0b21NZXRhZGF0YTogbWV0YWRhdGEuY3VzdG9tTWV0YWRhdGEsXG4gICAgICAgIGNhY2hlQ29udHJvbDogbWV0YWRhdGEuY2FjaGVDb250cm9sLFxuICAgICAgICBzaXplOiBtZXRhZGF0YS5zaXplLFxuICAgICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERFTEVURVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRWxpbWluYSB1biBhcmNoaXZvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZGVsIGFyY2hpdm8gYSBlbGltaW5hclxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHN0b3JhZ2UuZGVsZXRlKCdpbWFnZXMvb2xkLXBob3RvLmpwZycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhTdG9yYWdlUGF0aChwYXRoKTtcbiAgICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwcmVmaXhlZFBhdGgpO1xuICAgICAgYXdhaXQgZGVsZXRlT2JqZWN0KHN0b3JhZ2VSZWYpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBtw7psdGlwbGVzIGFyY2hpdm9zLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aHMgLSBBcnJheSBkZSBydXRhcyBhIGVsaW1pbmFyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgc3RvcmFnZS5kZWxldGVNdWx0aXBsZShbXG4gICAqICAgJ2ltYWdlcy9waG90bzEuanBnJyxcbiAgICogICAnaW1hZ2VzL3Bob3RvMi5qcGcnXG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRlbGV0ZU11bHRpcGxlKHBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHBhdGhzLm1hcChwYXRoID0+IHRoaXMuZGVsZXRlKHBhdGgpKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTElTVFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTGlzdGEgYXJjaGl2b3MgZW4gdW4gZGlyZWN0b3Jpby5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIGRlbCBkaXJlY3RvcmlvXG4gICAqIEByZXR1cm5zIExpc3RhIGRlIHJ1dGFzIGRlIGFyY2hpdm9zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5saXN0KCdpbWFnZXMvJyk7XG4gICAqIGNvbnNvbGUubG9nKHJlc3VsdC5pdGVtcyk7IC8vIFsnaW1hZ2VzL3Bob3RvMS5qcGcnLCAnaW1hZ2VzL3Bob3RvMi5qcGcnXVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpc3QocGF0aDogc3RyaW5nKTogUHJvbWlzZTxTdG9yYWdlTGlzdFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeFN0b3JhZ2VQYXRoKHBhdGgpO1xuICAgICAgY29uc3Qgc3RvcmFnZVJlZiA9IHJlZih0aGlzLnN0b3JhZ2UsIHByZWZpeGVkUGF0aCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsaXN0QWxsKHN0b3JhZ2VSZWYpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpdGVtczogcmVzdWx0Lml0ZW1zLm1hcChpdGVtID0+IGl0ZW0uZnVsbFBhdGgpLFxuICAgICAgICBuZXh0UGFnZVRva2VuOiB1bmRlZmluZWQsIC8vIGxpc3RBbGwgbm8gc29wb3J0YSBwYWdpbmFjacOzblxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVUSUxJREFERVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdlbmVyYSB1biBub21icmUgZGUgYXJjaGl2byDDum5pY28gY29uIHRpbWVzdGFtcC5cbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSAtIE5vbWJyZSBvcmlnaW5hbCBkZWwgYXJjaGl2b1xuICAgKiBAcGFyYW0gcHJlZml4IC0gUHJlZmlqbyBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBOb21icmUgw7puaWNvXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdW5pcXVlTmFtZSA9IHN0b3JhZ2UuZ2VuZXJhdGVGaWxlTmFtZSgncGhvdG8uanBnJywgJ3VzZXIxMjMnKTtcbiAgICogLy8gPT4gJ3VzZXIxMjNfMTcwMzA5MTIzNDU2N19waG90by5qcGcnXG4gICAqIGBgYFxuICAgKi9cbiAgZ2VuZXJhdGVGaWxlTmFtZShvcmlnaW5hbE5hbWU6IHN0cmluZywgcHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBvcmlnaW5hbE5hbWUucmVwbGFjZSgvW15hLXpBLVowLTkuLV0vZywgJ18nKTtcblxuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIHJldHVybiBgJHtwcmVmaXh9XyR7dGltZXN0YW1wfV8ke3Nhbml0aXplZE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RpbWVzdGFtcH1fJHtzYW5pdGl6ZWROYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhIHVuYSBydXRhIMO6bmljYSBwYXJhIHVuIGFyY2hpdm8uXG4gICAqXG4gICAqIEBwYXJhbSBkaXJlY3RvcnkgLSBEaXJlY3RvcmlvIGJhc2VcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSAtIE5vbWJyZSBvcmlnaW5hbFxuICAgKiBAcGFyYW0gcHJlZml4IC0gUHJlZmlqbyBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBSdXRhIGNvbXBsZXRhIMO6bmljYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHBhdGggPSBzdG9yYWdlLmdlbmVyYXRlUGF0aCgndXBsb2FkcycsICdwaG90by5qcGcnLCAndXNlcjEyMycpO1xuICAgKiAvLyA9PiAndXBsb2Fkcy91c2VyMTIzXzE3MDMwOTEyMzQ1NjdfcGhvdG8uanBnJ1xuICAgKiBgYGBcbiAgICovXG4gIGdlbmVyYXRlUGF0aChkaXJlY3Rvcnk6IHN0cmluZywgb3JpZ2luYWxOYW1lOiBzdHJpbmcsIHByZWZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmdlbmVyYXRlRmlsZU5hbWUob3JpZ2luYWxOYW1lLCBwcmVmaXgpO1xuICAgIGNvbnN0IGNsZWFuRGlyID0gZGlyZWN0b3J5LnJlcGxhY2UoL1xcLyskLywgJycpOyAvLyBSZW1vdmVyIC8gZmluYWxcbiAgICByZXR1cm4gYCR7Y2xlYW5EaXJ9LyR7ZmlsZU5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGV4dGVuc2nDs24gZGUgdW4gYXJjaGl2by5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVuYW1lIC0gTm9tYnJlIGRlbCBhcmNoaXZvXG4gICAqIEByZXR1cm5zIEV4dGVuc2nDs24gKHNpbiBlbCBwdW50bylcbiAgICovXG4gIGdldEV4dGVuc2lvbihmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IGZpbGVuYW1lLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5wb3AoKSEudG9Mb3dlckNhc2UoKSA6ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGFyY2hpdm8gZXMgdW5hIGltYWdlbiBiYXPDoW5kb3NlIGVuIHN1IGV4dGVuc2nDs24uXG4gICAqL1xuICBpc0ltYWdlKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBleHQgPSB0aGlzLmdldEV4dGVuc2lvbihmaWxlbmFtZSk7XG4gICAgcmV0dXJuIFsnanBnJywgJ2pwZWcnLCAncG5nJywgJ2dpZicsICd3ZWJwJywgJ3N2ZycsICdibXAnXS5pbmNsdWRlcyhleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGFyY2hpdm8gZXMgdW4gZG9jdW1lbnRvLlxuICAgKi9cbiAgaXNEb2N1bWVudChmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXh0ID0gdGhpcy5nZXRFeHRlbnNpb24oZmlsZW5hbWUpO1xuICAgIHJldHVybiBbJ3BkZicsICdkb2MnLCAnZG9jeCcsICd4bHMnLCAneGxzeCcsICdwcHQnLCAncHB0eCcsICd0eHQnXS5pbmNsdWRlcyhleHQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVTRVIgQVZBVEFSIEhFTFBFUlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENvbnN0cnV5ZSBsYSBVUkwgZGUgYXZhdGFyIGRlIHVuIHVzdWFyaW8uXG4gICAqXG4gICAqIExvcyBhdmF0YXJlcyBzZSBhbG1hY2VuYW4gZW4gcGF0aHMgcHJlZGVjaWJsZXM6IGB1c2Vycy97dXNlcklkfS9hdmF0YXIuanBnYFxuICAgKiBFc3RvIHBlcm1pdGUgcXVlIGN1YWxxdWllciBhcHAgcHVlZGEgbW9zdHJhciBhdmF0YXJlcyBzaW4gcGVkaXIgbGEgVVJMIGFsIGJhY2tlbmQsXG4gICAqIHNvbG8gbmVjZXNpdGEgZWwgdXNlcklkLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIC0gSUQgZGVsIHVzdWFyaW8gKFVMSUQpXG4gICAqIEBwYXJhbSB0eXBlIC0gJ2F2YXRhcicgcGFyYSBpbWFnZW4gY29tcGxldGEsICd0aHVtYicgcGFyYSB0aHVtYm5haWxcbiAgICogQHJldHVybnMgVVJMIGRpcmVjdGEgZGUgRmlyZWJhc2UgU3RvcmFnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIE1vc3RyYXIgYXZhdGFyIGRlIGN1YWxxdWllciB1c3VhcmlvXG4gICAqIGNvbnN0IGF2YXRhclVybCA9IHN0b3JhZ2UuZ2V0VXNlckF2YXRhclVybCgnMDFBQkNELi4uJyk7XG4gICAqIGNvbnN0IHRodW1iVXJsID0gc3RvcmFnZS5nZXRVc2VyQXZhdGFyVXJsKCcwMUFCQ0QuLi4nLCAndGh1bWInKTtcbiAgICpcbiAgICogLy8gQ29uIGNhY2hlLWJ1c3RpbmdcbiAgICogY29uc3QgZnJlc2hVcmwgPSBzdG9yYWdlLmdldFVzZXJBdmF0YXJVcmwodXNlcklkKSArIGAmdD0ke0RhdGUubm93KCl9YDtcbiAgICogYGBgXG4gICAqL1xuICBnZXRVc2VyQXZhdGFyVXJsKHVzZXJJZDogc3RyaW5nLCB0eXBlOiAnYXZhdGFyJyB8ICd0aHVtYicgPSAnYXZhdGFyJyk6IHN0cmluZyB7XG4gICAgY29uc3QgYnVja2V0ID0gdGhpcy5jb25maWc/LmZpcmViYXNlPy5zdG9yYWdlQnVja2V0IHx8ICdteXZhbHRlY2gtZGV2LmZpcmViYXNlc3RvcmFnZS5hcHAnO1xuICAgIGNvbnN0IHBhdGggPSBgdXNlcnMvJHt1c2VySWR9LyR7dHlwZX0uanBnYDtcbiAgICByZXR1cm4gYGh0dHBzOi8vZmlyZWJhc2VzdG9yYWdlLmdvb2dsZWFwaXMuY29tL3YwL2IvJHtidWNrZXR9L28vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9P2FsdD1tZWRpYWA7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTcOJVE9ET1MgUFJJVkFET1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE1hcGVhIGVsIGVzdGFkbyBkZSBsYSB0YXJlYSBkZSB1cGxvYWRcbiAgICovXG4gIHByaXZhdGUgbWFwVGFza1N0YXRlKHN0YXRlOiBzdHJpbmcpOiBVcGxvYWRTdGF0ZSB7XG4gICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgY2FzZSAncnVubmluZyc6XG4gICAgICAgIHJldHVybiAncnVubmluZyc7XG4gICAgICBjYXNlICdwYXVzZWQnOlxuICAgICAgICByZXR1cm4gJ3BhdXNlZCc7XG4gICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgcmV0dXJuICdzdWNjZXNzJztcbiAgICAgIGNhc2UgJ2NhbmNlbGVkJzpcbiAgICAgICAgcmV0dXJuICdjYW5jZWxlZCc7XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHJldHVybiAnZXJyb3InO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdydW5uaW5nJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmllcnRlIGVycm9yZXMgZGUgU3RvcmFnZSBhIG1lbnNhamVzIGVuIGVzcGHDsW9sXG4gICAqL1xuICBwcml2YXRlIGdldEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSAoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGU7XG5cbiAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICBjYXNlICdzdG9yYWdlL29iamVjdC1ub3QtZm91bmQnOlxuICAgICAgICAgIHJldHVybiAnRWwgYXJjaGl2byBubyBleGlzdGUnO1xuICAgICAgICBjYXNlICdzdG9yYWdlL3VuYXV0aG9yaXplZCc6XG4gICAgICAgICAgcmV0dXJuICdObyB0aWVuZXMgcGVybWlzbyBwYXJhIGFjY2VkZXIgYSBlc3RlIGFyY2hpdm8nO1xuICAgICAgICBjYXNlICdzdG9yYWdlL2NhbmNlbGVkJzpcbiAgICAgICAgICByZXR1cm4gJ0xhIG9wZXJhY2nDs24gZnVlIGNhbmNlbGFkYSc7XG4gICAgICAgIGNhc2UgJ3N0b3JhZ2UvcXVvdGEtZXhjZWVkZWQnOlxuICAgICAgICAgIHJldHVybiAnU2UgaGEgZXhjZWRpZG8gbGEgY3VvdGEgZGUgYWxtYWNlbmFtaWVudG8nO1xuICAgICAgICBjYXNlICdzdG9yYWdlL2ludmFsaWQtY2hlY2tzdW0nOlxuICAgICAgICAgIHJldHVybiAnRWwgYXJjaGl2byBlc3TDoSBjb3JydXB0byc7XG4gICAgICAgIGNhc2UgJ3N0b3JhZ2UvcmV0cnktbGltaXQtZXhjZWVkZWQnOlxuICAgICAgICAgIHJldHVybiAnRXJyb3IgZGUgY29uZXhpw7NuLiBJbnRlbnRhIGRlIG51ZXZvJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9pbnZhbGlkLXVybCc6XG4gICAgICAgICAgcmV0dXJuICdVUkwgZGUgYXJjaGl2byBpbnbDoWxpZGEnO1xuICAgICAgICBjYXNlICdzdG9yYWdlL2ludmFsaWQtYXJndW1lbnQnOlxuICAgICAgICAgIHJldHVybiAnQXJndW1lbnRvIGludsOhbGlkbyc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yIGRlIGFsbWFjZW5hbWllbnRvIGRlc2Nvbm9jaWRvJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJ0Vycm9yIGRlIGFsbWFjZW5hbWllbnRvIGRlc2Nvbm9jaWRvJztcbiAgfVxufVxuIl19
|
package/esm2022/lib/version.mjs
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Current version of valtech-components.
|
|
3
3
|
* This is automatically updated during the publish process.
|
|
4
4
|
*/
|
|
5
|
-
export const VERSION = '2.0.
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
export const VERSION = '2.0.844';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC44NDQnO1xuIl19
|
|
@@ -53,7 +53,7 @@ import 'prismjs/components/prism-json';
|
|
|
53
53
|
* Current version of valtech-components.
|
|
54
54
|
* This is automatically updated during the publish process.
|
|
55
55
|
*/
|
|
56
|
-
const VERSION = '2.0.
|
|
56
|
+
const VERSION = '2.0.844';
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* Servicio para gestionar presets de componentes.
|
|
@@ -23241,7 +23241,10 @@ class StorageService {
|
|
|
23241
23241
|
const uploadMetadata = {
|
|
23242
23242
|
contentType: metadata?.contentType || (file instanceof File ? file.type : undefined),
|
|
23243
23243
|
customMetadata: metadata?.customMetadata,
|
|
23244
|
-
|
|
23244
|
+
// Default agresivo: getDownloadURL devuelve URLs con token único por
|
|
23245
|
+
// versión del objeto → re-subir el archivo cambia el URL (cache-bust
|
|
23246
|
+
// natural). El consumidor puede override pasando cacheControl explícito.
|
|
23247
|
+
cacheControl: metadata?.cacheControl ?? 'public, max-age=31536000',
|
|
23245
23248
|
};
|
|
23246
23249
|
const task = uploadBytesResumable(storageRef, file, uploadMetadata);
|
|
23247
23250
|
const progress$ = new BehaviorSubject({
|