ng-http-caching 16.0.11 → 17.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -4
- package/esm2022/lib/ng-http-caching-interceptor.service.mjs +3 -3
- package/esm2022/lib/ng-http-caching.module.mjs +4 -4
- package/esm2022/lib/ng-http-caching.service.mjs +27 -15
- package/esm2022/lib/storage/ng-http-caching-browser-storage.mjs +16 -10
- package/esm2022/lib/storage/ng-http-caching-memory-storage.mjs +2 -26
- package/fesm2022/ng-http-caching.mjs +49 -55
- package/fesm2022/ng-http-caching.mjs.map +1 -1
- package/lib/ng-http-caching.service.d.ts +4 -0
- package/lib/storage/ng-http-caching-browser-storage.d.ts +9 -0
- package/lib/storage/ng-http-caching-memory-storage.d.ts +1 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -310,10 +310,12 @@ this.http.get('https://my-json-server.typicode.com/typicode/demo/db?id=1', {
|
|
|
310
310
|
|
|
311
311
|
You can override `NgHttpCachingConfig` methods:
|
|
312
312
|
```ts
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
313
|
+
{
|
|
314
|
+
isExpired?: (entry: NgHttpCachingEntry) => boolean | undefined | void;
|
|
315
|
+
isValid?: (entry: NgHttpCachingEntry) => boolean | undefined | void;
|
|
316
|
+
isCacheable?: (req: HttpRequest<any>) => boolean | undefined | void;
|
|
317
|
+
getKey?: (req: HttpRequest<any>) => string | undefined | void;
|
|
318
|
+
}
|
|
317
319
|
```
|
|
318
320
|
with `HttpContextToken`, eg.:
|
|
319
321
|
```ts
|
|
@@ -383,6 +385,11 @@ export class NgHttpCachingService {
|
|
|
383
385
|
*/
|
|
384
386
|
clearCacheByKey(key: string): boolean;
|
|
385
387
|
|
|
388
|
+
/**
|
|
389
|
+
* Clear the cache by keys
|
|
390
|
+
*/
|
|
391
|
+
clearCacheByKeys(keys: Array<string>): number;
|
|
392
|
+
|
|
386
393
|
/**
|
|
387
394
|
* Clear the cache by regex
|
|
388
395
|
*/
|
|
@@ -56,10 +56,10 @@ export class NgHttpCachingInterceptorService {
|
|
|
56
56
|
});
|
|
57
57
|
return next.handle(cloned);
|
|
58
58
|
}
|
|
59
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.
|
|
60
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.
|
|
59
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingInterceptorService, deps: [{ token: i1.NgHttpCachingService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
60
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingInterceptorService }); }
|
|
61
61
|
}
|
|
62
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingInterceptorService, decorators: [{
|
|
63
63
|
type: Injectable
|
|
64
64
|
}], ctorParameters: () => [{ type: i1.NgHttpCachingService }] });
|
|
65
65
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWludGVyY2VwdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmctaW50ZXJjZXB0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdELFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBd0Isd0JBQXdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBRzNGLE1BQU0sT0FBTywrQkFBK0I7SUFFMUMsWUFBNkIsWUFBa0M7UUFBbEMsaUJBQVksR0FBWixZQUFZLENBQXNCO0lBQUksQ0FBQztJQUVwRSxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUNoRCx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUxQixvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDcEM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxnQkFBZ0IsR0FBMkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckcsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixvREFBb0Q7WUFDcEQsT0FBTyxnQkFBZ0IsQ0FBQztTQUN6QjtRQUVELHVEQUF1RDtRQUN2RCxNQUFNLGNBQWMsR0FBa0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUYsSUFBSSxjQUFjLEVBQUU7WUFDbEIsaUNBQWlDO1lBQ2pDLE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUM5RDtRQUVELGlEQUFpRDtRQUNqRCxzREFBc0Q7UUFDdEQsbUNBQW1DO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDN0MsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1YsSUFBSSxLQUFLLFlBQVksWUFBWSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDbEQ7UUFDSCxDQUFDLENBQUMsRUFDRixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1oseUJBQXlCO1lBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxFQUNGLFdBQVcsRUFBRSxDQUNkLENBQUM7UUFFRiwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTFDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxHQUFxQixFQUFFLElBQWlCO1FBQ2xELElBQUksTUFBTSxHQUFxQixHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0MsMENBQTBDO1FBQzFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQ3RELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsRUFBRTtnQkFDNUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDakY7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDOzhHQTdEVSwrQkFBK0I7a0hBQS9CLCtCQUErQjs7MkZBQS9CLCtCQUErQjtrQkFEM0MsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFdmVudCwgSHR0cEhhbmRsZXIsIEh0dHBJbnRlcmNlcHRvciwgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBhc3luY1NjaGVkdWxlciwgT2JzZXJ2YWJsZSwgb2YsIHNjaGVkdWxlZCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAsIGZpbmFsaXplLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ1NlcnZpY2UsIE5nSHR0cENhY2hpbmdIZWFkZXJzTGlzdCB9IGZyb20gJy4vbmctaHR0cC1jYWNoaW5nLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmdIdHRwQ2FjaGluZ0ludGVyY2VwdG9yU2VydmljZSBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2FjaGVTZXJ2aWNlOiBOZ0h0dHBDYWNoaW5nU2VydmljZSkgeyB9XHJcblxyXG4gIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gICAgLy8gcnVuIGdhcmJhZ2UgY29sbGVjdG9yXHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5ydW5HYygpO1xyXG5cclxuICAgIC8vIERvbid0IGNhY2hlIGlmIGl0J3Mgbm90IGNhY2hlYWJsZVxyXG4gICAgaWYgKCF0aGlzLmNhY2hlU2VydmljZS5pc0NhY2hlYWJsZShyZXEpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KHJlcSwgbmV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2tlZCBpZiB0aGVyZSBpcyBwZW5kaW5nIHJlc3BvbnNlIGZvciB0aGlzIHJlcXVlc3RcclxuICAgIGNvbnN0IGNhY2hlZE9ic2VydmFibGU6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHwgdW5kZWZpbmVkID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0RnJvbVF1ZXVlKHJlcSk7XHJcbiAgICBpZiAoY2FjaGVkT2JzZXJ2YWJsZSkge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnY2FjaGVkT2JzZXJ2YWJsZScsY2FjaGVkT2JzZXJ2YWJsZSk7XHJcbiAgICAgIHJldHVybiBjYWNoZWRPYnNlcnZhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrZWQgaWYgdGhlcmUgaXMgY2FjaGVkIHJlc3BvbnNlIGZvciB0aGlzIHJlcXVlc3RcclxuICAgIGNvbnN0IGNhY2hlZFJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55PiB8IHVuZGVmaW5lZCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldEZyb21DYWNoZShyZXEpO1xyXG4gICAgaWYgKGNhY2hlZFJlc3BvbnNlKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWNoZWRSZXNwb25zZScpO1xyXG4gICAgICByZXR1cm4gc2NoZWR1bGVkKG9mKGNhY2hlZFJlc3BvbnNlLmNsb25lKCkpLCBhc3luY1NjaGVkdWxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIHJlcXVlc3Qgb2YgZ29pbmcgdGhyb3VnaCBmb3IgZmlyc3QgdGltZVxyXG4gICAgLy8gdGhlbiBsZXQgdGhlIHJlcXVlc3QgcHJvY2VlZCBhbmQgY2FjaGUgdGhlIHJlc3BvbnNlXHJcbiAgICAvLyBjb25zb2xlLmxvZygnc2VuZFJlcXVlc3QnLCByZXEpO1xyXG4gICAgY29uc3Qgc2hhcmVkID0gdGhpcy5zZW5kUmVxdWVzdChyZXEsIG5leHQpLnBpcGUoXHJcbiAgICAgIHRhcChldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5hZGRUb0NhY2hlKHJlcSwgZXZlbnQuY2xvbmUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIC8vIGRlbGV0ZSBwZW5kaW5nIHJlcXVlc3RcclxuICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5kZWxldGVGcm9tUXVldWUocmVxKTtcclxuICAgICAgfSksXHJcbiAgICAgIHNoYXJlUmVwbGF5KClcclxuICAgICk7XHJcblxyXG4gICAgLy8gYWRkIHBlbmRpbmcgcmVxdWVzdCB0byBxdWV1ZSBmb3IgY2FjaGUgcGFyYWxsZWwgcmVxdWVzdFxyXG4gICAgdGhpcy5jYWNoZVNlcnZpY2UuYWRkVG9RdWV1ZShyZXEsIHNoYXJlZCk7XHJcblxyXG4gICAgcmV0dXJuIHNoYXJlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgaHR0cCByZXF1ZXN0IChuZXh0IGhhbmRsZXIpXHJcbiAgICovXHJcbiAgc2VuZFJlcXVlc3QocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgIGxldCBjbG9uZWQ6IEh0dHBSZXF1ZXN0PGFueT4gPSByZXEuY2xvbmUoKTtcclxuICAgIC8vIHRyaW0gY3VzdG9tIGhlYWRlcnMgYmVmb3JlIHNlbmQgcmVxdWVzdFxyXG4gICAgTmdIdHRwQ2FjaGluZ0hlYWRlcnNMaXN0LmZvckVhY2gobmdIdHRwQ2FjaGluZ0hlYWRlcnMgPT4ge1xyXG4gICAgICBpZiAoY2xvbmVkLmhlYWRlcnMuaGFzKG5nSHR0cENhY2hpbmdIZWFkZXJzKSkge1xyXG4gICAgICAgIGNsb25lZCA9IGNsb25lZC5jbG9uZSh7IGhlYWRlcnM6IGNsb25lZC5oZWFkZXJzLmRlbGV0ZShuZ0h0dHBDYWNoaW5nSGVhZGVycykgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKGNsb25lZCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -15,9 +15,9 @@ export class NgHttpCachingModule {
|
|
|
15
15
|
],
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.
|
|
19
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.
|
|
20
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.
|
|
18
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
19
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingModule }); }
|
|
20
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingModule, providers: [
|
|
21
21
|
NgHttpCachingService,
|
|
22
22
|
NgHttpCachingInterceptorService,
|
|
23
23
|
{
|
|
@@ -27,7 +27,7 @@ export class NgHttpCachingModule {
|
|
|
27
27
|
},
|
|
28
28
|
] }); }
|
|
29
29
|
}
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingModule, decorators: [{
|
|
31
31
|
type: NgModule,
|
|
32
32
|
args: [{
|
|
33
33
|
providers: [
|
|
@@ -135,34 +135,44 @@ export class NgHttpCachingService {
|
|
|
135
135
|
clearCacheByKey(key) {
|
|
136
136
|
return this.config.store.delete(key);
|
|
137
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Clear the cache by keys
|
|
140
|
+
*/
|
|
141
|
+
clearCacheByKeys(keys) {
|
|
142
|
+
let counter = 0;
|
|
143
|
+
if (keys) {
|
|
144
|
+
for (const key of keys) {
|
|
145
|
+
if (this.clearCacheByKey(key)) {
|
|
146
|
+
counter++;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return counter;
|
|
151
|
+
}
|
|
138
152
|
/**
|
|
139
153
|
* Clear the cache by regex
|
|
140
154
|
*/
|
|
141
155
|
clearCacheByRegex(regex) {
|
|
142
|
-
|
|
156
|
+
const keys = [];
|
|
143
157
|
this.config.store.forEach((_, key) => {
|
|
144
158
|
if (regex.test(key)) {
|
|
145
|
-
|
|
146
|
-
count++;
|
|
147
|
-
}
|
|
159
|
+
keys.push(key);
|
|
148
160
|
}
|
|
149
161
|
});
|
|
150
|
-
return
|
|
162
|
+
return this.clearCacheByKeys(keys);
|
|
151
163
|
}
|
|
152
164
|
/**
|
|
153
165
|
* Clear the cache by TAG
|
|
154
166
|
*/
|
|
155
167
|
clearCacheByTag(tag) {
|
|
156
|
-
|
|
168
|
+
const keys = [];
|
|
157
169
|
this.config.store.forEach((entry, key) => {
|
|
158
170
|
const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);
|
|
159
171
|
if (tagHeader && tagHeader.split(',').includes(tag)) {
|
|
160
|
-
|
|
161
|
-
count++;
|
|
162
|
-
}
|
|
172
|
+
keys.push(key);
|
|
163
173
|
}
|
|
164
174
|
});
|
|
165
|
-
return
|
|
175
|
+
return this.clearCacheByKeys(keys);
|
|
166
176
|
}
|
|
167
177
|
/**
|
|
168
178
|
* Run garbage collector (delete expired cache entry)
|
|
@@ -172,11 +182,13 @@ export class NgHttpCachingService {
|
|
|
172
182
|
return false;
|
|
173
183
|
}
|
|
174
184
|
this.gcLock = true;
|
|
185
|
+
const keys = [];
|
|
175
186
|
this.config.store.forEach((entry, key) => {
|
|
176
187
|
if (this.isExpired(entry)) {
|
|
177
|
-
|
|
188
|
+
keys.push(key);
|
|
178
189
|
}
|
|
179
190
|
});
|
|
191
|
+
this.clearCacheByKeys(keys);
|
|
180
192
|
this.gcLock = false;
|
|
181
193
|
return true;
|
|
182
194
|
}
|
|
@@ -367,10 +379,10 @@ export class NgHttpCachingService {
|
|
|
367
379
|
Object.keys(object).forEach(key => this.deepFreeze(object[key]));
|
|
368
380
|
return object;
|
|
369
381
|
}
|
|
370
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.
|
|
371
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.
|
|
382
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingService, deps: [{ token: NG_HTTP_CACHING_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
383
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingService }); }
|
|
372
384
|
}
|
|
373
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.
|
|
385
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingService, decorators: [{
|
|
374
386
|
type: Injectable
|
|
375
387
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
376
388
|
type: Inject,
|
|
@@ -378,4 +390,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImpor
|
|
|
378
390
|
}, {
|
|
379
391
|
type: Optional
|
|
380
392
|
}] }] });
|
|
381
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUF3QyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUczRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFJdEYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBdUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsS0FBMkIsRUFBRSxVQUF1QixJQUFJLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFBO0FBeUI5SixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FDdEQsd0JBQXdCLENBQ3pCLENBQUM7QUFFRixNQUFNLENBQU4sSUFBWSxxQkFTWDtBQVRELFdBQVkscUJBQXFCO0lBQy9COztPQUVHO0lBQ0gsZ0RBQXVCLENBQUE7SUFDdkI7O09BRUc7SUFDSCxzREFBNkIsQ0FBQTtBQUMvQixDQUFDLEVBVFcscUJBQXFCLEtBQXJCLHFCQUFxQixRQVNoQztBQUVELE1BQU0sQ0FBTixJQUFZLG9CQWtCWDtBQWxCRCxXQUFZLG9CQUFvQjtJQUM5Qjs7T0FFRztJQUNILHFFQUE2QyxDQUFBO0lBQzdDOztPQUVHO0lBQ0gsMkVBQW1ELENB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QztJQUMvQixDQUFDOzhHQTdWVSxvQkFBb0Isa0JBV3JCLHNCQUFzQjtrSEFYckIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkFZTixNQUFNOzJCQUFDLHNCQUFzQjs7MEJBQUcsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3QsIE9wdGlvbmFsLCBWRVJTSU9OLCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwQ29udGV4dFRva2VuLCBIdHRwQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvT2JzZXJ2YWJsZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIH0gZnJvbSAnLi9zdG9yYWdlL25nLWh0dHAtY2FjaGluZy1zdG9yYWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdNZW1vcnlTdG9yYWdlIH0gZnJvbSAnLi9zdG9yYWdlL25nLWh0dHAtY2FjaGluZy1tZW1vcnktc3RvcmFnZSc7XHJcblxyXG5leHBvcnQgdHlwZSBOZ0h0dHBDYWNoaW5nQ29udGV4dCA9IFBpY2s8TmdIdHRwQ2FjaGluZ0NvbmZpZywgJ2dldEtleScgfCAnaXNDYWNoZWFibGUnIHwgJ2lzRXhwaXJlZCcgfCAnaXNWYWxpZCc+O1xyXG5cclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19DT05URVhUID0gbmV3IEh0dHBDb250ZXh0VG9rZW48TmdIdHRwQ2FjaGluZ0NvbnRleHQ+KCgpID0+ICh7fSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IHdpdGhOZ0h0dHBDYWNoaW5nQ29udGV4dCA9ICh2YWx1ZTogTmdIdHRwQ2FjaGluZ0NvbnRleHQsIGNvbnRleHQ6IEh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCkpID0+IGNvbnRleHQuc2V0KE5HX0hUVFBfQ0FDSElOR19DT05URVhULCB2YWx1ZSlcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdIdHRwQ2FjaGluZ0VudHJ5PEsgPSBhbnksIFQgPSBhbnk+IHtcclxuICAvKipcclxuICAgKiBVUkxcclxuICAgKi9cclxuICB1cmw6IHN0cmluZztcclxuICAvKipcclxuICAgKiBIdHRwUmVzcG9uc2VcclxuICAgKi9cclxuICByZXNwb25zZTogSHR0cFJlc3BvbnNlPFQ+O1xyXG4gIC8qKlxyXG4gICAqIEh0dHBSZXF1ZXN0XHJcbiAgICovXHJcbiAgcmVxdWVzdDogSHR0cFJlcXVlc3Q8Sz47XHJcbiAgLyoqXHJcbiAgICogVGltZXN0YW1wIG9mIGFkZCB0byBjYWNoZSB0aW1lXHJcbiAgICovXHJcbiAgYWRkZWRUaW1lOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogQ2FjaGUgdmVyc2lvblxyXG4gICAqL1xyXG4gIHZlcnNpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48TmdIdHRwQ2FjaGluZ0NvbnRleHQ+KFxyXG4gICduZy1odHRwLWNhY2hpbmcuY29uZmlnJ1xyXG4pO1xyXG5cclxuZXhwb3J0IGVudW0gTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5IHtcclxuICAvKipcclxuICAgKiBBbGwgcmVxdWVzdCBhcmUgY2FjaGVhYmxlIGlmIEhUVFAgbWV0aG9kIGlzIGludG8gYGFsbG93ZWRNZXRob2RgXHJcbiAgICovXHJcbiAgQUxMT1dfQUxMID0gJ0FMTE9XX0FMTCcsXHJcbiAgLyoqXHJcbiAgICogT25seSB0aGUgcmVxdWVzdCB3aXRoIGBYLU5HLUhUVFAtQ0FDSElORy1BTExPVy1DQUNIRWAgaGVhZGVyIGFyZSBjYWNoZWFibGUgaWYgSFRUUCBtZXRob2QgaXMgaW50byBgYWxsb3dlZE1ldGhvZGBcclxuICAgKi9cclxuICBESVNBTExPV19BTEwgPSAnRElTQUxMT1dfQUxMJ1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBOZ0h0dHBDYWNoaW5nSGVhZGVycyB7XHJcbiAgLyoqXHJcbiAgICogUmVxdWVzdCBpcyBjYWNoZWFibGUgaWYgSFRUUCBtZXRob2QgaXMgaW50byBgYWxsb3dlZE1ldGhvZGBcclxuICAgKi9cclxuICBBTExPV19DQUNIRSA9ICdYLU5HLUhUVFAtQ0FDSElORy1BTExPVy1DQUNIRScsXHJcbiAgLyoqXHJcbiAgICogUmVxdWVzdCBpc24ndCBjYWNoZWFibGVcclxuICAgKi9cclxuICBESVNBTExPV19DQUNIRSA9ICdYLU5HLUhUVFAtQ0FDSElORy1ESVNBTExPVy1DQUNIRScsXHJcbiAgLyoqXHJcbiAgICogU3BlY2lmaWMgY2FjaGUgbGlmZXRpbWUgZm9yIHRoZSByZXF1ZXN0XHJcbiAgICovXHJcbiAgTElGRVRJTUUgPSAnWC1ORy1IVFRQLUNBQ0hJTkctTElGRVRJTUUnLFxyXG4gIC8qKlxyXG4gICAqIFlvdSBjYW4gdGFnIG11bHRpcGxlIHJlcXVlc3QgYnkgYWRkaW5nIHRoaXMgaGVhZGVyIHdpdGggdGhlIHNhbWUgdGFnIGFuZCBcclxuICAgKiB1c2luZyBgTmdIdHRwQ2FjaGluZ1NlcnZpY2UuY2xlYXJDYWNoZUJ5VGFnKHRhZzogc3RyaW5nKWAgZm9yIGRlbGV0ZSBhbGwgdGhlIHRhZ2dlZCByZXF1ZXN0XHJcbiAgICovXHJcbiAgVEFHID0gJ1gtTkctSFRUUC1DQUNISU5HLVRBRydcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5nSHR0cENhY2hpbmdIZWFkZXJzTGlzdCA9IE9iamVjdC52YWx1ZXMoTmdIdHRwQ2FjaGluZ0hlYWRlcnMpO1xyXG5cclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19TRUNPTkRfSU5fTVMgPSAxMDAwO1xyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX01JTlVURV9JTl9NUyA9IE5HX0hUVFBfQ0FDSElOR19TRUNPTkRfSU5fTVMgKiA2MDtcclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19IT1VSX0lOX01TID0gTkdfSFRUUF9DQUNISU5HX01JTlVURV9JTl9NUyAqIDYwO1xyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX0RBWV9JTl9NUyA9IE5HX0hUVFBfQ0FDSElOR19IT1VSX0lOX01TICogMjQ7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfV0VFS19JTl9NUyA9IE5HX0hUVFBfQ0FDSElOR19EQVlfSU5fTVMgKiA3O1xyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX01PTlRIX0lOX01TID0gTkdfSFRUUF9DQUNISU5HX0RBWV9JTl9NUyAqIDMwO1xyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX1lFQVJfSU5fTVMgPSBOR19IVFRQX0NBQ0hJTkdfREFZX0lOX01TICogMzY1O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOZ0h0dHBDYWNoaW5nQ29uZmlnIHtcclxuICAvKipcclxuICAgKiBTZXQgdGhlIGNhY2hlIHN0b3JlLiBZb3UgY2FuIGltcGxlbWVudCB5b3VyIGN1c3RvbSBzdG9yZSBieSBpbXBsZW1lbnQgdGhlIGBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZWAgaW50ZXJmYWNlLCBlZy46XHJcbiAgICovXHJcbiAgc3RvcmU/OiBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZTtcclxuICAvKipcclxuICAgKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmQgdGhhdCBhIHJlc3BvbnNlIGlzIHN0b3JlZCBpbiB0aGUgY2FjaGUuIFxyXG4gICAqIFlvdSBjYW4gc2V0IHNwZWNpZmljIFwibGlmZXRpbWVcIiBmb3IgZWFjaCByZXF1ZXN0IGJ5IGFkZCB0aGUgaGVhZGVyIGBYLU5HLUhUVFAtQ0FDSElORy1MSUZFVElNRWAgKHNlZSBleGFtcGxlIGJlbG93KS5cclxuICAgKi9cclxuICBsaWZldGltZT86IG51bWJlcjtcclxuICAvKipcclxuICAgKiBBcnJheSBvZiBhbGxvd2VkIEhUVFAgbWV0aG9kcyB0byBjYWNoZS4gXHJcbiAgICogWW91IGNhbiBhbGxvdyBtdWx0aXBsZSBtZXRob2RzLCBlZy46IGBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnLCAnSEVBRCddYCBvciBcclxuICAgKiBhbGxvdyBhbGwgbWV0aG9kcyBieTogYFsnQUxMJ11gLiBJZiBgYWxsb3dlZE1ldGhvZGAgaXMgYW4gZW1wdHkgYXJyYXkgKGBbXWApLCBubyByZXNwb25zZSBhcmUgY2FjaGVkLlxyXG4gICAqICpXYXJuaW5nISogYE5nSHR0cENhY2hpbmdgIHVzZSB0aGUgZnVsbCB1cmwgKHVybCB3aXRoIHF1ZXJ5IHBhcmFtZXRlcnMpIGFzIHVuaXF1ZSBrZXkgZm9yIHRoZSBjYWNoZWQgcmVzcG9uc2UsXHJcbiAgICogdGhpcyBpcyBjb3JyZWN0IGZvciB0aGUgYEdFVGAgcmVxdWVzdCBidXQgaXMgX3BvdGVudGlhbGx5XyB3cm9uZyBmb3Igb3RoZXIgdHlwZSBvZiByZXF1ZXN0IChlZy4gYFBPU1RgLCBgUFVUYCkuIFxyXG4gICAqIFlvdSBjYW4gc2V0IGEgZGlmZmVyZW50IFwia2V5XCIgYnkgY3VzdG9taXppbmcgdGhlIGBnZXRLZXlgIGNvbmZpZyBtZXRob2QgKHNlZSBgZ2V0S2V5YCBzZWN0aW9uKS5cclxuICAgKi9cclxuICBhbGxvd2VkTWV0aG9kPzogc3RyaW5nW107XHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBjYWNoZSBzdHJhdGVneSwgcG9zc2libGUgc3RyYXRlZ2llcyBhcmU6XHJcbiAgICogLSBgTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkFMTE9XX0FMTGA6IEFsbCByZXF1ZXN0IGFyZSBjYWNoZWFibGUgaWYgSFRUUCBtZXRob2QgaXMgaW50byBgYWxsb3dlZE1ldGhvZGA7XHJcbiAgICogLSBgTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkRJU0FMTE9XX0FMTGA6IE9ubHkgdGhlIHJlcXVlc3Qgd2l0aCBgWC1ORy1IVFRQLUNBQ0hJTkctQUxMT1ctQ0FDSEVgIGhlYWRlciBhcmUgY2FjaGVhYmxlIGlmIEhUVFAgbWV0aG9kIGlzIGludG8gYGFsbG93ZWRNZXRob2RgO1xyXG4gICAqL1xyXG4gIGNhY2hlU3RyYXRlZ3k/OiBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3k7XHJcbiAgLyoqXHJcbiAgICogQ2FjaGUgdmVyc2lvbi4gV2hlbiB5b3UgaGF2ZSBhIGJyZWFraW5nIGNoYW5nZSwgY2hhbmdlIHRoZSB2ZXJzaW9uLCBhbmQgaXQnbGwgZGVsZXRlIHRoZSBjdXJyZW50IGNhY2hlIGF1dG9tYXRpY2FsbHkuXHJcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgQW5ndWxhciBtYWpvciB2ZXJzaW9uIChlZy4gMTMpLCBpbiB0aGlzIHdheSwgdGhlIGNhY2hlIGlzIGludmFsaWRhdGVkIG9uIGV2ZXJ5IEFuZ3VsYXIgdXBncmFkZS5cclxuICAgKi9cclxuICB2ZXJzaW9uPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJuIGB0cnVlYCB0aGUgcmVxdWVzdCBpcyBleHBpcmVkIGFuZCBhIG5ldyByZXF1ZXN0IGlzIHNlbmQgdG8gYmFja2VuZCwgaWYgcmV0dXJuIGBmYWxzZWAgaXNuJ3QgZXhwaXJlZC4gXHJcbiAgICogSWYgdGhlIHJlc3VsdCBpcyBgdW5kZWZpbmVkYCwgdGhlIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWQuXHJcbiAgICovXHJcbiAgaXNFeHBpcmVkPzogPEssIFQ+KGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQgfCB2b2lkO1xyXG4gIC8qKlxyXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJuIGB0cnVlYCB0aGUgcmVxdWVzdCBpcyBjYWNoZWFibGUsIGlmIHJldHVybiBgZmFsc2VgIGlzbid0IGNhY2hlYWJsZS4gXHJcbiAgICogSWYgdGhlIHJlc3VsdCBpcyBgdW5kZWZpbmVkYCwgdGhlIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWQuXHJcbiAgICovXHJcbiAgaXNDYWNoZWFibGU/OiA8Sz4ocmVxOiBIdHRwUmVxdWVzdDxLPikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZCB8IHZvaWQ7XHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiByZXR1cm4gdGhlIHVuaXF1ZSBrZXkgKGBzdHJpbmdgKSBmb3Igc3RvcmUgdGhlIHJlc3BvbnNlIGludG8gdGhlIGNhY2hlLiBcclxuICAgKiBJZiB0aGUgcmVzdWx0IGlzIGB1bmRlZmluZWRgLCB0aGUgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZC5cclxuICAgKi9cclxuICBnZXRLZXk/OiA8Sz4ocmVxOiBIdHRwUmVxdWVzdDxLPikgPT4gc3RyaW5nIHwgdW5kZWZpbmVkIHwgdm9pZDtcclxuICAvKipcclxuICAgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybiBgdHJ1ZWAgdGhlIGNhY2hlIGVudHJ5IGlzIHZhbGlkIGFuZCBjYW4gYmUgc3RvcmVkLCBpZiByZXR1cm4gYGZhbHNlYCBpc24ndCB2YWxpZC4gXHJcbiAgICogSWYgdGhlIHJlc3VsdCBpcyBgdW5kZWZpbmVkYCwgdGhlIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWQuXHJcbiAgICovXHJcbiAgaXNWYWxpZD86IDxLLCBUPihlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkIHwgdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOZ0h0dHBDYWNoaW5nRGVmYXVsdENvbmZpZyBleHRlbmRzIE5nSHR0cENhY2hpbmdDb25maWcge1xyXG4gIHN0b3JlOiBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZTtcclxuICBsaWZldGltZTogbnVtYmVyO1xyXG4gIGFsbG93ZWRNZXRob2Q6IHN0cmluZ1tdO1xyXG4gIGNhY2hlU3RyYXRlZ3k6IE5nSHR0cENhY2hpbmdTdHJhdGVneTtcclxuICB2ZXJzaW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBOZ0h0dHBDYWNoaW5nQ29uZmlnRGVmYXVsdDogUmVhZG9ubHk8TmdIdHRwQ2FjaGluZ0RlZmF1bHRDb25maWc+ID0ge1xyXG4gIHN0b3JlOiBuZXcgTmdIdHRwQ2FjaGluZ01lbW9yeVN0b3JhZ2UoKSxcclxuICBsaWZldGltZTogTkdfSFRUUF9DQUNISU5HX0hPVVJfSU5fTVMsXHJcbiAgdmVyc2lvbjogVkVSU0lPTi5tYWpvcixcclxuICBhbGxvd2VkTWV0aG9kOiBbJ0dFVCcsICdIRUFEJ10sXHJcbiAgY2FjaGVTdHJhdGVneTogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkFMTE9XX0FMTCxcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdTZXJ2aWNlIHtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBxdWV1ZSA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pj4oKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE5nSHR0cENhY2hpbmdEZWZhdWx0Q29uZmlnO1xyXG5cclxuICBwcml2YXRlIGdjTG9jayA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGRldk1vZGU6IGJvb2xlYW4gPSBpc0Rldk1vZGUoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KE5HX0hUVFBfQ0FDSElOR19DT05GSUcpIEBPcHRpb25hbCgpIGNvbmZpZzogUmVhZG9ubHk8TmdIdHRwQ2FjaGluZ0NvbmZpZz5cclxuICApIHtcclxuICAgIGlmIChjb25maWcpIHtcclxuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLk5nSHR0cENhY2hpbmdDb25maWdEZWZhdWx0LCAuLi5jb25maWcgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29uZmlnID0geyAuLi5OZ0h0dHBDYWNoaW5nQ29uZmlnRGVmYXVsdCB9O1xyXG4gICAgfVxyXG4gICAgLy8gc3RhcnQgY2FjaGUgY2xlYW5cclxuICAgIHRoaXMucnVuR2MoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgY29uZmlnXHJcbiAgICovXHJcbiAgZ2V0Q29uZmlnKCk6IFJlYWRvbmx5PE5nSHR0cENhY2hpbmdDb25maWc+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgcXVldWUgbWFwXHJcbiAgICovXHJcbiAgZ2V0UXVldWUoKTogUmVhZG9ubHk8TWFwPHN0cmluZywgT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWV1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgY2FjaGUgc3RvcmVcclxuICAgKi9cclxuICBnZXRTdG9yZSgpOiBSZWFkb25seTxOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnN0b3JlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHJlc3BvbnNlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBnZXRGcm9tQ2FjaGU8SywgVD4ocmVxOiBIdHRwUmVxdWVzdDxLPik6IFJlYWRvbmx5PEh0dHBSZXNwb25zZTxUPj4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgY29uc3QgY2FjaGVkOiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4gfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZy5zdG9yZS5nZXQ8SywgVD4oa2V5KTtcclxuXHJcbiAgICBpZiAoIWNhY2hlZCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzRXhwaXJlZChjYWNoZWQpKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGVlcEZyZWV6ZShjYWNoZWQucmVzcG9uc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIHJlc3BvbnNlIHRvIGNhY2hlXHJcbiAgICovXHJcbiAgYWRkVG9DYWNoZTxLLCBUPihyZXE6IEh0dHBSZXF1ZXN0PEs+LCByZXM6IEh0dHBSZXNwb25zZTxUPik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPiA9IHtcclxuICAgICAgdXJsOiByZXEudXJsV2l0aFBhcmFtcyxcclxuICAgICAgcmVzcG9uc2U6IHJlcyxcclxuICAgICAgcmVxdWVzdDogcmVxLFxyXG4gICAgICBhZGRlZFRpbWU6IERhdGUubm93KCksXHJcbiAgICAgIHZlcnNpb246IHRoaXMuY29uZmlnLnZlcnNpb24sXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZChlbnRyeSkpIHtcclxuICAgICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgICB0aGlzLmNvbmZpZy5zdG9yZS5zZXQoa2V5LCBlbnRyeSk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIHJlc3BvbnNlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBkZWxldGVGcm9tQ2FjaGU8Sz4ocmVxOiBIdHRwUmVxdWVzdDxLPik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xlYXJDYWNoZUJ5S2V5KGtleSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgY2FjaGVcclxuICAgKi9cclxuICBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcuc3RvcmUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSBrZXlcclxuICAgKi9cclxuICBjbGVhckNhY2hlQnlLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5zdG9yZS5kZWxldGUoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSByZWdleFxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGVCeVJlZ2V4PEssIFQ+KHJlZ2V4OiBSZWdFeHApOiBudW1iZXIge1xyXG4gICAgbGV0IGNvdW50ID0gMDtcclxuICAgIHRoaXMuY29uZmlnLnN0b3JlLmZvckVhY2g8SywgVD4oKF86IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPiwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpKSB7XHJcbiAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY291bnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgY2FjaGUgYnkgVEFHXHJcbiAgICovXHJcbiAgY2xlYXJDYWNoZUJ5VGFnPEssIFQ+KHRhZzogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICB0aGlzLmNvbmZpZy5zdG9yZS5mb3JFYWNoPEssIFQ+KChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCB0YWdIZWFkZXIgPSBlbnRyeS5yZXF1ZXN0LmhlYWRlcnMuZ2V0KE5nSHR0cENhY2hpbmdIZWFkZXJzLlRBRyk7XHJcbiAgICAgIGlmICh0YWdIZWFkZXIgJiYgdGFnSGVhZGVyLnNwbGl0KCcsJykuaW5jbHVkZXModGFnKSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpKSB7XHJcbiAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY291bnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSdW4gZ2FyYmFnZSBjb2xsZWN0b3IgKGRlbGV0ZSBleHBpcmVkIGNhY2hlIGVudHJ5KVxyXG4gICAqL1xyXG4gIHJ1bkdjPEssIFQ+KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZ2NMb2NrKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2NMb2NrID0gdHJ1ZTtcclxuICAgIHRoaXMuY29uZmlnLnN0b3JlLmZvckVhY2g8SywgVD4oKGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4sIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzRXhwaXJlZChlbnRyeSkpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ2NMb2NrID0gZmFsc2U7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIGNhY2hlIGVudHJ5IGlzIGV4cGlyZWRcclxuICAgKi9cclxuICBpc0V4cGlyZWQ8SywgVD4oZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPik6IGJvb2xlYW4ge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgY29uc3QgY29udGV4dCA9IGVudHJ5LnJlcXVlc3QuY29udGV4dC5nZXQoTkdfSFRUUF9DQUNISU5HX0NPTlRFWFQpO1xyXG4gICAgaWYgKHR5cGVvZiBjb250ZXh0Py5pc0V4cGlyZWQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5pc0V4cGlyZWQoZW50cnkpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcuaXNFeHBpcmVkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmlzRXhwaXJlZChlbnRyeSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaWYgdmVyc2lvbiBjaGFuZ2UsIGFsd2F5cyBleHBpcmVcclxuICAgIGlmICh0aGlzLmNvbmZpZy52ZXJzaW9uICE9PSBlbnRyeS52ZXJzaW9uKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLy8gY29uZmlnL2RlZmF1bHQgbGlmZXRpbWVcclxuICAgIGxldCBsaWZldGltZTogbnVtYmVyID0gdGhpcy5jb25maWcubGlmZXRpbWU7XHJcbiAgICAvLyByZXF1ZXN0IGhhcyBvd24gbGlmZXRpbWVcclxuICAgIGNvbnN0IGhlYWRlckxpZmV0aW1lID0gZW50cnkucmVxdWVzdC5oZWFkZXJzLmdldChOZ0h0dHBDYWNoaW5nSGVhZGVycy5MSUZFVElNRSk7XHJcbiAgICBpZiAoaGVhZGVyTGlmZXRpbWUpIHtcclxuICAgICAgbGlmZXRpbWUgPSAraGVhZGVyTGlmZXRpbWU7XHJcbiAgICB9XHJcbiAgICAvLyBuZXZlciBleHBpcmUgaWYgMFxyXG4gICAgaWYgKGxpZmV0aW1lID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIHdyb25nIGxpZmV0aW1lXHJcbiAgICBpZiAobGlmZXRpbWUgPCAwIHx8IGlzTmFOKGxpZmV0aW1lKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xpZmV0aW1lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIDAnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbnRyeS5hZGRlZFRpbWUgKyBsaWZldGltZSA8IERhdGUubm93KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBjYWNoZSBlbnRyeSBpcyB2YWxpZCBmb3Igc3RvcmUgaW4gdGhlIGNhY2hlXHJcbiAgICogRGVmYXVsdCBiZWhhdmlvdXIgaXMgd2hldGhlciB0aGUgc3RhdHVzIGNvZGUgZmFsbHMgaW4gdGhlIDJ4eCByYW5nZS5cclxuICAgKi9cclxuICBpc1ZhbGlkPEssIFQ+KGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBlbnRyeS5yZXF1ZXN0LmNvbnRleHQuZ2V0KE5HX0hUVFBfQ0FDSElOR19DT05URVhUKTtcclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgY29udGV4dC5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuaXNWYWxpZChlbnRyeSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmlzVmFsaWQoZW50cnkpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGRpZmZlcmVudCB2ZXJzaW9uXHJcbiAgICBpZiAodGhpcy5jb25maWcudmVyc2lvbiAhPT0gZW50cnkudmVyc2lvbikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50cnkucmVzcG9uc2Uub2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBjYWNoZWFibGVcclxuICAgKi9cclxuICBpc0NhY2hlYWJsZTxLPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gcmVxLmNvbnRleHQuZ2V0KE5HX0hUVFBfQ0FDSElOR19DT05URVhUKTtcclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgY29udGV4dD8uaXNDYWNoZWFibGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5pc0NhY2hlYWJsZShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcuaXNDYWNoZWFibGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb25maWcuaXNDYWNoZWFibGUocmVxKTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyByZXF1ZXN0IGhhcyBkaXNhbGxvdyBjYWNoZSBoZWFkZXJcclxuICAgIGlmIChyZXEuaGVhZGVycy5oYXMoTmdIdHRwQ2FjaGluZ0hlYWRlcnMuRElTQUxMT1dfQ0FDSEUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIHN0cmF0ZWd5IGlzIGRpc2FsbG93IGFsbC4uLlxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmNhY2hlU3RyYXRlZ3kgPT09IE5nSHR0cENhY2hpbmdTdHJhdGVneS5ESVNBTExPV19BTEwpIHtcclxuICAgICAgLy8gcmVxdWVzdCBpc24ndCBhbGxvd2VkIGlmIGNvbWUgd2l0aG91dCBhbGxvdyBoZWFkZXJcclxuICAgICAgaWYgKCFyZXEuaGVhZGVycy5oYXMoTmdIdHRwQ2FjaGluZ0hlYWRlcnMuQUxMT1dfQ0FDSEUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiBhbGxvd2VkIG1ldGhvZCBpcyBvbmx5IEFMTCwgYWxsb3cgYWxsIGh0dHAgbWV0aG9kc1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmFsbG93ZWRNZXRob2QubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kWzBdID09PSAnQUxMJykge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyByZXF1ZXN0IGlzIGFsbG93ZWQgaWYgbWV0aG9kIGlzIGluIGFsbG93ZWRNZXRob2RcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hbGxvd2VkTWV0aG9kLmluZGV4T2YocmVxLm1ldGhvZCkgIT09IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjYWNoZSBrZXkuXHJcbiAgICogRGVmYXVsdCBrZXkgaXMgaHR0cCBtZXRob2QgcGx1cyB1cmwgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzLCBlZy46XHJcbiAgICogYEdFVEBodHRwczovL2dpdGh1Yi5jb20vbmlncm9zaW1vbmUvbmctaHR0cC1jYWNoaW5nYFxyXG4gICAqL1xyXG4gIGdldEtleTxLPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogc3RyaW5nIHtcclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGNvbnN0IGNvbnRleHQgPSByZXEuY29udGV4dC5nZXQoTkdfSFRUUF9DQUNISU5HX0NPTlRFWFQpO1xyXG4gICAgaWYgKHR5cGVvZiBjb250ZXh0LmdldEtleSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmdldEtleShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIHVzZXIgcHJvdmlkZSBjdXN0b20gbWV0aG9kLCB1c2UgaXRcclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcuZ2V0S2V5ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnLmdldEtleShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGRlZmF1bHQga2V5IGlzIHJlcS5tZXRob2QgcGx1cyB1cmwgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzXHJcbiAgICByZXR1cm4gcmVxLm1ldGhvZCArICdAJyArIHJlcS51cmxXaXRoUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIG9ic2VydmFibGUgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGdldEZyb21RdWV1ZTxLLCBUPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VD4+IHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIGNvbnN0IGNhY2hlZDogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VD4+IHwgdW5kZWZpbmVkID0gdGhpcy5xdWV1ZS5nZXQoa2V5KTtcclxuXHJcbiAgICBpZiAoIWNhY2hlZCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjYWNoZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgb2JzZXJ2YWJsZSB0byBjYWNoZVxyXG4gICAqL1xyXG4gIGFkZFRvUXVldWU8SywgVD4ocmVxOiBIdHRwUmVxdWVzdDxLPiwgb2JzOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUPj4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGtleTogc3RyaW5nID0gdGhpcy5nZXRLZXkocmVxKTtcclxuICAgIHRoaXMucXVldWUuc2V0KGtleSwgb2JzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBvYnNlcnZhYmxlIGZyb20gY2FjaGVcclxuICAgKi9cclxuICBkZWxldGVGcm9tUXVldWU8Sz4ocmVxOiBIdHRwUmVxdWVzdDxLPik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGVsZXRlKGtleSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWN1cnNpdmVseSBPYmplY3QuZnJlZXplIHNpbXBsZSBKYXZhc2NyaXB0IHN0cnVjdHVyZXMgY29uc2lzdGluZyBvZiBwbGFpbiBvYmplY3RzLCBhcnJheXMsIGFuZCBwcmltaXRpdmVzLlxyXG4gICAqIE1ha2UgdGhlIGRhdGEgaW1tdXRhYmxlLlxyXG4gICAqIEByZXR1cm5zIGltbXV0YWJsZSBvYmplY3RcclxuICAgKi9cclxuICBwcml2YXRlIGRlZXBGcmVlemU8Uz4ob2JqZWN0OiBTKTogUmVhZG9ubHk8Uz4ge1xyXG4gICAgLy8gTm8gZnJlZXppbmcgaW4gcHJvZHVjdGlvbiAoZm9yIGJldHRlciBwZXJmb3JtYW5jZSkuXHJcbiAgICBpZiAoIXRoaXMuZGV2TW9kZSB8fCAhb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHJldHVybiBvYmplY3QgYXMgUmVhZG9ubHk8Uz47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hlbiBhbHJlYWR5IGZyb3plbiwgd2UgYXNzdW1lIGl0cyBjaGlsZHJlbiBhcmUgZnJvemVuIChmb3IgYmV0dGVyIHBlcmZvcm1hbmNlKS5cclxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIHRydWUgaWYgeW91IGFsd2F5cyB1c2UgYGRlZXBGcmVlemVgIHRvIGZyZWV6ZSBvYmplY3RzLlxyXG4gICAgLy9cclxuICAgIC8vIE5vdGUgdGhhdCBPYmplY3QuaXNGcm96ZW4gd2lsbCBhbHNvIHJldHVybiBgdHJ1ZWAgZm9yIHByaW1pdGl2ZXMgKG51bWJlcnMsXHJcbiAgICAvLyBzdHJpbmdzLCBib29sZWFucywgdW5kZWZpbmVkLCBudWxsKSwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3JcclxuICAgIC8vIHRob3NlIGV4cGxpY2l0bHkuXHJcbiAgICBpZiAoT2JqZWN0LmlzRnJvemVuKG9iamVjdCkpIHtcclxuICAgICAgcmV0dXJuIG9iamVjdCBhcyBSZWFkb25seTxTPjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGggZWl0aGVyIGFuIGFycmF5IG9yIHBsYWluIG9iamVjdCwgc29cclxuICAgIC8vIGp1c3QgZnJlZXplIGl0IGFuZCByZWN1cnNlIG9uIGl0cyB2YWx1ZXMuXHJcbiAgICBPYmplY3QuZnJlZXplKG9iamVjdCk7XHJcbiAgICBPYmplY3Qua2V5cyhvYmplY3QpLmZvckVhY2goa2V5ID0+IHRoaXMuZGVlcEZyZWV6ZSgob2JqZWN0IGFzIGFueSlba2V5XSkpO1xyXG5cclxuICAgIHJldHVybiBvYmplY3QgYXMgUmVhZG9ubHk8Uz47XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
393
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1odHRwLWNhY2hpbmcvc3JjL2xpYi9uZy1odHRwLWNhY2hpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUF3QyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUczRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFJdEYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBdUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsS0FBMkIsRUFBRSxVQUF1QixJQUFJLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFBO0FBeUI5SixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FDdEQsd0JBQXdCLENBQ3pCLENBQUM7QUFFRixNQUFNLENBQU4sSUFBWSxxQkFTWDtBQVRELFdBQVkscUJBQXFCO0lBQy9COztPQUVHO0lBQ0gsZ0RBQXVCLENBQUE7SUFDdkI7O09BRUc7SUFDSCxzREFBNkIsQ0FBQTtBQUMvQixDQUFDLEVBVFcscUJBQXFCLEtBQXJCLHFCQUFxQixRQVNoQztBQUVELE1BQU0sQ0FBTixJQUFZLG9CQWtCWDtBQWxCRCxXQUFZLG9CQUFvQjtJQUM5Qjs7T0FFRztJQUNILHFFQUE2QyxDQUFBO0lBQzdDOztPQUVHO0lBQ0gsMkVBQW1ELENB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RSx3RUFBd0U7UUFDeEUsb0JBQW9CO1FBQ3BCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQixPQUFPLE1BQXFCLENBQUM7U0FDOUI7UUFFRCxvRkFBb0Y7UUFDcEYsNENBQTRDO1FBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFFLE1BQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsT0FBTyxNQUFxQixDQUFDO0lBQy9CLENBQUM7OEdBMVdVLG9CQUFvQixrQkFXckIsc0JBQXNCO2tIQVhyQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVU7OzBCQVlOLE1BQU07MkJBQUMsc0JBQXNCOzswQkFBRyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdCwgT3B0aW9uYWwsIFZFUlNJT04sIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBDb250ZXh0VG9rZW4sIEh0dHBDb250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9PYnNlcnZhYmxlJztcclxuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2UgfSBmcm9tICcuL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLXN0b3JhZ2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ01lbW9yeVN0b3JhZ2UgfSBmcm9tICcuL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLW1lbW9yeS1zdG9yYWdlJztcclxuXHJcbmV4cG9ydCB0eXBlIE5nSHR0cENhY2hpbmdDb250ZXh0ID0gUGljazxOZ0h0dHBDYWNoaW5nQ29uZmlnLCAnZ2V0S2V5JyB8ICdpc0NhY2hlYWJsZScgfCAnaXNFeHBpcmVkJyB8ICdpc1ZhbGlkJz47XHJcblxyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX0NPTlRFWFQgPSBuZXcgSHR0cENvbnRleHRUb2tlbjxOZ0h0dHBDYWNoaW5nQ29udGV4dD4oKCkgPT4gKHt9KSk7XHJcblxyXG5leHBvcnQgY29uc3Qgd2l0aE5nSHR0cENhY2hpbmdDb250ZXh0ID0gKHZhbHVlOiBOZ0h0dHBDYWNoaW5nQ29udGV4dCwgY29udGV4dDogSHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKSkgPT4gY29udGV4dC5zZXQoTkdfSFRUUF9DQUNISU5HX0NPTlRFWFQsIHZhbHVlKVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOZ0h0dHBDYWNoaW5nRW50cnk8SyA9IGFueSwgVCA9IGFueT4ge1xyXG4gIC8qKlxyXG4gICAqIFVSTFxyXG4gICAqL1xyXG4gIHVybDogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIEh0dHBSZXNwb25zZVxyXG4gICAqL1xyXG4gIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8VD47XHJcbiAgLyoqXHJcbiAgICogSHR0cFJlcXVlc3RcclxuICAgKi9cclxuICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxLPjtcclxuICAvKipcclxuICAgKiBUaW1lc3RhbXAgb2YgYWRkIHRvIGNhY2hlIHRpbWVcclxuICAgKi9cclxuICBhZGRlZFRpbWU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBDYWNoZSB2ZXJzaW9uXHJcbiAgICovXHJcbiAgdmVyc2lvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ0h0dHBDYWNoaW5nQ29udGV4dD4oXHJcbiAgJ25nLWh0dHAtY2FjaGluZy5jb25maWcnXHJcbik7XHJcblxyXG5leHBvcnQgZW51bSBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kge1xyXG4gIC8qKlxyXG4gICAqIEFsbCByZXF1ZXN0IGFyZSBjYWNoZWFibGUgaWYgSFRUUCBtZXRob2QgaXMgaW50byBgYWxsb3dlZE1ldGhvZGBcclxuICAgKi9cclxuICBBTExPV19BTEwgPSAnQUxMT1dfQUxMJyxcclxuICAvKipcclxuICAgKiBPbmx5IHRoZSByZXF1ZXN0IHdpdGggYFgtTkctSFRUUC1DQUNISU5HLUFMTE9XLUNBQ0hFYCBoZWFkZXIgYXJlIGNhY2hlYWJsZSBpZiBIVFRQIG1ldGhvZCBpcyBpbnRvIGBhbGxvd2VkTWV0aG9kYFxyXG4gICAqL1xyXG4gIERJU0FMTE9XX0FMTCA9ICdESVNBTExPV19BTEwnXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIE5nSHR0cENhY2hpbmdIZWFkZXJzIHtcclxuICAvKipcclxuICAgKiBSZXF1ZXN0IGlzIGNhY2hlYWJsZSBpZiBIVFRQIG1ldGhvZCBpcyBpbnRvIGBhbGxvd2VkTWV0aG9kYFxyXG4gICAqL1xyXG4gIEFMTE9XX0NBQ0hFID0gJ1gtTkctSFRUUC1DQUNISU5HLUFMTE9XLUNBQ0hFJyxcclxuICAvKipcclxuICAgKiBSZXF1ZXN0IGlzbid0IGNhY2hlYWJsZVxyXG4gICAqL1xyXG4gIERJU0FMTE9XX0NBQ0hFID0gJ1gtTkctSFRUUC1DQUNISU5HLURJU0FMTE9XLUNBQ0hFJyxcclxuICAvKipcclxuICAgKiBTcGVjaWZpYyBjYWNoZSBsaWZldGltZSBmb3IgdGhlIHJlcXVlc3RcclxuICAgKi9cclxuICBMSUZFVElNRSA9ICdYLU5HLUhUVFAtQ0FDSElORy1MSUZFVElNRScsXHJcbiAgLyoqXHJcbiAgICogWW91IGNhbiB0YWcgbXVsdGlwbGUgcmVxdWVzdCBieSBhZGRpbmcgdGhpcyBoZWFkZXIgd2l0aCB0aGUgc2FtZSB0YWcgYW5kIFxyXG4gICAqIHVzaW5nIGBOZ0h0dHBDYWNoaW5nU2VydmljZS5jbGVhckNhY2hlQnlUYWcodGFnOiBzdHJpbmcpYCBmb3IgZGVsZXRlIGFsbCB0aGUgdGFnZ2VkIHJlcXVlc3RcclxuICAgKi9cclxuICBUQUcgPSAnWC1ORy1IVFRQLUNBQ0hJTkctVEFHJ1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTmdIdHRwQ2FjaGluZ0hlYWRlcnNMaXN0ID0gT2JqZWN0LnZhbHVlcyhOZ0h0dHBDYWNoaW5nSGVhZGVycyk7XHJcblxyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX1NFQ09ORF9JTl9NUyA9IDEwMDA7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfTUlOVVRFX0lOX01TID0gTkdfSFRUUF9DQUNISU5HX1NFQ09ORF9JTl9NUyAqIDYwO1xyXG5leHBvcnQgY29uc3QgTkdfSFRUUF9DQUNISU5HX0hPVVJfSU5fTVMgPSBOR19IVFRQX0NBQ0hJTkdfTUlOVVRFX0lOX01TICogNjA7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfREFZX0lOX01TID0gTkdfSFRUUF9DQUNISU5HX0hPVVJfSU5fTVMgKiAyNDtcclxuZXhwb3J0IGNvbnN0IE5HX0hUVFBfQ0FDSElOR19XRUVLX0lOX01TID0gTkdfSFRUUF9DQUNISU5HX0RBWV9JTl9NUyAqIDc7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfTU9OVEhfSU5fTVMgPSBOR19IVFRQX0NBQ0hJTkdfREFZX0lOX01TICogMzA7XHJcbmV4cG9ydCBjb25zdCBOR19IVFRQX0NBQ0hJTkdfWUVBUl9JTl9NUyA9IE5HX0hUVFBfQ0FDSElOR19EQVlfSU5fTVMgKiAzNjU7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5nSHR0cENhY2hpbmdDb25maWcge1xyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgY2FjaGUgc3RvcmUuIFlvdSBjYW4gaW1wbGVtZW50IHlvdXIgY3VzdG9tIHN0b3JlIGJ5IGltcGxlbWVudCB0aGUgYE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlYCBpbnRlcmZhY2UsIGVnLjpcclxuICAgKi9cclxuICBzdG9yZT86IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlO1xyXG4gIC8qKlxyXG4gICAqIE51bWJlciBvZiBtaWxsaXNlY29uZCB0aGF0IGEgcmVzcG9uc2UgaXMgc3RvcmVkIGluIHRoZSBjYWNoZS4gXHJcbiAgICogWW91IGNhbiBzZXQgc3BlY2lmaWMgXCJsaWZldGltZVwiIGZvciBlYWNoIHJlcXVlc3QgYnkgYWRkIHRoZSBoZWFkZXIgYFgtTkctSFRUUC1DQUNISU5HLUxJRkVUSU1FYCAoc2VlIGV4YW1wbGUgYmVsb3cpLlxyXG4gICAqL1xyXG4gIGxpZmV0aW1lPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIEFycmF5IG9mIGFsbG93ZWQgSFRUUCBtZXRob2RzIHRvIGNhY2hlLiBcclxuICAgKiBZb3UgY2FuIGFsbG93IG11bHRpcGxlIG1ldGhvZHMsIGVnLjogYFsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdIRUFEJ11gIG9yIFxyXG4gICAqIGFsbG93IGFsbCBtZXRob2RzIGJ5OiBgWydBTEwnXWAuIElmIGBhbGxvd2VkTWV0aG9kYCBpcyBhbiBlbXB0eSBhcnJheSAoYFtdYCksIG5vIHJlc3BvbnNlIGFyZSBjYWNoZWQuXHJcbiAgICogKldhcm5pbmchKiBgTmdIdHRwQ2FjaGluZ2AgdXNlIHRoZSBmdWxsIHVybCAodXJsIHdpdGggcXVlcnkgcGFyYW1ldGVycykgYXMgdW5pcXVlIGtleSBmb3IgdGhlIGNhY2hlZCByZXNwb25zZSxcclxuICAgKiB0aGlzIGlzIGNvcnJlY3QgZm9yIHRoZSBgR0VUYCByZXF1ZXN0IGJ1dCBpcyBfcG90ZW50aWFsbHlfIHdyb25nIGZvciBvdGhlciB0eXBlIG9mIHJlcXVlc3QgKGVnLiBgUE9TVGAsIGBQVVRgKS4gXHJcbiAgICogWW91IGNhbiBzZXQgYSBkaWZmZXJlbnQgXCJrZXlcIiBieSBjdXN0b21pemluZyB0aGUgYGdldEtleWAgY29uZmlnIG1ldGhvZCAoc2VlIGBnZXRLZXlgIHNlY3Rpb24pLlxyXG4gICAqL1xyXG4gIGFsbG93ZWRNZXRob2Q/OiBzdHJpbmdbXTtcclxuICAvKipcclxuICAgKiBTZXQgdGhlIGNhY2hlIHN0cmF0ZWd5LCBwb3NzaWJsZSBzdHJhdGVnaWVzIGFyZTpcclxuICAgKiAtIGBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kuQUxMT1dfQUxMYDogQWxsIHJlcXVlc3QgYXJlIGNhY2hlYWJsZSBpZiBIVFRQIG1ldGhvZCBpcyBpbnRvIGBhbGxvd2VkTWV0aG9kYDtcclxuICAgKiAtIGBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kuRElTQUxMT1dfQUxMYDogT25seSB0aGUgcmVxdWVzdCB3aXRoIGBYLU5HLUhUVFAtQ0FDSElORy1BTExPVy1DQUNIRWAgaGVhZGVyIGFyZSBjYWNoZWFibGUgaWYgSFRUUCBtZXRob2QgaXMgaW50byBgYWxsb3dlZE1ldGhvZGA7XHJcbiAgICovXHJcbiAgY2FjaGVTdHJhdGVneT86IE5nSHR0cENhY2hpbmdTdHJhdGVneTtcclxuICAvKipcclxuICAgKiBDYWNoZSB2ZXJzaW9uLiBXaGVuIHlvdSBoYXZlIGEgYnJlYWtpbmcgY2hhbmdlLCBjaGFuZ2UgdGhlIHZlcnNpb24sIGFuZCBpdCdsbCBkZWxldGUgdGhlIGN1cnJlbnQgY2FjaGUgYXV0b21hdGljYWxseS5cclxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBBbmd1bGFyIG1ham9yIHZlcnNpb24gKGVnLiAxMyksIGluIHRoaXMgd2F5LCB0aGUgY2FjaGUgaXMgaW52YWxpZGF0ZWQgb24gZXZlcnkgQW5ndWxhciB1cGdyYWRlLlxyXG4gICAqL1xyXG4gIHZlcnNpb24/OiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm4gYHRydWVgIHRoZSByZXF1ZXN0IGlzIGV4cGlyZWQgYW5kIGEgbmV3IHJlcXVlc3QgaXMgc2VuZCB0byBiYWNrZW5kLCBpZiByZXR1cm4gYGZhbHNlYCBpc24ndCBleHBpcmVkLiBcclxuICAgKiBJZiB0aGUgcmVzdWx0IGlzIGB1bmRlZmluZWRgLCB0aGUgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZC5cclxuICAgKi9cclxuICBpc0V4cGlyZWQ/OiA8SywgVD4oZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZCB8IHZvaWQ7XHJcbiAgLyoqXHJcbiAgICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm4gYHRydWVgIHRoZSByZXF1ZXN0IGlzIGNhY2hlYWJsZSwgaWYgcmV0dXJuIGBmYWxzZWAgaXNuJ3QgY2FjaGVhYmxlLiBcclxuICAgKiBJZiB0aGUgcmVzdWx0IGlzIGB1bmRlZmluZWRgLCB0aGUgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZC5cclxuICAgKi9cclxuICBpc0NhY2hlYWJsZT86IDxLPihyZXE6IEh0dHBSZXF1ZXN0PEs+KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkIHwgdm9pZDtcclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybiB0aGUgdW5pcXVlIGtleSAoYHN0cmluZ2ApIGZvciBzdG9yZSB0aGUgcmVzcG9uc2UgaW50byB0aGUgY2FjaGUuIFxyXG4gICAqIElmIHRoZSByZXN1bHQgaXMgYHVuZGVmaW5lZGAsIHRoZSBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkLlxyXG4gICAqL1xyXG4gIGdldEtleT86IDxLPihyZXE6IEh0dHBSZXF1ZXN0PEs+KSA9PiBzdHJpbmcgfCB1bmRlZmluZWQgfCB2b2lkO1xyXG4gIC8qKlxyXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJuIGB0cnVlYCB0aGUgY2FjaGUgZW50cnkgaXMgdmFsaWQgYW5kIGNhbiBiZSBzdG9yZWQsIGlmIHJldHVybiBgZmFsc2VgIGlzbid0IHZhbGlkLiBcclxuICAgKiBJZiB0aGUgcmVzdWx0IGlzIGB1bmRlZmluZWRgLCB0aGUgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZC5cclxuICAgKi9cclxuICBpc1ZhbGlkPzogPEssIFQ+KGVudHJ5OiBOZ0h0dHBDYWNoaW5nRW50cnk8SywgVD4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQgfCB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5nSHR0cENhY2hpbmdEZWZhdWx0Q29uZmlnIGV4dGVuZHMgTmdIdHRwQ2FjaGluZ0NvbmZpZyB7XHJcbiAgc3RvcmU6IE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlO1xyXG4gIGxpZmV0aW1lOiBudW1iZXI7XHJcbiAgYWxsb3dlZE1ldGhvZDogc3RyaW5nW107XHJcbiAgY2FjaGVTdHJhdGVneTogTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5O1xyXG4gIHZlcnNpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5nSHR0cENhY2hpbmdDb25maWdEZWZhdWx0OiBSZWFkb25seTxOZ0h0dHBDYWNoaW5nRGVmYXVsdENvbmZpZz4gPSB7XHJcbiAgc3RvcmU6IG5ldyBOZ0h0dHBDYWNoaW5nTWVtb3J5U3RvcmFnZSgpLFxyXG4gIGxpZmV0aW1lOiBOR19IVFRQX0NBQ0hJTkdfSE9VUl9JTl9NUyxcclxuICB2ZXJzaW9uOiBWRVJTSU9OLm1ham9yLFxyXG4gIGFsbG93ZWRNZXRob2Q6IFsnR0VUJywgJ0hFQUQnXSxcclxuICBjYWNoZVN0cmF0ZWd5OiBOZ0h0dHBDYWNoaW5nU3RyYXRlZ3kuQUxMT1dfQUxMLFxyXG59O1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmdIdHRwQ2FjaGluZ1NlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlID0gbmV3IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+PigpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTmdIdHRwQ2FjaGluZ0RlZmF1bHRDb25maWc7XHJcblxyXG4gIHByaXZhdGUgZ2NMb2NrID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZGV2TW9kZTogYm9vbGVhbiA9IGlzRGV2TW9kZSgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTkdfSFRUUF9DQUNISU5HX0NPTkZJRykgQE9wdGlvbmFsKCkgY29uZmlnOiBSZWFkb25seTxOZ0h0dHBDYWNoaW5nQ29uZmlnPlxyXG4gICkge1xyXG4gICAgaWYgKGNvbmZpZykge1xyXG4gICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uTmdIdHRwQ2FjaGluZ0NvbmZpZ0RlZmF1bHQsIC4uLmNvbmZpZyB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLk5nSHR0cENhY2hpbmdDb25maWdEZWZhdWx0IH07XHJcbiAgICB9XHJcbiAgICAvLyBzdGFydCBjYWNoZSBjbGVhblxyXG4gICAgdGhpcy5ydW5HYygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjb25maWdcclxuICAgKi9cclxuICBnZXRDb25maWcoKTogUmVhZG9ubHk8TmdIdHRwQ2FjaGluZ0NvbmZpZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBxdWV1ZSBtYXBcclxuICAgKi9cclxuICBnZXRRdWV1ZSgpOiBSZWFkb25seTxNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+Pj4+IHtcclxuICAgIHJldHVybiB0aGlzLnF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBjYWNoZSBzdG9yZVxyXG4gICAqL1xyXG4gIGdldFN0b3JlKCk6IFJlYWRvbmx5PE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc3RvcmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gcmVzcG9uc2UgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGdldEZyb21DYWNoZTxLLCBUPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogUmVhZG9ubHk8SHR0cFJlc3BvbnNlPFQ+PiB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICBjb25zdCBjYWNoZWQ6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPiB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlnLnN0b3JlLmdldDxLLCBUPihrZXkpO1xyXG5cclxuICAgIGlmICghY2FjaGVkKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNFeHBpcmVkKGNhY2hlZCkpIHtcclxuICAgICAgdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kZWVwRnJlZXplKGNhY2hlZC5yZXNwb25zZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgcmVzcG9uc2UgdG8gY2FjaGVcclxuICAgKi9cclxuICBhZGRUb0NhY2hlPEssIFQ+KHJlcTogSHR0cFJlcXVlc3Q8Sz4sIHJlczogSHR0cFJlc3BvbnNlPFQ+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+ID0ge1xyXG4gICAgICB1cmw6IHJlcS51cmxXaXRoUGFyYW1zLFxyXG4gICAgICByZXNwb25zZTogcmVzLFxyXG4gICAgICByZXF1ZXN0OiByZXEsXHJcbiAgICAgIGFkZGVkVGltZTogRGF0ZS5ub3coKSxcclxuICAgICAgdmVyc2lvbjogdGhpcy5jb25maWcudmVyc2lvbixcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkKGVudHJ5KSkge1xyXG4gICAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICAgIHRoaXMuY29uZmlnLnN0b3JlLnNldChrZXksIGVudHJ5KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgcmVzcG9uc2UgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGRlbGV0ZUZyb21DYWNoZTxLPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICByZXR1cm4gdGhpcy5jbGVhckNhY2hlQnlLZXkoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZVxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpZy5zdG9yZS5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlIGJ5IGtleVxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGVCeUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnN0b3JlLmRlbGV0ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlIGJ5IGtleXNcclxuICAgKi9cclxuICBjbGVhckNhY2hlQnlLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pOiBudW1iZXIge1xyXG4gICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgaWYgKGtleXMpIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgICAgIGlmICh0aGlzLmNsZWFyQ2FjaGVCeUtleShrZXkpKSB7XHJcbiAgICAgICAgICBjb3VudGVyKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY291bnRlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSByZWdleFxyXG4gICAqL1xyXG4gIGNsZWFyQ2FjaGVCeVJlZ2V4PEssIFQ+KHJlZ2V4OiBSZWdFeHApOiBudW1iZXIge1xyXG4gICAgY29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgdGhpcy5jb25maWcuc3RvcmUuZm9yRWFjaDxLLCBUPigoXzogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XHJcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xlYXJDYWNoZUJ5S2V5cyhrZXlzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZSBieSBUQUdcclxuICAgKi9cclxuICBjbGVhckNhY2hlQnlUYWc8SywgVD4odGFnOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgY29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgdGhpcy5jb25maWcuc3RvcmUuZm9yRWFjaDxLLCBUPigoZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPiwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgdGFnSGVhZGVyID0gZW50cnkucmVxdWVzdC5oZWFkZXJzLmdldChOZ0h0dHBDYWNoaW5nSGVhZGVycy5UQUcpO1xyXG4gICAgICBpZiAodGFnSGVhZGVyICYmIHRhZ0hlYWRlci5zcGxpdCgnLCcpLmluY2x1ZGVzKHRhZykpIHtcclxuICAgICAgICBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5jbGVhckNhY2hlQnlLZXlzKGtleXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUnVuIGdhcmJhZ2UgY29sbGVjdG9yIChkZWxldGUgZXhwaXJlZCBjYWNoZSBlbnRyeSlcclxuICAgKi9cclxuICBydW5HYzxLLCBUPigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmdjTG9jaykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdjTG9jayA9IHRydWU7XHJcbiAgICBjb25zdCBrZXlzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICB0aGlzLmNvbmZpZy5zdG9yZS5mb3JFYWNoPEssIFQ+KChlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAodGhpcy5pc0V4cGlyZWQoZW50cnkpKSB7XHJcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jbGVhckNhY2hlQnlLZXlzKGtleXMpO1xyXG4gICAgdGhpcy5nY0xvY2sgPSBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRydWUgaWYgY2FjaGUgZW50cnkgaXMgZXhwaXJlZFxyXG4gICAqL1xyXG4gIGlzRXhwaXJlZDxLLCBUPihlbnRyeTogTmdIdHRwQ2FjaGluZ0VudHJ5PEssIFQ+KTogYm9vbGVhbiB7XHJcbiAgICAvLyBpZiB1c2VyIHByb3ZpZGUgY3VzdG9tIG1ldGhvZCwgdXNlIGl0XHJcbiAgICBjb25zdCBjb250ZXh0ID0gZW50cnkucmVxdWVzdC5jb250ZXh0LmdldChOR19IVFRQX0NBQ0hJTkdfQ09OVEVYVCk7XHJcbiAgICBpZiAodHlwZW9mIGNvbnRleHQ/LmlzRXhwaXJlZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmlzRXhwaXJlZChlbnRyeSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc0V4cGlyZWQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb25maWcuaXNFeHBpcmVkKGVudHJ5KTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiB2ZXJzaW9uIGNoYW5nZSwgYWx3YXlzIGV4cGlyZVxyXG4gICAgaWYgKHRoaXMuY29uZmlnLnZlcnNpb24gIT09IGVudHJ5LnZlcnNpb24pIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBjb25maWcvZGVmYXVsdCBsaWZldGltZVxyXG4gICAgbGV0IGxpZmV0aW1lOiBudW1iZXIgPSB0aGlzLmNvbmZpZy5saWZldGltZTtcclxuICAgIC8vIHJlcXVlc3QgaGFzIG93biBsaWZldGltZVxyXG4gICAgY29uc3QgaGVhZGVyTGlmZXRpbWUgPSBlbnRyeS5yZXF1ZXN0LmhlYWRlcnMuZ2V0KE5nSHR0cENhY2hpbmdIZWFkZXJzLkxJRkVUSU1FKTtcclxuICAgIGlmIChoZWFkZXJMaWZldGltZSkge1xyXG4gICAgICBsaWZldGltZSA9ICtoZWFkZXJMaWZldGltZTtcclxuICAgIH1cclxuICAgIC8vIG5ldmVyIGV4cGlyZSBpZiAwXHJcbiAgICBpZiAobGlmZXRpbWUgPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gd3JvbmcgbGlmZXRpbWVcclxuICAgIGlmIChsaWZldGltZSA8IDAgfHwgaXNOYU4obGlmZXRpbWUpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGlmZXRpbWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgMCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVudHJ5LmFkZGVkVGltZSArIGxpZmV0aW1lIDwgRGF0ZS5ub3coKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIGNhY2hlIGVudHJ5IGlzIHZhbGlkIGZvciBzdG9yZSBpbiB0aGUgY2FjaGVcclxuICAgKiBEZWZhdWx0IGJlaGF2aW91ciBpcyB3aGV0aGVyIHRoZSBzdGF0dXMgY29kZSBmYWxscyBpbiB0aGUgMnh4IHJhbmdlLlxyXG4gICAqL1xyXG4gIGlzVmFsaWQ8SywgVD4oZW50cnk6IE5nSHR0cENhY2hpbmdFbnRyeTxLLCBUPik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY29udGV4dCA9IGVudHJ5LnJlcXVlc3QuY29udGV4dC5nZXQoTkdfSFRUUF9DQUNISU5HX0NPTlRFWFQpO1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiBjb250ZXh0LmlzVmFsaWQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5pc1ZhbGlkKGVudHJ5KTtcclxuICAgICAgLy8gaWYgcmVzdWx0IGlzIHVuZGVmaW5lZCwgbm9ybWFsIGJlaGF2aW91ciBpcyBwcm92aWRlZFxyXG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiB1c2VyIHByb3ZpZGUgY3VzdG9tIG1ldGhvZCwgdXNlIGl0XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnLmlzVmFsaWQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb25maWcuaXNWYWxpZChlbnRyeSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZGlmZmVyZW50IHZlcnNpb25cclxuICAgIGlmICh0aGlzLmNvbmZpZy52ZXJzaW9uICE9PSBlbnRyeS52ZXJzaW9uKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbnRyeS5yZXNwb25zZS5vaztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIGNhY2hlYWJsZVxyXG4gICAqL1xyXG4gIGlzQ2FjaGVhYmxlPEs+KHJlcTogSHR0cFJlcXVlc3Q8Sz4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNvbnRleHQgPSByZXEuY29udGV4dC5nZXQoTkdfSFRUUF9DQUNISU5HX0NPTlRFWFQpO1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiBjb250ZXh0Py5pc0NhY2hlYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmlzQ2FjaGVhYmxlKHJlcSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5pc0NhY2hlYWJsZShyZXEpO1xyXG4gICAgICAvLyBpZiByZXN1bHQgaXMgdW5kZWZpbmVkLCBub3JtYWwgYmVoYXZpb3VyIGlzIHByb3ZpZGVkXHJcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHJlcXVlc3QgaGFzIGRpc2FsbG93IGNhY2hlIGhlYWRlclxyXG4gICAgaWYgKHJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5ESVNBTExPV19DQUNIRSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gc3RyYXRlZ3kgaXMgZGlzYWxsb3cgYWxsLi4uXHJcbiAgICBpZiAodGhpcy5jb25maWcuY2FjaGVTdHJhdGVneSA9PT0gTmdIdHRwQ2FjaGluZ1N0cmF0ZWd5LkRJU0FMTE9XX0FMTCkge1xyXG4gICAgICAvLyByZXF1ZXN0IGlzbid0IGFsbG93ZWQgaWYgY29tZSB3aXRob3V0IGFsbG93IGhlYWRlclxyXG4gICAgICBpZiAoIXJlcS5oZWFkZXJzLmhhcyhOZ0h0dHBDYWNoaW5nSGVhZGVycy5BTExPV19DQUNIRSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIGFsbG93ZWQgbWV0aG9kIGlzIG9ubHkgQUxMLCBhbGxvdyBhbGwgaHR0cCBtZXRob2RzXHJcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dlZE1ldGhvZC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgaWYgKHRoaXMuY29uZmlnLmFsbG93ZWRNZXRob2RbMF0gPT09ICdBTEwnKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHJlcXVlc3QgaXMgYWxsb3dlZCBpZiBtZXRob2QgaXMgaW4gYWxsb3dlZE1ldGhvZFxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFsbG93ZWRNZXRob2QuaW5kZXhPZihyZXEubWV0aG9kKSAhPT0gLTE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGNhY2hlIGtleS5cclxuICAgKiBEZWZhdWx0IGtleSBpcyBodHRwIG1ldGhvZCBwbHVzIHVybCB3aXRoIHF1ZXJ5IHBhcmFtZXRlcnMsIGVnLjpcclxuICAgKiBgR0VUQGh0dHBzOi8vZ2l0aHViLmNvbS9uaWdyb3NpbW9uZS9uZy1odHRwLWNhY2hpbmdgXHJcbiAgICovXHJcbiAgZ2V0S2V5PEs+KHJlcTogSHR0cFJlcXVlc3Q8Sz4pOiBzdHJpbmcge1xyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgY29uc3QgY29udGV4dCA9IHJlcS5jb250ZXh0LmdldChOR19IVFRQX0NBQ0hJTkdfQ09OVEVYVCk7XHJcbiAgICBpZiAodHlwZW9mIGNvbnRleHQuZ2V0S2V5ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuZ2V0S2V5KHJlcSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaWYgdXNlciBwcm92aWRlIGN1c3RvbSBtZXRob2QsIHVzZSBpdFxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5nZXRLZXkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb25maWcuZ2V0S2V5KHJlcSk7XHJcbiAgICAgIC8vIGlmIHJlc3VsdCBpcyB1bmRlZmluZWQsIG5vcm1hbCBiZWhhdmlvdXIgaXMgcHJvdmlkZWRcclxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZGVmYXVsdCBrZXkgaXMgcmVxLm1ldGhvZCBwbHVzIHVybCB3aXRoIHF1ZXJ5IHBhcmFtZXRlcnNcclxuICAgIHJldHVybiByZXEubWV0aG9kICsgJ0AnICsgcmVxLnVybFdpdGhQYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gb2JzZXJ2YWJsZSBmcm9tIGNhY2hlXHJcbiAgICovXHJcbiAgZ2V0RnJvbVF1ZXVlPEssIFQ+KHJlcTogSHR0cFJlcXVlc3Q8Sz4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUPj4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgY29uc3QgY2FjaGVkOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUPj4gfCB1bmRlZmluZWQgPSB0aGlzLnF1ZXVlLmdldChrZXkpO1xyXG5cclxuICAgIGlmICghY2FjaGVkKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNhY2hlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBvYnNlcnZhYmxlIHRvIGNhY2hlXHJcbiAgICovXHJcbiAgYWRkVG9RdWV1ZTxLLCBUPihyZXE6IEh0dHBSZXF1ZXN0PEs+LCBvYnM6IE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+Pik6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSB0aGlzLmdldEtleShyZXEpO1xyXG4gICAgdGhpcy5xdWV1ZS5zZXQoa2V5LCBvYnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIG9ic2VydmFibGUgZnJvbSBjYWNoZVxyXG4gICAqL1xyXG4gIGRlbGV0ZUZyb21RdWV1ZTxLPihyZXE6IEh0dHBSZXF1ZXN0PEs+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9IHRoaXMuZ2V0S2V5KHJlcSk7XHJcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kZWxldGUoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlY3Vyc2l2ZWx5IE9iamVjdC5mcmVlemUgc2ltcGxlIEphdmFzY3JpcHQgc3RydWN0dXJlcyBjb25zaXN0aW5nIG9mIHBsYWluIG9iamVjdHMsIGFycmF5cywgYW5kIHByaW1pdGl2ZXMuXHJcbiAgICogTWFrZSB0aGUgZGF0YSBpbW11dGFibGUuXHJcbiAgICogQHJldHVybnMgaW1tdXRhYmxlIG9iamVjdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGVlcEZyZWV6ZTxTPihvYmplY3Q6IFMpOiBSZWFkb25seTxTPiB7XHJcbiAgICAvLyBObyBmcmVlemluZyBpbiBwcm9kdWN0aW9uIChmb3IgYmV0dGVyIHBlcmZvcm1hbmNlKS5cclxuICAgIGlmICghdGhpcy5kZXZNb2RlIHx8ICFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgcmV0dXJuIG9iamVjdCBhcyBSZWFkb25seTxTPjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXaGVuIGFscmVhZHkgZnJvemVuLCB3ZSBhc3N1bWUgaXRzIGNoaWxkcmVuIGFyZSBmcm96ZW4gKGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UpLlxyXG4gICAgLy8gVGhpcyBzaG91bGQgYmUgdHJ1ZSBpZiB5b3UgYWx3YXlzIHVzZSBgZGVlcEZyZWV6ZWAgdG8gZnJlZXplIG9iamVjdHMuXHJcbiAgICAvL1xyXG4gICAgLy8gTm90ZSB0aGF0IE9iamVjdC5pc0Zyb3plbiB3aWxsIGFsc28gcmV0dXJuIGB0cnVlYCBmb3IgcHJpbWl0aXZlcyAobnVtYmVycyxcclxuICAgIC8vIHN0cmluZ3MsIGJvb2xlYW5zLCB1bmRlZmluZWQsIG51bGwpLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGZvclxyXG4gICAgLy8gdGhvc2UgZXhwbGljaXRseS5cclxuICAgIGlmIChPYmplY3QuaXNGcm96ZW4ob2JqZWN0KSkge1xyXG4gICAgICByZXR1cm4gb2JqZWN0IGFzIFJlYWRvbmx5PFM+O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHdlJ3JlIGRlYWxpbmcgd2l0aCBlaXRoZXIgYW4gYXJyYXkgb3IgcGxhaW4gb2JqZWN0LCBzb1xyXG4gICAgLy8ganVzdCBmcmVlemUgaXQgYW5kIHJlY3Vyc2Ugb24gaXRzIHZhbHVlcy5cclxuICAgIE9iamVjdC5mcmVlemUob2JqZWN0KTtcclxuICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaChrZXkgPT4gdGhpcy5kZWVwRnJlZXplKChvYmplY3QgYXMgYW55KVtrZXldKSk7XHJcblxyXG4gICAgcmV0dXJuIG9iamVjdCBhcyBSZWFkb25seTxTPjtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -110,13 +110,7 @@ export class NgHttpCachingBrowserStorage {
|
|
|
110
110
|
const item = this.storage.getItem(key);
|
|
111
111
|
if (item) {
|
|
112
112
|
const parsedItem = JSON.parse(item);
|
|
113
|
-
return
|
|
114
|
-
url: parsedItem.url,
|
|
115
|
-
response: deserializeResponse(parsedItem.response),
|
|
116
|
-
request: deserializeRequest(parsedItem.request),
|
|
117
|
-
addedTime: parsedItem.addedTime,
|
|
118
|
-
version: parsedItem.version
|
|
119
|
-
};
|
|
113
|
+
return this.deserialize(parsedItem);
|
|
120
114
|
}
|
|
121
115
|
return undefined;
|
|
122
116
|
}
|
|
@@ -136,14 +130,26 @@ export class NgHttpCachingBrowserStorage {
|
|
|
136
130
|
if (!key.startsWith(KEY_PREFIX)) {
|
|
137
131
|
key = KEY_PREFIX + key;
|
|
138
132
|
}
|
|
139
|
-
const unParsedItem =
|
|
133
|
+
const unParsedItem = this.serialize(value);
|
|
134
|
+
this.storage.setItem(key, JSON.stringify(unParsedItem));
|
|
135
|
+
}
|
|
136
|
+
serialize(value) {
|
|
137
|
+
return {
|
|
140
138
|
url: value.url,
|
|
141
139
|
response: serializeResponse(value.response),
|
|
142
140
|
request: serializeRequest(value.request),
|
|
143
141
|
addedTime: value.addedTime,
|
|
144
142
|
version: value.version
|
|
145
143
|
};
|
|
146
|
-
|
|
144
|
+
}
|
|
145
|
+
deserialize(value) {
|
|
146
|
+
return {
|
|
147
|
+
url: value.url,
|
|
148
|
+
response: deserializeResponse(value.response),
|
|
149
|
+
request: deserializeRequest(value.request),
|
|
150
|
+
addedTime: value.addedTime,
|
|
151
|
+
version: value.version
|
|
152
|
+
};
|
|
147
153
|
}
|
|
148
154
|
}
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWh0dHAtY2FjaGluZy9zcmMvbGliL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUYsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFxQixFQUFVLEVBQUU7SUFDOUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsb0RBQW9EO0lBQ2pGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBRSw0RkFBNEY7UUFDckgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUUseUJBQXlCO1FBQ2pELENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtTQUM3RyxDQUNKO1FBQ0QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztRQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBRSw0RkFBNEY7UUFDcEgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUUseUJBQXlCO1FBQ2pELENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FB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QUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVztRQUNYLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDTixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzdCLEdBQUcsR0FBRyxVQUFVLEdBQUcsR0FBRyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBeUI7UUFDdEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNOLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzdCLEdBQUcsR0FBRyxVQUFVLEdBQUcsR0FBRyxDQUFDO1NBQzFCO1FBQ0QsTUFBTSxZQUFZLEdBQWlCO1lBQy9CLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDekIsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2UgfSBmcm9tICcuL25nLWh0dHAtY2FjaGluZy1zdG9yYWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdFbnRyeSB9IGZyb20gJy4uL25nLWh0dHAtY2FjaGluZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5jb25zdCBLRVlfUFJFRklYID0gJ05nSHR0cENhY2hpbmc6Oic7XHJcblxyXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplUmVxdWVzdCA9IChyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBzdHJpbmcgPT4ge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcS5jbG9uZSgpOyAvLyBNYWtlIGEgY2xvbmUsIHVzZWZ1bCBmb3IgZG9pbmcgZGVzdHJ1Y3RpdmUgdGhpbmdzXHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyggLy8gSnVzdCBhIGhlbHBlciB0byBtYWtlIHRoaXMgaW50byBhbiBvYmplY3QsIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IG1ha2VzIHRoZSBvdXRwdXQgbmljZXJcclxuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmtleXMoKS5tYXAoIC8vIEdldCBhbGwgb2YgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZykgPT4gW2tleSwgcmVxdWVzdC5oZWFkZXJzLmdldEFsbChrZXkpXSAvLyBHZXQgYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCwgLy8gVGhlIFJlcXVlc3QgTWV0aG9kLCBlLmcuIEdFVCwgUE9TVCwgREVMRVRFXHJcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCwgLy8gVGhlIFVSTFxyXG4gICAgICAgIHBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKCAvLyBKdXN0IGEgaGVscGVyIHRvIG1ha2UgdGhpcyBpbnRvIGFuIG9iamVjdCwgbm90IHJlYWxseSByZXF1aXJlZCBidXQgbWFrZXMgdGhlIG91dHB1dCBuaWNlclxyXG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMua2V5cygpLm1hcCggLy8gR2V0IGFsbCBvZiB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICAgICAgKGtleTogc3RyaW5nKSA9PiBba2V5LCByZXF1ZXN0LmhlYWRlcnMuZ2V0QWxsKGtleSldIC8vIEdldCBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgLy8gVGhlIHJlcXVlc3QgcGFyYW1ldGVyc1xyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMsIC8vIFdoZXRoZXIgY3JlZGVudGlhbHMgYXJlIGJlaW5nIHNlbnRcclxuICAgICAgICByZXNwb25zZVR5cGU6IHJlcXVlc3QucmVzcG9uc2VUeXBlLCAvLyBUaGUgcmVzcG9uc2UgdHlwZVxyXG4gICAgICAgIGJvZHk6IHJlcXVlc3Quc2VyaWFsaXplQm9keSgpIC8vIFNlcmlhbGl6ZSB0aGUgYm9keSwgYWxsIHdlbGwgYW5kIGdvb2Qgc2luY2Ugd2UgYXJlIHdvcmtpbmcgb24gYSBjbG9uZVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBzZXJpYWxpemVSZXNwb25zZSA9IChyZXM6IEh0dHBSZXNwb25zZTxhbnk+KTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzLmNsb25lKCk7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyggLy8gSnVzdCBhIGhlbHBlciB0byBtYWtlIHRoaXMgaW50byBhbiBvYmplY3QsIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IG1ha2VzIHRoZSBvdXRwdXQgbmljZXJcclxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkubWFwKCAvLyBHZXQgYWxsIG9mIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcpID0+IFtrZXksIHJlc3BvbnNlLmhlYWRlcnMuZ2V0QWxsKGtleSldIC8vIEdldCBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSxcclxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxyXG4gICAgICAgIHVybDogcmVzcG9uc2UudXJsLFxyXG4gICAgICAgIGJvZHk6IHJlc3BvbnNlLmJvZHkgLy8gU2VyaWFsaXplIHRoZSBib2R5LCBhbGwgd2VsbCBhbmQgZ29vZCBzaW5jZSB3ZSBhcmUgd29ya2luZyBvbiBhIGNsb25lXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGRlc2VyaWFsaXplUmVxdWVzdCA9IDxUID0gYW55PihyZXE6IHN0cmluZyk6IEh0dHBSZXF1ZXN0PFQ+ID0+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBKU09OLnBhcnNlKHJlcSk7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHJlcXVlc3QuaGVhZGVycyk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpOyAvLyBQcm9iYWJseSBzb21lIHdheSB0byBtYWtlIHRoaXMgYSBvbmUtbGluZXIsIGJ1dCBhbGFzLCB0aGVyZSBhcmUgbm8gZ29vZCBkb2NzXHJcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBpbiByZXF1ZXN0LnBhcmFtcykge1xyXG4gICAgICAgIHJlcXVlc3QucGFyYW1zW3BhcmFtZXRlcl0uZm9yRWFjaCgocGFyYW1WYWx1ZTogc3RyaW5nKSA9PiBwYXJhbXMuYXBwZW5kKHBhcmFtZXRlciwgcGFyYW1WYWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVxdWVzdChyZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC51cmwsIHJlcXVlc3QuYm9keSwge1xyXG4gICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogcmVxdWVzdC5yZXNwb25zZVR5cGUsXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiByZXF1ZXN0LndpdGhDcmVkZW50aWFsc1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZXNlcmlhbGl6ZVJlc3BvbnNlID0gPFQgPSBhbnk+KHJlczogc3RyaW5nKTogSHR0cFJlc3BvbnNlPFQ+ID0+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXMpO1xyXG4gICAgcmV0dXJuIG5ldyBIdHRwUmVzcG9uc2U8VD4oe1xyXG4gICAgICAgIHVybDogcmVzcG9uc2UudXJsLFxyXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKSxcclxuICAgICAgICBib2R5OiByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5nSHR0cENhY2hpbmdCcm93c2VyU3RvcmFnZSBpbXBsZW1lbnRzIE5nSHR0cENhY2hpbmdTdG9yYWdlSW50ZXJmYWNlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2UpIHsgfVxyXG5cclxuICAgIGdldCBzaXplKCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgZSA9IHRoaXMuc3RvcmFnZS5sZW5ndGg7IGkgPCBlOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdG9yYWdlLmtleShpKTtcclxuICAgICAgICAgICAgaWYgKGtleSAmJiBrZXkuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RvcmFnZS5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc3RvcmFnZS5rZXkoaSk7XHJcbiAgICAgICAgICAgIGlmIChrZXkgJiYga2V5LnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFrZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgIGtleSA9IEtFWV9QUkVGSVggKyBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFja2ZuOiAodmFsdWU6IE5nSHR0cENhY2hpbmdFbnRyeSwga2V5OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICAvLyBpdGVyYXRlIHRoaXMuc3RvcmFnZVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlID0gdGhpcy5zdG9yYWdlLmxlbmd0aDsgaSA8IGU7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBrZXlXaXRoUHJlZml4ID0gdGhpcy5zdG9yYWdlLmtleShpKTtcclxuICAgICAgICAgICAgaWYgKGtleVdpdGhQcmVmaXggJiYga2V5V2l0aFByZWZpeC5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGtleVdpdGhQcmVmaXgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5V2l0aG91dFByZWZpeCA9IGtleVdpdGhQcmVmaXguc3Vic3RyaW5nKEtFWV9QUkVGSVgubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKHZhbHVlLCBrZXlXaXRob3V0UHJlZml4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQoa2V5OiBzdHJpbmcpOiBSZWFkb25seTxOZ0h0dHBDYWNoaW5nRW50cnk+IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgIGtleSA9IEtFWV9QUkVGSVggKyBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEl0ZW06IFN0b3JhZ2VFbnRyeSA9IEpTT04ucGFyc2UoaXRlbSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHBhcnNlZEl0ZW0udXJsLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IGRlc2VyaWFsaXplUmVzcG9uc2UocGFyc2VkSXRlbS5yZXNwb25zZSksXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiBkZXNlcmlhbGl6ZVJlcXVlc3QocGFyc2VkSXRlbS5yZXF1ZXN0KSxcclxuICAgICAgICAgICAgICAgIGFkZGVkVGltZTogcGFyc2VkSXRlbS5hZGRlZFRpbWUsXHJcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBwYXJzZWRJdGVtLnZlcnNpb25cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCkpIHtcclxuICAgICAgICAgICAga2V5ID0gS0VZX1BSRUZJWCArIGtleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBOZ0h0dHBDYWNoaW5nRW50cnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCkpIHtcclxuICAgICAgICAgICAga2V5ID0gS0VZX1BSRUZJWCArIGtleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdW5QYXJzZWRJdGVtOiBTdG9yYWdlRW50cnkgPSB7XHJcbiAgICAgICAgICAgIHVybDogdmFsdWUudXJsLFxyXG4gICAgICAgICAgICByZXNwb25zZTogc2VyaWFsaXplUmVzcG9uc2UodmFsdWUucmVzcG9uc2UpLFxyXG4gICAgICAgICAgICByZXF1ZXN0OiBzZXJpYWxpemVSZXF1ZXN0KHZhbHVlLnJlcXVlc3QpLFxyXG4gICAgICAgICAgICBhZGRlZFRpbWU6IHZhbHVlLmFkZGVkVGltZSxcclxuICAgICAgICAgICAgdmVyc2lvbjogdmFsdWUudmVyc2lvblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh1blBhcnNlZEl0ZW0pKTtcclxuICAgIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIFN0b3JhZ2VFbnRyeSB7XHJcbiAgICB1cmw6IHN0cmluZztcclxuICAgIHJlc3BvbnNlOiBzdHJpbmc7XHJcbiAgICByZXF1ZXN0OiBzdHJpbmc7XHJcbiAgICBhZGRlZFRpbWU6IG51bWJlcjtcclxuICAgIHZlcnNpb246IHN0cmluZztcclxufVxyXG4iXX0=
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWh0dHAtY2FjaGluZy9zcmMvbGliL3N0b3JhZ2UvbmctaHR0cC1jYWNoaW5nLWJyb3dzZXItc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUYsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFVckMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFxQixFQUFVLEVBQUU7SUFDOUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsb0RBQW9EO0lBQ2pGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBRSw0RkFBNEY7UUFDckgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUUseUJBQXlCO1FBQ2pELENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtTQUM3RyxDQUNKO1FBQ0QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztRQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBRSw0RkFBNEY7UUFDcEgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUUseUJBQXlCO1FBQ2pELENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FB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Q0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSB9IGZyb20gJy4vbmctaHR0cC1jYWNoaW5nLXN0b3JhZ2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ0VudHJ5IH0gZnJvbSAnLi4vbmctaHR0cC1jYWNoaW5nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbmNvbnN0IEtFWV9QUkVGSVggPSAnTmdIdHRwQ2FjaGluZzo6JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VFbnRyeSB7XHJcbiAgICB1cmw6IHN0cmluZztcclxuICAgIHJlc3BvbnNlOiBzdHJpbmc7XHJcbiAgICByZXF1ZXN0OiBzdHJpbmc7XHJcbiAgICBhZGRlZFRpbWU6IG51bWJlcjtcclxuICAgIHZlcnNpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZVJlcXVlc3QgPSAocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSByZXEuY2xvbmUoKTsgLy8gTWFrZSBhIGNsb25lLCB1c2VmdWwgZm9yIGRvaW5nIGRlc3RydWN0aXZlIHRoaW5nc1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoIC8vIEp1c3QgYSBoZWxwZXIgdG8gbWFrZSB0aGlzIGludG8gYW4gb2JqZWN0LCBub3QgcmVhbGx5IHJlcXVpcmVkIGJ1dCBtYWtlcyB0aGUgb3V0cHV0IG5pY2VyXHJcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5rZXlzKCkubWFwKCAvLyBHZXQgYWxsIG9mIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcpID0+IFtrZXksIHJlcXVlc3QuaGVhZGVycy5nZXRBbGwoa2V5KV0gLy8gR2V0IGFsbCBvZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIHRoZSBoZWFkZXJzXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLFxyXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsIC8vIFRoZSBSZXF1ZXN0IE1ldGhvZCwgZS5nLiBHRVQsIFBPU1QsIERFTEVURVxyXG4gICAgICAgIHVybDogcmVxdWVzdC51cmwsIC8vIFRoZSBVUkxcclxuICAgICAgICBwYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyggLy8gSnVzdCBhIGhlbHBlciB0byBtYWtlIHRoaXMgaW50byBhbiBvYmplY3QsIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IG1ha2VzIHRoZSBvdXRwdXQgbmljZXJcclxuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmtleXMoKS5tYXAoIC8vIEdldCBhbGwgb2YgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZykgPT4gW2tleSwgcmVxdWVzdC5oZWFkZXJzLmdldEFsbChrZXkpXSAvLyBHZXQgYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICksIC8vIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnNcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzLCAvLyBXaGV0aGVyIGNyZWRlbnRpYWxzIGFyZSBiZWluZyBzZW50XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiByZXF1ZXN0LnJlc3BvbnNlVHlwZSwgLy8gVGhlIHJlc3BvbnNlIHR5cGVcclxuICAgICAgICBib2R5OiByZXF1ZXN0LnNlcmlhbGl6ZUJvZHkoKSAvLyBTZXJpYWxpemUgdGhlIGJvZHksIGFsbCB3ZWxsIGFuZCBnb29kIHNpbmNlIHdlIGFyZSB3b3JraW5nIG9uIGEgY2xvbmVcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplUmVzcG9uc2UgPSAocmVzOiBIdHRwUmVzcG9uc2U8YW55Pik6IHN0cmluZyA9PiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IHJlcy5jbG9uZSgpO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoIC8vIEp1c3QgYSBoZWxwZXIgdG8gbWFrZSB0aGlzIGludG8gYW4gb2JqZWN0LCBub3QgcmVhbGx5IHJlcXVpcmVkIGJ1dCBtYWtlcyB0aGUgb3V0cHV0IG5pY2VyXHJcbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpLm1hcCggLy8gR2V0IGFsbCBvZiB0aGUgaGVhZGVyc1xyXG4gICAgICAgICAgICAgICAgKGtleTogc3RyaW5nKSA9PiBba2V5LCByZXNwb25zZS5oZWFkZXJzLmdldEFsbChrZXkpXSAvLyBHZXQgYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXHJcbiAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcclxuICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCxcclxuICAgICAgICBib2R5OiByZXNwb25zZS5ib2R5IC8vIFNlcmlhbGl6ZSB0aGUgYm9keSwgYWxsIHdlbGwgYW5kIGdvb2Qgc2luY2Ugd2UgYXJlIHdvcmtpbmcgb24gYSBjbG9uZVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkZXNlcmlhbGl6ZVJlcXVlc3QgPSA8VCA9IGFueT4ocmVxOiBzdHJpbmcpOiBIdHRwUmVxdWVzdDxUPiA9PiB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gSlNPTi5wYXJzZShyZXEpO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyhyZXF1ZXN0LmhlYWRlcnMpO1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTsgLy8gUHJvYmFibHkgc29tZSB3YXkgdG8gbWFrZSB0aGlzIGEgb25lLWxpbmVyLCBidXQgYWxhcywgdGhlcmUgYXJlIG5vIGdvb2QgZG9jc1xyXG4gICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgaW4gcmVxdWVzdC5wYXJhbXMpIHtcclxuICAgICAgICByZXF1ZXN0LnBhcmFtc1twYXJhbWV0ZXJdLmZvckVhY2goKHBhcmFtVmFsdWU6IHN0cmluZykgPT4gcGFyYW1zLmFwcGVuZChwYXJhbWV0ZXIsIHBhcmFtVmFsdWUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgSHR0cFJlcXVlc3QocmVxdWVzdC5tZXRob2QsIHJlcXVlc3QudXJsLCByZXF1ZXN0LmJvZHksIHtcclxuICAgICAgICBoZWFkZXJzLFxyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICByZXNwb25zZVR5cGU6IHJlcXVlc3QucmVzcG9uc2VUeXBlLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogcmVxdWVzdC53aXRoQ3JlZGVudGlhbHNcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZGVzZXJpYWxpemVSZXNwb25zZSA9IDxUID0gYW55PihyZXM6IHN0cmluZyk6IEh0dHBSZXNwb25zZTxUPiA9PiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzKTtcclxuICAgIHJldHVybiBuZXcgSHR0cFJlc3BvbnNlPFQ+KHtcclxuICAgICAgICB1cmw6IHJlc3BvbnNlLnVybCxcclxuICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgYm9keTogcmVzcG9uc2UuYm9keSxcclxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOZ0h0dHBDYWNoaW5nQnJvd3NlclN0b3JhZ2UgaW1wbGVtZW50cyBOZ0h0dHBDYWNoaW5nU3RvcmFnZUludGVyZmFjZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlKSB7IH1cclxuXHJcbiAgICBnZXQgc2l6ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGUgPSB0aGlzLnN0b3JhZ2UubGVuZ3RoOyBpIDwgZTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc3RvcmFnZS5rZXkoaSk7XHJcbiAgICAgICAgICAgIGlmIChrZXkgJiYga2V5LnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCkpIHtcclxuICAgICAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0b3JhZ2UubGVuZ3RoOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN0b3JhZ2Uua2V5KGkpO1xyXG4gICAgICAgICAgICBpZiAoa2V5ICYmIGtleS5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICgha2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkge1xyXG4gICAgICAgICAgICBrZXkgPSBLRVlfUFJFRklYICsga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvckVhY2goY2FsbGJhY2tmbjogKHZhbHVlOiBOZ0h0dHBDYWNoaW5nRW50cnksIGtleTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgLy8gaXRlcmF0ZSB0aGlzLnN0b3JhZ2VcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgZSA9IHRoaXMuc3RvcmFnZS5sZW5ndGg7IGkgPCBlOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5V2l0aFByZWZpeCA9IHRoaXMuc3RvcmFnZS5rZXkoaSk7XHJcbiAgICAgICAgICAgIGlmIChrZXlXaXRoUHJlZml4ICYmIGtleVdpdGhQcmVmaXguc3RhcnRzV2l0aChLRVlfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChrZXlXaXRoUHJlZml4KTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVdpdGhvdXRQcmVmaXggPSBrZXlXaXRoUHJlZml4LnN1YnN0cmluZyhLRVlfUFJFRklYLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tmbih2YWx1ZSwga2V5V2l0aG91dFByZWZpeCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGtleTogc3RyaW5nKTogUmVhZG9ubHk8TmdIdHRwQ2FjaGluZ0VudHJ5PiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKCFrZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkge1xyXG4gICAgICAgICAgICBrZXkgPSBLRVlfUFJFRklYICsga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRJdGVtOiBOZ0h0dHBDYWNoaW5nU3RvcmFnZUVudHJ5ID0gSlNPTi5wYXJzZShpdGVtKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemUocGFyc2VkSXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFrZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgIGtleSA9IEtFWV9QUkVGSVggKyBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAhIXRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogTmdIdHRwQ2FjaGluZ0VudHJ5KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFrZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKSB7XHJcbiAgICAgICAgICAgIGtleSA9IEtFWV9QUkVGSVggKyBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVuUGFyc2VkSXRlbTogTmdIdHRwQ2FjaGluZ1N0b3JhZ2VFbnRyeSA9IHRoaXMuc2VyaWFsaXplKHZhbHVlKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHVuUGFyc2VkSXRlbSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXJpYWxpemUodmFsdWU6IE5nSHR0cENhY2hpbmdFbnRyeSk6IE5nSHR0cENhY2hpbmdTdG9yYWdlRW50cnkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHVybDogdmFsdWUudXJsLFxyXG4gICAgICAgICAgICByZXNwb25zZTogc2VyaWFsaXplUmVzcG9uc2UodmFsdWUucmVzcG9uc2UpLFxyXG4gICAgICAgICAgICByZXF1ZXN0OiBzZXJpYWxpemVSZXF1ZXN0KHZhbHVlLnJlcXVlc3QpLFxyXG4gICAgICAgICAgICBhZGRlZFRpbWU6IHZhbHVlLmFkZGVkVGltZSxcclxuICAgICAgICAgICAgdmVyc2lvbjogdmFsdWUudmVyc2lvblxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRlc2VyaWFsaXplKHZhbHVlOiBOZ0h0dHBDYWNoaW5nU3RvcmFnZUVudHJ5KTogTmdIdHRwQ2FjaGluZ0VudHJ5IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB1cmw6IHZhbHVlLnVybCxcclxuICAgICAgICAgICAgcmVzcG9uc2U6IGRlc2VyaWFsaXplUmVzcG9uc2UodmFsdWUucmVzcG9uc2UpLFxyXG4gICAgICAgICAgICByZXF1ZXN0OiBkZXNlcmlhbGl6ZVJlcXVlc3QodmFsdWUucmVxdWVzdCksXHJcbiAgICAgICAgICAgIGFkZGVkVGltZTogdmFsdWUuYWRkZWRUaW1lLFxyXG4gICAgICAgICAgICB2ZXJzaW9uOiB2YWx1ZS52ZXJzaW9uXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuIl19
|
|
@@ -1,27 +1,3 @@
|
|
|
1
|
-
export class NgHttpCachingMemoryStorage {
|
|
2
|
-
constructor() {
|
|
3
|
-
this.store = new Map();
|
|
4
|
-
}
|
|
5
|
-
get size() {
|
|
6
|
-
return this.store.size;
|
|
7
|
-
}
|
|
8
|
-
clear() {
|
|
9
|
-
this.store.clear();
|
|
10
|
-
}
|
|
11
|
-
delete(key) {
|
|
12
|
-
return this.store.delete(key);
|
|
13
|
-
}
|
|
14
|
-
forEach(callbackfn) {
|
|
15
|
-
return this.store.forEach(callbackfn);
|
|
16
|
-
}
|
|
17
|
-
get(key) {
|
|
18
|
-
return this.store.get(key);
|
|
19
|
-
}
|
|
20
|
-
has(key) {
|
|
21
|
-
return this.store.has(key);
|
|
22
|
-
}
|
|
23
|
-
set(key, value) {
|
|
24
|
-
this.store.set(key, value);
|
|
25
|
-
}
|
|
1
|
+
export class NgHttpCachingMemoryStorage extends Map {
|
|
26
2
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHR0cC1jYWNoaW5nLW1lbW9yeS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctaHR0cC1jYWNoaW5nL3NyYy9saWIvc3RvcmFnZS9uZy1odHRwLWNhY2hpbmctbWVtb3J5LXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLDBCQUEyQixTQUFRLEdBQXlDO0NBQTZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2UgfSBmcm9tICcuL25nLWh0dHAtY2FjaGluZy1zdG9yYWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE5nSHR0cENhY2hpbmdFbnRyeSB9IGZyb20gJy4uL25nLWh0dHAtY2FjaGluZy5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBOZ0h0dHBDYWNoaW5nTWVtb3J5U3RvcmFnZSBleHRlbmRzIE1hcDxzdHJpbmcsIE5nSHR0cENhY2hpbmdFbnRyeTxhbnksIGFueT4+IGltcGxlbWVudHMgTmdIdHRwQ2FjaGluZ1N0b3JhZ2VJbnRlcmZhY2UgeyB9XHJcbiJdfQ==
|
|
@@ -4,31 +4,7 @@ import { InjectionToken, VERSION, isDevMode, Injectable, Inject, Optional, NgMod
|
|
|
4
4
|
import { of, asyncScheduler, scheduled } from 'rxjs';
|
|
5
5
|
import { tap, finalize, shareReplay } from 'rxjs/operators';
|
|
6
6
|
|
|
7
|
-
class NgHttpCachingMemoryStorage {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.store = new Map();
|
|
10
|
-
}
|
|
11
|
-
get size() {
|
|
12
|
-
return this.store.size;
|
|
13
|
-
}
|
|
14
|
-
clear() {
|
|
15
|
-
this.store.clear();
|
|
16
|
-
}
|
|
17
|
-
delete(key) {
|
|
18
|
-
return this.store.delete(key);
|
|
19
|
-
}
|
|
20
|
-
forEach(callbackfn) {
|
|
21
|
-
return this.store.forEach(callbackfn);
|
|
22
|
-
}
|
|
23
|
-
get(key) {
|
|
24
|
-
return this.store.get(key);
|
|
25
|
-
}
|
|
26
|
-
has(key) {
|
|
27
|
-
return this.store.has(key);
|
|
28
|
-
}
|
|
29
|
-
set(key, value) {
|
|
30
|
-
this.store.set(key, value);
|
|
31
|
-
}
|
|
7
|
+
class NgHttpCachingMemoryStorage extends Map {
|
|
32
8
|
}
|
|
33
9
|
|
|
34
10
|
const NG_HTTP_CACHING_CONTEXT = new HttpContextToken(() => ({}));
|
|
@@ -164,34 +140,44 @@ class NgHttpCachingService {
|
|
|
164
140
|
clearCacheByKey(key) {
|
|
165
141
|
return this.config.store.delete(key);
|
|
166
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Clear the cache by keys
|
|
145
|
+
*/
|
|
146
|
+
clearCacheByKeys(keys) {
|
|
147
|
+
let counter = 0;
|
|
148
|
+
if (keys) {
|
|
149
|
+
for (const key of keys) {
|
|
150
|
+
if (this.clearCacheByKey(key)) {
|
|
151
|
+
counter++;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return counter;
|
|
156
|
+
}
|
|
167
157
|
/**
|
|
168
158
|
* Clear the cache by regex
|
|
169
159
|
*/
|
|
170
160
|
clearCacheByRegex(regex) {
|
|
171
|
-
|
|
161
|
+
const keys = [];
|
|
172
162
|
this.config.store.forEach((_, key) => {
|
|
173
163
|
if (regex.test(key)) {
|
|
174
|
-
|
|
175
|
-
count++;
|
|
176
|
-
}
|
|
164
|
+
keys.push(key);
|
|
177
165
|
}
|
|
178
166
|
});
|
|
179
|
-
return
|
|
167
|
+
return this.clearCacheByKeys(keys);
|
|
180
168
|
}
|
|
181
169
|
/**
|
|
182
170
|
* Clear the cache by TAG
|
|
183
171
|
*/
|
|
184
172
|
clearCacheByTag(tag) {
|
|
185
|
-
|
|
173
|
+
const keys = [];
|
|
186
174
|
this.config.store.forEach((entry, key) => {
|
|
187
175
|
const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);
|
|
188
176
|
if (tagHeader && tagHeader.split(',').includes(tag)) {
|
|
189
|
-
|
|
190
|
-
count++;
|
|
191
|
-
}
|
|
177
|
+
keys.push(key);
|
|
192
178
|
}
|
|
193
179
|
});
|
|
194
|
-
return
|
|
180
|
+
return this.clearCacheByKeys(keys);
|
|
195
181
|
}
|
|
196
182
|
/**
|
|
197
183
|
* Run garbage collector (delete expired cache entry)
|
|
@@ -201,11 +187,13 @@ class NgHttpCachingService {
|
|
|
201
187
|
return false;
|
|
202
188
|
}
|
|
203
189
|
this.gcLock = true;
|
|
190
|
+
const keys = [];
|
|
204
191
|
this.config.store.forEach((entry, key) => {
|
|
205
192
|
if (this.isExpired(entry)) {
|
|
206
|
-
|
|
193
|
+
keys.push(key);
|
|
207
194
|
}
|
|
208
195
|
});
|
|
196
|
+
this.clearCacheByKeys(keys);
|
|
209
197
|
this.gcLock = false;
|
|
210
198
|
return true;
|
|
211
199
|
}
|
|
@@ -396,10 +384,10 @@ class NgHttpCachingService {
|
|
|
396
384
|
Object.keys(object).forEach(key => this.deepFreeze(object[key]));
|
|
397
385
|
return object;
|
|
398
386
|
}
|
|
399
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.
|
|
400
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.
|
|
387
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingService, deps: [{ token: NG_HTTP_CACHING_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
388
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingService }); }
|
|
401
389
|
}
|
|
402
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.
|
|
390
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingService, decorators: [{
|
|
403
391
|
type: Injectable
|
|
404
392
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
405
393
|
type: Inject,
|
|
@@ -459,10 +447,10 @@ class NgHttpCachingInterceptorService {
|
|
|
459
447
|
});
|
|
460
448
|
return next.handle(cloned);
|
|
461
449
|
}
|
|
462
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.
|
|
463
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.
|
|
450
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingInterceptorService, deps: [{ token: NgHttpCachingService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
451
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingInterceptorService }); }
|
|
464
452
|
}
|
|
465
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.
|
|
453
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingInterceptorService, decorators: [{
|
|
466
454
|
type: Injectable
|
|
467
455
|
}], ctorParameters: () => [{ type: NgHttpCachingService }] });
|
|
468
456
|
|
|
@@ -478,9 +466,9 @@ class NgHttpCachingModule {
|
|
|
478
466
|
],
|
|
479
467
|
};
|
|
480
468
|
}
|
|
481
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.
|
|
482
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.
|
|
483
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.
|
|
469
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
470
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingModule }); }
|
|
471
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingModule, providers: [
|
|
484
472
|
NgHttpCachingService,
|
|
485
473
|
NgHttpCachingInterceptorService,
|
|
486
474
|
{
|
|
@@ -490,7 +478,7 @@ class NgHttpCachingModule {
|
|
|
490
478
|
},
|
|
491
479
|
] }); }
|
|
492
480
|
}
|
|
493
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.
|
|
481
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgHttpCachingModule, decorators: [{
|
|
494
482
|
type: NgModule,
|
|
495
483
|
args: [{
|
|
496
484
|
providers: [
|
|
@@ -616,13 +604,7 @@ class NgHttpCachingBrowserStorage {
|
|
|
616
604
|
const item = this.storage.getItem(key);
|
|
617
605
|
if (item) {
|
|
618
606
|
const parsedItem = JSON.parse(item);
|
|
619
|
-
return
|
|
620
|
-
url: parsedItem.url,
|
|
621
|
-
response: deserializeResponse(parsedItem.response),
|
|
622
|
-
request: deserializeRequest(parsedItem.request),
|
|
623
|
-
addedTime: parsedItem.addedTime,
|
|
624
|
-
version: parsedItem.version
|
|
625
|
-
};
|
|
607
|
+
return this.deserialize(parsedItem);
|
|
626
608
|
}
|
|
627
609
|
return undefined;
|
|
628
610
|
}
|
|
@@ -642,14 +624,26 @@ class NgHttpCachingBrowserStorage {
|
|
|
642
624
|
if (!key.startsWith(KEY_PREFIX)) {
|
|
643
625
|
key = KEY_PREFIX + key;
|
|
644
626
|
}
|
|
645
|
-
const unParsedItem =
|
|
627
|
+
const unParsedItem = this.serialize(value);
|
|
628
|
+
this.storage.setItem(key, JSON.stringify(unParsedItem));
|
|
629
|
+
}
|
|
630
|
+
serialize(value) {
|
|
631
|
+
return {
|
|
646
632
|
url: value.url,
|
|
647
633
|
response: serializeResponse(value.response),
|
|
648
634
|
request: serializeRequest(value.request),
|
|
649
635
|
addedTime: value.addedTime,
|
|
650
636
|
version: value.version
|
|
651
637
|
};
|
|
652
|
-
|
|
638
|
+
}
|
|
639
|
+
deserialize(value) {
|
|
640
|
+
return {
|
|
641
|
+
url: value.url,
|
|
642
|
+
response: deserializeResponse(value.response),
|
|
643
|
+
request: deserializeRequest(value.request),
|
|
644
|
+
addedTime: value.addedTime,
|
|
645
|
+
version: value.version
|
|
646
|
+
};
|
|
653
647
|
}
|
|
654
648
|
}
|
|
655
649
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-http-caching.mjs","sources":["../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-memory-storage.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching-interceptor.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.module.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-browser-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-local-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-session-storage.ts","../../../projects/ng-http-caching/src/public-api.ts","../../../projects/ng-http-caching/src/ng-http-caching.ts"],"sourcesContent":["import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\n\r\nexport class NgHttpCachingMemoryStorage implements NgHttpCachingStorageInterface {\r\n\r\n get size(): number {\r\n return this.store.size;\r\n }\r\n\r\n private store = new Map<string, NgHttpCachingEntry<any, any>>();\r\n\r\n clear(): void {\r\n this.store.clear();\r\n }\r\n\r\n delete(key: string): boolean {\r\n return this.store.delete(key);\r\n }\r\n\r\n forEach<K, T>(callbackfn: (value: NgHttpCachingEntry<K, T>, key: string) => void): void {\r\n return this.store.forEach(callbackfn);\r\n }\r\n\r\n get<K, T>(key: string): Readonly<NgHttpCachingEntry<K, T>> | undefined {\r\n return this.store.get(key);\r\n }\r\n\r\n has(key: string): boolean {\r\n return this.store.has(key);\r\n }\r\n\r\n set<K, T>(key: string, value: NgHttpCachingEntry<K, T>): void {\r\n this.store.set(key, value);\r\n }\r\n}\r\n","import { Injectable, InjectionToken, Inject, Optional, VERSION, isDevMode } from '@angular/core';\r\nimport { HttpRequest, HttpResponse, HttpEvent, HttpContextToken, HttpContext } from '@angular/common/http';\r\nimport { Observable } from 'rxjs/internal/Observable';\r\nimport { NgHttpCachingStorageInterface } from './storage/ng-http-caching-storage.interface';\r\nimport { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';\r\n\r\nexport type NgHttpCachingContext = Pick<NgHttpCachingConfig, 'getKey' | 'isCacheable' | 'isExpired' | 'isValid'>;\r\n\r\nexport const NG_HTTP_CACHING_CONTEXT = new HttpContextToken<NgHttpCachingContext>(() => ({}));\r\n\r\nexport const withNgHttpCachingContext = (value: NgHttpCachingContext, context: HttpContext = new HttpContext()) => context.set(NG_HTTP_CACHING_CONTEXT, value)\r\n\r\nexport interface NgHttpCachingEntry<K = any, T = any> {\r\n /**\r\n * URL\r\n */\r\n url: string;\r\n /**\r\n * HttpResponse\r\n */\r\n response: HttpResponse<T>;\r\n /**\r\n * HttpRequest\r\n */\r\n request: HttpRequest<K>;\r\n /**\r\n * Timestamp of add to cache time\r\n */\r\n addedTime: number;\r\n /**\r\n * Cache version\r\n */\r\n version: string;\r\n}\r\n\r\nexport const NG_HTTP_CACHING_CONFIG = new InjectionToken<NgHttpCachingContext>(\r\n 'ng-http-caching.config'\r\n);\r\n\r\nexport enum NgHttpCachingStrategy {\r\n /**\r\n * All request are cacheable if HTTP method is into `allowedMethod`\r\n */\r\n ALLOW_ALL = 'ALLOW_ALL',\r\n /**\r\n * Only the request with `X-NG-HTTP-CACHING-ALLOW-CACHE` header are cacheable if HTTP method is into `allowedMethod`\r\n */\r\n DISALLOW_ALL = 'DISALLOW_ALL'\r\n}\r\n\r\nexport enum NgHttpCachingHeaders {\r\n /**\r\n * Request is cacheable if HTTP method is into `allowedMethod`\r\n */\r\n ALLOW_CACHE = 'X-NG-HTTP-CACHING-ALLOW-CACHE',\r\n /**\r\n * Request isn't cacheable\r\n */\r\n DISALLOW_CACHE = 'X-NG-HTTP-CACHING-DISALLOW-CACHE',\r\n /**\r\n * Specific cache lifetime for the request\r\n */\r\n LIFETIME = 'X-NG-HTTP-CACHING-LIFETIME',\r\n /**\r\n * You can tag multiple request by adding this header with the same tag and \r\n * using `NgHttpCachingService.clearCacheByTag(tag: string)` for delete all the tagged request\r\n */\r\n TAG = 'X-NG-HTTP-CACHING-TAG'\r\n}\r\n\r\nexport const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);\r\n\r\nexport const NG_HTTP_CACHING_SECOND_IN_MS = 1000;\r\nexport const NG_HTTP_CACHING_MINUTE_IN_MS = NG_HTTP_CACHING_SECOND_IN_MS * 60;\r\nexport const NG_HTTP_CACHING_HOUR_IN_MS = NG_HTTP_CACHING_MINUTE_IN_MS * 60;\r\nexport const NG_HTTP_CACHING_DAY_IN_MS = NG_HTTP_CACHING_HOUR_IN_MS * 24;\r\nexport const NG_HTTP_CACHING_WEEK_IN_MS = NG_HTTP_CACHING_DAY_IN_MS * 7;\r\nexport const NG_HTTP_CACHING_MONTH_IN_MS = NG_HTTP_CACHING_DAY_IN_MS * 30;\r\nexport const NG_HTTP_CACHING_YEAR_IN_MS = NG_HTTP_CACHING_DAY_IN_MS * 365;\r\n\r\nexport interface NgHttpCachingConfig {\r\n /**\r\n * Set the cache store. You can implement your custom store by implement the `NgHttpCachingStorageInterface` interface, eg.:\r\n */\r\n store?: NgHttpCachingStorageInterface;\r\n /**\r\n * Number of millisecond that a response is stored in the cache. \r\n * You can set specific \"lifetime\" for each request by add the header `X-NG-HTTP-CACHING-LIFETIME` (see example below).\r\n */\r\n lifetime?: number;\r\n /**\r\n * Array of allowed HTTP methods to cache. \r\n * You can allow multiple methods, eg.: `['GET', 'POST', 'PUT', 'DELETE', 'HEAD']` or \r\n * allow all methods by: `['ALL']`. If `allowedMethod` is an empty array (`[]`), no response are cached.\r\n * *Warning!* `NgHttpCaching` use the full url (url with query parameters) as unique key for the cached response,\r\n * this is correct for the `GET` request but is _potentially_ wrong for other type of request (eg. `POST`, `PUT`). \r\n * You can set a different \"key\" by customizing the `getKey` config method (see `getKey` section).\r\n */\r\n allowedMethod?: string[];\r\n /**\r\n * Set the cache strategy, possible strategies are:\r\n * - `NgHttpCachingStrategy.ALLOW_ALL`: All request are cacheable if HTTP method is into `allowedMethod`;\r\n * - `NgHttpCachingStrategy.DISALLOW_ALL`: Only the request with `X-NG-HTTP-CACHING-ALLOW-CACHE` header are cacheable if HTTP method is into `allowedMethod`;\r\n */\r\n cacheStrategy?: NgHttpCachingStrategy;\r\n /**\r\n * Cache version. When you have a breaking change, change the version, and it'll delete the current cache automatically.\r\n * The default value is Angular major version (eg. 13), in this way, the cache is invalidated on every Angular upgrade.\r\n */\r\n version?: string;\r\n /**\r\n * If this function return `true` the request is expired and a new request is send to backend, if return `false` isn't expired. \r\n * If the result is `undefined`, the normal behaviour is provided.\r\n */\r\n isExpired?: <K, T>(entry: NgHttpCachingEntry<K, T>) => boolean | undefined | void;\r\n /**\r\n * If this function return `true` the request is cacheable, if return `false` isn't cacheable. \r\n * If the result is `undefined`, the normal behaviour is provided.\r\n */\r\n isCacheable?: <K>(req: HttpRequest<K>) => boolean | undefined | void;\r\n /**\r\n * This function return the unique key (`string`) for store the response into the cache. \r\n * If the result is `undefined`, the normal behaviour is provided.\r\n */\r\n getKey?: <K>(req: HttpRequest<K>) => string | undefined | void;\r\n /**\r\n * If this function return `true` the cache entry is valid and can be stored, if return `false` isn't valid. \r\n * If the result is `undefined`, the normal behaviour is provided.\r\n */\r\n isValid?: <K, T>(entry: NgHttpCachingEntry<K, T>) => boolean | undefined | void;\r\n}\r\n\r\nexport interface NgHttpCachingDefaultConfig extends NgHttpCachingConfig {\r\n store: NgHttpCachingStorageInterface;\r\n lifetime: number;\r\n allowedMethod: string[];\r\n cacheStrategy: NgHttpCachingStrategy;\r\n version: string;\r\n}\r\n\r\nexport const NgHttpCachingConfigDefault: Readonly<NgHttpCachingDefaultConfig> = {\r\n store: new NgHttpCachingMemoryStorage(),\r\n lifetime: NG_HTTP_CACHING_HOUR_IN_MS,\r\n version: VERSION.major,\r\n allowedMethod: ['GET', 'HEAD'],\r\n cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,\r\n};\r\n\r\n@Injectable()\r\nexport class NgHttpCachingService {\r\n\r\n private readonly queue = new Map<string, Observable<HttpEvent<any>>>();\r\n\r\n private readonly config: NgHttpCachingDefaultConfig;\r\n\r\n private gcLock = false;\r\n\r\n private devMode: boolean = isDevMode();\r\n\r\n constructor(\r\n @Inject(NG_HTTP_CACHING_CONFIG) @Optional() config: Readonly<NgHttpCachingConfig>\r\n ) {\r\n if (config) {\r\n this.config = { ...NgHttpCachingConfigDefault, ...config };\r\n } else {\r\n this.config = { ...NgHttpCachingConfigDefault };\r\n }\r\n // start cache clean\r\n this.runGc();\r\n }\r\n\r\n /**\r\n * Return the config\r\n */\r\n getConfig(): Readonly<NgHttpCachingConfig> {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Return the queue map\r\n */\r\n getQueue(): Readonly<Map<string, Observable<HttpEvent<any>>>> {\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * Return the cache store\r\n */\r\n getStore(): Readonly<NgHttpCachingStorageInterface> {\r\n return this.config.store;\r\n }\r\n\r\n /**\r\n * Return response from cache\r\n */\r\n getFromCache<K, T>(req: HttpRequest<K>): Readonly<HttpResponse<T>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: NgHttpCachingEntry<K, T> | undefined = this.config.store.get<K, T>(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n if (this.isExpired(cached)) {\r\n this.clearCacheByKey(key);\r\n return undefined;\r\n }\r\n\r\n return this.deepFreeze(cached.response);\r\n }\r\n\r\n /**\r\n * Add response to cache\r\n */\r\n addToCache<K, T>(req: HttpRequest<K>, res: HttpResponse<T>): boolean {\r\n const entry: NgHttpCachingEntry<K, T> = {\r\n url: req.urlWithParams,\r\n response: res,\r\n request: req,\r\n addedTime: Date.now(),\r\n version: this.config.version,\r\n };\r\n if (this.isValid(entry)) {\r\n const key: string = this.getKey(req);\r\n this.config.store.set(key, entry);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Delete response from cache\r\n */\r\n deleteFromCache<K>(req: HttpRequest<K>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.clearCacheByKey(key);\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clearCache(): void {\r\n this.config.store.clear();\r\n }\r\n\r\n /**\r\n * Clear the cache by key\r\n */\r\n clearCacheByKey(key: string): boolean {\r\n return this.config.store.delete(key);\r\n }\r\n\r\n /**\r\n * Clear the cache by regex\r\n */\r\n clearCacheByRegex<K, T>(regex: RegExp): number {\r\n let count = 0;\r\n this.config.store.forEach<K, T>((_: NgHttpCachingEntry<K, T>, key: string) => {\r\n if (regex.test(key)) {\r\n if (this.clearCacheByKey(key)) {\r\n count++;\r\n }\r\n }\r\n });\r\n return count;\r\n }\r\n\r\n /**\r\n * Clear the cache by TAG\r\n */\r\n clearCacheByTag<K, T>(tag: string): number {\r\n let count = 0;\r\n this.config.store.forEach<K, T>((entry: NgHttpCachingEntry<K, T>, key: string) => {\r\n const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);\r\n if (tagHeader && tagHeader.split(',').includes(tag)) {\r\n if (this.clearCacheByKey(key)) {\r\n count++;\r\n }\r\n }\r\n });\r\n return count;\r\n }\r\n\r\n /**\r\n * Run garbage collector (delete expired cache entry)\r\n */\r\n runGc<K, T>(): boolean {\r\n if (this.gcLock) {\r\n return false;\r\n }\r\n this.gcLock = true;\r\n this.config.store.forEach<K, T>((entry: NgHttpCachingEntry<K, T>, key: string) => {\r\n if (this.isExpired(entry)) {\r\n this.clearCacheByKey(key);\r\n }\r\n });\r\n this.gcLock = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if cache entry is expired\r\n */\r\n isExpired<K, T>(entry: NgHttpCachingEntry<K, T>): boolean {\r\n // if user provide custom method, use it\r\n const context = entry.request.context.get(NG_HTTP_CACHING_CONTEXT);\r\n if (typeof context?.isExpired === 'function') {\r\n const result = context.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if user provide custom method, use it\r\n if (typeof this.config.isExpired === 'function') {\r\n const result = this.config.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if version change, always expire\r\n if (this.config.version !== entry.version) {\r\n return true;\r\n }\r\n // config/default lifetime\r\n let lifetime: number = this.config.lifetime;\r\n // request has own lifetime\r\n const headerLifetime = entry.request.headers.get(NgHttpCachingHeaders.LIFETIME);\r\n if (headerLifetime) {\r\n lifetime = +headerLifetime;\r\n }\r\n // never expire if 0\r\n if (lifetime === 0) {\r\n return false;\r\n }\r\n // wrong lifetime\r\n if (lifetime < 0 || isNaN(lifetime)) {\r\n throw new Error('lifetime must be greater than or equal 0');\r\n }\r\n return entry.addedTime + lifetime < Date.now();\r\n }\r\n\r\n /**\r\n * Return true if cache entry is valid for store in the cache\r\n * Default behaviour is whether the status code falls in the 2xx range.\r\n */\r\n isValid<K, T>(entry: NgHttpCachingEntry<K, T>): boolean {\r\n const context = entry.request.context.get(NG_HTTP_CACHING_CONTEXT);\r\n // if user provide custom method, use it\r\n if (typeof context.isValid === 'function') {\r\n const result = context.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if user provide custom method, use it\r\n if (typeof this.config.isValid === 'function') {\r\n const result = this.config.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // different version\r\n if (this.config.version !== entry.version) {\r\n return false;\r\n }\r\n return entry.response.ok;\r\n }\r\n\r\n /**\r\n * Return true if the request is cacheable\r\n */\r\n isCacheable<K>(req: HttpRequest<K>): boolean {\r\n const context = req.context.get(NG_HTTP_CACHING_CONTEXT);\r\n // if user provide custom method, use it\r\n if (typeof context?.isCacheable === 'function') {\r\n const result = context.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if user provide custom method, use it\r\n if (typeof this.config.isCacheable === 'function') {\r\n const result = this.config.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // request has disallow cache header\r\n if (req.headers.has(NgHttpCachingHeaders.DISALLOW_CACHE)) {\r\n return false;\r\n }\r\n // strategy is disallow all...\r\n if (this.config.cacheStrategy === NgHttpCachingStrategy.DISALLOW_ALL) {\r\n // request isn't allowed if come without allow header\r\n if (!req.headers.has(NgHttpCachingHeaders.ALLOW_CACHE)) {\r\n return false;\r\n }\r\n }\r\n // if allowed method is only ALL, allow all http methods\r\n if (this.config.allowedMethod.length === 1) {\r\n if (this.config.allowedMethod[0] === 'ALL') {\r\n return true;\r\n }\r\n }\r\n // request is allowed if method is in allowedMethod\r\n return this.config.allowedMethod.indexOf(req.method) !== -1;\r\n }\r\n\r\n /**\r\n * Return the cache key.\r\n * Default key is http method plus url with query parameters, eg.:\r\n * `GET@https://github.com/nigrosimone/ng-http-caching`\r\n */\r\n getKey<K>(req: HttpRequest<K>): string {\r\n // if user provide custom method, use it\r\n const context = req.context.get(NG_HTTP_CACHING_CONTEXT);\r\n if (typeof context.getKey === 'function') {\r\n const result = context.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if user provide custom method, use it\r\n if (typeof this.config.getKey === 'function') {\r\n const result = this.config.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // default key is req.method plus url with query parameters\r\n return req.method + '@' + req.urlWithParams;\r\n }\r\n\r\n /**\r\n * Return observable from cache\r\n */\r\n getFromQueue<K, T>(req: HttpRequest<K>): Observable<HttpEvent<T>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: Observable<HttpEvent<T>> | undefined = this.queue.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n return cached;\r\n }\r\n\r\n /**\r\n * Add observable to cache\r\n */\r\n addToQueue<K, T>(req: HttpRequest<K>, obs: Observable<HttpEvent<T>>): void {\r\n const key: string = this.getKey(req);\r\n this.queue.set(key, obs);\r\n }\r\n\r\n /**\r\n * Delete observable from cache\r\n */\r\n deleteFromQueue<K>(req: HttpRequest<K>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.queue.delete(key);\r\n }\r\n\r\n /**\r\n * Recursively Object.freeze simple Javascript structures consisting of plain objects, arrays, and primitives.\r\n * Make the data immutable.\r\n * @returns immutable object\r\n */\r\n private deepFreeze<S>(object: S): Readonly<S> {\r\n // No freezing in production (for better performance).\r\n if (!this.devMode || !object || typeof object !== 'object') {\r\n return object as Readonly<S>;\r\n }\r\n\r\n // When already frozen, we assume its children are frozen (for better performance).\r\n // This should be true if you always use `deepFreeze` to freeze objects.\r\n //\r\n // Note that Object.isFrozen will also return `true` for primitives (numbers,\r\n // strings, booleans, undefined, null), so there is no need to check for\r\n // those explicitly.\r\n if (Object.isFrozen(object)) {\r\n return object as Readonly<S>;\r\n }\r\n\r\n // At this point we know that we're dealing with either an array or plain object, so\r\n // just freeze it and recurse on its values.\r\n Object.freeze(object);\r\n Object.keys(object).forEach(key => this.deepFreeze((object as any)[key]));\r\n\r\n return object as Readonly<S>;\r\n }\r\n}\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { asyncScheduler, Observable, of, scheduled } from 'rxjs';\r\nimport { tap, finalize, shareReplay } from 'rxjs/operators';\r\nimport { NgHttpCachingService, NgHttpCachingHeadersList } from './ng-http-caching.service';\r\n\r\n@Injectable()\r\nexport class NgHttpCachingInterceptorService implements HttpInterceptor {\r\n\r\n constructor(private readonly cacheService: NgHttpCachingService) { }\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n // run garbage collector\r\n this.cacheService.runGc();\r\n\r\n // Don't cache if it's not cacheable\r\n if (!this.cacheService.isCacheable(req)) {\r\n return this.sendRequest(req, next);\r\n }\r\n\r\n // Checked if there is pending response for this request\r\n const cachedObservable: Observable<HttpEvent<any>> | undefined = this.cacheService.getFromQueue(req);\r\n if (cachedObservable) {\r\n // console.log('cachedObservable',cachedObservable);\r\n return cachedObservable;\r\n }\r\n\r\n // Checked if there is cached response for this request\r\n const cachedResponse: HttpResponse<any> | undefined = this.cacheService.getFromCache(req);\r\n if (cachedResponse) {\r\n // console.log('cachedResponse');\r\n return scheduled(of(cachedResponse.clone()), asyncScheduler);\r\n }\r\n\r\n // If the request of going through for first time\r\n // then let the request proceed and cache the response\r\n // console.log('sendRequest', req);\r\n const shared = this.sendRequest(req, next).pipe(\r\n tap(event => {\r\n if (event instanceof HttpResponse) {\r\n this.cacheService.addToCache(req, event.clone());\r\n }\r\n }),\r\n finalize(() => {\r\n // delete pending request\r\n this.cacheService.deleteFromQueue(req);\r\n }),\r\n shareReplay()\r\n );\r\n\r\n // add pending request to queue for cache parallel request\r\n this.cacheService.addToQueue(req, shared);\r\n\r\n return shared;\r\n }\r\n\r\n /**\r\n * Send http request (next handler)\r\n */\r\n sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n let cloned: HttpRequest<any> = req.clone();\r\n // trim custom headers before send request\r\n NgHttpCachingHeadersList.forEach(ngHttpCachingHeaders => {\r\n if (cloned.headers.has(ngHttpCachingHeaders)) {\r\n cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });\r\n }\r\n });\r\n return next.handle(cloned);\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport {\r\n NG_HTTP_CACHING_CONFIG,\r\n NgHttpCachingConfig,\r\n NgHttpCachingService,\r\n} from './ng-http-caching.service';\r\nimport { NgHttpCachingInterceptorService } from './ng-http-caching-interceptor.service';\r\n\r\n@NgModule({\r\n providers: [\r\n NgHttpCachingService,\r\n NgHttpCachingInterceptorService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: NgHttpCachingInterceptorService,\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class NgHttpCachingModule {\r\n static forRoot(\r\n ngHttpCachingConfig?: NgHttpCachingConfig\r\n ): ModuleWithProviders<NgHttpCachingModule> {\r\n return {\r\n ngModule: NgHttpCachingModule,\r\n providers: [\r\n {\r\n provide: NG_HTTP_CACHING_CONFIG,\r\n useValue: ngHttpCachingConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\nimport { HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\r\n\r\nconst KEY_PREFIX = 'NgHttpCaching::';\r\n\r\nexport const serializeRequest = (req: HttpRequest<any>): string => {\r\n const request = req.clone(); // Make a clone, useful for doing destructive things\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n method: request.method, // The Request Method, e.g. GET, POST, DELETE\r\n url: request.url, // The URL\r\n params: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ), // The request parameters\r\n withCredentials: request.withCredentials, // Whether credentials are being sent\r\n responseType: request.responseType, // The response type\r\n body: request.serializeBody() // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport const serializeResponse = (res: HttpResponse<any>): string => {\r\n const response = res.clone();\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n response.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, response.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n status: response.status,\r\n statusText: response.statusText,\r\n url: response.url,\r\n body: response.body // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport const deserializeRequest = <T = any>(req: string): HttpRequest<T> => {\r\n const request = JSON.parse(req);\r\n const headers = new HttpHeaders(request.headers);\r\n const params = new HttpParams(); // Probably some way to make this a one-liner, but alas, there are no good docs\r\n for (const parameter in request.params) {\r\n request.params[parameter].forEach((paramValue: string) => params.append(parameter, paramValue));\r\n }\r\n return new HttpRequest(request.method, request.url, request.body, {\r\n headers,\r\n params,\r\n responseType: request.responseType,\r\n withCredentials: request.withCredentials\r\n });\r\n}\r\n\r\nexport const deserializeResponse = <T = any>(res: string): HttpResponse<T> => {\r\n const response = JSON.parse(res);\r\n return new HttpResponse<T>({\r\n url: response.url,\r\n headers: new HttpHeaders(response.headers),\r\n body: response.body,\r\n status: response.status,\r\n statusText: response.statusText,\r\n });\r\n}\r\n\r\nexport class NgHttpCachingBrowserStorage implements NgHttpCachingStorageInterface {\r\n\r\n constructor(private storage: Storage) { }\r\n\r\n get size(): number {\r\n let count = 0;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n clear(): void {\r\n for (let i = this.storage.length; i >= 0; i--) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n this.storage.removeItem(key);\r\n }\r\n }\r\n }\r\n\r\n delete(key: string): boolean {\r\n if (!key) {\r\n return false;\r\n }\r\n if (!key.startsWith(KEY_PREFIX)) {\r\n key = KEY_PREFIX + key;\r\n }\r\n this.storage.removeItem(key);\r\n return true;\r\n }\r\n\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n // iterate this.storage\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const keyWithPrefix = this.storage.key(i);\r\n if (keyWithPrefix && keyWithPrefix.startsWith(KEY_PREFIX)) {\r\n const value = this.get(keyWithPrefix);\r\n if (value) {\r\n const keyWithoutPrefix = keyWithPrefix.substring(KEY_PREFIX.length);\r\n callbackfn(value, keyWithoutPrefix);\r\n }\r\n }\r\n }\r\n }\r\n\r\n get(key: string): Readonly<NgHttpCachingEntry> | undefined {\r\n if (!key) {\r\n return undefined;\r\n }\r\n if (!key.startsWith(KEY_PREFIX)) {\r\n key = KEY_PREFIX + key;\r\n }\r\n const item = this.storage.getItem(key);\r\n if (item) {\r\n const parsedItem: StorageEntry = JSON.parse(item);\r\n return {\r\n url: parsedItem.url,\r\n response: deserializeResponse(parsedItem.response),\r\n request: deserializeRequest(parsedItem.request),\r\n addedTime: parsedItem.addedTime,\r\n version: parsedItem.version\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n has(key: string): boolean {\r\n if (!key) {\r\n return false;\r\n }\r\n if (!key.startsWith(KEY_PREFIX)) {\r\n key = KEY_PREFIX + key;\r\n }\r\n return !!this.storage.getItem(key);\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n if (!key) {\r\n return;\r\n }\r\n if (!key.startsWith(KEY_PREFIX)) {\r\n key = KEY_PREFIX + key;\r\n }\r\n const unParsedItem: StorageEntry = {\r\n url: value.url,\r\n response: serializeResponse(value.response),\r\n request: serializeRequest(value.request),\r\n addedTime: value.addedTime,\r\n version: value.version\r\n };\r\n this.storage.setItem(key, JSON.stringify(unParsedItem));\r\n }\r\n}\r\n\r\ninterface StorageEntry {\r\n url: string;\r\n response: string;\r\n request: string;\r\n addedTime: number;\r\n version: string;\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingLocalStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor() {\r\n super(localStorage);\r\n }\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingSessionStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor() {\r\n super(sessionStorage);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ng-http-caching\r\n */\r\n\r\nexport * from './lib/ng-http-caching-interceptor.service';\r\nexport * from './lib/ng-http-caching.service';\r\nexport * from './lib/ng-http-caching.module';\r\nexport * from './lib/storage/ng-http-caching-storage.interface';\r\nexport * from './lib/storage/ng-http-caching-memory-storage';\r\nexport * from './lib/storage/ng-http-caching-local-storage';\r\nexport * from './lib/storage/ng-http-caching-session-storage';\r\nexport * from './lib/storage/ng-http-caching-browser-storage';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgHttpCachingService"],"mappings":";;;;;;MAGa,0BAA0B,CAAA;AAAvC,IAAA,WAAA,GAAA;AAMY,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,GAAG,EAAwC,CAAC;KAyBnE;AA7BG,IAAA,IAAI,IAAI,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;KAC1B;IAID,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;KACtB;AAED,IAAA,MAAM,CAAC,GAAW,EAAA;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KACjC;AAED,IAAA,OAAO,CAAO,UAAkE,EAAA;QAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;KACzC;AAED,IAAA,GAAG,CAAO,GAAW,EAAA;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC9B;AAED,IAAA,GAAG,CAAC,GAAW,EAAA;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC9B;IAED,GAAG,CAAO,GAAW,EAAE,KAA+B,EAAA;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;KAC9B;AACJ;;AC1BM,MAAM,uBAAuB,GAAG,IAAI,gBAAgB,CAAuB,OAAO,EAAE,CAAC,EAAE;MAEjF,wBAAwB,GAAG,CAAC,KAA2B,EAAE,OAAuB,GAAA,IAAI,WAAW,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,EAAC;MAyBjJ,sBAAsB,GAAG,IAAI,cAAc,CACtD,wBAAwB,EACxB;IAEU,sBASX;AATD,CAAA,UAAY,qBAAqB,EAAA;AAC/B;;AAEG;AACH,IAAA,qBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACvB;;AAEG;AACH,IAAA,qBAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC/B,CAAC,EATW,qBAAqB,KAArB,qBAAqB,GAShC,EAAA,CAAA,CAAA,CAAA;IAEW,qBAkBX;AAlBD,CAAA,UAAY,oBAAoB,EAAA;AAC9B;;AAEG;AACH,IAAA,oBAAA,CAAA,aAAA,CAAA,GAAA,+BAA6C,CAAA;AAC7C;;AAEG;AACH,IAAA,oBAAA,CAAA,gBAAA,CAAA,GAAA,kCAAmD,CAAA;AACnD;;AAEG;AACH,IAAA,oBAAA,CAAA,UAAA,CAAA,GAAA,4BAAuC,CAAA;AACvC;;;AAGG;AACH,IAAA,oBAAA,CAAA,KAAA,CAAA,GAAA,uBAA6B,CAAA;AAC/B,CAAC,EAlBW,oBAAoB,KAApB,oBAAoB,GAkB/B,EAAA,CAAA,CAAA,CAAA;AAEY,MAAA,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE;AAErE,MAAM,4BAA4B,GAAG,KAAK;AACpC,MAAA,4BAA4B,GAAG,4BAA4B,GAAG,GAAG;AACjE,MAAA,0BAA0B,GAAG,4BAA4B,GAAG,GAAG;AAC/D,MAAA,yBAAyB,GAAG,0BAA0B,GAAG,GAAG;AAC5D,MAAA,0BAA0B,GAAG,yBAAyB,GAAG,EAAE;AAC3D,MAAA,2BAA2B,GAAG,yBAAyB,GAAG,GAAG;AAC7D,MAAA,0BAA0B,GAAG,yBAAyB,GAAG,IAAI;AA8D7D,MAAA,0BAA0B,GAAyC;IAC9E,KAAK,EAAE,IAAI,0BAA0B,EAAE;AACvC,IAAA,QAAQ,EAAE,0BAA0B;IACpC,OAAO,EAAE,OAAO,CAAC,KAAK;AACtB,IAAA,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,qBAAqB,CAAC,SAAS;EAC9C;MAGW,oBAAoB,CAAA;AAU/B,IAAA,WAAA,CAC8C,MAAqC,EAAA;AATlE,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,GAAG,EAAsC,CAAC;QAI/D,IAAM,CAAA,MAAA,GAAG,KAAK,CAAC;QAEf,IAAO,CAAA,OAAA,GAAY,SAAS,EAAE,CAAC;AAKrC,QAAA,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,0BAA0B,EAAE,GAAG,MAAM,EAAE,CAAC;AAC5D,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,0BAA0B,EAAE,CAAC;AACjD,SAAA;;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;KACd;AAED;;AAEG;IACH,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;KACpB;AAED;;AAEG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;AAED;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;KAC1B;AAED;;AAEG;AACH,IAAA,YAAY,CAAO,GAAmB,EAAA;QACpC,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACrC,QAAA,MAAM,MAAM,GAAyC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAO,GAAG,CAAC,CAAC;QAEtF,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC1B,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;KACzC;AAED;;AAEG;IACH,UAAU,CAAO,GAAmB,EAAE,GAAoB,EAAA;AACxD,QAAA,MAAM,KAAK,GAA6B;YACtC,GAAG,EAAE,GAAG,CAAC,aAAa;AACtB,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,OAAO,EAAE,GAAG;AACZ,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACrB,YAAA,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;SAC7B,CAAC;AACF,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvB,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAClC,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAED;;AAEG;AACH,IAAA,eAAe,CAAI,GAAmB,EAAA;QACpC,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACrC,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;KAClC;AAED;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;KAC3B;AAED;;AAEG;AACH,IAAA,eAAe,CAAC,GAAW,EAAA;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KACtC;AAED;;AAEG;AACH,IAAA,iBAAiB,CAAO,KAAa,EAAA;QACnC,IAAI,KAAK,GAAG,CAAC,CAAC;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAO,CAAC,CAA2B,EAAE,GAAW,KAAI;AAC3E,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACnB,gBAAA,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;AAC7B,oBAAA,KAAK,EAAE,CAAC;AACT,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,KAAK,CAAC;KACd;AAED;;AAEG;AACH,IAAA,eAAe,CAAO,GAAW,EAAA;QAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAO,CAAC,KAA+B,EAAE,GAAW,KAAI;AAC/E,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;AACtE,YAAA,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnD,gBAAA,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;AAC7B,oBAAA,KAAK,EAAE,CAAC;AACT,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,KAAK,CAAC;KACd;AAED;;AAEG;IACH,KAAK,GAAA;QACH,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AACD,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAO,CAAC,KAA+B,EAAE,GAAW,KAAI;AAC/E,YAAA,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;AACzB,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3B,aAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACpB,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;AAEG;AACH,IAAA,SAAS,CAAO,KAA+B,EAAA;;AAE7C,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACnE,QAAA,IAAI,OAAO,OAAO,EAAE,SAAS,KAAK,UAAU,EAAE;YAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;YAExC,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACF,SAAA;;QAED,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;YAE5C,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACF,SAAA;;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE;AACzC,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;;AAED,QAAA,IAAI,QAAQ,GAAW,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;AAE5C,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AAChF,QAAA,IAAI,cAAc,EAAE;YAClB,QAAQ,GAAG,CAAC,cAAc,CAAC;AAC5B,SAAA;;QAED,IAAI,QAAQ,KAAK,CAAC,EAAE;AAClB,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;;QAED,IAAI,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;AACnC,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC7D,SAAA;QACD,OAAO,KAAK,CAAC,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;KAChD;AAED;;;AAGG;AACH,IAAA,OAAO,CAAO,KAA+B,EAAA;AAC3C,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;;AAEnE,QAAA,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE;YACzC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;;YAEtC,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACF,SAAA;;QAED,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;;YAE1C,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACF,SAAA;;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE;AACzC,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AACD,QAAA,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;KAC1B;AAED;;AAEG;AACH,IAAA,WAAW,CAAI,GAAmB,EAAA;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;;AAEzD,QAAA,IAAI,OAAO,OAAO,EAAE,WAAW,KAAK,UAAU,EAAE;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;;YAExC,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACF,SAAA;;QAED,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,UAAU,EAAE;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;;YAE5C,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACF,SAAA;;QAED,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE;AACxD,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,qBAAqB,CAAC,YAAY,EAAE;;YAEpE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE;AACtD,gBAAA,OAAO,KAAK,CAAC;AACd,aAAA;AACF,SAAA;;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;AAC1C,gBAAA,OAAO,IAAI,CAAC;AACb,aAAA;AACF,SAAA;;AAED,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KAC7D;AAED;;;;AAIG;AACH,IAAA,MAAM,CAAI,GAAmB,EAAA;;QAE3B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACzD,QAAA,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;YAEnC,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACF,SAAA;;QAED,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;YAEvC,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACF,SAAA;;QAED,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC;KAC7C;AAED;;AAEG;AACH,IAAA,YAAY,CAAO,GAAmB,EAAA;QACpC,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,GAAyC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzE,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;AAEG;IACH,UAAU,CAAO,GAAmB,EAAE,GAA6B,EAAA;QACjE,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;KAC1B;AAED;;AAEG;AACH,IAAA,eAAe,CAAI,GAAmB,EAAA;QACpC,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KAC/B;AAED;;;;AAIG;AACK,IAAA,UAAU,CAAI,MAAS,EAAA;;AAE7B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC1D,YAAA,OAAO,MAAqB,CAAC;AAC9B,SAAA;;;;;;;AAQD,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC3B,YAAA,OAAO,MAAqB,CAAC;AAC9B,SAAA;;;AAID,QAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAE,MAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE1E,QAAA,OAAO,MAAqB,CAAC;KAC9B;AA7VU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,kBAWrB,sBAAsB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAXrB,oBAAoB,EAAA,CAAA,CAAA,EAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;;0BAYN,MAAM;2BAAC,sBAAsB,CAAA;;0BAAG,QAAQ;;;MCzJhC,+BAA+B,CAAA;AAE1C,IAAA,WAAA,CAA6B,YAAkC,EAAA;QAAlC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAsB;KAAK;IAEpE,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;;AAEhD,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;;QAG1B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;YACvC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACpC,SAAA;;QAGD,MAAM,gBAAgB,GAA2C,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AACrG,QAAA,IAAI,gBAAgB,EAAE;;AAEpB,YAAA,OAAO,gBAAgB,CAAC;AACzB,SAAA;;QAGD,MAAM,cAAc,GAAkC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAC1F,QAAA,IAAI,cAAc,EAAE;;AAElB,YAAA,OAAO,SAAS,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;AAC9D,SAAA;;;;AAKD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAC7C,GAAG,CAAC,KAAK,IAAG;YACV,IAAI,KAAK,YAAY,YAAY,EAAE;AACjC,gBAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAClD,aAAA;AACH,SAAC,CAAC,EACF,QAAQ,CAAC,MAAK;;AAEZ,YAAA,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACzC,SAAC,CAAC,EACF,WAAW,EAAE,CACd,CAAC;;QAGF,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAE1C,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;AAEG;IACH,WAAW,CAAC,GAAqB,EAAE,IAAiB,EAAA;AAClD,QAAA,IAAI,MAAM,GAAqB,GAAG,CAAC,KAAK,EAAE,CAAC;;AAE3C,QAAA,wBAAwB,CAAC,OAAO,CAAC,oBAAoB,IAAG;YACtD,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE;AAC5C,gBAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;AACjF,aAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KAC5B;8GA7DU,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAA/B,+BAA+B,EAAA,CAAA,CAAA,EAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAD3C,UAAU;;;MCcE,mBAAmB,CAAA;IAC9B,OAAO,OAAO,CACZ,mBAAyC,EAAA;QAEzC,OAAO;AACL,YAAA,QAAQ,EAAE,mBAAmB;AAC7B,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,OAAO,EAAE,sBAAsB;AAC/B,oBAAA,QAAQ,EAAE,mBAAmB;AAC9B,iBAAA;AACF,aAAA;SACF,CAAC;KACH;8GAbU,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;+GAAnB,mBAAmB,EAAA,CAAA,CAAA,EAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,EAVnB,SAAA,EAAA;YACT,oBAAoB;YACpB,+BAA+B;AAC/B,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,QAAQ,EAAE,+BAA+B;AACzC,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,CAAA,CAAA,EAAA;;2FAEU,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAX/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,SAAS,EAAE;wBACT,oBAAoB;wBACpB,+BAA+B;AAC/B,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,QAAQ,EAAE,+BAA+B;AACzC,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA,CAAA;;;ACfD,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAExB,MAAA,gBAAgB,GAAG,CAAC,GAAqB,KAAY;IAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;IAC5B,OAAO,IAAI,CAAC,SAAS,CAAC;AAClB,QAAA,OAAO,EAAE,MAAM,CAAC,WAAW;QACvB,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG;AACtB,QAAA,CAAC,GAAW,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACtD,CACJ;QACD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;AAChB,QAAA,MAAM,EAAE,MAAM,CAAC,WAAW;QACtB,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG;AACtB,QAAA,CAAC,GAAW,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACtD,CACJ;QACD,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,YAAY,EAAE,OAAO,CAAC,YAAY;AAClC,QAAA,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE;AAChC,KAAA,CAAC,CAAC;AACP,EAAC;AAEY,MAAA,iBAAiB,GAAG,CAAC,GAAsB,KAAY;AAChE,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;IAC7B,OAAO,IAAI,CAAC,SAAS,CAAC;AAClB,QAAA,OAAO,EAAE,MAAM,CAAC,WAAW;QACvB,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG;AACvB,QAAA,CAAC,GAAW,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACvD,CACJ;QACD,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,GAAG,EAAE,QAAQ,CAAC,GAAG;AACjB,QAAA,IAAI,EAAE,QAAQ,CAAC,IAAI;AACtB,KAAA,CAAC,CAAC;AACP,EAAC;AAEY,MAAA,kBAAkB,GAAG,CAAU,GAAW,KAAoB;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjD,IAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;AAChC,IAAA,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE;QACpC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,UAAkB,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AACnG,KAAA;AACD,IAAA,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE;QAC9D,OAAO;QACP,MAAM;QACN,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,eAAe,EAAE,OAAO,CAAC,eAAe;AAC3C,KAAA,CAAC,CAAC;AACP,EAAC;AAEY,MAAA,mBAAmB,GAAG,CAAU,GAAW,KAAqB;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,IAAI,YAAY,CAAI;QACvB,GAAG,EAAE,QAAQ,CAAC,GAAG;AACjB,QAAA,OAAO,EAAE,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC1C,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;AAClC,KAAA,CAAC,CAAC;AACP,EAAC;MAEY,2BAA2B,CAAA;AAEpC,IAAA,WAAA,CAAoB,OAAgB,EAAA;QAAhB,IAAO,CAAA,OAAA,GAAP,OAAO,CAAS;KAAK;AAEzC,IAAA,IAAI,IAAI,GAAA;QACJ,IAAI,KAAK,GAAG,CAAC,CAAC;AACd,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACjD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AACnC,gBAAA,KAAK,EAAE,CAAC;AACX,aAAA;AACJ,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KAChB;IAED,KAAK,GAAA;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AACnC,gBAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAChC,aAAA;AACJ,SAAA;KACJ;AAED,IAAA,MAAM,CAAC,GAAW,EAAA;QACd,IAAI,CAAC,GAAG,EAAE;AACN,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AAC7B,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC;AAC1B,SAAA;AACD,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7B,QAAA,OAAO,IAAI,CAAC;KACf;AAED,IAAA,OAAO,CAAC,UAA4D,EAAA;;AAEhE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACjD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,aAAa,IAAI,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;gBACvD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACtC,gBAAA,IAAI,KAAK,EAAE;oBACP,MAAM,gBAAgB,GAAG,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACpE,oBAAA,UAAU,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;AACvC,iBAAA;AACJ,aAAA;AACJ,SAAA;KACJ;AAED,IAAA,GAAG,CAAC,GAAW,EAAA;QACX,IAAI,CAAC,GAAG,EAAE;AACN,YAAA,OAAO,SAAS,CAAC;AACpB,SAAA;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AAC7B,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC;AAC1B,SAAA;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACvC,QAAA,IAAI,IAAI,EAAE;YACN,MAAM,UAAU,GAAiB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO;gBACH,GAAG,EAAE,UAAU,CAAC,GAAG;AACnB,gBAAA,QAAQ,EAAE,mBAAmB,CAAC,UAAU,CAAC,QAAQ,CAAC;AAClD,gBAAA,OAAO,EAAE,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC/C,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,OAAO,EAAE,UAAU,CAAC,OAAO;aAC9B,CAAC;AACL,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;KACpB;AAED,IAAA,GAAG,CAAC,GAAW,EAAA;QACX,IAAI,CAAC,GAAG,EAAE;AACN,YAAA,OAAO,KAAK,CAAC;AAChB,SAAA;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AAC7B,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC;AAC1B,SAAA;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;KACtC;IAED,GAAG,CAAC,GAAW,EAAE,KAAyB,EAAA;QACtC,IAAI,CAAC,GAAG,EAAE;YACN,OAAO;AACV,SAAA;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AAC7B,YAAA,GAAG,GAAG,UAAU,GAAG,GAAG,CAAC;AAC1B,SAAA;AACD,QAAA,MAAM,YAAY,GAAiB;YAC/B,GAAG,EAAE,KAAK,CAAC,GAAG;AACd,YAAA,QAAQ,EAAE,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC3C,YAAA,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;YACxC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;SACzB,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;KAC3D;AACJ;;AClKK,MAAO,yBAA0B,SAAQ,2BAA2B,CAAA;AAEtE,IAAA,WAAA,GAAA;QACI,KAAK,CAAC,YAAY,CAAC,CAAC;KACvB;AACJ;;ACLK,MAAO,2BAA4B,SAAQ,2BAA2B,CAAA;AAExE,IAAA,WAAA,GAAA;QACI,KAAK,CAAC,cAAc,CAAC,CAAC;KACzB;AACJ;;ACPD;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ng-http-caching.mjs","sources":["../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-memory-storage.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching-interceptor.service.ts","../../../projects/ng-http-caching/src/lib/ng-http-caching.module.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-browser-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-local-storage.ts","../../../projects/ng-http-caching/src/lib/storage/ng-http-caching-session-storage.ts","../../../projects/ng-http-caching/src/public-api.ts","../../../projects/ng-http-caching/src/ng-http-caching.ts"],"sourcesContent":["import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\n\r\nexport class NgHttpCachingMemoryStorage extends Map<string, NgHttpCachingEntry<any, any>> implements NgHttpCachingStorageInterface { }\r\n","import { Injectable, InjectionToken, Inject, Optional, VERSION, isDevMode } from '@angular/core';\r\nimport { HttpRequest, HttpResponse, HttpEvent, HttpContextToken, HttpContext } from '@angular/common/http';\r\nimport { Observable } from 'rxjs/internal/Observable';\r\nimport { NgHttpCachingStorageInterface } from './storage/ng-http-caching-storage.interface';\r\nimport { NgHttpCachingMemoryStorage } from './storage/ng-http-caching-memory-storage';\r\n\r\nexport type NgHttpCachingContext = Pick<NgHttpCachingConfig, 'getKey' | 'isCacheable' | 'isExpired' | 'isValid'>;\r\n\r\nexport const NG_HTTP_CACHING_CONTEXT = new HttpContextToken<NgHttpCachingContext>(() => ({}));\r\n\r\nexport const withNgHttpCachingContext = (value: NgHttpCachingContext, context: HttpContext = new HttpContext()) => context.set(NG_HTTP_CACHING_CONTEXT, value)\r\n\r\nexport interface NgHttpCachingEntry<K = any, T = any> {\r\n /**\r\n * URL\r\n */\r\n url: string;\r\n /**\r\n * HttpResponse\r\n */\r\n response: HttpResponse<T>;\r\n /**\r\n * HttpRequest\r\n */\r\n request: HttpRequest<K>;\r\n /**\r\n * Timestamp of add to cache time\r\n */\r\n addedTime: number;\r\n /**\r\n * Cache version\r\n */\r\n version: string;\r\n}\r\n\r\nexport const NG_HTTP_CACHING_CONFIG = new InjectionToken<NgHttpCachingContext>(\r\n 'ng-http-caching.config'\r\n);\r\n\r\nexport enum NgHttpCachingStrategy {\r\n /**\r\n * All request are cacheable if HTTP method is into `allowedMethod`\r\n */\r\n ALLOW_ALL = 'ALLOW_ALL',\r\n /**\r\n * Only the request with `X-NG-HTTP-CACHING-ALLOW-CACHE` header are cacheable if HTTP method is into `allowedMethod`\r\n */\r\n DISALLOW_ALL = 'DISALLOW_ALL'\r\n}\r\n\r\nexport enum NgHttpCachingHeaders {\r\n /**\r\n * Request is cacheable if HTTP method is into `allowedMethod`\r\n */\r\n ALLOW_CACHE = 'X-NG-HTTP-CACHING-ALLOW-CACHE',\r\n /**\r\n * Request isn't cacheable\r\n */\r\n DISALLOW_CACHE = 'X-NG-HTTP-CACHING-DISALLOW-CACHE',\r\n /**\r\n * Specific cache lifetime for the request\r\n */\r\n LIFETIME = 'X-NG-HTTP-CACHING-LIFETIME',\r\n /**\r\n * You can tag multiple request by adding this header with the same tag and \r\n * using `NgHttpCachingService.clearCacheByTag(tag: string)` for delete all the tagged request\r\n */\r\n TAG = 'X-NG-HTTP-CACHING-TAG'\r\n}\r\n\r\nexport const NgHttpCachingHeadersList = Object.values(NgHttpCachingHeaders);\r\n\r\nexport const NG_HTTP_CACHING_SECOND_IN_MS = 1000;\r\nexport const NG_HTTP_CACHING_MINUTE_IN_MS = NG_HTTP_CACHING_SECOND_IN_MS * 60;\r\nexport const NG_HTTP_CACHING_HOUR_IN_MS = NG_HTTP_CACHING_MINUTE_IN_MS * 60;\r\nexport const NG_HTTP_CACHING_DAY_IN_MS = NG_HTTP_CACHING_HOUR_IN_MS * 24;\r\nexport const NG_HTTP_CACHING_WEEK_IN_MS = NG_HTTP_CACHING_DAY_IN_MS * 7;\r\nexport const NG_HTTP_CACHING_MONTH_IN_MS = NG_HTTP_CACHING_DAY_IN_MS * 30;\r\nexport const NG_HTTP_CACHING_YEAR_IN_MS = NG_HTTP_CACHING_DAY_IN_MS * 365;\r\n\r\nexport interface NgHttpCachingConfig {\r\n /**\r\n * Set the cache store. You can implement your custom store by implement the `NgHttpCachingStorageInterface` interface, eg.:\r\n */\r\n store?: NgHttpCachingStorageInterface;\r\n /**\r\n * Number of millisecond that a response is stored in the cache. \r\n * You can set specific \"lifetime\" for each request by add the header `X-NG-HTTP-CACHING-LIFETIME` (see example below).\r\n */\r\n lifetime?: number;\r\n /**\r\n * Array of allowed HTTP methods to cache. \r\n * You can allow multiple methods, eg.: `['GET', 'POST', 'PUT', 'DELETE', 'HEAD']` or \r\n * allow all methods by: `['ALL']`. If `allowedMethod` is an empty array (`[]`), no response are cached.\r\n * *Warning!* `NgHttpCaching` use the full url (url with query parameters) as unique key for the cached response,\r\n * this is correct for the `GET` request but is _potentially_ wrong for other type of request (eg. `POST`, `PUT`). \r\n * You can set a different \"key\" by customizing the `getKey` config method (see `getKey` section).\r\n */\r\n allowedMethod?: string[];\r\n /**\r\n * Set the cache strategy, possible strategies are:\r\n * - `NgHttpCachingStrategy.ALLOW_ALL`: All request are cacheable if HTTP method is into `allowedMethod`;\r\n * - `NgHttpCachingStrategy.DISALLOW_ALL`: Only the request with `X-NG-HTTP-CACHING-ALLOW-CACHE` header are cacheable if HTTP method is into `allowedMethod`;\r\n */\r\n cacheStrategy?: NgHttpCachingStrategy;\r\n /**\r\n * Cache version. When you have a breaking change, change the version, and it'll delete the current cache automatically.\r\n * The default value is Angular major version (eg. 13), in this way, the cache is invalidated on every Angular upgrade.\r\n */\r\n version?: string;\r\n /**\r\n * If this function return `true` the request is expired and a new request is send to backend, if return `false` isn't expired. \r\n * If the result is `undefined`, the normal behaviour is provided.\r\n */\r\n isExpired?: <K, T>(entry: NgHttpCachingEntry<K, T>) => boolean | undefined | void;\r\n /**\r\n * If this function return `true` the request is cacheable, if return `false` isn't cacheable. \r\n * If the result is `undefined`, the normal behaviour is provided.\r\n */\r\n isCacheable?: <K>(req: HttpRequest<K>) => boolean | undefined | void;\r\n /**\r\n * This function return the unique key (`string`) for store the response into the cache. \r\n * If the result is `undefined`, the normal behaviour is provided.\r\n */\r\n getKey?: <K>(req: HttpRequest<K>) => string | undefined | void;\r\n /**\r\n * If this function return `true` the cache entry is valid and can be stored, if return `false` isn't valid. \r\n * If the result is `undefined`, the normal behaviour is provided.\r\n */\r\n isValid?: <K, T>(entry: NgHttpCachingEntry<K, T>) => boolean | undefined | void;\r\n}\r\n\r\nexport interface NgHttpCachingDefaultConfig extends NgHttpCachingConfig {\r\n store: NgHttpCachingStorageInterface;\r\n lifetime: number;\r\n allowedMethod: string[];\r\n cacheStrategy: NgHttpCachingStrategy;\r\n version: string;\r\n}\r\n\r\nexport const NgHttpCachingConfigDefault: Readonly<NgHttpCachingDefaultConfig> = {\r\n store: new NgHttpCachingMemoryStorage(),\r\n lifetime: NG_HTTP_CACHING_HOUR_IN_MS,\r\n version: VERSION.major,\r\n allowedMethod: ['GET', 'HEAD'],\r\n cacheStrategy: NgHttpCachingStrategy.ALLOW_ALL,\r\n};\r\n\r\n@Injectable()\r\nexport class NgHttpCachingService {\r\n\r\n private readonly queue = new Map<string, Observable<HttpEvent<any>>>();\r\n\r\n private readonly config: NgHttpCachingDefaultConfig;\r\n\r\n private gcLock = false;\r\n\r\n private devMode: boolean = isDevMode();\r\n\r\n constructor(\r\n @Inject(NG_HTTP_CACHING_CONFIG) @Optional() config: Readonly<NgHttpCachingConfig>\r\n ) {\r\n if (config) {\r\n this.config = { ...NgHttpCachingConfigDefault, ...config };\r\n } else {\r\n this.config = { ...NgHttpCachingConfigDefault };\r\n }\r\n // start cache clean\r\n this.runGc();\r\n }\r\n\r\n /**\r\n * Return the config\r\n */\r\n getConfig(): Readonly<NgHttpCachingConfig> {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Return the queue map\r\n */\r\n getQueue(): Readonly<Map<string, Observable<HttpEvent<any>>>> {\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * Return the cache store\r\n */\r\n getStore(): Readonly<NgHttpCachingStorageInterface> {\r\n return this.config.store;\r\n }\r\n\r\n /**\r\n * Return response from cache\r\n */\r\n getFromCache<K, T>(req: HttpRequest<K>): Readonly<HttpResponse<T>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: NgHttpCachingEntry<K, T> | undefined = this.config.store.get<K, T>(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n if (this.isExpired(cached)) {\r\n this.clearCacheByKey(key);\r\n return undefined;\r\n }\r\n\r\n return this.deepFreeze(cached.response);\r\n }\r\n\r\n /**\r\n * Add response to cache\r\n */\r\n addToCache<K, T>(req: HttpRequest<K>, res: HttpResponse<T>): boolean {\r\n const entry: NgHttpCachingEntry<K, T> = {\r\n url: req.urlWithParams,\r\n response: res,\r\n request: req,\r\n addedTime: Date.now(),\r\n version: this.config.version,\r\n };\r\n if (this.isValid(entry)) {\r\n const key: string = this.getKey(req);\r\n this.config.store.set(key, entry);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Delete response from cache\r\n */\r\n deleteFromCache<K>(req: HttpRequest<K>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.clearCacheByKey(key);\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clearCache(): void {\r\n this.config.store.clear();\r\n }\r\n\r\n /**\r\n * Clear the cache by key\r\n */\r\n clearCacheByKey(key: string): boolean {\r\n return this.config.store.delete(key);\r\n }\r\n\r\n /**\r\n * Clear the cache by keys\r\n */\r\n clearCacheByKeys(keys: Array<string>): number {\r\n let counter = 0;\r\n if (keys) {\r\n for (const key of keys) {\r\n if (this.clearCacheByKey(key)) {\r\n counter++;\r\n }\r\n }\r\n }\r\n return counter;\r\n }\r\n\r\n /**\r\n * Clear the cache by regex\r\n */\r\n clearCacheByRegex<K, T>(regex: RegExp): number {\r\n const keys: Array<string> = [];\r\n this.config.store.forEach<K, T>((_: NgHttpCachingEntry<K, T>, key: string) => {\r\n if (regex.test(key)) {\r\n keys.push(key);\r\n }\r\n });\r\n return this.clearCacheByKeys(keys);\r\n }\r\n\r\n /**\r\n * Clear the cache by TAG\r\n */\r\n clearCacheByTag<K, T>(tag: string): number {\r\n const keys: Array<string> = [];\r\n this.config.store.forEach<K, T>((entry: NgHttpCachingEntry<K, T>, key: string) => {\r\n const tagHeader = entry.request.headers.get(NgHttpCachingHeaders.TAG);\r\n if (tagHeader && tagHeader.split(',').includes(tag)) {\r\n keys.push(key);\r\n }\r\n });\r\n return this.clearCacheByKeys(keys);\r\n }\r\n\r\n /**\r\n * Run garbage collector (delete expired cache entry)\r\n */\r\n runGc<K, T>(): boolean {\r\n if (this.gcLock) {\r\n return false;\r\n }\r\n this.gcLock = true;\r\n const keys: Array<string> = [];\r\n this.config.store.forEach<K, T>((entry: NgHttpCachingEntry<K, T>, key: string) => {\r\n if (this.isExpired(entry)) {\r\n keys.push(key);\r\n }\r\n });\r\n this.clearCacheByKeys(keys);\r\n this.gcLock = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Return true if cache entry is expired\r\n */\r\n isExpired<K, T>(entry: NgHttpCachingEntry<K, T>): boolean {\r\n // if user provide custom method, use it\r\n const context = entry.request.context.get(NG_HTTP_CACHING_CONTEXT);\r\n if (typeof context?.isExpired === 'function') {\r\n const result = context.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if user provide custom method, use it\r\n if (typeof this.config.isExpired === 'function') {\r\n const result = this.config.isExpired(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if version change, always expire\r\n if (this.config.version !== entry.version) {\r\n return true;\r\n }\r\n // config/default lifetime\r\n let lifetime: number = this.config.lifetime;\r\n // request has own lifetime\r\n const headerLifetime = entry.request.headers.get(NgHttpCachingHeaders.LIFETIME);\r\n if (headerLifetime) {\r\n lifetime = +headerLifetime;\r\n }\r\n // never expire if 0\r\n if (lifetime === 0) {\r\n return false;\r\n }\r\n // wrong lifetime\r\n if (lifetime < 0 || isNaN(lifetime)) {\r\n throw new Error('lifetime must be greater than or equal 0');\r\n }\r\n return entry.addedTime + lifetime < Date.now();\r\n }\r\n\r\n /**\r\n * Return true if cache entry is valid for store in the cache\r\n * Default behaviour is whether the status code falls in the 2xx range.\r\n */\r\n isValid<K, T>(entry: NgHttpCachingEntry<K, T>): boolean {\r\n const context = entry.request.context.get(NG_HTTP_CACHING_CONTEXT);\r\n // if user provide custom method, use it\r\n if (typeof context.isValid === 'function') {\r\n const result = context.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if user provide custom method, use it\r\n if (typeof this.config.isValid === 'function') {\r\n const result = this.config.isValid(entry);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // different version\r\n if (this.config.version !== entry.version) {\r\n return false;\r\n }\r\n return entry.response.ok;\r\n }\r\n\r\n /**\r\n * Return true if the request is cacheable\r\n */\r\n isCacheable<K>(req: HttpRequest<K>): boolean {\r\n const context = req.context.get(NG_HTTP_CACHING_CONTEXT);\r\n // if user provide custom method, use it\r\n if (typeof context?.isCacheable === 'function') {\r\n const result = context.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if user provide custom method, use it\r\n if (typeof this.config.isCacheable === 'function') {\r\n const result = this.config.isCacheable(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // request has disallow cache header\r\n if (req.headers.has(NgHttpCachingHeaders.DISALLOW_CACHE)) {\r\n return false;\r\n }\r\n // strategy is disallow all...\r\n if (this.config.cacheStrategy === NgHttpCachingStrategy.DISALLOW_ALL) {\r\n // request isn't allowed if come without allow header\r\n if (!req.headers.has(NgHttpCachingHeaders.ALLOW_CACHE)) {\r\n return false;\r\n }\r\n }\r\n // if allowed method is only ALL, allow all http methods\r\n if (this.config.allowedMethod.length === 1) {\r\n if (this.config.allowedMethod[0] === 'ALL') {\r\n return true;\r\n }\r\n }\r\n // request is allowed if method is in allowedMethod\r\n return this.config.allowedMethod.indexOf(req.method) !== -1;\r\n }\r\n\r\n /**\r\n * Return the cache key.\r\n * Default key is http method plus url with query parameters, eg.:\r\n * `GET@https://github.com/nigrosimone/ng-http-caching`\r\n */\r\n getKey<K>(req: HttpRequest<K>): string {\r\n // if user provide custom method, use it\r\n const context = req.context.get(NG_HTTP_CACHING_CONTEXT);\r\n if (typeof context.getKey === 'function') {\r\n const result = context.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // if user provide custom method, use it\r\n if (typeof this.config.getKey === 'function') {\r\n const result = this.config.getKey(req);\r\n // if result is undefined, normal behaviour is provided\r\n if (result !== undefined) {\r\n return result;\r\n }\r\n }\r\n // default key is req.method plus url with query parameters\r\n return req.method + '@' + req.urlWithParams;\r\n }\r\n\r\n /**\r\n * Return observable from cache\r\n */\r\n getFromQueue<K, T>(req: HttpRequest<K>): Observable<HttpEvent<T>> | undefined {\r\n const key: string = this.getKey(req);\r\n const cached: Observable<HttpEvent<T>> | undefined = this.queue.get(key);\r\n\r\n if (!cached) {\r\n return undefined;\r\n }\r\n\r\n return cached;\r\n }\r\n\r\n /**\r\n * Add observable to cache\r\n */\r\n addToQueue<K, T>(req: HttpRequest<K>, obs: Observable<HttpEvent<T>>): void {\r\n const key: string = this.getKey(req);\r\n this.queue.set(key, obs);\r\n }\r\n\r\n /**\r\n * Delete observable from cache\r\n */\r\n deleteFromQueue<K>(req: HttpRequest<K>): boolean {\r\n const key: string = this.getKey(req);\r\n return this.queue.delete(key);\r\n }\r\n\r\n /**\r\n * Recursively Object.freeze simple Javascript structures consisting of plain objects, arrays, and primitives.\r\n * Make the data immutable.\r\n * @returns immutable object\r\n */\r\n private deepFreeze<S>(object: S): Readonly<S> {\r\n // No freezing in production (for better performance).\r\n if (!this.devMode || !object || typeof object !== 'object') {\r\n return object as Readonly<S>;\r\n }\r\n\r\n // When already frozen, we assume its children are frozen (for better performance).\r\n // This should be true if you always use `deepFreeze` to freeze objects.\r\n //\r\n // Note that Object.isFrozen will also return `true` for primitives (numbers,\r\n // strings, booleans, undefined, null), so there is no need to check for\r\n // those explicitly.\r\n if (Object.isFrozen(object)) {\r\n return object as Readonly<S>;\r\n }\r\n\r\n // At this point we know that we're dealing with either an array or plain object, so\r\n // just freeze it and recurse on its values.\r\n Object.freeze(object);\r\n Object.keys(object).forEach(key => this.deepFreeze((object as any)[key]));\r\n\r\n return object as Readonly<S>;\r\n }\r\n}\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { asyncScheduler, Observable, of, scheduled } from 'rxjs';\r\nimport { tap, finalize, shareReplay } from 'rxjs/operators';\r\nimport { NgHttpCachingService, NgHttpCachingHeadersList } from './ng-http-caching.service';\r\n\r\n@Injectable()\r\nexport class NgHttpCachingInterceptorService implements HttpInterceptor {\r\n\r\n constructor(private readonly cacheService: NgHttpCachingService) { }\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n // run garbage collector\r\n this.cacheService.runGc();\r\n\r\n // Don't cache if it's not cacheable\r\n if (!this.cacheService.isCacheable(req)) {\r\n return this.sendRequest(req, next);\r\n }\r\n\r\n // Checked if there is pending response for this request\r\n const cachedObservable: Observable<HttpEvent<any>> | undefined = this.cacheService.getFromQueue(req);\r\n if (cachedObservable) {\r\n // console.log('cachedObservable',cachedObservable);\r\n return cachedObservable;\r\n }\r\n\r\n // Checked if there is cached response for this request\r\n const cachedResponse: HttpResponse<any> | undefined = this.cacheService.getFromCache(req);\r\n if (cachedResponse) {\r\n // console.log('cachedResponse');\r\n return scheduled(of(cachedResponse.clone()), asyncScheduler);\r\n }\r\n\r\n // If the request of going through for first time\r\n // then let the request proceed and cache the response\r\n // console.log('sendRequest', req);\r\n const shared = this.sendRequest(req, next).pipe(\r\n tap(event => {\r\n if (event instanceof HttpResponse) {\r\n this.cacheService.addToCache(req, event.clone());\r\n }\r\n }),\r\n finalize(() => {\r\n // delete pending request\r\n this.cacheService.deleteFromQueue(req);\r\n }),\r\n shareReplay()\r\n );\r\n\r\n // add pending request to queue for cache parallel request\r\n this.cacheService.addToQueue(req, shared);\r\n\r\n return shared;\r\n }\r\n\r\n /**\r\n * Send http request (next handler)\r\n */\r\n sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n let cloned: HttpRequest<any> = req.clone();\r\n // trim custom headers before send request\r\n NgHttpCachingHeadersList.forEach(ngHttpCachingHeaders => {\r\n if (cloned.headers.has(ngHttpCachingHeaders)) {\r\n cloned = cloned.clone({ headers: cloned.headers.delete(ngHttpCachingHeaders) });\r\n }\r\n });\r\n return next.handle(cloned);\r\n }\r\n}\r\n","import { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport {\r\n NG_HTTP_CACHING_CONFIG,\r\n NgHttpCachingConfig,\r\n NgHttpCachingService,\r\n} from './ng-http-caching.service';\r\nimport { NgHttpCachingInterceptorService } from './ng-http-caching-interceptor.service';\r\n\r\n@NgModule({\r\n providers: [\r\n NgHttpCachingService,\r\n NgHttpCachingInterceptorService,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: NgHttpCachingInterceptorService,\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class NgHttpCachingModule {\r\n static forRoot(\r\n ngHttpCachingConfig?: NgHttpCachingConfig\r\n ): ModuleWithProviders<NgHttpCachingModule> {\r\n return {\r\n ngModule: NgHttpCachingModule,\r\n providers: [\r\n {\r\n provide: NG_HTTP_CACHING_CONFIG,\r\n useValue: ngHttpCachingConfig,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';\r\nimport { NgHttpCachingEntry } from '../ng-http-caching.service';\r\nimport { HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\r\n\r\nconst KEY_PREFIX = 'NgHttpCaching::';\r\n\r\nexport interface NgHttpCachingStorageEntry {\r\n url: string;\r\n response: string;\r\n request: string;\r\n addedTime: number;\r\n version: string;\r\n}\r\n\r\nexport const serializeRequest = (req: HttpRequest<any>): string => {\r\n const request = req.clone(); // Make a clone, useful for doing destructive things\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n method: request.method, // The Request Method, e.g. GET, POST, DELETE\r\n url: request.url, // The URL\r\n params: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n request.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ), // The request parameters\r\n withCredentials: request.withCredentials, // Whether credentials are being sent\r\n responseType: request.responseType, // The response type\r\n body: request.serializeBody() // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport const serializeResponse = (res: HttpResponse<any>): string => {\r\n const response = res.clone();\r\n return JSON.stringify({\r\n headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer\r\n response.headers.keys().map( // Get all of the headers\r\n (key: string) => [key, response.headers.getAll(key)] // Get all of the corresponding values for the headers\r\n )\r\n ),\r\n status: response.status,\r\n statusText: response.statusText,\r\n url: response.url,\r\n body: response.body // Serialize the body, all well and good since we are working on a clone\r\n });\r\n}\r\n\r\nexport const deserializeRequest = <T = any>(req: string): HttpRequest<T> => {\r\n const request = JSON.parse(req);\r\n const headers = new HttpHeaders(request.headers);\r\n const params = new HttpParams(); // Probably some way to make this a one-liner, but alas, there are no good docs\r\n for (const parameter in request.params) {\r\n request.params[parameter].forEach((paramValue: string) => params.append(parameter, paramValue));\r\n }\r\n return new HttpRequest(request.method, request.url, request.body, {\r\n headers,\r\n params,\r\n responseType: request.responseType,\r\n withCredentials: request.withCredentials\r\n });\r\n}\r\n\r\nexport const deserializeResponse = <T = any>(res: string): HttpResponse<T> => {\r\n const response = JSON.parse(res);\r\n return new HttpResponse<T>({\r\n url: response.url,\r\n headers: new HttpHeaders(response.headers),\r\n body: response.body,\r\n status: response.status,\r\n statusText: response.statusText,\r\n });\r\n}\r\n\r\nexport class NgHttpCachingBrowserStorage implements NgHttpCachingStorageInterface {\r\n\r\n constructor(private storage: Storage) { }\r\n\r\n get size(): number {\r\n let count = 0;\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n clear(): void {\r\n for (let i = this.storage.length; i >= 0; i--) {\r\n const key = this.storage.key(i);\r\n if (key && key.startsWith(KEY_PREFIX)) {\r\n this.storage.removeItem(key);\r\n }\r\n }\r\n }\r\n\r\n delete(key: string): boolean {\r\n if (!key) {\r\n return false;\r\n }\r\n if (!key.startsWith(KEY_PREFIX)) {\r\n key = KEY_PREFIX + key;\r\n }\r\n this.storage.removeItem(key);\r\n return true;\r\n }\r\n\r\n forEach(callbackfn: (value: NgHttpCachingEntry, key: string) => void): void {\r\n // iterate this.storage\r\n for (let i = 0, e = this.storage.length; i < e; i++) {\r\n const keyWithPrefix = this.storage.key(i);\r\n if (keyWithPrefix && keyWithPrefix.startsWith(KEY_PREFIX)) {\r\n const value = this.get(keyWithPrefix);\r\n if (value) {\r\n const keyWithoutPrefix = keyWithPrefix.substring(KEY_PREFIX.length);\r\n callbackfn(value, keyWithoutPrefix);\r\n }\r\n }\r\n }\r\n }\r\n\r\n get(key: string): Readonly<NgHttpCachingEntry> | undefined {\r\n if (!key) {\r\n return undefined;\r\n }\r\n if (!key.startsWith(KEY_PREFIX)) {\r\n key = KEY_PREFIX + key;\r\n }\r\n const item = this.storage.getItem(key);\r\n if (item) {\r\n const parsedItem: NgHttpCachingStorageEntry = JSON.parse(item);\r\n return this.deserialize(parsedItem);\r\n }\r\n return undefined;\r\n }\r\n\r\n has(key: string): boolean {\r\n if (!key) {\r\n return false;\r\n }\r\n if (!key.startsWith(KEY_PREFIX)) {\r\n key = KEY_PREFIX + key;\r\n }\r\n return !!this.storage.getItem(key);\r\n }\r\n\r\n set(key: string, value: NgHttpCachingEntry): void {\r\n if (!key) {\r\n return;\r\n }\r\n if (!key.startsWith(KEY_PREFIX)) {\r\n key = KEY_PREFIX + key;\r\n }\r\n const unParsedItem: NgHttpCachingStorageEntry = this.serialize(value);\r\n this.storage.setItem(key, JSON.stringify(unParsedItem));\r\n }\r\n\r\n protected serialize(value: NgHttpCachingEntry): NgHttpCachingStorageEntry {\r\n return {\r\n url: value.url,\r\n response: serializeResponse(value.response),\r\n request: serializeRequest(value.request),\r\n addedTime: value.addedTime,\r\n version: value.version\r\n };\r\n }\r\n\r\n protected deserialize(value: NgHttpCachingStorageEntry): NgHttpCachingEntry {\r\n return {\r\n url: value.url,\r\n response: deserializeResponse(value.response),\r\n request: deserializeRequest(value.request),\r\n addedTime: value.addedTime,\r\n version: value.version\r\n };\r\n }\r\n}\r\n\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingLocalStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor() {\r\n super(localStorage);\r\n }\r\n}\r\n","import { NgHttpCachingBrowserStorage } from './ng-http-caching-browser-storage';\r\n\r\nexport class NgHttpCachingSessionStorage extends NgHttpCachingBrowserStorage {\r\n\r\n constructor() {\r\n super(sessionStorage);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ng-http-caching\r\n */\r\n\r\nexport * from './lib/ng-http-caching-interceptor.service';\r\nexport * from './lib/ng-http-caching.service';\r\nexport * from './lib/ng-http-caching.module';\r\nexport * from './lib/storage/ng-http-caching-storage.interface';\r\nexport * from './lib/storage/ng-http-caching-memory-storage';\r\nexport * from './lib/storage/ng-http-caching-local-storage';\r\nexport * from './lib/storage/ng-http-caching-session-storage';\r\nexport * from './lib/storage/ng-http-caching-browser-storage';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgHttpCachingService"],"mappings":"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"}
|
|
@@ -163,6 +163,10 @@ export declare class NgHttpCachingService {
|
|
|
163
163
|
* Clear the cache by key
|
|
164
164
|
*/
|
|
165
165
|
clearCacheByKey(key: string): boolean;
|
|
166
|
+
/**
|
|
167
|
+
* Clear the cache by keys
|
|
168
|
+
*/
|
|
169
|
+
clearCacheByKeys(keys: Array<string>): number;
|
|
166
170
|
/**
|
|
167
171
|
* Clear the cache by regex
|
|
168
172
|
*/
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';
|
|
2
2
|
import { NgHttpCachingEntry } from '../ng-http-caching.service';
|
|
3
3
|
import { HttpRequest, HttpResponse } from '@angular/common/http';
|
|
4
|
+
export interface NgHttpCachingStorageEntry {
|
|
5
|
+
url: string;
|
|
6
|
+
response: string;
|
|
7
|
+
request: string;
|
|
8
|
+
addedTime: number;
|
|
9
|
+
version: string;
|
|
10
|
+
}
|
|
4
11
|
export declare const serializeRequest: (req: HttpRequest<any>) => string;
|
|
5
12
|
export declare const serializeResponse: (res: HttpResponse<any>) => string;
|
|
6
13
|
export declare const deserializeRequest: <T = any>(req: string) => HttpRequest<T>;
|
|
@@ -15,4 +22,6 @@ export declare class NgHttpCachingBrowserStorage implements NgHttpCachingStorage
|
|
|
15
22
|
get(key: string): Readonly<NgHttpCachingEntry> | undefined;
|
|
16
23
|
has(key: string): boolean;
|
|
17
24
|
set(key: string, value: NgHttpCachingEntry): void;
|
|
25
|
+
protected serialize(value: NgHttpCachingEntry): NgHttpCachingStorageEntry;
|
|
26
|
+
protected deserialize(value: NgHttpCachingStorageEntry): NgHttpCachingEntry;
|
|
18
27
|
}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
1
|
import { NgHttpCachingStorageInterface } from './ng-http-caching-storage.interface';
|
|
2
2
|
import { NgHttpCachingEntry } from '../ng-http-caching.service';
|
|
3
|
-
export declare class NgHttpCachingMemoryStorage implements NgHttpCachingStorageInterface {
|
|
4
|
-
get size(): number;
|
|
5
|
-
private store;
|
|
6
|
-
clear(): void;
|
|
7
|
-
delete(key: string): boolean;
|
|
8
|
-
forEach<K, T>(callbackfn: (value: NgHttpCachingEntry<K, T>, key: string) => void): void;
|
|
9
|
-
get<K, T>(key: string): Readonly<NgHttpCachingEntry<K, T>> | undefined;
|
|
10
|
-
has(key: string): boolean;
|
|
11
|
-
set<K, T>(key: string, value: NgHttpCachingEntry<K, T>): void;
|
|
3
|
+
export declare class NgHttpCachingMemoryStorage extends Map<string, NgHttpCachingEntry<any, any>> implements NgHttpCachingStorageInterface {
|
|
12
4
|
}
|