http-request-manager 15.0.26 → 18.0.2

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 (232) hide show
  1. package/esm2022/http-request-manager.mjs +5 -0
  2. package/esm2022/lib/http-request-manager.module.mjs +146 -0
  3. package/esm2022/lib/http-request-services-demo/database-data-demo/database-data-demo.component.mjs +71 -0
  4. package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +41 -0
  5. package/esm2022/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.mjs +173 -0
  6. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +80 -0
  7. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +42 -0
  8. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +88 -0
  9. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +11 -0
  10. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.mjs +29 -0
  11. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.mjs +9 -0
  12. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.mjs +12 -0
  13. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.mjs +14 -0
  14. package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +315 -0
  15. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +270 -0
  16. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.mjs +67 -0
  17. package/esm2022/lib/index.mjs +4 -0
  18. package/esm2022/lib/interceptors/credentials.interceptor.mjs +14 -0
  19. package/esm2022/lib/interceptors/index.mjs +5 -0
  20. package/esm2022/lib/interceptors/models/error-settings.model.mjs +10 -0
  21. package/esm2022/lib/interceptors/proxy-debugger.interceptor.mjs +47 -0
  22. package/esm2022/lib/interceptors/request-error.interceptor.mjs +49 -0
  23. package/esm2022/lib/interceptors/request-header.interceptor.mjs +41 -0
  24. package/esm2022/lib/models/config-http-options.model.mjs +18 -0
  25. package/esm2022/lib/models/config-local-storage-options.model.mjs +12 -0
  26. package/esm2022/lib/models/config-options.model.mjs +12 -0
  27. package/esm2022/lib/models/config-token.model.mjs +8 -0
  28. package/esm2022/lib/models/data-type.enum.mjs +7 -0
  29. package/esm2022/lib/models/database-storage.model.mjs +10 -0
  30. package/esm2022/lib/models/index.mjs +7 -0
  31. package/esm2022/lib/models/retry-options.model.mjs +10 -0
  32. package/esm2022/lib/services/database-manager-services/database.manager.service.mjs +119 -0
  33. package/esm2022/lib/services/database-manager-services/db.storage.service.mjs +143 -0
  34. package/esm2022/lib/services/database-manager-services/index.mjs +4 -0
  35. package/esm2022/lib/services/database-manager-services/models/table-schema.mjs +20 -0
  36. package/esm2022/lib/services/index.mjs +6 -0
  37. package/esm2022/lib/services/local-storage-manager-service/index.mjs +3 -0
  38. package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +302 -0
  39. package/esm2022/lib/services/local-storage-manager-service/models/global-store-options.model.mjs +13 -0
  40. package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +6 -0
  41. package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +13 -0
  42. package/esm2022/lib/services/local-storage-manager-service/models/storage-data.model.mjs +10 -0
  43. package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +12 -0
  44. package/esm2022/lib/services/local-storage-manager-service/models/storage-type.enum.mjs +7 -0
  45. package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +207 -0
  46. package/esm2022/lib/services/request-manager-services/index.mjs +5 -0
  47. package/esm2022/lib/services/request-manager-services/request.service.mjs +189 -0
  48. package/esm2022/lib/services/request-manager-services/rxjs-operators/countdown.mjs +9 -0
  49. package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +10 -0
  50. package/esm2022/lib/services/request-manager-services/rxjs-operators/index.mjs +5 -0
  51. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +14 -0
  52. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +19 -0
  53. package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +267 -0
  54. package/esm2022/lib/services/request-manager-state-service/index.mjs +3 -0
  55. package/esm2022/lib/services/request-manager-state-service/models/api-request.model.mjs +20 -0
  56. package/esm2022/lib/services/request-manager-state-service/models/index.mjs +3 -0
  57. package/esm2022/lib/services/request-manager-state-service/models/request-options.model.mjs +10 -0
  58. package/esm2022/lib/services/utils/app.service.mjs +26 -0
  59. package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +186 -0
  60. package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +35 -0
  61. package/esm2022/lib/services/utils/encryption/index.mjs +4 -0
  62. package/esm2022/lib/services/utils/encryption/random.mjs +52 -0
  63. package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +77 -0
  64. package/esm2022/lib/services/utils/headers.service.mjs +21 -0
  65. package/esm2022/lib/services/utils/index.mjs +6 -0
  66. package/esm2022/lib/services/utils/object-merger.service.mjs +50 -0
  67. package/esm2022/lib/services/utils/path-query.service.mjs +54 -0
  68. package/esm2022/lib/services/utils/utils.service.mjs +155 -0
  69. package/esm2022/public-api.mjs +11 -0
  70. package/fesm2022/http-request-manager.mjs +3444 -0
  71. package/fesm2022/http-request-manager.mjs.map +1 -0
  72. package/http-request-manager-18.0.2.tgz +0 -0
  73. package/index.d.ts +5 -0
  74. package/lib/http-request-manager.module.d.ts +33 -0
  75. package/lib/http-request-services-demo/database-data-demo/database-data-demo.component.d.ts +19 -0
  76. package/lib/http-request-services-demo/http-request-services-demo.component.d.ts +24 -0
  77. package/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.d.ts +56 -0
  78. package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +26 -0
  79. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +13 -0
  80. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +27 -0
  81. package/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.d.ts +12 -0
  82. package/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.d.ts +16 -0
  83. package/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.d.ts +8 -0
  84. package/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.d.ts +14 -0
  85. package/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.d.ts +14 -0
  86. package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +107 -0
  87. package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +122 -0
  88. package/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.d.ts +15 -0
  89. package/lib/index.d.ts +3 -0
  90. package/lib/interceptors/credentials.interceptor.d.ts +8 -0
  91. package/{src/lib/interceptors/index.ts → lib/interceptors/index.d.ts} +0 -2
  92. package/lib/interceptors/models/error-settings.model.d.ts +10 -0
  93. package/lib/interceptors/proxy-debugger.interceptor.d.ts +12 -0
  94. package/lib/interceptors/request-error.interceptor.d.ts +10 -0
  95. package/lib/interceptors/request-header.interceptor.d.ts +15 -0
  96. package/lib/models/config-http-options.model.d.ts +21 -0
  97. package/lib/models/config-local-storage-options.model.d.ts +13 -0
  98. package/lib/models/config-options.model.d.ts +12 -0
  99. package/{src/lib/models/config-token.model.ts → lib/models/config-token.model.d.ts} +1 -2
  100. package/lib/models/data-type.enum.d.ts +5 -0
  101. package/lib/models/database-storage.model.d.ts +10 -0
  102. package/lib/models/index.d.ts +6 -0
  103. package/lib/models/retry-options.model.d.ts +10 -0
  104. package/lib/services/database-manager-services/database.manager.service.d.ts +31 -0
  105. package/lib/services/database-manager-services/db.storage.service.d.ts +26 -0
  106. package/{src/lib/services/database-manager-services/index.ts → lib/services/database-manager-services/index.d.ts} +0 -1
  107. package/lib/services/database-manager-services/models/table-schema.d.ts +11 -0
  108. package/{src/lib/services/index.ts → lib/services/index.d.ts} +0 -4
  109. package/lib/services/local-storage-manager-service/index.d.ts +2 -0
  110. package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +86 -0
  111. package/lib/services/local-storage-manager-service/models/global-store-options.model.d.ts +15 -0
  112. package/{src/lib/services/local-storage-manager-service/models/index.ts → lib/services/local-storage-manager-service/models/index.d.ts} +1 -2
  113. package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +15 -0
  114. package/lib/services/local-storage-manager-service/models/storage-data.model.d.ts +10 -0
  115. package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +13 -0
  116. package/lib/services/local-storage-manager-service/models/storage-type.enum.d.ts +5 -0
  117. package/lib/services/request-manager-services/http-manager.service.d.ts +41 -0
  118. package/{src/lib/services/request-manager-services/index.ts → lib/services/request-manager-services/index.d.ts} +0 -2
  119. package/lib/services/request-manager-services/request.service.d.ts +27 -0
  120. package/lib/services/request-manager-services/rxjs-operators/countdown.d.ts +2 -0
  121. package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +2 -0
  122. package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +7 -0
  123. package/lib/services/request-manager-services/rxjs-operators/request-streaming.d.ts +2 -0
  124. package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +51 -0
  125. package/{src/lib/services/request-manager-state-service/index.ts → lib/services/request-manager-state-service/index.d.ts} +0 -1
  126. package/lib/services/request-manager-state-service/models/api-request.model.d.ts +27 -0
  127. package/{src/lib/services/request-manager-state-service/models/index.ts → lib/services/request-manager-state-service/models/index.d.ts} +0 -1
  128. package/lib/services/request-manager-state-service/models/request-options.model.d.ts +10 -0
  129. package/lib/services/utils/app.service.d.ts +8 -0
  130. package/lib/services/utils/encryption/asymmetrical-encryption.service.d.ts +17 -0
  131. package/lib/services/utils/encryption/encryption-test.service.d.ts +10 -0
  132. package/{src/lib/services/utils/encryption/index.ts → lib/services/utils/encryption/index.d.ts} +0 -2
  133. package/lib/services/utils/encryption/random.d.ts +7 -0
  134. package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +14 -0
  135. package/lib/services/utils/headers.service.d.ts +10 -0
  136. package/{src/lib/services/utils/index.ts → lib/services/utils/index.d.ts} +0 -2
  137. package/lib/services/utils/object-merger.service.d.ts +12 -0
  138. package/lib/services/utils/path-query.service.d.ts +11 -0
  139. package/lib/services/utils/utils.service.d.ts +24 -0
  140. package/package.json +14 -1
  141. package/{src/public-api.ts → public-api.d.ts} +0 -7
  142. package/ng-package.json +0 -8
  143. package/src/lib/http-request-manager.module.ts +0 -101
  144. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +0 -3
  145. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  146. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +0 -105
  147. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +0 -64
  148. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +0 -6
  149. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +0 -34
  150. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +0 -195
  151. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +0 -17
  152. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +0 -205
  153. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +0 -59
  154. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +0 -60
  155. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +0 -71
  156. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +0 -28
  157. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +0 -10
  158. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +0 -29
  159. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +0 -99
  160. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +0 -22
  161. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +0 -8
  162. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +0 -19
  163. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +0 -25
  164. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +0 -30
  165. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +0 -19
  166. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +0 -25
  167. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +0 -19
  168. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +0 -24
  169. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +0 -30
  170. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +0 -49
  171. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +0 -33
  172. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +0 -336
  173. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +0 -24
  174. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +0 -403
  175. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +0 -328
  176. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +0 -24
  177. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +0 -347
  178. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +0 -88
  179. package/src/lib/index.ts +0 -3
  180. package/src/lib/interceptors/credentials.interceptor.ts +0 -18
  181. package/src/lib/interceptors/models/error-settings.model.ts +0 -22
  182. package/src/lib/interceptors/proxy-debugger.interceptor.ts +0 -46
  183. package/src/lib/interceptors/request-error.interceptor.ts +0 -65
  184. package/src/lib/interceptors/request-header.interceptor.ts +0 -58
  185. package/src/lib/models/config-http-options.model.ts +0 -42
  186. package/src/lib/models/config-local-storage-options.model.ts +0 -27
  187. package/src/lib/models/config-options.model.ts +0 -27
  188. package/src/lib/models/data-type.enum.ts +0 -5
  189. package/src/lib/models/database-storage.model.ts +0 -24
  190. package/src/lib/models/index.ts +0 -9
  191. package/src/lib/models/retry-options.model.ts +0 -22
  192. package/src/lib/services/database-manager-services/database.manager.service.ts +0 -193
  193. package/src/lib/services/database-manager-services/db.storage.service.ts +0 -191
  194. package/src/lib/services/database-manager-services/models/table-schema.ts +0 -35
  195. package/src/lib/services/local-storage-manager-service/index.ts +0 -2
  196. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +0 -71
  197. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +0 -421
  198. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +0 -30
  199. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +0 -30
  200. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +0 -24
  201. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +0 -29
  202. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +0 -5
  203. package/src/lib/services/request-manager-services/README.md +0 -268
  204. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +0 -230
  205. package/src/lib/services/request-manager-services/http-manager.service.ts +0 -274
  206. package/src/lib/services/request-manager-services/request.service.ts +0 -261
  207. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +0 -17
  208. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +0 -16
  209. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +0 -21
  210. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +0 -32
  211. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +0 -402
  212. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +0 -50
  213. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +0 -22
  214. package/src/lib/services/utils/app.service.spec.ts +0 -25
  215. package/src/lib/services/utils/app.service.ts +0 -21
  216. package/src/lib/services/utils/encryption/README.md +0 -79
  217. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +0 -282
  218. package/src/lib/services/utils/encryption/encryption-test.service.ts +0 -39
  219. package/src/lib/services/utils/encryption/random.ts +0 -69
  220. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +0 -93
  221. package/src/lib/services/utils/headers.service.spec.ts +0 -80
  222. package/src/lib/services/utils/headers.service.ts +0 -18
  223. package/src/lib/services/utils/object-merger.service.spec.ts +0 -16
  224. package/src/lib/services/utils/object-merger.service.ts +0 -60
  225. package/src/lib/services/utils/path-query.service.spec.ts +0 -117
  226. package/src/lib/services/utils/path-query.service.ts +0 -69
  227. package/src/lib/services/utils/utils.service.spec.ts +0 -164
  228. package/src/lib/services/utils/utils.service.ts +0 -192
  229. package/tsconfig.lib.json +0 -32
  230. package/tsconfig.lib.prod.json +0 -10
  231. package/tsconfig.spec.json +0 -14
  232. /package/{src/lib/services/request-manager-services/rxjs-operators/index.ts → lib/services/request-manager-services/rxjs-operators/index.d.ts} +0 -0
