@myrmidon/paged-data-browsers 2.0.4 → 3.0.0
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/fesm2022/myrmidon-paged-data-browsers.mjs +24 -16
- package/fesm2022/myrmidon-paged-data-browsers.mjs.map +1 -1
- package/lib/components/browser-tree-node/browser-tree-node.component.d.ts +5 -1
- package/package.json +7 -9
- package/esm2022/lib/components/browser-tree-node/browser-tree-node.component.mjs +0 -86
- package/esm2022/lib/components/compact-pager/compact-pager.component.mjs +0 -47
- package/esm2022/lib/components/range-view/range-view.component.mjs +0 -35
- package/esm2022/lib/paged-data-browsers.module.mjs +0 -92
- package/esm2022/lib/services/lru-cache.mjs +0 -119
- package/esm2022/lib/services/paged-list.store.mjs +0 -172
- package/esm2022/lib/services/paged-tree.store.mjs +0 -419
- package/esm2022/myrmidon-paged-data-browsers.mjs +0 -5
- package/esm2022/public-api.mjs +0 -11
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import { BehaviorSubject } from 'rxjs';
|
|
2
|
-
import { LRUCache } from './lru-cache';
|
|
3
|
-
/**
|
|
4
|
-
* Default options for the paged list store.
|
|
5
|
-
*/
|
|
6
|
-
export const DEFAULT_PAGED_LIST_STORE_OPTIONS = {
|
|
7
|
-
pageSize: 20,
|
|
8
|
-
cacheSize: 50,
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* A generic paged list store using a filter object of type F
|
|
12
|
-
* and a list of elements of type E.
|
|
13
|
-
*/
|
|
14
|
-
export class PagedListStore {
|
|
15
|
-
/**
|
|
16
|
-
* The size of nodes pages in this store. If you change it, the store
|
|
17
|
-
* is reset. The default value is 20.
|
|
18
|
-
*/
|
|
19
|
-
get pageSize() {
|
|
20
|
-
return this._pageSize;
|
|
21
|
-
}
|
|
22
|
-
set pageSize(value) {
|
|
23
|
-
if (this._pageSize === value) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
this._pageSize = value;
|
|
27
|
-
this.reset();
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Create a new paged list store.
|
|
31
|
-
* @param options Options for the paged list store.
|
|
32
|
-
*/
|
|
33
|
-
constructor(_service, options = DEFAULT_PAGED_LIST_STORE_OPTIONS) {
|
|
34
|
-
this._service = _service;
|
|
35
|
-
this._pageSize = options.pageSize;
|
|
36
|
-
this._cache = new LRUCache(options.cacheSize);
|
|
37
|
-
// page
|
|
38
|
-
this._page$ = new BehaviorSubject({
|
|
39
|
-
pageNumber: 0,
|
|
40
|
-
pageCount: 0,
|
|
41
|
-
pageSize: 0,
|
|
42
|
-
total: 0,
|
|
43
|
-
items: [],
|
|
44
|
-
});
|
|
45
|
-
this.page$ = this._page$.asObservable();
|
|
46
|
-
// filter
|
|
47
|
-
this._filter$ = new BehaviorSubject({});
|
|
48
|
-
this.filter$ = this._filter$.asObservable();
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Returns true if the store is empty, false otherwise.
|
|
52
|
-
* @returns true if the store is empty, false otherwise.
|
|
53
|
-
*/
|
|
54
|
-
isEmpty() {
|
|
55
|
-
return this._page$.value.items.length === 0;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Build the cache key for the given page number and filter.
|
|
59
|
-
* The default implementation just returns a stringified object
|
|
60
|
-
* containing the page number and the filter. You may override
|
|
61
|
-
* this method to provide a custom cache key.
|
|
62
|
-
* @param pageNumber The page number.
|
|
63
|
-
* @param filter The filter.
|
|
64
|
-
* @returns A string to be used as cache key.
|
|
65
|
-
*/
|
|
66
|
-
buildCacheKey(pageNumber, filter) {
|
|
67
|
-
if (this._customCacheKeyBuilder) {
|
|
68
|
-
return this._customCacheKeyBuilder(pageNumber, filter);
|
|
69
|
-
}
|
|
70
|
-
return JSON.stringify({ pageNumber, ...filter });
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Load the page with the given number.
|
|
74
|
-
* @param pageNumber the page number to load.
|
|
75
|
-
*/
|
|
76
|
-
loadPage(pageNumber) {
|
|
77
|
-
return this._service.loadPage(pageNumber, this._pageSize, this._filter$.value);
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Set the page with the given number.
|
|
81
|
-
* @param pageNumber The page number to load.
|
|
82
|
-
* @param pageSize The page size.
|
|
83
|
-
* @returns Promise which resolves when the page is loaded.
|
|
84
|
-
*/
|
|
85
|
-
setPage(pageNumber, pageSize) {
|
|
86
|
-
if (pageSize && pageSize !== this._pageSize) {
|
|
87
|
-
this._pageSize = pageSize;
|
|
88
|
-
}
|
|
89
|
-
return new Promise((resolve, reject) => {
|
|
90
|
-
// if page is in cache, return it
|
|
91
|
-
const key = this.buildCacheKey(pageNumber, this._filter$.value);
|
|
92
|
-
const cachedPage = this._cache.get(key);
|
|
93
|
-
if (cachedPage) {
|
|
94
|
-
this._page$.next(cachedPage);
|
|
95
|
-
resolve();
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
// else load page
|
|
99
|
-
this.loadPage(pageNumber).subscribe({
|
|
100
|
-
next: (page) => {
|
|
101
|
-
this._page$.next(page);
|
|
102
|
-
this._cache.put(key, page, 0);
|
|
103
|
-
resolve();
|
|
104
|
-
},
|
|
105
|
-
error: reject,
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Get the current page.
|
|
111
|
-
* @returns The current page.
|
|
112
|
-
*/
|
|
113
|
-
getPage() {
|
|
114
|
-
return this._page$.value;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Apply the given filter and load the first page.
|
|
118
|
-
* @param filter The filter to apply.
|
|
119
|
-
* @returns Promise which resolves when the page is loaded.
|
|
120
|
-
*/
|
|
121
|
-
setFilter(filter) {
|
|
122
|
-
return new Promise((resolve, reject) => {
|
|
123
|
-
this._filter$.next(filter);
|
|
124
|
-
this.setPage(1).then(resolve, reject);
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Get the current filter.
|
|
129
|
-
* @returns The current filter.
|
|
130
|
-
*/
|
|
131
|
-
getFilter() {
|
|
132
|
-
return this._filter$.value;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Reset the filter and load the first page. The cache is cleared.
|
|
136
|
-
* @returns Promise which resolves when the page is loaded.
|
|
137
|
-
*/
|
|
138
|
-
reset() {
|
|
139
|
-
this._cache.clear();
|
|
140
|
-
return this.setFilter({});
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Clear the store. The cache is cleared and the page is emptied.
|
|
144
|
-
*/
|
|
145
|
-
clear() {
|
|
146
|
-
this._cache.clear();
|
|
147
|
-
this._page$.next({
|
|
148
|
-
pageNumber: 0,
|
|
149
|
-
pageCount: 0,
|
|
150
|
-
pageSize: 0,
|
|
151
|
-
total: 0,
|
|
152
|
-
items: [],
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Clear the cache.
|
|
157
|
-
*/
|
|
158
|
-
clearCache() {
|
|
159
|
-
this._cache.clear();
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Check if the page with the given number and filter is in cache.
|
|
163
|
-
* @param pageNumber The page number.
|
|
164
|
-
* @param filter The filter.
|
|
165
|
-
* @returns True if the page is in cache, false otherwise.
|
|
166
|
-
*/
|
|
167
|
-
hasCachedPage(pageNumber, filter) {
|
|
168
|
-
const key = this.buildCacheKey(pageNumber, filter);
|
|
169
|
-
return this._cache.has(key);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtbGlzdC5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC1saXN0LnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFJbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXlCdkM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBMEI7SUFDckUsUUFBUSxFQUFFLEVBQUU7SUFDWixTQUFTLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFtQkY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFvQnpCOzs7T0FHRztJQUNILElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQ1UsUUFBcUMsRUFDN0MsVUFBaUMsZ0NBQWdDO1FBRHpELGFBQVEsR0FBUixRQUFRLENBQTZCO1FBRzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFjLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRCxPQUFPO1FBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBYztZQUM3QyxVQUFVLEVBQUUsQ0FBQztZQUNi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QUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZixVQUFVLEVBQUUsQ0FBQztZQUNiLFNBQVMsRUFBRSxDQUFDO1lBQ1osUUFBUSxFQUFFLENBQUM7WUFDWCxLQUFLLEVBQUUsQ0FBQztZQUNSLEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLFVBQWtCLEVBQUUsTUFBUztRQUNoRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgRGF0YVBhZ2UgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5cclxuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICcuL2xydS1jYWNoZSc7XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgdGhlIHBhZ2VkIGxpc3Qgc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkTGlzdFN0b3JlT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgcGFnZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqL1xyXG4gIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlIGZvciBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgY2FjaGVTaXplOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgY3VzdG9tIGZ1bmN0aW9uIGZvciBidWlsZGluZyB0aGUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcGFnZSBudW1iZXJcclxuICAgKiBhbmQgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgQSBzdHJpbmcgdG8gYmUgdXNlZCBhcyBjYWNoZSBrZXkuXHJcbiAgICovXHJcbiAgYnVpbGRDYWNoZUtleT86IChwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogYW55KSA9PiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBwYWdlZCBsaXN0IHN0b3JlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TOiBQYWdlZExpc3RTdG9yZU9wdGlvbnMgPSB7XHJcbiAgcGFnZVNpemU6IDIwLFxyXG4gIGNhY2hlU2l6ZTogNTAsXHJcbn07XHJcblxyXG4vKipcclxuICogVGhlIGludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc2VydmljZSB1c2VkIGJ5IFBhZ2VkTGlzdFN0b3JlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZExpc3RTdG9yZVNlcnZpY2U8RiwgRT4ge1xyXG4gIC8qKlxyXG4gICAqIExvYWQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlciB0byBsb2FkLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgcGFnZSB0byBsb2FkLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBhcHBseS5cclxuICAgKi9cclxuICBsb2FkUGFnZShcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIHBhZ2VTaXplOiBudW1iZXIsXHJcbiAgICBmaWx0ZXI6IEZcclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPEU+PjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgZ2VuZXJpYyBwYWdlZCBsaXN0IHN0b3JlIHVzaW5nIGEgZmlsdGVyIG9iamVjdCBvZiB0eXBlIEZcclxuICogYW5kIGEgbGlzdCBvZiBlbGVtZW50cyBvZiB0eXBlIEUuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGFnZWRMaXN0U3RvcmU8RiwgRT4ge1xyXG4gIHByaXZhdGUgX3BhZ2VTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY3VzdG9tQ2FjaGVLZXlCdWlsZGVyPzogKFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgZmlsdGVyOiBhbnlcclxuICApID0+IHN0cmluZztcclxuICBwcml2YXRlIF9wYWdlJDogQmVoYXZpb3JTdWJqZWN0PERhdGFQYWdlPEU+PjtcclxuICBwcml2YXRlIF9maWx0ZXIkOiBCZWhhdmlvclN1YmplY3Q8Rj47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGU6IExSVUNhY2hlPERhdGFQYWdlPEU+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHBhZ2UuIEl0IGlzIHVwZGF0ZWQgd2hlbiB0aGUgcGFnZSBpcyBjaGFuZ2VkIG9yIHRoZSBmaWx0ZXIgaXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBwdWJsaWMgcGFnZSQ6IE9ic2VydmFibGU8UmVhZG9ubHk8RGF0YVBhZ2U8RT4+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGZpbHRlci4gSXQgaXMgdXBkYXRlZCB3aGVuIHRoZSBmaWx0ZXIgaXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBwdWJsaWMgZmlsdGVyJDogT2JzZXJ2YWJsZTxSZWFkb25seTxGPj47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBzaXplIG9mIG5vZGVzIHBhZ2VzIGluIHRoaXMgc3RvcmUuIElmIHlvdSBjaGFuZ2UgaXQsIHRoZSBzdG9yZVxyXG4gICAqIGlzIHJlc2V0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyMC5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemU7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgcGFnZVNpemUodmFsdWU6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuX3BhZ2VTaXplID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IHBhZ2VkIGxpc3Qgc3RvcmUuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHBhZ2VkIGxpc3Qgc3RvcmUuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlOiBQYWdlZExpc3RTdG9yZVNlcnZpY2U8RiwgRT4sXHJcbiAgICBvcHRpb25zOiBQYWdlZExpc3RTdG9yZU9wdGlvbnMgPSBERUZBVUxUX1BBR0VEX0xJU1RfU1RPUkVfT1BUSU9OU1xyXG4gICkge1xyXG4gICAgdGhpcy5fcGFnZVNpemUgPSBvcHRpb25zLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgTFJVQ2FjaGU8RGF0YVBhZ2U8RT4+KG9wdGlvbnMuY2FjaGVTaXplKTtcclxuICAgIC8vIHBhZ2VcclxuICAgIHRoaXMuX3BhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhUGFnZTxFPj4oe1xyXG4gICAgICBwYWdlTnVtYmVyOiAwLFxyXG4gICAgICBwYWdlQ291bnQ6IDAsXHJcbiAgICAgIHBhZ2VTaXplOiAwLFxyXG4gICAgICB0b3RhbDogMCxcclxuICAgICAgaXRlbXM6IFtdLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBhZ2UkID0gdGhpcy5fcGFnZSQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAvLyBmaWx0ZXJcclxuICAgIHRoaXMuX2ZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEY+KHt9IGFzIEYpO1xyXG4gICAgdGhpcy5maWx0ZXIkID0gdGhpcy5fZmlsdGVyJC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RvcmUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBzdG9yZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2UkLnZhbHVlLml0ZW1zLmxlbmd0aCA9PT0gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlciBhbmQgZmlsdGVyLlxyXG4gICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyBhIHN0cmluZ2lmaWVkIG9iamVjdFxyXG4gICAqIGNvbnRhaW5pbmcgdGhlIHBhZ2UgbnVtYmVyIGFuZCB0aGUgZmlsdGVyLiBZb3UgbWF5IG92ZXJyaWRlXHJcbiAgICogdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYWNoZSBrZXkuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBwdWJsaWMgYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogRik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHBhZ2VOdW1iZXIsIC4uLmZpbHRlciB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIHRoZSBwYWdlIG51bWJlciB0byBsb2FkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFBhZ2UocGFnZU51bWJlcjogbnVtYmVyKTogT2JzZXJ2YWJsZTxEYXRhUGFnZTxFPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2UubG9hZFBhZ2UoXHJcbiAgICAgIHBhZ2VOdW1iZXIsXHJcbiAgICAgIHRoaXMuX3BhZ2VTaXplLFxyXG4gICAgICB0aGlzLl9maWx0ZXIkLnZhbHVlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlci5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIgdG8gbG9hZC5cclxuICAgKiBAcGFyYW0gcGFnZVNpemUgVGhlIHBhZ2Ugc2l6ZS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIHBhZ2UgaXMgbG9hZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChwYWdlU2l6ZSAmJiBwYWdlU2l6ZSAhPT0gdGhpcy5fcGFnZVNpemUpIHtcclxuICAgICAgdGhpcy5fcGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vIGlmIHBhZ2UgaXMgaW4gY2FjaGUsIHJldHVybiBpdFxyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgdGhpcy5fZmlsdGVyJC52YWx1ZSk7XHJcbiAgICAgIGNvbnN0IGNhY2hlZFBhZ2UgPSB0aGlzLl9jYWNoZS5nZXQoa2V5KTtcclxuICAgICAgaWYgKGNhY2hlZFBhZ2UpIHtcclxuICAgICAgICB0aGlzLl9wYWdlJC5uZXh0KGNhY2hlZFBhZ2UpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGVsc2UgbG9hZCBwYWdlXHJcbiAgICAgIHRoaXMubG9hZFBhZ2UocGFnZU51bWJlcikuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocGFnZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fcGFnZSQubmV4dChwYWdlKTtcclxuICAgICAgICAgIHRoaXMuX2NhY2hlLnB1dChrZXksIHBhZ2UsIDApO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCBwYWdlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHBhZ2UuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFBhZ2UoKTogRGF0YVBhZ2U8RT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2UkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgdGhlIGdpdmVuIGZpbHRlciBhbmQgbG9hZCB0aGUgZmlyc3QgcGFnZS5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gYXBwbHkuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBwYWdlIGlzIGxvYWRlZC5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0RmlsdGVyKGZpbHRlcjogRik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICAgIHRoaXMuc2V0UGFnZSgxKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmlsdGVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWx0ZXIoKTogRiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHRoZSBmaWx0ZXIgYW5kIGxvYWQgdGhlIGZpcnN0IHBhZ2UuIFRoZSBjYWNoZSBpcyBjbGVhcmVkLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIHJldHVybiB0aGlzLnNldEZpbHRlcih7fSBhcyBGKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBzdG9yZS4gVGhlIGNhY2hlIGlzIGNsZWFyZWQgYW5kIHRoZSBwYWdlIGlzIGVtcHRpZWQuXHJcbiAgICovXHJcbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIHRoaXMuX3BhZ2UkLm5leHQoe1xyXG4gICAgICBwYWdlTnVtYmVyOiAwLFxyXG4gICAgICBwYWdlQ291bnQ6IDAsXHJcbiAgICAgIHBhZ2VTaXplOiAwLFxyXG4gICAgICB0b3RhbDogMCxcclxuICAgICAgaXRlbXM6IFtdLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgY2FjaGUuXHJcbiAgICovXHJcbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIGFuZCBmaWx0ZXIgaXMgaW4gY2FjaGUuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwYWdlIGlzIGluIGNhY2hlLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGhhc0NhY2hlZFBhZ2UocGFnZU51bWJlcjogbnVtYmVyLCBmaWx0ZXI6IEYpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlLmhhcyhrZXkpO1xyXG4gIH1cclxufVxyXG4iXX0=
|