valtech-components 2.0.408 → 2.0.412
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/esm2022/lib/components/atoms/horizontal-scroll/horizontal-scroll.component.mjs +82 -0
- package/esm2022/lib/components/atoms/horizontal-scroll/types.mjs +2 -0
- package/esm2022/lib/components/atoms/rights-footer/rights-footer.component.mjs +82 -0
- package/esm2022/lib/components/atoms/rights-footer/types.mjs +2 -0
- package/esm2022/lib/components/molecules/check-input/check-input.component.mjs +55 -11
- package/esm2022/lib/components/molecules/email-input/email-input.component.mjs +13 -4
- package/esm2022/lib/components/molecules/expandable-text/expandable-text.component.mjs +27 -23
- package/esm2022/lib/components/molecules/footer-links/footer-links.component.mjs +277 -0
- package/esm2022/lib/components/molecules/footer-links/types.mjs +2 -0
- package/esm2022/lib/components/molecules/links-accordion/links-accordion.component.mjs +157 -0
- package/esm2022/lib/components/molecules/links-accordion/types.mjs +2 -0
- package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +12 -2
- package/esm2022/lib/components/molecules/prompter/prompter.component.mjs +39 -9
- package/esm2022/lib/components/molecules/prompter/types.mjs +1 -1
- package/esm2022/lib/components/molecules/radio-input/radio-input.component.mjs +13 -4
- package/esm2022/lib/components/molecules/recap-card/recap-card.component.mjs +78 -0
- package/esm2022/lib/components/molecules/recap-card/types.mjs +2 -0
- package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +31 -14
- package/esm2022/lib/components/molecules/swipe-carousel/swipe-carousel.component.mjs +206 -0
- package/esm2022/lib/components/molecules/swipe-carousel/types.mjs +2 -0
- package/esm2022/lib/components/molecules/testimonial-card/testimonial-card.component.mjs +138 -0
- package/esm2022/lib/components/molecules/testimonial-card/types.mjs +2 -0
- package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +14 -4
- package/esm2022/lib/components/organisms/cards-carousel/cards-carousel.component.mjs +61 -0
- package/esm2022/lib/components/organisms/cards-carousel/types.mjs +2 -0
- package/esm2022/lib/components/organisms/company-footer/company-footer.component.mjs +72 -0
- package/esm2022/lib/components/organisms/company-footer/types.mjs +2 -0
- package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +184 -6
- package/esm2022/lib/components/organisms/data-table/types.mjs +1 -1
- package/esm2022/lib/components/organisms/form/form.component.mjs +2 -2
- package/esm2022/lib/components/organisms/fun-header/fun-header.component.mjs +225 -0
- package/esm2022/lib/components/organisms/fun-header/types.mjs +2 -0
- package/esm2022/lib/components/organisms/menu/menu.component.mjs +197 -0
- package/esm2022/lib/components/organisms/menu/types.mjs +2 -0
- package/esm2022/lib/components/organisms/testimonial-carousel/testimonial-carousel.component.mjs +72 -0
- package/esm2022/lib/components/organisms/testimonial-carousel/types.mjs +2 -0
- package/esm2022/lib/components/templates/page-content/page-content.component.mjs +156 -0
- package/esm2022/lib/components/templates/page-content/types.mjs +2 -0
- package/esm2022/lib/components/templates/page-template/page-template.component.mjs +181 -0
- package/esm2022/lib/components/templates/page-template/types.mjs +2 -0
- package/esm2022/lib/components/templates/page-wrapper/page-wrapper.component.mjs +195 -0
- package/esm2022/lib/components/templates/page-wrapper/types.mjs +2 -0
- package/esm2022/lib/components/types.mjs +1 -1
- package/esm2022/lib/services/firebase/config.mjs +103 -0
- package/esm2022/lib/services/firebase/firebase.service.mjs +285 -0
- package/esm2022/lib/services/firebase/firestore-collection.mjs +266 -0
- package/esm2022/lib/services/firebase/firestore.service.mjs +508 -0
- package/esm2022/lib/services/firebase/index.mjs +46 -0
- package/esm2022/lib/services/firebase/messaging.service.mjs +503 -0
- package/esm2022/lib/services/firebase/storage.service.mjs +421 -0
- package/esm2022/lib/services/firebase/types.mjs +8 -0
- package/esm2022/lib/services/firebase/utils/path-builder.mjs +195 -0
- package/esm2022/lib/services/firebase/utils/query-builder.mjs +302 -0
- package/esm2022/public-api.mjs +33 -1
- package/fesm2022/valtech-components.mjs +5839 -862
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/horizontal-scroll/horizontal-scroll.component.d.ts +41 -0
- package/lib/components/atoms/horizontal-scroll/types.d.ts +13 -0
- package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +39 -0
- package/lib/components/atoms/rights-footer/types.d.ts +13 -0
- package/lib/components/molecules/check-input/check-input.component.d.ts +17 -2
- package/lib/components/molecules/email-input/email-input.component.d.ts +1 -2
- package/lib/components/molecules/footer-links/footer-links.component.d.ts +47 -0
- package/lib/components/molecules/footer-links/types.d.ts +37 -0
- package/lib/components/molecules/links-accordion/links-accordion.component.d.ts +48 -0
- package/lib/components/molecules/links-accordion/types.d.ts +33 -0
- package/lib/components/molecules/password-input/password-input.component.d.ts +1 -1
- package/lib/components/molecules/prompter/prompter.component.d.ts +9 -10
- package/lib/components/molecules/prompter/types.d.ts +7 -1
- package/lib/components/molecules/radio-input/radio-input.component.d.ts +1 -2
- package/lib/components/molecules/recap-card/recap-card.component.d.ts +36 -0
- package/lib/components/molecules/recap-card/types.d.ts +30 -0
- package/lib/components/molecules/select-input/select-input.component.d.ts +6 -1
- package/lib/components/molecules/swipe-carousel/swipe-carousel.component.d.ts +66 -0
- package/lib/components/molecules/swipe-carousel/types.d.ts +35 -0
- package/lib/components/molecules/testimonial-card/testimonial-card.component.d.ts +41 -0
- package/lib/components/molecules/testimonial-card/types.d.ts +25 -0
- package/lib/components/molecules/text-input/text-input.component.d.ts +13 -4
- package/lib/components/organisms/cards-carousel/cards-carousel.component.d.ts +30 -0
- package/lib/components/organisms/cards-carousel/types.d.ts +11 -0
- package/lib/components/organisms/company-footer/company-footer.component.d.ts +32 -0
- package/lib/components/organisms/company-footer/types.d.ts +15 -0
- package/lib/components/organisms/data-table/data-table.component.d.ts +4 -1
- package/lib/components/organisms/data-table/types.d.ts +6 -0
- package/lib/components/organisms/fun-header/fun-header.component.d.ts +72 -0
- package/lib/components/organisms/fun-header/types.d.ts +28 -0
- package/lib/components/organisms/menu/menu.component.d.ts +39 -0
- package/lib/components/organisms/menu/types.d.ts +23 -0
- package/lib/components/organisms/testimonial-carousel/testimonial-carousel.component.d.ts +33 -0
- package/lib/components/organisms/testimonial-carousel/types.d.ts +8 -0
- package/lib/components/templates/page-content/page-content.component.d.ts +55 -0
- package/lib/components/templates/page-content/types.d.ts +14 -0
- package/lib/components/templates/page-template/page-template.component.d.ts +49 -0
- package/lib/components/templates/page-template/types.d.ts +17 -0
- package/lib/components/templates/page-wrapper/page-wrapper.component.d.ts +61 -0
- package/lib/components/templates/page-wrapper/types.d.ts +19 -0
- package/lib/components/types.d.ts +14 -0
- package/lib/services/firebase/config.d.ts +49 -0
- package/lib/services/firebase/firebase.service.d.ts +140 -0
- package/lib/services/firebase/firestore-collection.d.ts +195 -0
- package/lib/services/firebase/firestore.service.d.ts +303 -0
- package/lib/services/firebase/index.d.ts +38 -0
- package/lib/services/firebase/messaging.service.d.ts +254 -0
- package/lib/services/firebase/storage.service.d.ts +204 -0
- package/lib/services/firebase/types.d.ts +279 -0
- package/lib/services/firebase/utils/path-builder.d.ts +132 -0
- package/lib/services/firebase/utils/query-builder.d.ts +210 -0
- package/package.json +3 -1
- package/public-api.d.ts +31 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Service
|
|
3
|
+
*
|
|
4
|
+
* Servicio para operaciones de Firebase Storage.
|
|
5
|
+
* Soporta upload con tracking de progreso, download y gestión de archivos.
|
|
6
|
+
*/
|
|
7
|
+
import { inject, Injectable } from '@angular/core';
|
|
8
|
+
import { deleteObject, getDownloadURL, getMetadata, listAll, ref, Storage, uploadBytesResumable, } from '@angular/fire/storage';
|
|
9
|
+
import { BehaviorSubject } from 'rxjs';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
/**
|
|
12
|
+
* Servicio para Firebase Storage.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* @Component({...})
|
|
17
|
+
* export class FileUploadComponent {
|
|
18
|
+
* private storage = inject(StorageService);
|
|
19
|
+
*
|
|
20
|
+
* uploadProgress = signal<number>(0);
|
|
21
|
+
* downloadUrl = signal<string | null>(null);
|
|
22
|
+
*
|
|
23
|
+
* async onFileSelected(event: Event) {
|
|
24
|
+
* const file = (event.target as HTMLInputElement).files?.[0];
|
|
25
|
+
* if (!file) return;
|
|
26
|
+
*
|
|
27
|
+
* // Upload con progreso
|
|
28
|
+
* this.storage.upload(`uploads/${file.name}`, file).subscribe({
|
|
29
|
+
* next: (progress) => this.uploadProgress.set(progress.percentage),
|
|
30
|
+
* complete: async () => {
|
|
31
|
+
* const url = await this.storage.getDownloadUrl(`uploads/${file.name}`);
|
|
32
|
+
* this.downloadUrl.set(url);
|
|
33
|
+
* }
|
|
34
|
+
* });
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export class StorageService {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.storage = inject(Storage);
|
|
42
|
+
}
|
|
43
|
+
// ===========================================================================
|
|
44
|
+
// UPLOAD
|
|
45
|
+
// ===========================================================================
|
|
46
|
+
/**
|
|
47
|
+
* Sube un archivo con tracking de progreso.
|
|
48
|
+
*
|
|
49
|
+
* @param path - Ruta en Storage donde guardar el archivo
|
|
50
|
+
* @param file - Archivo a subir (File o Blob)
|
|
51
|
+
* @param metadata - Metadata opcional (contentType, customMetadata)
|
|
52
|
+
* @returns Observable que emite el progreso y completa cuando termina
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* // Upload básico
|
|
57
|
+
* storage.upload('images/photo.jpg', file).subscribe({
|
|
58
|
+
* next: (progress) => console.log(`${progress.percentage}%`),
|
|
59
|
+
* complete: () => console.log('Upload completado')
|
|
60
|
+
* });
|
|
61
|
+
*
|
|
62
|
+
* // Con metadata
|
|
63
|
+
* storage.upload('docs/report.pdf', file, {
|
|
64
|
+
* contentType: 'application/pdf',
|
|
65
|
+
* customMetadata: { uploadedBy: 'user123' }
|
|
66
|
+
* }).subscribe(...);
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
upload(path, file, metadata) {
|
|
70
|
+
const storageRef = ref(this.storage, path);
|
|
71
|
+
const uploadMetadata = {
|
|
72
|
+
contentType: metadata?.contentType || (file instanceof File ? file.type : undefined),
|
|
73
|
+
customMetadata: metadata?.customMetadata,
|
|
74
|
+
cacheControl: metadata?.cacheControl,
|
|
75
|
+
};
|
|
76
|
+
const task = uploadBytesResumable(storageRef, file, uploadMetadata);
|
|
77
|
+
const progress$ = new BehaviorSubject({
|
|
78
|
+
bytesTransferred: 0,
|
|
79
|
+
totalBytes: file.size,
|
|
80
|
+
percentage: 0,
|
|
81
|
+
state: 'running',
|
|
82
|
+
});
|
|
83
|
+
task.on('state_changed', (snapshot) => {
|
|
84
|
+
progress$.next({
|
|
85
|
+
bytesTransferred: snapshot.bytesTransferred,
|
|
86
|
+
totalBytes: snapshot.totalBytes,
|
|
87
|
+
percentage: Math.round((snapshot.bytesTransferred / snapshot.totalBytes) * 100),
|
|
88
|
+
state: this.mapTaskState(snapshot.state),
|
|
89
|
+
});
|
|
90
|
+
}, (error) => {
|
|
91
|
+
progress$.next({
|
|
92
|
+
bytesTransferred: 0,
|
|
93
|
+
totalBytes: file.size,
|
|
94
|
+
percentage: 0,
|
|
95
|
+
state: 'error',
|
|
96
|
+
});
|
|
97
|
+
progress$.error(this.getErrorMessage(error));
|
|
98
|
+
}, () => {
|
|
99
|
+
progress$.next({
|
|
100
|
+
bytesTransferred: file.size,
|
|
101
|
+
totalBytes: file.size,
|
|
102
|
+
percentage: 100,
|
|
103
|
+
state: 'success',
|
|
104
|
+
});
|
|
105
|
+
progress$.complete();
|
|
106
|
+
});
|
|
107
|
+
return progress$.asObservable();
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Sube un archivo y retorna la URL de descarga al completar.
|
|
111
|
+
*
|
|
112
|
+
* @param path - Ruta en Storage
|
|
113
|
+
* @param file - Archivo a subir
|
|
114
|
+
* @param metadata - Metadata opcional
|
|
115
|
+
* @returns Resultado del upload con URL de descarga
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* const result = await storage.uploadAndGetUrl('avatars/user123.jpg', file);
|
|
120
|
+
* console.log('URL:', result.downloadUrl);
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
async uploadAndGetUrl(path, file, metadata) {
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
this.upload(path, file, metadata).subscribe({
|
|
126
|
+
complete: async () => {
|
|
127
|
+
try {
|
|
128
|
+
const storageRef = ref(this.storage, path);
|
|
129
|
+
const downloadUrl = await getDownloadURL(storageRef);
|
|
130
|
+
const storedMetadata = await getMetadata(storageRef);
|
|
131
|
+
resolve({
|
|
132
|
+
downloadUrl,
|
|
133
|
+
fullPath: storedMetadata.fullPath,
|
|
134
|
+
name: storedMetadata.name,
|
|
135
|
+
size: storedMetadata.size,
|
|
136
|
+
contentType: storedMetadata.contentType || 'application/octet-stream',
|
|
137
|
+
metadata: storedMetadata.customMetadata || {},
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
reject(this.getErrorMessage(error));
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
error: (error) => reject(error),
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Sube un archivo desde una Data URL (base64).
|
|
150
|
+
*
|
|
151
|
+
* @param path - Ruta en Storage
|
|
152
|
+
* @param dataUrl - Data URL (ej: 'data:image/png;base64,...')
|
|
153
|
+
* @param metadata - Metadata opcional
|
|
154
|
+
* @returns Resultado del upload
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```typescript
|
|
158
|
+
* // Desde canvas
|
|
159
|
+
* const dataUrl = canvas.toDataURL('image/png');
|
|
160
|
+
* const result = await storage.uploadFromDataUrl('images/drawing.png', dataUrl);
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
async uploadFromDataUrl(path, dataUrl, metadata) {
|
|
164
|
+
// Extraer content type y datos base64
|
|
165
|
+
const matches = dataUrl.match(/^data:([^;]+);base64,(.+)$/);
|
|
166
|
+
if (!matches) {
|
|
167
|
+
throw new Error('Data URL inválida');
|
|
168
|
+
}
|
|
169
|
+
const contentType = matches[1];
|
|
170
|
+
const base64Data = matches[2];
|
|
171
|
+
// Convertir base64 a Blob
|
|
172
|
+
const byteCharacters = atob(base64Data);
|
|
173
|
+
const byteNumbers = new Array(byteCharacters.length);
|
|
174
|
+
for (let i = 0; i < byteCharacters.length; i++) {
|
|
175
|
+
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
176
|
+
}
|
|
177
|
+
const byteArray = new Uint8Array(byteNumbers);
|
|
178
|
+
const blob = new Blob([byteArray], { type: contentType });
|
|
179
|
+
return this.uploadAndGetUrl(path, blob, {
|
|
180
|
+
contentType,
|
|
181
|
+
...metadata,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// ===========================================================================
|
|
185
|
+
// DOWNLOAD
|
|
186
|
+
// ===========================================================================
|
|
187
|
+
/**
|
|
188
|
+
* Obtiene la URL de descarga de un archivo.
|
|
189
|
+
*
|
|
190
|
+
* @param path - Ruta del archivo en Storage
|
|
191
|
+
* @returns URL de descarga
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* const url = await storage.getDownloadUrl('images/photo.jpg');
|
|
196
|
+
* // Usar en <img [src]="url">
|
|
197
|
+
* ```
|
|
198
|
+
*/
|
|
199
|
+
async getDownloadUrl(path) {
|
|
200
|
+
try {
|
|
201
|
+
const storageRef = ref(this.storage, path);
|
|
202
|
+
return await getDownloadURL(storageRef);
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
throw new Error(this.getErrorMessage(error));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Obtiene la metadata de un archivo.
|
|
210
|
+
*
|
|
211
|
+
* @param path - Ruta del archivo
|
|
212
|
+
* @returns Metadata del archivo
|
|
213
|
+
*/
|
|
214
|
+
async getMetadata(path) {
|
|
215
|
+
try {
|
|
216
|
+
const storageRef = ref(this.storage, path);
|
|
217
|
+
const metadata = await getMetadata(storageRef);
|
|
218
|
+
return {
|
|
219
|
+
contentType: metadata.contentType,
|
|
220
|
+
customMetadata: metadata.customMetadata,
|
|
221
|
+
cacheControl: metadata.cacheControl,
|
|
222
|
+
size: metadata.size,
|
|
223
|
+
name: metadata.name,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
throw new Error(this.getErrorMessage(error));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// ===========================================================================
|
|
231
|
+
// DELETE
|
|
232
|
+
// ===========================================================================
|
|
233
|
+
/**
|
|
234
|
+
* Elimina un archivo.
|
|
235
|
+
*
|
|
236
|
+
* @param path - Ruta del archivo a eliminar
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```typescript
|
|
240
|
+
* await storage.delete('images/old-photo.jpg');
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
async delete(path) {
|
|
244
|
+
try {
|
|
245
|
+
const storageRef = ref(this.storage, path);
|
|
246
|
+
await deleteObject(storageRef);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
throw new Error(this.getErrorMessage(error));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Elimina múltiples archivos.
|
|
254
|
+
*
|
|
255
|
+
* @param paths - Array de rutas a eliminar
|
|
256
|
+
*
|
|
257
|
+
* @example
|
|
258
|
+
* ```typescript
|
|
259
|
+
* await storage.deleteMultiple([
|
|
260
|
+
* 'images/photo1.jpg',
|
|
261
|
+
* 'images/photo2.jpg'
|
|
262
|
+
* ]);
|
|
263
|
+
* ```
|
|
264
|
+
*/
|
|
265
|
+
async deleteMultiple(paths) {
|
|
266
|
+
await Promise.all(paths.map((path) => this.delete(path)));
|
|
267
|
+
}
|
|
268
|
+
// ===========================================================================
|
|
269
|
+
// LIST
|
|
270
|
+
// ===========================================================================
|
|
271
|
+
/**
|
|
272
|
+
* Lista archivos en un directorio.
|
|
273
|
+
*
|
|
274
|
+
* @param path - Ruta del directorio
|
|
275
|
+
* @returns Lista de rutas de archivos
|
|
276
|
+
*
|
|
277
|
+
* @example
|
|
278
|
+
* ```typescript
|
|
279
|
+
* const result = await storage.list('images/');
|
|
280
|
+
* console.log(result.items); // ['images/photo1.jpg', 'images/photo2.jpg']
|
|
281
|
+
* ```
|
|
282
|
+
*/
|
|
283
|
+
async list(path) {
|
|
284
|
+
try {
|
|
285
|
+
const storageRef = ref(this.storage, path);
|
|
286
|
+
const result = await listAll(storageRef);
|
|
287
|
+
return {
|
|
288
|
+
items: result.items.map((item) => item.fullPath),
|
|
289
|
+
nextPageToken: undefined, // listAll no soporta paginación
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
throw new Error(this.getErrorMessage(error));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// ===========================================================================
|
|
297
|
+
// UTILIDADES
|
|
298
|
+
// ===========================================================================
|
|
299
|
+
/**
|
|
300
|
+
* Genera un nombre de archivo único con timestamp.
|
|
301
|
+
*
|
|
302
|
+
* @param originalName - Nombre original del archivo
|
|
303
|
+
* @param prefix - Prefijo opcional
|
|
304
|
+
* @returns Nombre único
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* ```typescript
|
|
308
|
+
* const uniqueName = storage.generateFileName('photo.jpg', 'user123');
|
|
309
|
+
* // => 'user123_1703091234567_photo.jpg'
|
|
310
|
+
* ```
|
|
311
|
+
*/
|
|
312
|
+
generateFileName(originalName, prefix) {
|
|
313
|
+
const timestamp = Date.now();
|
|
314
|
+
const sanitizedName = originalName.replace(/[^a-zA-Z0-9.-]/g, '_');
|
|
315
|
+
if (prefix) {
|
|
316
|
+
return `${prefix}_${timestamp}_${sanitizedName}`;
|
|
317
|
+
}
|
|
318
|
+
return `${timestamp}_${sanitizedName}`;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Genera una ruta única para un archivo.
|
|
322
|
+
*
|
|
323
|
+
* @param directory - Directorio base
|
|
324
|
+
* @param originalName - Nombre original
|
|
325
|
+
* @param prefix - Prefijo opcional
|
|
326
|
+
* @returns Ruta completa única
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```typescript
|
|
330
|
+
* const path = storage.generatePath('uploads', 'photo.jpg', 'user123');
|
|
331
|
+
* // => 'uploads/user123_1703091234567_photo.jpg'
|
|
332
|
+
* ```
|
|
333
|
+
*/
|
|
334
|
+
generatePath(directory, originalName, prefix) {
|
|
335
|
+
const fileName = this.generateFileName(originalName, prefix);
|
|
336
|
+
const cleanDir = directory.replace(/\/+$/, ''); // Remover / final
|
|
337
|
+
return `${cleanDir}/${fileName}`;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Obtiene la extensión de un archivo.
|
|
341
|
+
*
|
|
342
|
+
* @param filename - Nombre del archivo
|
|
343
|
+
* @returns Extensión (sin el punto)
|
|
344
|
+
*/
|
|
345
|
+
getExtension(filename) {
|
|
346
|
+
const parts = filename.split('.');
|
|
347
|
+
return parts.length > 1 ? parts.pop().toLowerCase() : '';
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Verifica si un archivo es una imagen basándose en su extensión.
|
|
351
|
+
*/
|
|
352
|
+
isImage(filename) {
|
|
353
|
+
const ext = this.getExtension(filename);
|
|
354
|
+
return ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp'].includes(ext);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Verifica si un archivo es un documento.
|
|
358
|
+
*/
|
|
359
|
+
isDocument(filename) {
|
|
360
|
+
const ext = this.getExtension(filename);
|
|
361
|
+
return ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt'].includes(ext);
|
|
362
|
+
}
|
|
363
|
+
// ===========================================================================
|
|
364
|
+
// MÉTODOS PRIVADOS
|
|
365
|
+
// ===========================================================================
|
|
366
|
+
/**
|
|
367
|
+
* Mapea el estado de la tarea de upload
|
|
368
|
+
*/
|
|
369
|
+
mapTaskState(state) {
|
|
370
|
+
switch (state) {
|
|
371
|
+
case 'running':
|
|
372
|
+
return 'running';
|
|
373
|
+
case 'paused':
|
|
374
|
+
return 'paused';
|
|
375
|
+
case 'success':
|
|
376
|
+
return 'success';
|
|
377
|
+
case 'canceled':
|
|
378
|
+
return 'canceled';
|
|
379
|
+
case 'error':
|
|
380
|
+
return 'error';
|
|
381
|
+
default:
|
|
382
|
+
return 'running';
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Convierte errores de Storage a mensajes en español
|
|
387
|
+
*/
|
|
388
|
+
getErrorMessage(error) {
|
|
389
|
+
if (error instanceof Error) {
|
|
390
|
+
const code = error.code;
|
|
391
|
+
switch (code) {
|
|
392
|
+
case 'storage/object-not-found':
|
|
393
|
+
return 'El archivo no existe';
|
|
394
|
+
case 'storage/unauthorized':
|
|
395
|
+
return 'No tienes permiso para acceder a este archivo';
|
|
396
|
+
case 'storage/canceled':
|
|
397
|
+
return 'La operación fue cancelada';
|
|
398
|
+
case 'storage/quota-exceeded':
|
|
399
|
+
return 'Se ha excedido la cuota de almacenamiento';
|
|
400
|
+
case 'storage/invalid-checksum':
|
|
401
|
+
return 'El archivo está corrupto';
|
|
402
|
+
case 'storage/retry-limit-exceeded':
|
|
403
|
+
return 'Error de conexión. Intenta de nuevo';
|
|
404
|
+
case 'storage/invalid-url':
|
|
405
|
+
return 'URL de archivo inválida';
|
|
406
|
+
case 'storage/invalid-argument':
|
|
407
|
+
return 'Argumento inválido';
|
|
408
|
+
default:
|
|
409
|
+
return error.message || 'Error de almacenamiento desconocido';
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return 'Error de almacenamiento desconocido';
|
|
413
|
+
}
|
|
414
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
415
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StorageService, providedIn: 'root' }); }
|
|
416
|
+
}
|
|
417
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StorageService, decorators: [{
|
|
418
|
+
type: Injectable,
|
|
419
|
+
args: [{ providedIn: 'root' }]
|
|
420
|
+
}] });
|
|
421
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9maXJlYmFzZS9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGNBQWMsRUFDZCxXQUFXLEVBQ1gsT0FBTyxFQUNQLEdBQUcsRUFDSCxPQUFPLEVBQ1Asb0JBQW9CLEdBR3JCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFJbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBRDNCO1FBRVUsWUFBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztLQTRabkM7SUExWkMsOEVBQThFO0lBQzlFLFNBQVM7SUFDVCw4RUFBOEU7SUFFOUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FzQkc7SUFDSCxNQUFNLENBQUMsSUFBWSxFQUFFLElBQWlCLEVBQUUsUUFBMEI7UUFDaEUsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxjQUFjLEdBQW1CO1lBQ3JDLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxJQUFJLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BGLGNBQWMsRUFBRSxRQUFRLEVBQUUsY0FBYztZQUN4QyxZQUFZLEVBQUUsUUFBUSxFQUFFLFlBQVk7U0FDckMsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLG9CQUFvQixDQUFDLFVBQVUs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QUssc0JBQXNCO29CQUN6QixPQUFPLCtDQUErQyxDQUFDO2dCQUN6RCxLQUFLLGtCQUFrQjtvQkFDckIsT0FBTyw0QkFBNEIsQ0FBQztnQkFDdEMsS0FBSyx3QkFBd0I7b0JBQzNCLE9BQU8sMkNBQTJDLENBQUM7Z0JBQ3JELEtBQUssMEJBQTBCO29CQUM3QixPQUFPLDBCQUEwQixDQUFDO2dCQUNwQyxLQUFLLDhCQUE4QjtvQkFDakMsT0FBTyxxQ0FBcUMsQ0FBQztnQkFDL0MsS0FBSyxxQkFBcUI7b0JBQ3hCLE9BQU8seUJBQXlCLENBQUM7Z0JBQ25DLEtBQUssMEJBQTBCO29CQUM3QixPQUFPLG9CQUFvQixDQUFDO2dCQUM5QjtvQkFDRSxPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUkscUNBQXFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLHFDQUFxQyxDQUFDO0lBQy9DLENBQUM7K0dBNVpVLGNBQWM7bUhBQWQsY0FBYyxjQURELE1BQU07OzRGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RvcmFnZSBTZXJ2aWNlXG4gKlxuICogU2VydmljaW8gcGFyYSBvcGVyYWNpb25lcyBkZSBGaXJlYmFzZSBTdG9yYWdlLlxuICogU29wb3J0YSB1cGxvYWQgY29uIHRyYWNraW5nIGRlIHByb2dyZXNvLCBkb3dubG9hZCB5IGdlc3Rpw7NuIGRlIGFyY2hpdm9zLlxuICovXG5cbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgZGVsZXRlT2JqZWN0LFxuICBnZXREb3dubG9hZFVSTCxcbiAgZ2V0TWV0YWRhdGEsXG4gIGxpc3RBbGwsXG4gIHJlZixcbiAgU3RvcmFnZSxcbiAgdXBsb2FkQnl0ZXNSZXN1bWFibGUsXG4gIFVwbG9hZE1ldGFkYXRhLFxuICBVcGxvYWRUYXNrU25hcHNob3QsXG59IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvc3RvcmFnZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU3RvcmFnZUxpc3RSZXN1bHQsIFN0b3JhZ2VNZXRhZGF0YSwgVXBsb2FkUHJvZ3Jlc3MsIFVwbG9hZFJlc3VsdCwgVXBsb2FkU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBTZXJ2aWNpbyBwYXJhIEZpcmViYXNlIFN0b3JhZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCB7XG4gKiAgIHByaXZhdGUgc3RvcmFnZSA9IGluamVjdChTdG9yYWdlU2VydmljZSk7XG4gKlxuICogICB1cGxvYWRQcm9ncmVzcyA9IHNpZ25hbDxudW1iZXI+KDApO1xuICogICBkb3dubG9hZFVybCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAqXG4gKiAgIGFzeW5jIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICogICAgIGNvbnN0IGZpbGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzPy5bMF07XG4gKiAgICAgaWYgKCFmaWxlKSByZXR1cm47XG4gKlxuICogICAgIC8vIFVwbG9hZCBjb24gcHJvZ3Jlc29cbiAqICAgICB0aGlzLnN0b3JhZ2UudXBsb2FkKGB1cGxvYWRzLyR7ZmlsZS5uYW1lfWAsIGZpbGUpLnN1YnNjcmliZSh7XG4gKiAgICAgICBuZXh0OiAocHJvZ3Jlc3MpID0+IHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KHByb2dyZXNzLnBlcmNlbnRhZ2UpLFxuICogICAgICAgY29tcGxldGU6IGFzeW5jICgpID0+IHtcbiAqICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldERvd25sb2FkVXJsKGB1cGxvYWRzLyR7ZmlsZS5uYW1lfWApO1xuICogICAgICAgICB0aGlzLmRvd25sb2FkVXJsLnNldCh1cmwpO1xuICogICAgICAgfVxuICogICAgIH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTdG9yYWdlU2VydmljZSB7XG4gIHByaXZhdGUgc3RvcmFnZSA9IGluamVjdChTdG9yYWdlKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVBMT0FEXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTdWJlIHVuIGFyY2hpdm8gY29uIHRyYWNraW5nIGRlIHByb2dyZXNvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZW4gU3RvcmFnZSBkb25kZSBndWFyZGFyIGVsIGFyY2hpdm9cbiAgICogQHBhcmFtIGZpbGUgLSBBcmNoaXZvIGEgc3ViaXIgKEZpbGUgbyBCbG9iKVxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBNZXRhZGF0YSBvcGNpb25hbCAoY29udGVudFR5cGUsIGN1c3RvbU1ldGFkYXRhKVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHF1ZSBlbWl0ZSBlbCBwcm9ncmVzbyB5IGNvbXBsZXRhIGN1YW5kbyB0ZXJtaW5hXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXBsb2FkIGLDoXNpY29cbiAgICogc3RvcmFnZS51cGxvYWQoJ2ltYWdlcy9waG90by5qcGcnLCBmaWxlKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChwcm9ncmVzcykgPT4gY29uc29sZS5sb2coYCR7cHJvZ3Jlc3MucGVyY2VudGFnZX0lYCksXG4gICAqICAgY29tcGxldGU6ICgpID0+IGNvbnNvbGUubG9nKCdVcGxvYWQgY29tcGxldGFkbycpXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBDb24gbWV0YWRhdGFcbiAgICogc3RvcmFnZS51cGxvYWQoJ2RvY3MvcmVwb3J0LnBkZicsIGZpbGUsIHtcbiAgICogICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAqICAgY3VzdG9tTWV0YWRhdGE6IHsgdXBsb2FkZWRCeTogJ3VzZXIxMjMnIH1cbiAgICogfSkuc3Vic2NyaWJlKC4uLik7XG4gICAqIGBgYFxuICAgKi9cbiAgdXBsb2FkKHBhdGg6IHN0cmluZywgZmlsZTogRmlsZSB8IEJsb2IsIG1ldGFkYXRhPzogU3RvcmFnZU1ldGFkYXRhKTogT2JzZXJ2YWJsZTxVcGxvYWRQcm9ncmVzcz4ge1xuICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwYXRoKTtcbiAgICBjb25zdCB1cGxvYWRNZXRhZGF0YTogVXBsb2FkTWV0YWRhdGEgPSB7XG4gICAgICBjb250ZW50VHlwZTogbWV0YWRhdGE/LmNvbnRlbnRUeXBlIHx8IChmaWxlIGluc3RhbmNlb2YgRmlsZSA/IGZpbGUudHlwZSA6IHVuZGVmaW5lZCksXG4gICAgICBjdXN0b21NZXRhZGF0YTogbWV0YWRhdGE/LmN1c3RvbU1ldGFkYXRhLFxuICAgICAgY2FjaGVDb250cm9sOiBtZXRhZGF0YT8uY2FjaGVDb250cm9sLFxuICAgIH07XG5cbiAgICBjb25zdCB0YXNrID0gdXBsb2FkQnl0ZXNSZXN1bWFibGUoc3RvcmFnZVJlZiwgZmlsZSwgdXBsb2FkTWV0YWRhdGEpO1xuICAgIGNvbnN0IHByb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXBsb2FkUHJvZ3Jlc3M+KHtcbiAgICAgIGJ5dGVzVHJhbnNmZXJyZWQ6IDAsXG4gICAgICB0b3RhbEJ5dGVzOiBmaWxlLnNpemUsXG4gICAgICBwZXJjZW50YWdlOiAwLFxuICAgICAgc3RhdGU6ICdydW5uaW5nJyxcbiAgICB9KTtcblxuICAgIHRhc2sub24oXG4gICAgICAnc3RhdGVfY2hhbmdlZCcsXG4gICAgICAoc25hcHNob3Q6IFVwbG9hZFRhc2tTbmFwc2hvdCkgPT4ge1xuICAgICAgICBwcm9ncmVzcyQubmV4dCh7XG4gICAgICAgICAgYnl0ZXNUcmFuc2ZlcnJlZDogc25hcHNob3QuYnl0ZXNUcmFuc2ZlcnJlZCxcbiAgICAgICAgICB0b3RhbEJ5dGVzOiBzbmFwc2hvdC50b3RhbEJ5dGVzLFxuICAgICAgICAgIHBlcmNlbnRhZ2U6IE1hdGgucm91bmQoKHNuYXBzaG90LmJ5dGVzVHJhbnNmZXJyZWQgLyBzbmFwc2hvdC50b3RhbEJ5dGVzKSAqIDEwMCksXG4gICAgICAgICAgc3RhdGU6IHRoaXMubWFwVGFza1N0YXRlKHNuYXBzaG90LnN0YXRlKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIHByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICBieXRlc1RyYW5zZmVycmVkOiAwLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgICAgICBwZXJjZW50YWdlOiAwLFxuICAgICAgICAgIHN0YXRlOiAnZXJyb3InLFxuICAgICAgICB9KTtcbiAgICAgICAgcHJvZ3Jlc3MkLmVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBwcm9ncmVzcyQubmV4dCh7XG4gICAgICAgICAgYnl0ZXNUcmFuc2ZlcnJlZDogZmlsZS5zaXplLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgICAgICBwZXJjZW50YWdlOiAxMDAsXG4gICAgICAgICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHByb2dyZXNzJC5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gcHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmUgdW4gYXJjaGl2byB5IHJldG9ybmEgbGEgVVJMIGRlIGRlc2NhcmdhIGFsIGNvbXBsZXRhci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIGVuIFN0b3JhZ2VcbiAgICogQHBhcmFtIGZpbGUgLSBBcmNoaXZvIGEgc3ViaXJcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gTWV0YWRhdGEgb3BjaW9uYWxcbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCB1cGxvYWQgY29uIFVSTCBkZSBkZXNjYXJnYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UudXBsb2FkQW5kR2V0VXJsKCdhdmF0YXJzL3VzZXIxMjMuanBnJywgZmlsZSk7XG4gICAqIGNvbnNvbGUubG9nKCdVUkw6JywgcmVzdWx0LmRvd25sb2FkVXJsKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB1cGxvYWRBbmRHZXRVcmwoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUgfCBCbG9iLFxuICAgIG1ldGFkYXRhPzogU3RvcmFnZU1ldGFkYXRhXG4gICk6IFByb21pc2U8VXBsb2FkUmVzdWx0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMudXBsb2FkKHBhdGgsIGZpbGUsIG1ldGFkYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgICBjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlUmVmID0gcmVmKHRoaXMuc3RvcmFnZSwgcGF0aCk7XG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZFVybCA9IGF3YWl0IGdldERvd25sb2FkVVJMKHN0b3JhZ2VSZWYpO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkTWV0YWRhdGEgPSBhd2FpdCBnZXRNZXRhZGF0YShzdG9yYWdlUmVmKTtcblxuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIGRvd25sb2FkVXJsLFxuICAgICAgICAgICAgICBmdWxsUGF0aDogc3RvcmVkTWV0YWRhdGEuZnVsbFBhdGgsXG4gICAgICAgICAgICAgIG5hbWU6IHN0b3JlZE1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICAgIHNpemU6IHN0b3JlZE1ldGFkYXRhLnNpemUsXG4gICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdG9yZWRNZXRhZGF0YS5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHN0b3JlZE1ldGFkYXRhLmN1c3RvbU1ldGFkYXRhIHx8IHt9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdCh0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmUgdW4gYXJjaGl2byBkZXNkZSB1bmEgRGF0YSBVUkwgKGJhc2U2NCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUnV0YSBlbiBTdG9yYWdlXG4gICAqIEBwYXJhbSBkYXRhVXJsIC0gRGF0YSBVUkwgKGVqOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LC4uLicpXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIE1ldGFkYXRhIG9wY2lvbmFsXG4gICAqIEByZXR1cm5zIFJlc3VsdGFkbyBkZWwgdXBsb2FkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVzZGUgY2FudmFzXG4gICAqIGNvbnN0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS51cGxvYWRGcm9tRGF0YVVybCgnaW1hZ2VzL2RyYXdpbmcucG5nJywgZGF0YVVybCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBsb2FkRnJvbURhdGFVcmwoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGRhdGFVcmw6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFN0b3JhZ2VNZXRhZGF0YVxuICApOiBQcm9taXNlPFVwbG9hZFJlc3VsdD4ge1xuICAgIC8vIEV4dHJhZXIgY29udGVudCB0eXBlIHkgZGF0b3MgYmFzZTY0XG4gICAgY29uc3QgbWF0Y2hlcyA9IGRhdGFVcmwubWF0Y2goL15kYXRhOihbXjtdKyk7YmFzZTY0LCguKykkLyk7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgVVJMIGludsOhbGlkYScpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gbWF0Y2hlc1sxXTtcbiAgICBjb25zdCBiYXNlNjREYXRhID0gbWF0Y2hlc1syXTtcblxuICAgIC8vIENvbnZlcnRpciBiYXNlNjQgYSBCbG9iXG4gICAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKGJhc2U2NERhdGEpO1xuICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlQ2hhcmFjdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgYnl0ZU51bWJlcnNbaV0gPSBieXRlQ2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICBjb25zdCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShieXRlTnVtYmVycyk7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtieXRlQXJyYXldLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMudXBsb2FkQW5kR2V0VXJsKHBhdGgsIGJsb2IsIHtcbiAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRE9XTkxPQURcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgVVJMIGRlIGRlc2NhcmdhIGRlIHVuIGFyY2hpdm8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUnV0YSBkZWwgYXJjaGl2byBlbiBTdG9yYWdlXG4gICAqIEByZXR1cm5zIFVSTCBkZSBkZXNjYXJnYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVybCA9IGF3YWl0IHN0b3JhZ2UuZ2V0RG93bmxvYWRVcmwoJ2ltYWdlcy9waG90by5qcGcnKTtcbiAgICogLy8gVXNhciBlbiA8aW1nIFtzcmNdPVwidXJsXCI+XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0RG93bmxvYWRVcmwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmFnZVJlZiA9IHJlZih0aGlzLnN0b3JhZ2UsIHBhdGgpO1xuICAgICAgcmV0dXJuIGF3YWl0IGdldERvd25sb2FkVVJMKHN0b3JhZ2VSZWYpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBtZXRhZGF0YSBkZSB1biBhcmNoaXZvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZGVsIGFyY2hpdm9cbiAgICogQHJldHVybnMgTWV0YWRhdGEgZGVsIGFyY2hpdm9cbiAgICovXG4gIGFzeW5jIGdldE1ldGFkYXRhKHBhdGg6IHN0cmluZyk6IFByb21pc2U8U3RvcmFnZU1ldGFkYXRhICYgeyBzaXplOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwYXRoKTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgZ2V0TWV0YWRhdGEoc3RvcmFnZVJlZik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50VHlwZTogbWV0YWRhdGEuY29udGVudFR5cGUsXG4gICAgICAgIGN1c3RvbU1ldGFkYXRhOiBtZXRhZGF0YS5jdXN0b21NZXRhZGF0YSxcbiAgICAgICAgY2FjaGVDb250cm9sOiBtZXRhZGF0YS5jYWNoZUNvbnRyb2wsXG4gICAgICAgIHNpemU6IG1ldGFkYXRhLnNpemUsXG4gICAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gREVMRVRFXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIHVuIGFyY2hpdm8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUnV0YSBkZWwgYXJjaGl2byBhIGVsaW1pbmFyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgc3RvcmFnZS5kZWxldGUoJ2ltYWdlcy9vbGQtcGhvdG8uanBnJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlUmVmID0gcmVmKHRoaXMuc3RvcmFnZSwgcGF0aCk7XG4gICAgICBhd2FpdCBkZWxldGVPYmplY3Qoc3RvcmFnZVJlZik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIG3Dumx0aXBsZXMgYXJjaGl2b3MuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRocyAtIEFycmF5IGRlIHJ1dGFzIGEgZWxpbWluYXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCBzdG9yYWdlLmRlbGV0ZU11bHRpcGxlKFtcbiAgICogICAnaW1hZ2VzL3Bob3RvMS5qcGcnLFxuICAgKiAgICdpbWFnZXMvcGhvdG8yLmpwZydcbiAgICogXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTXVsdGlwbGUocGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocGF0aHMubWFwKChwYXRoKSA9PiB0aGlzLmRlbGV0ZShwYXRoKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExJU1RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIExpc3RhIGFyY2hpdm9zIGVuIHVuIGRpcmVjdG9yaW8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUnV0YSBkZWwgZGlyZWN0b3Jpb1xuICAgKiBAcmV0dXJucyBMaXN0YSBkZSBydXRhcyBkZSBhcmNoaXZvc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UubGlzdCgnaW1hZ2VzLycpO1xuICAgKiBjb25zb2xlLmxvZyhyZXN1bHQuaXRlbXMpOyAvLyBbJ2ltYWdlcy9waG90bzEuanBnJywgJ2ltYWdlcy9waG90bzIuanBnJ11cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsaXN0KHBhdGg6IHN0cmluZyk6IFByb21pc2U8U3RvcmFnZUxpc3RSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmFnZVJlZiA9IHJlZih0aGlzLnN0b3JhZ2UsIHBhdGgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGlzdEFsbChzdG9yYWdlUmVmKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXM6IHJlc3VsdC5pdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0uZnVsbFBhdGgpLFxuICAgICAgICBuZXh0UGFnZVRva2VuOiB1bmRlZmluZWQsIC8vIGxpc3RBbGwgbm8gc29wb3J0YSBwYWdpbmFjacOzblxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVUSUxJREFERVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdlbmVyYSB1biBub21icmUgZGUgYXJjaGl2byDDum5pY28gY29uIHRpbWVzdGFtcC5cbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSAtIE5vbWJyZSBvcmlnaW5hbCBkZWwgYXJjaGl2b1xuICAgKiBAcGFyYW0gcHJlZml4IC0gUHJlZmlqbyBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBOb21icmUgw7puaWNvXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdW5pcXVlTmFtZSA9IHN0b3JhZ2UuZ2VuZXJhdGVGaWxlTmFtZSgncGhvdG8uanBnJywgJ3VzZXIxMjMnKTtcbiAgICogLy8gPT4gJ3VzZXIxMjNfMTcwMzA5MTIzNDU2N19waG90by5qcGcnXG4gICAqIGBgYFxuICAgKi9cbiAgZ2VuZXJhdGVGaWxlTmFtZShvcmlnaW5hbE5hbWU6IHN0cmluZywgcHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBvcmlnaW5hbE5hbWUucmVwbGFjZSgvW15hLXpBLVowLTkuLV0vZywgJ18nKTtcblxuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIHJldHVybiBgJHtwcmVmaXh9XyR7dGltZXN0YW1wfV8ke3Nhbml0aXplZE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RpbWVzdGFtcH1fJHtzYW5pdGl6ZWROYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhIHVuYSBydXRhIMO6bmljYSBwYXJhIHVuIGFyY2hpdm8uXG4gICAqXG4gICAqIEBwYXJhbSBkaXJlY3RvcnkgLSBEaXJlY3RvcmlvIGJhc2VcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSAtIE5vbWJyZSBvcmlnaW5hbFxuICAgKiBAcGFyYW0gcHJlZml4IC0gUHJlZmlqbyBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBSdXRhIGNvbXBsZXRhIMO6bmljYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHBhdGggPSBzdG9yYWdlLmdlbmVyYXRlUGF0aCgndXBsb2FkcycsICdwaG90by5qcGcnLCAndXNlcjEyMycpO1xuICAgKiAvLyA9PiAndXBsb2Fkcy91c2VyMTIzXzE3MDMwOTEyMzQ1NjdfcGhvdG8uanBnJ1xuICAgKiBgYGBcbiAgICovXG4gIGdlbmVyYXRlUGF0aChkaXJlY3Rvcnk6IHN0cmluZywgb3JpZ2luYWxOYW1lOiBzdHJpbmcsIHByZWZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmdlbmVyYXRlRmlsZU5hbWUob3JpZ2luYWxOYW1lLCBwcmVmaXgpO1xuICAgIGNvbnN0IGNsZWFuRGlyID0gZGlyZWN0b3J5LnJlcGxhY2UoL1xcLyskLywgJycpOyAvLyBSZW1vdmVyIC8gZmluYWxcbiAgICByZXR1cm4gYCR7Y2xlYW5EaXJ9LyR7ZmlsZU5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGV4dGVuc2nDs24gZGUgdW4gYXJjaGl2by5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVuYW1lIC0gTm9tYnJlIGRlbCBhcmNoaXZvXG4gICAqIEByZXR1cm5zIEV4dGVuc2nDs24gKHNpbiBlbCBwdW50bylcbiAgICovXG4gIGdldEV4dGVuc2lvbihmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IGZpbGVuYW1lLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5wb3AoKSEudG9Mb3dlckNhc2UoKSA6ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGFyY2hpdm8gZXMgdW5hIGltYWdlbiBiYXPDoW5kb3NlIGVuIHN1IGV4dGVuc2nDs24uXG4gICAqL1xuICBpc0ltYWdlKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBleHQgPSB0aGlzLmdldEV4dGVuc2lvbihmaWxlbmFtZSk7XG4gICAgcmV0dXJuIFsnanBnJywgJ2pwZWcnLCAncG5nJywgJ2dpZicsICd3ZWJwJywgJ3N2ZycsICdibXAnXS5pbmNsdWRlcyhleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGFyY2hpdm8gZXMgdW4gZG9jdW1lbnRvLlxuICAgKi9cbiAgaXNEb2N1bWVudChmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXh0ID0gdGhpcy5nZXRFeHRlbnNpb24oZmlsZW5hbWUpO1xuICAgIHJldHVybiBbJ3BkZicsICdkb2MnLCAnZG9jeCcsICd4bHMnLCAneGxzeCcsICdwcHQnLCAncHB0eCcsICd0eHQnXS5pbmNsdWRlcyhleHQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE3DiVRPRE9TIFBSSVZBRE9TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBNYXBlYSBlbCBlc3RhZG8gZGUgbGEgdGFyZWEgZGUgdXBsb2FkXG4gICAqL1xuICBwcml2YXRlIG1hcFRhc2tTdGF0ZShzdGF0ZTogc3RyaW5nKTogVXBsb2FkU3RhdGUge1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgJ3J1bm5pbmcnOlxuICAgICAgICByZXR1cm4gJ3J1bm5pbmcnO1xuICAgICAgY2FzZSAncGF1c2VkJzpcbiAgICAgICAgcmV0dXJuICdwYXVzZWQnO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gICAgICBjYXNlICdjYW5jZWxlZCc6XG4gICAgICAgIHJldHVybiAnY2FuY2VsZWQnO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAncnVubmluZyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZpZXJ0ZSBlcnJvcmVzIGRlIFN0b3JhZ2UgYSBtZW5zYWplcyBlbiBlc3Bhw7FvbFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBjb2RlID0gKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlO1xuXG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9vYmplY3Qtbm90LWZvdW5kJzpcbiAgICAgICAgICByZXR1cm4gJ0VsIGFyY2hpdm8gbm8gZXhpc3RlJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS91bmF1dGhvcml6ZWQnOlxuICAgICAgICAgIHJldHVybiAnTm8gdGllbmVzIHBlcm1pc28gcGFyYSBhY2NlZGVyIGEgZXN0ZSBhcmNoaXZvJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9jYW5jZWxlZCc6XG4gICAgICAgICAgcmV0dXJuICdMYSBvcGVyYWNpw7NuIGZ1ZSBjYW5jZWxhZGEnO1xuICAgICAgICBjYXNlICdzdG9yYWdlL3F1b3RhLWV4Y2VlZGVkJzpcbiAgICAgICAgICByZXR1cm4gJ1NlIGhhIGV4Y2VkaWRvIGxhIGN1b3RhIGRlIGFsbWFjZW5hbWllbnRvJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9pbnZhbGlkLWNoZWNrc3VtJzpcbiAgICAgICAgICByZXR1cm4gJ0VsIGFyY2hpdm8gZXN0w6EgY29ycnVwdG8nO1xuICAgICAgICBjYXNlICdzdG9yYWdlL3JldHJ5LWxpbWl0LWV4Y2VlZGVkJzpcbiAgICAgICAgICByZXR1cm4gJ0Vycm9yIGRlIGNvbmV4acOzbi4gSW50ZW50YSBkZSBudWV2byc7XG4gICAgICAgIGNhc2UgJ3N0b3JhZ2UvaW52YWxpZC11cmwnOlxuICAgICAgICAgIHJldHVybiAnVVJMIGRlIGFyY2hpdm8gaW52w6FsaWRhJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9pbnZhbGlkLWFyZ3VtZW50JzpcbiAgICAgICAgICByZXR1cm4gJ0FyZ3VtZW50byBpbnbDoWxpZG8nO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBkZSBhbG1hY2VuYW1pZW50byBkZXNjb25vY2lkbyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICdFcnJvciBkZSBhbG1hY2VuYW1pZW50byBkZXNjb25vY2lkbyc7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Types
|
|
3
|
+
*
|
|
4
|
+
* Tipos e interfaces para la integración de Firebase en valtech-components.
|
|
5
|
+
* Todos los modelos de Firestore deben extender FirestoreDocument.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2ZpcmViYXNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaXJlYmFzZSBUeXBlc1xuICpcbiAqIFRpcG9zIGUgaW50ZXJmYWNlcyBwYXJhIGxhIGludGVncmFjacOzbiBkZSBGaXJlYmFzZSBlbiB2YWx0ZWNoLWNvbXBvbmVudHMuXG4gKiBUb2RvcyBsb3MgbW9kZWxvcyBkZSBGaXJlc3RvcmUgZGViZW4gZXh0ZW5kZXIgRmlyZXN0b3JlRG9jdW1lbnQuXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ09ORklHVVJBQ0nDk05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDb25maWd1cmFjacOzbiBkZSBGaXJlYmFzZSAodmFsb3JlcyBkZSBmaXJlYmFzZUNvbmZpZylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXJlYmFzZUNvbmZpZyB7XG4gIGFwaUtleTogc3RyaW5nO1xuICBhdXRoRG9tYWluOiBzdHJpbmc7XG4gIHByb2plY3RJZDogc3RyaW5nO1xuICBzdG9yYWdlQnVja2V0OiBzdHJpbmc7XG4gIG1lc3NhZ2luZ1NlbmRlcklkOiBzdHJpbmc7XG4gIGFwcElkOiBzdHJpbmc7XG4gIG1lYXN1cmVtZW50SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gZGUgZW11bGFkb3JlcyBwYXJhIGRlc2Fycm9sbG8gbG9jYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXVsYXRvckNvbmZpZyB7XG4gIGZpcmVzdG9yZT86IHtcbiAgICBob3N0OiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyO1xuICB9O1xuICBhdXRoPzoge1xuICAgIGhvc3Q6IHN0cmluZztcbiAgICBwb3J0OiBudW1iZXI7XG4gIH07XG4gIHN0b3JhZ2U/OiB7XG4gICAgaG9zdDogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmFjacOzbiBjb21wbGV0YSBkZSBWYWx0ZWNoIEZpcmViYXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdGVjaEZpcmViYXNlQ29uZmlnIHtcbiAgLyoqIENvbmZpZ3VyYWNpw7NuIGRlIEZpcmViYXNlICovXG4gIGZpcmViYXNlOiBGaXJlYmFzZUNvbmZpZztcbiAgLyoqIENvbmZpZ3VyYWNpw7NuIGRlIGVtdWxhZG9yZXMgKG9wY2lvbmFsLCBwYXJhIGRlc2Fycm9sbG8pICovXG4gIGVtdWxhdG9yPzogRW11bGF0b3JDb25maWc7XG4gIC8qKiBIYWJpbGl0YXIgcGVyc2lzdGVuY2lhIG9mZmxpbmUgZGUgRmlyZXN0b3JlIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgcGVyc2lzdGVuY2U/OiBib29sZWFuO1xuICAvKiogVkFQSUQga2V5IHBhcmEgRmlyZWJhc2UgQ2xvdWQgTWVzc2FnaW5nICovXG4gIG1lc3NhZ2luZ1ZhcGlkS2V5Pzogc3RyaW5nO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGSVJFU1RPUkUgLSBET0NVTUVOVE9TXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogSW50ZXJmYWNlIGJhc2UgcGFyYSB0b2RvcyBsb3MgZG9jdW1lbnRvcyBkZSBGaXJlc3RvcmUuXG4gKiBUb2RvcyBsb3MgbW9kZWxvcyBkZWJlbiBleHRlbmRlciBlc3RhIGludGVyZmFjZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW50ZXJmYWNlIFVzZXIgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudCB7XG4gKiAgIG5hbWU6IHN0cmluZztcbiAqICAgZW1haWw6IHN0cmluZztcbiAqIH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXJlc3RvcmVEb2N1bWVudCB7XG4gIC8qKiBJRCBkZWwgZG9jdW1lbnRvIChhc2lnbmFkbyBwb3IgRmlyZXN0b3JlKSAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIEZlY2hhIGRlIGNyZWFjacOzbiAobWFuZWphZGEgYXV0b23DoXRpY2FtZW50ZSkgKi9cbiAgY3JlYXRlZEF0PzogRGF0ZTtcbiAgLyoqIEZlY2hhIGRlIMO6bHRpbWEgYWN0dWFsaXphY2nDs24gKG1hbmVqYWRhIGF1dG9tw6F0aWNhbWVudGUpICovXG4gIHVwZGF0ZWRBdD86IERhdGU7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEZJUkVTVE9SRSAtIFFVRVJJRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBPcGVyYWRvcmVzIGRpc3BvbmlibGVzIHBhcmEgY2zDoXVzdWxhcyB3aGVyZVxuICovXG5leHBvcnQgdHlwZSBXaGVyZU9wZXJhdG9yID1cbiAgfCAnPT0nXG4gIHwgJyE9J1xuICB8ICc8J1xuICB8ICc8PSdcbiAgfCAnPidcbiAgfCAnPj0nXG4gIHwgJ2FycmF5LWNvbnRhaW5zJ1xuICB8ICdhcnJheS1jb250YWlucy1hbnknXG4gIHwgJ2luJ1xuICB8ICdub3QtaW4nO1xuXG4vKipcbiAqIENsw6F1c3VsYSB3aGVyZSBwYXJhIGZpbHRyYXIgZG9jdW1lbnRvc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdoZXJlQ2xhdXNlIHtcbiAgLyoqIENhbXBvIGEgZmlsdHJhciAqL1xuICBmaWVsZDogc3RyaW5nO1xuICAvKiogT3BlcmFkb3IgZGUgY29tcGFyYWNpw7NuICovXG4gIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yO1xuICAvKiogVmFsb3IgYSBjb21wYXJhciAqL1xuICB2YWx1ZTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBEaXJlY2Npw7NuIGRlIG9yZGVuYW1pZW50b1xuICovXG5leHBvcnQgdHlwZSBPcmRlckRpcmVjdGlvbiA9ICdhc2MnIHwgJ2Rlc2MnO1xuXG4vKipcbiAqIENsw6F1c3VsYSBvcmRlckJ5IHBhcmEgb3JkZW5hciByZXN1bHRhZG9zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JkZXJCeUNsYXVzZSB7XG4gIC8qKiBDYW1wbyBwb3IgZWwgY3VhbCBvcmRlbmFyICovXG4gIGZpZWxkOiBzdHJpbmc7XG4gIC8qKiBEaXJlY2Npw7NuIGRlbCBvcmRlbmFtaWVudG8gKi9cbiAgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbjtcbn1cblxuLyoqXG4gKiBPcGNpb25lcyBwYXJhIHF1ZXJpZXMgZGUgRmlyZXN0b3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlPcHRpb25zIHtcbiAgLyoqIEZpbHRyb3Mgd2hlcmUgKEFORCBlbnRyZSB0b2RvcykgKi9cbiAgd2hlcmU/OiBXaGVyZUNsYXVzZVtdO1xuICAvKiogT3JkZW5hbWllbnRvIGRlIHJlc3VsdGFkb3MgKi9cbiAgb3JkZXJCeT86IE9yZGVyQnlDbGF1c2VbXTtcbiAgLyoqIEzDrW1pdGUgZGUgZG9jdW1lbnRvcyBhIHJldG9ybmFyICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogQ3Vyc29yIHBhcmEgcGFnaW5hY2nDs246IGVtcGV6YXIgZGVzcHXDqXMgZGUgZXN0ZSBkb2N1bWVudG8gKi9cbiAgc3RhcnRBZnRlcj86IHVua25vd247XG4gIC8qKiBDdXJzb3IgcGFyYSBwYWdpbmFjacOzbjogZW1wZXphciBlbiBlc3RlIGRvY3VtZW50byAqL1xuICBzdGFydEF0PzogdW5rbm93bjtcbiAgLyoqIEN1cnNvciBwYXJhIHBhZ2luYWNpw7NuOiB0ZXJtaW5hciBhbnRlcyBkZSBlc3RlIGRvY3VtZW50byAqL1xuICBlbmRCZWZvcmU/OiB1bmtub3duO1xuICAvKiogQ3Vyc29yIHBhcmEgcGFnaW5hY2nDs246IHRlcm1pbmFyIGVuIGVzdGUgZG9jdW1lbnRvICovXG4gIGVuZEF0PzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBPcGNpb25lcyBhZGljaW9uYWxlcyBwYXJhIHN1YnNjcmlwY2lvbmVzIHJlYWwtdGltZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmlwdGlvbk9wdGlvbnMgZXh0ZW5kcyBRdWVyeU9wdGlvbnMge1xuICAvKiogSW5jbHVpciBjYW1iaW9zIGRlIG1ldGFkYXRhIChlajogcGVuZGluZ1dyaXRlcykgKi9cbiAgaW5jbHVkZU1ldGFkYXRhQ2hhbmdlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVzdWx0YWRvIGRlIHVuYSBxdWVyeSBwYWdpbmFkYVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZFJlc3VsdDxUPiB7XG4gIC8qKiBEb2N1bWVudG9zIGRlIGxhIHDDoWdpbmEgYWN0dWFsICovXG4gIGRhdGE6IFRbXTtcbiAgLyoqIEluZGljYSBzaSBoYXkgbcOhcyBww6FnaW5hcyBkaXNwb25pYmxlcyAqL1xuICBoYXNNb3JlOiBib29sZWFuO1xuICAvKiogQ3Vyc29yIHBhcmEgbGEgc2lndWllbnRlIHDDoWdpbmEgKHBhc2FyIGEgc3RhcnRBZnRlcikgKi9cbiAgbGFzdERvYzogdW5rbm93bjtcbiAgLyoqIFRvdGFsIGRlIGRvY3VtZW50b3MgKG9wY2lvbmFsLCByZXF1aWVyZSBxdWVyeSBhZGljaW9uYWwpICovXG4gIHRvdGFsPzogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTVE9SQUdFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXN0YWRvIGRlIHVuYSBvcGVyYWNpw7NuIGRlIHVwbG9hZFxuICovXG5leHBvcnQgdHlwZSBVcGxvYWRTdGF0ZSA9ICdydW5uaW5nJyB8ICdwYXVzZWQnIHwgJ3N1Y2Nlc3MnIHwgJ2NhbmNlbGVkJyB8ICdlcnJvcic7XG5cbi8qKlxuICogUHJvZ3Jlc28gZGUgdXBsb2FkIGRlIGFyY2hpdm9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRQcm9ncmVzcyB7XG4gIC8qKiBCeXRlcyB0cmFuc2Zlcmlkb3MgaGFzdGEgYWhvcmEgKi9cbiAgYnl0ZXNUcmFuc2ZlcnJlZDogbnVtYmVyO1xuICAvKiogVG90YWwgZGUgYnl0ZXMgYSB0cmFuc2ZlcmlyICovXG4gIHRvdGFsQnl0ZXM6IG51bWJlcjtcbiAgLyoqIFBvcmNlbnRhamUgY29tcGxldGFkbyAoMC0xMDApICovXG4gIHBlcmNlbnRhZ2U6IG51bWJlcjtcbiAgLyoqIEVzdGFkbyBhY3R1YWwgZGVsIHVwbG9hZCAqL1xuICBzdGF0ZTogVXBsb2FkU3RhdGU7XG59XG5cbi8qKlxuICogUmVzdWx0YWRvIGRlIHVuIHVwbG9hZCBjb21wbGV0YWRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkUmVzdWx0IHtcbiAgLyoqIFVSTCBkZSBkZXNjYXJnYSBkZWwgYXJjaGl2byAqL1xuICBkb3dubG9hZFVybDogc3RyaW5nO1xuICAvKiogUnV0YSBjb21wbGV0YSBlbiBTdG9yYWdlICovXG4gIGZ1bGxQYXRoOiBzdHJpbmc7XG4gIC8qKiBOb21icmUgZGVsIGFyY2hpdm8gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogVGFtYcOxbyBlbiBieXRlcyAqL1xuICBzaXplOiBudW1iZXI7XG4gIC8qKiBUaXBvIE1JTUUgZGVsIGFyY2hpdm8gKi9cbiAgY29udGVudFR5cGU6IHN0cmluZztcbiAgLyoqIE1ldGFkYXRhIHBlcnNvbmFsaXphZGEgKi9cbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogTWV0YWRhdGEgcGFyYSBhcmNoaXZvcyBlbiBTdG9yYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZU1ldGFkYXRhIHtcbiAgLyoqIFRpcG8gTUlNRSBkZWwgYXJjaGl2byAqL1xuICBjb250ZW50VHlwZT86IHN0cmluZztcbiAgLyoqIE1ldGFkYXRhIHBlcnNvbmFsaXphZGEgKGtleS12YWx1ZSkgKi9cbiAgY3VzdG9tTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogQ29udHJvbCBkZSBjYWNow6kgSFRUUCAqL1xuICBjYWNoZUNvbnRyb2w/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0YWRvIGRlIGxpc3RhciBhcmNoaXZvcyBlbiBTdG9yYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUxpc3RSZXN1bHQge1xuICAvKiogUnV0YXMgZGUgbG9zIGFyY2hpdm9zIGVuY29udHJhZG9zICovXG4gIGl0ZW1zOiBzdHJpbmdbXTtcbiAgLyoqIFRva2VuIHBhcmEgbGEgc2lndWllbnRlIHDDoWdpbmEgKHNpIGhheSBtw6FzKSAqL1xuICBuZXh0UGFnZVRva2VuPzogc3RyaW5nO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBVVRIIC8gU0VTU0lPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEluZm9ybWFjacOzbiBkZWwgdXN1YXJpbyBkZSBGaXJlYmFzZSAoc2ltcGxpZmljYWRhKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpcmViYXNlVXNlciB7XG4gIC8qKiBVSUQgw7puaWNvIGRlbCB1c3VhcmlvICovXG4gIHVpZDogc3RyaW5nO1xuICAvKiogRW1haWwgZGVsIHVzdWFyaW8gKi9cbiAgZW1haWw6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBOb21icmUgcGFyYSBtb3N0cmFyICovXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVVJMIGRlIGZvdG8gZGUgcGVyZmlsICovXG4gIHBob3RvVVJMOiBzdHJpbmcgfCBudWxsO1xuICAvKiogRW1haWwgdmVyaWZpY2FkbyAqL1xuICBlbWFpbFZlcmlmaWVkOiBib29sZWFuO1xuICAvKiogVXN1YXJpbyBhbsOzbmltbyAqL1xuICBpc0Fub255bW91czogYm9vbGVhbjtcbiAgLyoqIFByb3ZlZWRvciBkZSBhdXRlbnRpY2FjacOzbiAqL1xuICBwcm92aWRlcklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXN0YWRvIGRlIGxhIHNlc2nDs24gZGUgRmlyZWJhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uU3RhdGUge1xuICAvKiogVXN1YXJpbyBhY3R1YWwgKG51bGwgc2kgbm8gYXV0ZW50aWNhZG8pICovXG4gIHVzZXI6IEZpcmViYXNlVXNlciB8IG51bGw7XG4gIC8qKiBJbmRpY2Egc2kgZWwgdXN1YXJpbyBlc3TDoSBhdXRlbnRpY2FkbyAqL1xuICBpc0F1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XG4gIC8qKiBJbmRpY2Egc2kgc2UgZXN0w6EgY2FyZ2FuZG8gZWwgZXN0YWRvIGRlIGF1dGggKi9cbiAgaXNMb2FkaW5nOiBib29sZWFuO1xuICAvKiogRXJyb3IgZGUgYXV0ZW50aWNhY2nDs24gKHNpIGxvIGhheSkgKi9cbiAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTUVTU0FHSU5HIChGQ00pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXN0YWRvIGRlbCBwZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzXG4gKi9cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvblBlcm1pc3Npb24gPSAnZ3JhbnRlZCcgfCAnZGVuaWVkJyB8ICdkZWZhdWx0JztcblxuLyoqXG4gKiBQYXlsb2FkIGRlIHVuYSBub3RpZmljYWNpw7NuIHB1c2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25QYXlsb2FkIHtcbiAgLyoqIFTDrXR1bG8gZGUgbGEgbm90aWZpY2FjacOzbiAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqIEN1ZXJwbyBkZWwgbWVuc2FqZSAqL1xuICBib2R5Pzogc3RyaW5nO1xuICAvKiogVVJMIGRlIGltYWdlbiAqL1xuICBpbWFnZT86IHN0cmluZztcbiAgLyoqIERhdG9zIHBlcnNvbmFsaXphZG9zICovXG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogSUQgZGVsIG1lbnNhamUgZGUgRkNNICovXG4gIG1lc3NhZ2VJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBY2Npw7NuIGRlIG5hdmVnYWNpw7NuIGRlc2RlIHVuYSBub3RpZmljYWNpw7NuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uQWN0aW9uIHtcbiAgLyoqIFJ1dGEgaW50ZXJuYSBkZSBsYSBhcHAgKGVqOiAnL29yZGVycy8xMjMnKSAqL1xuICByb3V0ZT86IHN0cmluZztcbiAgLyoqIFVSTCBleHRlcm5hIChlajogJ2h0dHBzOi8vZXhhbXBsZS5jb20nKSAqL1xuICB1cmw/OiBzdHJpbmc7XG4gIC8qKiBQYXLDoW1ldHJvcyBkZSBxdWVyeSBzdHJpbmcgKi9cbiAgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogVGlwbyBkZSBhY2Npw7NuIHBlcnNvbmFsaXphZGEgKi9cbiAgYWN0aW9uVHlwZT86IHN0cmluZztcbiAgLyoqIERhdG9zIGFkaWNpb25hbGVzIHBhcmEgbGEgYWNjacOzbiAqL1xuICBhY3Rpb25EYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogRXZlbnRvIGRlIGNsaWNrIGVuIHVuYSBub3RpZmljYWNpw7NuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uQ2xpY2tFdmVudCB7XG4gIC8qKiBQYXlsb2FkIG9yaWdpbmFsIGRlIGxhIG5vdGlmaWNhY2nDs24gKi9cbiAgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb25QYXlsb2FkO1xuICAvKiogQWNjacOzbiBkZSBuYXZlZ2FjacOzbiBleHRyYcOtZGEgKi9cbiAgYWN0aW9uOiBOb3RpZmljYXRpb25BY3Rpb247XG4gIC8qKiBUaW1lc3RhbXAgZGVsIGNsaWNrICovXG4gIHRpbWVzdGFtcDogRGF0ZTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRVJST1JFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEPDs2RpZ29zIGRlIGVycm9yIGRlIEZpcmViYXNlXG4gKi9cbmV4cG9ydCB0eXBlIEZpcmViYXNlRXJyb3JDb2RlID1cbiAgfCAncGVybWlzc2lvbi1kZW5pZWQnXG4gIHwgJ25vdC1mb3VuZCdcbiAgfCAnYWxyZWFkeS1leGlzdHMnXG4gIHwgJ3Jlc291cmNlLWV4aGF1c3RlZCdcbiAgfCAnY2FuY2VsbGVkJ1xuICB8ICd1bmtub3duJ1xuICB8ICdpbnZhbGlkLWFyZ3VtZW50J1xuICB8ICdkZWFkbGluZS1leGNlZWRlZCdcbiAgfCAndW5hdXRoZW50aWNhdGVkJztcblxuLyoqXG4gKiBFcnJvciBkZSBGaXJlYmFzZSB0aXBhZG9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXJlYmFzZUVycm9yIHtcbiAgLyoqIEPDs2RpZ28gZGVsIGVycm9yICovXG4gIGNvZGU6IEZpcmViYXNlRXJyb3JDb2RlO1xuICAvKiogTWVuc2FqZSBkZSBlcnJvciAoZW4gZXNwYcOxb2wpICovXG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIEVycm9yIG9yaWdpbmFsIGRlIEZpcmViYXNlICovXG4gIG9yaWdpbmFsRXJyb3I/OiB1bmtub3duO1xufVxuIl19
|