@@ -0,0 +1,270 @@
1
+ import { Component, ViewChild, inject } from '@angular/core';
2
+ import { StateManagerDemoService } from './services/state-manager-demo.service';
3
+ import { FormBuilder, Validators } from '@angular/forms';
4
+ import { BehaviorSubject, EMPTY, map, tap, catchError, throwError } from 'rxjs';
5
+ import { ClientInfo } from '../request-manager-demo/models/sample-client-info';
6
+ import { ClientInfoMapper } from '../request-manager-demo/models/sample-mapper-client-info';
7
+ import { AIPrompt } from '../request-manager-demo/models/sample-ai-prompt';
8
+ import { DataType } from '../../models';
9
+ import { DatabaseStorage } from '../../models/database-storage.model';
10
+ import { HTTPManagerService, ApiRequest } from '../../services';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ import * as i2 from "@angular/forms";
14
+ import * as i3 from "@angular/material/button";
15
+ import * as i4 from "@angular/material/form-field";
16
+ import * as i5 from "@angular/material/select";
17
+ import * as i6 from "@angular/material/core";
18
+ import * as i7 from "@angular/material/icon";
19
+ import * as i8 from "@angular/material/table";
20
+ import * as i9 from "@angular/material/progress-bar";
21
+ import * as i10 from "@angular/material/slide-toggle";
22
+ import * as i11 from "@angular/material/divider";
23
+ import * as i12 from "@angular/material/input";
24
+ export class RequestManagerStateDemoComponent {
25
+ get dataObservable$() {
26
+ switch (this.requestType) {
27
+ case 'GET':
28
+ return this.GET$;
29
+ case 'PUT':
30
+ return this.PUT$;
31
+ case 'POST':
32
+ return this.POST$;
33
+ case 'DELETE':
34
+ return this.DELETE$;
35
+ case 'STREAM':
36
+ return this.STREAM;
37
+ case 'STREAM_AI':
38
+ return this.STREAM_AI;
39
+ default:
40
+ return this.GET$;
41
+ break;
42
+ }
43
+ }
44
+ get hasChanged() {
45
+ return this.requestForm.dirty || this.requestForm.untouched;
46
+ }
47
+ get dataType() {
48
+ return this.requestForm.get("datatype")?.value;
49
+ }
50
+ get database() {
51
+ return this.requestForm.get("database")?.value;
52
+ }
53
+ get retry() {
54
+ return this.requestForm.get("retry")?.value;
55
+ }
56
+ get headers() {
57
+ return this.requestForm.get('headers');
58
+ }
59
+ get isValid() {
60
+ this.requestForm.markAllAsTouched();
61
+ return this.requestForm.valid;
62
+ }
63
+ constructor() {
64
+ this.stateManagerDemoService = inject(StateManagerDemoService);
65
+ this.displayedColumns = ['id', 'name', 'lastName', 'age'];
66
+ this.fb = inject(FormBuilder);
67
+ this.httpManagerService = inject(HTTPManagerService);
68
+ this.isPending$ = this.stateManagerDemoService.isPending$;
69
+ this.error$ = this.stateManagerDemoService.error$;
70
+ this.countdown$ = this.httpManagerService.countdown$;
71
+ this.GET_error$ = new BehaviorSubject('');
72
+ this.POST_error$ = new BehaviorSubject('');
73
+ this.PUT_error$ = new BehaviorSubject('');
74
+ this.DELETE_error$ = new BehaviorSubject('');
75
+ this.STREAM_error$ = new BehaviorSubject('');
76
+ this.STREAM_AI_error$ = new BehaviorSubject('');
77
+ this.GET$ = new BehaviorSubject(null);
78
+ this.POST$ = new BehaviorSubject(null);
79
+ this.PUT$ = new BehaviorSubject(null);
80
+ this.DELETE$ = new BehaviorSubject(null);
81
+ this.STREAM = new BehaviorSubject(null);
82
+ this.STREAM$ = this.STREAM.asObservable();
83
+ this.STREAM_AI = new BehaviorSubject([]);
84
+ this.STREAM_AI$ = this.STREAM_AI.asObservable()
85
+ .pipe(map((items) => (items) ? items.map((item) => item.response) : []), map((items) => items.join('\n').trim()));
86
+ this.questionControl = this.fb.control("", [Validators.required]);
87
+ this.requestType = '';
88
+ this.prompts = [];
89
+ this.AIType = 0;
90
+ this.sampleClientData = {
91
+ id: 0,
92
+ name: "Old School Dates",
93
+ domain: "osd.com",
94
+ service: "osd",
95
+ spiffe: "osd.com/osd",
96
+ secret: "SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX",
97
+ created: 1693003138,
98
+ modified: 1693003138,
99
+ icon: "",
100
+ imageFile: "",
101
+ };
102
+ this.selectedRecord = this.fb.control(null);
103
+ this.requestForm = this.fb.group({
104
+ datatype: this.fb.control('ARRAY'),
105
+ path: this.fb.control("ai/"),
106
+ headers: this.fb.array([]),
107
+ adapter: [null],
108
+ mapper: [null],
109
+ retry: this.fb.group({
110
+ times: [3],
111
+ delay: [3],
112
+ }),
113
+ polling: [3],
114
+ database: this.fb.group({
115
+ table: [''],
116
+ expiresIn: ['1m'],
117
+ })
118
+ });
119
+ this.sampleAdaptors = [
120
+ { label: "ClientInfo Basic", value: ClientInfo.adapt },
121
+ { label: "AI Prompt", value: AIPrompt.adapt },
122
+ ];
123
+ this.sampleMappers = [
124
+ { label: "Mapper Basic", value: ClientInfoMapper.adapt },
125
+ { label: "AI Prompt", value: AIPrompt.adapt },
126
+ ];
127
+ // server = `http://sample-endpoint/as/authorization.oauth2`
128
+ this.arrayObjectsToObjects = (arr) => {
129
+ return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {};
130
+ };
131
+ this.props = (adapter) => {
132
+ return (adapter) ? adapter() : null;
133
+ };
134
+ }
135
+ ngOnInit() {
136
+ this.stateManagerDemoService.data$.pipe(tap((data) => console.log("API STREAM_AI response", data)));
137
+ this.error$.pipe(tap((data) => {
138
+ debugger;
139
+ console.log("API STREAM response", data);
140
+ }), catchError(error => {
141
+ return throwError(() => this.errorHandling(error, 'STREAM'));
142
+ }));
143
+ this.selectedRecord.valueChanges
144
+ .subscribe((data) => {
145
+ this.selectedRecord$ = (data) ? this.stateManagerDemoService.selectRecord$(data.id) : EMPTY;
146
+ });
147
+ this.stateManagerDemoService.data$
148
+ .pipe(tap((data) => {
149
+ switch (this.requestType) {
150
+ case 'GET':
151
+ this.GET$.next(data);
152
+ break;
153
+ case 'PUT':
154
+ this.PUT$.next(data);
155
+ break;
156
+ case 'POST':
157
+ this.POST$.next(data);
158
+ break;
159
+ case 'DELETE':
160
+ this.DELETE$.next(data);
161
+ break;
162
+ case 'STREAM':
163
+ this.STREAM.next(data);
164
+ break;
165
+ case 'STREAM_AI':
166
+ this.STREAM_AI.next(data);
167
+ break;
168
+ default:
169
+ break;
170
+ }
171
+ })).subscribe();
172
+ }
173
+ addHeader() {
174
+ const header = this.fb.group({
175
+ key: ['', Validators.required],
176
+ value: ['']
177
+ });
178
+ this.headers.push(header);
179
+ }
180
+ removeHeader(index) {
181
+ this.headers.removeAt(index);
182
+ }
183
+ compileRequest() {
184
+ const requestParams = this.requestForm.value;
185
+ requestParams.headers = this.arrayObjectsToObjects(requestParams.headers || []);
186
+ const pathReq = (requestParams.path === "") ? [] : (requestParams.path || "").split("/");
187
+ if (!this.pollingState.checked)
188
+ requestParams.polling = 0;
189
+ if (!this.failedState.checked) {
190
+ requestParams.retry = { times: 0, delay: 0 };
191
+ }
192
+ const currentOptions = ApiRequest.adapt(requestParams);
193
+ currentOptions.path = [];
194
+ const apiOptions = ApiRequest.adapt({ ...currentOptions, path: pathReq });
195
+ return { apiOptions: apiOptions, path: pathReq };
196
+ }
197
+ onSetStateOptions() {
198
+ if (!this.isValid)
199
+ return;
200
+ const reqParams = this.compileRequest();
201
+ const db = DatabaseStorage.adapt(this.database);
202
+ const type = this.dataType === "ARRAY" ? DataType.ARRAY : DataType.OBJECT;
203
+ this.stateManagerDemoService.setAPIOptions(reqParams.apiOptions, type, db);
204
+ this.requestForm.markAsPristine();
205
+ }
206
+ onClearRecords() {
207
+ this.stateManagerDemoService.clearRecords();
208
+ }
209
+ onRefreshRecords() {
210
+ this.stateManagerDemoService.refreshData();
211
+ }
212
+ onGetRequest() {
213
+ this.requestType = 'GET';
214
+ this.stateManagerDemoService.getClients();
215
+ }
216
+ onCreateRequest() {
217
+ this.requestType = 'POST';
218
+ this.stateManagerDemoService.createClient(this.sampleClientData);
219
+ }
220
+ onUpdateRequest() {
221
+ this.requestType = 'PUT';
222
+ this.stateManagerDemoService.updateClient(this.sampleClientData);
223
+ }
224
+ onDeleteRequest() {
225
+ this.requestType = 'DELETE';
226
+ this.stateManagerDemoService.deleteClient(this.sampleClientData);
227
+ }
228
+ onStreamRequest() {
229
+ if (!this.isValid)
230
+ return;
231
+ const reqParams = this.compileRequest();
232
+ reqParams.apiOptions.stream = true;
233
+ this.requestType = 'STREAM';
234
+ this.stateManagerDemoService.streamRequest();
235
+ }
236
+ errorHandling(err, type) {
237
+ console.log(err, type);
238
+ if (type === 'GET')
239
+ this.GET_error$.next(err.message);
240
+ if (type === 'POST')
241
+ this.POST_error$.next(err.message);
242
+ if (type === 'PUT')
243
+ this.PUT_error$.next(err.message);
244
+ if (type === 'DELETE')
245
+ this.DELETE_error$.next(err.message);
246
+ if (type === 'STREAM')
247
+ this.STREAM_error$.next(err.message);
248
+ if (type === 'STREAM_AI')
249
+ this.STREAM_AI_error$.next(err.message);
250
+ }
251
+ onSelectAIType(type) {
252
+ this.AIType = type;
253
+ }
254
+ onClearHistory() {
255
+ this.prompts = [];
256
+ }
257
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RequestManagerStateDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
258
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RequestManagerStateDemoComponent, selector: "app-request-manager-state-demo", viewQueries: [{ propertyName: "failedState", first: true, predicate: ["failedState"], descendants: true, static: true }, { propertyName: "pollingState", first: true, predicate: ["pollingState"], descendants: true, static: true }], ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\" #adapterSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\" #mapperSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div style=\"display: flex; margin-bottom: 2rem;\" *ngIf=\"adapterSelect.value || mapperSelect.value\">\n <div style=\"flex:1\" class=\"box\">\n <h3>Adapter (Incoming)</h3>\n <div *ngIf=\"adapterSelect.value; else NO_ADAPTER\">\n {{ props(adapterSelect.value) | json }}\n </div>\n <ng-template #NO_ADAPTER>No Transformation</ng-template>\n </div>\n <div style=\"flex:1\" class=\"box\">\n <h3>Mapper (Outgoing)</h3>\n <div *ngIf=\"mapperSelect.value; else NO_MAPPER\">\n {{ props(mapperSelect.value) | json }}\n </div>\n <ng-template #NO_MAPPER>No Transformation</ng-template>\n </div>\n </div>\n\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.name || (item.first_name) | titlecase}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n\n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\" [disabled]=\"hasChanged\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(GET$ | async) as getData\">{{ getData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(POST$ | async) as postData\">{{ postData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(PUT$ | async) as putData\">{{ putData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(DELETE$ | async) as deleteData\">{{ deleteData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\" [disabled]=\"hasChanged\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}.box{padding:10px;border:1px solid #ccc}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i8.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i11.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }] }); }
259
+ }
260
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RequestManagerStateDemoComponent, decorators: [{
261
+ type: Component,
262
+ args: [{ selector: 'app-request-manager-state-demo', template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\" #adapterSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\" #mapperSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div style=\"display: flex; margin-bottom: 2rem;\" *ngIf=\"adapterSelect.value || mapperSelect.value\">\n <div style=\"flex:1\" class=\"box\">\n <h3>Adapter (Incoming)</h3>\n <div *ngIf=\"adapterSelect.value; else NO_ADAPTER\">\n {{ props(adapterSelect.value) | json }}\n </div>\n <ng-template #NO_ADAPTER>No Transformation</ng-template>\n </div>\n <div style=\"flex:1\" class=\"box\">\n <h3>Mapper (Outgoing)</h3>\n <div *ngIf=\"mapperSelect.value; else NO_MAPPER\">\n {{ props(mapperSelect.value) | json }}\n </div>\n <ng-template #NO_MAPPER>No Transformation</ng-template>\n </div>\n </div>\n\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.name || (item.first_name) | titlecase}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n\n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\" [disabled]=\"hasChanged\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(GET$ | async) as getData\">{{ getData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(POST$ | async) as postData\">{{ postData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(PUT$ | async) as putData\">{{ putData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(DELETE$ | async) as deleteData\">{{ deleteData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\" [disabled]=\"hasChanged\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}.box{padding:10px;border:1px solid #ccc}\n"] }]
263
+ }], ctorParameters: () => [], propDecorators: { failedState: [{
264
+ type: ViewChild,
265
+ args: ["failedState", { static: true }]
266
+ }], pollingState: [{
267
+ type: ViewChild,
268
+ args: ["pollingState", { static: true }]
269
+ }] } });
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1tYW5hZ2VyLXN0YXRlLWRlbW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtZGVtby9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtZGVtby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBYyxlQUFlLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDNUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRTNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxr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QUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDMUQsSUFBRyxJQUFJLEtBQUssUUFBUTtZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMxRCxJQUFHLElBQUksS0FBSyxXQUFXO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO0lBQ3BCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFDbkIsQ0FBQzsrR0FuVVUsZ0NBQWdDO21HQUFoQyxnQ0FBZ0MsNlNDckI3QyxxbllBd1VBOzs0RkRuVGEsZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLGdDQUFnQzt3REE0Q0UsV0FBVztzQkFBdEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNHLFlBQVk7c0JBQXhELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdGF0ZU1hbmFnZXJEZW1vU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvc3RhdGUtbWFuYWdlci1kZW1vLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEZvcm1BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBFTVBUWSwgbWFwLCB0YXAsIGNhdGNoRXJyb3IsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ2xpZW50SW5mbyB9IGZyb20gJy4uL3JlcXVlc3QtbWFuYWdlci1kZW1vL21vZGVscy9zYW1wbGUtY2xpZW50LWluZm8nO1xuaW1wb3J0IHsgQ2xpZW50SW5mb01hcHBlciB9IGZyb20gJy4uL3JlcXVlc3QtbWFuYWdlci1kZW1vL21vZGVscy9zYW1wbGUtbWFwcGVyLWNsaWVudC1pbmZvJztcbmltcG9ydCB7IEFJUHJvbXB0IH0gZnJvbSAnLi4vcmVxdWVzdC1tYW5hZ2VyLWRlbW8vbW9kZWxzL3NhbXBsZS1haS1wcm9tcHQnO1xuXG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBEYXRhYmFzZVN0b3JhZ2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0YWJhc2Utc3RvcmFnZS5tb2RlbCc7XG5pbXBvcnQgeyBIVFRQTWFuYWdlclNlcnZpY2UsIEFwaVJlcXVlc3QgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVxdWVzdC1tYW5hZ2VyLXN0YXRlLWRlbW8uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVxdWVzdE1hbmFnZXJTdGF0ZURlbW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlID0gaW5qZWN0KFN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlKVxuXG4gIGRpc3BsYXllZENvbHVtbnMgPSBbJ2lkJywnbmFtZScsICdsYXN0TmFtZScsICdhZ2UnXVxuXG4gIHNlbGVjdGVkUmVjb3JkJD86IE9ic2VydmFibGU8Q2xpZW50SW5mb3xudWxsPlxuXG4gIGZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKVxuXG4gIGh0dHBNYW5hZ2VyU2VydmljZSA9IGluamVjdChIVFRQTWFuYWdlclNlcnZpY2UpXG5cbiAgaXNQZW5kaW5nJCA9IHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UuaXNQZW5kaW5nJFxuICBlcnJvciQgPSB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLmVycm9yJFxuXG4gIGNvdW50ZG93biQgPSB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5jb3VudGRvd24kXG5cbiAgR0VUX2Vycm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcbiAgUE9TVF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIFBVVF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIERFTEVURV9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG5cbiAgU1RSRUFNX2Vycm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcbiAgU1RSRUFNX0FJX2Vycm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcblxuICBHRVQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpXG4gIFBPU1QkID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKVxuICBQVVQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKVxuICBERUxFVEUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKVxuXG4gIFNUUkVBTSA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbClcbiAgU1RSRUFNJCA9IHRoaXMuU1RSRUFNLmFzT2JzZXJ2YWJsZSgpXG5cbiAgU1RSRUFNX0FJID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7cmVzcG9uc2U6IHN0cmluZ31bXT4oW10pXG4gIFNUUkVBTV9BSSQgPSB0aGlzLlNUUkVBTV9BSS5hc09ic2VydmFibGUoKVxuICAucGlwZShcbiAgICBtYXAoKGl0ZW1zOiBhbnkpID0+IChpdGVtcykgPyBpdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5yZXNwb25zZSkgOiBbXSksXG4gICAgbWFwKChpdGVtczogYW55KSA9PiBpdGVtcy5qb2luKCdcXG4nKS50cmltKCkpLFxuICApXG5cbiAgQFZpZXdDaGlsZChcImZhaWxlZFN0YXRlXCIsIHsgc3RhdGljOiB0cnVlIH0pIGZhaWxlZFN0YXRlOiBhbnlcbiAgQFZpZXdDaGlsZChcInBvbGxpbmdTdGF0ZVwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBwb2xsaW5nU3RhdGU6IGFueVxuXG4gIHF1ZXN0aW9uQ29udHJvbCA9IHRoaXMuZmIuY29udHJvbChcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXG5cbiAgcmVxdWVzdFR5cGUgPSAnJ1xuXG4gIHByb21wdHM6IHN0cmluZ1tdID0gW11cblxuICBBSVR5cGUgPSAwXG5cbiAgZ2V0IGRhdGFPYnNlcnZhYmxlJCgpIHtcblxuICAgIHN3aXRjaCAodGhpcy5yZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSAnR0VUJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuR0VUJFxuXG4gICAgICBjYXNlICdQVVQnOlxuICAgICAgICByZXR1cm4gdGhpcy5QVVQkXG5cbiAgICAgIGNhc2UgJ1BPU1QnOlxuICAgICAgICByZXR1cm4gdGhpcy5QT1NUJFxuXG4gICAgICBjYXNlICdERUxFVEUnOlxuICAgICAgICByZXR1cm4gdGhpcy5ERUxFVEUkXG5cbiAgICAgIGNhc2UgJ1NUUkVBTSc6XG4gICAgICAgIHJldHVybiB0aGlzLlNUUkVBTVxuXG4gICAgICBjYXNlICdTVFJFQU1fQUknOlxuICAgICAgICByZXR1cm4gdGhpcy5TVFJFQU1fQUlcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuR0VUJFxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgfVxuXG4gIHNhbXBsZUNsaWVudERhdGEgPSB7XG4gICAgICBpZDogMCxcbiAgICAgIG5hbWU6IFwiT2xkIFNjaG9vbCBEYXRlc1wiLFxuICAgICAgZG9tYWluOiBcIm9zZC5jb21cIixcbiAgICAgIHNlcnZpY2U6IFwib3NkXCIsXG4gICAgICBzcGlmZmU6IFwib3NkLmNvbS9vc2RcIixcbiAgICAgIHNlY3JldDogXCJTTU9QRUNYUC1PUzRQLVVTT0ctWDJJSS0zWE1EMUZRRFIzSUpYXCIsXG4gICAgICBjcmVhdGVkOiAxNjkzMDAzMTM4LFxuICAgICAgbW9kaWZpZWQ6IDE2OTMwMDMxMzgsXG4gICAgICBpY29uOiBcIlwiLFxuICAgICAgaW1hZ2VGaWxlOiBcIlwiLFxuICB9XG5cbiAgc2VsZWN0ZWRSZWNvcmQgPSB0aGlzLmZiLmNvbnRyb2wobnVsbClcblxuICByZXF1ZXN0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgIGRhdGF0eXBlOiB0aGlzLmZiLmNvbnRyb2woJ0FSUkFZJyksXG4gICAgcGF0aDogdGhpcy5mYi5jb250cm9sPHN0cmluZz4oXCJhaS9cIiksXG4gICAgaGVhZGVyczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgYWRhcHRlcjogW251bGxdLFxuICAgIG1hcHBlcjogW251bGxdLFxuICAgIHJldHJ5OiB0aGlzLmZiLmdyb3VwKHtcbiAgICB0aW1lczogWzNdLFxuICAgIGRlbGF5OiBbM10sXG4gICAgfSksXG4gICAgcG9sbGluZzogWzNdLFxuICAgIGRhdGFiYXNlOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHRhYmxlOiBbJyddLFxuICAgICAgZXhwaXJlc0luOiBbJzFtJ10sXG4gICAgfSlcbiAgfSlcblxuICBnZXQgaGFzQ2hhbmdlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Rm9ybS5kaXJ0eSB8fCB0aGlzLnJlcXVlc3RGb3JtLnVudG91Y2hlZFxuICB9XG5cbiAgZ2V0IGRhdGFUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RGb3JtLmdldChcImRhdGF0eXBlXCIpPy52YWx1ZVxuICB9XG5cbiAgZ2V0IGRhdGFiYXNlKCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RGb3JtLmdldChcImRhdGFiYXNlXCIpPy52YWx1ZVxuICB9XG5cbiAgZ2V0IHJldHJ5KCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RGb3JtLmdldChcInJldHJ5XCIpPy52YWx1ZVxuICB9XG5cbiAgc2FtcGxlQWRhcHRvcnMgPSBbXG4gICAgeyBsYWJlbDogXCJDbGllbnRJbmZvIEJhc2ljXCIsIHZhbHVlOiBDbGllbnRJbmZvLmFkYXB0IH0sXG4gICAgeyBsYWJlbDogXCJBSSBQcm9tcHRcIiwgdmFsdWU6IEFJUHJvbXB0LmFkYXB0IH0sXG4gIF1cblxuICBzYW1wbGVNYXBwZXJzID0gW1xuICAgIHsgbGFiZWw6IFwiTWFwcGVyIEJhc2ljXCIsIHZhbHVlOiBDbGllbnRJbmZvTWFwcGVyLmFkYXB0IH0sXG4gICAgeyBsYWJlbDogXCJBSSBQcm9tcHRcIiwgdmFsdWU6IEFJUHJvbXB0LmFkYXB0IH0sXG4gIF1cblxuICBnZXQgaGVhZGVycygpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RGb3JtLmdldCgnaGVhZGVycycpIGFzIEZvcm1BcnJheVxuICB9XG5cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgdGhpcy5yZXF1ZXN0Rm9ybS5tYXJrQWxsQXNUb3VjaGVkKClcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Rm9ybS52YWxpZFxuICB9XG5cbiAgLy8gc2VydmVyID0gYGh0dHA6Ly9zYW1wbGUtZW5kcG9pbnQvYXMvYXV0aG9yaXphdGlvbi5vYXV0aDJgXG5cbiAgYXJyYXlPYmplY3RzVG9PYmplY3RzID0gKGFycjogYW55W10pID0+IHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpID8gYXJyLnJlZHVjZSgob2JqLCBpdGVtKSA9PiBPYmplY3QuYXNzaWduKG9iaiwgeyBbaXRlbS5rZXldOiBpdGVtLnZhbHVlIH0pLCB7fSkgOiB7fVxuICB9XG5cbiAgcHJvcHMgPSAoYWRhcHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIChhZGFwdGVyKSA/IGFkYXB0ZXIoKSA6IG51bGxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLmRhdGEkLnBpcGUoXG4gICAgICB0YXAoKGRhdGEpID0+IGNvbnNvbGUubG9nKFwiQVBJIFNUUkVBTV9BSSByZXNwb25zZVwiLCBkYXRhKSksXG4gICAgKVxuXG4gICAgdGhpcy5lcnJvciQucGlwZShcbiAgICAgIHRhcCgoZGF0YSkgPT4ge1xuICAgICAgICBkZWJ1Z2dlclxuICAgICAgICBjb25zb2xlLmxvZyhcIkFQSSBTVFJFQU0gcmVzcG9uc2VcIiwgZGF0YSlcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuZXJyb3JIYW5kbGluZyhlcnJvciwgJ1NUUkVBTScpKVxuICAgICAgfSlcbiAgICApXG5cbiAgICB0aGlzLnNlbGVjdGVkUmVjb3JkLnZhbHVlQ2hhbmdlc1xuICAgIC5zdWJzY3JpYmUoKGRhdGE6IENsaWVudEluZm98bnVsbCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlY29yZCQgPSAoZGF0YSkgPyB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLnNlbGVjdFJlY29yZCQoZGF0YS5pZCkgOiBFTVBUWVxuICAgIH0pXG5cbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLmRhdGEkXG4gICAgLnBpcGUoXG4gICAgICB0YXAoKGRhdGEpID0+IHtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucmVxdWVzdFR5cGUpIHtcbiAgICAgICAgICBjYXNlICdHRVQnOlxuICAgICAgICAgICAgdGhpcy5HRVQkLm5leHQoZGF0YSlcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnUFVUJzpcbiAgICAgICAgICAgIHRoaXMuUFVUJC5uZXh0KGRhdGEpXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ1BPU1QnOlxuICAgICAgICAgICAgdGhpcy5QT1NUJC5uZXh0KGRhdGEpXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ0RFTEVURSc6XG4gICAgICAgICAgICB0aGlzLkRFTEVURSQubmV4dChkYXRhKVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdTVFJFQU0nOlxuICAgICAgICAgICAgdGhpcy5TVFJFQU0ubmV4dChkYXRhKVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdTVFJFQU1fQUknOlxuICAgICAgICAgICAgdGhpcy5TVFJFQU1fQUkubmV4dChkYXRhKVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSgpXG5cbiAgfVxuXG4gIGFkZEhlYWRlcigpIHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGtleTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHZhbHVlOiBbJyddXG4gICAgfSk7XG4gICAgdGhpcy5oZWFkZXJzLnB1c2goaGVhZGVyKVxuICB9XG5cbiAgcmVtb3ZlSGVhZGVyKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmhlYWRlcnMucmVtb3ZlQXQoaW5kZXgpXG4gIH1cblxuICBjb21waWxlUmVxdWVzdCgpIHtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSB0aGlzLnJlcXVlc3RGb3JtLnZhbHVlXG5cbiAgICByZXF1ZXN0UGFyYW1zLmhlYWRlcnMgPSB0aGlzLmFycmF5T2JqZWN0c1RvT2JqZWN0cyhcbiAgICAgIHJlcXVlc3RQYXJhbXMuaGVhZGVycyB8fCBbXVxuICAgIClcblxuICAgIGNvbnN0IHBhdGhSZXEgPSAocmVxdWVzdFBhcmFtcy5wYXRoID09PSBcIlwiKSA/IFtdIDogKHJlcXVlc3RQYXJhbXMucGF0aCB8fCBcIlwiKS5zcGxpdChcIi9cIilcblxuICAgIGlmICghdGhpcy5wb2xsaW5nU3RhdGUuY2hlY2tlZCkgcmVxdWVzdFBhcmFtcy5wb2xsaW5nID0gMFxuXG4gICAgaWYgKCF0aGlzLmZhaWxlZFN0YXRlLmNoZWNrZWQpIHtcbiAgICAgIHJlcXVlc3RQYXJhbXMucmV0cnkgPSB7IHRpbWVzOiAwLGRlbGF5OiAwIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50T3B0aW9ucyA9IEFwaVJlcXVlc3QuYWRhcHQocmVxdWVzdFBhcmFtcylcbiAgICBjdXJyZW50T3B0aW9ucy5wYXRoID0gW11cbiAgICBjb25zdCBhcGlPcHRpb25zID0gQXBpUmVxdWVzdC5hZGFwdCh7IC4uLmN1cnJlbnRPcHRpb25zLCBwYXRoOiBwYXRoUmVxIH0pXG5cbiAgICByZXR1cm4geyBhcGlPcHRpb25zOiBhcGlPcHRpb25zLCBwYXRoOiBwYXRoUmVxIH1cblxuICB9XG5cbiAgb25TZXRTdGF0ZU9wdGlvbnMoKSB7XG5cbiAgICBpZighdGhpcy5pc1ZhbGlkKSByZXR1cm5cblxuICAgIGNvbnN0IHJlcVBhcmFtcyA9IHRoaXMuY29tcGlsZVJlcXVlc3QoKVxuXG4gICAgY29uc3QgZGIgPSBEYXRhYmFzZVN0b3JhZ2UuYWRhcHQodGhpcy5kYXRhYmFzZSlcbiAgICBjb25zdCB0eXBlID0gdGhpcy5kYXRhVHlwZSA9PT0gXCJBUlJBWVwiID8gRGF0YVR5cGUuQVJSQVkgOiBEYXRhVHlwZS5PQkpFQ1RcbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLnNldEFQSU9wdGlvbnMocmVxUGFyYW1zLmFwaU9wdGlvbnMsIHR5cGUsIGRiKVxuXG4gICAgdGhpcy5yZXF1ZXN0Rm9ybS5tYXJrQXNQcmlzdGluZSgpXG4gIH1cblxuICBvbkNsZWFyUmVjb3JkcygpIHtcbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLmNsZWFyUmVjb3JkcygpXG4gIH1cblxuICBvblJlZnJlc2hSZWNvcmRzKCkge1xuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UucmVmcmVzaERhdGEoKVxuICB9XG5cbiAgb25HZXRSZXF1ZXN0KCkge1xuICAgIHRoaXMucmVxdWVzdFR5cGUgPSAnR0VUJ1xuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UuZ2V0Q2xpZW50cygpXG4gIH1cblxuICBvbkNyZWF0ZVJlcXVlc3QoKSB7XG4gICAgdGhpcy5yZXF1ZXN0VHlwZSA9ICdQT1NUJ1xuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UuY3JlYXRlQ2xpZW50KHRoaXMuc2FtcGxlQ2xpZW50RGF0YSlcbiAgfVxuXG4gIG9uVXBkYXRlUmVxdWVzdCgpIHtcbiAgICB0aGlzLnJlcXVlc3RUeXBlID0gJ1BVVCdcbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLnVwZGF0ZUNsaWVudCh0aGlzLnNhbXBsZUNsaWVudERhdGEpXG4gIH1cblxuICBvbkRlbGV0ZVJlcXVlc3QoKSB7XG4gICAgdGhpcy5yZXF1ZXN0VHlwZSA9ICdERUxFVEUnXG4gICAgdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5kZWxldGVDbGllbnQodGhpcy5zYW1wbGVDbGllbnREYXRhKVxuICB9XG5cbiAgb25TdHJlYW1SZXF1ZXN0KCkge1xuXG4gICAgaWYoIXRoaXMuaXNWYWxpZCkgcmV0dXJuXG5cbiAgICBjb25zdCByZXFQYXJhbXMgPSB0aGlzLmNvbXBpbGVSZXF1ZXN0KClcblxuICAgIHJlcVBhcmFtcy5hcGlPcHRpb25zLnN0cmVhbSA9IHRydWVcblxuICAgIHRoaXMucmVxdWVzdFR5cGUgPSAnU1RSRUFNJ1xuXG4gICAgdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5zdHJlYW1SZXF1ZXN0KClcblxuICB9XG5cbiAgZXJyb3JIYW5kbGluZyhlcnI6IGFueSwgdHlwZTogc3RyaW5nKSB7IGNvbnNvbGUubG9nKGVyciwgdHlwZSlcbiAgICBpZih0eXBlID09PSAnR0VUJykgdGhpcy5HRVRfZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ1BPU1QnKSB0aGlzLlBPU1RfZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ1BVVCcpIHRoaXMuUFVUX2Vycm9yJC5uZXh0KGVyci5tZXNzYWdlKVxuICAgIGlmKHR5cGUgPT09ICdERUxFVEUnKSB0aGlzLkRFTEVURV9lcnJvciQubmV4dChlcnIubWVzc2FnZSlcbiAgICBpZih0eXBlID09PSAnU1RSRUFNJykgdGhpcy5TVFJFQU1fZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ1NUUkVBTV9BSScpIHRoaXMuU1RSRUFNX0FJX2Vycm9yJC5uZXh0KGVyci5tZXNzYWdlKVxuICB9XG5cbiAgb25TZWxlY3RBSVR5cGUodHlwZTogbnVtYmVyKSB7XG4gICAgdGhpcy5BSVR5cGUgPSB0eXBlXG4gIH1cblxuICBvbkNsZWFySGlzdG9yeSgpIHtcbiAgICB0aGlzLnByb21wdHMgPSBbXVxuICB9XG5cbn1cbiIsIjxkaXYgc3R5bGU9XCJtYXJnaW46IDJyZW07XCI+XG5cbiAgPGgyPlxuICAgIEhUVFAgUmVxdWVzdCBTdGF0ZSBNYW5hZ2VyXG4gIDwvaDI+XG5cbiAgPGRpdiBbZm9ybUdyb3VwXT1cInJlcXVlc3RGb3JtXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtO1wiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IC41cmVtXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5TdGF0ZSBEYXRhIFR5cGU8L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YXR5cGVcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFSUkFZXCI+QXJyYXk8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJPQkpFQ1RcIj5PYmplY3Q8L21hdC1vcHRpb24+XG4gICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogLjVyZW1cIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPkFkYXB0ZXIgKE1vZGVsKTwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJhZGFwdGVyXCIgI2FkYXB0ZXJTZWxlY3Q+XG4gICAgICAgICAgPG1hdC1vcHRpb24+Tm9uZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgYWRhcHRlciBvZiBzYW1wbGVBZGFwdG9yc1wiIFt2YWx1ZV09XCJhZGFwdGVyLnZhbHVlXCI+XG4gICAgICAgICAgICB7e2FkYXB0ZXIubGFiZWx9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPk1hcHBlciAoTW9kZWwpPC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm1hcHBlclwiICNtYXBwZXJTZWxlY3Q+XG4gICAgICAgICAgPG1hdC1vcHRpb24+Tm9uZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbWFwcGVyIG9mIHNhbXBsZU1hcHBlcnNcIiBbdmFsdWVdPVwibWFwcGVyLnZhbHVlXCI+XG4gICAgICAgICAgICB7e21hcHBlci5sYWJlbH19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IG1hcmdpbi1ib3R0b206IDJyZW07XCIgKm5nSWY9XCJhZGFwdGVyU2VsZWN0LnZhbHVlIHx8IG1hcHBlclNlbGVjdC52YWx1ZVwiPlxuICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MVwiIGNsYXNzPVwiYm94XCI+XG4gICAgICAgIDxoMz5BZGFwdGVyIChJbmNvbWluZyk8L2gzPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWRhcHRlclNlbGVjdC52YWx1ZTsgZWxzZSBOT19BREFQVEVSXCI+XG4gICAgICAgICAge3sgcHJvcHMoYWRhcHRlclNlbGVjdC52YWx1ZSkgfCBqc29uIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctdGVtcGxhdGUgI05PX0FEQVBURVI+Tm8gVHJhbnNmb3JtYXRpb248L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxXCIgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgPGgzPk1hcHBlciAoT3V0Z29pbmcpPC9oMz5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1hcHBlclNlbGVjdC52YWx1ZTsgZWxzZSBOT19NQVBQRVJcIj5cbiAgICAgICAgICB7eyBwcm9wcyhtYXBwZXJTZWxlY3QudmFsdWUpIHwganNvbiB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNOT19NQVBQRVI+Tm8gVHJhbnNmb3JtYXRpb248L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2PlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+UmVzdFBhdGggKC8gZGVsaW1pdGVkKTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJjbGllbnRzL2xpc3RcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXRoXCI+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJoZWFkZXJzXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhc2sgb2YgaGVhZGVycy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAuNXJlbVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+S2V5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cImF1dGhlbnRpY2F0aW9uXCIgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCI+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3R5bGU9XCJmbGV4OjFcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJzYW1wbGVcIiBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlbW92ZUhlYWRlcihpKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJhZGRIZWFkZXIoKVwiPkFkZCBIZWFkZXI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246Y29sdW1uOyBnYXA6IDFyZW07XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSAjZmFpbGVkU3RhdGU+UmV0cnkgb24gRmFpbGVkPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmFpbGVkU3RhdGUuY2hlY2tlZFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAuNXJlbTsgbWFyZ2luLXRvcDogMXJlbTtcIiBmb3JtR3JvdXBOYW1lPVwicmV0cnlcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+I29mIFRpbWVzPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwidGltZXNcIiB2YWx1ZT1cIjNcIj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5EZWxheSBVbnRpbCBOZXh0PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVsYXlcIiB2YWx1ZT1cIjNcIj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgI3BvbGxpbmdTdGF0ZT5Qb2xsaW5nPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwicG9sbGluZ1N0YXRlLmNoZWNrZWRcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW1cIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+I29mIFNlY29uZHM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJwb2xsaW5nXCIgdmFsdWU9XCIzXCI+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNEQlN0YXRlPkRhdGFiYXNlIFN0b3JhZ2U8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJEQlN0YXRlLmNoZWNrZWRcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogLjVyZW07IG1hcmdpbi10b3A6IDFyZW1cIiBmb3JtR3JvdXBOYW1lPVwiZGF0YWJhc2VcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+VGFibGUgTmFtZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwidGFibGVcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YWJsZVwiIHZhbHVlPVwiXCI+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+RXhwaXJlcyBJbjwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJleHBpcmVzSW5cIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIjFtXCI+T25lIE1pbnV0ZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIjFoXCI+T25lIEhvdXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCIxZFwiPk9uZSBEYXk8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTsgZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjFcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJvblNldFN0YXRlT3B0aW9ucygpXCIgW2Rpc2FibGVkXT1cIiFoYXNDaGFuZ2VkXCI+XG4gICAgICAgICAgU2V0IEFQSSBSZXF1ZXN0IE9wdGlvbnNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCIoZXJyb3IkIHwgYXN5bmMpIGFzIGVycm9yXCI+XG4gICAgICAgICAge3sgZXJyb3IgfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDFyZW07IG1hcmdpbi10b3A6IDJyZW07XCI+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgKm5nSWY9XCIoaXNQZW5kaW5nJCB8IGFzeW5jKVwiXG4gICAgPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICA8ZGl2ICpuZ0lmPVwicG9sbGluZ1N0YXRlLmNoZWNrZWRcIj5cbiAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJkZXRlcm1pbmF0ZVwiXG4gICAgICAqbmdJZj1cIiEoaXNQZW5kaW5nJCB8IGFzeW5jKSAmJiAodGhpcy5jb3VudGRvd24kIHwgYXN5bmMpIHx8IC0xID4gMFwiXG4gICAgICBbdmFsdWVdPVwiKHRoaXMuY291bnRkb3duJCB8IGFzeW5jKVwiXG4gICAgICA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCIgKm5nSWY9XCIoR0VUJCB8IGFzeW5jKSBhcyBkYXRhXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjE7XCI+Q1VSUkVOVCBTVEFURSAoe3sgZGF0YVR5cGUgfX0pPC9oMj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5sZW5ndGggPiAxXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5SZWNvcmRzPC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJzZWxlY3RlZFJlY29yZFwiIFtkaXNhYmxlZF09XCJkYXRhID09PSBudWxsICYmIGRhdGE/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJcIj5Ob25lPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGFcIiBbdmFsdWVdPVwiaXRlbVwiPlxuICAgICAgICAgICAge3tpdGVtLm5hbWUgfHwgKGl0ZW0uZmlyc3RfbmFtZSkgfCB0aXRsZWNhc2V9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiKGRhdGFPYnNlcnZhYmxlJCB8IGFzeW5jKSBhcyBkYXRhUmVjb3JkXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiKHNlbGVjdGVkUmVjb3JkJCB8IGFzeW5jKSBhcyByZWNvcmQ7IGVsc2UgTk9fUkVDT1JEXCI+XG4gICAgICAgIHt7IHJlY29yZCB8IGpzb24gfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlICNOT19SRUNPUkQ+Tm8gUmVjb3JkIFNlbGVjdGVkIGZyb20gU3RhdGU8L25nLXRlbXBsYXRlPlxuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImRhdGEgIT09IG51bGwgJiYgZGF0YT8ubGVuZ3RoID4gMDsgZWxzZSBOT19EQVRBXCI+XG4gICAgICAgIFN0YXRlIGNvbnRhaW5zIGEgVG90YWwgb2Yge3sgZGF0YS5sZW5ndGggfX0gUmVjb3Jkc1xuICAgICAgPC9zcGFuPlxuICAgICAgPG5nLXRlbXBsYXRlICNOT19EQVRBPk5vIFJlY29yZHM8L25nLXRlbXBsYXRlPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogLjVyZW07IHRleHQtYWxpZ246IGVuZDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0blwiIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwib25DbGVhclJlY29yZHMoKVwiPkNsZWFyPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cIm9uUmVmcmVzaFJlY29yZHMoKVwiIFtkaXNhYmxlZF09XCJoYXNDaGFuZ2VkXCI+UmVmcmVzaDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG5cblxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5HRVQgUmVxdWVzdCAoe3sgZGF0YVR5cGUgfX0pPC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uR2V0UmVxdWVzdCgpXCIgW2Rpc2FibGVkXT1cImhhc0NoYW5nZWRcIiBjbGFzcz1cImJ0blwiPlJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIihHRVRfZXJyb3IkIHwgYXN5bmMpIGFzIGdldF9lcnJvclwiIHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07XCI+XG4gICAgICA8bWF0LWVycm9yPnt7IGdldF9lcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICA8IS0tIDxkaXYgW2lubmVySFRNTF09XCIoR0VUJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIihHRVQkIHwgYXN5bmMpIGFzIGdldERhdGFcIj57eyBnZXREYXRhIHwganNvbiB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5QT1NUIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25DcmVhdGVSZXF1ZXN0KClcIiBbZGlzYWJsZWRdPVwiaGFzQ2hhbmdlZFwiIGNsYXNzPVwiYnRuXCI+UmVxdWVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKFBPU1RfZXJyb3IkIHwgYXN5bmMpIGFzIHBvc3RfZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBwb3N0X2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cbiAgICAgIDwhLS0gPGRpdiBbaW5uZXJIVE1MXT1cIihQT1NUJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIihQT1NUJCB8IGFzeW5jKSBhcyBwb3N0RGF0YVwiPnt7IHBvc3REYXRhIHwganNvbiB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5QVVQgUmVxdWVzdDwvaDI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJvblVwZGF0ZVJlcXVlc3QoKVwiIFtkaXNhYmxlZF09XCJoYXNDaGFuZ2VkXCIgY2xhc3M9XCJidG5cIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIoUFVUX2Vycm9yJCB8IGFzeW5jKSBhcyBwdXRfZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBwdXRfZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxuICAgICAgPCEtLSA8ZGl2IFtpbm5lckhUTUxdPVwiKFBVVCQgfCBhc3luYykgfCBqc29udlwiPjwvZGl2PiAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIoUFVUJCB8IGFzeW5jKSBhcyBwdXREYXRhXCI+e3sgcHV0RGF0YSB8IGpzb24gfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxXCI+REVMRVRFIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25EZWxldGVSZXF1ZXN0KClcIiBbZGlzYWJsZWRdPVwiaGFzQ2hhbmdlZFwiIGNsYXNzPVwiYnRuXCI+UmVxdWVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKERFTEVURV9lcnJvciQgfCBhc3luYykgYXMgZGVsZXRlX2Vycm9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgIDxtYXQtZXJyb3I+e3sgZGVsZXRlX2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cbiAgICAgIDwhLS0gPGRpdiBbaW5uZXJIVE1MXT1cIihERUxFVEUkIHwgYXN5bmMpIHwganNvbnZcIj48L2Rpdj4gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiKERFTEVURSQgfCBhc3luYykgYXMgZGVsZXRlRGF0YVwiPnt7IGRlbGV0ZURhdGEgfCBqc29uIH19PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZsZXg6MVwiPlN0cmVhbWluZyBHRVQgUmVxdWVzdDwvaDI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJvblN0cmVhbVJlcXVlc3QoKVwiIGNsYXNzPVwiYnRuXCIgW2Rpc2FibGVkXT1cImhhc0NoYW5nZWRcIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIoU1RSRUFNX2Vycm9yJCB8IGFzeW5jKSBhcyBzdHJlYW1fZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBzdHJlYW1fZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxuICAgICAgPGRpdiAqbmdJZj1cIihTVFJFQU0kIHwgYXN5bmMpIGFzIGRhdGFcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImlkXCI+XG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBJRCA8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LmlkfX0gPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibmFtZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRmlyc3QgTmFtZSA8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Lm5hbWV9fSA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYXN0TmFtZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gTGFzdCBOYW1lIDwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQubGFzdE5hbWV9fSA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhZ2VcIj5cbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFnZSA8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LmFnZX19IDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,67 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { DataType, DatabaseStorage } from '../../../models';
3
+ import { HTTPManagerStateService, ApiRequest, RequestOptions } from '../../../services';
4
+ import { ClientInfo } from '../../request-manager-demo/models/sample-client-info';
5
+ import { ClientInfoMapper } from '../../request-manager-demo/models/sample-mapper-client-info';
6
+ import * as i0 from "@angular/core";
7
+ export class StateManagerDemoService extends HTTPManagerStateService {
8
+ constructor() {
9
+ super(ApiRequest.adapt({
10
+ server: "",
11
+ path: [],
12
+ headers: {},
13
+ adapter: ClientInfo.adapt,
14
+ mapper: ClientInfoMapper.adapt,
15
+ stream: false,
16
+ }), DataType.ARRAY, DatabaseStorage.adapt());
17
+ }
18
+ setAPIOptions(apiOptions, dataType, database) {
19
+ this.setApiRequestOptions(apiOptions, dataType, database);
20
+ }
21
+ getClients() {
22
+ // const headers = {
23
+ // auth: "sample-auth-token"
24
+ // }
25
+ // const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
26
+ this.fetchRecords();
27
+ }
28
+ createClient(data) {
29
+ // const headers = {
30
+ // auth: "sample-auth-token"
31
+ // }
32
+ // const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
33
+ this.createRecord(data);
34
+ }
35
+ updateClient(data) {
36
+ // const headers = {
37
+ // auth: "sample-auth-token"
38
+ // }
39
+ data.id = 1031;
40
+ const sampleOptions = RequestOptions.adapt({ path: [data.id] });
41
+ this.updateRecord(data, sampleOptions);
42
+ }
43
+ deleteClient(data) {
44
+ // const headers = {
45
+ // auth: "sample-auth-token"
46
+ // }
47
+ data.id = 1031;
48
+ const sampleOptions = RequestOptions.adapt({ path: [data.id] });
49
+ this.deleteRecord(sampleOptions);
50
+ }
51
+ streamRequest() {
52
+ const headers = {
53
+ auth: "sample-auth-token"
54
+ };
55
+ // const sampleOptions = RequestOptions.adapt({ path: [1], headers })
56
+ this.fetchStream();
57
+ }
58
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StateManagerDemoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
59
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StateManagerDemoService, providedIn: 'root' }); }
60
+ }
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StateManagerDemoService, decorators: [{
62
+ type: Injectable,
63
+ args: [{
64
+ providedIn: 'root'
65
+ }]
66
+ }], ctorParameters: () => [] });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtbWFuYWdlci1kZW1vLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vL3NlcnZpY2VzL3N0YXRlLW1hbmFnZXItZGVtby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNsRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQzs7QUFLL0YsTUFBTSxPQUFPLHVCQUF3QixTQUFRLHVCQUE0QjtJQUV2RTtRQUNFLEtBQUssQ0FDSCxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ2YsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQ3pCLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLO1lBQzlCLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxLQUFLLEVBQ2QsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUN4QixDQUFBO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFzQixFQUFFLFFBQWtCLEVBQUUsUUFBMEI7UUFDbEYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELFVBQVU7UUFFUixvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLElBQUk7UUFDSiwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBRXJCLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBUztRQUVwQixvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLElBQUk7UUFFSiwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV6QixDQUFDO0lBRUQsWUFBWSxDQUFDLElBQWdCO1FBRTNCLG9CQUFvQjtRQUNwQiw4QkFBOEI7UUFDOUIsSUFBSTtRQUNKLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQ2QsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFFeEMsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFnQjtRQUUzQixvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLElBQUk7UUFFSixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUNkLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFbEMsQ0FBQztJQUVELGFBQWE7UUFFWCxNQUFNLE9BQU8sR0FBRztZQUNkLElBQUksRUFBRSxtQkFBbUI7U0FDMUIsQ0FBQTtRQUVELHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFFcEIsQ0FBQzsrR0ExRVUsdUJBQXVCO21IQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTs7NEZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRGF0YVR5cGUsIERhdGFiYXNlU3RvcmFnZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBIVFRQTWFuYWdlclN0YXRlU2VydmljZSwgQXBpUmVxdWVzdCwgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5cbmltcG9ydCB7IENsaWVudEluZm8gfSBmcm9tICcuLi8uLi9yZXF1ZXN0LW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLWNsaWVudC1pbmZvJztcbmltcG9ydCB7IENsaWVudEluZm9NYXBwZXIgfSBmcm9tICcuLi8uLi9yZXF1ZXN0LW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLW1hcHBlci1jbGllbnQtaW5mbyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlIGV4dGVuZHMgSFRUUE1hbmFnZXJTdGF0ZVNlcnZpY2U8YW55PiB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBBcGlSZXF1ZXN0LmFkYXB0KHtcbiAgICAgICAgc2VydmVyOiBcIlwiLFxuICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGFkYXB0ZXI6IENsaWVudEluZm8uYWRhcHQsXG4gICAgICAgIG1hcHBlcjogQ2xpZW50SW5mb01hcHBlci5hZGFwdCxcbiAgICAgICAgc3RyZWFtOiBmYWxzZSxcbiAgICAgIH0pLFxuICAgICAgRGF0YVR5cGUuQVJSQVksXG4gICAgICBEYXRhYmFzZVN0b3JhZ2UuYWRhcHQoKVxuICAgIClcbiAgfVxuXG4gIHNldEFQSU9wdGlvbnMoYXBpT3B0aW9uczogQXBpUmVxdWVzdCwgZGF0YVR5cGU6IERhdGFUeXBlLCBkYXRhYmFzZT86IERhdGFiYXNlU3RvcmFnZSkge1xuICAgIHRoaXMuc2V0QXBpUmVxdWVzdE9wdGlvbnMoYXBpT3B0aW9ucywgZGF0YVR5cGUsIGRhdGFiYXNlKVxuICB9XG5cbiAgZ2V0Q2xpZW50cygpIHtcblxuICAgIC8vIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLy8gICBhdXRoOiBcInNhbXBsZS1hdXRoLXRva2VuXCJcbiAgICAvLyB9XG4gICAgLy8gY29uc3Qgc2FtcGxlT3B0aW9ucyA9IFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogW1wiaWRcIiwgMTJdLCBoZWFkZXJzLCBzYW1wbGU6IHRydWUgfSlcbiAgICB0aGlzLmZldGNoUmVjb3JkcygpXG5cbiAgfVxuXG4gIGNyZWF0ZUNsaWVudChkYXRhOiBhbnkpIHtcblxuICAgIC8vIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLy8gICBhdXRoOiBcInNhbXBsZS1hdXRoLXRva2VuXCJcbiAgICAvLyB9XG5cbiAgICAvLyBjb25zdCBzYW1wbGVPcHRpb25zID0gUmVxdWVzdE9wdGlvbnMuYWRhcHQoeyBwYXRoOiBbXCJpZFwiLCAxMl0sIGhlYWRlcnMsIHNhbXBsZTogdHJ1ZSB9KVxuICAgIHRoaXMuY3JlYXRlUmVjb3JkKGRhdGEpXG5cbiAgfVxuXG4gIHVwZGF0ZUNsaWVudChkYXRhOiBDbGllbnRJbmZvKSB7XG5cbiAgICAvLyBjb25zdCBoZWFkZXJzID0ge1xuICAgIC8vICAgYXV0aDogXCJzYW1wbGUtYXV0aC10b2tlblwiXG4gICAgLy8gfVxuICAgIGRhdGEuaWQgPSAxMDMxXG4gICAgY29uc3Qgc2FtcGxlT3B0aW9ucyA9IFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogW2RhdGEuaWRdIH0pXG4gICAgdGhpcy51cGRhdGVSZWNvcmQoZGF0YSwgc2FtcGxlT3B0aW9ucylcblxuICB9XG5cbiAgZGVsZXRlQ2xpZW50KGRhdGE6IENsaWVudEluZm8pIHtcblxuICAgIC8vIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLy8gICBhdXRoOiBcInNhbXBsZS1hdXRoLXRva2VuXCJcbiAgICAvLyB9XG5cbiAgICBkYXRhLmlkID0gMTAzMVxuICAgIGNvbnN0IHNhbXBsZU9wdGlvbnMgPSBSZXF1ZXN0T3B0aW9ucy5hZGFwdCh7IHBhdGg6IFtkYXRhLmlkXSB9KVxuICAgIHRoaXMuZGVsZXRlUmVjb3JkKHNhbXBsZU9wdGlvbnMpXG5cbiAgfVxuXG4gIHN0cmVhbVJlcXVlc3QoKSB7XG5cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgYXV0aDogXCJzYW1wbGUtYXV0aC10b2tlblwiXG4gICAgfVxuXG4gICAgLy8gY29uc3Qgc2FtcGxlT3B0aW9ucyA9IFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogWzFdLCBoZWFkZXJzIH0pXG4gICAgdGhpcy5mZXRjaFN0cmVhbSgpXG5cbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export * from "./services/index";
2
+ export * from "./interceptors/index";
3
+ export * from "./models/index";
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0JBQWtCLENBQUE7QUFDaEMsY0FBYyxzQkFBc0IsQ0FBQTtBQUNwQyxjQUFjLGdCQUFnQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vc2VydmljZXMvaW5kZXhcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJjZXB0b3JzL2luZGV4XCJcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVscy9pbmRleFwiXG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class WithCredentialsInterceptor {
4
+ intercept(req, next) {
5
+ req = req.clone({ withCredentials: true });
6
+ return next.handle(req);
7
+ }
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WithCredentialsInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WithCredentialsInterceptor }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WithCredentialsInterceptor, decorators: [{
12
+ type: Injectable
13
+ }] });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGVudGlhbHMuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ludGVyY2VwdG9ycy9jcmVkZW50aWFscy5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0zQyxNQUFNLE9BQU8sMEJBQTBCO0lBRXJDLFNBQVMsQ0FBQyxHQUFxQixFQUFFLElBQWlCO1FBRzlDLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFFMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7K0dBUlUsMEJBQTBCO21IQUExQiwwQkFBMEI7OzRGQUExQiwwQkFBMEI7a0JBRHRDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwRXZlbnQsIEh0dHBJbnRlcmNlcHRvciwgSHR0cEhhbmRsZXIsIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXaXRoQ3JlZGVudGlhbHNJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG5cbiAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOlxuICAgIE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcblxuICAgICAgcmVxID0gcmVxLmNsb25lKHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG5cbiAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ export * from "./models/error-settings.model";
2
+ export * from "./credentials.interceptor";
3
+ export * from "./request-header.interceptor";
4
+ export * from "./request-error.interceptor";
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ludGVyY2VwdG9ycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbHMvZXJyb3Itc2V0dGluZ3MubW9kZWxcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vY3JlZGVudGlhbHMuaW50ZXJjZXB0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcXVlc3QtaGVhZGVyLmludGVyY2VwdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXF1ZXN0LWVycm9yLmludGVyY2VwdG9yXCI7XG4iXX0=
@@ -0,0 +1,10 @@
1
+ export class ErrorDisplaySettings {
2
+ constructor(displayTime = 3 * 1000, position = 'top') {
3
+ this.displayTime = displayTime;
4
+ this.position = position;
5
+ }
6
+ static adapt(item) {
7
+ return new ErrorDisplaySettings((item?.displayTime) ? item.displayTime * 1000 : 3 * 1000, item?.position);
8
+ }
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Itc2V0dGluZ3MubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ludGVyY2VwdG9ycy9tb2RlbHMvZXJyb3Itc2V0dGluZ3MubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxPQUFPLG9CQUFvQjtJQUUvQixZQUNTLGNBQWMsQ0FBQyxHQUFHLElBQUksRUFDdEIsV0FBVyxLQUFLO1FBRGhCLGdCQUFXLEdBQVgsV0FBVyxDQUFXO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVE7SUFDdEIsQ0FBQztJQUVKLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBVTtRQUVyQixPQUFPLElBQUksb0JBQW9CLENBQzdCLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFDeEQsSUFBSSxFQUFFLFFBQVEsQ0FDZixDQUFBO0lBRUgsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBFcnJvckRpc3BsYXlTZXR0aW5nc0ludGVyZmFjZSB7XG4gIGRpc3BsYXlUaW1lOiBudW1iZXJcbiAgcG9zaXRpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JEaXNwbGF5U2V0dGluZ3MgaW1wbGVtZW50cyBFcnJvckRpc3BsYXlTZXR0aW5nc0ludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpc3BsYXlUaW1lID0gMyAqIDEwMDAsXG4gICAgcHVibGljIHBvc2l0aW9uID0gJ3RvcCdcbiAgKSB7fVxuXG4gIHN0YXRpYyBhZGFwdChpdGVtPzogYW55KTogRXJyb3JEaXNwbGF5U2V0dGluZ3Mge1xuXG4gICAgcmV0dXJuIG5ldyBFcnJvckRpc3BsYXlTZXR0aW5ncyhcbiAgICAgIChpdGVtPy5kaXNwbGF5VGltZSkgPyBpdGVtLmRpc3BsYXlUaW1lICogMTAwMCA6IDMgKiAxMDAwLFxuICAgICAgaXRlbT8ucG9zaXRpb24sXG4gICAgKVxuXG4gIH1cblxufVxuIl19
@@ -0,0 +1,47 @@
1
+ import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export const PROXY_CONFIG = new InjectionToken('PROXY_CONFIG');
4
+ export class ProxyDebuggerInterceptor {
5
+ constructor(proxyConfig) {
6
+ this.proxyConfig = proxyConfig;
7
+ }
8
+ intercept(req, next) {
9
+ if (!this.proxyConfig) {
10
+ return next.handle(req);
11
+ }
12
+ const headers = req.headers.keys().reduce((acc, key) => {
13
+ acc[key] = req.headers.get(key) || '';
14
+ return acc;
15
+ }, {});
16
+ for (const proxyPath in this.proxyConfig) {
17
+ if (this.proxyConfig.hasOwnProperty(proxyPath)) {
18
+ const proxyDetails = this.proxyConfig[proxyPath];
19
+ const regex = new RegExp('^' + proxyPath.replace('/', '').replace('*', '(.*)'));
20
+ if (regex.test(req.url)) {
21
+ const target = proxyDetails.target;
22
+ const endpoint = req.url.replace(regex, '$1');
23
+ const actualPath = target + '/' + endpoint;
24
+ console.log('Request Proxied:', {
25
+ requestUrl: req.url,
26
+ requestPayload: req.body,
27
+ headers: headers,
28
+ proxyPath: proxyPath,
29
+ actualPath: actualPath,
30
+ });
31
+ }
32
+ }
33
+ }
34
+ return next.handle(req);
35
+ }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProxyDebuggerInterceptor, deps: [{ token: PROXY_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
37
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProxyDebuggerInterceptor }); }
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProxyDebuggerInterceptor, decorators: [{
40
+ type: Injectable
41
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
42
+ type: Optional
43
+ }, {
44
+ type: Inject,
45
+ args: [PROXY_CONFIG]
46
+ }] }] });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHktZGVidWdnZXIuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ludGVyY2VwdG9ycy9wcm94eS1kZWJ1Z2dlci5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUk3RSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQXNCLGNBQWMsQ0FBQyxDQUFDO0FBR3BGLE1BQU0sT0FBTyx3QkFBd0I7SUFFbkMsWUFBc0QsV0FBZ0M7UUFBaEMsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO0lBQUcsQ0FBQztJQUUxRixTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUVoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDckQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUE0QixDQUFDLENBQUM7UUFFakMsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUVoRixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQ25DLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDOUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7b0JBRTNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUU7d0JBQzlCLFVBQVUsRUFBRSxHQUFHLENBQUMsR0FBRzt3QkFDbkIsY0FBYyxFQUFFLEdBQUcsQ0FBQyxJQUFJO3dCQUN4QixPQUFPLEVBQUUsT0FBTzt3QkFDaEIsU0FBUyxFQUFFLFNBQVM7d0JBQ3BCLFVBQVUsRUFBRSxVQUFVO3FCQUN2QixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7K0dBckNVLHdCQUF3QixrQkFFSCxZQUFZO21IQUZqQyx3QkFBd0I7OzRGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVU7OzBCQUdJLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwSGFuZGxlciwgSHR0cEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgY29uc3QgUFJPWFlfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFJlY29yZDxzdHJpbmcsIGFueT4+KCdQUk9YWV9DT05GSUcnKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFByb3h5RGVidWdnZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChQUk9YWV9DT05GSUcpIHByaXZhdGUgcHJveHlDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pIHt9XG5cbiAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG5cbiAgICBpZiAoIXRoaXMucHJveHlDb25maWcpIHtcbiAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycy5rZXlzKCkucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSByZXEuaGVhZGVycy5nZXQoa2V5KSB8fCAnJztcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG5cbiAgICBmb3IgKGNvbnN0IHByb3h5UGF0aCBpbiB0aGlzLnByb3h5Q29uZmlnKSB7XG4gICAgICBpZiAodGhpcy5wcm94eUNvbmZpZy5oYXNPd25Qcm9wZXJ0eShwcm94eVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHByb3h5RGV0YWlscyA9IHRoaXMucHJveHlDb25maWdbcHJveHlQYXRoXTtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIHByb3h5UGF0aC5yZXBsYWNlKCcvJywgJycpLnJlcGxhY2UoJyonLCAnKC4qKScpKTtcblxuICAgICAgICBpZiAocmVnZXgudGVzdChyZXEudXJsKSkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHByb3h5RGV0YWlscy50YXJnZXQ7XG4gICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSByZXEudXJsLnJlcGxhY2UocmVnZXgsICckMScpO1xuICAgICAgICAgIGNvbnN0IGFjdHVhbFBhdGggPSB0YXJnZXQgKyAnLycgKyBlbmRwb2ludDtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXF1ZXN0IFByb3hpZWQ6Jywge1xuICAgICAgICAgICAgcmVxdWVzdFVybDogcmVxLnVybCxcbiAgICAgICAgICAgIHJlcXVlc3RQYXlsb2FkOiByZXEuYm9keSxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICBwcm94eVBhdGg6IHByb3h5UGF0aCxcbiAgICAgICAgICAgIGFjdHVhbFBhdGg6IGFjdHVhbFBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcbiAgfVxufVxuIl19