@wizishop/img-manager-webelement 1.0.4 → 14.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -113
- package/esm2020/lib/environments/environment.mjs +99 -0
- package/esm2020/lib/img-manager-web-element.component.mjs +176 -0
- package/esm2020/lib/img-manager-web-element.module.mjs +47 -0
- package/esm2020/lib/services/auth-credentials.service.mjs +43 -0
- package/esm2020/lib/services/event.service.mjs +37 -0
- package/esm2020/lib/services/fiche_products.service.mjs +237 -0
- package/esm2020/lib/services/storage.service.mjs +53 -0
- package/esm2020/public-api.mjs +6 -0
- package/esm2020/wizishop-img-manager-webelement.mjs +5 -0
- package/fesm2015/wizishop-img-manager-webelement.mjs +669 -0
- package/fesm2015/wizishop-img-manager-webelement.mjs.map +1 -0
- package/fesm2020/wizishop-img-manager-webelement.mjs +671 -0
- package/fesm2020/wizishop-img-manager-webelement.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/environments/environment.d.ts +19 -0
- package/lib/img-manager-web-element.component.d.ts +50 -0
- package/lib/img-manager-web-element.module.d.ts +11 -0
- package/lib/services/auth-credentials.service.d.ts +19 -0
- package/lib/services/event.service.d.ts +11 -0
- package/lib/services/fiche_products.service.d.ts +51 -0
- package/lib/services/storage.service.d.ts +14 -0
- package/package.json +25 -10
- package/public-api.d.ts +2 -0
- package/3rdpartylicenses.txt +0 -665
- package/4.js +0 -1
- package/assets/img-manager/canva/icon_canva.svg +0 -4
- package/assets/img-manager/i18n/en.json +0 -1
- package/assets/img-manager/i18n/es.json +0 -1
- package/assets/img-manager/i18n/fr.json +0 -1
- package/assets/img-manager/i18n/it.json +0 -1
- package/assets/img-manager/img/fake.png +0 -0
- package/assets/img-manager/img/icon_picture.svg +0 -11
- package/favicon.ico +0 -0
- package/img-manager-webelement.1.0.4.js +0 -1
- package/index.html +0 -25
- package/main.js +0 -1
- package/polyfills.js +0 -1
- package/runtime.js +0 -1
- package/styles.1.0.4.css +0 -2
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { forkJoin, fromEvent, Observable } from "rxjs";
|
|
4
|
+
import { take } from 'rxjs/operators';
|
|
5
|
+
import { environment } from '../environments/environment';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common/http";
|
|
8
|
+
import * as i2 from "@wizishop/img-manager";
|
|
9
|
+
import * as i3 from "./event.service";
|
|
10
|
+
export class FicheProductService {
|
|
11
|
+
constructor(http, imgSelectionService, eventService, canvaService) {
|
|
12
|
+
this.http = http;
|
|
13
|
+
this.imgSelectionService = imgSelectionService;
|
|
14
|
+
this.eventService = eventService;
|
|
15
|
+
this.canvaService = canvaService;
|
|
16
|
+
this.image_manager_api = environment.wizi_api + "/image-manager/shops/";
|
|
17
|
+
this.isPhotosTab = false; // State of the Photos tabs in fiche product page
|
|
18
|
+
this.isPreviousTabPhotos = false;
|
|
19
|
+
this.isVariantsTab = false;
|
|
20
|
+
this.loadProductImgSelection = false;
|
|
21
|
+
this.expectedMediaDto = {
|
|
22
|
+
id: '',
|
|
23
|
+
image_url: '',
|
|
24
|
+
image_width: '900',
|
|
25
|
+
image_height: '900',
|
|
26
|
+
};
|
|
27
|
+
this.subscriptions = [];
|
|
28
|
+
}
|
|
29
|
+
setApiConfig(shop_id, shop_token) {
|
|
30
|
+
this.shopToken = shop_token;
|
|
31
|
+
this.shopId = shop_id;
|
|
32
|
+
const matches = window.location.pathname.match(/\/(\w+)\/products\/(\d+)\/edit/);
|
|
33
|
+
const lang = matches && matches[1] ? matches[1] : 'fr';
|
|
34
|
+
this.productSheetApiRoute = environment.wizi_admin_api + lang + environment.product_sheet_endpoint;
|
|
35
|
+
this.productId = matches && matches[2] ? matches[2] : "0";
|
|
36
|
+
this.isProductCreation = /\/products\/create/.test(window.location.pathname);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* There is only one instance of this img manager.
|
|
40
|
+
* But it is called with different config, by Photos tab and Variation tab, on fiche product page.
|
|
41
|
+
* The method handle the switch config between Photos and Variation tab.
|
|
42
|
+
* Return an observable : true => Photos tab / false => Variation tab.
|
|
43
|
+
* */
|
|
44
|
+
handleTabs() {
|
|
45
|
+
return new Observable(observer => {
|
|
46
|
+
const switchTabsSub = this.switchTabs().subscribe(data => {
|
|
47
|
+
if (!data || !data["detail"] || !data["detail"]["currentTab"]) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Retrieve current tab
|
|
51
|
+
const currentTab = data["detail"]["currentTab"];
|
|
52
|
+
this.isPreviousTabPhotos = this.isPhotosTab;
|
|
53
|
+
this.isPhotosTab = currentTab === 'photos';
|
|
54
|
+
this.isVariantsTab = currentTab === 'variation';
|
|
55
|
+
// The user switch to Photos tab
|
|
56
|
+
if (this.isPhotosTab) {
|
|
57
|
+
this.loadProductImgSelection = true;
|
|
58
|
+
if (!this.currentProductImgSelection || !this.currentProductImgSelection.length) {
|
|
59
|
+
this.initProductImgSelection();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
this.applyCurrentImgSelection();
|
|
63
|
+
this.loadProductImgSelection = false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (this.isPreviousTabPhotos) { // The user switch to another tab
|
|
67
|
+
// Save current img selection, in order to not lose the img selection
|
|
68
|
+
this.saveCurrentImgSelection();
|
|
69
|
+
}
|
|
70
|
+
observer.next(this.isPhotosTab);
|
|
71
|
+
});
|
|
72
|
+
this.subscriptions.push(switchTabsSub);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
getShopImg(idFile) {
|
|
76
|
+
return this.http.get(`${this.image_manager_api}${this.shopId}/images/${idFile}`, this.getOptionsHeadersWithBearer());
|
|
77
|
+
}
|
|
78
|
+
initProductImgSelection() {
|
|
79
|
+
// Display the loader in img list selection
|
|
80
|
+
this.imgSelectionService.emitImgListLoading(true);
|
|
81
|
+
// retrieve img selection
|
|
82
|
+
const retrieveImgSelectionSub = this.retrieveImgSelection().subscribe(data => {
|
|
83
|
+
// No imgage selected
|
|
84
|
+
if (!data || !data["photos"] || !data["photos"]["infos"] || !data["photos"]["infos"]["files"] || !data["photos"]["infos"]["files"].length) {
|
|
85
|
+
this.loadProductImgSelection = false;
|
|
86
|
+
this.imgSelectionService.emitImgListLoading(false);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const idImgSelectionList = data["photos"]["infos"]["files"];
|
|
90
|
+
const obsImg = [];
|
|
91
|
+
idImgSelectionList.forEach(idFile => obsImg.push(this.getShopImg(idFile.toString()).pipe(take(1))));
|
|
92
|
+
const allImgSub = forkJoin(obsImg).subscribe((photos) => {
|
|
93
|
+
// The img selection must be saved, otherwise it is lost when the user switch on variation tab
|
|
94
|
+
this.saveCurrentImgSelection(photos);
|
|
95
|
+
this.applyCurrentImgSelection();
|
|
96
|
+
this.loadProductImgSelection = false;
|
|
97
|
+
}, error => {
|
|
98
|
+
// Hide the loader in img list selection
|
|
99
|
+
this.loadProductImgSelection = false;
|
|
100
|
+
this.imgSelectionService.emitImgListLoading(false);
|
|
101
|
+
});
|
|
102
|
+
this.subscriptions.push(allImgSub);
|
|
103
|
+
});
|
|
104
|
+
this.subscriptions.push(retrieveImgSelectionSub);
|
|
105
|
+
this.canvaService.expectedImgSizesChange(this.expectedMediaDto);
|
|
106
|
+
}
|
|
107
|
+
retrieveInfoSelection() {
|
|
108
|
+
const formData = new FormData();
|
|
109
|
+
formData.append('rub', "main");
|
|
110
|
+
formData.append('action', "getInfos");
|
|
111
|
+
formData.append('prodId', this.productId);
|
|
112
|
+
formData.append('_token', '');
|
|
113
|
+
formData.append('_shid', this.shopId.toString());
|
|
114
|
+
return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
|
|
115
|
+
}
|
|
116
|
+
retrieveImgSelection() {
|
|
117
|
+
const formData = new FormData();
|
|
118
|
+
formData.append('rub', "main");
|
|
119
|
+
formData.append('action', "getAllInfos");
|
|
120
|
+
formData.append('prodId', this.productId);
|
|
121
|
+
formData.append('_token', '');
|
|
122
|
+
formData.append('_shid', this.shopId.toString());
|
|
123
|
+
return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
|
|
124
|
+
}
|
|
125
|
+
updateImgSelectionOnChange() {
|
|
126
|
+
// listen to the img manager change
|
|
127
|
+
const imgSelectionSub = this.imgSelectionService.getImgSelectionChange().subscribe(imgSelectionList => {
|
|
128
|
+
if (!imgSelectionList) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// Send the img selection
|
|
132
|
+
if (this.isPhotosTab && !this.loadProductImgSelection) {
|
|
133
|
+
// Retrieve only the img id
|
|
134
|
+
const idImgSelectedList = [];
|
|
135
|
+
imgSelectionList.forEach(img => {
|
|
136
|
+
idImgSelectedList.push(parseInt(img.id_file));
|
|
137
|
+
});
|
|
138
|
+
this.updateProductImgSelection(idImgSelectedList);
|
|
139
|
+
// On variation tab, send event with img selected
|
|
140
|
+
}
|
|
141
|
+
else if (!this.isPhotosTab && imgSelectionList.length) {
|
|
142
|
+
this.eventService.sendImgSelectedToPage(imgSelectionList[0]);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
this.subscriptions.push(imgSelectionSub);
|
|
146
|
+
}
|
|
147
|
+
updateProductImgSelection(idsImgList) {
|
|
148
|
+
if ((!this.productId || this.productId === "0") && Wizi._produit.global.PROD_ID) {
|
|
149
|
+
this.productId = Wizi._produit.global.PROD_ID.toString();
|
|
150
|
+
}
|
|
151
|
+
Wizi._produit._dataTmp['photos'].infos = {};
|
|
152
|
+
Wizi._produit._dataTmp['photos'].infos.files = idsImgList;
|
|
153
|
+
this.emitImgSelectionChange(idsImgList);
|
|
154
|
+
if (this.productId && this.productId !== "0") {
|
|
155
|
+
const submitProd1 = this.submitProductImg(idsImgList).subscribe();
|
|
156
|
+
this.subscriptions.push(submitProd1);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const createProductSub = this.createProduct().subscribe((productId) => {
|
|
160
|
+
if (!productId) {
|
|
161
|
+
throw "No product id created. Can not link image(s) to the new product.";
|
|
162
|
+
}
|
|
163
|
+
Wizi._produit.global.PROD_ID = productId;
|
|
164
|
+
this.productId = productId.toString();
|
|
165
|
+
this.submitProductImg(idsImgList).subscribe();
|
|
166
|
+
});
|
|
167
|
+
this.subscriptions.push(createProductSub);
|
|
168
|
+
}
|
|
169
|
+
submitProductImg(idsImgList) {
|
|
170
|
+
const data = {
|
|
171
|
+
files: idsImgList,
|
|
172
|
+
couls: []
|
|
173
|
+
};
|
|
174
|
+
const formData = new FormData();
|
|
175
|
+
formData.append('rub', "photos");
|
|
176
|
+
formData.append('action', "save");
|
|
177
|
+
formData.append('newProd', this.isProductCreation ? "1" : "0");
|
|
178
|
+
formData.append('prodId', this.productId);
|
|
179
|
+
formData.append('_token', this.shopToken);
|
|
180
|
+
formData.append('_shid', this.shopId.toString());
|
|
181
|
+
formData.append('data', JSON.stringify(data));
|
|
182
|
+
return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
|
|
183
|
+
}
|
|
184
|
+
createProduct() {
|
|
185
|
+
const formData = new FormData();
|
|
186
|
+
formData.append('rub', "main");
|
|
187
|
+
formData.append('action', "createProd");
|
|
188
|
+
formData.append('_token', '');
|
|
189
|
+
formData.append('_shid', this.shopId.toString());
|
|
190
|
+
return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
|
|
191
|
+
}
|
|
192
|
+
/* Use to know where the img manager is displayed, and to close it when switching tab */
|
|
193
|
+
switchTabs() {
|
|
194
|
+
return fromEvent(document.getElementById('imgManagerModule'), "switchTab");
|
|
195
|
+
}
|
|
196
|
+
emitImgSelectionChange(idsImgList) {
|
|
197
|
+
const value = {
|
|
198
|
+
detail: {
|
|
199
|
+
idsImgList
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
const event = new CustomEvent('onImgSelectionChange', value);
|
|
203
|
+
const imgManagerModule = document.getElementById('imgManagerModule');
|
|
204
|
+
imgManagerModule?.dispatchEvent(event);
|
|
205
|
+
}
|
|
206
|
+
saveCurrentImgSelection(imgSelection) {
|
|
207
|
+
this.currentProductImgSelection = imgSelection ? imgSelection : JSON.parse(JSON.stringify(this.imgSelectionService.getImgSelection()));
|
|
208
|
+
}
|
|
209
|
+
applyCurrentImgSelection() {
|
|
210
|
+
this.imgSelectionService.setImgSelection(this.currentProductImgSelection);
|
|
211
|
+
// Hide the loader in img list selection
|
|
212
|
+
this.imgSelectionService.emitImgListLoading(false);
|
|
213
|
+
}
|
|
214
|
+
getOptionsHeaders() {
|
|
215
|
+
const header = { headers: new HttpHeaders({
|
|
216
|
+
'Access-Control-Allow-Origin': '*'
|
|
217
|
+
})
|
|
218
|
+
};
|
|
219
|
+
return header;
|
|
220
|
+
}
|
|
221
|
+
getOptionsHeadersWithBearer() {
|
|
222
|
+
const header = { headers: new HttpHeaders({
|
|
223
|
+
Authorization: 'Bearer ' + this.shopToken
|
|
224
|
+
})
|
|
225
|
+
};
|
|
226
|
+
return header;
|
|
227
|
+
}
|
|
228
|
+
ngOnDestroy() {
|
|
229
|
+
this.subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
FicheProductService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: FicheProductService, deps: [{ token: i1.HttpClient }, { token: i2.ImgSelectionService }, { token: i3.EventService }, { token: i2.CanvaService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
233
|
+
FicheProductService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: FicheProductService });
|
|
234
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: FicheProductService, decorators: [{
|
|
235
|
+
type: Injectable
|
|
236
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ImgSelectionService }, { type: i3.EventService }, { type: i2.CanvaService }]; } });
|
|
237
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmljaGVfcHJvZHVjdHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ltZy1tYW5hZ2VyLXdlYi1lbGVtZW50L3NyYy9saWIvc2VydmljZXMvZmljaGVfcHJvZHVjdHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7O0FBSzFELE1BQU0sT0FBTyxtQkFBbUI7SUFzQjlCLFlBQ1UsSUFBZ0IsRUFDaEIsbUJBQXdDLEVBQ3hDLFlBQTBCLEVBQzFCLFlBQTBCO1FBSDFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXZCcEMsc0JBQWlCLEdBQVcsV0FBVyxDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQztRQUkzRSxnQkFBVyxHQUFZLEtBQUssQ0FBQyxDQUFDLGlEQUFpRDtRQUMvRSx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDckMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsNEJBQXVCLEdBQVcsS0FBSyxDQUFDO1FBR3hDLHFCQUFnQixHQUFxQjtZQUNuQyxFQUFFLEVBQUUsRUFBRTtZQUNOLFNBQVMsRUFBRSxFQUFFO1lBQ2IsV0FBVyxFQUFFLEtBQUs7WUFDbEIsWUFBWSxFQUFFLEtBQUs7U0FDcEIs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Q29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGZvcmtKb2luLCBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FudmFTZXJ2aWNlLCBJbWdQaWN0dXJlRFRPLCBJbWdTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnQHdpemlzaG9wL2ltZy1tYW5hZ2VyJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4vZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBXaXppQmxvY2tNZWRpYUR0byB9IGZyb20gJ0B3aXppc2hvcC9pbWctbWFuYWdlci9saWIvZHRvL3dpemktYmxvY2stbWVkaWEuZHRvJztcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcblxuZGVjbGFyZSBjb25zdCBXaXppOiBhbnk7XG5cbkBJbmplY3RhYmxlKCkgLy8gdG9kb1xuZXhwb3J0IGNsYXNzIEZpY2hlUHJvZHVjdFNlcnZpY2Uge1xuXG4gIHByb2R1Y3RTaGVldEFwaVJvdXRlOiBzdHJpbmc7XG4gIGltYWdlX21hbmFnZXJfYXBpOiBzdHJpbmcgPSBlbnZpcm9ubWVudC53aXppX2FwaSArIFwiL2ltYWdlLW1hbmFnZXIvc2hvcHMvXCI7XG4gIHNob3BUb2tlbjogc3RyaW5nO1xuICBzaG9wSWQ6IG51bWJlcjtcbiAgcHJvZHVjdElkOiBzdHJpbmc7XG4gIGlzUGhvdG9zVGFiOiBib29sZWFuID0gZmFsc2U7IC8vIFN0YXRlIG9mIHRoZSBQaG90b3MgdGFicyBpbiBmaWNoZSBwcm9kdWN0IHBhZ2VcbiAgaXNQcmV2aW91c1RhYlBob3RvczogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1ZhcmlhbnRzVGFiOiBib29sZWFuID0gZmFsc2U7XG4gIGxvYWRQcm9kdWN0SW1nU2VsZWN0aW9uOmJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudFByb2R1Y3RJbWdTZWxlY3Rpb246IEltZ1BpY3R1cmVEVE9bXTtcbiAgaXNQcm9kdWN0Q3JlYXRpb246IGJvb2xlYW47XG4gIGV4cGVjdGVkTWVkaWFEdG86V2l6aUJsb2NrTWVkaWFEdG8gPSB7XG4gICAgaWQ6ICcnLFxuICAgIGltYWdlX3VybDogJycsXG4gICAgaW1hZ2Vfd2lkdGg6ICc5MDAnLFxuICAgIGltYWdlX2hlaWdodDogJzkwMCcsXG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgaW1nU2VsZWN0aW9uU2VydmljZTogSW1nU2VsZWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2FudmFTZXJ2aWNlOiBDYW52YVNlcnZpY2UsXG4gICAgKSB7IH1cblxuICBzZXRBcGlDb25maWcoc2hvcF9pZDogbnVtYmVyLCBzaG9wX3Rva2VuOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNob3BUb2tlbiA9IHNob3BfdG9rZW47XG4gICAgdGhpcy5zaG9wSWQgPSBzaG9wX2lkO1xuXG4gICAgY29uc3QgbWF0Y2hlcyA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCggL1xcLyhcXHcrKVxcL3Byb2R1Y3RzXFwvKFxcZCspXFwvZWRpdC8pO1xuICAgIGNvbnN0IGxhbmcgPSBtYXRjaGVzICYmIG1hdGNoZXNbMV0gPyBtYXRjaGVzWzFdIDogJ2ZyJztcbiAgICB0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlID0gZW52aXJvbm1lbnQud2l6aV9hZG1pbl9hcGkgKyBsYW5nICsgZW52aXJvbm1lbnQucHJvZHVjdF9zaGVldF9lbmRwb2ludDtcbiAgICB0aGlzLnByb2R1Y3RJZCA9IG1hdGNoZXMgJiYgbWF0Y2hlc1syXSA/IG1hdGNoZXNbMl0gOiBcIjBcIjtcbiAgICB0aGlzLmlzUHJvZHVjdENyZWF0aW9uID0gL1xcL3Byb2R1Y3RzXFwvY3JlYXRlLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBpbWcgbWFuYWdlci5cbiAgICogQnV0IGl0IGlzIGNhbGxlZCB3aXRoIGRpZmZlcmVudCBjb25maWcsIGJ5IFBob3RvcyB0YWIgYW5kIFZhcmlhdGlvbiB0YWIsIG9uIGZpY2hlIHByb2R1Y3QgcGFnZS5cbiAgICogVGhlIG1ldGhvZCBoYW5kbGUgdGhlIHN3aXRjaCBjb25maWcgYmV0d2VlbiBQaG90b3MgYW5kIFZhcmlhdGlvbiB0YWIuXG4gICAqIFJldHVybiBhbiBvYnNlcnZhYmxlIDogdHJ1ZSA9PiBQaG90b3MgdGFiIC8gZmFsc2UgPT4gVmFyaWF0aW9uIHRhYi5cbiAgICogICovXG4gIGhhbmRsZVRhYnMoKTpPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuXG4gICAgICBjb25zdCBzd2l0Y2hUYWJzU3ViID1cbiAgICAgICAgdGhpcy5zd2l0Y2hUYWJzKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuXG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGFbXCJkZXRhaWxcIl0gfHwgIWRhdGFbXCJkZXRhaWxcIl1bXCJjdXJyZW50VGFiXCJdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJldHJpZXZlIGN1cnJlbnQgdGFiXG4gICAgICAgICAgY29uc3QgY3VycmVudFRhYiA9IGRhdGFbXCJkZXRhaWxcIl1bXCJjdXJyZW50VGFiXCJdO1xuICAgICAgICAgIHRoaXMuaXNQcmV2aW91c1RhYlBob3RvcyA9IHRoaXMuaXNQaG90b3NUYWI7XG4gICAgICAgICAgdGhpcy5pc1Bob3Rvc1RhYiA9IGN1cnJlbnRUYWIgPT09ICdwaG90b3MnO1xuICAgICAgICAgIHRoaXMuaXNWYXJpYW50c1RhYiA9IGN1cnJlbnRUYWIgPT09ICd2YXJpYXRpb24nO1xuXG4gICAgICAgICAgLy8gVGhlIHVzZXIgc3dpdGNoIHRvIFBob3RvcyB0YWJcbiAgICAgICAgICBpZiAodGhpcy5pc1Bob3Rvc1RhYikge1xuICAgICAgICAgICAgdGhpcy5sb2FkUHJvZHVjdEltZ1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudFByb2R1Y3RJbWdTZWxlY3Rpb24gfHwgIXRoaXMuY3VycmVudFByb2R1Y3RJbWdTZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5pdFByb2R1Y3RJbWdTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJyZW50SW1nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3RJbWdTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1ByZXZpb3VzVGFiUGhvdG9zKSB7IC8vIFRoZSB1c2VyIHN3aXRjaCB0byBhbm90aGVyIHRhYlxuICAgICAgICAgICAgLy8gU2F2ZSBjdXJyZW50IGltZyBzZWxlY3Rpb24sIGluIG9yZGVyIHRvIG5vdCBsb3NlIHRoZSBpbWcgc2VsZWN0aW9uXG4gICAgICAgICAgICB0aGlzLnNhdmVDdXJyZW50SW1nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ic2VydmVyLm5leHQodGhpcy5pc1Bob3Rvc1RhYik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzd2l0Y2hUYWJzU3ViKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNob3BJbWcoaWRGaWxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaW1hZ2VfbWFuYWdlcl9hcGl9JHt0aGlzLnNob3BJZH0vaW1hZ2VzLyR7aWRGaWxlfWAsIHRoaXMuZ2V0T3B0aW9uc0hlYWRlcnNXaXRoQmVhcmVyKCkpO1xuICB9XG5cbiAgaW5pdFByb2R1Y3RJbWdTZWxlY3Rpb24oKSB7XG5cbiAgICAvLyBEaXNwbGF5IHRoZSBsb2FkZXIgaW4gaW1nIGxpc3Qgc2VsZWN0aW9uXG4gICAgdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLmVtaXRJbWdMaXN0TG9hZGluZyh0cnVlKTtcblxuICAgIC8vIHJldHJpZXZlIGltZyBzZWxlY3Rpb25cbiAgICBjb25zdCByZXRyaWV2ZUltZ1NlbGVjdGlvblN1YiA9XG4gICAgICB0aGlzLnJldHJpZXZlSW1nU2VsZWN0aW9uKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuXG4gICAgICAgIC8vIE5vIGltZ2FnZSBzZWxlY3RlZFxuICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGFbXCJwaG90b3NcIl0gfHwgIWRhdGFbXCJwaG90b3NcIl1bXCJpbmZvc1wiXSB8fCAhZGF0YVtcInBob3Rvc1wiXVtcImluZm9zXCJdW1wiZmlsZXNcIl0gfHwgIWRhdGFbXCJwaG90b3NcIl1bXCJpbmZvc1wiXVtcImZpbGVzXCJdLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3RJbWdTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgICAgICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5lbWl0SW1nTGlzdExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkSW1nU2VsZWN0aW9uTGlzdDogbnVtYmVyW10gPSBkYXRhW1wicGhvdG9zXCJdW1wiaW5mb3NcIl1bXCJmaWxlc1wiXTtcbiAgICAgICAgY29uc3Qgb2JzSW1nOiBPYnNlcnZhYmxlPGFueT5bXSA9IFtdO1xuXG4gICAgICAgIGlkSW1nU2VsZWN0aW9uTGlzdC5mb3JFYWNoKGlkRmlsZSA9PlxuICAgICAgICAgIG9ic0ltZy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5nZXRTaG9wSW1nKGlkRmlsZS50b1N0cmluZygpKS5waXBlKHRha2UoMSkpXG4gICAgICAgICkpO1xuICAgICAgICBjb25zdCBhbGxJbWdTdWIgPVxuICAgICAgICAgIGZvcmtKb2luKG9ic0ltZykuc3Vic2NyaWJlKChwaG90b3M6IEltZ1BpY3R1cmVEVE9bXSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIGltZyBzZWxlY3Rpb24gbXVzdCBiZSBzYXZlZCwgb3RoZXJ3aXNlIGl0IGlzIGxvc3Qgd2hlbiB0aGUgdXNlciBzd2l0Y2ggb24gdmFyaWF0aW9uIHRhYlxuICAgICAgICAgICAgdGhpcy5zYXZlQ3VycmVudEltZ1NlbGVjdGlvbihwaG90b3MpO1xuICAgICAgICAgICAgdGhpcy5hcHBseUN1cnJlbnRJbWdTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3RJbWdTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgIC8vIEhpZGUgdGhlIGxvYWRlciBpbiBpbWcgbGlzdCBzZWxlY3Rpb25cbiAgICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3RJbWdTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5lbWl0SW1nTGlzdExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChhbGxJbWdTdWIpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChyZXRyaWV2ZUltZ1NlbGVjdGlvblN1Yik7XG4gICAgdGhpcy5jYW52YVNlcnZpY2UuZXhwZWN0ZWRJbWdTaXplc0NoYW5nZSh0aGlzLmV4cGVjdGVkTWVkaWFEdG8pO1xuICB9XG5cbiAgcmV0cmlldmVJbmZvU2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdydWInLCBcIm1haW5cIik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdhY3Rpb24nLCBcImdldEluZm9zXCIpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgncHJvZElkJywgdGhpcy5wcm9kdWN0SWQpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnX3Rva2VuJywgJycpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnX3NoaWQnLCB0aGlzLnNob3BJZC50b1N0cmluZygpKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlLCBmb3JtRGF0YSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcbiAgfVxuXG4gIHJldHJpZXZlSW1nU2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdydWInLCBcIm1haW5cIik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdhY3Rpb24nLCBcImdldEFsbEluZm9zXCIpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgncHJvZElkJywgdGhpcy5wcm9kdWN0SWQpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnX3Rva2VuJywgJycpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnX3NoaWQnLCB0aGlzLnNob3BJZC50b1N0cmluZygpKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KHRoaXMucHJvZHVjdFNoZWV0QXBpUm91dGUsIGZvcm1EYXRhLCB0aGlzLmdldE9wdGlvbnNIZWFkZXJzKCkpO1xuICB9XG5cbiAgdXBkYXRlSW1nU2VsZWN0aW9uT25DaGFuZ2UoKSB7XG4gICAgLy8gbGlzdGVuIHRvIHRoZSBpbWcgbWFuYWdlciBjaGFuZ2VcbiAgICBjb25zdCBpbWdTZWxlY3Rpb25TdWIgPVxuICAgICAgdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLmdldEltZ1NlbGVjdGlvbkNoYW5nZSgpLnN1YnNjcmliZShpbWdTZWxlY3Rpb25MaXN0ID0+IHtcbiAgICAgICAgaWYgKCFpbWdTZWxlY3Rpb25MaXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VuZCB0aGUgaW1nIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5pc1Bob3Rvc1RhYiAmJiAhdGhpcy5sb2FkUHJvZHVjdEltZ1NlbGVjdGlvbikge1xuICAgICAgICAgIC8vIFJldHJpZXZlIG9ubHkgdGhlIGltZyBpZFxuICAgICAgICAgIGNvbnN0IGlkSW1nU2VsZWN0ZWRMaXN0OiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgIGltZ1NlbGVjdGlvbkxpc3QuZm9yRWFjaChpbWcgPT4ge1xuICAgICAgICAgICAgaWRJbWdTZWxlY3RlZExpc3QucHVzaChwYXJzZUludChpbWcuaWRfZmlsZSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy51cGRhdGVQcm9kdWN0SW1nU2VsZWN0aW9uKGlkSW1nU2VsZWN0ZWRMaXN0KTtcblxuICAgICAgICAvLyBPbiB2YXJpYXRpb24gdGFiLCBzZW5kIGV2ZW50IHdpdGggaW1nIHNlbGVjdGVkXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNQaG90b3NUYWIgJiYgaW1nU2VsZWN0aW9uTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5zZW5kSW1nU2VsZWN0ZWRUb1BhZ2UoaW1nU2VsZWN0aW9uTGlzdFswXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGltZ1NlbGVjdGlvblN1Yik7XG4gIH1cblxuICB1cGRhdGVQcm9kdWN0SW1nU2VsZWN0aW9uKGlkc0ltZ0xpc3Q6IG51bWJlcltdKSB7XG4gICAgaWYgKCghdGhpcy5wcm9kdWN0SWQgfHwgdGhpcy5wcm9kdWN0SWQgPT09IFwiMFwiKSAmJiBXaXppLl9wcm9kdWl0Lmdsb2JhbC5QUk9EX0lEKSB7XG4gICAgICB0aGlzLnByb2R1Y3RJZCA9IFdpemkuX3Byb2R1aXQuZ2xvYmFsLlBST0RfSUQudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBXaXppLl9wcm9kdWl0Ll9kYXRhVG1wWydwaG90b3MnXS5pbmZvcyA9IHt9O1xuICAgIFdpemkuX3Byb2R1aXQuX2RhdGFUbXBbJ3Bob3RvcyddLmluZm9zLmZpbGVzID0gaWRzSW1nTGlzdDtcbiAgICB0aGlzLmVtaXRJbWdTZWxlY3Rpb25DaGFuZ2UoaWRzSW1nTGlzdCk7XG5cbiAgICBpZiAodGhpcy5wcm9kdWN0SWQgJiYgdGhpcy5wcm9kdWN0SWQgIT09IFwiMFwiKSB7XG4gICAgICBjb25zdCBzdWJtaXRQcm9kMSA9XG4gICAgICAgIHRoaXMuc3VibWl0UHJvZHVjdEltZyhpZHNJbWdMaXN0KS5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1Ym1pdFByb2QxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3JlYXRlUHJvZHVjdFN1YiA9XG4gICAgICB0aGlzLmNyZWF0ZVByb2R1Y3QoKS5zdWJzY3JpYmUoXG4gICAgICAgIChwcm9kdWN0SWQ6bnVtYmVyKSA9PiB7XG4gICAgICAgICAgaWYgKCFwcm9kdWN0SWQpIHtcbiAgICAgICAgICAgIHRocm93IFwiTm8gcHJvZHVjdCBpZCBjcmVhdGVkLiBDYW4gbm90IGxpbmsgaW1hZ2UocykgdG8gdGhlIG5ldyBwcm9kdWN0LlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBXaXppLl9wcm9kdWl0Lmdsb2JhbC5QUk9EX0lEID0gcHJvZHVjdElkO1xuXG4gICAgICAgICAgdGhpcy5wcm9kdWN0SWQgPSBwcm9kdWN0SWQudG9TdHJpbmcoKTtcbiAgICAgICAgICB0aGlzLnN1Ym1pdFByb2R1Y3RJbWcoaWRzSW1nTGlzdCkuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goY3JlYXRlUHJvZHVjdFN1Yik7XG5cbiAgfVxuXG4gIHN1Ym1pdFByb2R1Y3RJbWcoaWRzSW1nTGlzdDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgZmlsZXMgOiBpZHNJbWdMaXN0LFxuICAgICAgY291bHM6IFtdXG4gICAgfTtcblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdydWInLCBcInBob3Rvc1wiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2FjdGlvbicsIFwic2F2ZVwiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ25ld1Byb2QnLCB0aGlzLmlzUHJvZHVjdENyZWF0aW9uID8gXCIxXCIgOiBcIjBcIik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdwcm9kSWQnLCB0aGlzLnByb2R1Y3RJZCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdfdG9rZW4nLCB0aGlzLnNob3BUb2tlbik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdfc2hpZCcsIHRoaXMuc2hvcElkLnRvU3RyaW5nKCkpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZGF0YScsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlLCBmb3JtRGF0YSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcbiAgfVxuXG4gIGNyZWF0ZVByb2R1Y3QoKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3J1YicsIFwibWFpblwiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2FjdGlvbicsIFwiY3JlYXRlUHJvZFwiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ190b2tlbicsICcnKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ19zaGlkJywgdGhpcy5zaG9wSWQudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8bnVtYmVyPih0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlLCBmb3JtRGF0YSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcblxuICB9XG5cbiAgLyogVXNlIHRvIGtub3cgd2hlcmUgdGhlIGltZyBtYW5hZ2VyIGlzIGRpc3BsYXllZCwgYW5kIHRvIGNsb3NlIGl0IHdoZW4gc3dpdGNoaW5nIHRhYiAqL1xuICBzd2l0Y2hUYWJzKCkge1xuICAgIHJldHVybiBmcm9tRXZlbnQ8YW55Pihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1nTWFuYWdlck1vZHVsZScpIGFzIGFueSwgXCJzd2l0Y2hUYWJcIik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbWdTZWxlY3Rpb25DaGFuZ2UoaWRzSW1nTGlzdDogbnVtYmVyW10pIHtcbiAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBpZHNJbWdMaXN0XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdvbkltZ1NlbGVjdGlvbkNoYW5nZScsIHZhbHVlKTtcbiAgICBjb25zdCBpbWdNYW5hZ2VyTW9kdWxlPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1nTWFuYWdlck1vZHVsZScpO1xuICAgIGltZ01hbmFnZXJNb2R1bGU/LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQ3VycmVudEltZ1NlbGVjdGlvbihpbWdTZWxlY3Rpb24/OiBJbWdQaWN0dXJlRFRPW10pIHtcbiAgICB0aGlzLmN1cnJlbnRQcm9kdWN0SW1nU2VsZWN0aW9uID0gaW1nU2VsZWN0aW9uID8gaW1nU2VsZWN0aW9uIDogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmltZ1NlbGVjdGlvblNlcnZpY2UuZ2V0SW1nU2VsZWN0aW9uKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDdXJyZW50SW1nU2VsZWN0aW9uKCkge1xuICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5zZXRJbWdTZWxlY3Rpb24odGhpcy5jdXJyZW50UHJvZHVjdEltZ1NlbGVjdGlvbik7XG4gICAgLy8gSGlkZSB0aGUgbG9hZGVyIGluIGltZyBsaXN0IHNlbGVjdGlvblxuICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5lbWl0SW1nTGlzdExvYWRpbmcoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcHRpb25zSGVhZGVycygpIHtcbiAgICBjb25zdCBoZWFkZXIgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzonKidcbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcHRpb25zSGVhZGVyc1dpdGhCZWFyZXIoKSB7XG4gICAgY29uc3QgaGVhZGVyID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgQXV0aG9yaXphdGlvbjogJ0JlYXJlciAnICsgdGhpcy5zaG9wVG9rZW5cbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class StorageService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.subscriptions = new Map();
|
|
7
|
+
window.addEventListener('storage', e => {
|
|
8
|
+
if (this.subscriptions.has(e.key || '')) {
|
|
9
|
+
this.subscriptions.get(e.key || '')?.next(this.unserialize(e.newValue));
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
unserialize(data) {
|
|
14
|
+
let d = null;
|
|
15
|
+
if (data) {
|
|
16
|
+
try {
|
|
17
|
+
d = JSON.parse(data).data;
|
|
18
|
+
}
|
|
19
|
+
catch (e) { }
|
|
20
|
+
}
|
|
21
|
+
return d;
|
|
22
|
+
}
|
|
23
|
+
serialize(data) {
|
|
24
|
+
const d = {
|
|
25
|
+
data: data
|
|
26
|
+
};
|
|
27
|
+
return JSON.stringify(d);
|
|
28
|
+
}
|
|
29
|
+
subscribe(key) {
|
|
30
|
+
if (!this.subscriptions.has(key)) {
|
|
31
|
+
this.subscriptions.set(key, new Subject());
|
|
32
|
+
}
|
|
33
|
+
return this.subscriptions.get(key);
|
|
34
|
+
}
|
|
35
|
+
get(key) {
|
|
36
|
+
const d = localStorage.getItem(key);
|
|
37
|
+
return Promise.resolve(this.unserialize(d));
|
|
38
|
+
}
|
|
39
|
+
set(key, data) {
|
|
40
|
+
localStorage.setItem(key, this.serialize(data));
|
|
41
|
+
return Promise.resolve(true);
|
|
42
|
+
}
|
|
43
|
+
remove(key) {
|
|
44
|
+
localStorage.removeItem(key);
|
|
45
|
+
return Promise.resolve(true);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
StorageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: StorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
49
|
+
StorageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: StorageService });
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: StorageService, decorators: [{
|
|
51
|
+
type: Injectable
|
|
52
|
+
}], ctorParameters: function () { return []; } });
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW1nLW1hbmFnZXItd2ViLWVsZW1lbnQvc3JjL2xpYi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUcvQixNQUFNLE9BQU8sY0FBYztJQUd6QjtRQUZRLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFHdEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNyQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDekU7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBb0I7UUFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRWIsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJO2dCQUNGLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQzthQUMzQjtZQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7U0FDZjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFZO1FBQzVCLE1BQU0sQ0FBQyxHQUFHO1lBQ1IsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUksR0FBVztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksT0FBTyxFQUFLLENBQUMsQ0FBQztTQUMvQztRQUVELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELEdBQUcsQ0FBSSxHQUFXO1FBQ2hCLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFcEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVcsRUFBRSxJQUFTO1FBQ3hCLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVoRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7OzJHQXREVSxjQUFjOytHQUFkLGNBQWM7MkZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKSAvLyB0b2RvXG5leHBvcnQgY2xhc3MgU3RvcmFnZVNlcnZpY2Uge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDxhbnk+PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgZSA9PiB7XG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zLmhhcyhlLmtleSB8fCAnJykpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmdldChlLmtleSB8fCAnJyk/Lm5leHQodGhpcy51bnNlcmlhbGl6ZShlLm5ld1ZhbHVlKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVuc2VyaWFsaXplKGRhdGE/OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgbGV0IGQgPSBudWxsO1xuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGQgPSBKU09OLnBhcnNlKGRhdGEpLmRhdGE7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgICByZXR1cm4gZDtcbiAgfVxuXG4gIHByaXZhdGUgc2VyaWFsaXplKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IGQgPSB7XG4gICAgICBkYXRhOiBkYXRhXG4gICAgfTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkKTtcbiAgfVxuXG4gIHN1YnNjcmliZTxUPihrZXk6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KGtleSwgbmV3IFN1YmplY3Q8VD4oKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoa2V5KTtcbiAgfVxuXG4gIGdldDxUPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IGFueT4ge1xuICAgIGNvbnN0IGQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnVuc2VyaWFsaXplKGQpKTtcbiAgfVxuXG4gIHNldChrZXk6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB0aGlzLnNlcmlhbGl6ZShkYXRhKSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG5cbiAgcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of img-manager-web-element
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/img-manager-web-element.component';
|
|
5
|
+
export * from './lib/img-manager-web-element.module';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2ltZy1tYW5hZ2VyLXdlYi1lbGVtZW50L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBpbWctbWFuYWdlci13ZWItZWxlbWVudFxuICovXG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbWctbWFuYWdlci13ZWItZWxlbWVudC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW1nLW1hbmFnZXItd2ViLWVsZW1lbnQubW9kdWxlJztcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6aXNob3AtaW1nLW1hbmFnZXItd2ViZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2ltZy1tYW5hZ2VyLXdlYi1lbGVtZW50L3NyYy93aXppc2hvcC1pbWctbWFuYWdlci13ZWJlbGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
|