@stemy/ngx-utils 10.2.44 → 10.3.3

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 (182) hide show
  1. package/README.md +27 -27
  2. package/bundles/stemy-ngx-utils.umd.js +5654 -5640
  3. package/bundles/stemy-ngx-utils.umd.js.map +1 -1
  4. package/bundles/stemy-ngx-utils.umd.min.js +1 -1
  5. package/bundles/stemy-ngx-utils.umd.min.js.map +1 -1
  6. package/esm2015/ngx-utils/common-types.js +111 -111
  7. package/esm2015/ngx-utils/components/dynamic-table/dynamic-table.component.js +139 -139
  8. package/esm2015/ngx-utils/components/pagination-menu/pagination-menu.component.js +96 -96
  9. package/esm2015/ngx-utils/components/unordered-list/unordered-list.component.js +51 -51
  10. package/esm2015/ngx-utils/directives/async-method.directive.js +58 -58
  11. package/esm2015/ngx-utils/directives/background.directive.js +51 -51
  12. package/esm2015/ngx-utils/directives/dynamic-table-template.directive.js +19 -19
  13. package/esm2015/ngx-utils/directives/global-template.directive.js +27 -27
  14. package/esm2015/ngx-utils/directives/icon.directive.js +59 -59
  15. package/esm2015/ngx-utils/directives/ngx-template-outlet.directive.js +88 -88
  16. package/esm2015/ngx-utils/directives/pagination-item.directive.js +33 -33
  17. package/esm2015/ngx-utils/directives/pagination.directive.js +76 -71
  18. package/esm2015/ngx-utils/directives/resource-if.directive.js +51 -51
  19. package/esm2015/ngx-utils/directives/sticky-class.directive.js +35 -35
  20. package/esm2015/ngx-utils/directives/sticky.directive.js +48 -48
  21. package/esm2015/ngx-utils/directives/unordered-list-item.directive.js +70 -70
  22. package/esm2015/ngx-utils/directives/unordered-list-template.directive.js +26 -26
  23. package/esm2015/ngx-utils/ngx-utils.module.js +232 -232
  24. package/esm2015/ngx-utils/pipes/chunk.pipe.js +21 -21
  25. package/esm2015/ngx-utils/pipes/entries.pipe.js +24 -24
  26. package/esm2015/ngx-utils/pipes/extra-item-properties.pipe.js +27 -27
  27. package/esm2015/ngx-utils/pipes/filter.pipe.js +38 -38
  28. package/esm2015/ngx-utils/pipes/find.pipe.js +25 -25
  29. package/esm2015/ngx-utils/pipes/format-number.pipe.js +19 -19
  30. package/esm2015/ngx-utils/pipes/get-offset.pipe.js +13 -13
  31. package/esm2015/ngx-utils/pipes/get-type.pipe.js +12 -12
  32. package/esm2015/ngx-utils/pipes/global-template.pipe.js +35 -35
  33. package/esm2015/ngx-utils/pipes/group-by.pipe.js +23 -23
  34. package/esm2015/ngx-utils/pipes/is-type.pipe.js +12 -12
  35. package/esm2015/ngx-utils/pipes/join.pipe.js +15 -15
  36. package/esm2015/ngx-utils/pipes/keys.pipe.js +18 -18
  37. package/esm2015/ngx-utils/pipes/map.pipe.js +25 -25
  38. package/esm2015/ngx-utils/pipes/max.pipe.js +22 -22
  39. package/esm2015/ngx-utils/pipes/min.pipe.js +22 -22
  40. package/esm2015/ngx-utils/pipes/reduce.pipe.js +26 -26
  41. package/esm2015/ngx-utils/pipes/remap.pipe.js +28 -28
  42. package/esm2015/ngx-utils/pipes/replace.pipe.js +12 -12
  43. package/esm2015/ngx-utils/pipes/reverse.pipe.js +20 -20
  44. package/esm2015/ngx-utils/pipes/round.pipe.js +19 -19
  45. package/esm2015/ngx-utils/pipes/safe-html.pipe.js +32 -32
  46. package/esm2015/ngx-utils/pipes/translate.pipe.js +81 -81
  47. package/esm2015/ngx-utils/pipes/values.pipe.js +18 -18
  48. package/esm2015/ngx-utils/plugins/resize-event.plugin.js +59 -59
  49. package/esm2015/ngx-utils/plugins/scroll-event.plugin.js +52 -52
  50. package/esm2015/ngx-utils/services/acl.service.js +78 -78
  51. package/esm2015/ngx-utils/services/api.service.js +35 -35
  52. package/esm2015/ngx-utils/services/auth.service.js +14 -14
  53. package/esm2015/ngx-utils/services/base-http.client.js +46 -46
  54. package/esm2015/ngx-utils/services/base-http.service.js +274 -274
  55. package/esm2015/ngx-utils/services/config.service.js +95 -95
  56. package/esm2015/ngx-utils/services/error-handler.service.js +49 -49
  57. package/esm2015/ngx-utils/services/events.service.js +24 -24
  58. package/esm2015/ngx-utils/services/formatter.service.js +44 -44
  59. package/esm2015/ngx-utils/services/global-template.service.js +35 -35
  60. package/esm2015/ngx-utils/services/icon.service.js +24 -24
  61. package/esm2015/ngx-utils/services/language.service.js +117 -117
  62. package/esm2015/ngx-utils/services/open-api.service.js +41 -41
  63. package/esm2015/ngx-utils/services/promise.service.js +49 -49
  64. package/esm2015/ngx-utils/services/state.service.js +143 -143
  65. package/esm2015/ngx-utils/services/static-language.service.js +144 -144
  66. package/esm2015/ngx-utils/services/storage.service.js +48 -48
  67. package/esm2015/ngx-utils/services/toaster.service.js +29 -29
  68. package/esm2015/ngx-utils/services/translated-url.serializer.js +70 -70
  69. package/esm2015/ngx-utils/services/universal.service.js +73 -73
  70. package/esm2015/ngx-utils/utils/ajax-request-handler.js +40 -40
  71. package/esm2015/ngx-utils/utils/array.utils.js +100 -90
  72. package/esm2015/ngx-utils/utils/auth.guard.js +153 -153
  73. package/esm2015/ngx-utils/utils/canvas.utils.js +388 -388
  74. package/esm2015/ngx-utils/utils/date.utils.js +28 -28
  75. package/esm2015/ngx-utils/utils/file.utils.js +90 -90
  76. package/esm2015/ngx-utils/utils/generic-value.js +20 -20
  77. package/esm2015/ngx-utils/utils/geometry.js +132 -132
  78. package/esm2015/ngx-utils/utils/initializer.js +17 -17
  79. package/esm2015/ngx-utils/utils/loader.utils.js +55 -55
  80. package/esm2015/ngx-utils/utils/math.utils.js +15 -15
  81. package/esm2015/ngx-utils/utils/object.utils.js +248 -248
  82. package/esm2015/ngx-utils/utils/observable.utils.js +63 -63
  83. package/esm2015/ngx-utils/utils/reflect.utils.js +33 -33
  84. package/esm2015/ngx-utils/utils/set.utils.js +20 -20
  85. package/esm2015/ngx-utils/utils/string.utils.js +28 -28
  86. package/esm2015/ngx-utils/utils/timer.utils.js +52 -52
  87. package/esm2015/ngx-utils/utils/unique.utils.js +24 -24
  88. package/esm2015/ngx-utils/utils/vector.js +77 -77
  89. package/esm2015/public_api.js +83 -83
  90. package/esm2015/stemy-ngx-utils.js +7 -7
  91. package/fesm2015/stemy-ngx-utils.js +4552 -4537
  92. package/fesm2015/stemy-ngx-utils.js.map +1 -1
  93. package/ngx-utils/common-types.d.ts +284 -284
  94. package/ngx-utils/components/dynamic-table/dynamic-table.component.d.ts +43 -43
  95. package/ngx-utils/components/pagination-menu/pagination-menu.component.d.ts +28 -28
  96. package/ngx-utils/components/unordered-list/unordered-list.component.d.ts +22 -22
  97. package/ngx-utils/directives/async-method.directive.d.ts +16 -16
  98. package/ngx-utils/directives/background.directive.d.ts +14 -14
  99. package/ngx-utils/directives/dynamic-table-template.directive.d.ts +8 -8
  100. package/ngx-utils/directives/global-template.directive.d.ts +10 -10
  101. package/ngx-utils/directives/icon.directive.d.ts +20 -20
  102. package/ngx-utils/directives/ngx-template-outlet.directive.d.ts +14 -14
  103. package/ngx-utils/directives/pagination-item.directive.d.ts +12 -12
  104. package/ngx-utils/directives/pagination.directive.d.ts +22 -21
  105. package/ngx-utils/directives/resource-if.directive.d.ts +16 -16
  106. package/ngx-utils/directives/sticky-class.directive.d.ts +12 -12
  107. package/ngx-utils/directives/sticky.directive.d.ts +16 -16
  108. package/ngx-utils/directives/unordered-list-item.directive.d.ts +25 -25
  109. package/ngx-utils/directives/unordered-list-template.directive.d.ts +10 -10
  110. package/ngx-utils/ngx-utils.module.d.ts +76 -76
  111. package/ngx-utils/pipes/chunk.pipe.d.ts +4 -4
  112. package/ngx-utils/pipes/entries.pipe.d.ts +9 -9
  113. package/ngx-utils/pipes/extra-item-properties.pipe.d.ts +5 -5
  114. package/ngx-utils/pipes/filter.pipe.d.ts +5 -5
  115. package/ngx-utils/pipes/find.pipe.d.ts +5 -5
  116. package/ngx-utils/pipes/format-number.pipe.d.ts +7 -7
  117. package/ngx-utils/pipes/get-offset.pipe.d.ts +4 -4
  118. package/ngx-utils/pipes/get-type.pipe.d.ts +4 -4
  119. package/ngx-utils/pipes/global-template.pipe.d.ts +13 -13
  120. package/ngx-utils/pipes/group-by.pipe.d.ts +5 -5
  121. package/ngx-utils/pipes/is-type.pipe.d.ts +4 -4
  122. package/ngx-utils/pipes/join.pipe.d.ts +4 -4
  123. package/ngx-utils/pipes/keys.pipe.d.ts +4 -4
  124. package/ngx-utils/pipes/map.pipe.d.ts +5 -5
  125. package/ngx-utils/pipes/max.pipe.d.ts +4 -4
  126. package/ngx-utils/pipes/min.pipe.d.ts +4 -4
  127. package/ngx-utils/pipes/reduce.pipe.d.ts +5 -5
  128. package/ngx-utils/pipes/remap.pipe.d.ts +4 -4
  129. package/ngx-utils/pipes/replace.pipe.d.ts +4 -4
  130. package/ngx-utils/pipes/reverse.pipe.d.ts +4 -4
  131. package/ngx-utils/pipes/round.pipe.d.ts +7 -7
  132. package/ngx-utils/pipes/safe-html.pipe.d.ts +7 -7
  133. package/ngx-utils/pipes/translate.pipe.d.ts +15 -15
  134. package/ngx-utils/pipes/values.pipe.d.ts +4 -4
  135. package/ngx-utils/plugins/resize-event.plugin.d.ts +10 -10
  136. package/ngx-utils/plugins/scroll-event.plugin.d.ts +11 -11
  137. package/ngx-utils/services/acl.service.d.ts +12 -12
  138. package/ngx-utils/services/api.service.d.ts +14 -14
  139. package/ngx-utils/services/auth.service.d.ts +8 -8
  140. package/ngx-utils/services/base-http.client.d.ts +12 -12
  141. package/ngx-utils/services/base-http.service.d.ts +42 -42
  142. package/ngx-utils/services/config.service.d.ts +21 -21
  143. package/ngx-utils/services/error-handler.service.d.ts +10 -10
  144. package/ngx-utils/services/events.service.d.ts +11 -11
  145. package/ngx-utils/services/formatter.service.d.ts +12 -12
  146. package/ngx-utils/services/global-template.service.d.ts +16 -16
  147. package/ngx-utils/services/icon.service.d.ts +10 -10
  148. package/ngx-utils/services/language.service.d.ts +18 -18
  149. package/ngx-utils/services/open-api.service.d.ts +8 -8
  150. package/ngx-utils/services/promise.service.d.ts +15 -15
  151. package/ngx-utils/services/state.service.d.ts +41 -41
  152. package/ngx-utils/services/static-language.service.d.ts +41 -41
  153. package/ngx-utils/services/storage.service.d.ts +12 -12
  154. package/ngx-utils/services/toaster.service.d.ts +10 -10
  155. package/ngx-utils/services/translated-url.serializer.d.ts +16 -16
  156. package/ngx-utils/services/universal.service.d.ts +24 -24
  157. package/ngx-utils/utils/ajax-request-handler.d.ts +11 -11
  158. package/ngx-utils/utils/array.utils.d.ts +10 -9
  159. package/ngx-utils/utils/auth.guard.d.ts +26 -26
  160. package/ngx-utils/utils/canvas.utils.d.ts +13 -13
  161. package/ngx-utils/utils/date.utils.d.ts +8 -8
  162. package/ngx-utils/utils/file.utils.d.ts +14 -14
  163. package/ngx-utils/utils/generic-value.d.ts +8 -8
  164. package/ngx-utils/utils/geometry.d.ts +50 -50
  165. package/ngx-utils/utils/initializer.d.ts +11 -11
  166. package/ngx-utils/utils/loader.utils.d.ts +7 -7
  167. package/ngx-utils/utils/math.utils.d.ts +5 -5
  168. package/ngx-utils/utils/object.utils.d.ts +31 -31
  169. package/ngx-utils/utils/observable.utils.d.ts +12 -12
  170. package/ngx-utils/utils/reflect.utils.d.ts +9 -9
  171. package/ngx-utils/utils/set.utils.d.ts +4 -4
  172. package/ngx-utils/utils/string.utils.d.ts +7 -7
  173. package/ngx-utils/utils/timer.utils.d.ts +6 -6
  174. package/ngx-utils/utils/unique.utils.d.ts +5 -5
  175. package/ngx-utils/utils/vector.d.ts +23 -23
  176. package/package.json +1 -1
  177. package/public_api.d.ts +82 -82
  178. package/stemy-ngx-utils.d.ts +6 -6
  179. package/stemy-ngx-utils.metadata.json +1 -1
  180. package/tools/circular.js +116 -116
  181. package/tools/config.js +78 -78
  182. package/tools/icons.js +13 -13
