@doolehealth/service-lib 0.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.
Files changed (72) hide show
  1. package/README.md +24 -0
  2. package/esm2022/doolehealth-service-lib.mjs +5 -0
  3. package/esm2022/lib/configuration.mjs +5 -0
  4. package/esm2022/lib/models/user.mjs +2 -0
  5. package/esm2022/lib/service-lib.component.mjs +19 -0
  6. package/esm2022/lib/service-lib.module.mjs +33 -0
  7. package/esm2022/lib/services/analytics.service.mjs +73 -0
  8. package/esm2022/lib/services/api-endpoints.service.mjs +51 -0
  9. package/esm2022/lib/services/authentication.service.mjs +400 -0
  10. package/esm2022/lib/services/change-endpoints.service.mjs +90 -0
  11. package/esm2022/lib/services/date.service.mjs +419 -0
  12. package/esm2022/lib/services/doole.service.mjs +1299 -0
  13. package/esm2022/lib/services/encryption.service.mjs +31 -0
  14. package/esm2022/lib/services/error.service.mjs +49 -0
  15. package/esm2022/lib/services/events.service.mjs +63 -0
  16. package/esm2022/lib/services/highcharts.service.mjs +621 -0
  17. package/esm2022/lib/services/http.service.mjs +124 -0
  18. package/esm2022/lib/services/language.service.mjs +38 -0
  19. package/esm2022/lib/services/loading.service.mjs +45 -0
  20. package/esm2022/lib/services/logging.service.mjs +28 -0
  21. package/esm2022/lib/services/navigation.service.mjs +41 -0
  22. package/esm2022/lib/services/network.service.mjs +42 -0
  23. package/esm2022/lib/services/notification.service.mjs +202 -0
  24. package/esm2022/lib/services/opentok.service.mjs +25 -0
  25. package/esm2022/lib/services/roles.service.mjs +44 -0
  26. package/esm2022/lib/services/storage.service.mjs +37 -0
  27. package/esm2022/lib/services/token.service.mjs +59 -0
  28. package/esm2022/lib/util/chatParameters.mjs +17 -0
  29. package/esm2022/lib/util/data-store.mjs +54 -0
  30. package/esm2022/lib/util/environment.mjs +29 -0
  31. package/esm2022/lib/util/language.model.mjs +3 -0
  32. package/esm2022/lib/util/notification-options.mjs +245 -0
  33. package/esm2022/lib/util/query-string-parameters.mjs +11 -0
  34. package/esm2022/lib/util/url-builder.mjs +15 -0
  35. package/esm2022/public-api.mjs +30 -0
  36. package/fesm2022/doolehealth-service-lib.mjs +4025 -0
  37. package/fesm2022/doolehealth-service-lib.mjs.map +1 -0
  38. package/index.d.ts +5 -0
  39. package/lib/configuration.d.ts +46 -0
  40. package/lib/models/user.d.ts +133 -0
  41. package/lib/service-lib.component.d.ts +5 -0
  42. package/lib/service-lib.module.d.ts +13 -0
  43. package/lib/services/analytics.service.d.ts +17 -0
  44. package/lib/services/api-endpoints.service.d.ts +13 -0
  45. package/lib/services/authentication.service.d.ts +102 -0
  46. package/lib/services/change-endpoints.service.d.ts +38 -0
  47. package/lib/services/date.service.d.ts +58 -0
  48. package/lib/services/doole.service.d.ts +169 -0
  49. package/lib/services/encryption.service.d.ts +9 -0
  50. package/lib/services/error.service.d.ts +11 -0
  51. package/lib/services/events.service.d.ts +32 -0
  52. package/lib/services/highcharts.service.d.ts +69 -0
  53. package/lib/services/http.service.d.ts +28 -0
  54. package/lib/services/language.service.d.ts +15 -0
  55. package/lib/services/loading.service.d.ts +22 -0
  56. package/lib/services/logging.service.d.ts +9 -0
  57. package/lib/services/navigation.service.d.ts +13 -0
  58. package/lib/services/network.service.d.ts +14 -0
  59. package/lib/services/notification.service.d.ts +25 -0
  60. package/lib/services/opentok.service.d.ts +17 -0
  61. package/lib/services/roles.service.d.ts +28 -0
  62. package/lib/services/storage.service.d.ts +10 -0
  63. package/lib/services/token.service.d.ts +16 -0
  64. package/lib/util/chatParameters.d.ts +25 -0
  65. package/lib/util/data-store.d.ts +13 -0
  66. package/lib/util/environment.d.ts +18 -0
  67. package/lib/util/language.model.d.ts +4 -0
  68. package/lib/util/notification-options.d.ts +145 -0
  69. package/lib/util/query-string-parameters.d.ts +6 -0
  70. package/lib/util/url-builder.d.ts +9 -0
  71. package/package.json +38 -0
  72. package/public-api.d.ts +23 -0
