@dereekb/dbx-firebase 12.4.5 → 12.5.1
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/auth/login/login.button.component.mjs +1 -1
- package/esm2022/lib/auth/login/login.email.content.component.mjs +2 -2
- package/esm2022/lib/development/development.scheduler.list.component.mjs +1 -1
- package/esm2022/lib/firestore/firebase.firestore.providers.mjs +21 -2
- package/esm2022/lib/model/loader/collection.loader.instance.mjs +65 -5
- package/esm2022/lib/model/modules/store/index.mjs +2 -1
- package/esm2022/lib/model/modules/store/store.collection.crud.mjs +28 -0
- package/esm2022/lib/model/modules/store/store.collection.directive.mjs +20 -2
- package/esm2022/lib/model/modules/store/store.collection.mjs +14 -1
- package/esm2022/lib/modules/index.mjs +2 -1
- package/esm2022/lib/modules/storagefile/container/index.mjs +7 -0
- package/esm2022/lib/modules/storagefile/container/storagefile.upload.action.handler.directive.mjs +118 -0
- package/esm2022/lib/modules/storagefile/container/storagefile.upload.error.mjs +12 -0
- package/esm2022/lib/modules/storagefile/container/storagefile.upload.handler.mjs +260 -0
- package/esm2022/lib/modules/storagefile/container/storagefile.upload.initialize.document.directive.mjs +39 -0
- package/esm2022/lib/modules/storagefile/container/storagefile.upload.store.directive.mjs +38 -0
- package/esm2022/lib/modules/storagefile/container/storagefile.upload.sync.directive.mjs +36 -0
- package/esm2022/lib/modules/storagefile/index.mjs +4 -0
- package/esm2022/lib/modules/storagefile/storagefile.upload.module.mjs +83 -0
- package/esm2022/lib/modules/storagefile/store/index.mjs +6 -0
- package/esm2022/lib/modules/storagefile/store/storagefile.collection.store.directive.mjs +22 -0
- package/esm2022/lib/modules/storagefile/store/storagefile.collection.store.mjs +18 -0
- package/esm2022/lib/modules/storagefile/store/storagefile.document.store.directive.mjs +21 -0
- package/esm2022/lib/modules/storagefile/store/storagefile.document.store.mjs +22 -0
- package/esm2022/lib/modules/storagefile/store/storagefile.upload.store.mjs +63 -0
- package/esm2022/lib/storage/firebase.storage.module.mjs +2 -2
- package/fesm2022/dereekb-dbx-firebase.mjs +839 -30
- package/fesm2022/dereekb-dbx-firebase.mjs.map +1 -1
- package/lib/firestore/firebase.firestore.providers.d.ts +14 -1
- package/lib/model/loader/collection.loader.instance.d.ts +26 -1
- package/lib/model/modules/store/index.d.ts +1 -0
- package/lib/model/modules/store/store.collection.crud.d.ts +21 -0
- package/lib/model/modules/store/store.collection.d.ts +19 -2
- package/lib/model/modules/store/store.collection.directive.d.ts +12 -2
- package/lib/modules/index.d.ts +1 -0
- package/lib/modules/storagefile/container/index.d.ts +6 -0
- package/lib/modules/storagefile/container/storagefile.upload.action.handler.directive.d.ts +47 -0
- package/lib/modules/storagefile/container/storagefile.upload.error.d.ts +9 -0
- package/lib/modules/storagefile/container/storagefile.upload.handler.d.ts +183 -0
- package/lib/modules/storagefile/container/storagefile.upload.initialize.document.directive.d.ts +14 -0
- package/lib/modules/storagefile/container/storagefile.upload.store.directive.d.ts +20 -0
- package/lib/modules/storagefile/container/storagefile.upload.sync.directive.d.ts +18 -0
- package/lib/modules/storagefile/index.d.ts +3 -0
- package/lib/modules/storagefile/storagefile.upload.module.d.ts +29 -0
- package/lib/modules/storagefile/store/index.d.ts +5 -0
- package/lib/modules/storagefile/store/storagefile.collection.store.d.ts +10 -0
- package/lib/modules/storagefile/store/storagefile.collection.store.directive.d.ts +9 -0
- package/lib/modules/storagefile/store/storagefile.document.store.d.ts +15 -0
- package/lib/modules/storagefile/store/storagefile.document.store.directive.d.ts +9 -0
- package/lib/modules/storagefile/store/storagefile.upload.store.d.ts +166 -0
- package/lib/storage/firebase.storage.module.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { catchError, map, Observable, of, shareReplay } from 'rxjs';
|
|
2
|
+
import { runAsyncTasksForValues, separateValues } from '@dereekb/util';
|
|
3
|
+
import { MultiSubscriptionObject } from '@dereekb/rxjs';
|
|
4
|
+
/**
|
|
5
|
+
* Default implementation of StorageFileUploadHandler.
|
|
6
|
+
*/
|
|
7
|
+
export function storageFileUploadHandler(config) {
|
|
8
|
+
const { storageService, storageFileUploadConfigFactory } = config;
|
|
9
|
+
let resumable;
|
|
10
|
+
return {
|
|
11
|
+
uploadFile: async (file) => {
|
|
12
|
+
const storageFileUploadConfig = await storageFileUploadConfigFactory(file);
|
|
13
|
+
const { storagePath } = storageFileUploadConfig;
|
|
14
|
+
const storageAccessorFile = storageService.file(storagePath);
|
|
15
|
+
const upload = new Observable((x) => {
|
|
16
|
+
if (storageAccessorFile.uploadResumable) {
|
|
17
|
+
resumable = storageAccessorFile.uploadResumable(file);
|
|
18
|
+
// subscribe to the event by piping this observable to it
|
|
19
|
+
resumable
|
|
20
|
+
.streamSnapshotEvents()
|
|
21
|
+
.pipe(map((x) => {
|
|
22
|
+
const { bytesTransferred, totalBytes } = x;
|
|
23
|
+
const progress = {
|
|
24
|
+
file,
|
|
25
|
+
fileRef: storageAccessorFile,
|
|
26
|
+
uploadRef: resumable,
|
|
27
|
+
bytesTransferred,
|
|
28
|
+
totalBytes,
|
|
29
|
+
progress: bytesTransferred / totalBytes
|
|
30
|
+
};
|
|
31
|
+
return progress;
|
|
32
|
+
}))
|
|
33
|
+
.pipe(catchError((error) => {
|
|
34
|
+
// if an error occurs, catch it and emit it as a progress
|
|
35
|
+
const progress = {
|
|
36
|
+
file,
|
|
37
|
+
fileRef: storageAccessorFile,
|
|
38
|
+
uploadRef: resumable,
|
|
39
|
+
error,
|
|
40
|
+
failed: true
|
|
41
|
+
};
|
|
42
|
+
return of(progress);
|
|
43
|
+
}))
|
|
44
|
+
.subscribe(x);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
throw new Error('uploadResumable() function was unavailable.');
|
|
48
|
+
}
|
|
49
|
+
}).pipe(shareReplay(1));
|
|
50
|
+
const instance = {
|
|
51
|
+
upload,
|
|
52
|
+
taskRef: storageAccessorFile,
|
|
53
|
+
pause: () => resumable?.pause() ?? false,
|
|
54
|
+
resume: () => resumable?.resume() ?? false,
|
|
55
|
+
cancel: () => resumable?.cancel() ?? false
|
|
56
|
+
};
|
|
57
|
+
return instance;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Uploads files using the provided upload handler and files.
|
|
63
|
+
*
|
|
64
|
+
* An observable is returned that emits the latest file events from any file that is being uploaded.
|
|
65
|
+
*
|
|
66
|
+
* @param input
|
|
67
|
+
* @returns
|
|
68
|
+
*/
|
|
69
|
+
export function storageFileUploadFiles(input) {
|
|
70
|
+
const { uploadHandler, files, maxParallelUploads: inputMaxParallelUploads } = input;
|
|
71
|
+
const maxParallelTasks = inputMaxParallelUploads ?? 3;
|
|
72
|
+
const multiUploadsSubscriptionObject = new MultiSubscriptionObject();
|
|
73
|
+
// begin the upload for each file
|
|
74
|
+
const allFiles = Array.from(files);
|
|
75
|
+
// unsubscribe from all previous uploads
|
|
76
|
+
multiUploadsSubscriptionObject.unsub();
|
|
77
|
+
const allFilesAndLatestProgress = new Array(allFiles.length);
|
|
78
|
+
const allFilesAndDetails = allFiles.map((file) => ({ file }));
|
|
79
|
+
const overallProgressPerCompletedFile = (1 / allFilesAndLatestProgress.length);
|
|
80
|
+
/**
|
|
81
|
+
* Once set, any new file upload task that hits this will return an cancel failure.
|
|
82
|
+
*/
|
|
83
|
+
let flaggedCancel = false;
|
|
84
|
+
const cancel = () => {
|
|
85
|
+
flaggedCancel = true;
|
|
86
|
+
};
|
|
87
|
+
const upload = new Observable((subscriber) => {
|
|
88
|
+
const overallStartTime = new Date();
|
|
89
|
+
const incompleteFileFileIndexes = new Set(allFiles.map((_, index) => index));
|
|
90
|
+
const activeFileIndexes = new Set();
|
|
91
|
+
const doneFileIndexes = new Set();
|
|
92
|
+
let latestOverallProgress = 0;
|
|
93
|
+
function onStartFileUpload(index, uploadInstance) {
|
|
94
|
+
activeFileIndexes.add(index);
|
|
95
|
+
allFilesAndDetails[index].startTime = new Date();
|
|
96
|
+
allFilesAndDetails[index].uploadInstance = uploadInstance;
|
|
97
|
+
allFilesAndDetails[index].fileRef = uploadInstance.taskRef;
|
|
98
|
+
}
|
|
99
|
+
function onStartFileUploadFlaggedCancelled(index) {
|
|
100
|
+
allFilesAndDetails[index].startTime = new Date();
|
|
101
|
+
// immediately mark it done
|
|
102
|
+
_markFileUploadDone(index, true);
|
|
103
|
+
// emit new progress event
|
|
104
|
+
_emitEvent();
|
|
105
|
+
}
|
|
106
|
+
function _markFileUploadDone(fileIndex, finalError) {
|
|
107
|
+
doneFileIndexes.add(fileIndex); // add to done file indexes
|
|
108
|
+
activeFileIndexes.delete(fileIndex); // remove from active file indexes if it exists
|
|
109
|
+
incompleteFileFileIndexes.delete(fileIndex); // remove from incomplete file indexes
|
|
110
|
+
// update details
|
|
111
|
+
allFilesAndDetails[fileIndex].endTime = new Date();
|
|
112
|
+
const error = finalError ?? allFilesAndDetails[fileIndex].error;
|
|
113
|
+
allFilesAndDetails[fileIndex].success = !error;
|
|
114
|
+
allFilesAndDetails[fileIndex].error = error;
|
|
115
|
+
}
|
|
116
|
+
function updateUploadProgress(input) {
|
|
117
|
+
const { index: fileIndex, nextProgress, fileUploadTaskDone: inputFileUploadTaskDone, nonProgressError } = input;
|
|
118
|
+
const error = nonProgressError ?? nextProgress?.error;
|
|
119
|
+
const fileUploadTaskDone = inputFileUploadTaskDone ?? Boolean(error);
|
|
120
|
+
// the task may already be done, as after a progress-related error the complete task can get called.
|
|
121
|
+
const isTaskAlreadyDone = allFilesAndDetails[fileIndex].endTime != null;
|
|
122
|
+
if (!isTaskAlreadyDone) {
|
|
123
|
+
let nextOverallProgress = latestOverallProgress;
|
|
124
|
+
const nextProgressPercent = fileUploadTaskDone ? 100 : (nextProgress?.progress ?? 0) * 100;
|
|
125
|
+
// update the overall progress percentage
|
|
126
|
+
if (nextProgressPercent) {
|
|
127
|
+
// update the overall percentage
|
|
128
|
+
const previousProgress = allFilesAndLatestProgress[fileIndex];
|
|
129
|
+
const previousProgressPercent = previousProgress?.progress != null ? previousProgress.progress * 100 : 0;
|
|
130
|
+
const progressPercentChange = nextProgressPercent - previousProgressPercent;
|
|
131
|
+
// increase overall progress by the change
|
|
132
|
+
nextOverallProgress += progressPercentChange * overallProgressPerCompletedFile;
|
|
133
|
+
}
|
|
134
|
+
// update the file progress
|
|
135
|
+
if (nextProgress) {
|
|
136
|
+
// update the latest FileProgress
|
|
137
|
+
allFilesAndLatestProgress[fileIndex] = nextProgress;
|
|
138
|
+
// only set fileRef once
|
|
139
|
+
if (!allFilesAndDetails[fileIndex].fileRef) {
|
|
140
|
+
allFilesAndDetails[fileIndex].fileRef = nextProgress.fileRef;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// if complete, update the indexes and details
|
|
144
|
+
if (fileUploadTaskDone) {
|
|
145
|
+
_markFileUploadDone(fileIndex, error);
|
|
146
|
+
}
|
|
147
|
+
// update the overall progress
|
|
148
|
+
latestOverallProgress = nextOverallProgress;
|
|
149
|
+
// emit the event to send it
|
|
150
|
+
_emitEvent(nextProgress);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function _emitEvent(nextProgress) {
|
|
154
|
+
const isComplete = incompleteFileFileIndexes.size === 0;
|
|
155
|
+
let overallProgress = latestOverallProgress;
|
|
156
|
+
let result = undefined;
|
|
157
|
+
if (isComplete) {
|
|
158
|
+
overallProgress = 100; // set to 100%
|
|
159
|
+
const overallEndTime = new Date();
|
|
160
|
+
const fileResults = allFiles.map((file, index) => {
|
|
161
|
+
const result = {
|
|
162
|
+
startTime: allFilesAndDetails[index].startTime,
|
|
163
|
+
endTime: allFilesAndDetails[index].endTime,
|
|
164
|
+
file,
|
|
165
|
+
fileRef: allFilesAndDetails[index].fileRef,
|
|
166
|
+
success: !allFilesAndDetails[index].error,
|
|
167
|
+
error: allFilesAndDetails[index].error
|
|
168
|
+
};
|
|
169
|
+
return result;
|
|
170
|
+
});
|
|
171
|
+
const { included: successFileResults, excluded: errorFileResults } = separateValues(fileResults, (x) => x.success);
|
|
172
|
+
// all are done, set the result on the next event
|
|
173
|
+
result = {
|
|
174
|
+
startTime: overallStartTime,
|
|
175
|
+
endTime: overallEndTime,
|
|
176
|
+
successFileResults,
|
|
177
|
+
errorFileResults,
|
|
178
|
+
fileResults
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
const nextEvent = {
|
|
182
|
+
allFiles,
|
|
183
|
+
isComplete,
|
|
184
|
+
overallProgress,
|
|
185
|
+
uploadProgress: nextProgress,
|
|
186
|
+
incompleteFileCount: incompleteFileFileIndexes.size,
|
|
187
|
+
activeFileCount: activeFileIndexes.size,
|
|
188
|
+
doneFileCount: doneFileIndexes.size,
|
|
189
|
+
result
|
|
190
|
+
};
|
|
191
|
+
subscriber.next(nextEvent);
|
|
192
|
+
}
|
|
193
|
+
async function runUploadTaskForFile([file, index]) {
|
|
194
|
+
if (flaggedCancel) {
|
|
195
|
+
onStartFileUploadFlaggedCancelled(index);
|
|
196
|
+
return Promise.resolve();
|
|
197
|
+
}
|
|
198
|
+
return new Promise((resolve) => {
|
|
199
|
+
const updateFileUploadProgress = (nextProgress) => {
|
|
200
|
+
// update the progress
|
|
201
|
+
updateUploadProgress({
|
|
202
|
+
index,
|
|
203
|
+
nextProgress
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
const updateFileUploadProgressWithUncaughtError = (error) => {
|
|
207
|
+
// error occurred, update the progress with the error
|
|
208
|
+
updateUploadProgress({
|
|
209
|
+
index,
|
|
210
|
+
nonProgressError: error,
|
|
211
|
+
fileUploadTaskDone: true
|
|
212
|
+
});
|
|
213
|
+
// always resolve, never reject
|
|
214
|
+
resolve();
|
|
215
|
+
};
|
|
216
|
+
const completeFileUploadProgress = () => {
|
|
217
|
+
updateUploadProgress({
|
|
218
|
+
index,
|
|
219
|
+
fileUploadTaskDone: true
|
|
220
|
+
});
|
|
221
|
+
resolve();
|
|
222
|
+
};
|
|
223
|
+
// upload the file, subscribe to the progress
|
|
224
|
+
try {
|
|
225
|
+
uploadHandler
|
|
226
|
+
.uploadFile(file)
|
|
227
|
+
.then((uploadInstance) => {
|
|
228
|
+
// add to active file indexes
|
|
229
|
+
onStartFileUpload(index, uploadInstance);
|
|
230
|
+
const uploadSubscription = uploadInstance.upload.subscribe({
|
|
231
|
+
next: updateFileUploadProgress,
|
|
232
|
+
error: updateFileUploadProgressWithUncaughtError,
|
|
233
|
+
complete: completeFileUploadProgress
|
|
234
|
+
});
|
|
235
|
+
multiUploadsSubscriptionObject.addSubs(uploadSubscription);
|
|
236
|
+
})
|
|
237
|
+
.catch(updateFileUploadProgressWithUncaughtError);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
updateFileUploadProgressWithUncaughtError(error);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
// run upload task for each file
|
|
245
|
+
const fileTuples = allFiles.map((file, index) => [file, index]);
|
|
246
|
+
runAsyncTasksForValues(fileTuples, runUploadTaskForFile, {
|
|
247
|
+
maxParallelTasks,
|
|
248
|
+
retriesAllowed: 0 // no retries allowed
|
|
249
|
+
}).then(() => {
|
|
250
|
+
// all tasks are finished. Complete the subscriber.
|
|
251
|
+
subscriber.complete();
|
|
252
|
+
});
|
|
253
|
+
}).pipe(shareReplay(1));
|
|
254
|
+
const instance = {
|
|
255
|
+
cancel,
|
|
256
|
+
upload
|
|
257
|
+
};
|
|
258
|
+
return instance;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUudXBsb2FkLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2NvbnRhaW5lci9zdG9yYWdlZmlsZS51cGxvYWQuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwRSxPQUFPLEVBQXFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFxRXhEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE1BQXNDO0lBQzdFLE1BQU0sRUFBRSxjQUFjLEVBQUUsOEJBQThCLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFbEUsSUFBSSxTQUFtQyxDQUFDO0lBRXhDLE9BQU87UUFDTCxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUzRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsdUJBQXVCLENBQUM7WUFDaEQsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTdELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFnRCxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNqRixJQUFJLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QyxTQUFTLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUV0RCx5REFBeUQ7b0JBQ3pELFNBQVM7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Y0FBYyxDQUFDLENBQUM7d0JBRXpDLE1BQU0sa0JBQWtCLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7NEJBQ3pELElBQUksRUFBRSx3QkFBd0I7NEJBQzlCLEtBQUssRUFBRSx5Q0FBeUM7NEJBQ2hELFFBQVEsRUFBRSwwQkFBMEI7eUJBQ3JDLENBQUMsQ0FBQzt3QkFFSCw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDN0QsQ0FBQyxDQUFDO3lCQUNELEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YseUNBQXlDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25ELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBVSxDQUFDLENBQUM7UUFFekUsc0JBQXNCLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFO1lBQ3ZELGdCQUFnQjtZQUNoQixjQUFjLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtTQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNYLG1EQUFtRDtZQUNuRCxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEIsTUFBTSxRQUFRLEdBQW1DO1FBQy9DLE1BQU07UUFDTixNQUFNO0tBQ1AsQ0FBQztJQUVGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlRmlsZVByb2dyZXNzIH0gZnJvbSAnLi4vc3RvcmUnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JhZ2UvZmlyZWJhc2Uuc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEluZGV4TnVtYmVyLCBNYXliZSwgUGVyY2VudERlY2ltYWwsIFBlcmNlbnROdW1iZXIsIFByb21pc2VPclZhbHVlLCBydW5Bc3luY1Rhc2tzRm9yVmFsdWVzLCBzZXBhcmF0ZVZhbHVlcyB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgTXVsdGlTdWJzY3JpcHRpb25PYmplY3QgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IEZpcmViYXNlU3RvcmFnZUFjY2Vzc29yRmlsZSwgU3RvcmFnZUN1c3RvbU1ldGFkYXRhLCBTdG9yYWdlUGF0aElucHV0LCBTdG9yYWdlVXBsb2FkT3B0aW9ucywgU3RvcmFnZVVwbG9hZFRhc2sgfSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYnNlcnZhYmxlIGZvciB1cGxvYWRpbmcgYSBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJGdW5jdGlvbiA9IChmaWxlOiBGaWxlKSA9PiBQcm9taXNlPFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckluc3RhbmNlPjtcblxuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJJbnN0YW5jZSBleHRlbmRzIFBpY2s8U3RvcmFnZVVwbG9hZFRhc2s8RmlyZWJhc2VTdG9yYWdlQWNjZXNzb3JGaWxlPiwgJ3Rhc2tSZWYnIHwgJ3BhdXNlJyB8ICdyZXN1bWUnIHwgJ2NhbmNlbCc+IHtcbiAgLyoqXG4gICAqIFRoZSB1cGxvYWQgb2JzZXJ2YWJsZS5cbiAgICpcbiAgICogTXVzdCBiZSBzdWJzY3JpYmVkIHRvIGluIG9yZGVyIGZvciB0aGUgdXBsb2FkIHRvIGJlZ2luLlxuICAgKi9cbiAgcmVhZG9ubHkgdXBsb2FkOiBPYnNlcnZhYmxlPERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcz47XG59XG5cbi8qKlxuICogSGFuZGxlcyB1cGxvYWRpbmcgZmlsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUZpbGVVcGxvYWRIYW5kbGVyIHtcbiAgLyoqXG4gICAqIFVwbG9hZHMgYSBmaWxlLCBhbmQgcmV0dXJucyB0aGUgZmlsZSBwcm9ncmVzcyBhcyBpdCBpcyB1cGxvYWRpbmcuXG4gICAqL1xuICByZWFkb25seSB1cGxvYWRGaWxlOiBTdG9yYWdlRmlsZVVwbG9hZEhhbmRsZXJGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNpbmdsZSBmaWxlIHVwbG9hZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRmlsZVVwbG9hZENvbmZpZyB7XG4gIC8qKlxuICAgKiBQYXRoIGZvciB3aGVyZSB0byB1cGxvYWQgdGhlIGZpbGUgdG9cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VQYXRoOiBTdG9yYWdlUGF0aElucHV0O1xuICAvKipcbiAgICogVXBsb2FkIG9wdGlvbnMgZm9yIHRoZSBmaWxlLlxuICAgKlxuICAgKiBSZXN1bWFibGUgaXMgbm90IHN1cHBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHVwbG9hZE9wdGlvbnM/OiBTdG9yYWdlRmlsZVVwbG9hZENvbmZpZ09wdGlvbnM7XG4gIC8qKlxuICAgKiBDdXN0b20gbWV0YWRhdGEgZm9yIHRoZSBmaWxlLlxuICAgKlxuICAgKiBJcyBtZXJnZWQgd2l0aCB1cGxvYWRPcHRpb25zJ3MgbWV0YWRhdGEuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21NZXRhZGF0YT86IFN0b3JhZ2VDdXN0b21NZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBTdG9yYWdlRmlsZVVwbG9hZENvbmZpZyB1cGxvYWQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RvcmFnZUZpbGVVcGxvYWRDb25maWdPcHRpb25zID0gT21pdDxTdG9yYWdlVXBsb2FkT3B0aW9ucywgJ3Jlc3VtYWJsZSc+O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgZmlsZSBuYW1lcyBmb3IgdGhlIHVwbG9hZGVkIGZpbGVzLlxuICpcbiAqIElmIG5vdCBzZXQsIHRoZSBmaWxlIG5hbWUgd2lsbCBiZSB1c2VkIGFzIGlzLlxuICovXG5leHBvcnQgdHlwZSBTdG9yYWdlRmlsZVVwbG9hZENvbmZpZ0ZhY3RvcnkgPSAoZmlsZTogRmlsZSkgPT4gUHJvbWlzZU9yVmFsdWU8U3RvcmFnZUZpbGVVcGxvYWRDb25maWc+O1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlcigpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckNvbmZpZyB7XG4gIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBEYnhGaXJlYmFzZVN0b3JhZ2VTZXJ2aWNlO1xuICByZWFkb25seSBzdG9yYWdlRmlsZVVwbG9hZENvbmZpZ0ZhY3Rvcnk6IFN0b3JhZ2VGaWxlVXBsb2FkQ29uZmlnRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlcihjb25maWc6IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckNvbmZpZyk6IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlciB7XG4gIGNvbnN0IHsgc3RvcmFnZVNlcnZpY2UsIHN0b3JhZ2VGaWxlVXBsb2FkQ29uZmlnRmFjdG9yeSB9ID0gY29uZmlnO1xuXG4gIGxldCByZXN1bWFibGU6IE1heWJlPFN0b3JhZ2VVcGxvYWRUYXNrPjtcblxuICByZXR1cm4ge1xuICAgIHVwbG9hZEZpbGU6IGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBzdG9yYWdlRmlsZVVwbG9hZENvbmZpZyA9IGF3YWl0IHN0b3JhZ2VGaWxlVXBsb2FkQ29uZmlnRmFjdG9yeShmaWxlKTtcblxuICAgICAgY29uc3QgeyBzdG9yYWdlUGF0aCB9ID0gc3RvcmFnZUZpbGVVcGxvYWRDb25maWc7XG4gICAgICBjb25zdCBzdG9yYWdlQWNjZXNzb3JGaWxlID0gc3RvcmFnZVNlcnZpY2UuZmlsZShzdG9yYWdlUGF0aCk7XG5cbiAgICAgIGNvbnN0IHVwbG9hZCA9IG5ldyBPYnNlcnZhYmxlPERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcz4oKHgpID0+IHtcbiAgICAgICAgaWYgKHN0b3JhZ2VBY2Nlc3NvckZpbGUudXBsb2FkUmVzdW1hYmxlKSB7XG4gICAgICAgICAgcmVzdW1hYmxlID0gc3RvcmFnZUFjY2Vzc29yRmlsZS51cGxvYWRSZXN1bWFibGUoZmlsZSk7XG5cbiAgICAgICAgICAvLyBzdWJzY3JpYmUgdG8gdGhlIGV2ZW50IGJ5IHBpcGluZyB0aGlzIG9ic2VydmFibGUgdG8gaXRcbiAgICAgICAgICByZXN1bWFibGVcbiAgICAgICAgICAgIC5zdHJlYW1TbmFwc2hvdEV2ZW50cygpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgbWFwKCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBieXRlc1RyYW5zZmVycmVkLCB0b3RhbEJ5dGVzIH0gPSB4O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3M6IERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcyA9IHtcbiAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICBmaWxlUmVmOiBzdG9yYWdlQWNjZXNzb3JGaWxlLFxuICAgICAgICAgICAgICAgICAgdXBsb2FkUmVmOiByZXN1bWFibGUsXG4gICAgICAgICAgICAgICAgICBieXRlc1RyYW5zZmVycmVkLFxuICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyxcbiAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBieXRlc1RyYW5zZmVycmVkIC8gdG90YWxCeXRlc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpZiBhbiBlcnJvciBvY2N1cnMsIGNhdGNoIGl0IGFuZCBlbWl0IGl0IGFzIGEgcHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9ncmVzczogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlRmlsZVByb2dyZXNzID0ge1xuICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgIGZpbGVSZWY6IHN0b3JhZ2VBY2Nlc3NvckZpbGUsXG4gICAgICAgICAgICAgICAgICB1cGxvYWRSZWY6IHJlc3VtYWJsZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgZmFpbGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBvZihwcm9ncmVzcyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndXBsb2FkUmVzdW1hYmxlKCkgZnVuY3Rpb24gd2FzIHVuYXZhaWxhYmxlLicpO1xuICAgICAgICB9XG4gICAgICB9KS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICAgICAgY29uc3QgaW5zdGFuY2U6IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckluc3RhbmNlID0ge1xuICAgICAgICB1cGxvYWQsXG4gICAgICAgIHRhc2tSZWY6IHN0b3JhZ2VBY2Nlc3NvckZpbGUsXG4gICAgICAgIHBhdXNlOiAoKSA9PiByZXN1bWFibGU/LnBhdXNlKCkgPz8gZmFsc2UsXG4gICAgICAgIHJlc3VtZTogKCkgPT4gcmVzdW1hYmxlPy5yZXN1bWUoKSA/PyBmYWxzZSxcbiAgICAgICAgY2FuY2VsOiAoKSA9PiByZXN1bWFibGU/LmNhbmNlbCgpID8/IGZhbHNlXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICB9O1xufVxuXG4vLyBNQVJLOiBVcGxvYWQgRmlsZXNcbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0lucHV0IHtcbiAgcmVhZG9ubHkgdXBsb2FkSGFuZGxlcjogU3RvcmFnZUZpbGVVcGxvYWRIYW5kbGVyO1xuICAvKipcbiAgICogRmlsZXMgdG8gdXBsb2FkXG4gICAqL1xuICByZWFkb25seSBmaWxlczogRmlsZVtdO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtYXggcGFyYWxsZWwgdXBsb2FkcyB0byBwZXJmb3JtIGF0IGEgdGltZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gM1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4UGFyYWxsZWxVcGxvYWRzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNJbnN0YW5jZSB7XG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSB1cGxvYWQgb2YgdGhlIHJlbWFpbmluZyBmaWxlcy5cbiAgICovXG4gIGNhbmNlbCgpOiB2b2lkO1xuICAvKipcbiAgICogVGhlIHVwbG9hZCBvYnNlcnZhYmxlLlxuICAgKlxuICAgKiBNdXN0IGJlIHN1YnNjcmliZWQgdG8gaW4gb3JkZXIgZm9yIHRoZSB1cGxvYWQgdG8gYmVnaW4uXG4gICAqL1xuICByZWFkb25seSB1cGxvYWQ6IE9ic2VydmFibGU8U3RvcmFnZUZpbGVVcGxvYWRGaWxlc0V2ZW50Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRXZlbnQge1xuICAvKipcbiAgICogQWxsIGZpbGVzIGJlaW5nIHVwbG9hZGVkXG4gICAqL1xuICByZWFkb25seSBhbGxGaWxlczogRmlsZVtdO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFsbCBmaWxlcyBoYXZlIGJlZW4gdXBsb2FkZWQuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgdmFsdWUgc2hvdWxkIGJlIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ29tcGxldGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVwbG9hZCB3YXMgY2FuY2VsZWQuXG4gICAqL1xuICByZWFkb25seSBpc0NhbmNlbGVkPzogTWF5YmU8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBUaGUgb3ZlcmFsbCBwcm9ncmVzcyBvZiBhbGwgZmlsZXMgYmVpbmcgdXBsb2FkZWQuXG4gICAqL1xuICByZWFkb25seSBvdmVyYWxsUHJvZ3Jlc3M6IFBlcmNlbnROdW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXBsb2FkIHByb2dyZXNzIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZXZlbnQuXG4gICAqL1xuICByZWFkb25seSB1cGxvYWRQcm9ncmVzcz86IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZUZpbGVQcm9ncmVzcz47XG4gIC8qKlxuICAgKiBUaGUgZmluYWwgcmVzdWx0LlxuICAgKlxuICAgKiBTZXQgd2hlbiB0aGUgZmluYWwgZmlsZSBoYXMgYmVlbiB1cGxvYWRlZCBvciBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSByZXN1bHQ/OiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRmluYWxSZXN1bHQ7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgYXJlIHN0aWxsIHVwbG9hZGluZyBvciBxdWV1ZWQgZm9yIHVwbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IGluY29tcGxldGVGaWxlQ291bnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBhcmUgYWN0aXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aXZlRmlsZUNvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgYXJlIGRvbmUuXG4gICAqL1xuICByZWFkb25seSBkb25lRmlsZUNvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0ZpbmFsUmVzdWx0IHtcbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuICByZWFkb25seSBlbmRUaW1lOiBEYXRlO1xuICByZWFkb25seSBmaWxlUmVzdWx0czogU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0ZpbmFsRmlsZVJlc3VsdFtdO1xuICByZWFkb25seSBzdWNjZXNzRmlsZVJlc3VsdHM6IFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNGaW5hbEZpbGVSZXN1bHRbXTtcbiAgcmVhZG9ubHkgZXJyb3JGaWxlUmVzdWx0czogU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0ZpbmFsRmlsZVJlc3VsdFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNGaW5hbEZpbGVSZXN1bHQge1xuICAvKipcbiAgICogVGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGZpbGUgdXBsb2FkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuICAvKipcbiAgICogVGhlIGVuZCB0aW1lIG9mIHRoZSBmaWxlIHVwbG9hZCwgb3Igd2hlbiBpdCBmYWlsZWQgb3Igd2FzIGNhbmNlbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kVGltZTogRGF0ZTtcbiAgLyoqXG4gICAqIFRoZSBmaWxlIHRoYXQgd2FzIHVwbG9hZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogRmlsZTtcbiAgLyoqXG4gICAqIFRoZSBhY2Nlc3NvciBmaWxlIGZvciB0aGUgZmlsZSwgaWYgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBJcyBnZW5lcmFsbHkgYXZhaWxhYmxlIGlmIHN1Y2Nlc3MgaXMgdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVSZWY/OiBNYXliZTxGaXJlYmFzZVN0b3JhZ2VBY2Nlc3NvckZpbGU+O1xuICAvKipcbiAgICogVHJ1ZSBpZiB0aGUgZmlsZSB3YXMgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgc3VjY2VzczogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVycm9yIGlmIHRoZSBmaWxlIGZhaWxlZCB0byB1cGxvYWQuXG4gICAqL1xuICByZWFkb25seSBlcnJvcj86IE1heWJlPHVua25vd24+O1xuICAvKipcbiAgICogVHJ1ZSBpZiB0aGUgZmlsZSB1cGxvYWQgd2FzIGNhbmNlbGxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbGVkPzogTWF5YmU8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogVXBsb2FkcyBmaWxlcyB1c2luZyB0aGUgcHJvdmlkZWQgdXBsb2FkIGhhbmRsZXIgYW5kIGZpbGVzLlxuICpcbiAqIEFuIG9ic2VydmFibGUgaXMgcmV0dXJuZWQgdGhhdCBlbWl0cyB0aGUgbGF0ZXN0IGZpbGUgZXZlbnRzIGZyb20gYW55IGZpbGUgdGhhdCBpcyBiZWluZyB1cGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gaW5wdXRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yYWdlRmlsZVVwbG9hZEZpbGVzKGlucHV0OiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzSW5wdXQpOiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzSW5zdGFuY2Uge1xuICBjb25zdCB7IHVwbG9hZEhhbmRsZXIsIGZpbGVzLCBtYXhQYXJhbGxlbFVwbG9hZHM6IGlucHV0TWF4UGFyYWxsZWxVcGxvYWRzIH0gPSBpbnB1dDtcbiAgY29uc3QgbWF4UGFyYWxsZWxUYXNrcyA9IGlucHV0TWF4UGFyYWxsZWxVcGxvYWRzID8/IDM7XG5cbiAgY29uc3QgbXVsdGlVcGxvYWRzU3Vic2NyaXB0aW9uT2JqZWN0ID0gbmV3IE11bHRpU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgLy8gYmVnaW4gdGhlIHVwbG9hZCBmb3IgZWFjaCBmaWxlXG4gIGNvbnN0IGFsbEZpbGVzID0gQXJyYXkuZnJvbShmaWxlcyk7XG5cbiAgLy8gdW5zdWJzY3JpYmUgZnJvbSBhbGwgcHJldmlvdXMgdXBsb2Fkc1xuICBtdWx0aVVwbG9hZHNTdWJzY3JpcHRpb25PYmplY3QudW5zdWIoKTtcblxuICBpbnRlcmZhY2UgVXBkYXRlVXBsb2FkUHJvZ3Jlc3NJbnB1dCB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpbGUgaW5kZXggbnVtYmVyLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGluZGV4OiBJbmRleE51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmV4dCBwcm9ncmVzcyBldmVudCwgaWYgYXBwbGljYWJsZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBuZXh0UHJvZ3Jlc3M/OiBNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVGaWxlUHJvZ3Jlc3M+O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIHRoYXQgb2NjdXJlZCBvdXRzaWRlIG9mIHRoZSBuZXh0UHJvZ3Jlc3MsIGlmIGFwcGxpY2FibGUuXG4gICAgICpcbiAgICAgKiBUaGVzZSBhcmUgdHlwaWNhbGx5IFwidW5jYXVnaHRcIiBlcnJvcnMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbm9uUHJvZ3Jlc3NFcnJvcj86IE1heWJlPHVua25vd24+O1xuICAgIC8qKlxuICAgICAqIFBhc3NlZCBhcyB0cnVlIHdoZW4gdGhlIHVwbG9hZCB0YXNrIGlzIGRvbmUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFsc28gaW5mZXJyZWQgYXMgdHJ1ZSB3aGVuIGEgcHJvZ3Jlc3MgZXJyb3Igb2NjdXJzIGZvciBhbiB1cGxvYWQuXG4gICAgICpcbiAgICAgKiBEb2VzIG5vdCBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1Y2Nlc3Mgd2FzIGFjaGlldmVkIG9yIG5vdC5cbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlVXBsb2FkVGFza0RvbmU/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIHVwbG9hZCB3YXMgY2FuY2VsZWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FuY2VsZWQ/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIEZpbGVVcGxvYWREZXRhaWxzIHtcbiAgICByZWFkb25seSBmaWxlOiBGaWxlO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHVwbG9hZCBpbnN0YW5jZSBmb3IgdGhlIGZpbGUuXG4gICAgICpcbiAgICAgKiBTZXQgaWYgdGhlIGZpbGUgaXMgY3VycmVudGx5IHVwbG9hZGluZy5cbiAgICAgKi9cbiAgICB1cGxvYWRJbnN0YW5jZT86IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckluc3RhbmNlO1xuICAgIGZpbGVSZWY/OiBNYXliZTxGaXJlYmFzZVN0b3JhZ2VBY2Nlc3NvckZpbGU+O1xuICAgIHN0YXJ0VGltZT86IERhdGU7XG4gICAgZW5kVGltZT86IERhdGU7XG4gICAgc3VjY2Vzcz86IGJvb2xlYW47XG4gICAgY2FuY2VsZWQ/OiBNYXliZTxib29sZWFuPjtcbiAgICBlcnJvcj86IE1heWJlPHVua25vd24+O1xuICB9XG5cbiAgY29uc3QgYWxsRmlsZXNBbmRMYXRlc3RQcm9ncmVzczogTWF5YmU8RGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlRmlsZVByb2dyZXNzPltdID0gbmV3IEFycmF5KGFsbEZpbGVzLmxlbmd0aCk7XG4gIGNvbnN0IGFsbEZpbGVzQW5kRGV0YWlsczogRmlsZVVwbG9hZERldGFpbHNbXSA9IGFsbEZpbGVzLm1hcCgoZmlsZSkgPT4gKHsgZmlsZSB9KSk7XG4gIGNvbnN0IG92ZXJhbGxQcm9ncmVzc1BlckNvbXBsZXRlZEZpbGU6IFBlcmNlbnREZWNpbWFsID0gKDEgLyBhbGxGaWxlc0FuZExhdGVzdFByb2dyZXNzLmxlbmd0aCkgYXMgUGVyY2VudERlY2ltYWw7XG5cbiAgLyoqXG4gICAqIE9uY2Ugc2V0LCBhbnkgbmV3IGZpbGUgdXBsb2FkIHRhc2sgdGhhdCBoaXRzIHRoaXMgd2lsbCByZXR1cm4gYW4gY2FuY2VsIGZhaWx1cmUuXG4gICAqL1xuICBsZXQgZmxhZ2dlZENhbmNlbCA9IGZhbHNlO1xuXG4gIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICBmbGFnZ2VkQ2FuY2VsID0gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCB1cGxvYWQgPSBuZXcgT2JzZXJ2YWJsZTxTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRXZlbnQ+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgY29uc3Qgb3ZlcmFsbFN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBpbmNvbXBsZXRlRmlsZUZpbGVJbmRleGVzID0gbmV3IFNldDxJbmRleE51bWJlcj4oYWxsRmlsZXMubWFwKChfLCBpbmRleCkgPT4gaW5kZXgpKTtcbiAgICBjb25zdCBhY3RpdmVGaWxlSW5kZXhlcyA9IG5ldyBTZXQ8SW5kZXhOdW1iZXI+KCk7XG4gICAgY29uc3QgZG9uZUZpbGVJbmRleGVzID0gbmV3IFNldDxJbmRleE51bWJlcj4oKTtcbiAgICBsZXQgbGF0ZXN0T3ZlcmFsbFByb2dyZXNzOiBQZXJjZW50TnVtYmVyID0gMDtcblxuICAgIGZ1bmN0aW9uIG9uU3RhcnRGaWxlVXBsb2FkKGluZGV4OiBJbmRleE51bWJlciwgdXBsb2FkSW5zdGFuY2U6IFN0b3JhZ2VGaWxlVXBsb2FkSGFuZGxlckluc3RhbmNlKSB7XG4gICAgICBhY3RpdmVGaWxlSW5kZXhlcy5hZGQoaW5kZXgpO1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5zdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS51cGxvYWRJbnN0YW5jZSA9IHVwbG9hZEluc3RhbmNlO1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5maWxlUmVmID0gdXBsb2FkSW5zdGFuY2UudGFza1JlZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblN0YXJ0RmlsZVVwbG9hZEZsYWdnZWRDYW5jZWxsZWQoaW5kZXg6IEluZGV4TnVtYmVyKSB7XG4gICAgICBhbGxGaWxlc0FuZERldGFpbHNbaW5kZXhdLnN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgIC8vIGltbWVkaWF0ZWx5IG1hcmsgaXQgZG9uZVxuICAgICAgX21hcmtGaWxlVXBsb2FkRG9uZShpbmRleCwgdHJ1ZSk7XG5cbiAgICAgIC8vIGVtaXQgbmV3IHByb2dyZXNzIGV2ZW50XG4gICAgICBfZW1pdEV2ZW50KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX21hcmtGaWxlVXBsb2FkRG9uZShmaWxlSW5kZXg6IEluZGV4TnVtYmVyLCBmaW5hbEVycm9yPzogTWF5YmU8dW5rbm93bj4pIHtcbiAgICAgIGRvbmVGaWxlSW5kZXhlcy5hZGQoZmlsZUluZGV4KTsgLy8gYWRkIHRvIGRvbmUgZmlsZSBpbmRleGVzXG4gICAgICBhY3RpdmVGaWxlSW5kZXhlcy5kZWxldGUoZmlsZUluZGV4KTsgLy8gcmVtb3ZlIGZyb20gYWN0aXZlIGZpbGUgaW5kZXhlcyBpZiBpdCBleGlzdHNcbiAgICAgIGluY29tcGxldGVGaWxlRmlsZUluZGV4ZXMuZGVsZXRlKGZpbGVJbmRleCk7IC8vIHJlbW92ZSBmcm9tIGluY29tcGxldGUgZmlsZSBpbmRleGVzXG5cbiAgICAgIC8vIHVwZGF0ZSBkZXRhaWxzXG4gICAgICBhbGxGaWxlc0FuZERldGFpbHNbZmlsZUluZGV4XS5lbmRUaW1lID0gbmV3IERhdGUoKTtcblxuICAgICAgY29uc3QgZXJyb3IgPSBmaW5hbEVycm9yID8/IGFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmVycm9yO1xuICAgICAgYWxsRmlsZXNBbmREZXRhaWxzW2ZpbGVJbmRleF0uc3VjY2VzcyA9ICFlcnJvcjtcbiAgICAgIGFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmVycm9yID0gZXJyb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlVXBsb2FkUHJvZ3Jlc3MoaW5wdXQ6IFVwZGF0ZVVwbG9hZFByb2dyZXNzSW5wdXQpIHtcbiAgICAgIGNvbnN0IHsgaW5kZXg6IGZpbGVJbmRleCwgbmV4dFByb2dyZXNzLCBmaWxlVXBsb2FkVGFza0RvbmU6IGlucHV0RmlsZVVwbG9hZFRhc2tEb25lLCBub25Qcm9ncmVzc0Vycm9yIH0gPSBpbnB1dDtcbiAgICAgIGNvbnN0IGVycm9yID0gbm9uUHJvZ3Jlc3NFcnJvciA/PyBuZXh0UHJvZ3Jlc3M/LmVycm9yO1xuICAgICAgY29uc3QgZmlsZVVwbG9hZFRhc2tEb25lID0gaW5wdXRGaWxlVXBsb2FkVGFza0RvbmUgPz8gQm9vbGVhbihlcnJvcik7XG5cbiAgICAgIC8vIHRoZSB0YXNrIG1heSBhbHJlYWR5IGJlIGRvbmUsIGFzIGFmdGVyIGEgcHJvZ3Jlc3MtcmVsYXRlZCBlcnJvciB0aGUgY29tcGxldGUgdGFzayBjYW4gZ2V0IGNhbGxlZC5cbiAgICAgIGNvbnN0IGlzVGFza0FscmVhZHlEb25lID0gYWxsRmlsZXNBbmREZXRhaWxzW2ZpbGVJbmRleF0uZW5kVGltZSAhPSBudWxsO1xuXG4gICAgICBpZiAoIWlzVGFza0FscmVhZHlEb25lKSB7XG4gICAgICAgIGxldCBuZXh0T3ZlcmFsbFByb2dyZXNzID0gbGF0ZXN0T3ZlcmFsbFByb2dyZXNzO1xuICAgICAgICBjb25zdCBuZXh0UHJvZ3Jlc3NQZXJjZW50ID0gZmlsZVVwbG9hZFRhc2tEb25lID8gMTAwIDogKG5leHRQcm9ncmVzcz8ucHJvZ3Jlc3MgPz8gMCkgKiAxMDA7XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBvdmVyYWxsIHByb2dyZXNzIHBlcmNlbnRhZ2VcbiAgICAgICAgaWYgKG5leHRQcm9ncmVzc1BlcmNlbnQpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIG92ZXJhbGwgcGVyY2VudGFnZVxuICAgICAgICAgIGNvbnN0IHByZXZpb3VzUHJvZ3Jlc3MgPSBhbGxGaWxlc0FuZExhdGVzdFByb2dyZXNzW2ZpbGVJbmRleF07XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNQcm9ncmVzc1BlcmNlbnQgPSBwcmV2aW91c1Byb2dyZXNzPy5wcm9ncmVzcyAhPSBudWxsID8gcHJldmlvdXNQcm9ncmVzcy5wcm9ncmVzcyAqIDEwMCA6IDA7XG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3NQZXJjZW50Q2hhbmdlID0gbmV4dFByb2dyZXNzUGVyY2VudCAtIHByZXZpb3VzUHJvZ3Jlc3NQZXJjZW50O1xuXG4gICAgICAgICAgLy8gaW5jcmVhc2Ugb3ZlcmFsbCBwcm9ncmVzcyBieSB0aGUgY2hhbmdlXG4gICAgICAgICAgbmV4dE92ZXJhbGxQcm9ncmVzcyArPSBwcm9ncmVzc1BlcmNlbnRDaGFuZ2UgKiBvdmVyYWxsUHJvZ3Jlc3NQZXJDb21wbGV0ZWRGaWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBmaWxlIHByb2dyZXNzXG4gICAgICAgIGlmIChuZXh0UHJvZ3Jlc3MpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGxhdGVzdCBGaWxlUHJvZ3Jlc3NcbiAgICAgICAgICBhbGxGaWxlc0FuZExhdGVzdFByb2dyZXNzW2ZpbGVJbmRleF0gPSBuZXh0UHJvZ3Jlc3M7XG5cbiAgICAgICAgICAvLyBvbmx5IHNldCBmaWxlUmVmIG9uY2VcbiAgICAgICAgICBpZiAoIWFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmZpbGVSZWYpIHtcbiAgICAgICAgICAgIGFsbEZpbGVzQW5kRGV0YWlsc1tmaWxlSW5kZXhdLmZpbGVSZWYgPSBuZXh0UHJvZ3Jlc3MuZmlsZVJlZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBjb21wbGV0ZSwgdXBkYXRlIHRoZSBpbmRleGVzIGFuZCBkZXRhaWxzXG4gICAgICAgIGlmIChmaWxlVXBsb2FkVGFza0RvbmUpIHtcbiAgICAgICAgICBfbWFya0ZpbGVVcGxvYWREb25lKGZpbGVJbmRleCwgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBvdmVyYWxsIHByb2dyZXNzXG4gICAgICAgIGxhdGVzdE92ZXJhbGxQcm9ncmVzcyA9IG5leHRPdmVyYWxsUHJvZ3Jlc3M7XG5cbiAgICAgICAgLy8gZW1pdCB0aGUgZXZlbnQgdG8gc2VuZCBpdFxuICAgICAgICBfZW1pdEV2ZW50KG5leHRQcm9ncmVzcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2VtaXRFdmVudChuZXh0UHJvZ3Jlc3M/OiBNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVGaWxlUHJvZ3Jlc3M+KSB7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlID0gaW5jb21wbGV0ZUZpbGVGaWxlSW5kZXhlcy5zaXplID09PSAwO1xuXG4gICAgICBsZXQgb3ZlcmFsbFByb2dyZXNzID0gbGF0ZXN0T3ZlcmFsbFByb2dyZXNzO1xuICAgICAgbGV0IHJlc3VsdDogTWF5YmU8U3RvcmFnZUZpbGVVcGxvYWRGaWxlc0ZpbmFsUmVzdWx0PiA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGlzQ29tcGxldGUpIHtcbiAgICAgICAgb3ZlcmFsbFByb2dyZXNzID0gMTAwOyAvLyBzZXQgdG8gMTAwJVxuICAgICAgICBjb25zdCBvdmVyYWxsRW5kVGltZSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgY29uc3QgZmlsZVJlc3VsdHMgPSBhbGxGaWxlcy5tYXAoKGZpbGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0OiBTdG9yYWdlRmlsZVVwbG9hZEZpbGVzRmluYWxGaWxlUmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRUaW1lOiBhbGxGaWxlc0FuZERldGFpbHNbaW5kZXhdLnN0YXJ0VGltZSBhcyBEYXRlLFxuICAgICAgICAgICAgZW5kVGltZTogYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5lbmRUaW1lIGFzIERhdGUsXG4gICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgZmlsZVJlZjogYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5maWxlUmVmLFxuICAgICAgICAgICAgc3VjY2VzczogIWFsbEZpbGVzQW5kRGV0YWlsc1tpbmRleF0uZXJyb3IsXG4gICAgICAgICAgICBlcnJvcjogYWxsRmlsZXNBbmREZXRhaWxzW2luZGV4XS5lcnJvclxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB7IGluY2x1ZGVkOiBzdWNjZXNzRmlsZVJlc3VsdHMsIGV4Y2x1ZGVkOiBlcnJvckZpbGVSZXN1bHRzIH0gPSBzZXBhcmF0ZVZhbHVlcyhmaWxlUmVzdWx0cywgKHgpID0+IHguc3VjY2Vzcyk7XG5cbiAgICAgICAgLy8gYWxsIGFyZSBkb25lLCBzZXQgdGhlIHJlc3VsdCBvbiB0aGUgbmV4dCBldmVudFxuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgc3RhcnRUaW1lOiBvdmVyYWxsU3RhcnRUaW1lLFxuICAgICAgICAgIGVuZFRpbWU6IG92ZXJhbGxFbmRUaW1lLFxuICAgICAgICAgIHN1Y2Nlc3NGaWxlUmVzdWx0cyxcbiAgICAgICAgICBlcnJvckZpbGVSZXN1bHRzLFxuICAgICAgICAgIGZpbGVSZXN1bHRzXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRFdmVudDogU3RvcmFnZUZpbGVVcGxvYWRGaWxlc0V2ZW50ID0ge1xuICAgICAgICBhbGxGaWxlcyxcbiAgICAgICAgaXNDb21wbGV0ZSxcbiAgICAgICAgb3ZlcmFsbFByb2dyZXNzLFxuICAgICAgICB1cGxvYWRQcm9ncmVzczogbmV4dFByb2dyZXNzLFxuICAgICAgICBpbmNvbXBsZXRlRmlsZUNvdW50OiBpbmNvbXBsZXRlRmlsZUZpbGVJbmRleGVzLnNpemUsXG4gICAgICAgIGFjdGl2ZUZpbGVDb3VudDogYWN0aXZlRmlsZUluZGV4ZXMuc2l6ZSxcbiAgICAgICAgZG9uZUZpbGVDb3VudDogZG9uZUZpbGVJbmRleGVzLnNpemUsXG4gICAgICAgIHJlc3VsdFxuICAgICAgfTtcblxuICAgICAgc3Vic2NyaWJlci5uZXh0KG5leHRFdmVudCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gcnVuVXBsb2FkVGFza0ZvckZpbGUoW2ZpbGUsIGluZGV4XTogcmVhZG9ubHkgW0ZpbGUsIEluZGV4TnVtYmVyXSkge1xuICAgICAgaWYgKGZsYWdnZWRDYW5jZWwpIHtcbiAgICAgICAgb25TdGFydEZpbGVVcGxvYWRGbGFnZ2VkQ2FuY2VsbGVkKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlRmlsZVVwbG9hZFByb2dyZXNzID0gKG5leHRQcm9ncmVzczogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlRmlsZVByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBwcm9ncmVzc1xuICAgICAgICAgIHVwZGF0ZVVwbG9hZFByb2dyZXNzKHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgbmV4dFByb2dyZXNzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdXBkYXRlRmlsZVVwbG9hZFByb2dyZXNzV2l0aFVuY2F1Z2h0RXJyb3IgPSAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAvLyBlcnJvciBvY2N1cnJlZCwgdXBkYXRlIHRoZSBwcm9ncmVzcyB3aXRoIHRoZSBlcnJvclxuICAgICAgICAgIHVwZGF0ZVVwbG9hZFByb2dyZXNzKHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgbm9uUHJvZ3Jlc3NFcnJvcjogZXJyb3IsXG4gICAgICAgICAgICBmaWxlVXBsb2FkVGFza0RvbmU6IHRydWVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIGFsd2F5cyByZXNvbHZlLCBuZXZlciByZWplY3RcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29tcGxldGVGaWxlVXBsb2FkUHJvZ3Jlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgdXBkYXRlVXBsb2FkUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBmaWxlVXBsb2FkVGFza0RvbmU6IHRydWVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyB1cGxvYWQgdGhlIGZpbGUsIHN1YnNjcmliZSB0byB0aGUgcHJvZ3Jlc3NcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB1cGxvYWRIYW5kbGVyXG4gICAgICAgICAgICAudXBsb2FkRmlsZShmaWxlKVxuICAgICAgICAgICAgLnRoZW4oKHVwbG9hZEluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGFkZCB0byBhY3RpdmUgZmlsZSBpbmRleGVzXG4gICAgICAgICAgICAgIG9uU3RhcnRGaWxlVXBsb2FkKGluZGV4LCB1cGxvYWRJbnN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgdXBsb2FkU3Vic2NyaXB0aW9uID0gdXBsb2FkSW5zdGFuY2UudXBsb2FkLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogdXBkYXRlRmlsZVVwbG9hZFByb2dyZXNzLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1cGRhdGVGaWxlVXBsb2FkUHJvZ3Jlc3NXaXRoVW5jYXVnaHRFcnJvcixcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogY29tcGxldGVGaWxlVXBsb2FkUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgbXVsdGlVcGxvYWRzU3Vic2NyaXB0aW9uT2JqZWN0LmFkZFN1YnModXBsb2FkU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2godXBkYXRlRmlsZVVwbG9hZFByb2dyZXNzV2l0aFVuY2F1Z2h0RXJyb3IpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHVwZGF0ZUZpbGVVcGxvYWRQcm9ncmVzc1dpdGhVbmNhdWdodEVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcnVuIHVwbG9hZCB0YXNrIGZvciBlYWNoIGZpbGVcbiAgICBjb25zdCBmaWxlVHVwbGVzID0gYWxsRmlsZXMubWFwKChmaWxlLCBpbmRleCkgPT4gW2ZpbGUsIGluZGV4XSBhcyBjb25zdCk7XG5cbiAgICBydW5Bc3luY1Rhc2tzRm9yVmFsdWVzKGZpbGVUdXBsZXMsIHJ1blVwbG9hZFRhc2tGb3JGaWxlLCB7XG4gICAgICBtYXhQYXJhbGxlbFRhc2tzLFxuICAgICAgcmV0cmllc0FsbG93ZWQ6IDAgLy8gbm8gcmV0cmllcyBhbGxvd2VkXG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAvLyBhbGwgdGFza3MgYXJlIGZpbmlzaGVkLiBDb21wbGV0ZSB0aGUgc3Vic2NyaWJlci5cbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfSkucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgY29uc3QgaW5zdGFuY2U6IFN0b3JhZ2VGaWxlVXBsb2FkRmlsZXNJbnN0YW5jZSA9IHtcbiAgICBjYW5jZWwsXG4gICAgdXBsb2FkXG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuIl19
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Directive, inject } from '@angular/core';
|
|
2
|
+
import { DbxFirebaseStorageFileUploadStore, StorageFileDocumentStore } from '../store';
|
|
3
|
+
import { AbstractSubscriptionDirective } from '@dereekb/dbx-core';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Directive that passes the upload result to a StorageFileDocumentStore to initialize the document immediately.
|
|
7
|
+
*/
|
|
8
|
+
export class DbxFirebaseStorageFileUploadInitializeDocumentDirective extends AbstractSubscriptionDirective {
|
|
9
|
+
uploadStore = inject(DbxFirebaseStorageFileUploadStore);
|
|
10
|
+
storageFileDocumentStore = inject(StorageFileDocumentStore);
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
this.sub = this.uploadStore.uploadResult$.subscribe(async (result) => {
|
|
14
|
+
const successFileResult = result.successFileResults.find((x) => x.fileRef != null);
|
|
15
|
+
if (successFileResult) {
|
|
16
|
+
const fileRef = successFileResult.fileRef;
|
|
17
|
+
if (fileRef) {
|
|
18
|
+
this.storageFileDocumentStore
|
|
19
|
+
.initializeStorageFileFromUpload({
|
|
20
|
+
pathString: fileRef.storagePath.pathString,
|
|
21
|
+
bucketId: fileRef.storagePath.bucketId
|
|
22
|
+
})
|
|
23
|
+
.subscribe();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadInitializeDocumentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
29
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DbxFirebaseStorageFileUploadInitializeDocumentDirective, isStandalone: true, selector: "[dbxFirebaseStorageFileUploadInitializeDocument]", exportAs: ["dbxFirebaseStorageFileUploadInitializeDocument"], usesInheritance: true, ngImport: i0 });
|
|
30
|
+
}
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadInitializeDocumentDirective, decorators: [{
|
|
32
|
+
type: Directive,
|
|
33
|
+
args: [{
|
|
34
|
+
selector: '[dbxFirebaseStorageFileUploadInitializeDocument]',
|
|
35
|
+
exportAs: 'dbxFirebaseStorageFileUploadInitializeDocument',
|
|
36
|
+
standalone: true
|
|
37
|
+
}]
|
|
38
|
+
}], ctorParameters: () => [] });
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUudXBsb2FkLmluaXRpYWxpemUuZG9jdW1lbnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZpcmViYXNlL3NyYy9saWIvbW9kdWxlcy9zdG9yYWdlZmlsZS9jb250YWluZXIvc3RvcmFnZWZpbGUudXBsb2FkLmluaXRpYWxpemUuZG9jdW1lbnQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN2RixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFHbEU7O0dBRUc7QUFNSCxNQUFNLE9BQU8sdURBQXdELFNBQVEsNkJBQTZCO0lBQy9GLFdBQVcsR0FBRyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUN4RCx3QkFBd0IsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUVyRTtRQUNFLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25FLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztZQUVuRixJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQXNDLENBQUM7Z0JBRXpFLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osSUFBSSxDQUFDLHdCQUF3Qjt5QkFDMUIsK0JBQStCLENBQUM7d0JBQy9CLFVBQVUsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVU7d0JBQzFDLFFBQVEsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVE7cUJBQ3ZDLENBQUM7eUJBQ0QsU0FBUyxFQUFFLENBQUM7Z0JBQ2pCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO3dHQXZCVSx1REFBdUQ7NEZBQXZELHVEQUF1RDs7NEZBQXZELHVEQUF1RDtrQkFMbkUsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0RBQWtEO29CQUM1RCxRQUFRLEVBQUUsZ0RBQWdEO29CQUMxRCxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGluamVjdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmUsIFN0b3JhZ2VGaWxlRG9jdW1lbnRTdG9yZSB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB7IEFic3RyYWN0U3Vic2NyaXB0aW9uRGlyZWN0aXZlIH0gZnJvbSAnQGRlcmVla2IvZGJ4LWNvcmUnO1xuaW1wb3J0IHsgRmlyZWJhc2VTdG9yYWdlQWNjZXNzb3JGaWxlIH0gZnJvbSAnQGRlcmVla2IvZmlyZWJhc2UnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB0aGF0IHBhc3NlcyB0aGUgdXBsb2FkIHJlc3VsdCB0byBhIFN0b3JhZ2VGaWxlRG9jdW1lbnRTdG9yZSB0byBpbml0aWFsaXplIHRoZSBkb2N1bWVudCBpbW1lZGlhdGVseS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRJbml0aWFsaXplRG9jdW1lbnRdJyxcbiAgZXhwb3J0QXM6ICdkYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkSW5pdGlhbGl6ZURvY3VtZW50JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkSW5pdGlhbGl6ZURvY3VtZW50RGlyZWN0aXZlIGV4dGVuZHMgQWJzdHJhY3RTdWJzY3JpcHRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICByZWFkb25seSB1cGxvYWRTdG9yZSA9IGluamVjdChEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmUpO1xuICByZWFkb25seSBzdG9yYWdlRmlsZURvY3VtZW50U3RvcmUgPSBpbmplY3QoU3RvcmFnZUZpbGVEb2N1bWVudFN0b3JlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zdWIgPSB0aGlzLnVwbG9hZFN0b3JlLnVwbG9hZFJlc3VsdCQuc3Vic2NyaWJlKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3NGaWxlUmVzdWx0ID0gcmVzdWx0LnN1Y2Nlc3NGaWxlUmVzdWx0cy5maW5kKCh4KSA9PiB4LmZpbGVSZWYgIT0gbnVsbCk7XG5cbiAgICAgIGlmIChzdWNjZXNzRmlsZVJlc3VsdCkge1xuICAgICAgICBjb25zdCBmaWxlUmVmID0gc3VjY2Vzc0ZpbGVSZXN1bHQuZmlsZVJlZiBhcyBGaXJlYmFzZVN0b3JhZ2VBY2Nlc3NvckZpbGU7XG5cbiAgICAgICAgaWYgKGZpbGVSZWYpIHtcbiAgICAgICAgICB0aGlzLnN0b3JhZ2VGaWxlRG9jdW1lbnRTdG9yZVxuICAgICAgICAgICAgLmluaXRpYWxpemVTdG9yYWdlRmlsZUZyb21VcGxvYWQoe1xuICAgICAgICAgICAgICBwYXRoU3RyaW5nOiBmaWxlUmVmLnN0b3JhZ2VQYXRoLnBhdGhTdHJpbmcsXG4gICAgICAgICAgICAgIGJ1Y2tldElkOiBmaWxlUmVmLnN0b3JhZ2VQYXRoLmJ1Y2tldElkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Directive, inject, input } from '@angular/core';
|
|
2
|
+
import { skipAllInitialMaybe, SubscriptionObject } from '@dereekb/rxjs';
|
|
3
|
+
import { DbxFirebaseStorageFileUploadStore } from '../store';
|
|
4
|
+
import { toObservable } from '@angular/core/rxjs-interop';
|
|
5
|
+
import { shareReplay } from 'rxjs';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* Directive that provides a DbxFirebaseStorageFileUploadStore, and sync's the inputs to the store.
|
|
9
|
+
*/
|
|
10
|
+
export class DbxFirebaseStorageFileUploadStoreDirective {
|
|
11
|
+
_allowedSub = new SubscriptionObject();
|
|
12
|
+
_multiSub = new SubscriptionObject();
|
|
13
|
+
uploadStore = inject(DbxFirebaseStorageFileUploadStore);
|
|
14
|
+
multipleUpload = input();
|
|
15
|
+
fileTypesAccepted = input();
|
|
16
|
+
fileTypesAccepted$ = toObservable(this.fileTypesAccepted).pipe(skipAllInitialMaybe(), shareReplay(1));
|
|
17
|
+
isMultiUploadAllowed$ = toObservable(this.multipleUpload).pipe(skipAllInitialMaybe(), shareReplay(1));
|
|
18
|
+
constructor() {
|
|
19
|
+
this._allowedSub.subscription = this.fileTypesAccepted$.subscribe((x) => this.uploadStore.setFileTypesAccepted(x));
|
|
20
|
+
this._multiSub.subscription = this.isMultiUploadAllowed$.subscribe((x) => this.uploadStore.setIsMultiUploadAllowed(x));
|
|
21
|
+
}
|
|
22
|
+
ngOnDestroy() {
|
|
23
|
+
this._allowedSub.destroy();
|
|
24
|
+
this._multiSub.destroy();
|
|
25
|
+
}
|
|
26
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadStoreDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
27
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: DbxFirebaseStorageFileUploadStoreDirective, isStandalone: true, selector: "[dbxFirebaseStorageFileUploadStore]", inputs: { multipleUpload: { classPropertyName: "multipleUpload", publicName: "multipleUpload", isSignal: true, isRequired: false, transformFunction: null }, fileTypesAccepted: { classPropertyName: "fileTypesAccepted", publicName: "fileTypesAccepted", isSignal: true, isRequired: false, transformFunction: null } }, providers: [DbxFirebaseStorageFileUploadStore], exportAs: ["dbxFirebaseStorageFileUploadStore"], ngImport: i0 });
|
|
28
|
+
}
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadStoreDirective, decorators: [{
|
|
30
|
+
type: Directive,
|
|
31
|
+
args: [{
|
|
32
|
+
selector: '[dbxFirebaseStorageFileUploadStore]',
|
|
33
|
+
exportAs: 'dbxFirebaseStorageFileUploadStore',
|
|
34
|
+
providers: [DbxFirebaseStorageFileUploadStore],
|
|
35
|
+
standalone: true
|
|
36
|
+
}]
|
|
37
|
+
}], ctorParameters: () => [] });
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUudXBsb2FkLnN0b3JlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1maXJlYmFzZS9zcmMvbGliL21vZHVsZXMvc3RvcmFnZWZpbGUvY29udGFpbmVyL3N0b3JhZ2VmaWxlLnVwbG9hZC5zdG9yZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBR25DOztHQUVHO0FBT0gsTUFBTSxPQUFPLDBDQUEwQztJQUNwQyxXQUFXLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO0lBQ3ZDLFNBQVMsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7SUFFN0MsV0FBVyxHQUFHLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBRXhELGNBQWMsR0FBRyxLQUFLLEVBQWtCLENBQUM7SUFDekMsaUJBQWlCLEdBQUcsS0FBSyxFQUFtRCxDQUFDO0lBRTdFLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RyxxQkFBcUIsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRS9HO1FBQ0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6SCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQXBCVSwwQ0FBMEM7NEZBQTFDLDBDQUEwQyw2WUFIMUMsQ0FBQyxpQ0FBaUMsQ0FBQzs7NEZBR25DLDBDQUEwQztrQkFOdEQsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUNBQXFDO29CQUMvQyxRQUFRLEVBQUUsbUNBQW1DO29CQUM3QyxTQUFTLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQztvQkFDOUMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNraXBBbGxJbml0aWFsTWF5YmUsIFN1YnNjcmlwdGlvbk9iamVjdCB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlIH0gZnJvbSAnLi4vc3RvcmUnO1xuaW1wb3J0IHsgQXJyYXlPclZhbHVlLCBNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZpbGVBY2NlcHRGaWx0ZXJUeXBlU3RyaW5nIH0gZnJvbSAnQGRlcmVla2IvZGJ4LXdlYic7XG5cbi8qKlxuICogRGlyZWN0aXZlIHRoYXQgcHJvdmlkZXMgYSBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmUsIGFuZCBzeW5jJ3MgdGhlIGlucHV0cyB0byB0aGUgc3RvcmUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVdJyxcbiAgZXhwb3J0QXM6ICdkYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmUnLFxuICBwcm92aWRlcnM6IFtEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVdLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FsbG93ZWRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX211bHRpU3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuXG4gIHJlYWRvbmx5IHVwbG9hZFN0b3JlID0gaW5qZWN0KERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZSk7XG5cbiAgcmVhZG9ubHkgbXVsdGlwbGVVcGxvYWQgPSBpbnB1dDxNYXliZTxib29sZWFuPj4oKTtcbiAgcmVhZG9ubHkgZmlsZVR5cGVzQWNjZXB0ZWQgPSBpbnB1dDxNYXliZTxBcnJheU9yVmFsdWU8RmlsZUFjY2VwdEZpbHRlclR5cGVTdHJpbmc+Pj4oKTtcblxuICByZWFkb25seSBmaWxlVHlwZXNBY2NlcHRlZCQgPSB0b09ic2VydmFibGUodGhpcy5maWxlVHlwZXNBY2NlcHRlZCkucGlwZShza2lwQWxsSW5pdGlhbE1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkgaXNNdWx0aVVwbG9hZEFsbG93ZWQkID0gdG9PYnNlcnZhYmxlKHRoaXMubXVsdGlwbGVVcGxvYWQpLnBpcGUoc2tpcEFsbEluaXRpYWxNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fYWxsb3dlZFN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLmZpbGVUeXBlc0FjY2VwdGVkJC5zdWJzY3JpYmUoKHgpID0+IHRoaXMudXBsb2FkU3RvcmUuc2V0RmlsZVR5cGVzQWNjZXB0ZWQoeCkpO1xuICAgIHRoaXMuX211bHRpU3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMuaXNNdWx0aVVwbG9hZEFsbG93ZWQkLnN1YnNjcmliZSgoeCkgPT4gdGhpcy51cGxvYWRTdG9yZS5zZXRJc011bHRpVXBsb2FkQWxsb3dlZCh4KSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9hbGxvd2VkU3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9tdWx0aVN1Yi5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Directive, inject } from '@angular/core';
|
|
2
|
+
import { SubscriptionObject } from '@dereekb/rxjs';
|
|
3
|
+
import { DbxFirebaseStorageFileUploadStore } from '../store';
|
|
4
|
+
import { DbxFileUploadComponent } from '@dereekb/dbx-web';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Directive that syncs a DbxFirebaseStorageFileUploadStore's configuration to a DbxFileUploadComponent.
|
|
8
|
+
*/
|
|
9
|
+
export class DbxFirebaseStorageFileUploadSyncDirective {
|
|
10
|
+
_allowedSub = new SubscriptionObject();
|
|
11
|
+
_multiSub = new SubscriptionObject();
|
|
12
|
+
_filesSub = new SubscriptionObject();
|
|
13
|
+
uploadStore = inject(DbxFirebaseStorageFileUploadStore);
|
|
14
|
+
uploadComponent = inject(DbxFileUploadComponent);
|
|
15
|
+
constructor() {
|
|
16
|
+
this._allowedSub.subscription = this.uploadStore.fileTypesAllowed$.subscribe((x) => this.uploadComponent.setAccept(x));
|
|
17
|
+
this._multiSub.subscription = this.uploadStore.isMultiUploadAllowed$.subscribe((x) => this.uploadComponent.setMultiple(x));
|
|
18
|
+
this._filesSub.subscription = this.uploadComponent.filesChanged.subscribe((files) => this.uploadStore.setFiles(files.matchResult.accepted));
|
|
19
|
+
}
|
|
20
|
+
ngOnDestroy() {
|
|
21
|
+
this._allowedSub.destroy();
|
|
22
|
+
this._multiSub.destroy();
|
|
23
|
+
this._filesSub.destroy();
|
|
24
|
+
}
|
|
25
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadSyncDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
26
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DbxFirebaseStorageFileUploadSyncDirective, isStandalone: true, selector: "[dbxFirebaseStorageFileUploadSync]", exportAs: ["dbxFirebaseStorageFileUploadSync"], ngImport: i0 });
|
|
27
|
+
}
|
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadSyncDirective, decorators: [{
|
|
29
|
+
type: Directive,
|
|
30
|
+
args: [{
|
|
31
|
+
selector: '[dbxFirebaseStorageFileUploadSync]',
|
|
32
|
+
exportAs: 'dbxFirebaseStorageFileUploadSync',
|
|
33
|
+
standalone: true
|
|
34
|
+
}]
|
|
35
|
+
}], ctorParameters: () => [] });
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUudXBsb2FkLnN5bmMuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZpcmViYXNlL3NyYy9saWIvbW9kdWxlcy9zdG9yYWdlZmlsZS9jb250YWluZXIvc3RvcmFnZWZpbGUudXBsb2FkLnN5bmMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBRTFEOztHQUVHO0FBTUgsTUFBTSxPQUFPLHlDQUF5QztJQUNuQyxXQUFXLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO0lBQ3ZDLFNBQVMsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7SUFDckMsU0FBUyxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUU3QyxXQUFXLEdBQUcsTUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDeEQsZUFBZSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBRTFEO1FBQ0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDOUksQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQWxCVSx5Q0FBeUM7NEZBQXpDLHlDQUF5Qzs7NEZBQXpDLHlDQUF5QztrQkFMckQsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0NBQW9DO29CQUM5QyxRQUFRLEVBQUUsa0NBQWtDO29CQUM1QyxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGluamVjdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25PYmplY3QgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZSB9IGZyb20gJy4uL3N0b3JlJztcbmltcG9ydCB7IERieEZpbGVVcGxvYWRDb21wb25lbnQgfSBmcm9tICdAZGVyZWVrYi9kYngtd2ViJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgdGhhdCBzeW5jcyBhIERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZSdzIGNvbmZpZ3VyYXRpb24gdG8gYSBEYnhGaWxlVXBsb2FkQ29tcG9uZW50LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN5bmNdJyxcbiAgZXhwb3J0QXM6ICdkYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3luYycsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN5bmNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxvd2VkU3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tdWx0aVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsZXNTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcmVhZG9ubHkgdXBsb2FkU3RvcmUgPSBpbmplY3QoRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZFN0b3JlKTtcbiAgcmVhZG9ubHkgdXBsb2FkQ29tcG9uZW50ID0gaW5qZWN0KERieEZpbGVVcGxvYWRDb21wb25lbnQpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2FsbG93ZWRTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy51cGxvYWRTdG9yZS5maWxlVHlwZXNBbGxvd2VkJC5zdWJzY3JpYmUoKHgpID0+IHRoaXMudXBsb2FkQ29tcG9uZW50LnNldEFjY2VwdCh4KSk7XG4gICAgdGhpcy5fbXVsdGlTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy51cGxvYWRTdG9yZS5pc011bHRpVXBsb2FkQWxsb3dlZCQuc3Vic2NyaWJlKCh4KSA9PiB0aGlzLnVwbG9hZENvbXBvbmVudC5zZXRNdWx0aXBsZSh4KSk7XG4gICAgdGhpcy5fZmlsZXNTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy51cGxvYWRDb21wb25lbnQuZmlsZXNDaGFuZ2VkLnN1YnNjcmliZSgoZmlsZXMpID0+IHRoaXMudXBsb2FkU3RvcmUuc2V0RmlsZXMoZmlsZXMubWF0Y2hSZXN1bHQuYWNjZXB0ZWQpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2FsbG93ZWRTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX211bHRpU3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9maWxlc1N1Yi5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './container';
|
|
2
|
+
export * from './store';
|
|
3
|
+
export * from './storagefile.upload.module';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsNkJBQTZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbnRhaW5lcic7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLm1vZHVsZSc7XG4iXX0=
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { DbxActionLoadingContextDirective, DbxActionModule, DbxActionSnackbarErrorDirective, DbxFileUploadComponent, DbxFileUploadActionSyncDirective, DbxLoadingComponent } from '@dereekb/dbx-web';
|
|
2
|
+
import { DbxFirebaseStorageFileUploadActionHandlerDirective, DbxFirebaseStorageFileUploadStoreDirective, DbxFirebaseStorageFileUploadSyncDirective, DbxFirebaseStorageFileUploadInitializeDocumentDirective } from './container';
|
|
3
|
+
import { NgModule } from '@angular/core';
|
|
4
|
+
import { DbxFirebaseStorageFileDocumentStoreDirective } from './store/storagefile.document.store.directive';
|
|
5
|
+
import { DbxFirebaseStorageFileCollectionStoreDirective } from './store';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export const importsAndExports = [
|
|
8
|
+
// dbx-core/dbx-web modules/components
|
|
9
|
+
DbxActionModule,
|
|
10
|
+
DbxLoadingComponent,
|
|
11
|
+
DbxActionLoadingContextDirective,
|
|
12
|
+
DbxActionSnackbarErrorDirective,
|
|
13
|
+
DbxFileUploadComponent,
|
|
14
|
+
DbxFileUploadActionSyncDirective,
|
|
15
|
+
// containers
|
|
16
|
+
DbxFirebaseStorageFileUploadActionHandlerDirective,
|
|
17
|
+
DbxFirebaseStorageFileUploadStoreDirective,
|
|
18
|
+
DbxFirebaseStorageFileUploadSyncDirective,
|
|
19
|
+
DbxFirebaseStorageFileUploadInitializeDocumentDirective,
|
|
20
|
+
// stores
|
|
21
|
+
DbxFirebaseStorageFileCollectionStoreDirective,
|
|
22
|
+
DbxFirebaseStorageFileDocumentStoreDirective
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Convenience module for importing various modules/components that are relevant to the storage file upload feature.
|
|
26
|
+
*
|
|
27
|
+
* - DbxActionModule
|
|
28
|
+
* - DbxFileUploadComponent
|
|
29
|
+
* - DbxFirebaseStorageFileUploadActionHandlerDirective
|
|
30
|
+
* - DbxFirebaseStorageFileUploadStoreDirective
|
|
31
|
+
* - DbxFirebaseStorageFileUploadSyncDirective
|
|
32
|
+
* - DbxFirebaseStorageFileUploadInitializeDocumentDirective
|
|
33
|
+
* - DbxFirebaseStorageFileUploadStore
|
|
34
|
+
*/
|
|
35
|
+
export class DbxFirebaseStorageFileUploadModule {
|
|
36
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
37
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadModule, imports: [
|
|
38
|
+
// dbx-core/dbx-web modules/components
|
|
39
|
+
DbxActionModule,
|
|
40
|
+
DbxLoadingComponent,
|
|
41
|
+
DbxActionLoadingContextDirective,
|
|
42
|
+
DbxActionSnackbarErrorDirective,
|
|
43
|
+
DbxFileUploadComponent,
|
|
44
|
+
DbxFileUploadActionSyncDirective,
|
|
45
|
+
// containers
|
|
46
|
+
DbxFirebaseStorageFileUploadActionHandlerDirective,
|
|
47
|
+
DbxFirebaseStorageFileUploadStoreDirective,
|
|
48
|
+
DbxFirebaseStorageFileUploadSyncDirective,
|
|
49
|
+
DbxFirebaseStorageFileUploadInitializeDocumentDirective,
|
|
50
|
+
// stores
|
|
51
|
+
DbxFirebaseStorageFileCollectionStoreDirective,
|
|
52
|
+
DbxFirebaseStorageFileDocumentStoreDirective], exports: [
|
|
53
|
+
// dbx-core/dbx-web modules/components
|
|
54
|
+
DbxActionModule,
|
|
55
|
+
DbxLoadingComponent,
|
|
56
|
+
DbxActionLoadingContextDirective,
|
|
57
|
+
DbxActionSnackbarErrorDirective,
|
|
58
|
+
DbxFileUploadComponent,
|
|
59
|
+
DbxFileUploadActionSyncDirective,
|
|
60
|
+
// containers
|
|
61
|
+
DbxFirebaseStorageFileUploadActionHandlerDirective,
|
|
62
|
+
DbxFirebaseStorageFileUploadStoreDirective,
|
|
63
|
+
DbxFirebaseStorageFileUploadSyncDirective,
|
|
64
|
+
DbxFirebaseStorageFileUploadInitializeDocumentDirective,
|
|
65
|
+
// stores
|
|
66
|
+
DbxFirebaseStorageFileCollectionStoreDirective,
|
|
67
|
+
DbxFirebaseStorageFileDocumentStoreDirective] });
|
|
68
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadModule, imports: [
|
|
69
|
+
// dbx-core/dbx-web modules/components
|
|
70
|
+
DbxActionModule,
|
|
71
|
+
DbxLoadingComponent,
|
|
72
|
+
DbxFileUploadComponent,
|
|
73
|
+
// dbx-core/dbx-web modules/components
|
|
74
|
+
DbxActionModule] });
|
|
75
|
+
}
|
|
76
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileUploadModule, decorators: [{
|
|
77
|
+
type: NgModule,
|
|
78
|
+
args: [{
|
|
79
|
+
imports: importsAndExports,
|
|
80
|
+
exports: importsAndExports
|
|
81
|
+
}]
|
|
82
|
+
}] });
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUudXBsb2FkLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1maXJlYmFzZS9zcmMvbGliL21vZHVsZXMvc3RvcmFnZWZpbGUvc3RvcmFnZWZpbGUudXBsb2FkLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsZUFBZSxFQUFFLCtCQUErQixFQUFFLHNCQUFzQixFQUFFLGdDQUFnQyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDck0sT0FBTyxFQUFFLGtEQUFrRCxFQUFFLDBDQUEwQyxFQUFFLHlDQUF5QyxFQUFFLHVEQUF1RCxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pPLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLDRDQUE0QyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDNUcsT0FBTyxFQUFFLDhDQUE4QyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUV6RSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixzQ0FBc0M7SUFDdEMsZUFBZTtJQUNmLG1CQUFtQjtJQUNuQixnQ0FBZ0M7SUFDaEMsK0JBQStCO0lBQy9CLHNCQUFzQjtJQUN0QixnQ0FBZ0M7SUFDaEMsYUFBYTtJQUNiLGtEQUFrRDtJQUNsRCwwQ0FBMEM7SUFDMUMseUNBQXlDO0lBQ3pDLHVEQUF1RDtJQUN2RCxTQUFTO0lBQ1QsOENBQThDO0lBQzlDLDRDQUE0QztDQUM3QyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUtILE1BQU0sT0FBTyxrQ0FBa0M7d0dBQWxDLGtDQUFrQzt5R0FBbEMsa0NBQWtDO1lBaEM3QyxzQ0FBc0M7WUFDdEMsZUFBZTtZQUNmLG1CQUFtQjtZQUNuQixnQ0FBZ0M7WUFDaEMsK0JBQStCO1lBQy9CLHNCQUFzQjtZQUN0QixnQ0FBZ0M7WUFDaEMsYUFBYTtZQUNiLGtEQUFrRDtZQUNsRCwwQ0FBMEM7WUFDMUMseUNBQXlDO1lBQ3pDLHVEQUF1RDtZQUN2RCxTQUFTO1lBQ1QsOENBQThDO1lBQzlDLDRDQUE0QztZQWQ1QyxzQ0FBc0M7WUFDdEMsZUFBZTtZQUNmLG1CQUFtQjtZQUNuQixnQ0FBZ0M7WUFDaEMsK0JBQStCO1lBQy9CLHNCQUFzQjtZQUN0QixnQ0FBZ0M7WUFDaEMsYUFBYTtZQUNiLGtEQUFrRDtZQUNsRCwwQ0FBMEM7WUFDMUMseUNBQXlDO1lBQ3pDLHVEQUF1RDtZQUN2RCxTQUFTO1lBQ1QsOENBQThDO1lBQzlDLDRDQUE0Qzt5R0FrQmpDLGtDQUFrQztZQWhDN0Msc0NBQXNDO1lBQ3RDLGVBQWU7WUFDZixtQkFBbUI7WUFHbkIsc0JBQXNCO1lBTHRCLHNDQUFzQztZQUN0QyxlQUFlOzs0RkErQkosa0NBQWtDO2tCQUo5QyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLE9BQU8sRUFBRSxpQkFBaUI7aUJBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGJ4QWN0aW9uTG9hZGluZ0NvbnRleHREaXJlY3RpdmUsIERieEFjdGlvbk1vZHVsZSwgRGJ4QWN0aW9uU25hY2tiYXJFcnJvckRpcmVjdGl2ZSwgRGJ4RmlsZVVwbG9hZENvbXBvbmVudCwgRGJ4RmlsZVVwbG9hZEFjdGlvblN5bmNEaXJlY3RpdmUsIERieExvYWRpbmdDb21wb25lbnQgfSBmcm9tICdAZGVyZWVrYi9kYngtd2ViJztcbmltcG9ydCB7IERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRBY3Rpb25IYW5kbGVyRGlyZWN0aXZlLCBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVEaXJlY3RpdmUsIERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTeW5jRGlyZWN0aXZlLCBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkSW5pdGlhbGl6ZURvY3VtZW50RGlyZWN0aXZlIH0gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERieEZpcmViYXNlU3RvcmFnZUZpbGVEb2N1bWVudFN0b3JlRGlyZWN0aXZlIH0gZnJvbSAnLi9zdG9yZS9zdG9yYWdlZmlsZS5kb2N1bWVudC5zdG9yZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZUNvbGxlY3Rpb25TdG9yZURpcmVjdGl2ZSB9IGZyb20gJy4vc3RvcmUnO1xuXG5leHBvcnQgY29uc3QgaW1wb3J0c0FuZEV4cG9ydHMgPSBbXG4gIC8vIGRieC1jb3JlL2RieC13ZWIgbW9kdWxlcy9jb21wb25lbnRzXG4gIERieEFjdGlvbk1vZHVsZSxcbiAgRGJ4TG9hZGluZ0NvbXBvbmVudCxcbiAgRGJ4QWN0aW9uTG9hZGluZ0NvbnRleHREaXJlY3RpdmUsXG4gIERieEFjdGlvblNuYWNrYmFyRXJyb3JEaXJlY3RpdmUsXG4gIERieEZpbGVVcGxvYWRDb21wb25lbnQsXG4gIERieEZpbGVVcGxvYWRBY3Rpb25TeW5jRGlyZWN0aXZlLFxuICAvLyBjb250YWluZXJzXG4gIERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRBY3Rpb25IYW5kbGVyRGlyZWN0aXZlLFxuICBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3RvcmVEaXJlY3RpdmUsXG4gIERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTeW5jRGlyZWN0aXZlLFxuICBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkSW5pdGlhbGl6ZURvY3VtZW50RGlyZWN0aXZlLFxuICAvLyBzdG9yZXNcbiAgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZUNvbGxlY3Rpb25TdG9yZURpcmVjdGl2ZSxcbiAgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvY3VtZW50U3RvcmVEaXJlY3RpdmVcbl07XG5cbi8qKlxuICogQ29udmVuaWVuY2UgbW9kdWxlIGZvciBpbXBvcnRpbmcgdmFyaW91cyBtb2R1bGVzL2NvbXBvbmVudHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gdGhlIHN0b3JhZ2UgZmlsZSB1cGxvYWQgZmVhdHVyZS5cbiAqXG4gKiAtIERieEFjdGlvbk1vZHVsZVxuICogLSBEYnhGaWxlVXBsb2FkQ29tcG9uZW50XG4gKiAtIERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRBY3Rpb25IYW5kbGVyRGlyZWN0aXZlXG4gKiAtIERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZURpcmVjdGl2ZVxuICogLSBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkU3luY0RpcmVjdGl2ZVxuICogLSBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlVXBsb2FkSW5pdGlhbGl6ZURvY3VtZW50RGlyZWN0aXZlXG4gKiAtIERieEZpcmViYXNlU3RvcmFnZUZpbGVVcGxvYWRTdG9yZVxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBpbXBvcnRzQW5kRXhwb3J0cyxcbiAgZXhwb3J0czogaW1wb3J0c0FuZEV4cG9ydHNcbn0pXG5leHBvcnQgY2xhc3MgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZVVwbG9hZE1vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './storagefile.collection.store';
|
|
2
|
+
export * from './storagefile.collection.store.directive';
|
|
3
|
+
export * from './storagefile.document.store';
|
|
4
|
+
export * from './storagefile.document.store.directive';
|
|
5
|
+
export * from './storagefile.upload.store';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL3N0b3JlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYywwQ0FBMEMsQ0FBQztBQUN6RCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyw0QkFBNEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUuY29sbGVjdGlvbi5zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLmNvbGxlY3Rpb24uc3RvcmUuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUuZG9jdW1lbnQuc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlZmlsZS5kb2N1bWVudC5zdG9yZS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlZmlsZS51cGxvYWQuc3RvcmUnO1xuIl19
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Directive } from '@angular/core';
|
|
2
|
+
import { DbxFirebaseCollectionStoreDirective, provideDbxFirebaseCollectionStoreDirective } from '../../../model/modules/store';
|
|
3
|
+
import { StorageFileCollectionStore } from './storagefile.collection.store';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./storagefile.collection.store";
|
|
6
|
+
export class DbxFirebaseStorageFileCollectionStoreDirective extends DbxFirebaseCollectionStoreDirective {
|
|
7
|
+
constructor(store) {
|
|
8
|
+
super(store);
|
|
9
|
+
this.setConstraints([]);
|
|
10
|
+
}
|
|
11
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileCollectionStoreDirective, deps: [{ token: i1.StorageFileCollectionStore }], target: i0.ɵɵFactoryTarget.Directive });
|
|
12
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DbxFirebaseStorageFileCollectionStoreDirective, isStandalone: true, selector: "[dbxFirebaseStorageFileCollection]", providers: provideDbxFirebaseCollectionStoreDirective(DbxFirebaseStorageFileCollectionStoreDirective, StorageFileCollectionStore), usesInheritance: true, ngImport: i0 });
|
|
13
|
+
}
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileCollectionStoreDirective, decorators: [{
|
|
15
|
+
type: Directive,
|
|
16
|
+
args: [{
|
|
17
|
+
selector: '[dbxFirebaseStorageFileCollection]',
|
|
18
|
+
providers: provideDbxFirebaseCollectionStoreDirective(DbxFirebaseStorageFileCollectionStoreDirective, StorageFileCollectionStore),
|
|
19
|
+
standalone: true
|
|
20
|
+
}]
|
|
21
|
+
}], ctorParameters: () => [{ type: i1.StorageFileCollectionStore }] });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuY29sbGVjdGlvbi5zdG9yZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL3N0b3JlL3N0b3JhZ2VmaWxlLmNvbGxlY3Rpb24uc3RvcmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLDBDQUEwQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0gsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7OztBQVE1RSxNQUFNLE9BQU8sOENBQStDLFNBQVEsbUNBQWlHO0lBQ25LLFlBQVksS0FBaUM7UUFDM0MsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDO3dHQUpVLDhDQUE4Qzs0RkFBOUMsOENBQThDLGlGQUg5QywwQ0FBMEMsQ0FBQyw4Q0FBOEMsRUFBRSwwQkFBMEIsQ0FBQzs7NEZBR3RILDhDQUE4QztrQkFMMUQsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0NBQW9DO29CQUM5QyxTQUFTLEVBQUUsMENBQTBDLGlEQUFpRCwwQkFBMEIsQ0FBQztvQkFDakksVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYnhGaXJlYmFzZUNvbGxlY3Rpb25TdG9yZURpcmVjdGl2ZSwgcHJvdmlkZURieEZpcmViYXNlQ29sbGVjdGlvblN0b3JlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvbW9kdWxlcy9zdG9yZSc7XG5pbXBvcnQgeyBTdG9yYWdlRmlsZUNvbGxlY3Rpb25TdG9yZSB9IGZyb20gJy4vc3RvcmFnZWZpbGUuY29sbGVjdGlvbi5zdG9yZSc7XG5pbXBvcnQgeyBTdG9yYWdlRmlsZSwgU3RvcmFnZUZpbGVEb2N1bWVudCB9IGZyb20gJ0BkZXJlZWtiL2ZpcmViYXNlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RieEZpcmViYXNlU3RvcmFnZUZpbGVDb2xsZWN0aW9uXScsXG4gIHByb3ZpZGVyczogcHJvdmlkZURieEZpcmViYXNlQ29sbGVjdGlvblN0b3JlRGlyZWN0aXZlKERieEZpcmViYXNlU3RvcmFnZUZpbGVDb2xsZWN0aW9uU3RvcmVEaXJlY3RpdmUsIFN0b3JhZ2VGaWxlQ29sbGVjdGlvblN0b3JlKSxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlQ29sbGVjdGlvblN0b3JlRGlyZWN0aXZlIGV4dGVuZHMgRGJ4RmlyZWJhc2VDb2xsZWN0aW9uU3RvcmVEaXJlY3RpdmU8U3RvcmFnZUZpbGUsIFN0b3JhZ2VGaWxlRG9jdW1lbnQsIFN0b3JhZ2VGaWxlQ29sbGVjdGlvblN0b3JlPiB7XG4gIGNvbnN0cnVjdG9yKHN0b3JlOiBTdG9yYWdlRmlsZUNvbGxlY3Rpb25TdG9yZSkge1xuICAgIHN1cGVyKHN0b3JlKTtcbiAgICB0aGlzLnNldENvbnN0cmFpbnRzKFtdKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { AbstractDbxFirebaseCollectionStore, firebaseCollectionStoreCreateFunction } from '../../../model/modules/store';
|
|
3
|
+
import { StorageFileFirestoreCollections, StorageFileFunctions } from '@dereekb/firebase';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@dereekb/firebase";
|
|
6
|
+
export class StorageFileCollectionStore extends AbstractDbxFirebaseCollectionStore {
|
|
7
|
+
storageFileFunctions = inject(StorageFileFunctions);
|
|
8
|
+
constructor(collections) {
|
|
9
|
+
super({ firestoreCollection: collections.storageFileCollection });
|
|
10
|
+
}
|
|
11
|
+
initializeAllStorageFilesFromUpload = firebaseCollectionStoreCreateFunction(this, this.storageFileFunctions.storageFile.createStorageFile.allFromUpload);
|
|
12
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageFileCollectionStore, deps: [{ token: i1.StorageFileFirestoreCollections }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
13
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageFileCollectionStore });
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageFileCollectionStore, decorators: [{
|
|
16
|
+
type: Injectable
|
|
17
|
+
}], ctorParameters: () => [{ type: i1.StorageFileFirestoreCollections }] });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuY29sbGVjdGlvbi5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1maXJlYmFzZS9zcmMvbGliL21vZHVsZXMvc3RvcmFnZWZpbGUvc3RvcmUvc3RvcmFnZWZpbGUuY29sbGVjdGlvbi5zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUscUNBQXFDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6SCxPQUFPLEVBQUUsK0JBQStCLEVBQW9DLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7OztBQUc1SCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsa0NBQW9FO0lBQ3pHLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRTdELFlBQVksV0FBNEM7UUFDdEQsS0FBSyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRVEsbUNBQW1DLEdBQUcscUNBQXFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7d0dBUHZKLDBCQUEwQjs0R0FBMUIsMEJBQTBCOzs0RkFBMUIsMEJBQTBCO2tCQUR0QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdERieEZpcmViYXNlQ29sbGVjdGlvblN0b3JlLCBmaXJlYmFzZUNvbGxlY3Rpb25TdG9yZUNyZWF0ZUZ1bmN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvbW9kdWxlcy9zdG9yZSc7XG5pbXBvcnQgeyBTdG9yYWdlRmlsZUZpcmVzdG9yZUNvbGxlY3Rpb25zLCBTdG9yYWdlRmlsZSwgU3RvcmFnZUZpbGVEb2N1bWVudCwgU3RvcmFnZUZpbGVGdW5jdGlvbnMgfSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTdG9yYWdlRmlsZUNvbGxlY3Rpb25TdG9yZSBleHRlbmRzIEFic3RyYWN0RGJ4RmlyZWJhc2VDb2xsZWN0aW9uU3RvcmU8U3RvcmFnZUZpbGUsIFN0b3JhZ2VGaWxlRG9jdW1lbnQ+IHtcbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVGdW5jdGlvbnMgPSBpbmplY3QoU3RvcmFnZUZpbGVGdW5jdGlvbnMpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbGxlY3Rpb25zOiBTdG9yYWdlRmlsZUZpcmVzdG9yZUNvbGxlY3Rpb25zKSB7XG4gICAgc3VwZXIoeyBmaXJlc3RvcmVDb2xsZWN0aW9uOiBjb2xsZWN0aW9ucy5zdG9yYWdlRmlsZUNvbGxlY3Rpb24gfSk7XG4gIH1cblxuICByZWFkb25seSBpbml0aWFsaXplQWxsU3RvcmFnZUZpbGVzRnJvbVVwbG9hZCA9IGZpcmViYXNlQ29sbGVjdGlvblN0b3JlQ3JlYXRlRnVuY3Rpb24odGhpcywgdGhpcy5zdG9yYWdlRmlsZUZ1bmN0aW9ucy5zdG9yYWdlRmlsZS5jcmVhdGVTdG9yYWdlRmlsZS5hbGxGcm9tVXBsb2FkKTtcbn1cbiJdfQ==
|