taxtank-core 0.8.6 → 0.8.7

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 (150) hide show
  1. package/bundles/taxtank-core.umd.js +94 -92
  2. package/bundles/taxtank-core.umd.js.map +1 -1
  3. package/esm2015/lib/db/Models/transaction-base.js +2 -1
  4. package/esm2015/lib/services/http/address/address.service.js +39 -0
  5. package/esm2015/lib/services/http/bank/bank-account/bank-account.service.js +118 -0
  6. package/esm2015/lib/services/http/bank/bank-connection/bank-connection.service.js +52 -0
  7. package/esm2015/lib/services/http/bank/bank-transaction/bank-transaction.service.js +89 -0
  8. package/esm2015/lib/services/http/bank/bank.service.js +24 -0
  9. package/esm2015/lib/services/http/bank/basiq/basiq.service.js +94 -0
  10. package/esm2015/lib/services/http/chart-accounts/chart-accounts-depreciations/chart-accounts-depreciations.service.js +38 -0
  11. package/esm2015/lib/services/http/chart-accounts/chart-accounts.service.js +89 -0
  12. package/esm2015/lib/services/http/chat/chat.service.js +77 -0
  13. package/esm2015/lib/services/http/chat/message/message.service.js +65 -0
  14. package/esm2015/lib/services/http/chat/message-document/message-document.service.js +118 -0
  15. package/esm2015/lib/services/{depreciation/capital-project.service.js → http/depreciation/depreciation-capital-project/depreciation-capital-project.service.js} +7 -7
  16. package/esm2015/lib/services/http/depreciation/depreciation.service.js +146 -0
  17. package/esm2015/lib/services/http/document/document-folder/document-folder.service.js +84 -0
  18. package/esm2015/lib/services/{client → http/firm/client-invite}/client-invite.service.js +7 -7
  19. package/esm2015/lib/services/http/firm/client-movement/client-movement.service.js +98 -0
  20. package/esm2015/lib/services/http/firm/employee/employee.service.js +39 -0
  21. package/esm2015/lib/services/http/firm/employee-invite/employee-invite.service.js +53 -0
  22. package/esm2015/lib/services/http/firm/firm.service.js +79 -0
  23. package/esm2015/lib/services/http/firm/portfolio-report/client-portfolio-report.service.js +37 -0
  24. package/esm2015/lib/services/http/income-source/income-source-forecast/income-source-forecast.service.js +90 -0
  25. package/esm2015/lib/services/http/income-source/income-source.service.js +109 -0
  26. package/esm2015/lib/services/http/income-source/salary-forecast/salary-forecast.service.js +90 -0
  27. package/esm2015/lib/services/http/income-source/sole-forecast/sole-forecast.service.js +87 -0
  28. package/esm2015/lib/services/http/loan/borrowing-expense/borrowing-expense.service.js +73 -0
  29. package/esm2015/lib/services/http/loan/loan.service.js +145 -0
  30. package/esm2015/lib/services/http/property/property-category/property-category.service.js +23 -0
  31. package/esm2015/lib/services/http/property/property-category-movement/property-category-movement.service.js +47 -0
  32. package/esm2015/lib/services/http/property/property-document/property-document.service.js +70 -0
  33. package/esm2015/lib/services/http/property/property-sale/property-sale.service.js +20 -0
  34. package/esm2015/lib/services/http/property/property-sale/tax-exemption/tax-exemption.service.js +21 -0
  35. package/esm2015/lib/services/http/property/property-share/property-share.service.js +115 -0
  36. package/esm2015/lib/services/http/property/property.service.js +126 -0
  37. package/esm2015/lib/services/http/rest/rest.service.js +190 -0
  38. package/esm2015/lib/services/http/service-notification/service-notification.service.js +65 -0
  39. package/esm2015/lib/services/http/subscription/subscription.service.js +157 -0
  40. package/esm2015/lib/services/http/tax-review/tax-review-history/tax-review-history.service.js +41 -0
  41. package/esm2015/lib/services/http/tax-review/tax-review.service.js +103 -0
  42. package/esm2015/lib/services/http/tax-summary/tax-summary.service.js +71 -0
  43. package/esm2015/lib/services/http/transaction/transaction-allocation/transaction-allocation.service.js +85 -0
  44. package/esm2015/lib/services/http/transaction/transaction.service.js +319 -0
  45. package/esm2015/lib/services/http/user/occupation/occupation.service.js +45 -0
  46. package/esm2015/lib/services/http/user/user-event-setting/user-event-setting.service.js +59 -0
  47. package/esm2015/lib/services/http/user/user-event-type/user-event-type.service.js +29 -0
  48. package/esm2015/lib/services/http/user/user.service.js +124 -0
  49. package/esm2015/lib/services/http/vehicle/vehicle.service.js +237 -0
  50. package/esm2015/lib/services/property/equity-position-chart/equity-position-chart.service.js +45 -0
  51. package/esm2015/public-api.js +48 -48
  52. package/fesm2015/taxtank-core.js +51 -49
  53. package/fesm2015/taxtank-core.js.map +1 -1
  54. package/lib/services/{address → http/address}/address.service.d.ts +1 -1
  55. package/lib/services/{bank → http/bank/bank-account}/bank-account.service.d.ts +5 -5
  56. package/lib/services/{bank → http/bank/bank-connection}/bank-connection.service.d.ts +5 -5
  57. package/lib/services/{bank → http/bank/bank-transaction}/bank-transaction.service.d.ts +5 -5
  58. package/lib/services/{bank → http/bank}/bank.service.d.ts +4 -4
  59. package/lib/services/{bank → http/bank/basiq}/basiq.service.d.ts +7 -7
  60. package/lib/services/{chart-accounts → http/chart-accounts/chart-accounts-depreciations}/chart-accounts-depreciations.service.d.ts +4 -4
  61. package/lib/services/{chart-accounts → http/chart-accounts}/chart-accounts.service.d.ts +3 -3
  62. package/lib/services/{chat → http/chat}/chat.service.d.ts +7 -7
  63. package/lib/services/{chat → http/chat/message}/message.service.d.ts +7 -7
  64. package/lib/services/{chat → http/chat/message-document}/message-document.service.d.ts +3 -3
  65. package/lib/services/{depreciation/capital-project.service.d.ts → http/depreciation/depreciation-capital-project/depreciation-capital-project.service.d.ts} +4 -4
  66. package/lib/services/{depreciation → http/depreciation}/depreciation.service.d.ts +5 -5
  67. package/lib/services/{document → http/document/document-folder}/document-folder.service.d.ts +6 -6
  68. package/lib/services/{client → http/firm/client-invite}/client-invite.service.d.ts +4 -4
  69. package/lib/services/{client → http/firm/client-movement}/client-movement.service.d.ts +7 -7
  70. package/lib/services/{employee → http/firm/employee}/employee.service.d.ts +4 -4
  71. package/lib/services/{employee → http/firm/employee-invite}/employee-invite.service.d.ts +4 -4
  72. package/lib/services/{firm → http/firm}/firm.service.d.ts +2 -2
  73. package/lib/services/{client → http/firm/portfolio-report}/client-portfolio-report.service.d.ts +1 -1
  74. package/lib/services/{income-source → http/income-source/income-source-forecast}/income-source-forecast.service.d.ts +5 -5
  75. package/lib/services/{income-source → http/income-source}/income-source.service.d.ts +8 -8
  76. package/lib/services/{income-source → http/income-source/salary-forecast}/salary-forecast.service.d.ts +6 -6
  77. package/lib/services/{income-source → http/income-source/sole-forecast}/sole-forecast.service.d.ts +5 -5
  78. package/lib/services/{borrowing-expense → http/loan/borrowing-expense}/borrowing-expense.service.d.ts +2 -2
  79. package/lib/services/{loan → http/loan}/loan.service.d.ts +6 -6
  80. package/lib/services/{property → http/property}/property-category/property-category.service.d.ts +4 -4
  81. package/lib/services/{property → http/property/property-category-movement}/property-category-movement.service.d.ts +4 -4
  82. package/lib/services/{property → http/property}/property-document/property-document.service.d.ts +5 -5
  83. package/lib/services/http/property/property-sale/property-sale.service.d.ts +10 -0
  84. package/lib/services/http/property/property-sale/tax-exemption/tax-exemption.service.d.ts +11 -0
  85. package/lib/services/{property → http/property}/property-share/property-share.service.d.ts +5 -5
  86. package/lib/services/{property → http/property}/property.service.d.ts +5 -5
  87. package/lib/services/{base-rest.service.d.ts → http/rest/rest.service.d.ts} +4 -4
  88. package/lib/services/http/service-notification/service-notification.service.d.ts +31 -0
  89. package/lib/services/{subscription → http/subscription}/subscription.service.d.ts +6 -6
  90. package/lib/services/{tax-review → http/tax-review/tax-review-history}/tax-review-history.service.d.ts +5 -5
  91. package/lib/services/{tax-review → http/tax-review}/tax-review.service.d.ts +6 -6
  92. package/lib/services/{tax-summary → http/tax-summary}/tax-summary.service.d.ts +2 -2
  93. package/lib/services/{transaction → http/transaction/transaction-allocation}/transaction-allocation.service.d.ts +6 -6
  94. package/lib/services/{transaction → http/transaction}/transaction.service.d.ts +7 -7
  95. package/lib/services/{user → http/user/occupation}/occupation.service.d.ts +1 -1
  96. package/lib/services/{user-event → http/user/user-event-setting}/user-event-setting.service.d.ts +5 -5
  97. package/lib/services/{user-event → http/user/user-event-type}/user-event-type.service.d.ts +5 -5
  98. package/lib/services/{user → http/user}/user.service.d.ts +3 -3
  99. package/lib/services/{work/work-tank.service.d.ts → http/vehicle/vehicle.service.d.ts} +9 -8
  100. package/lib/services/property/{equity-position-chart.service.d.ts → equity-position-chart/equity-position-chart.service.d.ts} +1 -1
  101. package/package.json +1 -1
  102. package/public-api.d.ts +47 -47
  103. package/esm2015/lib/services/address/address.service.js +0 -39
  104. package/esm2015/lib/services/bank/bank-account.service.js +0 -118
  105. package/esm2015/lib/services/bank/bank-connection.service.js +0 -52
  106. package/esm2015/lib/services/bank/bank-transaction.service.js +0 -89
  107. package/esm2015/lib/services/bank/bank.service.js +0 -24
  108. package/esm2015/lib/services/bank/basiq.service.js +0 -94
  109. package/esm2015/lib/services/base-rest.service.js +0 -190
  110. package/esm2015/lib/services/borrowing-expense/borrowing-expense.service.js +0 -73
  111. package/esm2015/lib/services/chart-accounts/chart-accounts-depreciations.service.js +0 -38
  112. package/esm2015/lib/services/chart-accounts/chart-accounts.service.js +0 -89
  113. package/esm2015/lib/services/chat/chat.service.js +0 -77
  114. package/esm2015/lib/services/chat/message-document.service.js +0 -118
  115. package/esm2015/lib/services/chat/message.service.js +0 -65
  116. package/esm2015/lib/services/client/client-movement.service.js +0 -98
  117. package/esm2015/lib/services/client/client-portfolio-report.service.js +0 -37
  118. package/esm2015/lib/services/depreciation/depreciation.service.js +0 -146
  119. package/esm2015/lib/services/document/document-folder.service.js +0 -84
  120. package/esm2015/lib/services/employee/employee-invite.service.js +0 -53
  121. package/esm2015/lib/services/employee/employee.service.js +0 -39
  122. package/esm2015/lib/services/firm/firm.service.js +0 -79
  123. package/esm2015/lib/services/income-source/income-source-forecast.service.js +0 -90
  124. package/esm2015/lib/services/income-source/income-source.service.js +0 -109
  125. package/esm2015/lib/services/income-source/salary-forecast.service.js +0 -90
  126. package/esm2015/lib/services/income-source/sole-forecast.service.js +0 -87
  127. package/esm2015/lib/services/loan/loan.service.js +0 -145
  128. package/esm2015/lib/services/notification/notification.service.js +0 -65
  129. package/esm2015/lib/services/property/equity-position-chart.service.js +0 -45
  130. package/esm2015/lib/services/property/property-category/property-category.service.js +0 -23
  131. package/esm2015/lib/services/property/property-category-movement.service.js +0 -47
  132. package/esm2015/lib/services/property/property-document/property-document.service.js +0 -70
  133. package/esm2015/lib/services/property/property-sale/property-sale.service.js +0 -20
  134. package/esm2015/lib/services/property/property-sale/tax-exemption/tax-exemption.service.js +0 -21
  135. package/esm2015/lib/services/property/property-share/property-share.service.js +0 -115
  136. package/esm2015/lib/services/property/property.service.js +0 -126
  137. package/esm2015/lib/services/subscription/subscription.service.js +0 -157
  138. package/esm2015/lib/services/tax-review/tax-review-history.service.js +0 -41
  139. package/esm2015/lib/services/tax-review/tax-review.service.js +0 -103
  140. package/esm2015/lib/services/tax-summary/tax-summary.service.js +0 -71
  141. package/esm2015/lib/services/transaction/transaction-allocation.service.js +0 -85
  142. package/esm2015/lib/services/transaction/transaction.service.js +0 -319
  143. package/esm2015/lib/services/user/occupation.service.js +0 -45
  144. package/esm2015/lib/services/user/user.service.js +0 -124
  145. package/esm2015/lib/services/user-event/user-event-setting.service.js +0 -59
  146. package/esm2015/lib/services/user-event/user-event-type.service.js +0 -29
  147. package/esm2015/lib/services/work/work-tank.service.js +0 -236
  148. package/lib/services/notification/notification.service.d.ts +0 -31
  149. package/lib/services/property/property-sale/property-sale.service.d.ts +0 -10
  150. package/lib/services/property/property-sale/tax-exemption/tax-exemption.service.d.ts +0 -11