@@ -1,274 +1,274 @@
1
- import { __awaiter } from "tslib";
2
- import { Inject, Injectable, Optional } from "@angular/core";
3
- import { HttpEventType, HttpResponse } from "@angular/common/http";
4
- import { CONFIG_SERVICE, EXPRESS_REQUEST, HttpPromise, LANGUAGE_SERVICE, TOASTER_SERVICE } from "../common-types";
5
- import { ObjectUtils } from "../utils/object.utils";
6
- import { MathUtils } from "../utils/math.utils";
7
- import { BaseHttpClient } from "./base-http.client";
8
- import { StorageService } from "./storage.service";
9
- import { timeout } from "rxjs/operators";
10
- import { TimeoutError } from "rxjs";
11
- export class BaseHttpService {
12
- constructor(client, storage, language, toaster, configs, request = null) {
13
- this.client = client;
14
- this.storage = storage;
15
- this.language = language;
16
- this.toaster = toaster;
17
- this.configs = configs;
18
- this.request = request;
19
- this.cache = {};
20
- }
21
- get name() {
22
- return "base";
23
- }
24
- get withCredentials() {
25
- return true;
26
- }
27
- static retryFailedRequests() {
28
- BaseHttpService.failedRequests.forEach(r => r());
29
- BaseHttpService.failedRequests = [];
30
- }
31
- get universal() {
32
- return this.storage.universal;
33
- }
34
- url(url) {
35
- return url;
36
- }
37
- createUrl(url, params) {
38
- const httpParams = this.client.makeParams(params);
39
- const query = httpParams.keys().map(key => {
40
- return `${key}=${httpParams.get(key)}`;
41
- }).join("&");
42
- return `${this.url(url)}?${query}`;
43
- }
44
- makeListParams(page, itemsPerPage, orderBy = null, orderDescending = null, filter = null) {
45
- const params = {
46
- page: (page - 1),
47
- limit: itemsPerPage
48
- };
49
- if (!ObjectUtils.isNullOrUndefined(orderBy) && !ObjectUtils.isNullOrUndefined(orderDescending)) {
50
- params.sort = `${orderDescending ? "-" : ""}${orderBy}`;
51
- }
52
- if (!ObjectUtils.isNullOrUndefined(filter)) {
53
- params.filter = filter;
54
- }
55
- return params;
56
- }
57
- getPromise(url, options) {
58
- options = this.makeOptions(options, "GET");
59
- return this.toPromise(url, options);
60
- }
61
- deletePromise(url, options) {
62
- options = this.makeOptions(options, "DELETE");
63
- return this.toPromise(url, options);
64
- }
65
- postPromise(url, body, options) {
66
- options = this.makeOptions(options, "POST", body);
67
- return this.toPromise(url, options);
68
- }
69
- putPromise(url, body, options) {
70
- options = this.makeOptions(options, "PUT", body);
71
- return this.toPromise(url, options);
72
- }
73
- patchPromise(url, body, options) {
74
- options = this.makeOptions(options, "PATCH", body);
75
- return this.toPromise(url, options);
76
- }
77
- uploadPromise(url, body, listener, options) {
78
- const headers = {};
79
- if (body instanceof Blob) {
80
- headers["Content-Type"] = "application/octet-stream";
81
- }
82
- options = this.makeOptions(Object.assign({
83
- headers: headers,
84
- reportProgress: true
85
- }, options), "POST", body);
86
- return this.toPromise(url, options, listener);
87
- }
88
- listPromise(url, params) {
89
- return new Promise(resolve => {
90
- this.getPromise(url, { params: params }).then(data => {
91
- var _a, _b;
92
- if (ObjectUtils.isArray(data)) {
93
- resolve({
94
- total: data.length,
95
- items: data,
96
- meta: {}
97
- });
98
- return;
99
- }
100
- resolve({
101
- total: ((_a = data.meta) === null || _a === void 0 ? void 0 : _a.total) || (data === null || data === void 0 ? void 0 : data.total) || ((_b = data.items) === null || _b === void 0 ? void 0 : _b.length) || 0,
102
- items: data.items || [],
103
- meta: data.meta || {}
104
- });
105
- }, response => {
106
- if (response.status == 0 || response.status == 301) {
107
- resolve({
108
- total: 1,
109
- items: [{
110
- id: null,
111
- label: "Not implemented."
112
- }],
113
- meta: {}
114
- });
115
- return true;
116
- }
117
- resolve({
118
- total: 0,
119
- items: [],
120
- meta: {}
121
- });
122
- return false;
123
- });
124
- });
125
- }
126
- handleUnauthorizedError(absoluteUrl, options, reject) {
127
- reject();
128
- if (BaseHttpService.failedRequests.length > 1) {
129
- return;
130
- }
131
- if (this.universal.isServer)
132
- return;
133
- console.log("User auth error", absoluteUrl, options);
134
- }
135
- toastWarning(message, issueContext, reason, options) {
136
- this.toaster.warning(message, { issueContext, reason, options });
137
- }
138
- toastError(message, issueContext, reason, options) {
139
- this.toaster.warning(message, { issueContext, reason, options });
140
- }
141
- toPromise(url, options, listener) {
142
- const issueContext = { url: "" };
143
- return new HttpPromise(response => {
144
- if (!response) {
145
- if (this.universal.isServer)
146
- return;
147
- console.log("You may not need a reject Handler for this request!", this.name, url, options);
148
- return;
149
- }
150
- const reason = response.error || {};
151
- if (response.status == 0 || response.status == 301) {
152
- this.toastWarning(`${url} endpoint is not implemented! Click here, to quickly create an issue.`, issueContext, reason, options);
153
- return;
154
- }
155
- const regex = /((E11000 duplicate key error collection: (.)+\.)|(_1 dup key:(.)+))/g;
156
- if (reason.message && regex.test(reason.message)) {
157
- this.toastError("message.duplicate-key.error." + reason.message.replace(regex, "").replace(" index: ", "-"), issueContext, reason, options);
158
- return;
159
- }
160
- this.toastWarning(`${url} endpoint error is not handled properly! Click here, to quickly create an issue.`, issueContext, reason, options);
161
- }, (resolve, reject) => {
162
- this.absoluteUrl(url, options).then(absoluteUrl => {
163
- issueContext.url = absoluteUrl;
164
- const request = this.client.request(options.method, absoluteUrl, options);
165
- const finalRequest = ObjectUtils.isNumber(options.timeout) && options.timeout > 0
166
- ? request.pipe(timeout(options.timeout)) : request;
167
- finalRequest.subscribe((event) => {
168
- if (options.reportProgress && event.type === HttpEventType.UploadProgress) {
169
- const progress = {
170
- percentage: MathUtils.round(event.loaded / event.total, 2, 0.01),
171
- loaded: event.loaded,
172
- total: event.total
173
- };
174
- if (listener) {
175
- listener(progress);
176
- }
177
- return;
178
- }
179
- const response = event instanceof HttpResponse ? event.body : event;
180
- resolve(this.parseResponse(response, url, options));
181
- const headers = options.headers;
182
- const authKey = "Authorization";
183
- // If we use token auth
184
- if (this.client.renewTokenFunc && headers.has(authKey)) {
185
- const currentTime = new Date().getTime();
186
- const userTokenTime = this.storage.get("userTokenTime") || currentTime;
187
- // And the last request was a long long time ago
188
- if (currentTime - 600000 > userTokenTime) {
189
- this.client.renewTokenFunc();
190
- }
191
- }
192
- }, (response) => {
193
- if (response instanceof TimeoutError || response.status == 0 || response.status == 301) {
194
- reject(response);
195
- return;
196
- }
197
- const headers = options.headers;
198
- const authKey = "Authorization";
199
- // If an authorization header exists and we still have an Unauthorized response prompt the user to log in again
200
- if (headers.has(authKey) && response.status == 401) {
201
- BaseHttpService.failedRequests.push(() => {
202
- options.headers = this.makeHeaders(options.originalHeaders);
203
- this.toPromise(url, options, listener).then(resolve, reject);
204
- });
205
- this.handleUnauthorizedError(absoluteUrl, options, () => reject(response));
206
- return;
207
- }
208
- reject(response);
209
- });
210
- });
211
- });
212
- }
213
- checkHeaders(headers) {
214
- if (!headers || !headers.cookie || !headers.referer || !headers.host) {
215
- return false;
216
- }
217
- return headers.referer.indexOf(headers.host) >= 0;
218
- }
219
- makeOptions(options, method = "GET", body = {}) {
220
- // Set base options
221
- options = options ? Object.assign({}, options) : {};
222
- options.params = this.client.makeParams(options.params);
223
- options.observe = "body";
224
- options.originalHeaders = options.originalHeaders || options.headers || {};
225
- options.method = method;
226
- options.withCredentials = ObjectUtils.isBoolean(options.withCredentials) ? options.withCredentials : this.withCredentials;
227
- options.body = body || {};
228
- // Set cookies from server side request
229
- const headers = !this.request ? null : this.request.headers;
230
- if (this.checkHeaders(headers)) {
231
- options.headers["Cookie"] = headers.cookie;
232
- }
233
- options.headers = this.makeHeaders(options.originalHeaders, method);
234
- return options;
235
- }
236
- makeHeaders(headers, method = "GET") {
237
- return this.client.makeHeaders(headers);
238
- }
239
- parseResponse(response, url, options) {
240
- return response;
241
- }
242
- parseUrl(url) {
243
- return this.url(url).replace(/(?:((?!:).\/)\/)/g, "$1");
244
- }
245
- absoluteUrl(url, options) {
246
- return __awaiter(this, void 0, void 0, function* () {
247
- const absoluteUrl = this.parseUrl(url);
248
- if (url == "api-docs") {
249
- return absoluteUrl.replace("/api", "");
250
- }
251
- return absoluteUrl;
252
- });
253
- }
254
- expressRequestUrl(url) {
255
- const req = this.request;
256
- if (!req || !url || url.startsWith("http") || url.startsWith("//"))
257
- return url;
258
- const separator = url.startsWith("/") ? "" : "/";
259
- return `${req.protocol}://${req.get("host")}${separator}${url}`;
260
- }
261
- }
262
- BaseHttpService.failedRequests = [];
263
- BaseHttpService.decorators = [
264
- { type: Injectable }
265
- ];
266
- BaseHttpService.ctorParameters = () => [
267
- { type: BaseHttpClient, decorators: [{ type: Inject, args: [BaseHttpClient,] }] },
268
- { type: StorageService, decorators: [{ type: Inject, args: [StorageService,] }] },
269
- { type: undefined, decorators: [{ type: Inject, args: [LANGUAGE_SERVICE,] }] },
270
- { type: undefined, decorators: [{ type: Inject, args: [TOASTER_SERVICE,] }] },
271
- { type: undefined, decorators: [{ type: Inject, args: [CONFIG_SERVICE,] }] },
272
- { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [EXPRESS_REQUEST,] }] }
273
- ];
274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1odHRwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvc3RlbXkvV29yay9uZ3gtdXRpbHMvc3JjLyIsInNvdXJjZXMiOlsibmd4LXV0aWxzL3NlcnZpY2VzL2Jhc2UtaHR0cC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFvQixhQUFhLEVBQWUsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHakcsT0FBTyxFQUNILGNBQWMsRUFDZCxlQUFlLEVBQ2YsV0FBVyxFQVVYLGdCQUFnQixFQUVoQixlQUFlLEVBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2xDLE1BQU0sT0FBTyxlQUFlO0lBdUJ4QixZQUE2QyxNQUFzQixFQUN0QixPQUF1QixFQUNyQixRQUEwQixFQUMzQixPQUF3QixFQUN6QixPQUF1QixFQUNWLFVBQW1CLElBQUk7UUFMcEMsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDekIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDVixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUU3RSxJQUFJ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LE9BQU8sR0FBRyxDQUFDO1FBQy9FLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2pELE9BQU8sR0FBRyxHQUFHLENBQUMsUUFBUSxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ3BFLENBQUM7O0FBaFJnQiw4QkFBYyxHQUFzQixFQUFFLENBQUM7O1lBSDNELFVBQVU7OztZQU5ILGNBQWMsdUJBOEJMLE1BQU0sU0FBQyxjQUFjO1lBNUI5QixjQUFjLHVCQTZCTCxNQUFNLFNBQUMsY0FBYzs0Q0FDckIsTUFBTSxTQUFDLGdCQUFnQjs0Q0FDdkIsTUFBTSxTQUFDLGVBQWU7NENBQ3RCLE1BQU0sU0FBQyxjQUFjOzRDQUNyQixRQUFRLFlBQUksTUFBTSxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnRUeXBlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHtcbiAgICBDT05GSUdfU0VSVklDRSxcbiAgICBFWFBSRVNTX1JFUVVFU1QsXG4gICAgSHR0cFByb21pc2UsXG4gICAgSUNvbmZpZ1NlcnZpY2UsXG4gICAgSUh0dHBIZWFkZXJzLFxuICAgIElIdHRwUGFyYW1zLFxuICAgIElIdHRwU2VydmljZSxcbiAgICBJSXNzdWVDb250ZXh0LFxuICAgIElMYW5ndWFnZVNlcnZpY2UsXG4gICAgSVBhZ2luYXRpb25EYXRhLFxuICAgIElSZXF1ZXN0T3B0aW9ucyxcbiAgICBJVG9hc3RlclNlcnZpY2UsXG4gICAgTEFOR1VBR0VfU0VSVklDRSxcbiAgICBQcm9ncmVzc0xpc3RlbmVyLFxuICAgIFRPQVNURVJfU0VSVklDRVxufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XG5cbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuLi91dGlscy9vYmplY3QudXRpbHNcIjtcbmltcG9ydCB7TWF0aFV0aWxzfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC51dGlsc1wiO1xuXG5pbXBvcnQge0Jhc2VIdHRwQ2xpZW50fSBmcm9tIFwiLi9iYXNlLWh0dHAuY2xpZW50XCI7XG5pbXBvcnQge1VuaXZlcnNhbFNlcnZpY2V9IGZyb20gXCIuL3VuaXZlcnNhbC5zZXJ2aWNlXCI7XG5pbXBvcnQge1N0b3JhZ2VTZXJ2aWNlfSBmcm9tIFwiLi9zdG9yYWdlLnNlcnZpY2VcIjtcbmltcG9ydCB7dGltZW91dH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQge1RpbWVvdXRFcnJvcn0gZnJvbSBcInJ4anNcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJhc2VIdHRwU2VydmljZSBpbXBsZW1lbnRzIElIdHRwU2VydmljZSB7XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIGZhaWxlZFJlcXVlc3RzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gICAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiYmFzZVwiO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgd2l0aENyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjYWNoZTogYW55O1xuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZXRyeUZhaWxlZFJlcXVlc3RzKCk6IHZvaWQge1xuICAgICAgICBCYXNlSHR0cFNlcnZpY2UuZmFpbGVkUmVxdWVzdHMuZm9yRWFjaChyID0+IHIoKSk7XG4gICAgICAgIEJhc2VIdHRwU2VydmljZS5mYWlsZWRSZXF1ZXN0cyA9IFtdO1xuICAgIH1cblxuICAgIGdldCB1bml2ZXJzYWwoKTogVW5pdmVyc2FsU2VydmljZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UudW5pdmVyc2FsO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQmFzZUh0dHBDbGllbnQpIHJlYWRvbmx5IGNsaWVudDogQmFzZUh0dHBDbGllbnQsXG4gICAgICAgICAgICAgICAgQEluamVjdChTdG9yYWdlU2VydmljZSkgcmVhZG9ubHkgc3RvcmFnZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQEluamVjdChMQU5HVUFHRV9TRVJWSUNFKSByZWFkb25seSBsYW5ndWFnZTogSUxhbmd1YWdlU2VydmljZSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KFRPQVNURVJfU0VSVklDRSkgcmVhZG9ubHkgdG9hc3RlcjogSVRvYXN0ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBJbmplY3QoQ09ORklHX1NFUlZJQ0UpIHJlYWRvbmx5IGNvbmZpZ3M6IElDb25maWdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRVhQUkVTU19SRVFVRVNUKSByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0ID0gbnVsbFxuICAgICkge1xuICAgICAgICB0aGlzLmNhY2hlID0ge307XG4gICAgfVxuXG4gICAgdXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICBjcmVhdGVVcmwodXJsOiBzdHJpbmcsIHBhcmFtczogSUh0dHBQYXJhbXMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBodHRwUGFyYW1zID0gdGhpcy5jbGllbnQubWFrZVBhcmFtcyhwYXJhbXMpO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGh0dHBQYXJhbXMua2V5cygpLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX09JHtodHRwUGFyYW1zLmdldChrZXkpfWA7XG4gICAgICAgIH0pLmpvaW4oXCImXCIpO1xuICAgICAgICByZXR1cm4gYCR7dGhpcy51cmwodXJsKX0/JHtxdWVyeX1gO1xuICAgIH1cblxuICAgIG1ha2VMaXN0UGFyYW1zKHBhZ2U6IG51bWJlciwgaXRlbXNQZXJQYWdlOiBudW1iZXIsIG9yZGVyQnk6IHN0cmluZyA9IG51bGwsIG9yZGVyRGVzY2VuZGluZzogYm9vbGVhbiA9IG51bGwsIGZpbHRlcjogc3RyaW5nID0gbnVsbCk6IElIdHRwUGFyYW1zIHtcbiAgICAgICAgY29uc3QgcGFyYW1zOiBJSHR0cFBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhZ2U6IChwYWdlIC0gMSksXG4gICAgICAgICAgICBsaW1pdDogaXRlbXNQZXJQYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghT2JqZWN0VXRpbHMuaXNOdWxsT3JVbmRlZmluZWQob3JkZXJCeSkgJiYgIU9iamVjdFV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKG9yZGVyRGVzY2VuZGluZykpIHtcbiAgICAgICAgICAgIHBhcmFtcy5zb3J0ID0gYCR7b3JkZXJEZXNjZW5kaW5nID8gXCItXCIgOiBcIlwifSR7b3JkZXJCeX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICghT2JqZWN0VXRpbHMuaXNOdWxsT3JVbmRlZmluZWQoZmlsdGVyKSkge1xuICAgICAgICAgICAgcGFyYW1zLmZpbHRlciA9IGZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRQcm9taXNlKHVybDogc3RyaW5nLCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zKTogSHR0cFByb21pc2Uge1xuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhvcHRpb25zLCBcIkdFVFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Qcm9taXNlKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlbGV0ZVByb21pc2UodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKG9wdGlvbnMsIFwiREVMRVRFXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcG9zdFByb21pc2UodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKG9wdGlvbnMsIFwiUE9TVFwiLCBib2R5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Qcm9taXNlKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHB1dFByb21pc2UodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKG9wdGlvbnMsIFwiUFVUXCIsIGJvZHkpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGF0Y2hQcm9taXNlKHVybDogc3RyaW5nLCBib2R5PzogYW55LCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zKTogSHR0cFByb21pc2Uge1xuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhvcHRpb25zLCBcIlBBVENIXCIsIGJvZHkpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBsb2FkUHJvbWlzZSh1cmw6IHN0cmluZywgYm9keTogYW55LCBsaXN0ZW5lcj86IFByb2dyZXNzTGlzdGVuZXIsIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IGFueSA9IHt9O1xuICAgICAgICBpZiAoYm9keSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiB0cnVlXG4gICAgICAgIH0sIG9wdGlvbnMpLCBcIlBPU1RcIiwgYm9keSk7XG4gICAgICAgIHJldHVybiB0aGlzLnRvUHJvbWlzZSh1cmwsIG9wdGlvbnMsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbGlzdFByb21pc2UodXJsOiBzdHJpbmcsIHBhcmFtczogSUh0dHBQYXJhbXMpOiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8SVBhZ2luYXRpb25EYXRhPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJvbWlzZSh1cmwsIHtwYXJhbXM6IHBhcmFtc30pLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGE6IHt9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICB0b3RhbDogZGF0YS5tZXRhPy50b3RhbCB8fCBkYXRhPy50b3RhbCB8fCBkYXRhLml0ZW1zPy5sZW5ndGggfHwgMCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IGRhdGEuaXRlbXMgfHwgW10sXG4gICAgICAgICAgICAgICAgICAgIG1ldGE6IGRhdGEubWV0YSB8fCB7fVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMCB8fCByZXNwb25zZS5zdGF0dXMgPT0gMzAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJOb3QgaW1wbGVtZW50ZWQuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge31cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWw6IDAsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgbWV0YToge31cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVVuYXV0aG9yaXplZEVycm9yKGFic29sdXRlVXJsOiBzdHJpbmcsIG9wdGlvbnM6IElSZXF1ZXN0T3B0aW9ucywgcmVqZWN0OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgICBpZiAoQmFzZUh0dHBTZXJ2aWNlLmZhaWxlZFJlcXVlc3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy51bml2ZXJzYWwuaXNTZXJ2ZXIpIHJldHVybjtcbiAgICAgICAgY29uc29sZS5sb2coXCJVc2VyIGF1dGggZXJyb3JcIiwgYWJzb2x1dGVVcmwsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB0b2FzdFdhcm5pbmcobWVzc2FnZTogc3RyaW5nLCBpc3N1ZUNvbnRleHQ6IElJc3N1ZUNvbnRleHQsIHJlYXNvbjogYW55LCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLndhcm5pbmcobWVzc2FnZSwge2lzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvYXN0RXJyb3IobWVzc2FnZTogc3RyaW5nLCBpc3N1ZUNvbnRleHQ6IElJc3N1ZUNvbnRleHQsIHJlYXNvbjogYW55LCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLndhcm5pbmcobWVzc2FnZSwge2lzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvUHJvbWlzZSh1cmw6IHN0cmluZywgb3B0aW9uczogSVJlcXVlc3RPcHRpb25zLCBsaXN0ZW5lcj86IFByb2dyZXNzTGlzdGVuZXIpOiBIdHRwUHJvbWlzZSB7XG4gICAgICAgIGNvbnN0IGlzc3VlQ29udGV4dDogSUlzc3VlQ29udGV4dCA9IHt1cmw6IFwiXCJ9O1xuXG4gICAgICAgIHJldHVybiBuZXcgSHR0cFByb21pc2UocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuaXZlcnNhbC5pc1NlcnZlcikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiWW91IG1heSBub3QgbmVlZCBhIHJlamVjdCBIYW5kbGVyIGZvciB0aGlzIHJlcXVlc3QhXCIsIHRoaXMubmFtZSwgdXJsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWFzb24gPSByZXNwb25zZS5lcnJvciB8fCB7fTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gMCB8fCByZXNwb25zZS5zdGF0dXMgPT0gMzAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdFdhcm5pbmcoYCR7dXJsfSBlbmRwb2ludCBpcyBub3QgaW1wbGVtZW50ZWQhIENsaWNrIGhlcmUsIHRvIHF1aWNrbHkgY3JlYXRlIGFuIGlzc3VlLmAsIGlzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWdleCA9IC8oKEUxMTAwMCBkdXBsaWNhdGUga2V5IGVycm9yIGNvbGxlY3Rpb246ICguKStcXC4pfChfMSBkdXAga2V5OiguKSspKS9nO1xuICAgICAgICAgICAgaWYgKHJlYXNvbi5tZXNzYWdlICYmIHJlZ2V4LnRlc3QocmVhc29uLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdEVycm9yKFwibWVzc2FnZS5kdXBsaWNhdGUta2V5LmVycm9yLlwiICsgcmVhc29uLm1lc3NhZ2UucmVwbGFjZShyZWdleCwgXCJcIikucmVwbGFjZShcIiBpbmRleDogXCIsIFwiLVwiKSwgaXNzdWVDb250ZXh0LCByZWFzb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudG9hc3RXYXJuaW5nKGAke3VybH0gZW5kcG9pbnQgZXJyb3IgaXMgbm90IGhhbmRsZWQgcHJvcGVybHkhIENsaWNrIGhlcmUsIHRvIHF1aWNrbHkgY3JlYXRlIGFuIGlzc3VlLmAsIGlzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zKTtcbiAgICAgICAgfSwgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hYnNvbHV0ZVVybCh1cmwsIG9wdGlvbnMpLnRoZW4oYWJzb2x1dGVVcmwgPT4ge1xuICAgICAgICAgICAgICAgIGlzc3VlQ29udGV4dC51cmwgPSBhYnNvbHV0ZVVybDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5jbGllbnQucmVxdWVzdChvcHRpb25zLm1ldGhvZCwgYWJzb2x1dGVVcmwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsUmVxdWVzdCA9IE9iamVjdFV0aWxzLmlzTnVtYmVyKG9wdGlvbnMudGltZW91dCkgJiYgb3B0aW9ucy50aW1lb3V0ID4gMFxuICAgICAgICAgICAgICAgICAgICA/IHJlcXVlc3QucGlwZSh0aW1lb3V0KG9wdGlvbnMudGltZW91dCkpIDogcmVxdWVzdDtcbiAgICAgICAgICAgICAgICBmaW5hbFJlcXVlc3Quc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJlcG9ydFByb2dyZXNzICYmIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2U6IE1hdGhVdGlscy5yb3VuZChldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCwgMiwgMC4wMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIocHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyBldmVudC5ib2R5IDogZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXJzZVJlc3BvbnNlKHJlc3BvbnNlLCB1cmwsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyBhcyBIdHRwSGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0aEtleSA9IFwiQXV0aG9yaXphdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB1c2UgdG9rZW4gYXV0aFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGllbnQucmVuZXdUb2tlbkZ1bmMgJiYgaGVhZGVycy5oYXMoYXV0aEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyVG9rZW5UaW1lID0gdGhpcy5zdG9yYWdlLmdldChcInVzZXJUb2tlblRpbWVcIikgfHwgY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgdGhlIGxhc3QgcmVxdWVzdCB3YXMgYSBsb25nIGxvbmcgdGltZSBhZ29cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSAtIDYwMDAwMCA+IHVzZXJUb2tlblRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5yZW5ld1Rva2VuRnVuYygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSB8IFRpbWVvdXRFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IgfHwgcmVzcG9uc2Uuc3RhdHVzID09IDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09IDMwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIGFzIEh0dHBIZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRoS2V5ID0gXCJBdXRob3JpemF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGF1dGhvcml6YXRpb24gaGVhZGVyIGV4aXN0cyBhbmQgd2Ugc3RpbGwgaGF2ZSBhbiBVbmF1dGhvcml6ZWQgcmVzcG9uc2UgcHJvbXB0IHRoZSB1c2VyIHRvIGxvZyBpbiBhZ2FpblxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVycy5oYXMoYXV0aEtleSkgJiYgcmVzcG9uc2Uuc3RhdHVzID09IDQwMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUh0dHBTZXJ2aWNlLmZhaWxlZFJlcXVlc3RzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHRoaXMubWFrZUhlYWRlcnMob3B0aW9ucy5vcmlnaW5hbEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9Qcm9taXNlKHVybCwgb3B0aW9ucywgbGlzdGVuZXIpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVVbmF1dGhvcml6ZWRFcnJvcihhYnNvbHV0ZVVybCwgb3B0aW9ucywgKCkgPT4gcmVqZWN0KHJlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tIZWFkZXJzKGhlYWRlcnM6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWhlYWRlcnMgfHwgIWhlYWRlcnMuY29va2llIHx8ICFoZWFkZXJzLnJlZmVyZXIgfHwgIWhlYWRlcnMuaG9zdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXJzLnJlZmVyZXIuaW5kZXhPZihoZWFkZXJzLmhvc3QpID49IDA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG1ha2VPcHRpb25zKG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMsIG1ldGhvZDogc3RyaW5nID0gXCJHRVRcIiwgYm9keTogYW55ID0ge30pOiBJUmVxdWVzdE9wdGlvbnMge1xuICAgICAgICAvLyBTZXQgYmFzZSBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8gey4uLm9wdGlvbnN9IDoge307XG4gICAgICAgIG9wdGlvbnMucGFyYW1zID0gdGhpcy5jbGllbnQubWFrZVBhcmFtcyhvcHRpb25zLnBhcmFtcyk7XG4gICAgICAgIG9wdGlvbnMub2JzZXJ2ZSA9IFwiYm9keVwiO1xuICAgICAgICBvcHRpb25zLm9yaWdpbmFsSGVhZGVycyA9IG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzIHx8IChvcHRpb25zLmhlYWRlcnMgYXMgSUh0dHBIZWFkZXJzKSB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIG9wdGlvbnMud2l0aENyZWRlbnRpYWxzID0gT2JqZWN0VXRpbHMuaXNCb29sZWFuKG9wdGlvbnMud2l0aENyZWRlbnRpYWxzKSA/IG9wdGlvbnMud2l0aENyZWRlbnRpYWxzIDogdGhpcy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IGJvZHkgfHwge307XG4gICAgICAgIC8vIFNldCBjb29raWVzIGZyb20gc2VydmVyIHNpZGUgcmVxdWVzdFxuICAgICAgICBjb25zdCBoZWFkZXJzID0gIXRoaXMucmVxdWVzdCA/IG51bGwgOiB0aGlzLnJlcXVlc3QuaGVhZGVycztcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tIZWFkZXJzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbXCJDb29raWVcIl0gPSBoZWFkZXJzLmNvb2tpZTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLm1ha2VIZWFkZXJzKG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzLCBtZXRob2QpO1xuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbWFrZUhlYWRlcnMoaGVhZGVyczogSUh0dHBIZWFkZXJzLCBtZXRob2Q6IHN0cmluZyA9IFwiR0VUXCIpOiBIdHRwSGVhZGVycyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5tYWtlSGVhZGVycyhoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VSZXNwb25zZShyZXNwb25zZTogYW55LCB1cmw6IHN0cmluZywgb3B0aW9uczogSVJlcXVlc3RPcHRpb25zKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYXJzZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnVybCh1cmwpLnJlcGxhY2UoLyg/OigoPyE6KS5cXC8pXFwvKS9nLCBcIiQxXCIpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBhYnNvbHV0ZVVybCh1cmw6IHN0cmluZywgb3B0aW9uczogSVJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSB0aGlzLnBhcnNlVXJsKHVybCk7XG4gICAgICAgIGlmICh1cmwgPT0gXCJhcGktZG9jc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVVcmwucmVwbGFjZShcIi9hcGlcIiwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFic29sdXRlVXJsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHByZXNzUmVxdWVzdFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJlcSA9IHRoaXMucmVxdWVzdDtcbiAgICAgICAgaWYgKCFyZXEgfHwgIXVybCB8fCB1cmwuc3RhcnRzV2l0aChcImh0dHBcIikgfHwgdXJsLnN0YXJ0c1dpdGgoXCIvL1wiKSkgcmV0dXJuIHVybDtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gdXJsLnN0YXJ0c1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiO1xuICAgICAgICByZXR1cm4gYCR7cmVxLnByb3RvY29sfTovLyR7cmVxLmdldChcImhvc3RcIil9JHtzZXBhcmF0b3J9JHt1cmx9YDtcbiAgICB9XG59XG4iXX0=
1
+ import { __awaiter } from "tslib";
2
+ import { Inject, Injectable, Optional } from "@angular/core";
3
+ import { HttpEventType, HttpResponse } from "@angular/common/http";
4
+ import { CONFIG_SERVICE, EXPRESS_REQUEST, HttpPromise, LANGUAGE_SERVICE, TOASTER_SERVICE } from "../common-types";
5
+ import { ObjectUtils } from "../utils/object.utils";
6
+ import { MathUtils } from "../utils/math.utils";
7
+ import { BaseHttpClient } from "./base-http.client";
8
+ import { StorageService } from "./storage.service";
9
+ import { timeout } from "rxjs/operators";
10
+ import { TimeoutError } from "rxjs";
11
+ export class BaseHttpService {
12
+ constructor(client, storage, language, toaster, configs, request = null) {
13
+ this.client = client;
14
+ this.storage = storage;
15
+ this.language = language;
16
+ this.toaster = toaster;
17
+ this.configs = configs;
18
+ this.request = request;
19
+ this.cache = {};
20
+ }
21
+ get name() {
22
+ return "base";
23
+ }
24
+ get withCredentials() {
25
+ return true;
26
+ }
27
+ static retryFailedRequests() {
28
+ BaseHttpService.failedRequests.forEach(r => r());
29
+ BaseHttpService.failedRequests = [];
30
+ }
31
+ get universal() {
32
+ return this.storage.universal;
33
+ }
34
+ url(url) {
35
+ return url;
36
+ }
37
+ createUrl(url, params) {
38
+ const httpParams = this.client.makeParams(params);
39
+ const query = httpParams.keys().map(key => {
40
+ return `${key}=${httpParams.get(key)}`;
41
+ }).join("&");
42
+ return `${this.url(url)}?${query}`;
43
+ }
44
+ makeListParams(page, itemsPerPage, orderBy = null, orderDescending = null, filter = null) {
45
+ const params = {
46
+ page: (page - 1),
47
+ limit: itemsPerPage
48
+ };
49
+ if (!ObjectUtils.isNullOrUndefined(orderBy) && !ObjectUtils.isNullOrUndefined(orderDescending)) {
50
+ params.sort = `${orderDescending ? "-" : ""}${orderBy}`;
51
+ }
52
+ if (!ObjectUtils.isNullOrUndefined(filter)) {
53
+ params.filter = filter;
54
+ }
55
+ return params;
56
+ }
57
+ getPromise(url, options, body) {
58
+ options = this.makeOptions(options, "GET", body);
59
+ return this.toPromise(url, options);
60
+ }
61
+ deletePromise(url, options, body) {
62
+ options = this.makeOptions(options, "DELETE", body);
63
+ return this.toPromise(url, options);
64
+ }
65
+ postPromise(url, body, options) {
66
+ options = this.makeOptions(options, "POST", body);
67
+ return this.toPromise(url, options);
68
+ }
69
+ putPromise(url, body, options) {
70
+ options = this.makeOptions(options, "PUT", body);
71
+ return this.toPromise(url, options);
72
+ }
73
+ patchPromise(url, body, options) {
74
+ options = this.makeOptions(options, "PATCH", body);
75
+ return this.toPromise(url, options);
76
+ }
77
+ uploadPromise(url, body, listener, options) {
78
+ const headers = {};
79
+ if (body instanceof Blob) {
80
+ headers["Content-Type"] = "application/octet-stream";
81
+ }
82
+ options = this.makeOptions(Object.assign({
83
+ headers: headers,
84
+ reportProgress: true
85
+ }, options), "POST", body);
86
+ return this.toPromise(url, options, listener);
87
+ }
88
+ listPromise(url, params) {
89
+ return new Promise(resolve => {
90
+ this.getPromise(url, { params: params }).then(data => {
91
+ var _a, _b;
92
+ if (ObjectUtils.isArray(data)) {
93
+ resolve({
94
+ total: data.length,
95
+ items: data,
96
+ meta: {}
97
+ });
98
+ return;
99
+ }
100
+ resolve({
101
+ total: ((_a = data.meta) === null || _a === void 0 ? void 0 : _a.total) || (data === null || data === void 0 ? void 0 : data.total) || ((_b = data.items) === null || _b === void 0 ? void 0 : _b.length) || 0,
102
+ items: data.items || [],
103
+ meta: data.meta || {}
104
+ });
105
+ }, response => {
106
+ if (response.status == 0 || response.status == 301) {
107
+ resolve({
108
+ total: 1,
109
+ items: [{
110
+ id: null,
111
+ label: "Not implemented."
112
+ }],
113
+ meta: {}
114
+ });
115
+ return true;
116
+ }
117
+ resolve({
118
+ total: 0,
119
+ items: [],
120
+ meta: {}
121
+ });
122
+ return false;
123
+ });
124
+ });
125
+ }
126
+ handleUnauthorizedError(absoluteUrl, options, reject) {
127
+ reject();
128
+ if (BaseHttpService.failedRequests.length > 1) {
129
+ return;
130
+ }
131
+ if (this.universal.isServer)
132
+ return;
133
+ console.log("User auth error", absoluteUrl, options);
134
+ }
135
+ toastWarning(message, issueContext, reason, options) {
136
+ this.toaster.warning(message, { issueContext, reason, options });
137
+ }
138
+ toastError(message, issueContext, reason, options) {
139
+ this.toaster.warning(message, { issueContext, reason, options });
140
+ }
141
+ toPromise(url, options, listener) {
142
+ const issueContext = { url: "" };
143
+ return new HttpPromise(response => {
144
+ if (!response) {
145
+ if (this.universal.isServer)
146
+ return;
147
+ console.log("You may not need a reject Handler for this request!", this.name, url, options);
148
+ return;
149
+ }
150
+ const reason = response.error || {};
151
+ if (response.status == 0 || response.status == 301) {
152
+ this.toastWarning(`${url} endpoint is not implemented! Click here, to quickly create an issue.`, issueContext, reason, options);
153
+ return;
154
+ }
155
+ const regex = /((E11000 duplicate key error collection: (.)+\.)|(_1 dup key:(.)+))/g;
156
+ if (reason.message && regex.test(reason.message)) {
157
+ this.toastError("message.duplicate-key.error." + reason.message.replace(regex, "").replace(" index: ", "-"), issueContext, reason, options);
158
+ return;
159
+ }
160
+ this.toastWarning(`${url} endpoint error is not handled properly! Click here, to quickly create an issue.`, issueContext, reason, options);
161
+ }, (resolve, reject) => {
162
+ this.absoluteUrl(url, options).then(absoluteUrl => {
163
+ issueContext.url = absoluteUrl;
164
+ const request = this.client.request(options.method, absoluteUrl, options);
165
+ const finalRequest = ObjectUtils.isNumber(options.timeout) && options.timeout > 0
166
+ ? request.pipe(timeout(options.timeout)) : request;
167
+ finalRequest.subscribe((event) => {
168
+ if (options.reportProgress && event.type === HttpEventType.UploadProgress) {
169
+ const progress = {
170
+ percentage: MathUtils.round(event.loaded / event.total, 2, 0.01),
171
+ loaded: event.loaded,
172
+ total: event.total
173
+ };
174
+ if (listener) {
175
+ listener(progress);
176
+ }
177
+ return;
178
+ }
179
+ const response = event instanceof HttpResponse ? event.body : event;
180
+ resolve(this.parseResponse(response, url, options));
181
+ const headers = options.headers;
182
+ const authKey = "Authorization";
183
+ // If we use token auth
184
+ if (this.client.renewTokenFunc && headers.has(authKey)) {
185
+ const currentTime = new Date().getTime();
186
+ const userTokenTime = this.storage.get("userTokenTime") || currentTime;
187
+ // And the last request was a long long time ago
188
+ if (currentTime - 600000 > userTokenTime) {
189
+ this.client.renewTokenFunc();
190
+ }
191
+ }
192
+ }, (response) => {
193
+ if (response instanceof TimeoutError || response.status == 0 || response.status == 301) {
194
+ reject(response);
195
+ return;
196
+ }
197
+ const headers = options.headers;
198
+ const authKey = "Authorization";
199
+ // If an authorization header exists and we still have an Unauthorized response prompt the user to log in again
200
+ if (headers.has(authKey) && response.status == 401) {
201
+ BaseHttpService.failedRequests.push(() => {
202
+ options.headers = this.makeHeaders(options.originalHeaders);
203
+ this.toPromise(url, options, listener).then(resolve, reject);
204
+ });
205
+ this.handleUnauthorizedError(absoluteUrl, options, () => reject(response));
206
+ return;
207
+ }
208
+ reject(response);
209
+ });
210
+ });
211
+ });
212
+ }
213
+ checkHeaders(headers) {
214
+ if (!headers || !headers.cookie || !headers.referer || !headers.host) {
215
+ return false;
216
+ }
217
+ return headers.referer.indexOf(headers.host) >= 0;
218
+ }
219
+ makeOptions(options, method = "GET", body) {
220
+ // Set base options
221
+ options = options ? Object.assign({}, options) : {};
222
+ options.params = this.client.makeParams(options.params);
223
+ options.observe = "body";
224
+ options.originalHeaders = options.originalHeaders || options.headers || {};
225
+ options.method = method;
226
+ options.withCredentials = ObjectUtils.isBoolean(options.withCredentials) ? options.withCredentials : this.withCredentials;
227
+ options.body = body || {};
228
+ // Set cookies from server side request
229
+ const headers = !this.request ? null : this.request.headers;
230
+ if (this.checkHeaders(headers)) {
231
+ options.headers["Cookie"] = headers.cookie;
232
+ }
233
+ options.headers = this.makeHeaders(options.originalHeaders, method);
234
+ return options;
235
+ }
236
+ makeHeaders(headers, method = "GET") {
237
+ return this.client.makeHeaders(headers);
238
+ }
239
+ parseResponse(response, url, options) {
240
+ return response;
241
+ }
242
+ parseUrl(url) {
243
+ return this.url(url).replace(/(?:((?!:).\/)\/)/g, "$1");
244
+ }
245
+ absoluteUrl(url, options) {
246
+ return __awaiter(this, void 0, void 0, function* () {
247
+ const absoluteUrl = this.parseUrl(url);
248
+ if (url == "api-docs") {
249
+ return absoluteUrl.replace("/api", "");
250
+ }
251
+ return absoluteUrl;
252
+ });
253
+ }
254
+ expressRequestUrl(url) {
255
+ const req = this.request;
256
+ if (!req || !url || url.startsWith("http") || url.startsWith("//"))
257
+ return url;
258
+ const separator = url.startsWith("/") ? "" : "/";
259
+ return `${req.protocol}://${req.get("host")}${separator}${url}`;
260
+ }
261
+ }
262
+ BaseHttpService.failedRequests = [];
263
+ BaseHttpService.decorators = [
264
+ { type: Injectable }
265
+ ];
266
+ BaseHttpService.ctorParameters = () => [
267
+ { type: BaseHttpClient, decorators: [{ type: Inject, args: [BaseHttpClient,] }] },
268
+ { type: StorageService, decorators: [{ type: Inject, args: [StorageService,] }] },
269
+ { type: undefined, decorators: [{ type: Inject, args: [LANGUAGE_SERVICE,] }] },
270
+ { type: undefined, decorators: [{ type: Inject, args: [TOASTER_SERVICE,] }] },
271
+ { type: undefined, decorators: [{ type: Inject, args: [CONFIG_SERVICE,] }] },
272
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [EXPRESS_REQUEST,] }] }
273
+ ];
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1odHRwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiRDovV29yay9uZ3gtdXRpbHMvc3JjLyIsInNvdXJjZXMiOlsibmd4LXV0aWxzL3NlcnZpY2VzL2Jhc2UtaHR0cC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFvQixhQUFhLEVBQWUsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHakcsT0FBTyxFQUNILGNBQWMsRUFDZCxlQUFlLEVBQ2YsV0FBVyxFQVVYLGdCQUFnQixFQUVoQixlQUFlLEVBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2xDLE1BQU0sT0FBTyxlQUFlO0lBdUJ4QixZQUE2QyxNQUFzQixFQUN0QixPQUF1QixFQUNyQixRQUEwQixFQUMzQixPQUF3QixFQUN6QixPQUF1QixFQUNWLFVBQW1CLElBQUk7UUFMcEMsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDekIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDVixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUU3RSxJQUFJLENBQUMsS0FB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QyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDL0UsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDakQsT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDcEUsQ0FBQzs7QUFoUmdCLDhCQUFjLEdBQXNCLEVBQUUsQ0FBQzs7WUFIM0QsVUFBVTs7O1lBTkgsY0FBYyx1QkE4QkwsTUFBTSxTQUFDLGNBQWM7WUE1QjlCLGNBQWMsdUJBNkJMLE1BQU0sU0FBQyxjQUFjOzRDQUNyQixNQUFNLFNBQUMsZ0JBQWdCOzRDQUN2QixNQUFNLFNBQUMsZUFBZTs0Q0FDdEIsTUFBTSxTQUFDLGNBQWM7NENBQ3JCLFFBQVEsWUFBSSxNQUFNLFNBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50VHlwZSwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSBcImV4cHJlc3NcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgICBDT05GSUdfU0VSVklDRSxcclxuICAgIEVYUFJFU1NfUkVRVUVTVCxcclxuICAgIEh0dHBQcm9taXNlLFxyXG4gICAgSUNvbmZpZ1NlcnZpY2UsXHJcbiAgICBJSHR0cEhlYWRlcnMsXHJcbiAgICBJSHR0cFBhcmFtcyxcclxuICAgIElIdHRwU2VydmljZSxcclxuICAgIElJc3N1ZUNvbnRleHQsXHJcbiAgICBJTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgSVBhZ2luYXRpb25EYXRhLFxyXG4gICAgSVJlcXVlc3RPcHRpb25zLFxyXG4gICAgSVRvYXN0ZXJTZXJ2aWNlLFxyXG4gICAgTEFOR1VBR0VfU0VSVklDRSxcclxuICAgIFByb2dyZXNzTGlzdGVuZXIsXHJcbiAgICBUT0FTVEVSX1NFUlZJQ0VcclxufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tIFwiLi4vdXRpbHMvb2JqZWN0LnV0aWxzXCI7XHJcbmltcG9ydCB7TWF0aFV0aWxzfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC51dGlsc1wiO1xyXG5cclxuaW1wb3J0IHtCYXNlSHR0cENsaWVudH0gZnJvbSBcIi4vYmFzZS1odHRwLmNsaWVudFwiO1xyXG5pbXBvcnQge1VuaXZlcnNhbFNlcnZpY2V9IGZyb20gXCIuL3VuaXZlcnNhbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U3RvcmFnZVNlcnZpY2V9IGZyb20gXCIuL3N0b3JhZ2Uuc2VydmljZVwiO1xyXG5pbXBvcnQge3RpbWVvdXR9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQge1RpbWVvdXRFcnJvcn0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEJhc2VIdHRwU2VydmljZSBpbXBsZW1lbnRzIElIdHRwU2VydmljZSB7XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBmYWlsZWRSZXF1ZXN0czogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcclxuXHJcbiAgICBnZXQgbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcImJhc2VcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IHdpdGhDcmVkZW50aWFscygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjYWNoZTogYW55O1xyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgcmV0cnlGYWlsZWRSZXF1ZXN0cygpOiB2b2lkIHtcclxuICAgICAgICBCYXNlSHR0cFNlcnZpY2UuZmFpbGVkUmVxdWVzdHMuZm9yRWFjaChyID0+IHIoKSk7XHJcbiAgICAgICAgQmFzZUh0dHBTZXJ2aWNlLmZhaWxlZFJlcXVlc3RzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHVuaXZlcnNhbCgpOiBVbml2ZXJzYWxTZXJ2aWNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnVuaXZlcnNhbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEJhc2VIdHRwQ2xpZW50KSByZWFkb25seSBjbGllbnQ6IEJhc2VIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChTdG9yYWdlU2VydmljZSkgcmVhZG9ubHkgc3RvcmFnZTogU3RvcmFnZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KExBTkdVQUdFX1NFUlZJQ0UpIHJlYWRvbmx5IGxhbmd1YWdlOiBJTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChUT0FTVEVSX1NFUlZJQ0UpIHJlYWRvbmx5IHRvYXN0ZXI6IElUb2FzdGVyU2VydmljZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoQ09ORklHX1NFUlZJQ0UpIHJlYWRvbmx5IGNvbmZpZ3M6IElDb25maWdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChFWFBSRVNTX1JFUVVFU1QpIHJlYWRvbmx5IHJlcXVlc3Q6IFJlcXVlc3QgPSBudWxsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmNhY2hlID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgdXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVVybCh1cmw6IHN0cmluZywgcGFyYW1zOiBJSHR0cFBhcmFtcyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgaHR0cFBhcmFtcyA9IHRoaXMuY2xpZW50Lm1ha2VQYXJhbXMocGFyYW1zKTtcclxuICAgICAgICBjb25zdCBxdWVyeSA9IGh0dHBQYXJhbXMua2V5cygpLm1hcChrZXkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2h0dHBQYXJhbXMuZ2V0KGtleSl9YDtcclxuICAgICAgICB9KS5qb2luKFwiJlwiKTtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy51cmwodXJsKX0/JHtxdWVyeX1gO1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VMaXN0UGFyYW1zKHBhZ2U6IG51bWJlciwgaXRlbXNQZXJQYWdlOiBudW1iZXIsIG9yZGVyQnk6IHN0cmluZyA9IG51bGwsIG9yZGVyRGVzY2VuZGluZzogYm9vbGVhbiA9IG51bGwsIGZpbHRlcjogc3RyaW5nID0gbnVsbCk6IElIdHRwUGFyYW1zIHtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IElIdHRwUGFyYW1zID0ge1xyXG4gICAgICAgICAgICBwYWdlOiAocGFnZSAtIDEpLFxyXG4gICAgICAgICAgICBsaW1pdDogaXRlbXNQZXJQYWdlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKG9yZGVyQnkpICYmICFPYmplY3RVdGlscy5pc051bGxPclVuZGVmaW5lZChvcmRlckRlc2NlbmRpbmcpKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5zb3J0ID0gYCR7b3JkZXJEZXNjZW5kaW5nID8gXCItXCIgOiBcIlwifSR7b3JkZXJCeX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKGZpbHRlcikpIHtcclxuICAgICAgICAgICAgcGFyYW1zLmZpbHRlciA9IGZpbHRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UHJvbWlzZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucywgYm9keT86IGFueSk6IEh0dHBQcm9taXNlIHtcclxuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhvcHRpb25zLCBcIkdFVFwiLCBib2R5KTtcclxuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZGVsZXRlUHJvbWlzZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucywgYm9keT86IGFueSk6IEh0dHBQcm9taXNlIHtcclxuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhvcHRpb25zLCBcIkRFTEVURVwiLCBib2R5KTtcclxuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcG9zdFByb21pc2UodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMubWFrZU9wdGlvbnMob3B0aW9ucywgXCJQT1NUXCIsIGJvZHkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvUHJvbWlzZSh1cmwsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwdXRQcm9taXNlKHVybDogc3RyaW5nLCBib2R5PzogYW55LCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zKTogSHR0cFByb21pc2Uge1xyXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm1ha2VPcHRpb25zKG9wdGlvbnMsIFwiUFVUXCIsIGJvZHkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvUHJvbWlzZSh1cmwsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwYXRjaFByb21pc2UodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMubWFrZU9wdGlvbnMob3B0aW9ucywgXCJQQVRDSFwiLCBib2R5KTtcclxuICAgICAgICByZXR1cm4gdGhpcy50b1Byb21pc2UodXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBsb2FkUHJvbWlzZSh1cmw6IHN0cmluZywgYm9keTogYW55LCBsaXN0ZW5lcj86IFByb2dyZXNzTGlzdGVuZXIsIG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMpOiBIdHRwUHJvbWlzZSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyczogYW55ID0ge307XHJcbiAgICAgICAgaWYgKGJvZHkgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvcHRpb25zID0gdGhpcy5tYWtlT3B0aW9ucyhPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWVcclxuICAgICAgICB9LCBvcHRpb25zKSwgXCJQT1NUXCIsIGJvZHkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvUHJvbWlzZSh1cmwsIG9wdGlvbnMsIGxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbGlzdFByb21pc2UodXJsOiBzdHJpbmcsIHBhcmFtczogSUh0dHBQYXJhbXMpOiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJUGFnaW5hdGlvbkRhdGE+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdldFByb21pc2UodXJsLCB7cGFyYW1zOiBwYXJhbXN9KS50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge31cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbDogZGF0YS5tZXRhPy50b3RhbCB8fCBkYXRhPy50b3RhbCB8fCBkYXRhLml0ZW1zPy5sZW5ndGggfHwgMCxcclxuICAgICAgICAgICAgICAgICAgICBpdGVtczogZGF0YS5pdGVtcyB8fCBbXSxcclxuICAgICAgICAgICAgICAgICAgICBtZXRhOiBkYXRhLm1ldGEgfHwge31cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCByZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09IDMwMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBcIk5vdCBpbXBsZW1lbnRlZC5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YToge31cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBtZXRhOiB7fVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBoYW5kbGVVbmF1dGhvcml6ZWRFcnJvcihhYnNvbHV0ZVVybDogc3RyaW5nLCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMsIHJlamVjdDogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgIGlmIChCYXNlSHR0cFNlcnZpY2UuZmFpbGVkUmVxdWVzdHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnVuaXZlcnNhbC5pc1NlcnZlcikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBhdXRoIGVycm9yXCIsIGFic29sdXRlVXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdG9hc3RXYXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgaXNzdWVDb250ZXh0OiBJSXNzdWVDb250ZXh0LCByZWFzb246IGFueSwgb3B0aW9uczogSVJlcXVlc3RPcHRpb25zKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyLndhcm5pbmcobWVzc2FnZSwge2lzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHRvYXN0RXJyb3IobWVzc2FnZTogc3RyaW5nLCBpc3N1ZUNvbnRleHQ6IElJc3N1ZUNvbnRleHQsIHJlYXNvbjogYW55LCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRvYXN0ZXIud2FybmluZyhtZXNzYWdlLCB7aXNzdWVDb250ZXh0LCByZWFzb24sIG9wdGlvbnN9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdG9Qcm9taXNlKHVybDogc3RyaW5nLCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMsIGxpc3RlbmVyPzogUHJvZ3Jlc3NMaXN0ZW5lcik6IEh0dHBQcm9taXNlIHtcclxuICAgICAgICBjb25zdCBpc3N1ZUNvbnRleHQ6IElJc3N1ZUNvbnRleHQgPSB7dXJsOiBcIlwifTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwUHJvbWlzZShyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuaXZlcnNhbC5pc1NlcnZlcikgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJZb3UgbWF5IG5vdCBuZWVkIGEgcmVqZWN0IEhhbmRsZXIgZm9yIHRoaXMgcmVxdWVzdCFcIiwgdGhpcy5uYW1lLCB1cmwsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IHJlc3BvbnNlLmVycm9yIHx8IHt9O1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09IDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09IDMwMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdFdhcm5pbmcoYCR7dXJsfSBlbmRwb2ludCBpcyBub3QgaW1wbGVtZW50ZWQhIENsaWNrIGhlcmUsIHRvIHF1aWNrbHkgY3JlYXRlIGFuIGlzc3VlLmAsIGlzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZWdleCA9IC8oKEUxMTAwMCBkdXBsaWNhdGUga2V5IGVycm9yIGNvbGxlY3Rpb246ICguKStcXC4pfChfMSBkdXAga2V5OiguKSspKS9nO1xyXG4gICAgICAgICAgICBpZiAocmVhc29uLm1lc3NhZ2UgJiYgcmVnZXgudGVzdChyZWFzb24ubWVzc2FnZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RFcnJvcihcIm1lc3NhZ2UuZHVwbGljYXRlLWtleS5lcnJvci5cIiArIHJlYXNvbi5tZXNzYWdlLnJlcGxhY2UocmVnZXgsIFwiXCIpLnJlcGxhY2UoXCIgaW5kZXg6IFwiLCBcIi1cIiksIGlzc3VlQ29udGV4dCwgcmVhc29uLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRvYXN0V2FybmluZyhgJHt1cmx9IGVuZHBvaW50IGVycm9yIGlzIG5vdCBoYW5kbGVkIHByb3Blcmx5ISBDbGljayBoZXJlLCB0byBxdWlja2x5IGNyZWF0ZSBhbiBpc3N1ZS5gLCBpc3N1ZUNvbnRleHQsIHJlYXNvbiwgb3B0aW9ucyk7XHJcbiAgICAgICAgfSwgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFic29sdXRlVXJsKHVybCwgb3B0aW9ucykudGhlbihhYnNvbHV0ZVVybCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpc3N1ZUNvbnRleHQudXJsID0gYWJzb2x1dGVVcmw7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5jbGllbnQucmVxdWVzdChvcHRpb25zLm1ldGhvZCwgYWJzb2x1dGVVcmwsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxSZXF1ZXN0ID0gT2JqZWN0VXRpbHMuaXNOdW1iZXIob3B0aW9ucy50aW1lb3V0KSAmJiBvcHRpb25zLnRpbWVvdXQgPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgPyByZXF1ZXN0LnBpcGUodGltZW91dChvcHRpb25zLnRpbWVvdXQpKSA6IHJlcXVlc3Q7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFJlcXVlc3Quc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MgJiYgZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2U6IE1hdGhVdGlscy5yb3VuZChldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCwgMiwgMC4wMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKHByb2dyZXNzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyBldmVudC5ib2R5IDogZXZlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhcnNlUmVzcG9uc2UocmVzcG9uc2UsIHVybCwgb3B0aW9ucykpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgYXMgSHR0cEhlYWRlcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0aEtleSA9IFwiQXV0aG9yaXphdGlvblwiO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHVzZSB0b2tlbiBhdXRoXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xpZW50LnJlbmV3VG9rZW5GdW5jICYmIGhlYWRlcnMuaGFzKGF1dGhLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJUb2tlblRpbWUgPSB0aGlzLnN0b3JhZ2UuZ2V0KFwidXNlclRva2VuVGltZVwiKSB8fCBjdXJyZW50VGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHRoZSBsYXN0IHJlcXVlc3Qgd2FzIGEgbG9uZyBsb25nIHRpbWUgYWdvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSAtIDYwMDAwMCA+IHVzZXJUb2tlblRpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LnJlbmV3VG9rZW5GdW5jKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCAocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlIHwgVGltZW91dEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgVGltZW91dEVycm9yIHx8IHJlc3BvbnNlLnN0YXR1cyA9PSAwIHx8IHJlc3BvbnNlLnN0YXR1cyA9PSAzMDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIGFzIEh0dHBIZWFkZXJzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhLZXkgPSBcIkF1dGhvcml6YXRpb25cIjtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBhdXRob3JpemF0aW9uIGhlYWRlciBleGlzdHMgYW5kIHdlIHN0aWxsIGhhdmUgYW4gVW5hdXRob3JpemVkIHJlc3BvbnNlIHByb21wdCB0aGUgdXNlciB0byBsb2cgaW4gYWdhaW5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVycy5oYXMoYXV0aEtleSkgJiYgcmVzcG9uc2Uuc3RhdHVzID09IDQwMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBCYXNlSHR0cFNlcnZpY2UuZmFpbGVkUmVxdWVzdHMucHVzaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLm1ha2VIZWFkZXJzKG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9Qcm9taXNlKHVybCwgb3B0aW9ucywgbGlzdGVuZXIpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVW5hdXRob3JpemVkRXJyb3IoYWJzb2x1dGVVcmwsIG9wdGlvbnMsICgpID0+IHJlamVjdChyZXNwb25zZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNoZWNrSGVhZGVycyhoZWFkZXJzOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnMgfHwgIWhlYWRlcnMuY29va2llIHx8ICFoZWFkZXJzLnJlZmVyZXIgfHwgIWhlYWRlcnMuaG9zdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoZWFkZXJzLnJlZmVyZXIuaW5kZXhPZihoZWFkZXJzLmhvc3QpID49IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1ha2VPcHRpb25zKG9wdGlvbnM/OiBJUmVxdWVzdE9wdGlvbnMsIG1ldGhvZDogc3RyaW5nID0gXCJHRVRcIiwgYm9keT86IGFueSk6IElSZXF1ZXN0T3B0aW9ucyB7XHJcbiAgICAgICAgLy8gU2V0IGJhc2Ugb3B0aW9uc1xyXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8gey4uLm9wdGlvbnN9IDoge307XHJcbiAgICAgICAgb3B0aW9ucy5wYXJhbXMgPSB0aGlzLmNsaWVudC5tYWtlUGFyYW1zKG9wdGlvbnMucGFyYW1zKTtcclxuICAgICAgICBvcHRpb25zLm9ic2VydmUgPSBcImJvZHlcIjtcclxuICAgICAgICBvcHRpb25zLm9yaWdpbmFsSGVhZGVycyA9IG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzIHx8IChvcHRpb25zLmhlYWRlcnMgYXMgSUh0dHBIZWFkZXJzKSB8fCB7fTtcclxuICAgICAgICBvcHRpb25zLm1ldGhvZCA9IG1ldGhvZDtcclxuICAgICAgICBvcHRpb25zLndpdGhDcmVkZW50aWFscyA9IE9iamVjdFV0aWxzLmlzQm9vbGVhbihvcHRpb25zLndpdGhDcmVkZW50aWFscykgPyBvcHRpb25zLndpdGhDcmVkZW50aWFscyA6IHRoaXMud2l0aENyZWRlbnRpYWxzO1xyXG4gICAgICAgIG9wdGlvbnMuYm9keSA9IGJvZHkgfHwge307XHJcbiAgICAgICAgLy8gU2V0IGNvb2tpZXMgZnJvbSBzZXJ2ZXIgc2lkZSByZXF1ZXN0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9ICF0aGlzLnJlcXVlc3QgPyBudWxsIDogdGhpcy5yZXF1ZXN0LmhlYWRlcnM7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tIZWFkZXJzKGhlYWRlcnMpKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1tcIkNvb2tpZVwiXSA9IGhlYWRlcnMuY29va2llO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB0aGlzLm1ha2VIZWFkZXJzKG9wdGlvbnMub3JpZ2luYWxIZWFkZXJzLCBtZXRob2QpO1xyXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtYWtlSGVhZGVycyhoZWFkZXJzOiBJSHR0cEhlYWRlcnMsIG1ldGhvZDogc3RyaW5nID0gXCJHRVRcIik6IEh0dHBIZWFkZXJzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQubWFrZUhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHBhcnNlUmVzcG9uc2UocmVzcG9uc2U6IGFueSwgdXJsOiBzdHJpbmcsIG9wdGlvbnM6IElSZXF1ZXN0T3B0aW9ucyk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwYXJzZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsKHVybCkucmVwbGFjZSgvKD86KCg/ITopLlxcLylcXC8pL2csIFwiJDFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFzeW5jIGFic29sdXRlVXJsKHVybDogc3RyaW5nLCBvcHRpb25zOiBJUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gdGhpcy5wYXJzZVVybCh1cmwpO1xyXG4gICAgICAgIGlmICh1cmwgPT0gXCJhcGktZG9jc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhYnNvbHV0ZVVybC5yZXBsYWNlKFwiL2FwaVwiLCBcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFic29sdXRlVXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBleHByZXNzUmVxdWVzdFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcmVxID0gdGhpcy5yZXF1ZXN0O1xyXG4gICAgICAgIGlmICghcmVxIHx8ICF1cmwgfHwgdXJsLnN0YXJ0c1dpdGgoXCJodHRwXCIpIHx8IHVybC5zdGFydHNXaXRoKFwiLy9cIikpIHJldHVybiB1cmw7XHJcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gdXJsLnN0YXJ0c1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiO1xyXG4gICAgICAgIHJldHVybiBgJHtyZXEucHJvdG9jb2x9Oi8vJHtyZXEuZ2V0KFwiaG9zdFwiKX0ke3NlcGFyYXRvcn0ke3VybH1gO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==