@@ -0,0 +1,31 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as CryptoJS from 'crypto-js';
3
+ import * as i0 from "@angular/core";
4
+ export class EncryptionService {
5
+ constructor() {
6
+ this.secretKey = 'D001E-APP';
7
+ }
8
+ encryptData(data) {
9
+ const encryptedData = CryptoJS.AES.encrypt(JSON.stringify(data), this.secretKey).toString();
10
+ return encryptedData;
11
+ }
12
+ decryptData(encryptedData) {
13
+ const decryptedData = CryptoJS.AES.decrypt(encryptedData, this.secretKey);
14
+ try {
15
+ const data = decryptedData.toString(CryptoJS.enc.Utf8);
16
+ return JSON.parse(data);
17
+ }
18
+ catch (e) {
19
+ return encryptedData;
20
+ }
21
+ }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: EncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
23
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: EncryptionService, providedIn: 'root' }); }
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: EncryptionService, decorators: [{
26
+ type: Injectable,
27
+ args: [{
28
+ providedIn: 'root'
29
+ }]
30
+ }], ctorParameters: () => [] });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2VydmljZS1saWIvc3JjL2xpYi9zZXJ2aWNlcy9lbmNyeXB0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQzs7QUFLdEMsTUFBTSxPQUFPLGlCQUFpQjtJQUU1QjtRQURpQixjQUFTLEdBQVcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFakIsV0FBVyxDQUFDLElBQVM7UUFDbkIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQ3BCLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNiLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXLENBQUMsYUFBcUI7UUFFL0IsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ3hDLGFBQWEsRUFDYixJQUFJLENBQUMsU0FBUyxDQUNmLENBQUM7UUFFRixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsT0FBTyxhQUFhLENBQUE7UUFDeEIsQ0FBQztJQU9ELENBQUM7K0dBL0JVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBDcnlwdG9KUyBmcm9tICdjcnlwdG8tanMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBFbmNyeXB0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjcmV0S2V5OiBzdHJpbmcgPSAnRDAwMUUtQVBQJztcbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBlbmNyeXB0RGF0YShkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuY3J5cHRlZERhdGEgPSBDcnlwdG9KUy5BRVMuZW5jcnlwdChcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgdGhpcy5zZWNyZXRLZXlcbiAgICApLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZERhdGE7XG4gIH1cblxuICBkZWNyeXB0RGF0YShlbmNyeXB0ZWREYXRhOiBzdHJpbmcpOiBhbnkge1xuXG4gICAgY29uc3QgZGVjcnlwdGVkRGF0YSA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KFxuICAgICAgZW5jcnlwdGVkRGF0YSxcbiAgICAgIHRoaXMuc2VjcmV0S2V5XG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gZGVjcnlwdGVkRGF0YS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGVuY3J5cHRlZERhdGFcbiAgfVxuXG5cblxuXG5cblxuICB9XG59XG4iXX0=
@@ -0,0 +1,49 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class ErrorService {
4
+ constructor() { }
5
+ getClientMessage(error) {
6
+ if (error.constructor == Array) {
7
+ return error.toString();
8
+ }
9
+ else if (error.constructor == Object) {
10
+ return JSON.stringify(error);
11
+ }
12
+ else if (typeof error == 'object') {
13
+ return error.message ? error.message : 'error';
14
+ }
15
+ else {
16
+ return error;
17
+ }
18
+ }
19
+ getClientStack(error) {
20
+ return error.stack;
21
+ }
22
+ getServerMessage(error) {
23
+ if (error.constructor == Array) {
24
+ return error;
25
+ }
26
+ else if (error.constructor == Object) {
27
+ return JSON.stringify(error);
28
+ }
29
+ else if (typeof error == 'object') {
30
+ return error.message;
31
+ }
32
+ else {
33
+ return error;
34
+ }
35
+ }
36
+ getServerStack(error) {
37
+ // handle stack trace
38
+ return 'stack';
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ErrorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
41
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ErrorService, providedIn: 'root' }); }
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ErrorService, decorators: [{
44
+ type: Injectable,
45
+ args: [{
46
+ providedIn: 'root'
47
+ }]
48
+ }], ctorParameters: () => [] });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlcnZpY2UtbGliL3NyYy9saWIvc2VydmljZXMvZXJyb3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU8zQyxNQUFNLE9BQU8sWUFBWTtJQUV2QixnQkFBZ0IsQ0FBQztJQUduQixnQkFBZ0IsQ0FBQyxLQUFVO1FBRXZCLElBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLEVBQUMsQ0FBQztZQUMzQixPQUFPLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QixDQUFDO2FBQUssSUFBRyxLQUFLLENBQUMsV0FBVyxJQUFJLE1BQU0sRUFBQyxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO2FBQUssSUFBRyxPQUFPLEtBQUssSUFBSSxRQUFRLEVBQUMsQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNuRCxDQUFDO2FBQUksQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFFTCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVk7UUFDdkIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUF3QjtRQUVyQyxJQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxFQUFDLENBQUM7WUFDM0IsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQzthQUFLLElBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxNQUFNLEVBQUMsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQzthQUFLLElBQUcsT0FBTyxLQUFLLElBQUksUUFBUSxFQUFDLENBQUM7WUFDL0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3pCLENBQUM7YUFBSSxDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUVMLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBd0I7UUFDbkMscUJBQXFCO1FBQ3JCLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7K0dBeENZLFlBQVk7bUhBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRXJyb3JTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG5cbmdldENsaWVudE1lc3NhZ2UoZXJyb3I6IGFueSk6IGFueSB7XG5cbiAgICBpZihlcnJvci5jb25zdHJ1Y3RvciA9PSBBcnJheSl7XG4gICAgICAgIHJldHVybiBlcnJvci50b1N0cmluZygpO1xuICAgIH1lbHNlIGlmKGVycm9yLmNvbnN0cnVjdG9yID09IE9iamVjdCl7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlcnJvcik7XG4gICAgfWVsc2UgaWYodHlwZW9mIGVycm9yID09ICdvYmplY3QnKXtcbiAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgPyBlcnJvci5tZXNzYWdlIDogJ2Vycm9yJztcbiAgICB9ZWxzZXtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0gICAgXG4gICAgICAgICAgIFxufVxuXG5nZXRDbGllbnRTdGFjayhlcnJvcjogRXJyb3IpOiBzdHJpbmcge1xuICAgIHJldHVybiBlcnJvci5zdGFjaztcbn1cblxuZ2V0U2VydmVyTWVzc2FnZShlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiBzdHJpbmcge1xuICAgXG4gICAgaWYoZXJyb3IuY29uc3RydWN0b3IgPT0gQXJyYXkpe1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfWVsc2UgaWYoZXJyb3IuY29uc3RydWN0b3IgPT0gT2JqZWN0KXtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgICB9ZWxzZSBpZih0eXBlb2YgZXJyb3IgPT0gJ29iamVjdCcpe1xuICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgICB9ZWxzZXtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0gICAgXG4gICAgICAgIFxufVxuXG5nZXRTZXJ2ZXJTdGFjayhlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiBzdHJpbmcge1xuICAgIC8vIGhhbmRsZSBzdGFjayB0cmFjZVxuICAgIHJldHVybiAnc3RhY2snO1xufVxuXG5cbn1cbiJdfQ==
@@ -0,0 +1,63 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * A custom Events service just like Ionic 3 Events https://ionicframework.com/docs/v3/api/util/Events/ which got removed in Ionic 5.
6
+ *
7
+ * @author Shashank Agrawal
8
+ */
9
+ export class Events {
10
+ constructor() {
11
+ this.channels = {};
12
+ }
13
+ /**
14
+ * Subscribe to a topic and provide a single handler/observer.
15
+ * @param topic The name of the topic to subscribe to.
16
+ * @param observer The observer or callback function to listen when changes are published.
17
+ *
18
+ * @returns Subscription from which you can unsubscribe to release memory resources and to prevent memory leak.
19
+ */
20
+ subscribe(topic, observer) {
21
+ console.log("subscribe topic: ", topic);
22
+ if (!this.channels[topic]) {
23
+ // You can also use ReplaySubject with one concequence
24
+ this.channels[topic] = new Subject();
25
+ }
26
+ return this.channels[topic].subscribe(observer);
27
+ }
28
+ /**
29
+ * Publish some data to the subscribers of the given topic.
30
+ * @param topic The name of the topic to emit data to.
31
+ * @param data data in any format to pass on.
32
+ */
33
+ publish(topic, data) {
34
+ const subject = this.channels[topic];
35
+ if (!subject) {
36
+ // Or you can create a new subject for future subscribers
37
+ return;
38
+ }
39
+ subject.next(data);
40
+ }
41
+ /**
42
+ * When you are sure that you are done with the topic and the subscribers no longer needs to listen to a particular topic, you can
43
+ * destroy the observable of the topic using this method.
44
+ * @param topic The name of the topic to destroy.
45
+ */
46
+ destroy(topic) {
47
+ const subject = this.channels[topic];
48
+ if (!subject) {
49
+ return null;
50
+ }
51
+ subject.complete();
52
+ delete this.channels[topic];
53
+ }
54
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: Events, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
55
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: Events, providedIn: 'root' }); }
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: Events, decorators: [{
58
+ type: Injectable,
59
+ args: [{
60
+ providedIn: 'root'
61
+ }]
62
+ }] });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2aWNlLWxpYi9zcmMvbGliL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQzs7QUFFM0M7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxNQUFNO0lBSG5CO1FBS1ksYUFBUSxHQUFxQyxFQUFFLENBQUM7S0FnRDNEO0lBOUNHOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxLQUFhLEVBQUUsUUFBMEI7UUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLHNEQUFzRDtZQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsS0FBYSxFQUFFLElBQVU7UUFDN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCx5REFBeUQ7WUFDekQsT0FBTztRQUNYLENBQUM7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLEtBQWE7UUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDOytHQWpEUSxNQUFNO21IQUFOLE1BQU0sY0FGSCxNQUFNOzs0RkFFVCxNQUFNO2tCQUhsQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQSBjdXN0b20gRXZlbnRzIHNlcnZpY2UganVzdCBsaWtlIElvbmljIDMgRXZlbnRzIGh0dHBzOi8vaW9uaWNmcmFtZXdvcmsuY29tL2RvY3MvdjMvYXBpL3V0aWwvRXZlbnRzLyB3aGljaCBnb3QgcmVtb3ZlZCBpbiBJb25pYyA1LlxuICpcbiAqIEBhdXRob3IgU2hhc2hhbmsgQWdyYXdhbFxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEV2ZW50cyB7XG5cbiAgICBwcml2YXRlIGNoYW5uZWxzOiB7IFtrZXk6IHN0cmluZ106IFN1YmplY3Q8YW55PjsgfSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlIHRvIGEgdG9waWMgYW5kIHByb3ZpZGUgYSBzaW5nbGUgaGFuZGxlci9vYnNlcnZlci5cbiAgICAgKiBAcGFyYW0gdG9waWMgVGhlIG5hbWUgb2YgdGhlIHRvcGljIHRvIHN1YnNjcmliZSB0by5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgVGhlIG9ic2VydmVyIG9yIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGxpc3RlbiB3aGVuIGNoYW5nZXMgYXJlIHB1Ymxpc2hlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFN1YnNjcmlwdGlvbiBmcm9tIHdoaWNoIHlvdSBjYW4gdW5zdWJzY3JpYmUgdG8gcmVsZWFzZSBtZW1vcnkgcmVzb3VyY2VzIGFuZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrLlxuICAgICAqL1xuICAgIHN1YnNjcmliZSh0b3BpYzogc3RyaW5nLCBvYnNlcnZlcjogKF86IGFueSkgPT4gdm9pZCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJlIHRvcGljOiBcIiwgdG9waWMpO1xuICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbHNbdG9waWNdKSB7XG4gICAgICAgICAgICAvLyBZb3UgY2FuIGFsc28gdXNlIFJlcGxheVN1YmplY3Qgd2l0aCBvbmUgY29uY2VxdWVuY2VcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNbdG9waWNdID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbHNbdG9waWNdLnN1YnNjcmliZShvYnNlcnZlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVibGlzaCBzb21lIGRhdGEgdG8gdGhlIHN1YnNjcmliZXJzIG9mIHRoZSBnaXZlbiB0b3BpYy5cbiAgICAgKiBAcGFyYW0gdG9waWMgVGhlIG5hbWUgb2YgdGhlIHRvcGljIHRvIGVtaXQgZGF0YSB0by5cbiAgICAgKiBAcGFyYW0gZGF0YSBkYXRhIGluIGFueSBmb3JtYXQgdG8gcGFzcyBvbi5cbiAgICAgKi9cbiAgICBwdWJsaXNoKHRvcGljOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuY2hhbm5lbHNbdG9waWNdO1xuICAgICAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgICAgICAgIC8vIE9yIHlvdSBjYW4gY3JlYXRlIGEgbmV3IHN1YmplY3QgZm9yIGZ1dHVyZSBzdWJzY3JpYmVyc1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3ViamVjdC5uZXh0KGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4geW91IGFyZSBzdXJlIHRoYXQgeW91IGFyZSBkb25lIHdpdGggdGhlIHRvcGljIGFuZCB0aGUgc3Vic2NyaWJlcnMgbm8gbG9uZ2VyIG5lZWRzIHRvIGxpc3RlbiB0byBhIHBhcnRpY3VsYXIgdG9waWMsIHlvdSBjYW5cbiAgICAgKiBkZXN0cm95IHRoZSBvYnNlcnZhYmxlIG9mIHRoZSB0b3BpYyB1c2luZyB0aGlzIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0gdG9waWMgVGhlIG5hbWUgb2YgdGhlIHRvcGljIHRvIGRlc3Ryb3kuXG4gICAgICovXG4gICAgZGVzdHJveSh0b3BpYzogc3RyaW5nKTogYW55IHtcbiAgICAgICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuY2hhbm5lbHNbdG9waWNdO1xuICAgICAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICBkZWxldGUgdGhpcy5jaGFubmVsc1t0b3BpY107XG4gICAgfVxufSJdfQ==