ng-easycommerce-v18 0.3.22-beta.2 → 0.3.22
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 +6 -2
- package/esm2022/lib/classes/filters/attributes-filter.mjs +74 -4
- package/esm2022/lib/classes/filters/category-filter.mjs +105 -26
- package/esm2022/lib/classes/filters/filter-factory.mjs +7 -3
- package/esm2022/lib/classes/filters/price_range-filter.mjs +3 -3
- package/esm2022/lib/constants/core.constants.service.mjs +12 -1
- package/esm2022/lib/ec-components/collection-ec/collection-ec.component.mjs +41 -17
- package/esm2022/lib/ec-components/filters-ec/filters-ec.component.mjs +42 -9
- package/esm2022/lib/ec-components/header-ec/header-ec.component.mjs +12 -6
- package/esm2022/lib/ec-components/price-range-filter/price-range-filter.component.mjs +13 -2
- package/esm2022/lib/ec-services/filters.service.mjs +124 -18
- package/esm2022/lib/ec-services/pagination.service.mjs +70 -22
- package/esm2022/lib/ec-services/products.service.mjs +5 -3
- package/fesm2022/ng-easycommerce-v18.mjs +490 -98
- package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
- package/lib/classes/filters/attributes-filter.d.ts +24 -0
- package/lib/classes/filters/category-filter.d.ts +30 -3
- package/lib/constants/core.constants.service.d.ts +7 -0
- package/lib/ec-components/collection-ec/collection-ec.component.d.ts +5 -4
- package/lib/ec-components/filters-ec/filters-ec.component.d.ts +13 -0
- package/lib/ec-components/price-range-filter/price-range-filter.component.d.ts +2 -0
- package/lib/ec-services/filters.service.d.ts +18 -1
- package/lib/ec-services/pagination.service.d.ts +21 -5
- package/lib/ec-services/products.service.d.ts +1 -1
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@ import { EnvironmentInjector, inject, Injectable, runInInjectionContext } from '
|
|
|
2
2
|
import { BehaviorSubject } from 'rxjs';
|
|
3
3
|
import { FilterFactory } from '../classes';
|
|
4
4
|
import { ApiConstantsService, CoreConstantsService } from '../constants';
|
|
5
|
+
import { PriceRangeFilter } from '../classes/filters/price_range-filter';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
export class FiltersService {
|
|
7
8
|
_apiConsts = inject(ApiConstantsService);
|
|
@@ -21,6 +22,7 @@ export class FiltersService {
|
|
|
21
22
|
limit: 0
|
|
22
23
|
};
|
|
23
24
|
_filtersInitialized = false;
|
|
25
|
+
_lastRouteQuery = null;
|
|
24
26
|
constructor() {
|
|
25
27
|
//this._defaultFilters = this._consts.getDefaultFilters()
|
|
26
28
|
}
|
|
@@ -41,10 +43,20 @@ export class FiltersService {
|
|
|
41
43
|
let extra_params = '';
|
|
42
44
|
this._filtersSubject.value.forEach(filter => {
|
|
43
45
|
const extra = filter.toUrlParams();
|
|
44
|
-
extra.split('=')[1]
|
|
46
|
+
if (extra && extra.split('=')[1] !== '') {
|
|
47
|
+
extra_params += extra;
|
|
48
|
+
}
|
|
45
49
|
});
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
// Si en la URL ya venía `attributeCodes` pero aún ningún filtro lo agregó,
|
|
51
|
+
// lo volvemos a sumar a mano. Esto evita que al refrescar (SSR) se pierda el filtro
|
|
52
|
+
// aunque el AttributesFilter todavía no haya terminado de hidratarse.
|
|
53
|
+
const attributeCodesFromRoute = this._lastRouteQuery?.['attributeCodes'];
|
|
54
|
+
if (attributeCodesFromRoute && !extra_params.includes('attributeCodes=')) {
|
|
55
|
+
extra_params += `&attributeCodes=${attributeCodesFromRoute}`;
|
|
56
|
+
}
|
|
57
|
+
if (search_value) {
|
|
58
|
+
extra_params += '&criteria[search][type]=contains&criteria[search][value]=' + search_value;
|
|
59
|
+
}
|
|
48
60
|
return this.productsFilterApi(extra_params);
|
|
49
61
|
}
|
|
50
62
|
isUpdated(paginationSettings) {
|
|
@@ -60,7 +72,7 @@ export class FiltersService {
|
|
|
60
72
|
this._paginationSettings = paginationSettings;
|
|
61
73
|
return change;
|
|
62
74
|
}
|
|
63
|
-
setFilters(paginationSettings, search_value) {
|
|
75
|
+
setFilters(paginationSettings, search_value, routeQueryParams) {
|
|
64
76
|
this._paginationSettings = paginationSettings;
|
|
65
77
|
let final_filters = [];
|
|
66
78
|
let filtersToProcess = this._optionsFilters?.includes('all')
|
|
@@ -73,15 +85,30 @@ export class FiltersService {
|
|
|
73
85
|
if (filter) {
|
|
74
86
|
final_filters.push(filter);
|
|
75
87
|
}
|
|
76
|
-
else {
|
|
77
|
-
// console.warn(`❌ Failed to create filter for type: ${filterType}`);
|
|
78
|
-
}
|
|
79
88
|
});
|
|
80
89
|
});
|
|
81
90
|
this._defaultFilters?.forEach(filterDefault => {
|
|
82
91
|
let filter = final_filters.find(filter => filter.type() == filterDefault.filter_type);
|
|
83
92
|
filter && filterDefault.codes.forEach(value => filter.setSelected(value));
|
|
84
93
|
});
|
|
94
|
+
// hidratar price_range desde la URL
|
|
95
|
+
if (routeQueryParams) {
|
|
96
|
+
const pr = final_filters.find(f => f.type() === 'price_range');
|
|
97
|
+
if (pr) {
|
|
98
|
+
const rawMin = routeQueryParams['price_min'];
|
|
99
|
+
const rawMax = routeQueryParams['price_max'];
|
|
100
|
+
const min = rawMin != null ? Number(rawMin) : null;
|
|
101
|
+
const max = rawMax != null ? Number(rawMax) : null;
|
|
102
|
+
if ((min != null && !Number.isNaN(min)) || (max != null && !Number.isNaN(max))) {
|
|
103
|
+
if (min != null && !Number.isNaN(min)) {
|
|
104
|
+
pr.currentMinPrice = min;
|
|
105
|
+
}
|
|
106
|
+
if (max != null && !Number.isNaN(max)) {
|
|
107
|
+
pr.currentMaxPrice = max;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
85
112
|
this._filtersSubject.next(final_filters);
|
|
86
113
|
}
|
|
87
114
|
getFilters(paginationSettings) {
|
|
@@ -96,9 +123,7 @@ export class FiltersService {
|
|
|
96
123
|
runInInjectionContext(this.environmentInjector, () => {
|
|
97
124
|
const filterFactory = new FilterFactory();
|
|
98
125
|
filtersToProcess?.forEach(filterType => {
|
|
99
|
-
// console.log('Creating filter for type:', filterType);
|
|
100
126
|
const filter = filterFactory.create(filterType, settings);
|
|
101
|
-
// console.log('Created filter:', filter);
|
|
102
127
|
if (filter) {
|
|
103
128
|
final_filters.push(filter);
|
|
104
129
|
}
|
|
@@ -123,7 +148,6 @@ export class FiltersService {
|
|
|
123
148
|
if (filterObj.type() !== 'price_range') {
|
|
124
149
|
let index = final_filters.findIndex(filter => filter.type() == filterObj.type());
|
|
125
150
|
final_filters[index].setSelected(filterElem, filterElem.value || filterElem.code);
|
|
126
|
-
console.log(index, final_filters);
|
|
127
151
|
}
|
|
128
152
|
this._filtersSubject.next(final_filters);
|
|
129
153
|
// }
|
|
@@ -133,13 +157,6 @@ export class FiltersService {
|
|
|
133
157
|
runInInjectionContext(this.environmentInjector, () => {
|
|
134
158
|
const filterFactory = new FilterFactory();
|
|
135
159
|
const filter = [];
|
|
136
|
-
/* claves.forEach((key:any) => {
|
|
137
|
-
filter.push(filterFactory.create(key))
|
|
138
|
-
paginationFilters[key].forEach((value:any) => {
|
|
139
|
-
console.log(filter[0].createElement(value,paginationFilters[key]));
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
}) */
|
|
143
160
|
this._filtersSubject.value.forEach((value) => {
|
|
144
161
|
if (value.type() == "attributes") {
|
|
145
162
|
//value.data = [];
|
|
@@ -159,6 +176,95 @@ export class FiltersService {
|
|
|
159
176
|
pr.setSelected(min, max);
|
|
160
177
|
this._filtersSubject.next([...filters]);
|
|
161
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* Fuerza a emitir de nuevo los filtros actuales.
|
|
181
|
+
* Útil cuando un filtro async (categorías, atributos) termina de cargarse
|
|
182
|
+
* y necesitamos que PaginationService vuelva a armar la URL.
|
|
183
|
+
*/
|
|
184
|
+
refreshFilters() {
|
|
185
|
+
const current = this._filtersSubject.value;
|
|
186
|
+
// Emitimos una copia para que los subscribers detecten el cambio
|
|
187
|
+
this._filtersSubject.next([...current]);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Punto central donde se hidratan los filtros a partir de la URL:
|
|
191
|
+
* - Lee type/value de la ruta (ej. /collection/categories/:value).
|
|
192
|
+
* - Lee query params (category, price_min, price_max, attributeCodes, search, etc.).
|
|
193
|
+
* - Crea instancias de filtros y les delega la hidratación específica.
|
|
194
|
+
*
|
|
195
|
+
* Este método se llama tanto en SSR como en navegador.
|
|
196
|
+
*/
|
|
197
|
+
hydrateFromRoute(paginationSettings, routeParams, routeQuery) {
|
|
198
|
+
// hidratar search desde la URL ===
|
|
199
|
+
const searchFromUrl = routeQuery?.['search'];
|
|
200
|
+
if (typeof searchFromUrl === 'string' && searchFromUrl.trim() !== '') {
|
|
201
|
+
// Guardamos el valor para que otros componentes (Header, Collection) lo reutilicen
|
|
202
|
+
this._consts.searchValue = searchFromUrl.trim();
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// Si no viene `search` en la URL, limpiamos el estado global para no arrastrar búsquedas viejas
|
|
206
|
+
this._consts.searchValue = '';
|
|
207
|
+
}
|
|
208
|
+
// Guardamos la última query completa para usarla en generateFinalApi (parche attributeCodes)
|
|
209
|
+
this._lastRouteQuery = routeQuery;
|
|
210
|
+
// Guardamos las settings actuales (type, value, limit, etc.)
|
|
211
|
+
this._paginationSettings = paginationSettings;
|
|
212
|
+
// Creamos los filtros base (attributes, categories, dynamics, sort, price_range, etc.)
|
|
213
|
+
let final_filters = [];
|
|
214
|
+
let filtersToProcess = this._optionsFilters?.includes('all')
|
|
215
|
+
? ['attributes', 'categories', 'dynamics', 'sort', 'price_range']
|
|
216
|
+
: this._optionsFilters;
|
|
217
|
+
runInInjectionContext(this.environmentInjector, () => {
|
|
218
|
+
const filterFactory = new FilterFactory();
|
|
219
|
+
filtersToProcess?.forEach(filterType => {
|
|
220
|
+
const filter = filterFactory.create(filterType, paginationSettings);
|
|
221
|
+
if (filter) {
|
|
222
|
+
final_filters.push(filter);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
// Aplicamos defaultFilters si corresponde
|
|
227
|
+
this._defaultFilters?.forEach(filterDefault => {
|
|
228
|
+
const filter = final_filters.find(f => f.type() === filterDefault.filter_type);
|
|
229
|
+
filter && filterDefault.codes.forEach(value => filter.setSelected(value));
|
|
230
|
+
});
|
|
231
|
+
// Hidratar filtros con slug y query params genéricos
|
|
232
|
+
final_filters.forEach(f => {
|
|
233
|
+
const anyFilter = f;
|
|
234
|
+
// type/value en la URL: /collection/categories/:value
|
|
235
|
+
const urlType = routeParams['type'];
|
|
236
|
+
const urlValue = routeParams['value'];
|
|
237
|
+
// Por ejemplo, el CategoryFilter implementa setFromSlug para marcar la categoría correcta
|
|
238
|
+
if (urlType === 'categories' && urlValue && typeof anyFilter.setFromSlug === 'function') {
|
|
239
|
+
anyFilter.setFromSlug(urlValue);
|
|
240
|
+
}
|
|
241
|
+
// query params genéricos: ?category=0101&price_min=...&price_max=...&attributeCodes=...
|
|
242
|
+
// Cada filtro que lo soporte implementa hydrateFromQuery y decide qué leer.
|
|
243
|
+
if (typeof anyFilter.hydrateFromQuery === 'function') {
|
|
244
|
+
anyFilter.hydrateFromQuery(routeQuery);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
// Hidratar específicamente el PriceRangeFilter desde la URL
|
|
248
|
+
const priceFilter = final_filters.find((f) => f instanceof PriceRangeFilter);
|
|
249
|
+
if (priceFilter && routeQuery) {
|
|
250
|
+
const minFromUrl = routeQuery['price_min'];
|
|
251
|
+
const maxFromUrl = routeQuery['price_max'];
|
|
252
|
+
if (minFromUrl != null || maxFromUrl != null) {
|
|
253
|
+
const min = minFromUrl != null ? Number(minFromUrl) : priceFilter.minPrice;
|
|
254
|
+
const max = maxFromUrl != null ? Number(maxFromUrl) : priceFilter.maxPrice;
|
|
255
|
+
// usamos la API del filtro para setear el rango
|
|
256
|
+
priceFilter.setSelected(min, max);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
// si no hay nada en la URL, lo reseteamos
|
|
260
|
+
priceFilter.reset();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Emitimos filtros ya hidratados para que PaginationService y Collection reaccionen
|
|
264
|
+
this._filtersSubject.next(final_filters);
|
|
265
|
+
// Marcamos que el sistema de filtros está listo (útil para mostrar spinners, etc.)
|
|
266
|
+
this._readySubject.next(true);
|
|
267
|
+
}
|
|
162
268
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FiltersService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
163
269
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FiltersService, providedIn: 'root' });
|
|
164
270
|
}
|
|
@@ -168,4 +274,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
168
274
|
providedIn: 'root'
|
|
169
275
|
}]
|
|
170
276
|
}], ctorParameters: () => [] });
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLXNlcnZpY2VzL2ZpbHRlcnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBVSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDOztBQU16RSxNQUFNLE9BQU8sY0FBYztJQUNmLFVBQVUsR0FBd0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDOUQsT0FBTyxHQUF5QixNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM3RCxlQUFlLEdBQThCLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLFFBQVEsR0FBeUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVwRSxjQUFjLEdBQTRCLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sR0FBdUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVoRSxhQUFhLEdBQTZCLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQy9FLE1BQU0sR0FBd0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUvRCxtQkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtJQUVqRCxlQUFlLEdBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsZUFBZSxHQUFvQixFQUFFLENB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QUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLGFBQWEsQ0FBaUMsQ0FBQztRQUN6RixJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU87UUFDaEIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQzt3R0F2S1EsY0FBYzs0R0FBZCxjQUFjLGNBRlgsTUFBTTs7NEZBRVQsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudEluamVjdG9yLCBpbmplY3QsIEluamVjdGFibGUsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlckZhY3RvcnkgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IERlZmF1bHRGaWx0ZXIsIEZpbHRlckVsZW1lbnQsIFBhZ2luYXRpb25TZXR0aW5ncywgRmlsdGVyVHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQXBpQ29uc3RhbnRzU2VydmljZSwgQ29yZUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUHJpY2VSYW5nZUZpbHRlciB9IGZyb20gJy4uL2NsYXNzZXMvZmlsdGVycy9wcmljZV9yYW5nZS1maWx0ZXInO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEZpbHRlcnNTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9hcGlDb25zdHM6IEFwaUNvbnN0YW50c1NlcnZpY2UgPSBpbmplY3QoQXBpQ29uc3RhbnRzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfY29uc3RzOiBDb3JlQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChDb3JlQ29uc3RhbnRzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfZmlsdGVyc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlcltdPihbXSk7XG4gICAgcHVibGljIGZpbHRlcnMkOiBPYnNlcnZhYmxlPEZpbHRlcltdPiA9IHRoaXMuX2ZpbHRlcnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBfYXBpVXJsU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICAgIHB1YmxpYyBhcGlVcmwkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLl9hcGlVcmxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBfcmVhZHlTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwdWJsaWMgcmVhZHkkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5fcmVhZHlTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBlbnZpcm9ubWVudEluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpXG5cbiAgICBwcml2YXRlIF9vcHRpb25zRmlsdGVyczogKEZpbHRlclR5cGUgfCAnYWxsJylbXSA9IFsnYWxsJ107XG4gICAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlcnM6IERlZmF1bHRGaWx0ZXJbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBfcGFnaW5hdGlvblNldHRpbmdzOiBQYWdpbmF0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgdHlwZTogJycsXG4gICAgICAgIGxpbWl0OiAwXG4gICAgfTtcblxuICAgIHByaXZhdGUgX2ZpbHRlcnNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vdGhpcy5fZGVmYXVsdEZpbHRlcnMgPSB0aGlzLl9jb25zdHMuZ2V0RGVmYXVsdEZpbHRlcnMoKVxuICAgIH1cblxuICAgIC8vQVBJIFVSTFxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbGEgdXJsIHBhcmEgZWwgZmlsdHJhZG9cbiAgICAgKiBAcGFyYW0gZmlsdGVycyBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwcm9kdWN0c0ZpbHRlckFwaShmaWx0ZXJzID0gJycpIHsgcmV0dXJuICdzaG9wLWFwaS8nICsgdGhpcy5fYXBpQ29uc3RzLkNIQU5ORUwgKyAnL3Byb2R1Y3Qtc2VhcmNoLycgKyAnP2xvY2FsZT0nICsgdGhpcy5fYXBpQ29uc3RzLkxPQ0FMRSArIGZpbHRlcnMgfTtcbiAgICAvKipcbiAgICAgKiBBcm1hIGxvcyBmaWx0cm9zIHkgcmV0b3JuYSBsYSB1cmwgY29tcGxldGEgY29uIGxvcyBmaWx0cm9zIGFwbGljYWRvcy5cbiAgICAgKiBAcGFyYW0gc2VhcmNoX3ZhbHVlIHZhbG9yIGEgYnVzY2FyXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2VuZXJhdGVGaW5hbEFwaShzZWFyY2hfdmFsdWU/OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGV4dHJhX3BhcmFtcyA9ICcnO1xuICAgICAgICB0aGlzLl9maWx0ZXJzU3ViamVjdC52YWx1ZS5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICAgICAgICBjb25zdCBleHRyYSA9IGZpbHRlci50b1VybFBhcmFtcygpO1xuICAgICAgICAgICAgZXh0cmEuc3BsaXQoJz0nKVsxXSAhPSAnJyA/IGV4dHJhX3BhcmFtcyArPSBleHRyYSA6IG51bGw7XG4gICAgICAgIH0pXG4gICAgICAgIGlmIChzZWFyY2hfdmFsdWUpIGV4dHJhX3BhcmFtcyArPSAoJyZjcml0ZXJpYVtzZWFyY2hdW3R5cGVdPWNvbnRhaW5zJmNyaXRlcmlhW3NlYXJjaF1bdmFsdWVdPScgKyBzZWFyY2hfdmFsdWUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnByb2R1Y3RzRmlsdGVyQXBpKGV4dHJhX3BhcmFtcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1VwZGF0ZWQocGFnaW5hdGlvblNldHRpbmdzOiBQYWdpbmF0aW9uU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhwYWdpbmF0aW9uU2V0dGluZ3MpO1xuICAgICAgICBsZXQgY2hhbmdlOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIGtleXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKHBhZ2luYXRpb25TZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUyID0gKHRoaXMuX3BhZ2luYXRpb25TZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IHZhbHVlMikgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGNoYW5nZSkgdGhpcy5fcGFnaW5hdGlvblNldHRpbmdzID0gcGFnaW5hdGlvblNldHRpbmdzO1xuICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cblxuICAgIHNldEZpbHRlcnMocGFnaW5hdGlvblNldHRpbmdzOiBQYWdpbmF0aW9uU2V0dGluZ3MsIHNlYXJjaF92YWx1ZT86IHN0cmluZykge1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uU2V0dGluZ3MgPSBwYWdpbmF0aW9uU2V0dGluZ3M7XG4gICAgICAgIGxldCBmaW5hbF9maWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuICAgICAgICBsZXQgZmlsdGVyc1RvUHJvY2VzcyA9IHRoaXMuX29wdGlvbnNGaWx0ZXJzPy5pbmNsdWRlcygnYWxsJylcbiAgICAgICAgICAgID8gKFsnYXR0cmlidXRlcycsICdjYXRlZ29yaWVzJywgJ2R5bmFtaWNzJywgJ3NvcnQnLCAncHJpY2VfcmFuZ2UnXSBhcyBGaWx0ZXJUeXBlW10pXG4gICAgICAgICAgICA6IHRoaXMuX29wdGlvbnNGaWx0ZXJzO1xuXG4gICAgICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmVudmlyb25tZW50SW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckZhY3RvcnkgPSBuZXcgRmlsdGVyRmFjdG9yeSgpO1xuICAgICAgICAgICAgZmlsdGVyc1RvUHJvY2Vzcz8uZm9yRWFjaChmaWx0ZXJUeXBlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJGYWN0b3J5LmNyZWF0ZShmaWx0ZXJUeXBlLCBwYWdpbmF0aW9uU2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxfZmlsdGVycy5wdXNoKGZpbHRlcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGDinYwgRmFpbGVkIHRvIGNyZWF0ZSBmaWx0ZXIgZm9yIHR5cGU6ICR7ZmlsdGVyVHlwZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLl9kZWZhdWx0RmlsdGVycz8uZm9yRWFjaChmaWx0ZXJEZWZhdWx0ID0+IHtcbiAgICAgICAgICAgIGxldCBmaWx0ZXIgPSBmaW5hbF9maWx0ZXJzLmZpbmQoZmlsdGVyID0+IGZpbHRlci50eXBlKCkgPT0gZmlsdGVyRGVmYXVsdC5maWx0ZXJfdHlwZSk7XG4gICAgICAgICAgICBmaWx0ZXIgJiYgZmlsdGVyRGVmYXVsdC5jb2Rlcy5mb3JFYWNoKHZhbHVlID0+IGZpbHRlci5zZXRTZWxlY3RlZCh2YWx1ZSkpO1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLl9maWx0ZXJzU3ViamVjdC5uZXh0KGZpbmFsX2ZpbHRlcnMpO1xuICAgIH1cblxuICAgIGdldEZpbHRlcnMocGFnaW5hdGlvblNldHRpbmdzPzogUGFnaW5hdGlvblNldHRpbmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9maWx0ZXJzSW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZmlsdGVyc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBwYWdpbmF0aW9uU2V0dGluZ3MgfHwgdGhpcy5fcGFnaW5hdGlvblNldHRpbmdzO1xuICAgICAgICBsZXQgZmluYWxfZmlsdGVyczogRmlsdGVyW10gPSBbXTtcbiAgICAgICAgbGV0IGZpbHRlcnNUb1Byb2Nlc3MgPSB0aGlzLl9vcHRpb25zRmlsdGVycz8uaW5jbHVkZXMoJ2FsbCcpXG4gICAgICAgICAgICA/IChbJ2F0dHJpYnV0ZXMnLCAnY2F0ZWdvcmllcycsICdkeW5hbWljcycsICdzb3J0JywgJ3ByaWNlX3JhbmdlJ10gYXMgRmlsdGVyVHlwZVtdKVxuICAgICAgICAgICAgOiB0aGlzLl9vcHRpb25zRmlsdGVycztcblxuICAgICAgICBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5lbnZpcm9ubWVudEluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJGYWN0b3J5ID0gbmV3IEZpbHRlckZhY3RvcnkoKTtcbiAgICAgICAgICAgIGZpbHRlcnNUb1Byb2Nlc3M/LmZvckVhY2goZmlsdGVyVHlwZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0NyZWF0aW5nIGZpbHRlciBmb3IgdHlwZTonLCBmaWx0ZXJUeXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJGYWN0b3J5LmNyZWF0ZShmaWx0ZXJUeXBlLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0NyZWF0ZWQgZmlsdGVyOicsIGZpbHRlcik7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbF9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBjcmVhdGUgZmlsdGVyIGZvciB0eXBlOiAke2ZpbHRlclR5cGV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2RlZmF1bHRGaWx0ZXJzPy5mb3JFYWNoKGZpbHRlckRlZmF1bHQgPT4ge1xuICAgICAgICAgICAgbGV0IGZpbHRlciA9IGZpbmFsX2ZpbHRlcnMuZmluZChmaWx0ZXIgPT4gZmlsdGVyLnR5cGUoKSA9PSBmaWx0ZXJEZWZhdWx0LmZpbHRlcl90eXBlKTtcbiAgICAgICAgICAgIGZpbHRlciAmJiBmaWx0ZXJEZWZhdWx0LmNvZGVzLmZvckVhY2godmFsdWUgPT4gZmlsdGVyLnNldFNlbGVjdGVkKHZhbHVlKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9maWx0ZXJzU3ViamVjdC5uZXh0KGZpbmFsX2ZpbHRlcnMpO1xuICAgICAgICByZXR1cm4gZmluYWxfZmlsdGVycztcbiAgICB9XG5cbiAgICBnZXRTcGVjaWZpY0ZpbHRlcnModHlwZXM6IEZpbHRlclR5cGVbXSk6IEZpbHRlcltdIHtcbiAgICAgICAgY29uc3QgZmlsdGVyczogRmlsdGVyW10gPSB0aGlzLl9maWx0ZXJzU3ViamVjdC52YWx1ZS5maWx0ZXIoZmlsdGVyID0+IHR5cGVzLmluY2x1ZGVzKGZpbHRlci50eXBlKCkpKVxuICAgICAgICByZXR1cm4gZmlsdGVycztcbiAgICB9XG5cbiAgICBzZXRGaWx0ZXJTZWxlY3RlZChmaWx0ZXJPYmo6IEZpbHRlciwgZmlsdGVyRWxlbTogRmlsdGVyRWxlbWVudCkge1xuICAgICAgICBsZXQgZmluYWxfZmlsdGVyczogRmlsdGVyW10gPSB0aGlzLl9maWx0ZXJzU3ViamVjdC52YWx1ZTtcbiAgICAgICAgaWYgKGZpbHRlck9iai50eXBlKCkgIT09ICdwcmljZV9yYW5nZScpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGZpbmFsX2ZpbHRlcnMuZmluZEluZGV4KGZpbHRlciA9PiBmaWx0ZXIudHlwZSgpID09IGZpbHRlck9iai50eXBlKCkpO1xuICAgICAgICAgICAgZmluYWxfZmlsdGVyc1tpbmRleF0uc2V0U2VsZWN0ZWQoZmlsdGVyRWxlbSwgZmlsdGVyRWxlbS52YWx1ZSB8fCBmaWx0ZXJFbGVtLmNvZGUpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coaW5kZXgsIGZpbmFsX2ZpbHRlcnMpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmlsdGVyc1N1YmplY3QubmV4dChmaW5hbF9maWx0ZXJzKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHVwZGF0ZUZpbHRlcnMocGFnaW5hdGlvbkZpbHRlcnM6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGF2ZXMgPSBPYmplY3Qua2V5cyhwYWdpbmF0aW9uRmlsdGVycylcbiAgICAgICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRmFjdG9yeSA9IG5ldyBGaWx0ZXJGYWN0b3J5KCk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXI6IEZpbHRlcltdID0gW11cbiAgICAgICAgICAgIC8qIGNsYXZlcy5mb3JFYWNoKChrZXk6YW55KSA9PiB7XG4gICAgICAgICAgICAgICAgZmlsdGVyLnB1c2goZmlsdGVyRmFjdG9yeS5jcmVhdGUoa2V5KSlcbiAgICAgICAgICAgICAgICBwYWdpbmF0aW9uRmlsdGVyc1trZXldLmZvckVhY2goKHZhbHVlOmFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZmlsdGVyWzBdLmNyZWF0ZUVsZW1lbnQodmFsdWUscGFnaW5hdGlvbkZpbHRlcnNba2V5XSkpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0pICovXG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJzU3ViamVjdC52YWx1ZS5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGUoKSA9PSBcImF0dHJpYnV0ZXNcIikge1xuICAgICAgICAgICAgICAgICAgICAvL3ZhbHVlLmRhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKiBcbiAgICAgKiBBY3R1YWxpemEgaW50ZXJuYW1lbnRlIGVsIHJhbmdvIGRlIHByZWNpbyB5IHJlLWVtaXRlIFxuICAgICAqIGVsIGFycmF5IGRlIGZpbHRyb3MgcGFyYSBxdWUgUGFnaW5hdGlvblNlcnZpY2UgdnVlbHZhIGEgbGxhbWFyIFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVQcmljZVJhbmdlRmlsdGVyKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyc1N1YmplY3QudmFsdWU7XG4gICAgICAgIGNvbnN0IHByID0gZmlsdGVycy5maW5kKGYgPT4gZi50eXBlKCkgPT09ICdwcmljZV9yYW5nZScpIGFzIFByaWNlUmFuZ2VGaWx0ZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghcHIpIHJldHVybjtcbiAgICAgICAgcHIuc2V0U2VsZWN0ZWQobWluLCBtYXgpO1xuICAgICAgICB0aGlzLl9maWx0ZXJzU3ViamVjdC5uZXh0KFsuLi5maWx0ZXJzXSk7XG4gICAgfVxufVxuXG4vLyBleHBvcnQgdHlwZSBGaWx0ZXJUeXBlID0gJ2F0dHJpYnV0ZXMnIHwgJ2NhdGVnb3JpZXMnIHwgJ2R5bmFtaWNzJyB8ICdzb3J0JyB8ICdwcmljZV9yYW5nZSc7IC8vIFVzZSBpbXBvcnRlZCBGaWx0ZXJUeXBlIGluc3RlYWRcbiJdfQ==
|
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLXNlcnZpY2VzL2ZpbHRlcnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBVSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOztBQU16RSxNQUFNLE9BQU8sY0FBYztJQUNmLFVBQVUsR0FBd0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDOUQsT0FBTyxHQUF5QixNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM3RCxlQUFlLEdBQThCLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLFFBQVEsR0FBeUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVwRSxjQUFjLEdBQTRCLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sR0FBdUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVoRSxhQUFhLEdBQTZCLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQy9FLE1BQU0sR0FBd0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUvRCxtQkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtJQUVqRCxlQUFlLEdBQTJC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LElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO2dCQUMzRSxNQUFNLEdBQUcsR0FBRyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7Z0JBRTNFLGdEQUFnRDtnQkFDaEQsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLDBDQUEwQztnQkFDMUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hCLENBQUM7UUFDTCxDQUFDO1FBRUQsb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXpDLG1GQUFtRjtRQUNuRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO3dHQWxUUSxjQUFjOzRHQUFkLGNBQWMsY0FGWCxNQUFNOzs0RkFFVCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudmlyb25tZW50SW5qZWN0b3IsIGluamVjdCwgSW5qZWN0YWJsZSwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZpbHRlciwgRmlsdGVyRmFjdG9yeSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRGVmYXVsdEZpbHRlciwgRmlsdGVyRWxlbWVudCwgUGFnaW5hdGlvblNldHRpbmdzLCBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBcGlDb25zdGFudHNTZXJ2aWNlLCBDb3JlQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBQcmljZVJhbmdlRmlsdGVyIH0gZnJvbSAnLi4vY2xhc3Nlcy9maWx0ZXJzL3ByaWNlX3JhbmdlLWZpbHRlcic7XG5pbXBvcnQgeyBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEZpbHRlcnNTZXJ2aWNlIHtcbiAgICBwcml2YXRlIF9hcGlDb25zdHM6IEFwaUNvbnN0YW50c1NlcnZpY2UgPSBpbmplY3QoQXBpQ29uc3RhbnRzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfY29uc3RzOiBDb3JlQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChDb3JlQ29uc3RhbnRzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfZmlsdGVyc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlcltdPihbXSk7XG4gICAgcHVibGljIGZpbHRlcnMkOiBPYnNlcnZhYmxlPEZpbHRlcltdPiA9IHRoaXMuX2ZpbHRlcnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBfYXBpVXJsU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICAgIHB1YmxpYyBhcGlVcmwkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLl9hcGlVcmxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBfcmVhZHlTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwdWJsaWMgcmVhZHkkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5fcmVhZHlTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBlbnZpcm9ubWVudEluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpXG5cbiAgICBwcml2YXRlIF9vcHRpb25zRmlsdGVyczogKEZpbHRlclR5cGUgfCAnYWxsJylbXSA9IFsnYWxsJ107XG4gICAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlcnM6IERlZmF1bHRGaWx0ZXJbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBfcGFnaW5hdGlvblNldHRpbmdzOiBQYWdpbmF0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgdHlwZTogJycsXG4gICAgICAgIGxpbWl0OiAwXG4gICAgfTtcblxuICAgIHByaXZhdGUgX2ZpbHRlcnNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xhc3RSb3V0ZVF1ZXJ5OiBQYXJhbXMgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL3RoaXMuX2RlZmF1bHRGaWx0ZXJzID0gdGhpcy5fY29uc3RzLmdldERlZmF1bHRGaWx0ZXJzKClcbiAgICB9XG5cbiAgICAvL0FQSSBVUkxcbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIGxhIHVybCBwYXJhIGVsIGZpbHRyYWRvXG4gICAgICogQHBhcmFtIGZpbHRlcnMgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHJvZHVjdHNGaWx0ZXJBcGkoZmlsdGVycyA9ICcnKSB7IHJldHVybiAnc2hvcC1hcGkvJyArIHRoaXMuX2FwaUNvbnN0cy5DSEFOTkVMICsgJy9wcm9kdWN0LXNlYXJjaC8nICsgJz9sb2NhbGU9JyArIHRoaXMuX2FwaUNvbnN0cy5MT0NBTEUgKyBmaWx0ZXJzIH07XG4gICAgLyoqXG4gICAgICogQXJtYSBsb3MgZmlsdHJvcyB5IHJldG9ybmEgbGEgdXJsIGNvbXBsZXRhIGNvbiBsb3MgZmlsdHJvcyBhcGxpY2Fkb3MuXG4gICAgICogQHBhcmFtIHNlYXJjaF92YWx1ZSB2YWxvciBhIGJ1c2NhclxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdlbmVyYXRlRmluYWxBcGkoc2VhcmNoX3ZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGV4dHJhX3BhcmFtcyA9ICcnO1xuXG4gICAgICAgIHRoaXMuX2ZpbHRlcnNTdWJqZWN0LnZhbHVlLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4dHJhID0gZmlsdGVyLnRvVXJsUGFyYW1zKCk7XG4gICAgICAgICAgICBpZiAoZXh0cmEgJiYgZXh0cmEuc3BsaXQoJz0nKVsxXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBleHRyYV9wYXJhbXMgKz0gZXh0cmE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNpIGVuIGxhIFVSTCB5YSB2ZW7DrWEgYGF0dHJpYnV0ZUNvZGVzYCBwZXJvIGHDum4gbmluZ8O6biBmaWx0cm8gbG8gYWdyZWfDsyxcbiAgICAgICAgLy8gbG8gdm9sdmVtb3MgYSBzdW1hciBhIG1hbm8uIEVzdG8gZXZpdGEgcXVlIGFsIHJlZnJlc2NhciAoU1NSKSBzZSBwaWVyZGEgZWwgZmlsdHJvXG4gICAgICAgIC8vIGF1bnF1ZSBlbCBBdHRyaWJ1dGVzRmlsdGVyIHRvZGF2w61hIG5vIGhheWEgdGVybWluYWRvIGRlIGhpZHJhdGFyc2UuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZUNvZGVzRnJvbVJvdXRlID0gdGhpcy5fbGFzdFJvdXRlUXVlcnk/LlsnYXR0cmlidXRlQ29kZXMnXTtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZUNvZGVzRnJvbVJvdXRlICYmICFleHRyYV9wYXJhbXMuaW5jbHVkZXMoJ2F0dHJpYnV0ZUNvZGVzPScpKSB7XG4gICAgICAgICAgICBleHRyYV9wYXJhbXMgKz0gYCZhdHRyaWJ1dGVDb2Rlcz0ke2F0dHJpYnV0ZUNvZGVzRnJvbVJvdXRlfWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VhcmNoX3ZhbHVlKSB7XG4gICAgICAgICAgICBleHRyYV9wYXJhbXMgKz0gJyZjcml0ZXJpYVtzZWFyY2hdW3R5cGVdPWNvbnRhaW5zJmNyaXRlcmlhW3NlYXJjaF1bdmFsdWVdPScgKyBzZWFyY2hfdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0c0ZpbHRlckFwaShleHRyYV9wYXJhbXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNVcGRhdGVkKHBhZ2luYXRpb25TZXR0aW5nczogUGFnaW5hdGlvblNldHRpbmdzKSB7XG4gICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocGFnaW5hdGlvblNldHRpbmdzKTtcbiAgICAgICAgbGV0IGNoYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBrZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IChwYWdpbmF0aW9uU2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlMiA9ICh0aGlzLl9wYWdpbmF0aW9uU2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZTIpIGNoYW5nZSA9IHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgIGlmIChjaGFuZ2UpIHRoaXMuX3BhZ2luYXRpb25TZXR0aW5ncyA9IHBhZ2luYXRpb25TZXR0aW5ncztcbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG5cbiAgICBzZXRGaWx0ZXJzKFxuICAgICAgICBwYWdpbmF0aW9uU2V0dGluZ3M6IFBhZ2luYXRpb25TZXR0aW5ncyxcbiAgICAgICAgc2VhcmNoX3ZhbHVlPzogc3RyaW5nLFxuICAgICAgICByb3V0ZVF1ZXJ5UGFyYW1zPzogYW55XG4gICAgKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25TZXR0aW5ncyA9IHBhZ2luYXRpb25TZXR0aW5ncztcbiAgICAgICAgbGV0IGZpbmFsX2ZpbHRlcnM6IEZpbHRlcltdID0gW107XG4gICAgICAgIGxldCBmaWx0ZXJzVG9Qcm9jZXNzID0gdGhpcy5fb3B0aW9uc0ZpbHRlcnM/LmluY2x1ZGVzKCdhbGwnKVxuICAgICAgICAgICAgPyAoWydhdHRyaWJ1dGVzJywgJ2NhdGVnb3JpZXMnLCAnZHluYW1pY3MnLCAnc29ydCcsICdwcmljZV9yYW5nZSddIGFzIEZpbHRlclR5cGVbXSlcbiAgICAgICAgICAgIDogdGhpcy5fb3B0aW9uc0ZpbHRlcnM7XG5cbiAgICAgICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRmFjdG9yeSA9IG5ldyBGaWx0ZXJGYWN0b3J5KCk7XG4gICAgICAgICAgICBmaWx0ZXJzVG9Qcm9jZXNzPy5mb3JFYWNoKGZpbHRlclR5cGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGZpbHRlckZhY3RvcnkuY3JlYXRlKGZpbHRlclR5cGUsIHBhZ2luYXRpb25TZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbF9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZGVmYXVsdEZpbHRlcnM/LmZvckVhY2goZmlsdGVyRGVmYXVsdCA9PiB7XG4gICAgICAgICAgICBsZXQgZmlsdGVyID0gZmluYWxfZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIudHlwZSgpID09IGZpbHRlckRlZmF1bHQuZmlsdGVyX3R5cGUpO1xuICAgICAgICAgICAgZmlsdGVyICYmIGZpbHRlckRlZmF1bHQuY29kZXMuZm9yRWFjaCh2YWx1ZSA9PiBmaWx0ZXIuc2V0U2VsZWN0ZWQodmFsdWUpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaGlkcmF0YXIgcHJpY2VfcmFuZ2UgZGVzZGUgbGEgVVJMXG4gICAgICAgIGlmIChyb3V0ZVF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICBjb25zdCBwciA9IGZpbmFsX2ZpbHRlcnMuZmluZChmID0+IGYudHlwZSgpID09PSAncHJpY2VfcmFuZ2UnKSBhcyBQcmljZVJhbmdlRmlsdGVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHByKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmF3TWluID0gcm91dGVRdWVyeVBhcmFtc1sncHJpY2VfbWluJ107XG4gICAgICAgICAgICAgICAgY29uc3QgcmF3TWF4ID0gcm91dGVRdWVyeVBhcmFtc1sncHJpY2VfbWF4J107XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtaW4gPSByYXdNaW4gIT0gbnVsbCA/IE51bWJlcihyYXdNaW4pIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXggPSByYXdNYXggIT0gbnVsbCA/IE51bWJlcihyYXdNYXgpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICgobWluICE9IG51bGwgJiYgIU51bWJlci5pc05hTihtaW4pKSB8fCAobWF4ICE9IG51bGwgJiYgIU51bWJlci5pc05hTihtYXgpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWluICE9IG51bGwgJiYgIU51bWJlci5pc05hTihtaW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwci5jdXJyZW50TWluUHJpY2UgPSBtaW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heCAhPSBudWxsICYmICFOdW1iZXIuaXNOYU4obWF4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHIuY3VycmVudE1heFByaWNlID0gbWF4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmlsdGVyc1N1YmplY3QubmV4dChmaW5hbF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICBnZXRGaWx0ZXJzKHBhZ2luYXRpb25TZXR0aW5ncz86IFBhZ2luYXRpb25TZXR0aW5ncykge1xuICAgICAgICBpZiAodGhpcy5fZmlsdGVyc0luaXRpYWxpemVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2ZpbHRlcnNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gcGFnaW5hdGlvblNldHRpbmdzIHx8IHRoaXMuX3BhZ2luYXRpb25TZXR0aW5ncztcbiAgICAgICAgbGV0IGZpbmFsX2ZpbHRlcnM6IEZpbHRlcltdID0gW107XG4gICAgICAgIGxldCBmaWx0ZXJzVG9Qcm9jZXNzID0gdGhpcy5fb3B0aW9uc0ZpbHRlcnM/LmluY2x1ZGVzKCdhbGwnKVxuICAgICAgICAgICAgPyAoWydhdHRyaWJ1dGVzJywgJ2NhdGVnb3JpZXMnLCAnZHluYW1pY3MnLCAnc29ydCcsICdwcmljZV9yYW5nZSddIGFzIEZpbHRlclR5cGVbXSlcbiAgICAgICAgICAgIDogdGhpcy5fb3B0aW9uc0ZpbHRlcnM7XG5cbiAgICAgICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRmFjdG9yeSA9IG5ldyBGaWx0ZXJGYWN0b3J5KCk7XG4gICAgICAgICAgICBmaWx0ZXJzVG9Qcm9jZXNzPy5mb3JFYWNoKGZpbHRlclR5cGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGZpbHRlckZhY3RvcnkuY3JlYXRlKGZpbHRlclR5cGUsIHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsX2ZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGNyZWF0ZSBmaWx0ZXIgZm9yIHR5cGU6ICR7ZmlsdGVyVHlwZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZGVmYXVsdEZpbHRlcnM/LmZvckVhY2goZmlsdGVyRGVmYXVsdCA9PiB7XG4gICAgICAgICAgICBsZXQgZmlsdGVyID0gZmluYWxfZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIudHlwZSgpID09IGZpbHRlckRlZmF1bHQuZmlsdGVyX3R5cGUpO1xuICAgICAgICAgICAgZmlsdGVyICYmIGZpbHRlckRlZmF1bHQuY29kZXMuZm9yRWFjaCh2YWx1ZSA9PiBmaWx0ZXIuc2V0U2VsZWN0ZWQodmFsdWUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnNTdWJqZWN0Lm5leHQoZmluYWxfZmlsdGVycyk7XG4gICAgICAgIHJldHVybiBmaW5hbF9maWx0ZXJzO1xuICAgIH1cblxuICAgIGdldFNwZWNpZmljRmlsdGVycyh0eXBlczogRmlsdGVyVHlwZVtdKTogRmlsdGVyW10ge1xuICAgICAgICBjb25zdCBmaWx0ZXJzOiBGaWx0ZXJbXSA9IHRoaXMuX2ZpbHRlcnNTdWJqZWN0LnZhbHVlLmZpbHRlcihmaWx0ZXIgPT4gdHlwZXMuaW5jbHVkZXMoZmlsdGVyLnR5cGUoKSkpXG4gICAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH1cblxuICAgIHNldEZpbHRlclNlbGVjdGVkKGZpbHRlck9iajogRmlsdGVyLCBmaWx0ZXJFbGVtOiBGaWx0ZXJFbGVtZW50KSB7XG4gICAgICAgIGxldCBmaW5hbF9maWx0ZXJzOiBGaWx0ZXJbXSA9IHRoaXMuX2ZpbHRlcnNTdWJqZWN0LnZhbHVlO1xuICAgICAgICBpZiAoZmlsdGVyT2JqLnR5cGUoKSAhPT0gJ3ByaWNlX3JhbmdlJykge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gZmluYWxfZmlsdGVycy5maW5kSW5kZXgoZmlsdGVyID0+IGZpbHRlci50eXBlKCkgPT0gZmlsdGVyT2JqLnR5cGUoKSk7XG4gICAgICAgICAgICBmaW5hbF9maWx0ZXJzW2luZGV4XS5zZXRTZWxlY3RlZChmaWx0ZXJFbGVtLCBmaWx0ZXJFbGVtLnZhbHVlIHx8IGZpbHRlckVsZW0uY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmlsdGVyc1N1YmplY3QubmV4dChmaW5hbF9maWx0ZXJzKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHVwZGF0ZUZpbHRlcnMocGFnaW5hdGlvbkZpbHRlcnM6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGF2ZXMgPSBPYmplY3Qua2V5cyhwYWdpbmF0aW9uRmlsdGVycylcbiAgICAgICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRmFjdG9yeSA9IG5ldyBGaWx0ZXJGYWN0b3J5KCk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXI6IEZpbHRlcltdID0gW11cbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnNTdWJqZWN0LnZhbHVlLmZvckVhY2goKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZSgpID09IFwiYXR0cmlidXRlc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdmFsdWUuZGF0YSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqIFxuICAgICAqIEFjdHVhbGl6YSBpbnRlcm5hbWVudGUgZWwgcmFuZ28gZGUgcHJlY2lvIHkgcmUtZW1pdGUgXG4gICAgICogZWwgYXJyYXkgZGUgZmlsdHJvcyBwYXJhIHF1ZSBQYWdpbmF0aW9uU2VydmljZSB2dWVsdmEgYSBsbGFtYXIgXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVByaWNlUmFuZ2VGaWx0ZXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJzU3ViamVjdC52YWx1ZTtcbiAgICAgICAgY29uc3QgcHIgPSBmaWx0ZXJzLmZpbmQoZiA9PiBmLnR5cGUoKSA9PT0gJ3ByaWNlX3JhbmdlJykgYXMgUHJpY2VSYW5nZUZpbHRlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFwcikgcmV0dXJuO1xuICAgICAgICBwci5zZXRTZWxlY3RlZChtaW4sIG1heCk7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnNTdWJqZWN0Lm5leHQoWy4uLmZpbHRlcnNdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdWVyemEgYSBlbWl0aXIgZGUgbnVldm8gbG9zIGZpbHRyb3MgYWN0dWFsZXMuXG4gICAgICogw5p0aWwgY3VhbmRvIHVuIGZpbHRybyBhc3luYyAoY2F0ZWdvcsOtYXMsIGF0cmlidXRvcykgdGVybWluYSBkZSBjYXJnYXJzZVxuICAgICAqIHkgbmVjZXNpdGFtb3MgcXVlIFBhZ2luYXRpb25TZXJ2aWNlIHZ1ZWx2YSBhIGFybWFyIGxhIFVSTC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVmcmVzaEZpbHRlcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9maWx0ZXJzU3ViamVjdC52YWx1ZTtcbiAgICAgICAgLy8gRW1pdGltb3MgdW5hIGNvcGlhIHBhcmEgcXVlIGxvcyBzdWJzY3JpYmVycyBkZXRlY3RlbiBlbCBjYW1iaW9cbiAgICAgICAgdGhpcy5fZmlsdGVyc1N1YmplY3QubmV4dChbLi4uY3VycmVudF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1bnRvIGNlbnRyYWwgZG9uZGUgc2UgaGlkcmF0YW4gbG9zIGZpbHRyb3MgYSBwYXJ0aXIgZGUgbGEgVVJMOlxuICAgICAqIC0gTGVlIHR5cGUvdmFsdWUgZGUgbGEgcnV0YSAoZWouIC9jb2xsZWN0aW9uL2NhdGVnb3JpZXMvOnZhbHVlKS5cbiAgICAgKiAtIExlZSBxdWVyeSBwYXJhbXMgKGNhdGVnb3J5LCBwcmljZV9taW4sIHByaWNlX21heCwgYXR0cmlidXRlQ29kZXMsIHNlYXJjaCwgZXRjLikuXG4gICAgICogLSBDcmVhIGluc3RhbmNpYXMgZGUgZmlsdHJvcyB5IGxlcyBkZWxlZ2EgbGEgaGlkcmF0YWNpw7NuIGVzcGVjw61maWNhLlxuICAgICAqXG4gICAgICogRXN0ZSBtw6l0b2RvIHNlIGxsYW1hIHRhbnRvIGVuIFNTUiBjb21vIGVuIG5hdmVnYWRvci5cbiAgICAgKi9cbiAgICBoeWRyYXRlRnJvbVJvdXRlKFxuICAgICAgICBwYWdpbmF0aW9uU2V0dGluZ3M6IFBhZ2luYXRpb25TZXR0aW5ncyxcbiAgICAgICAgcm91dGVQYXJhbXM6IFBhcmFtcyxcbiAgICAgICAgcm91dGVRdWVyeTogUGFyYW1zXG4gICAgKTogdm9pZCB7XG4gICAgICAgIC8vIGhpZHJhdGFyIHNlYXJjaCBkZXNkZSBsYSBVUkwgPT09XG4gICAgICAgIGNvbnN0IHNlYXJjaEZyb21VcmwgPSByb3V0ZVF1ZXJ5Py5bJ3NlYXJjaCddO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaEZyb21VcmwgPT09ICdzdHJpbmcnICYmIHNlYXJjaEZyb21VcmwudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgLy8gR3VhcmRhbW9zIGVsIHZhbG9yIHBhcmEgcXVlIG90cm9zIGNvbXBvbmVudGVzIChIZWFkZXIsIENvbGxlY3Rpb24pIGxvIHJldXRpbGljZW5cbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cy5zZWFyY2hWYWx1ZSA9IHNlYXJjaEZyb21VcmwudHJpbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2kgbm8gdmllbmUgYHNlYXJjaGAgZW4gbGEgVVJMLCBsaW1waWFtb3MgZWwgZXN0YWRvIGdsb2JhbCBwYXJhIG5vIGFycmFzdHJhciBiw7pzcXVlZGFzIHZpZWphc1xuICAgICAgICAgICAgdGhpcy5fY29uc3RzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHdWFyZGFtb3MgbGEgw7psdGltYSBxdWVyeSBjb21wbGV0YSBwYXJhIHVzYXJsYSBlbiBnZW5lcmF0ZUZpbmFsQXBpIChwYXJjaGUgYXR0cmlidXRlQ29kZXMpXG4gICAgICAgIHRoaXMuX2xhc3RSb3V0ZVF1ZXJ5ID0gcm91dGVRdWVyeTtcblxuICAgICAgICAvLyBHdWFyZGFtb3MgbGFzIHNldHRpbmdzIGFjdHVhbGVzICh0eXBlLCB2YWx1ZSwgbGltaXQsIGV0Yy4pXG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25TZXR0aW5ncyA9IHBhZ2luYXRpb25TZXR0aW5ncztcblxuICAgICAgICAvLyBDcmVhbW9zIGxvcyBmaWx0cm9zIGJhc2UgKGF0dHJpYnV0ZXMsIGNhdGVnb3JpZXMsIGR5bmFtaWNzLCBzb3J0LCBwcmljZV9yYW5nZSwgZXRjLilcbiAgICAgICAgbGV0IGZpbmFsX2ZpbHRlcnM6IEZpbHRlcltdID0gW107XG4gICAgICAgIGxldCBmaWx0ZXJzVG9Qcm9jZXNzID0gdGhpcy5fb3B0aW9uc0ZpbHRlcnM/LmluY2x1ZGVzKCdhbGwnKVxuICAgICAgICAgICAgPyAoWydhdHRyaWJ1dGVzJywgJ2NhdGVnb3JpZXMnLCAnZHluYW1pY3MnLCAnc29ydCcsICdwcmljZV9yYW5nZSddIGFzIEZpbHRlclR5cGVbXSlcbiAgICAgICAgICAgIDogdGhpcy5fb3B0aW9uc0ZpbHRlcnM7XG5cbiAgICAgICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRmFjdG9yeSA9IG5ldyBGaWx0ZXJGYWN0b3J5KCk7XG4gICAgICAgICAgICBmaWx0ZXJzVG9Qcm9jZXNzPy5mb3JFYWNoKGZpbHRlclR5cGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGZpbHRlckZhY3RvcnkuY3JlYXRlKGZpbHRlclR5cGUsIHBhZ2luYXRpb25TZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbF9maWx0ZXJzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQXBsaWNhbW9zIGRlZmF1bHRGaWx0ZXJzIHNpIGNvcnJlc3BvbmRlXG4gICAgICAgIHRoaXMuX2RlZmF1bHRGaWx0ZXJzPy5mb3JFYWNoKGZpbHRlckRlZmF1bHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gZmluYWxfZmlsdGVycy5maW5kKGYgPT4gZi50eXBlKCkgPT09IGZpbHRlckRlZmF1bHQuZmlsdGVyX3R5cGUpO1xuICAgICAgICAgICAgZmlsdGVyICYmIGZpbHRlckRlZmF1bHQuY29kZXMuZm9yRWFjaCh2YWx1ZSA9PiBmaWx0ZXIuc2V0U2VsZWN0ZWQodmFsdWUpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGlkcmF0YXIgZmlsdHJvcyBjb24gc2x1ZyB5IHF1ZXJ5IHBhcmFtcyBnZW7DqXJpY29zXG4gICAgICAgIGZpbmFsX2ZpbHRlcnMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFueUZpbHRlciA9IGYgYXMgYW55O1xuXG4gICAgICAgICAgICAvLyB0eXBlL3ZhbHVlIGVuIGxhIFVSTDogL2NvbGxlY3Rpb24vY2F0ZWdvcmllcy86dmFsdWVcbiAgICAgICAgICAgIGNvbnN0IHVybFR5cGUgPSByb3V0ZVBhcmFtc1sndHlwZSddO1xuICAgICAgICAgICAgY29uc3QgdXJsVmFsdWUgPSByb3V0ZVBhcmFtc1sndmFsdWUnXTtcblxuICAgICAgICAgICAgLy8gUG9yIGVqZW1wbG8sIGVsIENhdGVnb3J5RmlsdGVyIGltcGxlbWVudGEgc2V0RnJvbVNsdWcgcGFyYSBtYXJjYXIgbGEgY2F0ZWdvcsOtYSBjb3JyZWN0YVxuICAgICAgICAgICAgaWYgKHVybFR5cGUgPT09ICdjYXRlZ29yaWVzJyAmJiB1cmxWYWx1ZSAmJiB0eXBlb2YgYW55RmlsdGVyLnNldEZyb21TbHVnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYW55RmlsdGVyLnNldEZyb21TbHVnKHVybFZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXVlcnkgcGFyYW1zIGdlbsOpcmljb3M6ID9jYXRlZ29yeT0wMTAxJnByaWNlX21pbj0uLi4mcHJpY2VfbWF4PS4uLiZhdHRyaWJ1dGVDb2Rlcz0uLi5cbiAgICAgICAgICAgIC8vIENhZGEgZmlsdHJvIHF1ZSBsbyBzb3BvcnRlIGltcGxlbWVudGEgaHlkcmF0ZUZyb21RdWVyeSB5IGRlY2lkZSBxdcOpIGxlZXIuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFueUZpbHRlci5oeWRyYXRlRnJvbVF1ZXJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYW55RmlsdGVyLmh5ZHJhdGVGcm9tUXVlcnkocm91dGVRdWVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhpZHJhdGFyIGVzcGVjw61maWNhbWVudGUgZWwgUHJpY2VSYW5nZUZpbHRlciBkZXNkZSBsYSBVUkxcbiAgICAgICAgY29uc3QgcHJpY2VGaWx0ZXIgPSBmaW5hbF9maWx0ZXJzLmZpbmQoXG4gICAgICAgICAgICAoZjogRmlsdGVyKSA9PiBmIGluc3RhbmNlb2YgUHJpY2VSYW5nZUZpbHRlclxuICAgICAgICApIGFzIFByaWNlUmFuZ2VGaWx0ZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHByaWNlRmlsdGVyICYmIHJvdXRlUXVlcnkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbkZyb21VcmwgPSByb3V0ZVF1ZXJ5WydwcmljZV9taW4nXTtcbiAgICAgICAgICAgIGNvbnN0IG1heEZyb21VcmwgPSByb3V0ZVF1ZXJ5WydwcmljZV9tYXgnXTtcblxuICAgICAgICAgICAgaWYgKG1pbkZyb21VcmwgIT0gbnVsbCB8fCBtYXhGcm9tVXJsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW4gPSBtaW5Gcm9tVXJsICE9IG51bGwgPyBOdW1iZXIobWluRnJvbVVybCkgOiBwcmljZUZpbHRlci5taW5QcmljZTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXggPSBtYXhGcm9tVXJsICE9IG51bGwgPyBOdW1iZXIobWF4RnJvbVVybCkgOiBwcmljZUZpbHRlci5tYXhQcmljZTtcblxuICAgICAgICAgICAgICAgIC8vIHVzYW1vcyBsYSBBUEkgZGVsIGZpbHRybyBwYXJhIHNldGVhciBlbCByYW5nb1xuICAgICAgICAgICAgICAgIHByaWNlRmlsdGVyLnNldFNlbGVjdGVkKG1pbiwgbWF4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc2kgbm8gaGF5IG5hZGEgZW4gbGEgVVJMLCBsbyByZXNldGVhbW9zXG4gICAgICAgICAgICAgICAgcHJpY2VGaWx0ZXIucmVzZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXRpbW9zIGZpbHRyb3MgeWEgaGlkcmF0YWRvcyBwYXJhIHF1ZSBQYWdpbmF0aW9uU2VydmljZSB5IENvbGxlY3Rpb24gcmVhY2Npb25lblxuICAgICAgICB0aGlzLl9maWx0ZXJzU3ViamVjdC5uZXh0KGZpbmFsX2ZpbHRlcnMpO1xuXG4gICAgICAgIC8vIE1hcmNhbW9zIHF1ZSBlbCBzaXN0ZW1hIGRlIGZpbHRyb3MgZXN0w6EgbGlzdG8gKMO6dGlsIHBhcmEgbW9zdHJhciBzcGlubmVycywgZXRjLilcbiAgICAgICAgdGhpcy5fcmVhZHlTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxufVxuXG4vLyBleHBvcnQgdHlwZSBGaWx0ZXJUeXBlID0gJ2F0dHJpYnV0ZXMnIHwgJ2NhdGVnb3JpZXMnIHwgJ2R5bmFtaWNzJyB8ICdzb3J0JyB8ICdwcmljZV9yYW5nZSc7IC8vIFVzZSBpbXBvcnRlZCBGaWx0ZXJUeXBlIGluc3RlYWRcbiJdfQ==
|
|
@@ -1,21 +1,59 @@
|
|
|
1
1
|
import { inject, Injectable, signal } from '@angular/core';
|
|
2
2
|
import { ConnectionService } from '../api';
|
|
3
|
-
import { BehaviorSubject, filter, map, shareReplay, switchMap } from 'rxjs';
|
|
3
|
+
import { BehaviorSubject, distinctUntilChanged, filter, map, shareReplay, switchMap, tap } from 'rxjs';
|
|
4
4
|
import { FiltersService } from './filters.service';
|
|
5
5
|
import { CoreConstantsService } from '../constants';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
/**
|
|
8
|
-
* Servicio para manejar la paginación de
|
|
9
|
-
*
|
|
8
|
+
* Servicio para manejar la paginación y la carga de productos.
|
|
9
|
+
*
|
|
10
|
+
* Se encarga de:
|
|
11
|
+
* - Escuchar los cambios en los filtros (categorías, atributos, precio, búsqueda, etc.).
|
|
12
|
+
* - Construir la URL al backend con esos filtros.
|
|
13
|
+
* - Pedir los productos al endpoint de product-search.
|
|
14
|
+
* - Exponer un observable con la última página de productos (`paginationData$`)
|
|
15
|
+
* y otros helpers (precio mínimo/máximo, siguiente página, etc.).
|
|
10
16
|
*/
|
|
11
17
|
export class PaginationService {
|
|
12
18
|
_connectionService = inject(ConnectionService);
|
|
13
19
|
_filtersService = inject(FiltersService);
|
|
14
20
|
_constants = inject(CoreConstantsService);
|
|
15
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Flujo principal: a partir de los filtros → arma URL → consulta backend → devuelve productos.
|
|
23
|
+
*
|
|
24
|
+
* Pasos:
|
|
25
|
+
* 1) Espera a que `FiltersService` emita filtros válidos.
|
|
26
|
+
* 2) Construye la URL final con `buildUrl()`.
|
|
27
|
+
* 3) Evita repetir llamadas si la URL no cambió (`distinctUntilChanged`).
|
|
28
|
+
* 4) Llama al backend con `getData(url)`.
|
|
29
|
+
* 5) Comparte el último resultado con todos los suscriptores (`shareReplay(1)`).
|
|
30
|
+
*/
|
|
31
|
+
paginationData$ = this._filtersService.filters$.pipe(tap(filters => {
|
|
32
|
+
}), filter(filters => {
|
|
33
|
+
if (!filters || !filters.length)
|
|
34
|
+
return false;
|
|
35
|
+
const categoryFilter = filters.find(f => f.type() === 'categories');
|
|
36
|
+
const hasCategorySelected = !!categoryFilter?.getSelectedList()?.length;
|
|
37
|
+
const isCategoryRoute = this._constants.currentRouteType === 'categories';
|
|
38
|
+
// Si estamos en ruta de categorías y todavía no se marcó ninguna,
|
|
39
|
+
// esperamos a que el CategoryFilter se hidrate antes de disparar la llamada.
|
|
40
|
+
if (isCategoryRoute && !hasCategorySelected) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}),
|
|
45
|
+
// 2) Convertimos filtros -> URL
|
|
46
|
+
map(filters => {
|
|
16
47
|
const url = this.buildUrl(filters);
|
|
17
|
-
return
|
|
18
|
-
})
|
|
48
|
+
return url;
|
|
49
|
+
}),
|
|
50
|
+
// 3) Solo seguimos si la URL cambió respecto de la emisión anterior
|
|
51
|
+
distinctUntilChanged(),
|
|
52
|
+
// 4) Llamamos al backend con la URL construida
|
|
53
|
+
tap(url => {
|
|
54
|
+
}), switchMap(url => this.getData(url)),
|
|
55
|
+
// 5) Reutilizar resultado si alguien más se suscribe (evita repetir la petición)
|
|
56
|
+
shareReplay(1));
|
|
19
57
|
_dataPagination = signal({
|
|
20
58
|
attributes: [],
|
|
21
59
|
category: [],
|
|
@@ -84,7 +122,8 @@ export class PaginationService {
|
|
|
84
122
|
this._dataPagination.set({ ...response, called: true });
|
|
85
123
|
this._finished = (response.page == response.pages);
|
|
86
124
|
this._waiting = false;
|
|
87
|
-
// Emitir los valores de price_min y price_max a través de priceRangeSubject
|
|
125
|
+
// Emitir los valores de price_min y price_max a través de priceRangeSubject,
|
|
126
|
+
// para que otros componentes (ej. filtro de precio) puedan mostrarlos.
|
|
88
127
|
this.priceRangeSubject.next({
|
|
89
128
|
price_min: response.price_min,
|
|
90
129
|
price_max: response.price_max
|
|
@@ -144,27 +183,36 @@ export class PaginationService {
|
|
|
144
183
|
* @returns
|
|
145
184
|
*/
|
|
146
185
|
buildUrl(filters) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
return this._filtersService.generateFinalApi();
|
|
152
|
-
}
|
|
186
|
+
const url = this._constants.searchValue
|
|
187
|
+
? this._filtersService.generateFinalApi(this._constants.searchValue)
|
|
188
|
+
: this._filtersService.generateFinalApi();
|
|
189
|
+
return url;
|
|
153
190
|
}
|
|
154
191
|
/**
|
|
155
|
-
* Devuelve un observable de los productos que
|
|
192
|
+
* Devuelve un observable de los productos que devolvió la última página obtenida.
|
|
156
193
|
* @param url
|
|
157
194
|
* @returns
|
|
158
195
|
*/
|
|
159
196
|
getData(url) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
197
|
+
// Detectar la página desde la URL (?page=n). Si no viene, asumimos page=1.
|
|
198
|
+
const pageMatch = url.match(/[?&]page=(\d+)/);
|
|
199
|
+
const page = pageMatch ? Number(pageMatch[1]) : 1;
|
|
200
|
+
// Si es la primera página, reseteamos estado interno
|
|
201
|
+
if (page === 1) {
|
|
202
|
+
this._resetSubject.next(true);
|
|
203
|
+
this._nextProductsSubject.next([]);
|
|
204
|
+
}
|
|
205
|
+
// Llamamos al backend con el page correcto
|
|
206
|
+
return this._connectionService.get(url, { limit: 10, page }).pipe(tap((res) => {
|
|
207
|
+
// Actualizar datos de paginación + price_min/price_max
|
|
165
208
|
res.links ? this.updatePageData(res) : this.finish(res);
|
|
166
|
-
})
|
|
167
|
-
|
|
209
|
+
}), map((res) => {
|
|
210
|
+
const items = res.items ?? [];
|
|
211
|
+
// Mantener nextProducts$ sincronizado (por compatibilidad)
|
|
212
|
+
this._nextProductsSubject.next(items);
|
|
213
|
+
// Lo que ve paginationData$ (switchMap) son estos items
|
|
214
|
+
return items;
|
|
215
|
+
}));
|
|
168
216
|
}
|
|
169
217
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
170
218
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationService, providedIn: 'root' });
|
|
@@ -175,4 +223,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
175
223
|
providedIn: 'root'
|
|
176
224
|
}]
|
|
177
225
|
}], ctorParameters: () => [] });
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLXNlcnZpY2VzL3BhZ2luYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFPLE1BQU0sTUFBTSxDQUFDO0FBRTdGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBQ3BEOzs7R0FHRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUFFckIsa0JBQWtCLEdBQXNCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xFLGVBQWUsR0FBbUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3hELFVBQVUsR0FBeUIsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFakUsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDMUQsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUNkLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUNoRCxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFH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QkFBa0I7WUFDbEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN4RCxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUMzQixDQUFDO3dHQS9LVyxpQkFBaUI7NEdBQWpCLGlCQUFpQixjQUZqQixNQUFNOzs0RkFFTixpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbiwgUHJvZHVjdCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRmlsdGVyc1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvcmVDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbi8qKlxuICogU2VydmljaW8gcGFyYSBtYW5lamFyIGxhIHBhZ2luYWNpw7NuIGRlIGxvcyBwcm9kdWN0b3MuXG4gKiBAY2xhc3MgUGFnaW5hdGlvblNlcnZpY2VcbiAqL1xuQEluamVjdGFibGUoe1xuXHRwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvblNlcnZpY2Uge1xuXG5cdHByaXZhdGUgX2Nvbm5lY3Rpb25TZXJ2aWNlOiBDb25uZWN0aW9uU2VydmljZSA9IGluamVjdChDb25uZWN0aW9uU2VydmljZSk7XG5cdHByaXZhdGUgX2ZpbHRlcnNTZXJ2aWNlOiBGaWx0ZXJzU2VydmljZSA9IGluamVjdChGaWx0ZXJzU2VydmljZSlcblx0cHJpdmF0ZSBfY29uc3RhbnRzOiBDb3JlQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChDb3JlQ29uc3RhbnRzU2VydmljZSk7XG5cdFxuXHRwdWJsaWMgcGFnaW5hdGlvbkRhdGEkID0gdGhpcy5fZmlsdGVyc1NlcnZpY2UuZmlsdGVycyQucGlwZShcblx0XHRzaGFyZVJlcGxheSgxKSxcblx0XHRmaWx0ZXIoZmlsdGVycyA9PiBmaWx0ZXJzICYmIGZpbHRlcnMubGVuZ3RoID4gMCksXG5cdFx0c3dpdGNoTWFwKChmaWx0ZXJzKSA9PiB7XHRcdFx0XG5cdFx0XHRjb25zdCB1cmwgPSB0aGlzLmJ1aWxkVXJsKGZpbHRlcnMpO1x0XHRcdFxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0RGF0YSh1cmwpO1xuXHRcdH0pXG5cdClcblxuXHRwcml2YXRlIF9kYXRhUGFnaW5hdGlvbjogYW55ID0gc2lnbmFsPFBhZ2luYXRpb24+KHtcblx0XHRhdHRyaWJ1dGVzOiBbXSxcblx0XHRjYXRlZ29yeTogW10sXG5cdFx0b3B0aW9uczogW10sXG5cdFx0bGltaXQ6IDAsXG5cdFx0cGFnZTogMCxcblx0XHRwYWdlczogMCxcblx0XHR0b3RhbDogMCxcblx0XHRpdGVtczogW10sXG5cdFx0Y2FsbGVkOiBmYWxzZSxcblx0XHRwcmljZV9tYXg6IDAsXG5cdFx0cHJpY2VfbWluOiAwXG5cdH0pO1xuXG5cdHByaXZhdGUgX3dhaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblx0cHJpdmF0ZSBfZmluaXNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0cHJpdmF0ZSBfYXBpVXJsOiBzdHJpbmcgPSAnJztcblx0cHJpdmF0ZSBfc3RhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRwcml2YXRlIF9uZXh0UHJvZHVjdHNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8UHJvZHVjdFtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJvZHVjdFtdPihbXSk7XG5cdHB1YmxpYyBuZXh0UHJvZHVjdHMkID0gdGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuXHRwcml2YXRlIF9yZXNldFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXHRwdWJsaWMgcmVzZXQkID0gdGhpcy5fcmVzZXRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG5cdHByaXZhdGUgcHJpY2VSYW5nZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgcHJpY2VfbWluOiBudW1iZXIsIHByaWNlX21heDogbnVtYmVyIH0+KHsgcHJpY2VfbWluOiAwLCBwcmljZV9tYXg6IDAgfSk7XG5cdHB1YmxpYyBwcmljZVJhbmdlJCA9IHRoaXMucHJpY2VSYW5nZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cdFxuXHRjb25zdHJ1Y3RvcigpIHsgfVxuXG5cdC8qKlxuXHQgKiBJbmljaWFsaXphIGxhIGNvbmZpZ3VyYWNpw7NuIHBhcmEgZWwgU2VydmljaW8gZGUgUGFnaW5hY2nDs24uXG5cdCAqIEBwYXJhbSBhcGlVcmwgVXJsIGNvbiBsb3MgZmlsdHJvcyBhcGxpY2Fkb3MuIFxuXHQgKiBAcGFyYW0gbGltaXQgbGltaXRlIGRlIHByb2R1Y3RvcyBlbiBjYWRhIHBldGljacOzbi5cblx0ICovXG5cdGluaXRpYWxpemUoYXBpVXJsOiBzdHJpbmcsIGxpbWl0PzogbnVtYmVyKSB7XG5cdFx0Ly9jb25zb2xlLmxvZyhhcGlVcmwpXG5cdFx0dGhpcy5fYXBpVXJsID0gYXBpVXJsO1xuXHRcdHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGltaXQgPSBsaW1pdCB8fCB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLmxpbWl0IHx8IDEwO1xuXHRcdHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7XG5cdFx0dGhpcy5fc3RhcnQgPSB0cnVlO1xuXHRcdHRoaXMuX25leHRQcm9kdWN0c1N1YmplY3QubmV4dChbXSk7XG5cdH1cblx0LyoqXG5cdCAqIE9idGVuZ28gbG9zIGRhdG9zIGRlIGxhIHNpZ3VpZW50ZSBww6FnaW5hLlxuXHQgKiBAcGFyYW0gbmV4dCBcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRnZXROZXh0KG5leHQ/OiBhbnkpOiBib29sZWFuIHtcblx0XHR0aGlzLl93YWl0aW5nID0gdHJ1ZTtcblx0XHR0aGlzLl9uZXh0UHJvZHVjdHNTdWJqZWN0Lm5leHQoW10pO1xuXHRcdHRoaXMuX2FwaVVybCA9IHRoaXMuX2FwaVVybC5yZXBsYWNlKCclMjAnLCAnICcpOy8vIG1hcyBwYXJhIGN1YW5kbyBlcyB1biBzZWFyY2ggdmFsdWUuXG5cdFx0bGV0IG5leHRQcm9kdWN0cztcblx0XHRpZiAodGhpcy5fc3RhcnQpIHtcblx0XHRcdG5leHRQcm9kdWN0cyA9IHRoaXMuX2Nvbm5lY3Rpb25TZXJ2aWNlLmdldCh0aGlzLl9hcGlVcmwsIHsgbGltaXQ6IHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGltaXQsIHBhZ2U6IDEgfSlcblx0XHRcdHRoaXMuX3N0YXJ0ID0gZmFsc2Vcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV4dFByb2R1Y3RzID0gdGhpcy5fY29ubmVjdGlvblNlcnZpY2UuZ2V0KHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGlua3MubmV4dC5zbGljZSgxKSk7XG5cdFx0fVxuXG5cdFx0IXRoaXMuX2ZpbmlzaGVkICYmIG5leHRQcm9kdWN0cy5zdWJzY3JpYmUoXG5cdFx0XHQocmVzcG9uc2U6IFBhZ2luYXRpb24pID0+IHtcblx0XHRcdFx0cmVzcG9uc2UubGlua3MgPyB0aGlzLnVwZGF0ZVBhZ2VEYXRhKHJlc3BvbnNlKSA6IHRoaXMuZmluaXNoKHJlc3BvbnNlKVxuXHRcdFx0XHR0aGlzLl9uZXh0UHJvZHVjdHNTdWJqZWN0Lm5leHQocmVzcG9uc2UuaXRlbXMpO1xuXHRcdFx0fVxuXHRcdClcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogQWN0dWFsaXphIGxvcyBkYXRvcyBkZSBsYSBwYWdpbmEuXG5cdCAqIEBwYXJhbSByZXNwb25zZSByZXNwdWVzdGEgZGVsIGJhY2tlbmQgbyBvYmplY3RvIGRlbCB0aXBvIGBQYWdpbmF0aW9uYC5cblx0ICovXG5cdHVwZGF0ZVBhZ2VEYXRhKHJlc3BvbnNlOiBQYWdpbmF0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy5fZGF0YVBhZ2luYXRpb24uc2V0KHsgLi4ucmVzcG9uc2UsIGNhbGxlZDogdHJ1ZSB9KVxuXHRcdHRoaXMuX2ZpbmlzaGVkID0gKHJlc3BvbnNlLnBhZ2UgPT0gcmVzcG9uc2UucGFnZXMpXG5cdFx0dGhpcy5fd2FpdGluZyA9IGZhbHNlO1xuXHRcdCAvLyBFbWl0aXIgbG9zIHZhbG9yZXMgZGUgcHJpY2VfbWluIHkgcHJpY2VfbWF4IGEgdHJhdsOpcyBkZSBwcmljZVJhbmdlU3ViamVjdFxuICAgICAgICB0aGlzLnByaWNlUmFuZ2VTdWJqZWN0Lm5leHQoe1xuICAgICAgICAgICAgcHJpY2VfbWluOiByZXNwb25zZS5wcmljZV9taW4sXG4gICAgICAgICAgICBwcmljZV9tYXg6IHJlc3BvbnNlLnByaWNlX21heFxuICAgICAgICB9KTtcblxuXHR9XG5cdC8qKlxuXHQgKiBNYXJjYSBlbCBmaW5hbCBkZSBsYXMgcGFnaW5hcywgZXMgZGVjaXIgY3VhbmRvIHlhIG5vIHF1ZWRhIG1hcyBlbGVtZW50b3MgcXVlIG1vc3RyYXIuXG5cdCAqIEBwYXJhbSByZXNwb25zZSBcblx0ICovXG5cdGZpbmlzaChyZXNwb25zZTogUGFnaW5hdGlvbik6IHZvaWQge1xuXHRcdHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZTtcblx0XHR0aGlzLl93YWl0aW5nID0gZmFsc2U7XG5cdH1cblx0LyoqXG5cdCAqIE9idGVuZ28gbG9zIHByb2R1Y3RvcyBkZSBsYSBwYWdpbmEgY2FyZ2FkYSBhY3R1YWwuIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyBnZXROZXh0UHJvZHVjdHMoKTogUHJvZHVjdFtdIHtcblx0XHRyZXR1cm4gdGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC52YWx1ZTtcblx0fVxuXHQvKipcblx0ICogRGV2dWVsdmUgc2kgZXN0YSBlc3BlcmFuZG8gbyBubyBsYSBwZXRpY2nDs24gYWwgYmFja2VuZC5cblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgZ2V0V2FpdGluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3dhaXRpbmc7IH1cblx0LyoqXG5cdCAqIFNldGVhIGxhIHZhcmlhYmxlIHdhaXRpbmcuXG5cdCAqIEBwYXJhbSB2YWx1ZSBcblx0ICovXG5cdHB1YmxpYyBzZXRXYWl0aW5nKHZhbHVlOiBib29sZWFuKTogdm9pZCB7IHRoaXMuX3dhaXRpbmcgPSB2YWx1ZSB9XG5cdC8qKlxuXHQgKiBHZXR0ZXIgcGFyYSBsYSB2YXJpYWJsZSBgX2ZpbmlzaGVkYC5cblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RmluaXNoZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9maW5pc2hlZDsgfVxuXHQvKipcblx0ICogRGV2dWVsdmUgZWwgdG90YWwgZGUgSXRlbXMuXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0cHVibGljIGdldFRvdGFsSXRlbXMoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YVBhZ2luYXRpb24oKS5saW1pdCAqIHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkucGFnZTtcblx0fVxuXHQvKipcblx0ICogT2J0ZW5nbyB1biBvYmplY3RvIGNvbiBsb3MgZGF0b3MgZGUgbG9zIGZpbHRyb3MgcmVzdWx0YW50ZXMuXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0cHVibGljIGdldEZpbHRlcnNQYWdpbmF0aW9uKCk6IGFueSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdFwiY2F0ZWdvcmllc1wiOiB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLmNhdGVnb3J5LFxuXHRcdFx0XCJhdHRyaWJ1dGVzXCI6IHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkuYXR0cmlidXRlcyxcblx0XHRcdFwib3B0aW9uc1wiOiB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLm9wdGlvbnNcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIFBhcmEgY29udHJ1aXN0ZSBsYSB1cmwgZW4gYmFzZSBhIGxvcyBmaWx0cm9zIGFwbGljYWRvcy5cblx0ICogQHBhcmFtIGZpbHRlcnMgXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0cHVibGljIGJ1aWxkVXJsKGZpbHRlcnM6IEZpbHRlcltdKSB7XHRcdFxuXHRcdGlmICh0aGlzLl9jb25zdGFudHMuc2VhcmNoVmFsdWUpe1xuXHRcdFx0cmV0dXJuIHRoaXMuX2ZpbHRlcnNTZXJ2aWNlLmdlbmVyYXRlRmluYWxBcGkodGhpcy5fY29uc3RhbnRzLnNlYXJjaFZhbHVlKTtcblx0XHR9IGVsc2V7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZmlsdGVyc1NlcnZpY2UuZ2VuZXJhdGVGaW5hbEFwaSgpO1xuXHRcdH1cblx0XHRcblx0fVxuXHQvKipcblx0ICogRGV2dWVsdmUgdW4gb2JzZXJ2YWJsZSBkZSBsb3MgcHJvZHVjdG9zIHF1ZSBkZXZvbHZpbyBsYSDDumx0aW1hIHDDoWdpbmEgb2J0ZW5pZGEuXG5cdCAqIEBwYXJhbSB1cmwgXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0cHVibGljIGdldERhdGEodXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuXHRcdHRoaXMuX3Jlc2V0U3ViamVjdC5uZXh0KHRydWUpO1xuXHRcdHRoaXMuX25leHRQcm9kdWN0c1N1YmplY3QubmV4dChbXSk7XG5cdFx0dGhpcy5fY29ubmVjdGlvblNlcnZpY2UuZ2V0KHVybCwgeyBsaW1pdDogMTAsIHBhZ2U6IDEgfSkucGlwZShcblx0XHRcdG1hcChyZXMgPT57IFxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKHJlcylcblx0XHRcdFx0dGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC5uZXh0KHJlcy5pdGVtcyk7XG5cdFx0XHRcdHJlcy5saW5rcyA/IHRoaXMudXBkYXRlUGFnZURhdGEocmVzKSA6IHRoaXMuZmluaXNoKHJlcylcblx0XHRcdH0pKS5zdWJzY3JpYmUoKTtcblxuXHRcdHJldHVybiB0aGlzLm5leHRQcm9kdWN0cyQ7XG5cdH1cbn1cblxuIl19
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLXNlcnZpY2VzL3BhZ2luYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVuSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUNwRDs7Ozs7Ozs7O0dBU0c7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBRXJCLGtCQUFrQixHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRSxlQUFlLEdBQW1CLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUN4RCxVQUFVLEdBQXlCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXhFOzs7Ozs7Ozs7T0FTRztJQUNJLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQzFELEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtJQUNkLENBQUMsQ0FBQyxFQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNoQixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUU5QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFD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QUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsR0FBZSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFFOUIsMkRBQTJEO1lBQzNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdEMsd0RBQXdEO1lBQ3hELE9BQU8sS0FBSyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQ0YsQ0FBQztJQUNILENBQUM7d0dBek9XLGlCQUFpQjs0R0FBakIsaUJBQWlCLGNBRmpCLE1BQU07OzRGQUVOLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbiwgUHJvZHVjdCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRmlsdGVyc1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvcmVDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbi8qKlxuICogU2VydmljaW8gcGFyYSBtYW5lamFyIGxhIHBhZ2luYWNpw7NuIHkgbGEgY2FyZ2EgZGUgcHJvZHVjdG9zLlxuICpcbiAqIFNlIGVuY2FyZ2EgZGU6XG4gKiAtIEVzY3VjaGFyIGxvcyBjYW1iaW9zIGVuIGxvcyBmaWx0cm9zIChjYXRlZ29yw61hcywgYXRyaWJ1dG9zLCBwcmVjaW8sIGLDunNxdWVkYSwgZXRjLikuXG4gKiAtIENvbnN0cnVpciBsYSBVUkwgYWwgYmFja2VuZCBjb24gZXNvcyBmaWx0cm9zLlxuICogLSBQZWRpciBsb3MgcHJvZHVjdG9zIGFsIGVuZHBvaW50IGRlIHByb2R1Y3Qtc2VhcmNoLlxuICogLSBFeHBvbmVyIHVuIG9ic2VydmFibGUgY29uIGxhIMO6bHRpbWEgcMOhZ2luYSBkZSBwcm9kdWN0b3MgKGBwYWdpbmF0aW9uRGF0YSRgKVxuICogICB5IG90cm9zIGhlbHBlcnMgKHByZWNpbyBtw61uaW1vL23DoXhpbW8sIHNpZ3VpZW50ZSBww6FnaW5hLCBldGMuKS5cbiAqL1xuQEluamVjdGFibGUoe1xuXHRwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvblNlcnZpY2Uge1xuXG5cdHByaXZhdGUgX2Nvbm5lY3Rpb25TZXJ2aWNlOiBDb25uZWN0aW9uU2VydmljZSA9IGluamVjdChDb25uZWN0aW9uU2VydmljZSk7XG5cdHByaXZhdGUgX2ZpbHRlcnNTZXJ2aWNlOiBGaWx0ZXJzU2VydmljZSA9IGluamVjdChGaWx0ZXJzU2VydmljZSlcblx0cHJpdmF0ZSBfY29uc3RhbnRzOiBDb3JlQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChDb3JlQ29uc3RhbnRzU2VydmljZSk7XG5cblx0LyoqXG5cdCAqIEZsdWpvIHByaW5jaXBhbDogYSBwYXJ0aXIgZGUgbG9zIGZpbHRyb3Mg4oaSIGFybWEgVVJMIOKGkiBjb25zdWx0YSBiYWNrZW5kIOKGkiBkZXZ1ZWx2ZSBwcm9kdWN0b3MuXG5cdCAqXG5cdCAqIFBhc29zOlxuXHQgKiAxKSBFc3BlcmEgYSBxdWUgYEZpbHRlcnNTZXJ2aWNlYCBlbWl0YSBmaWx0cm9zIHbDoWxpZG9zLlxuXHQgKiAyKSBDb25zdHJ1eWUgbGEgVVJMIGZpbmFsIGNvbiBgYnVpbGRVcmwoKWAuXG5cdCAqIDMpIEV2aXRhIHJlcGV0aXIgbGxhbWFkYXMgc2kgbGEgVVJMIG5vIGNhbWJpw7MgKGBkaXN0aW5jdFVudGlsQ2hhbmdlZGApLlxuXHQgKiA0KSBMbGFtYSBhbCBiYWNrZW5kIGNvbiBgZ2V0RGF0YSh1cmwpYC5cblx0ICogNSkgQ29tcGFydGUgZWwgw7psdGltbyByZXN1bHRhZG8gY29uIHRvZG9zIGxvcyBzdXNjcmlwdG9yZXMgKGBzaGFyZVJlcGxheSgxKWApLlxuXHQgKi9cblx0cHVibGljIHBhZ2luYXRpb25EYXRhJCA9IHRoaXMuX2ZpbHRlcnNTZXJ2aWNlLmZpbHRlcnMkLnBpcGUoXG5cdFx0dGFwKGZpbHRlcnMgPT4ge1xuXHRcdH0pLFxuXHRcdGZpbHRlcihmaWx0ZXJzID0+IHtcblx0XHRcdGlmICghZmlsdGVycyB8fCAhZmlsdGVycy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuXHRcdFx0Y29uc3QgY2F0ZWdvcnlGaWx0ZXIgPSBmaWx0ZXJzLmZpbmQoZiA9PiBmLnR5cGUoKSA9PT0gJ2NhdGVnb3JpZXMnKTtcblx0XHRcdGNvbnN0IGhhc0NhdGVnb3J5U2VsZWN0ZWQgPSAhIWNhdGVnb3J5RmlsdGVyPy5nZXRTZWxlY3RlZExpc3QoKT8ubGVuZ3RoO1xuXG5cdFx0XHRjb25zdCBpc0NhdGVnb3J5Um91dGUgPVxuXHRcdFx0XHR0aGlzLl9jb25zdGFudHMuY3VycmVudFJvdXRlVHlwZSA9PT0gJ2NhdGVnb3JpZXMnO1xuXG5cdFx0XHQvLyBTaSBlc3RhbW9zIGVuIHJ1dGEgZGUgY2F0ZWdvcsOtYXMgeSB0b2RhdsOtYSBubyBzZSBtYXJjw7MgbmluZ3VuYSxcblx0XHRcdC8vIGVzcGVyYW1vcyBhIHF1ZSBlbCBDYXRlZ29yeUZpbHRlciBzZSBoaWRyYXRlIGFudGVzIGRlIGRpc3BhcmFyIGxhIGxsYW1hZGEuXG5cdFx0XHRpZiAoaXNDYXRlZ29yeVJvdXRlICYmICFoYXNDYXRlZ29yeVNlbGVjdGVkKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSksXG5cblx0XHQvLyAyKSBDb252ZXJ0aW1vcyBmaWx0cm9zIC0+IFVSTFxuXHRcdG1hcChmaWx0ZXJzID0+IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMuYnVpbGRVcmwoZmlsdGVycyk7XG5cdFx0XHRyZXR1cm4gdXJsO1xuXHRcdH0pLFxuXG5cdFx0Ly8gMykgU29sbyBzZWd1aW1vcyBzaSBsYSBVUkwgY2FtYmnDsyByZXNwZWN0byBkZSBsYSBlbWlzacOzbiBhbnRlcmlvclxuXHRcdGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG5cblx0XHQvLyA0KSBMbGFtYW1vcyBhbCBiYWNrZW5kIGNvbiBsYSBVUkwgY29uc3RydWlkYVxuXHRcdHRhcCh1cmwgPT4ge1xuXHRcdH0pLFxuXHRcdHN3aXRjaE1hcCh1cmwgPT4gdGhpcy5nZXREYXRhKHVybCkpLFxuXG5cdFx0Ly8gNSkgUmV1dGlsaXphciByZXN1bHRhZG8gc2kgYWxndWllbiBtw6FzIHNlIHN1c2NyaWJlIChldml0YSByZXBldGlyIGxhIHBldGljacOzbilcblx0XHRzaGFyZVJlcGxheSgxKVxuXHQpO1xuXG5cdHByaXZhdGUgX2RhdGFQYWdpbmF0aW9uOiBhbnkgPSBzaWduYWw8UGFnaW5hdGlvbj4oe1xuXHRcdGF0dHJpYnV0ZXM6IFtdLFxuXHRcdGNhdGVnb3J5OiBbXSxcblx0XHRvcHRpb25zOiBbXSxcblx0XHRsaW1pdDogMCxcblx0XHRwYWdlOiAwLFxuXHRcdHBhZ2VzOiAwLFxuXHRcdHRvdGFsOiAwLFxuXHRcdGl0ZW1zOiBbXSxcblx0XHRjYWxsZWQ6IGZhbHNlLFxuXHRcdHByaWNlX21heDogMCxcblx0XHRwcmljZV9taW46IDBcblx0fSk7XG5cblx0cHJpdmF0ZSBfd2FpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXHRwcml2YXRlIF9maW5pc2hlZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRwcml2YXRlIF9hcGlVcmw6IHN0cmluZyA9ICcnO1xuXHRwcml2YXRlIF9zdGFydDogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdHByaXZhdGUgX25leHRQcm9kdWN0c1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcm9kdWN0W10+KFtdKTtcblx0cHVibGljIG5leHRQcm9kdWN0cyQgPSB0aGlzLl9uZXh0UHJvZHVjdHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG5cdHByaXZhdGUgX3Jlc2V0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cdHB1YmxpYyByZXNldCQgPSB0aGlzLl9yZXNldFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cblx0cHJpdmF0ZSBwcmljZVJhbmdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBwcmljZV9taW46IG51bWJlciwgcHJpY2VfbWF4OiBudW1iZXIgfT4oeyBwcmljZV9taW46IDAsIHByaWNlX21heDogMCB9KTtcblx0cHVibGljIHByaWNlUmFuZ2UkID0gdGhpcy5wcmljZVJhbmdlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuXHRjb25zdHJ1Y3RvcigpIHsgfVxuXG5cdC8qKlxuXHQgKiBJbmljaWFsaXphIGxhIGNvbmZpZ3VyYWNpw7NuIHBhcmEgZWwgU2VydmljaW8gZGUgUGFnaW5hY2nDs24uXG5cdCAqIEBwYXJhbSBhcGlVcmwgVXJsIGNvbiBsb3MgZmlsdHJvcyBhcGxpY2Fkb3MuIFxuXHQgKiBAcGFyYW0gbGltaXQgbGltaXRlIGRlIHByb2R1Y3RvcyBlbiBjYWRhIHBldGljacOzbi5cblx0ICovXG5cdGluaXRpYWxpemUoYXBpVXJsOiBzdHJpbmcsIGxpbWl0PzogbnVtYmVyKSB7XG5cdFx0Ly9jb25zb2xlLmxvZyhhcGlVcmwpXG5cdFx0dGhpcy5fYXBpVXJsID0gYXBpVXJsO1xuXHRcdHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGltaXQgPSBsaW1pdCB8fCB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLmxpbWl0IHx8IDEwO1xuXHRcdHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7XG5cdFx0dGhpcy5fc3RhcnQgPSB0cnVlO1xuXHRcdHRoaXMuX25leHRQcm9kdWN0c1N1YmplY3QubmV4dChbXSk7XG5cdH1cblx0LyoqXG5cdCAqIE9idGVuZ28gbG9zIGRhdG9zIGRlIGxhIHNpZ3VpZW50ZSBww6FnaW5hLlxuXHQgKiBAcGFyYW0gbmV4dCBcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRnZXROZXh0KG5leHQ/OiBhbnkpOiBib29sZWFuIHtcblx0XHR0aGlzLl93YWl0aW5nID0gdHJ1ZTtcblx0XHR0aGlzLl9uZXh0UHJvZHVjdHNTdWJqZWN0Lm5leHQoW10pO1xuXHRcdHRoaXMuX2FwaVVybCA9IHRoaXMuX2FwaVVybC5yZXBsYWNlKCclMjAnLCAnICcpOy8vIG1hcyBwYXJhIGN1YW5kbyBlcyB1biBzZWFyY2ggdmFsdWUuXG5cdFx0bGV0IG5leHRQcm9kdWN0cztcblx0XHRpZiAodGhpcy5fc3RhcnQpIHtcblx0XHRcdG5leHRQcm9kdWN0cyA9IHRoaXMuX2Nvbm5lY3Rpb25TZXJ2aWNlLmdldCh0aGlzLl9hcGlVcmwsIHsgbGltaXQ6IHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGltaXQsIHBhZ2U6IDEgfSlcblx0XHRcdHRoaXMuX3N0YXJ0ID0gZmFsc2Vcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV4dFByb2R1Y3RzID0gdGhpcy5fY29ubmVjdGlvblNlcnZpY2UuZ2V0KHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkubGlua3MubmV4dC5zbGljZSgxKSk7XG5cdFx0fVxuXG5cdFx0IXRoaXMuX2ZpbmlzaGVkICYmIG5leHRQcm9kdWN0cy5zdWJzY3JpYmUoXG5cdFx0XHQocmVzcG9uc2U6IFBhZ2luYXRpb24pID0+IHtcblx0XHRcdFx0cmVzcG9uc2UubGlua3MgPyB0aGlzLnVwZGF0ZVBhZ2VEYXRhKHJlc3BvbnNlKSA6IHRoaXMuZmluaXNoKHJlc3BvbnNlKVxuXHRcdFx0XHR0aGlzLl9uZXh0UHJvZHVjdHNTdWJqZWN0Lm5leHQocmVzcG9uc2UuaXRlbXMpO1xuXHRcdFx0fVxuXHRcdClcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogQWN0dWFsaXphIGxvcyBkYXRvcyBkZSBsYSBwYWdpbmEuXG5cdCAqIEBwYXJhbSByZXNwb25zZSByZXNwdWVzdGEgZGVsIGJhY2tlbmQgbyBvYmplY3RvIGRlbCB0aXBvIGBQYWdpbmF0aW9uYC5cblx0ICovXG5cdHVwZGF0ZVBhZ2VEYXRhKHJlc3BvbnNlOiBQYWdpbmF0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy5fZGF0YVBhZ2luYXRpb24uc2V0KHsgLi4ucmVzcG9uc2UsIGNhbGxlZDogdHJ1ZSB9KVxuXHRcdHRoaXMuX2ZpbmlzaGVkID0gKHJlc3BvbnNlLnBhZ2UgPT0gcmVzcG9uc2UucGFnZXMpXG5cdFx0dGhpcy5fd2FpdGluZyA9IGZhbHNlO1xuXHRcdC8vIEVtaXRpciBsb3MgdmFsb3JlcyBkZSBwcmljZV9taW4geSBwcmljZV9tYXggYSB0cmF2w6lzIGRlIHByaWNlUmFuZ2VTdWJqZWN0LFxuXHRcdC8vIHBhcmEgcXVlIG90cm9zIGNvbXBvbmVudGVzIChlai4gZmlsdHJvIGRlIHByZWNpbykgcHVlZGFuIG1vc3RyYXJsb3MuXG5cdFx0dGhpcy5wcmljZVJhbmdlU3ViamVjdC5uZXh0KHtcblx0XHRcdHByaWNlX21pbjogcmVzcG9uc2UucHJpY2VfbWluLFxuXHRcdFx0cHJpY2VfbWF4OiByZXNwb25zZS5wcmljZV9tYXhcblx0XHR9KTtcblxuXHR9XG5cdC8qKlxuXHQgKiBNYXJjYSBlbCBmaW5hbCBkZSBsYXMgcGFnaW5hcywgZXMgZGVjaXIgY3VhbmRvIHlhIG5vIHF1ZWRhIG1hcyBlbGVtZW50b3MgcXVlIG1vc3RyYXIuXG5cdCAqIEBwYXJhbSByZXNwb25zZSBcblx0ICovXG5cdGZpbmlzaChyZXNwb25zZTogUGFnaW5hdGlvbik6IHZvaWQge1xuXHRcdHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZTtcblx0XHR0aGlzLl93YWl0aW5nID0gZmFsc2U7XG5cdH1cblx0LyoqXG5cdCAqIE9idGVuZ28gbG9zIHByb2R1Y3RvcyBkZSBsYSBwYWdpbmEgY2FyZ2FkYSBhY3R1YWwuIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyBnZXROZXh0UHJvZHVjdHMoKTogUHJvZHVjdFtdIHtcblx0XHRyZXR1cm4gdGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC52YWx1ZTtcblx0fVxuXHQvKipcblx0ICogRGV2dWVsdmUgc2kgZXN0YSBlc3BlcmFuZG8gbyBubyBsYSBwZXRpY2nDs24gYWwgYmFja2VuZC5cblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgZ2V0V2FpdGluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3dhaXRpbmc7IH1cblx0LyoqXG5cdCAqIFNldGVhIGxhIHZhcmlhYmxlIHdhaXRpbmcuXG5cdCAqIEBwYXJhbSB2YWx1ZSBcblx0ICovXG5cdHB1YmxpYyBzZXRXYWl0aW5nKHZhbHVlOiBib29sZWFuKTogdm9pZCB7IHRoaXMuX3dhaXRpbmcgPSB2YWx1ZSB9XG5cdC8qKlxuXHQgKiBHZXR0ZXIgcGFyYSBsYSB2YXJpYWJsZSBgX2ZpbmlzaGVkYC5cblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RmluaXNoZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9maW5pc2hlZDsgfVxuXHQvKipcblx0ICogRGV2dWVsdmUgZWwgdG90YWwgZGUgSXRlbXMuXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0cHVibGljIGdldFRvdGFsSXRlbXMoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YVBhZ2luYXRpb24oKS5saW1pdCAqIHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkucGFnZTtcblx0fVxuXHQvKipcblx0ICogT2J0ZW5nbyB1biBvYmplY3RvIGNvbiBsb3MgZGF0b3MgZGUgbG9zIGZpbHRyb3MgcmVzdWx0YW50ZXMuXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0cHVibGljIGdldEZpbHRlcnNQYWdpbmF0aW9uKCk6IGFueSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdFwiY2F0ZWdvcmllc1wiOiB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLmNhdGVnb3J5LFxuXHRcdFx0XCJhdHRyaWJ1dGVzXCI6IHRoaXMuX2RhdGFQYWdpbmF0aW9uKCkuYXR0cmlidXRlcyxcblx0XHRcdFwib3B0aW9uc1wiOiB0aGlzLl9kYXRhUGFnaW5hdGlvbigpLm9wdGlvbnNcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIFBhcmEgY29udHJ1aXN0ZSBsYSB1cmwgZW4gYmFzZSBhIGxvcyBmaWx0cm9zIGFwbGljYWRvcy5cblx0ICogQHBhcmFtIGZpbHRlcnMgXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0cHVibGljIGJ1aWxkVXJsKGZpbHRlcnM6IEZpbHRlcltdKSB7XG5cdFx0Y29uc3QgdXJsID0gdGhpcy5fY29uc3RhbnRzLnNlYXJjaFZhbHVlXG5cdFx0XHQ/IHRoaXMuX2ZpbHRlcnNTZXJ2aWNlLmdlbmVyYXRlRmluYWxBcGkodGhpcy5fY29uc3RhbnRzLnNlYXJjaFZhbHVlKVxuXHRcdFx0OiB0aGlzLl9maWx0ZXJzU2VydmljZS5nZW5lcmF0ZUZpbmFsQXBpKCk7XG5cblx0XHRyZXR1cm4gdXJsO1xuXHR9XG5cblx0LyoqXG5cdCAqIERldnVlbHZlIHVuIG9ic2VydmFibGUgZGUgbG9zIHByb2R1Y3RvcyBxdWUgZGV2b2x2acOzIGxhIMO6bHRpbWEgcMOhZ2luYSBvYnRlbmlkYS5cblx0ICogQHBhcmFtIHVybCBcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGF0YSh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8UHJvZHVjdFtdPiB7XG5cblx0XHQvLyBEZXRlY3RhciBsYSBww6FnaW5hIGRlc2RlIGxhIFVSTCAoP3BhZ2U9bikuIFNpIG5vIHZpZW5lLCBhc3VtaW1vcyBwYWdlPTEuXG5cdFx0Y29uc3QgcGFnZU1hdGNoID0gdXJsLm1hdGNoKC9bPyZdcGFnZT0oXFxkKykvKTtcblx0XHRjb25zdCBwYWdlID0gcGFnZU1hdGNoID8gTnVtYmVyKHBhZ2VNYXRjaFsxXSkgOiAxO1xuXG5cdFx0Ly8gU2kgZXMgbGEgcHJpbWVyYSBww6FnaW5hLCByZXNldGVhbW9zIGVzdGFkbyBpbnRlcm5vXG5cdFx0aWYgKHBhZ2UgPT09IDEpIHtcblx0XHRcdHRoaXMuX3Jlc2V0U3ViamVjdC5uZXh0KHRydWUpO1xuXHRcdFx0dGhpcy5fbmV4dFByb2R1Y3RzU3ViamVjdC5uZXh0KFtdKTtcblx0XHR9XG5cblx0XHQvLyBMbGFtYW1vcyBhbCBiYWNrZW5kIGNvbiBlbCBwYWdlIGNvcnJlY3RvXG5cdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25TZXJ2aWNlLmdldCh1cmwsIHsgbGltaXQ6IDEwLCBwYWdlIH0pLnBpcGUoXG5cdFx0XHR0YXAoKHJlczogUGFnaW5hdGlvbikgPT4ge1xuXHRcdFx0XHQvLyBBY3R1YWxpemFyIGRhdG9zIGRlIHBhZ2luYWNpw7NuICsgcHJpY2VfbWluL3ByaWNlX21heFxuXHRcdFx0XHRyZXMubGlua3MgPyB0aGlzLnVwZGF0ZVBhZ2VEYXRhKHJlcykgOiB0aGlzLmZpbmlzaChyZXMpO1xuXHRcdFx0fSksXG5cdFx0XHRtYXAoKHJlczogUGFnaW5hdGlvbikgPT4ge1xuXHRcdFx0XHRjb25zdCBpdGVtcyA9IHJlcy5pdGVtcyA/PyBbXTtcblxuXHRcdFx0XHQvLyBNYW50ZW5lciBuZXh0UHJvZHVjdHMkIHNpbmNyb25pemFkbyAocG9yIGNvbXBhdGliaWxpZGFkKVxuXHRcdFx0XHR0aGlzLl9uZXh0UHJvZHVjdHNTdWJqZWN0Lm5leHQoaXRlbXMpO1xuXG5cdFx0XHRcdC8vIExvIHF1ZSB2ZSBwYWdpbmF0aW9uRGF0YSQgKHN3aXRjaE1hcCkgc29uIGVzdG9zIGl0ZW1zXG5cdFx0XHRcdHJldHVybiBpdGVtcztcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxufVxuXG4iXX0=
|