@@ -0,0 +1,126 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { map } from 'rxjs/operators';
3
+ import { replace } from '../../../functions/array';
4
+ import { plainToClass } from 'class-transformer';
5
+ import { RestService } from '../rest/rest.service';
6
+ import { Property } from '../../../models/property/property';
7
+ import { AppEventTypeEnum } from '../../../models/event/app-event-type.enum';
8
+ import { AppEvent } from '../../../models/event/app-event';
9
+ import { PropertySubscription } from '../../../models/property/property-subscription';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common/http";
12
+ import * as i2 from "../../event/event-dispatcher.service";
13
+ /**
14
+ * Service for work with Property
15
+ */
16
+ export class PropertyService extends RestService {
17
+ constructor(http, eventDispatcherService, environment) {
18
+ super(http, eventDispatcherService, environment);
19
+ this.http = http;
20
+ this.eventDispatcherService = eventDispatcherService;
21
+ this.environment = environment;
22
+ this.modelClass = Property;
23
+ this.url = 'properties';
24
+ this.listenEvents();
25
+ }
26
+ listenEvents() {
27
+ this.listenShareInviteAccepted();
28
+ this.listenServiceSubscriptionUpdated();
29
+ // @TODO Alex: consider to refactor property movements logic similar to client-movements
30
+ this.listenMovementsChanged();
31
+ }
32
+ /**
33
+ * Update cache when share invitation accepted
34
+ */
35
+ listenShareInviteAccepted() {
36
+ this.eventDispatcherService.on(AppEventTypeEnum.PROPERTY_SHARE_UPDATED).subscribe(() => this.resetCache());
37
+ }
38
+ /**
39
+ * Update cache when user's service subscription is updated
40
+ */
41
+ listenServiceSubscriptionUpdated() {
42
+ this.eventDispatcherService.on(AppEventTypeEnum.SERVICE_SUBSCRIPTION_UPDATED).subscribe(() => this.resetCache());
43
+ }
44
+ /**
45
+ * Update cache when property category changed
46
+ */
47
+ listenMovementsChanged() {
48
+ // @TODO change dispatcher logic to work with multiple events
49
+ this.eventDispatcherService.on(AppEventTypeEnum.PROPERTY_MOVEMENT_CREATED).subscribe(() => this.resetCache());
50
+ this.eventDispatcherService.on(AppEventTypeEnum.PROPERTY_MOVEMENT_UPDATED).subscribe(() => this.resetCache());
51
+ this.eventDispatcherService.on(AppEventTypeEnum.PROPERTY_MOVEMENT_DELETED).subscribe(() => this.resetCache());
52
+ }
53
+ update(property) {
54
+ return super.update(property).pipe(map((updatedProperty) => {
55
+ if (property.documentFile) {
56
+ this.eventDispatcherService.dispatch(new AppEvent(AppEventTypeEnum.PROPERTY_UPDATED_WITH_DOCUMENT, property));
57
+ }
58
+ return updatedProperty;
59
+ }));
60
+ }
61
+ getByCategoryId(id) {
62
+ return this.get().pipe(map((properties) => {
63
+ return properties.filter((property) => property.category.id === id);
64
+ }));
65
+ }
66
+ /**
67
+ * Activate deactivated property
68
+ */
69
+ activate(property) {
70
+ return this.http.post(`${this.environment.apiV2}/property-subscriptions`, { user: property.user, property })
71
+ .pipe(map((propertySubscriptionBase) => {
72
+ const newPropertySubscription = plainToClass(PropertySubscription, propertySubscriptionBase);
73
+ const activatedProperty = plainToClass(Property, Object.assign({}, property, { subscriptions: [newPropertySubscription] }));
74
+ replace(this.cache, activatedProperty);
75
+ this.updateCache();
76
+ }));
77
+ }
78
+ /**
79
+ * Deactivate activated property
80
+ */
81
+ deactivate(property) {
82
+ return this.http.delete(`${this.environment.apiV2}/property-subscriptions/${property.getCurrentSubscription().id}`)
83
+ .pipe(map(() => {
84
+ const deactivatedProperty = plainToClass(Property, Object.assign({}, property, { subscriptions: [] }));
85
+ replace(this.cache, deactivatedProperty);
86
+ this.updateCache();
87
+ }));
88
+ }
89
+ /**
90
+ * Update property photo
91
+ * @param property Property instance for photo update
92
+ * @param photoFormData FormData with property photo image
93
+ */
94
+ updatePhoto(property, photoFormData) {
95
+ return this.http.post(`${this.environment.apiV2}/properties/${property.id}/photo?_method=PUT`, photoFormData)
96
+ .pipe(map((photoLink) => {
97
+ property.photo = photoLink;
98
+ // update properties cache
99
+ replace(this.cache, property);
100
+ this.updateCache();
101
+ }));
102
+ }
103
+ getByShareId(id) {
104
+ return this.get().pipe(map((properties) => {
105
+ return properties.filter((property) => property.user.id === id);
106
+ }));
107
+ }
108
+ /**
109
+ * Get list of active user's properties
110
+ */
111
+ getActive() {
112
+ return this.get().pipe(map((properties) => properties.filter((property) => property.isActive)));
113
+ }
114
+ }
115
+ PropertyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: PropertyService, deps: [{ token: i1.HttpClient }, { token: i2.EventDispatcherService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable });
116
+ PropertyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: PropertyService, providedIn: 'root' });
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: PropertyService, decorators: [{
118
+ type: Injectable,
119
+ args: [{
120
+ providedIn: 'root'
121
+ }]
122
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.EventDispatcherService }, { type: undefined, decorators: [{
123
+ type: Inject,
124
+ args: ['environment']
125
+ }] }]; } });
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9odHRwL3Byb3BlcnR5L3Byb3BlcnR5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUU3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7QUFFdEY7O0dBRUc7QUFJSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxXQUFtQztJQUl0RSxZQUNZLElBQWdCLEVBQ2hCLHNCQUE4QyxFQUN2QixXQUFnQjtRQUVqRCxLQUFLLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBSnZDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUN2QixnQkFBVyxHQUFYLFdBQVcsQ0FBSztRQU5uRCxlQUFVLEdBQW9CLFFBQVEsQ0FBQztRQUN2QyxRQUFHLEdBQVcsWUFBWSxDQUFDO1FBUXpCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixD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Q0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRCxZQUFZLENBQUMsRUFBVTtRQUNyQixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3BCLEdBQUcsQ0FBQyxDQUFDLFVBQXNCLEVBQWMsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFrQixFQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDcEIsR0FBRyxDQUFDLENBQUMsVUFBc0IsRUFBYyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQWtCLEVBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUNuSCxDQUFDO0lBQ0osQ0FBQzs7NkdBN0hVLGVBQWUsa0ZBT2hCLGFBQWE7aUhBUFosZUFBZSxjQUZkLE1BQU07NEZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFJLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUHJvcGVydHkgYXMgUHJvcGVydHlCYXNlIH0gZnJvbSAnLi4vLi4vLi4vZGIvTW9kZWxzL3Byb3BlcnR5L3Byb3BlcnR5JztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHJlcGxhY2UgfSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMvYXJyYXknO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IHBsYWluVG9DbGFzcyB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IFByb3BlcnR5U3Vic2NyaXB0aW9uIGFzIFByb3BlcnR5U3Vic2NyaXB0aW9uQmFzZSB9IGZyb20gJy4uLy4uLy4uL2RiL01vZGVscy9wcm9wZXJ0eS9wcm9wZXJ0eS1zdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi9yZXN0L3Jlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9wcm9wZXJ0eS9wcm9wZXJ0eSc7XG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXZlbnQvZXZlbnQtZGlzcGF0Y2hlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcEV2ZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZXZlbnQvYXBwLWV2ZW50LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBBcHBFdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9ldmVudC9hcHAtZXZlbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlTdWJzY3JpcHRpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvcHJvcGVydHkvcHJvcGVydHktc3Vic2NyaXB0aW9uJztcblxuLyoqXG4gKiBTZXJ2aWNlIGZvciB3b3JrIHdpdGggUHJvcGVydHlcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlTZXJ2aWNlIGV4dGVuZHMgUmVzdFNlcnZpY2U8UHJvcGVydHlCYXNlLCBQcm9wZXJ0eT4ge1xuICBtb2RlbENsYXNzOiB0eXBlb2YgUHJvcGVydHkgPSBQcm9wZXJ0eTtcbiAgdXJsOiBzdHJpbmcgPSAncHJvcGVydGllcyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJvdGVjdGVkIGV2ZW50RGlzcGF0Y2hlclNlcnZpY2U6IEV2ZW50RGlzcGF0Y2hlclNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IGFueVxuICApIHtcbiAgICBzdXBlcihodHRwLCBldmVudERpc3BhdGNoZXJTZXJ2aWNlLCBlbnZpcm9ubWVudCk7XG4gICAgdGhpcy5saXN0ZW5FdmVudHMoKTtcbiAgfVxuXG4gIGxpc3RlbkV2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlblNoYXJlSW52aXRlQWNjZXB0ZWQoKTtcbiAgICB0aGlzLmxpc3RlblNlcnZpY2VTdWJzY3JpcHRpb25VcGRhdGVkKCk7XG4gICAgLy8gQFRPRE8gQWxleDogY29uc2lkZXIgdG8gcmVmYWN0b3IgcHJvcGVydHkgbW92ZW1lbnRzIGxvZ2ljIHNpbWlsYXIgdG8gY2xpZW50LW1vdmVtZW50c1xuICAgIHRoaXMubGlzdGVuTW92ZW1lbnRzQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjYWNoZSB3aGVuIHNoYXJlIGludml0YXRpb24gYWNjZXB0ZWRcbiAgICovXG4gIHByaXZhdGUgbGlzdGVuU2hhcmVJbnZpdGVBY2NlcHRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlclNlcnZpY2Uub24oQXBwRXZlbnRUeXBlRW51bS5QUk9QRVJUWV9TSEFSRV9VUERBVEVEKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNldENhY2hlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjYWNoZSB3aGVuIHVzZXIncyBzZXJ2aWNlIHN1YnNjcmlwdGlvbiBpcyB1cGRhdGVkXG4gICAqL1xuICBwcml2YXRlIGxpc3RlblNlcnZpY2VTdWJzY3JpcHRpb25VcGRhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyU2VydmljZS5vbihBcHBFdmVudFR5cGVFbnVtLlNFUlZJQ0VfU1VCU0NSSVBUSU9OX1VQREFURUQpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2V0Q2FjaGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNhY2hlIHdoZW4gcHJvcGVydHkgY2F0ZWdvcnkgY2hhbmdlZFxuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5Nb3ZlbWVudHNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIC8vIEBUT0RPIGNoYW5nZSBkaXNwYXRjaGVyIGxvZ2ljIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBldmVudHNcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlclNlcnZpY2Uub24oQXBwRXZlbnRUeXBlRW51bS5QUk9QRVJUWV9NT1ZFTUVOVF9DUkVBVEVEKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNldENhY2hlKCkpO1xuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyU2VydmljZS5vbihBcHBFdmVudFR5cGVFbnVtLlBST1BFUlRZX01PVkVNRU5UX1VQREFURUQpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2V0Q2FjaGUoKSk7XG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXJTZXJ2aWNlLm9uKEFwcEV2ZW50VHlwZUVudW0uUFJPUEVSVFlfTU9WRU1FTlRfREVMRVRFRCkuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVzZXRDYWNoZSgpKTtcbiAgfVxuXG4gIHVwZGF0ZShwcm9wZXJ0eTogUHJvcGVydHkpOiBPYnNlcnZhYmxlPFByb3BlcnR5PiB7XG4gICAgcmV0dXJuIHN1cGVyLnVwZGF0ZShwcm9wZXJ0eSkucGlwZShcbiAgICAgIG1hcCgodXBkYXRlZFByb3BlcnR5OiBQcm9wZXJ0eSk6IFByb3BlcnR5ID0+IHtcbiAgICAgICAgaWYgKHByb3BlcnR5LmRvY3VtZW50RmlsZSkge1xuICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyU2VydmljZS5kaXNwYXRjaChuZXcgQXBwRXZlbnQoQXBwRXZlbnRUeXBlRW51bS5QUk9QRVJUWV9VUERBVEVEX1dJVEhfRE9DVU1FTlQsIHByb3BlcnR5KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVwZGF0ZWRQcm9wZXJ0eTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEJ5Q2F0ZWdvcnlJZChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxQcm9wZXJ0eVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkucGlwZShcbiAgICAgIG1hcCgocHJvcGVydGllczogUHJvcGVydHlbXSk6IFByb3BlcnR5W10gPT4ge1xuICAgICAgICByZXR1cm4gcHJvcGVydGllcy5maWx0ZXIoKHByb3BlcnR5OiBQcm9wZXJ0eSk6IGJvb2xlYW4gPT4gcHJvcGVydHkuY2F0ZWdvcnkuaWQgPT09IGlkKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBkZWFjdGl2YXRlZCBwcm9wZXJ0eVxuICAgKi9cbiAgYWN0aXZhdGUocHJvcGVydHk6IFByb3BlcnR5KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9L3Byb3BlcnR5LXN1YnNjcmlwdGlvbnNgLCB7dXNlcjogcHJvcGVydHkudXNlciwgcHJvcGVydHl9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocHJvcGVydHlTdWJzY3JpcHRpb25CYXNlOiBQcm9wZXJ0eVN1YnNjcmlwdGlvbkJhc2UpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdQcm9wZXJ0eVN1YnNjcmlwdGlvbjogUHJvcGVydHlTdWJzY3JpcHRpb24gPSBwbGFpblRvQ2xhc3MoUHJvcGVydHlTdWJzY3JpcHRpb24sIHByb3BlcnR5U3Vic2NyaXB0aW9uQmFzZSk7XG4gICAgICAgICAgY29uc3QgYWN0aXZhdGVkUHJvcGVydHk6IFByb3BlcnR5ID0gcGxhaW5Ub0NsYXNzKFByb3BlcnR5LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wZXJ0eSwge3N1YnNjcmlwdGlvbnM6IFtuZXdQcm9wZXJ0eVN1YnNjcmlwdGlvbl19KSk7XG5cbiAgICAgICAgICByZXBsYWNlKHRoaXMuY2FjaGUsIGFjdGl2YXRlZFByb3BlcnR5KTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYWN0aXZhdGVkIHByb3BlcnR5XG4gICAqL1xuICBkZWFjdGl2YXRlKHByb3BlcnR5OiBQcm9wZXJ0eSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9L3Byb3BlcnR5LXN1YnNjcmlwdGlvbnMvJHtwcm9wZXJ0eS5nZXRDdXJyZW50U3Vic2NyaXB0aW9uKCkuaWR9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRlYWN0aXZhdGVkUHJvcGVydHk6IFByb3BlcnR5ID0gcGxhaW5Ub0NsYXNzKFByb3BlcnR5LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wZXJ0eSwge3N1YnNjcmlwdGlvbnM6IFtdfSkpO1xuICAgICAgICAgIHJlcGxhY2UodGhpcy5jYWNoZSwgZGVhY3RpdmF0ZWRQcm9wZXJ0eSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVDYWNoZSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcHJvcGVydHkgcGhvdG9cbiAgICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IGluc3RhbmNlIGZvciBwaG90byB1cGRhdGVcbiAgICogQHBhcmFtIHBob3RvRm9ybURhdGEgRm9ybURhdGEgd2l0aCBwcm9wZXJ0eSBwaG90byBpbWFnZVxuICAgKi9cbiAgdXBkYXRlUGhvdG8ocHJvcGVydHk6IFByb3BlcnR5LCBwaG90b0Zvcm1EYXRhOiBGb3JtRGF0YSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS9wcm9wZXJ0aWVzLyR7cHJvcGVydHkuaWR9L3Bob3RvP19tZXRob2Q9UFVUYCwgcGhvdG9Gb3JtRGF0YSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHBob3RvTGluazogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgICAgcHJvcGVydHkucGhvdG8gPSBwaG90b0xpbms7XG4gICAgICAgICAgLy8gdXBkYXRlIHByb3BlcnRpZXMgY2FjaGVcbiAgICAgICAgICByZXBsYWNlKHRoaXMuY2FjaGUsIHByb3BlcnR5KTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgZ2V0QnlTaGFyZUlkKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFByb3BlcnR5W10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5waXBlKFxuICAgICAgbWFwKChwcm9wZXJ0aWVzOiBQcm9wZXJ0eVtdKTogUHJvcGVydHlbXSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmZpbHRlcigocHJvcGVydHk6IFByb3BlcnR5KTogYm9vbGVhbiA9PiBwcm9wZXJ0eS51c2VyLmlkID09PSBpZCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgYWN0aXZlIHVzZXIncyBwcm9wZXJ0aWVzXG4gICAqL1xuICBnZXRBY3RpdmUoKTogT2JzZXJ2YWJsZTxQcm9wZXJ0eVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkucGlwZShcbiAgICAgIG1hcCgocHJvcGVydGllczogUHJvcGVydHlbXSk6IFByb3BlcnR5W10gPT4gcHJvcGVydGllcy5maWx0ZXIoKHByb3BlcnR5OiBQcm9wZXJ0eSk6IGJvb2xlYW4gPT4gcHJvcGVydHkuaXNBY3RpdmUpKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,190 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { ReplaySubject } from 'rxjs';
3
+ import { map } from 'rxjs/operators';
4
+ import { replace } from '../../../functions/array';
5
+ import { classToPlain, plainToClass } from 'class-transformer';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common/http";
8
+ import * as i2 from "../../event/event-dispatcher.service";
9
+ /**
10
+ * Abstract base service that implements common services functionality
11
+ * and describe abstract methods/properties that have to be implemented in child services
12
+ * Model - entity service is working with
13
+ * BaseModel - base entity model that extends by Model
14
+ */
15
+ export class RestService {
16
+ constructor(http, eventDispatcherService, environment) {
17
+ this.http = http;
18
+ this.eventDispatcherService = eventDispatcherService;
19
+ this.environment = environment;
20
+ // subject for service cache
21
+ this.cacheSubject = new ReplaySubject(1);
22
+ }
23
+ /**
24
+ * get cached list of all instances
25
+ */
26
+ get() {
27
+ if (!this.cache) {
28
+ this.fetch().subscribe();
29
+ }
30
+ return this.cacheSubject.asObservable();
31
+ }
32
+ /**
33
+ * get instance by id from cache
34
+ * @param id ID of required item
35
+ */
36
+ getById(id) {
37
+ return this.get()
38
+ .pipe(map((items) => {
39
+ return items.find((item) => item['id'] === id);
40
+ }));
41
+ }
42
+ /**
43
+ * get list of items filtered by id.
44
+ * @param models Array of objects contains required items ids
45
+ */
46
+ getByIds(models) {
47
+ const idsArray = models.map((model) => model['id']);
48
+ return this.get()
49
+ .pipe(map((items) => {
50
+ return items.filter((item) => idsArray.includes(item['id']));
51
+ }));
52
+ }
53
+ /**
54
+ * add new instance and update cache
55
+ * @TODO rename to post
56
+ */
57
+ add(model, shouldUpdateCache = true) {
58
+ return this.http.post(`${this.environment.apiV2}/${this.url}`, classToPlain(model))
59
+ .pipe(map((newItem) => {
60
+ if (!shouldUpdateCache) {
61
+ return null;
62
+ }
63
+ const newInstance = this.createModelInstance(this.modelClass, newItem);
64
+ if (this.cache) {
65
+ this.cache.push(newInstance);
66
+ this.updateCache();
67
+ }
68
+ return newInstance;
69
+ }));
70
+ }
71
+ /**
72
+ * Add several new items
73
+ * @param models Array of new items for saving
74
+ * @param queryParams query parameters for request
75
+ * @TODO rename to postBatch
76
+ */
77
+ addBatch(models, queryParams = {}) {
78
+ return this.http.post(`${this.environment.apiV2}/${this.url}`, classToPlain(models), queryParams)
79
+ .pipe(map((newItems) => {
80
+ const newInstances = newItems.map((item) => this.createModelInstance(this.modelClass, item));
81
+ if (this.cache) {
82
+ this.cache.push(...newInstances);
83
+ this.updateCache();
84
+ }
85
+ return newInstances;
86
+ }));
87
+ }
88
+ /**
89
+ * Update item
90
+ * @param model Existing instance for updating
91
+ * @param queryParams query parameters for request
92
+ * @TODO rename to put
93
+ */
94
+ update(model, queryParams = {}) {
95
+ return this.http.put(`${this.environment.apiV2}/${this.url}/${model['id']}`, classToPlain(model), queryParams)
96
+ .pipe(map((updatedItem) => {
97
+ const updatedInstance = this.createModelInstance(this.modelClass, updatedItem);
98
+ replace(this.cache, updatedInstance);
99
+ this.updateCache();
100
+ return updatedInstance;
101
+ }));
102
+ }
103
+ /**
104
+ * Update several items
105
+ * @param models Array of items for updating
106
+ * @param queryParams query parameters for request
107
+ * TODO rename to putBatch
108
+ */
109
+ updateBatch(models, queryParams = {}) {
110
+ return this.http.put(`${this.environment.apiV2}/${this.url}`, classToPlain(models), queryParams)
111
+ .pipe(map((updatedItems) => {
112
+ const updatedInstances = updatedItems.map((item) => this.createModelInstance(this.modelClass, item));
113
+ updatedInstances.forEach((instance) => {
114
+ replace(this.cache, instance);
115
+ });
116
+ this.updateCache();
117
+ return updatedInstances;
118
+ }));
119
+ }
120
+ /**
121
+ * delete instance of class
122
+ * @param model Class instance for deleting
123
+ */
124
+ delete(model) {
125
+ return this.http.delete(`${this.environment.apiV2}/${this.url}/${model['id']}`)
126
+ .pipe(map(() => {
127
+ this.cache = this.cache.filter((item) => item['id'] !== model['id']);
128
+ this.updateCache();
129
+ }));
130
+ }
131
+ /**
132
+ * delete multiple instances of class
133
+ * @param models Class instances array for deleting
134
+ */
135
+ deleteBatch(models) {
136
+ return this.http.post(`${this.environment.apiV2}/${this.url}/delete`, models)
137
+ .pipe(map(() => {
138
+ const ids = models.map((model) => model['id']);
139
+ this.cache = this.cache.filter((item) => !ids.includes(item['id']));
140
+ this.updateCache();
141
+ }));
142
+ }
143
+ /**
144
+ * clear service cache
145
+ */
146
+ resetCache() {
147
+ this.fetch().subscribe();
148
+ }
149
+ /**
150
+ * get list of base class instances directly from backend
151
+ */
152
+ fetch() {
153
+ return this.http.get(`${this.environment.apiV2}/${this.url}`)
154
+ .pipe(map((response) => {
155
+ const items = (this.isHydra ? response['hydra:member'] : response)
156
+ .map((item) => {
157
+ return this.createModelInstance(this.modelClass, item);
158
+ });
159
+ this.cache = items;
160
+ this.updateCache();
161
+ return items;
162
+ }));
163
+ }
164
+ /**
165
+ * Update cache subject with current cache array value
166
+ */
167
+ updateCache() {
168
+ this.cacheSubject.next(this.cache.slice());
169
+ }
170
+ /**
171
+ * Create new instance of class
172
+ * @param model The class for which you want to create an instance
173
+ * @param baseModel base model instance that we will use as constructor options
174
+ */
175
+ createModelInstance(model, baseModel) {
176
+ return plainToClass(model, baseModel, { excludePrefixes: ['@'] });
177
+ }
178
+ }
179
+ RestService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: RestService, deps: [{ token: i1.HttpClient }, { token: i2.EventDispatcherService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable });
180
+ RestService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: RestService, providedIn: 'root' });
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: RestService, decorators: [{
182
+ type: Injectable,
183
+ args: [{
184
+ providedIn: 'root'
185
+ }]
186
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.EventDispatcherService }, { type: undefined, decorators: [{
187
+ type: Inject,
188
+ args: ['environment']
189
+ }] }]; } });
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHQtY29yZS9zcmMvbGliL3NlcnZpY2VzL2h0dHAvcmVzdC9yZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFFL0Q7Ozs7O0dBS0c7QUFJSCxNQUFNLE9BQWdCLFdBQVc7SUFhL0IsWUFDWSxJQUFnQixFQUNoQixzQkFBOEMsRUFDdkIsV0FBZ0I7UUFGdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQ3ZCLGdCQUFXLEdBQVgsV0FBVyxDQUFLO1FBUm5ELDRCQUE0QjtRQUNsQixpQkFBWSxHQUEyQixJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztJQVMvRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDMUI7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxFQUFVO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTthQUNkLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxLQUFj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bmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHJlcGxhY2UgfSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMvYXJyYXknO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9ldmVudC9ldmVudC1kaXNwYXRjaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2xhc3NUb1BsYWluLCBwbGFpblRvQ2xhc3MgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBzZXJ2aWNlIHRoYXQgaW1wbGVtZW50cyBjb21tb24gc2VydmljZXMgZnVuY3Rpb25hbGl0eVxuICogYW5kIGRlc2NyaWJlIGFic3RyYWN0IG1ldGhvZHMvcHJvcGVydGllcyB0aGF0IGhhdmUgdG8gYmUgaW1wbGVtZW50ZWQgaW4gY2hpbGQgc2VydmljZXNcbiAqIE1vZGVsIC0gZW50aXR5IHNlcnZpY2UgaXMgd29ya2luZyB3aXRoXG4gKiBCYXNlTW9kZWwgLSBiYXNlIGVudGl0eSBtb2RlbCB0aGF0IGV4dGVuZHMgYnkgTW9kZWxcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVzdFNlcnZpY2U8QmFzZU1vZGVsLCBNb2RlbCBleHRlbmRzIEJhc2VNb2RlbD4ge1xuICAvLyB1cmwgcGFydCBmb3Igc2VydmljZSBlbnRpdHkgQVBJLiBIYXZlIHRvIGJlIGRlZmluZWQgaW4gZXh0ZW5kZWQgY2xhc3Nlc1xuICBhYnN0cmFjdCB1cmw6IHN0cmluZztcbiAgLy8gTW9kZWwgY2xhc3MgZm9yIGluc3RhbmNlcyBjcmVhdGluZ1xuICBhYnN0cmFjdCBtb2RlbENsYXNzO1xuICAvLyBAVE9ETyBNYWtlIGNhY2hlIFJlYWRvbmx5XG4gIC8vIGNhY2hlZCBhcnJheSBvZiBzZXJ2aWNlIGNsYXNzIGluc3RhbmNlc1xuICBwcm90ZWN0ZWQgY2FjaGU6IE1vZGVsW107XG4gIC8vIHN1YmplY3QgZm9yIHNlcnZpY2UgY2FjaGVcbiAgcHJvdGVjdGVkIGNhY2hlU3ViamVjdDogUmVwbGF5U3ViamVjdDxNb2RlbFtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0PE1vZGVsW10+KDEpO1xuICAvLyBmbGFnIGZvciB3b3JrIHdpdGggQVBJIHBsYXRmb3JtXG4gIHByb3RlY3RlZCBpc0h5ZHJhOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByb3RlY3RlZCBldmVudERpc3BhdGNoZXJTZXJ2aWNlOiBFdmVudERpc3BhdGNoZXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJvdGVjdGVkIGVudmlyb25tZW50OiBhbnlcbiAgKSB7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGNhY2hlZCBsaXN0IG9mIGFsbCBpbnN0YW5jZXNcbiAgICovXG4gIGdldCgpOiBPYnNlcnZhYmxlPE1vZGVsW10+IHtcbiAgICBpZiAoIXRoaXMuY2FjaGUpIHtcbiAgICAgIHRoaXMuZmV0Y2goKS5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGluc3RhbmNlIGJ5IGlkIGZyb20gY2FjaGVcbiAgICogQHBhcmFtIGlkIElEIG9mIHJlcXVpcmVkIGl0ZW1cbiAgICovXG4gIGdldEJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8TW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoaXRlbXM6IE1vZGVsW10pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbXMuZmluZCgoaXRlbTogTW9kZWwpID0+IGl0ZW1bJ2lkJ10gPT09IGlkKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGxpc3Qgb2YgaXRlbXMgZmlsdGVyZWQgYnkgaWQuXG4gICAqIEBwYXJhbSBtb2RlbHMgQXJyYXkgb2Ygb2JqZWN0cyBjb250YWlucyByZXF1aXJlZCBpdGVtcyBpZHNcbiAgICovXG4gIGdldEJ5SWRzKG1vZGVsczogTW9kZWxbXSk6IE9ic2VydmFibGU8TW9kZWxbXT4ge1xuICAgIGNvbnN0IGlkc0FycmF5OiBudW1iZXJbXSA9IG1vZGVscy5tYXAoKG1vZGVsOiBNb2RlbCkgPT4gbW9kZWxbJ2lkJ10pO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0KClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGl0ZW1zOiBNb2RlbFtdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbTogTW9kZWwpID0+IGlkc0FycmF5LmluY2x1ZGVzKGl0ZW1bJ2lkJ10pKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIG5ldyBpbnN0YW5jZSBhbmQgdXBkYXRlIGNhY2hlXG4gICAqIEBUT0RPIHJlbmFtZSB0byBwb3N0XG4gICAqL1xuICBhZGQobW9kZWw6IE1vZGVsLCBzaG91bGRVcGRhdGVDYWNoZTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPE1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9LyR7dGhpcy51cmx9YCwgY2xhc3NUb1BsYWluKG1vZGVsKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKG5ld0l0ZW06IEJhc2VNb2RlbCkgPT4ge1xuICAgICAgICAgIGlmICghc2hvdWxkVXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbmV3SW5zdGFuY2U6IE1vZGVsID0gdGhpcy5jcmVhdGVNb2RlbEluc3RhbmNlKHRoaXMubW9kZWxDbGFzcywgbmV3SXRlbSk7XG4gICAgICAgICAgaWYgKHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUucHVzaChuZXdJbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgc2V2ZXJhbCBuZXcgaXRlbXNcbiAgICogQHBhcmFtIG1vZGVscyBBcnJheSBvZiBuZXcgaXRlbXMgZm9yIHNhdmluZ1xuICAgKiBAcGFyYW0gcXVlcnlQYXJhbXMgcXVlcnkgcGFyYW1ldGVycyBmb3IgcmVxdWVzdFxuICAgKiBAVE9ETyByZW5hbWUgdG8gcG9zdEJhdGNoXG4gICAqL1xuICBhZGRCYXRjaChtb2RlbHM6IE1vZGVsW10sIHF1ZXJ5UGFyYW1zOiBvYmplY3QgPSB7fSk6IE9ic2VydmFibGU8TW9kZWxbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS8ke3RoaXMudXJsfWAsIGNsYXNzVG9QbGFpbihtb2RlbHMpLCBxdWVyeVBhcmFtcylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKG5ld0l0ZW1zOiBCYXNlTW9kZWxbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld0luc3RhbmNlczogTW9kZWxbXSA9IG5ld0l0ZW1zLm1hcCgoaXRlbTogQmFzZU1vZGVsKSA9PiB0aGlzLmNyZWF0ZU1vZGVsSW5zdGFuY2UodGhpcy5tb2RlbENsYXNzLCBpdGVtKSk7XG4gICAgICAgICAgaWYgKHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUucHVzaCguLi5uZXdJbnN0YW5jZXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZXM7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBpdGVtXG4gICAqIEBwYXJhbSBtb2RlbCBFeGlzdGluZyBpbnN0YW5jZSBmb3IgdXBkYXRpbmdcbiAgICogQHBhcmFtIHF1ZXJ5UGFyYW1zIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHJlcXVlc3RcbiAgICogQFRPRE8gcmVuYW1lIHRvIHB1dFxuICAgKi9cbiAgdXBkYXRlKG1vZGVsOiBNb2RlbCwgcXVlcnlQYXJhbXM6IG9iamVjdCA9IHt9KTogT2JzZXJ2YWJsZTxNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9LyR7dGhpcy51cmx9LyR7bW9kZWxbJ2lkJ119YCwgY2xhc3NUb1BsYWluKG1vZGVsKSwgcXVlcnlQYXJhbXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh1cGRhdGVkSXRlbTogQmFzZU1vZGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZEluc3RhbmNlOiBNb2RlbCA9IHRoaXMuY3JlYXRlTW9kZWxJbnN0YW5jZSh0aGlzLm1vZGVsQ2xhc3MsIHVwZGF0ZWRJdGVtKTtcbiAgICAgICAgICByZXBsYWNlKHRoaXMuY2FjaGUsIHVwZGF0ZWRJbnN0YW5jZSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVDYWNoZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWRJbnN0YW5jZTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHNldmVyYWwgaXRlbXNcbiAgICogQHBhcmFtIG1vZGVscyBBcnJheSBvZiBpdGVtcyBmb3IgdXBkYXRpbmdcbiAgICogQHBhcmFtIHF1ZXJ5UGFyYW1zIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHJlcXVlc3RcbiAgICogVE9ETyByZW5hbWUgdG8gcHV0QmF0Y2hcbiAgICovXG4gIHVwZGF0ZUJhdGNoKG1vZGVsczogTW9kZWxbXSwgcXVlcnlQYXJhbXM6IG9iamVjdCA9IHt9KTogT2JzZXJ2YWJsZTxNb2RlbFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5lbnZpcm9ubWVudC5hcGlWMn0vJHt0aGlzLnVybH1gLCBjbGFzc1RvUGxhaW4obW9kZWxzKSwgcXVlcnlQYXJhbXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh1cGRhdGVkSXRlbXM6IEJhc2VNb2RlbFtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZEluc3RhbmNlczogTW9kZWxbXSA9IHVwZGF0ZWRJdGVtcy5tYXAoKGl0ZW06IEJhc2VNb2RlbCkgPT4gdGhpcy5jcmVhdGVNb2RlbEluc3RhbmNlKHRoaXMubW9kZWxDbGFzcywgaXRlbSkpO1xuICAgICAgICAgIHVwZGF0ZWRJbnN0YW5jZXMuZm9yRWFjaCgoaW5zdGFuY2U6IE1vZGVsKSA9PiB7XG4gICAgICAgICAgICByZXBsYWNlKHRoaXMuY2FjaGUsIGluc3RhbmNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWRJbnN0YW5jZXM7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGRlbGV0ZSBpbnN0YW5jZSBvZiBjbGFzc1xuICAgKiBAcGFyYW0gbW9kZWwgQ2xhc3MgaW5zdGFuY2UgZm9yIGRlbGV0aW5nXG4gICAqL1xuICBkZWxldGUobW9kZWw6IE1vZGVsKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoYCR7dGhpcy5lbnZpcm9ubWVudC5hcGlWMn0vJHt0aGlzLnVybH0vJHttb2RlbFsnaWQnXX1gKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuZmlsdGVyKChpdGVtOiBNb2RlbCkgPT4gaXRlbVsnaWQnXSAhPT0gbW9kZWxbJ2lkJ10pO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogZGVsZXRlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBjbGFzc1xuICAgKiBAcGFyYW0gbW9kZWxzIENsYXNzIGluc3RhbmNlcyBhcnJheSBmb3IgZGVsZXRpbmdcbiAgICovXG4gIGRlbGV0ZUJhdGNoKG1vZGVsczogTW9kZWxbXSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS8ke3RoaXMudXJsfS9kZWxldGVgLCBtb2RlbHMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBpZHM6IG51bWJlcltdID0gbW9kZWxzLm1hcCgobW9kZWw6IE1vZGVsKTogbnVtYmVyID0+IG1vZGVsWydpZCddKTtcbiAgICAgICAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZS5maWx0ZXIoKGl0ZW06IE1vZGVsKSA9PiAhaWRzLmluY2x1ZGVzKGl0ZW1bJ2lkJ10pKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGNsZWFyIHNlcnZpY2UgY2FjaGVcbiAgICovXG4gIHJlc2V0Q2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5mZXRjaCgpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBsaXN0IG9mIGJhc2UgY2xhc3MgaW5zdGFuY2VzIGRpcmVjdGx5IGZyb20gYmFja2VuZFxuICAgKi9cbiAgcHJvdGVjdGVkIGZldGNoKCk6IE9ic2VydmFibGU8TW9kZWxbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9LyR7dGhpcy51cmx9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBCYXNlTW9kZWxbXSk6IE1vZGVsW10gPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1zOiBNb2RlbFtdID0gKHRoaXMuaXNIeWRyYSA/IHJlc3BvbnNlWydoeWRyYTptZW1iZXInXSA6IHJlc3BvbnNlKVxuICAgICAgICAgICAgLm1hcCgoaXRlbTogQmFzZU1vZGVsKTogTW9kZWwgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVNb2RlbEluc3RhbmNlKHRoaXMubW9kZWxDbGFzcywgaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNhY2hlID0gaXRlbXM7XG4gICAgICAgICAgdGhpcy51cGRhdGVDYWNoZSgpO1xuICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNhY2hlIHN1YmplY3Qgd2l0aCBjdXJyZW50IGNhY2hlIGFycmF5IHZhbHVlXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZVN1YmplY3QubmV4dCh0aGlzLmNhY2hlLnNsaWNlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3NcbiAgICogQHBhcmFtIG1vZGVsIFRoZSBjbGFzcyBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIGFuIGluc3RhbmNlXG4gICAqIEBwYXJhbSBiYXNlTW9kZWwgYmFzZSBtb2RlbCBpbnN0YW5jZSB0aGF0IHdlIHdpbGwgdXNlIGFzIGNvbnN0cnVjdG9yIG9wdGlvbnNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVNb2RlbEluc3RhbmNlKG1vZGVsOiBuZXcoYm06IEJhc2VNb2RlbCkgPT4gTW9kZWwsIGJhc2VNb2RlbDogQmFzZU1vZGVsKTogTW9kZWwge1xuICAgIHJldHVybiBwbGFpblRvQ2xhc3MobW9kZWwsIGJhc2VNb2RlbCwgeyBleGNsdWRlUHJlZml4ZXM6IFsnQCddIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,65 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { Notification } from '../../../models/notification/notification';
3
+ import { replace } from '../../../functions/array';
4
+ import { plainToClass } from 'class-transformer';
5
+ import { RestService } from '../rest/rest.service';
6
+ import { AppEvent } from '../../../models/event/app-event';
7
+ import { AppEventTypeEnum } from '../../../models/event/app-event-type.enum';
8
+ import clone from 'lodash/clone';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/common/http";
11
+ import * as i2 from "../../event/event-dispatcher.service";
12
+ import * as i3 from "../../event/sse.service";
13
+ /**
14
+ * Service to handle service notifications logic
15
+ */
16
+ export class ServiceNotificationService extends RestService {
17
+ constructor(http, eventDispatcherService, environment, sseService) {
18
+ super(http, eventDispatcherService, environment);
19
+ this.http = http;
20
+ this.eventDispatcherService = eventDispatcherService;
21
+ this.environment = environment;
22
+ this.sseService = sseService;
23
+ this.modelClass = Notification;
24
+ this.url = 'service-notifications';
25
+ this.isHydra = true;
26
+ this.listenEvents();
27
+ }
28
+ /**
29
+ * SSE and Event Dispatcher Services listeners
30
+ */
31
+ listenEvents() {
32
+ this.listenNotifications();
33
+ }
34
+ /**
35
+ * subscribe to new chat messages
36
+ */
37
+ listenNotifications() {
38
+ this.sseService.on(`serviceNotification`).subscribe((notificationBase) => {
39
+ const notification = plainToClass(Notification, notificationBase);
40
+ const cache = clone(this.cache);
41
+ // update existing notification if read and add new notification if not read
42
+ if (notification.isRead) {
43
+ replace(cache, notification);
44
+ }
45
+ else {
46
+ cache.unshift(notification);
47
+ }
48
+ this.cache = cache;
49
+ this.cacheSubject.next(this.cache);
50
+ this.eventDispatcherService.dispatch(new AppEvent(AppEventTypeEnum.NOTIFICATION_ADDED, notification));
51
+ });
52
+ }
53
+ }
54
+ ServiceNotificationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: ServiceNotificationService, deps: [{ token: i1.HttpClient }, { token: i2.EventDispatcherService }, { token: 'environment' }, { token: i3.SseService }], target: i0.ɵɵFactoryTarget.Injectable });
55
+ ServiceNotificationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: ServiceNotificationService, providedIn: 'root' });
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: ServiceNotificationService, decorators: [{
57
+ type: Injectable,
58
+ args: [{
59
+ providedIn: 'root'
60
+ }]
61
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.EventDispatcherService }, { type: undefined, decorators: [{
62
+ type: Inject,
63
+ args: ['environment']
64
+ }] }, { type: i3.SseService }]; } });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1ub3RpZmljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R0LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9odHRwL3NlcnZpY2Utbm90aWZpY2F0aW9uL3NlcnZpY2Utbm90aWZpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUE7Ozs7O0FBQ2hDOztHQUVHO0FBSUgsTUFBTSxPQUFPLDBCQUEyQixTQUFRLFdBQTJDO0lBS3pGLFlBQ1ksSUFBZ0IsRUFDaEIsc0JBQThDLEVBQ3ZCLFdBQWdCLEVBQ3pDLFVBQXNCO1FBRTlCLEtBQUssQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFMdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQ3ZCLGdCQUFXLEdBQVgsV0FBVyxDQUFLO1FBQ3pDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFSaEMsZUFBVSxHQUF3QixZQUFZLENBQUM7UUFDL0MsUUFBRyxHQUFXLHVCQUF1QixDQUFDO1FBQ3RDLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFTdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDVixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxnQkFBa0MsRUFBUSxFQUFFO1lBQy9GLE1BQU0sWUFBWSxHQUFpQixZQUFZLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDaEYsTUFBTSxLQUFLLEdBQW1CLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsNEVBQTRFO1lBQzVFLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtnQkFDdkIsT0FBTyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQzthQUM5QjtpQkFBTTtnQkFDTCxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzdCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN4RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O3dIQXZDVSwwQkFBMEIsa0ZBUTNCLGFBQWE7NEhBUlosMEJBQTBCLGNBRnpCLE1BQU07NEZBRVAsMEJBQTBCO2tCQUh0QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBU0ksTUFBTTsyQkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTm90aWZpY2F0aW9uIGFzIE5vdGlmaWNhdGlvbkJhc2UgfSBmcm9tICcuLi8uLi8uLi9kYi9Nb2RlbHMvc2VydmljZS1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IElFdmVudExpc3RlbmVyIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9ldmVudC1saXN0ZW5lci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcmVwbGFjZSB9IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9ucy9hcnJheSc7XG5pbXBvcnQgeyBwbGFpblRvQ2xhc3MgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uL3Jlc3QvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9ldmVudC9ldmVudC1kaXNwYXRjaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3NlU2VydmljZSB9IGZyb20gJy4uLy4uL2V2ZW50L3NzZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcEV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2V2ZW50L2FwcC1ldmVudCc7XG5pbXBvcnQgeyBBcHBFdmVudFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2V2ZW50L2FwcC1ldmVudC10eXBlLmVudW0nO1xuaW1wb3J0IGNsb25lIGZyb20gJ2xvZGFzaC9jbG9uZSdcbi8qKlxuICogU2VydmljZSB0byBoYW5kbGUgc2VydmljZSBub3RpZmljYXRpb25zIGxvZ2ljXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlcnZpY2VOb3RpZmljYXRpb25TZXJ2aWNlIGV4dGVuZHMgUmVzdFNlcnZpY2U8Tm90aWZpY2F0aW9uQmFzZSwgTm90aWZpY2F0aW9uPiBpbXBsZW1lbnRzIElFdmVudExpc3RlbmVyIHtcbiAgbW9kZWxDbGFzczogdHlwZW9mIE5vdGlmaWNhdGlvbiA9IE5vdGlmaWNhdGlvbjtcbiAgdXJsOiBzdHJpbmcgPSAnc2VydmljZS1ub3RpZmljYXRpb25zJztcbiAgaXNIeWRyYTogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJvdGVjdGVkIGV2ZW50RGlzcGF0Y2hlclNlcnZpY2U6IEV2ZW50RGlzcGF0Y2hlclNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IGFueSxcbiAgICBwcml2YXRlIHNzZVNlcnZpY2U6IFNzZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoaHR0cCwgZXZlbnREaXNwYXRjaGVyU2VydmljZSwgZW52aXJvbm1lbnQpO1xuICAgIHRoaXMubGlzdGVuRXZlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogU1NFIGFuZCBFdmVudCBEaXNwYXRjaGVyIFNlcnZpY2VzIGxpc3RlbmVyc1xuICAgKi9cbiAgbGlzdGVuRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuTm90aWZpY2F0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN1YnNjcmliZSB0byBuZXcgY2hhdCBtZXNzYWdlc1xuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5Ob3RpZmljYXRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuc3NlU2VydmljZS5vbihgc2VydmljZU5vdGlmaWNhdGlvbmApLnN1YnNjcmliZSgobm90aWZpY2F0aW9uQmFzZTogTm90aWZpY2F0aW9uQmFzZSk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24gPSBwbGFpblRvQ2xhc3MoTm90aWZpY2F0aW9uLCBub3RpZmljYXRpb25CYXNlKTtcbiAgICAgIGNvbnN0IGNhY2hlOiBOb3RpZmljYXRpb25bXSA9IGNsb25lKHRoaXMuY2FjaGUpO1xuICAgICAgLy8gdXBkYXRlIGV4aXN0aW5nIG5vdGlmaWNhdGlvbiBpZiByZWFkIGFuZCBhZGQgbmV3IG5vdGlmaWNhdGlvbiBpZiBub3QgcmVhZFxuICAgICAgaWYgKG5vdGlmaWNhdGlvbi5pc1JlYWQpIHtcbiAgICAgICAgcmVwbGFjZShjYWNoZSwgbm90aWZpY2F0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlLnVuc2hpZnQobm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICAgIHRoaXMuY2FjaGVTdWJqZWN0Lm5leHQodGhpcy5jYWNoZSk7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlclNlcnZpY2UuZGlzcGF0Y2gobmV3IEFwcEV2ZW50KEFwcEV2ZW50VHlwZUVudW0uTk9USUZJQ0FUSU9OX0FEREVELCBub3RpZmljYXRpb24pKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,157 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Inject, Injectable } from '@angular/core';
3
+ import { BehaviorSubject, ReplaySubject } from 'rxjs';
4
+ import { map } from 'rxjs/operators';
5
+ import { loadStripe } from '@stripe/stripe-js';
6
+ import { ServicePriceCollection } from '../../../collections/service-price.collection';
7
+ import { ServiceSubscriptionCollection } from '../../../collections/service-subscription.collection';
8
+ import { plainToClass } from 'class-transformer';
9
+ import { ServiceSubscription } from '../../../models/service-subscription/service-subscription';
10
+ import { ServicePayment } from '../../../models/service-subscription/service-payment';
11
+ import { ServicePrice } from '../../../models/service-subscription/service-price';
12
+ import { ServiceSubscriptionItem } from '../../../models/service-subscription/service-subscription-item';
13
+ import { AppEvent } from '../../../models/event/app-event';
14
+ import { AppEventTypeEnum } from '../../../models/event/app-event-type.enum';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@angular/common/http";
17
+ import * as i2 from "../../event/event-dispatcher.service";
18
+ import * as i3 from "../../event/sse.service";
19
+ export class SubscriptionService {
20
+ constructor(http, eventDispatcherService, sseService, environment) {
21
+ this.http = http;
22
+ this.eventDispatcherService = eventDispatcherService;
23
+ this.sseService = sseService;
24
+ this.environment = environment;
25
+ this.serviceSubscriptionSubject = new ReplaySubject(1);
26
+ this.serviceSubscriptionsSubject = new ReplaySubject(1);
27
+ this.servicePaymentsSubject = new ReplaySubject(1);
28
+ this.subscriptionChangeSubject = new BehaviorSubject(null);
29
+ this.listenEvents();
30
+ }
31
+ listenEvents() {
32
+ this.listenSubscriptions();
33
+ }
34
+ getSubscription(force = false) {
35
+ if (!this._serviceSubscription || force) {
36
+ this.http.get(`${this.environment.apiV2}/subscriptions/last`)
37
+ .pipe(map((response) => {
38
+ return plainToClass(ServiceSubscription, response);
39
+ }))
40
+ .subscribe((subsciption) => {
41
+ this._serviceSubscription = subsciption;
42
+ this.serviceSubscriptionSubject.next(this._serviceSubscription);
43
+ });
44
+ }
45
+ return this.serviceSubscriptionSubject.asObservable();
46
+ }
47
+ /**
48
+ * @TODO right now we have only monthly prices, the function should be refactored to support other options in future
49
+ *
50
+ * create available subscription plans based on existing products
51
+ */
52
+ getSubscriptionPlans() {
53
+ if (!this._serviceSubscriptions) {
54
+ this.http.get(`${this.environment.apiV2}/service-prices`)
55
+ .pipe(map((response) => {
56
+ return new ServicePriceCollection(response['hydra:member'].map((item) => plainToClass(ServicePrice, item)));
57
+ }))
58
+ .subscribe((prices) => {
59
+ this._serviceSubscriptions = new ServiceSubscriptionCollection([
60
+ plainToClass(ServiceSubscription, { items: [] }),
61
+ plainToClass(ServiceSubscription, {
62
+ items: [plainToClass(ServiceSubscriptionItem, {
63
+ price: prices.property,
64
+ quantity: 2
65
+ })]
66
+ }),
67
+ plainToClass(ServiceSubscription, {
68
+ items: [plainToClass(ServiceSubscriptionItem, {
69
+ price: prices.property,
70
+ quantity: 3
71
+ })]
72
+ })
73
+ ]);
74
+ this._serviceSubscriptions.items.forEach((subscription) => {
75
+ subscription.items.push(plainToClass(ServiceSubscriptionItem, { price: prices.work, quantity: 1 }));
76
+ });
77
+ this.serviceSubscriptionsSubject.next(this._serviceSubscriptions);
78
+ });
79
+ }
80
+ return this.serviceSubscriptionsSubject.asObservable();
81
+ }
82
+ /**
83
+ * redirect to stripe payment page
84
+ */
85
+ checkoutRedirect(subscription, successUrl, cancelUrl) {
86
+ return __awaiter(this, void 0, void 0, function* () {
87
+ const stripe = yield loadStripe(this.environment.stripePk);
88
+ // @TODO vik
89
+ const lineItems = subscription.items.map((item) => {
90
+ return { servicePriceId: item.price.id, quantity: item.quantity };
91
+ });
92
+ this.http.post(`${this.environment.apiV2}/stripe/checkout-session`, {
93
+ lineItems,
94
+ successUrl: successUrl,
95
+ cancelUrl: cancelUrl
96
+ })
97
+ .subscribe((session) => {
98
+ // @Todo remove user TRIAL status
99
+ stripe.redirectToCheckout({ sessionId: session });
100
+ });
101
+ });
102
+ }
103
+ /**
104
+ * redirect to stripe billing page
105
+ */
106
+ billingRedirect(returnUrl) {
107
+ this.http.get(`${this.environment.apiV2}/stripe/billing-portal-session`, {
108
+ params: { returnUrl }
109
+ }).subscribe((response) => {
110
+ window.location.replace(response.url);
111
+ });
112
+ }
113
+ getPayments() {
114
+ if (!this._servicePayments) {
115
+ this.http.get(`${this.environment.apiV2}/service-payments`).subscribe((response) => {
116
+ this._servicePayments = response.map((item) => plainToClass(ServicePayment, item));
117
+ this.servicePaymentsSubject.next(this._servicePayments);
118
+ });
119
+ }
120
+ return this.servicePaymentsSubject.asObservable();
121
+ }
122
+ /**
123
+ * Get difference between current subscription and selected new subscription
124
+ */
125
+ getProrationCost(items) {
126
+ return this.http.post(`${this.environment.apiV2}/subscriptions/proration-cost`, items).pipe(map((prorationCost) => {
127
+ return prorationCost;
128
+ }));
129
+ }
130
+ /**
131
+ * Change subscription plan
132
+ */
133
+ changeSubscription(items) {
134
+ return this.http.put(`${this.environment.apiV2}/subscriptions/items`, items);
135
+ }
136
+ listenSubscriptions() {
137
+ this.sseService.on(`serviceSubscriptions`)
138
+ .pipe(map((event) => plainToClass(ServiceSubscription, event)))
139
+ .subscribe((subscription) => {
140
+ this.getSubscription(true).subscribe();
141
+ this.subscriptionChangeSubject.next(subscription);
142
+ this.eventDispatcherService.dispatch(new AppEvent(AppEventTypeEnum.SERVICE_SUBSCRIPTION_UPDATED, null));
143
+ });
144
+ }
145
+ }
146
+ SubscriptionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SubscriptionService, deps: [{ token: i1.HttpClient }, { token: i2.EventDispatcherService }, { token: i3.SseService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable });
147
+ SubscriptionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SubscriptionService, providedIn: 'root' });
148
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SubscriptionService, decorators: [{
149
+ type: Injectable,
150
+ args: [{
151
+ providedIn: 'root'
152
+ }]
153
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.EventDispatcherService }, { type: i3.SseService }, { type: undefined, decorators: [{
154
+ type: Inject,
155
+ args: ['environment']
156
+ }] }]; } });
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dC1jb3JlL3NyYy9saWIvc2VydmljZXMvaHR0cC9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdkYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUV0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDbEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDekcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDOzs7OztBQU03RSxNQUFNLE9BQU8sbUJBQW1CO0lBVTlCLFlBQ1UsSUFBZ0IsRUFDaEIsc0JBQThDLEVBQzlDLFVBQXNCLEVBQ0MsV0FBZ0I7UUFIdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQiwyQkFBc0Is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SUFDSCxrQkFBa0IsQ0FBQyxLQUFnQztRQUNqRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUM7YUFDdkMsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLEtBQWEsRUFBdUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUN0RjthQUNBLFNBQVMsQ0FBQyxDQUFDLFlBQWlDLEVBQVEsRUFBRTtZQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7aUhBdkpVLG1CQUFtQiw0R0FjcEIsYUFBYTtxSEFkWixtQkFBbUIsY0FGbEIsTUFBTTs0RkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFlSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGxvYWRTdHJpcGUgfSBmcm9tICdAc3RyaXBlL3N0cmlwZS1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlUHJpY2VDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29sbGVjdGlvbnMvc2VydmljZS1wcmljZS5jb2xsZWN0aW9uJztcbmltcG9ydCB7IFNlcnZpY2VTdWJzY3JpcHRpb25Db2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29sbGVjdGlvbnMvc2VydmljZS1zdWJzY3JpcHRpb24uY29sbGVjdGlvbic7XG5pbXBvcnQgeyBwbGFpblRvQ2xhc3MgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBTZXJ2aWNlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3NlcnZpY2Utc3Vic2NyaXB0aW9uL3NlcnZpY2Utc3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IFNlcnZpY2VQYXltZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3NlcnZpY2Utc3Vic2NyaXB0aW9uL3NlcnZpY2UtcGF5bWVudCc7XG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXZlbnQvZXZlbnQtZGlzcGF0Y2hlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VQcmljZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9zZXJ2aWNlLXN1YnNjcmlwdGlvbi9zZXJ2aWNlLXByaWNlJztcbmltcG9ydCB7IFNlcnZpY2VTdWJzY3JpcHRpb25JdGVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3NlcnZpY2Utc3Vic2NyaXB0aW9uL3NlcnZpY2Utc3Vic2NyaXB0aW9uLWl0ZW0nO1xuaW1wb3J0IHsgQXBwRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZXZlbnQvYXBwLWV2ZW50JztcbmltcG9ydCB7IEFwcEV2ZW50VHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZXZlbnQvYXBwLWV2ZW50LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBTc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXZlbnQvc3NlLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTdWJzY3JpcHRpb25TZXJ2aWNlIHtcbiAgX3NlcnZpY2VTdWJzY3JpcHRpb246IFNlcnZpY2VTdWJzY3JpcHRpb247XG4gIHNlcnZpY2VTdWJzY3JpcHRpb25TdWJqZWN0OiBSZXBsYXlTdWJqZWN0PFNlcnZpY2VTdWJzY3JpcHRpb24+ID0gbmV3IFJlcGxheVN1YmplY3Q8U2VydmljZVN1YnNjcmlwdGlvbj4oMSk7XG4gIF9zZXJ2aWNlU3Vic2NyaXB0aW9uczogU2VydmljZVN1YnNjcmlwdGlvbkNvbGxlY3Rpb247XG4gIHNlcnZpY2VTdWJzY3JpcHRpb25zU3ViamVjdDogUmVwbGF5U3ViamVjdDxTZXJ2aWNlU3Vic2NyaXB0aW9uQ29sbGVjdGlvbj4gPSBuZXcgUmVwbGF5U3ViamVjdDxTZXJ2aWNlU3Vic2NyaXB0aW9uQ29sbGVjdGlvbj4oMSk7XG4gIHN0cmlwZTogYW55O1xuICBzZXJ2aWNlUGF5bWVudHNTdWJqZWN0OiBSZXBsYXlTdWJqZWN0PFNlcnZpY2VQYXltZW50W10+ID0gbmV3IFJlcGxheVN1YmplY3Q8U2VydmljZVBheW1lbnRbXT4oMSk7XG4gIF9zZXJ2aWNlUGF5bWVudHM6IFNlcnZpY2VQYXltZW50W107XG4gIHN1YnNjcmlwdGlvbkNoYW5nZVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxTZXJ2aWNlU3Vic2NyaXB0aW9uPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VydmljZVN1YnNjcmlwdGlvbj4obnVsbCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgZXZlbnREaXNwYXRjaGVyU2VydmljZTogRXZlbnREaXNwYXRjaGVyU2VydmljZSxcbiAgICBwcml2YXRlIHNzZVNlcnZpY2U6IFNzZVNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBwcml2YXRlIGVudmlyb25tZW50OiBhbnlcbiAgKSB7XG4gICAgdGhpcy5saXN0ZW5FdmVudHMoKTtcbiAgfVxuXG4gIGxpc3RlbkV2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlblN1YnNjcmlwdGlvbnMoKTtcbiAgfVxuXG4gIGdldFN1YnNjcmlwdGlvbihmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogT2JzZXJ2YWJsZTxTZXJ2aWNlU3Vic2NyaXB0aW9uPiB7XG4gICAgaWYgKCF0aGlzLl9zZXJ2aWNlU3Vic2NyaXB0aW9uIHx8IGZvcmNlKSB7XG4gICAgICB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9L3N1YnNjcmlwdGlvbnMvbGFzdGApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHBsYWluVG9DbGFzcyhTZXJ2aWNlU3Vic2NyaXB0aW9uLCByZXNwb25zZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChzdWJzY2lwdGlvbjogU2VydmljZVN1YnNjcmlwdGlvbikgPT4ge1xuICAgICAgICAgIHRoaXMuX3NlcnZpY2VTdWJzY3JpcHRpb24gPSBzdWJzY2lwdGlvbjtcbiAgICAgICAgICB0aGlzLnNlcnZpY2VTdWJzY3JpcHRpb25TdWJqZWN0Lm5leHQodGhpcy5fc2VydmljZVN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VTdWJzY3JpcHRpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBUT0RPIHJpZ2h0IG5vdyB3ZSBoYXZlIG9ubHkgbW9udGhseSBwcmljZXMsIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBzdXBwb3J0IG90aGVyIG9wdGlvbnMgaW4gZnV0dXJlXG4gICAqXG4gICAqIGNyZWF0ZSBhdmFpbGFibGUgc3Vic2NyaXB0aW9uIHBsYW5zIGJhc2VkIG9uIGV4aXN0aW5nIHByb2R1Y3RzXG4gICAqL1xuICBnZXRTdWJzY3JpcHRpb25QbGFucygpOiBPYnNlcnZhYmxlPFNlcnZpY2VTdWJzY3JpcHRpb25Db2xsZWN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLl9zZXJ2aWNlU3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy5odHRwLmdldChgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS9zZXJ2aWNlLXByaWNlc2ApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpY2VDb2xsZWN0aW9uKHJlc3BvbnNlWydoeWRyYTptZW1iZXInXS5tYXAoKGl0ZW06IG9iamVjdCkgPT4gcGxhaW5Ub0NsYXNzKFNlcnZpY2VQcmljZSwgaXRlbSkpKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHByaWNlczogU2VydmljZVByaWNlQ29sbGVjdGlvbikgPT4ge1xuICAgICAgICAgIHRoaXMuX3NlcnZpY2VTdWJzY3JpcHRpb25zID0gbmV3IFNlcnZpY2VTdWJzY3JpcHRpb25Db2xsZWN0aW9uKFtcbiAgICAgICAgICAgIHBsYWluVG9DbGFzcyhTZXJ2aWNlU3Vic2NyaXB0aW9uLCB7aXRlbXM6IFtdfSksXG4gICAgICAgICAgICBwbGFpblRvQ2xhc3MoU2VydmljZVN1YnNjcmlwdGlvbiwge1xuICAgICAgICAgICAgICBpdGVtczogW3BsYWluVG9DbGFzcyhTZXJ2aWNlU3Vic2NyaXB0aW9uSXRlbSwge1xuICAgICAgICAgICAgICAgIHByaWNlOiBwcmljZXMucHJvcGVydHksXG4gICAgICAgICAgICAgICAgcXVhbnRpdHk6IDJcbiAgICAgICAgICAgICAgfSldXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHBsYWluVG9DbGFzcyhTZXJ2aWNlU3Vic2NyaXB0aW9uLCB7XG4gICAgICAgICAgICAgIGl0ZW1zOiBbcGxhaW5Ub0NsYXNzKFNlcnZpY2VTdWJzY3JpcHRpb25JdGVtLCB7XG4gICAgICAgICAgICAgICAgcHJpY2U6IHByaWNlcy5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBxdWFudGl0eTogM1xuICAgICAgICAgICAgICB9KV1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5fc2VydmljZVN1YnNjcmlwdGlvbnMuaXRlbXMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uOiBTZXJ2aWNlU3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uaXRlbXMucHVzaChwbGFpblRvQ2xhc3MoU2VydmljZVN1YnNjcmlwdGlvbkl0ZW0sIHtwcmljZTogcHJpY2VzLndvcmssIHF1YW50aXR5OiAxfSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5zZXJ2aWNlU3Vic2NyaXB0aW9uc1N1YmplY3QubmV4dCh0aGlzLl9zZXJ2aWNlU3Vic2NyaXB0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VTdWJzY3JpcHRpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWRpcmVjdCB0byBzdHJpcGUgcGF5bWVudCBwYWdlXG4gICAqL1xuICBhc3luYyBjaGVja291dFJlZGlyZWN0KHN1YnNjcmlwdGlvbjogU2VydmljZVN1YnNjcmlwdGlvbiwgc3VjY2Vzc1VybDogc3RyaW5nLCBjYW5jZWxVcmw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc3RyaXBlOiBhbnkgPSBhd2FpdCBsb2FkU3RyaXBlKHRoaXMuZW52aXJvbm1lbnQuc3RyaXBlUGspO1xuICAgIC8vIEBUT0RPIHZpa1xuICAgIGNvbnN0IGxpbmVJdGVtczogYW55ID0gc3Vic2NyaXB0aW9uLml0ZW1zLm1hcCgoaXRlbTogU2VydmljZVN1YnNjcmlwdGlvbkl0ZW0pID0+IHtcbiAgICAgIHJldHVybiB7c2VydmljZVByaWNlSWQ6IGl0ZW0ucHJpY2UuaWQsIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5fTtcbiAgICB9KTtcblxuICAgIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9L3N0cmlwZS9jaGVja291dC1zZXNzaW9uYCwge1xuICAgICAgbGluZUl0ZW1zLFxuICAgICAgc3VjY2Vzc1VybDogc3VjY2Vzc1VybCxcbiAgICAgIGNhbmNlbFVybDogY2FuY2VsVXJsXG4gICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoKHNlc3Npb246IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBAVG9kbyByZW1vdmUgdXNlciBUUklBTCBzdGF0dXNcbiAgICAgICAgc3RyaXBlLnJlZGlyZWN0VG9DaGVja291dCh7c2Vzc2lvbklkOiBzZXNzaW9ufSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWRpcmVjdCB0byBzdHJpcGUgYmlsbGluZyBwYWdlXG4gICAqL1xuICBiaWxsaW5nUmVkaXJlY3QocmV0dXJuVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9L3N0cmlwZS9iaWxsaW5nLXBvcnRhbC1zZXNzaW9uYCwge1xuICAgICAgcGFyYW1zOiB7cmV0dXJuVXJsfVxuICAgIH0pLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UocmVzcG9uc2UudXJsKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFBheW1lbnRzKCk6IE9ic2VydmFibGU8U2VydmljZVBheW1lbnRbXT4ge1xuICAgIGlmICghdGhpcy5fc2VydmljZVBheW1lbnRzKSB7XG4gICAgICB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuZW52aXJvbm1lbnQuYXBpVjJ9L3NlcnZpY2UtcGF5bWVudHNgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBvYmplY3RbXSkgPT4ge1xuICAgICAgICB0aGlzLl9zZXJ2aWNlUGF5bWVudHMgPSByZXNwb25zZS5tYXAoKGl0ZW06IG9iamVjdCkgPT4gcGxhaW5Ub0NsYXNzKFNlcnZpY2VQYXltZW50LCBpdGVtKSk7XG4gICAgICAgIHRoaXMuc2VydmljZVBheW1lbnRzU3ViamVjdC5uZXh0KHRoaXMuX3NlcnZpY2VQYXltZW50cyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlUGF5bWVudHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBzdWJzY3JpcHRpb24gYW5kIHNlbGVjdGVkIG5ldyBzdWJzY3JpcHRpb25cbiAgICovXG4gIGdldFByb3JhdGlvbkNvc3QoaXRlbXM6IFNlcnZpY2VTdWJzY3JpcHRpb25JdGVtW10pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmVudmlyb25tZW50LmFwaVYyfS9zdWJzY3JpcHRpb25zL3Byb3JhdGlvbi1jb3N0YCwgaXRlbXMpLnBpcGUoXG4gICAgICBtYXAoKHByb3JhdGlvbkNvc3Q6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcmF0aW9uQ29zdDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2Ugc3Vic2NyaXB0aW9uIHBsYW5cbiAgICovXG4gIGNoYW5nZVN1YnNjcmlwdGlvbihpdGVtczogU2VydmljZVN1YnNjcmlwdGlvbkl0ZW1bXSk6IE9ic2VydmFibGU8b2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5lbnZpcm9ubWVudC5hcGlWMn0vc3Vic2NyaXB0aW9ucy9pdGVtc2AsIGl0ZW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnNzZVNlcnZpY2Uub24oYHNlcnZpY2VTdWJzY3JpcHRpb25zYClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGV2ZW50OiBvYmplY3QpOiBTZXJ2aWNlU3Vic2NyaXB0aW9uID0+IHBsYWluVG9DbGFzcyhTZXJ2aWNlU3Vic2NyaXB0aW9uLCBldmVudCkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChzdWJzY3JpcHRpb246IFNlcnZpY2VTdWJzY3JpcHRpb24pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5nZXRTdWJzY3JpcHRpb24odHJ1ZSkuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uQ2hhbmdlU3ViamVjdC5uZXh0KHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyU2VydmljZS5kaXNwYXRjaChuZXcgQXBwRXZlbnQoQXBwRXZlbnRUeXBlRW51bS5TRVJWSUNFX1NVQlNDUklQVElPTl9VUERBVEVELCBudWxsKSk7XG4gICAgICB9KTtcbiAgfVxufVxuIl19