angular-odata 0.126.0 → 0.128.0

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 (283) hide show
  1. package/esm2022/lib/annotations.mjs +140 -0
  2. package/esm2022/lib/api.mjs +211 -166
  3. package/esm2022/lib/cache/cache.mjs +1 -1
  4. package/esm2022/lib/cache/memory.mjs +1 -1
  5. package/esm2022/lib/client.mjs +8 -48
  6. package/esm2022/lib/constants.mjs +4 -1
  7. package/esm2022/lib/index.mjs +3 -1
  8. package/esm2022/lib/loaders.mjs +23 -17
  9. package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +95 -0
  10. package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +27 -0
  11. package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +24 -0
  12. package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +37 -0
  13. package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +94 -0
  14. package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +7 -0
  15. package/esm2022/lib/metadata/csdl/csdl-reference.mjs +23 -0
  16. package/esm2022/lib/metadata/csdl/csdl-schema.mjs +39 -0
  17. package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +15 -0
  18. package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +70 -0
  19. package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +92 -0
  20. package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +15 -0
  21. package/esm2022/lib/metadata/index.mjs +3 -0
  22. package/esm2022/lib/metadata/metadata.mjs +14 -0
  23. package/esm2022/lib/metadata/parser.mjs +563 -0
  24. package/esm2022/lib/models/collection.mjs +202 -207
  25. package/esm2022/lib/models/model.mjs +48 -52
  26. package/esm2022/lib/models/options.mjs +172 -137
  27. package/esm2022/lib/module.mjs +21 -8
  28. package/esm2022/lib/options.mjs +2 -1
  29. package/esm2022/lib/resources/index.mjs +2 -2
  30. package/esm2022/lib/resources/options.mjs +56 -0
  31. package/esm2022/lib/resources/path/handlers.mjs +14 -4
  32. package/esm2022/lib/resources/path/segments.mjs +29 -11
  33. package/esm2022/lib/resources/query/builder.mjs +14 -2
  34. package/esm2022/lib/resources/query/expressions/apply.mjs +236 -0
  35. package/esm2022/lib/resources/query/expressions/base.mjs +1 -1
  36. package/esm2022/lib/resources/query/expressions/compute.mjs +2 -2
  37. package/esm2022/lib/resources/query/expressions/count.mjs +6 -6
  38. package/esm2022/lib/resources/query/expressions/expand.mjs +7 -7
  39. package/esm2022/lib/resources/query/expressions/filter.mjs +6 -6
  40. package/esm2022/lib/resources/query/expressions/index.mjs +2 -1
  41. package/esm2022/lib/resources/query/expressions/orderby.mjs +3 -3
  42. package/esm2022/lib/resources/query/expressions/search.mjs +6 -6
  43. package/esm2022/lib/resources/query/expressions/select.mjs +6 -2
  44. package/esm2022/lib/resources/query/expressions/syntax.mjs +161 -8
  45. package/esm2022/lib/resources/query/handlers.mjs +89 -54
  46. package/esm2022/lib/resources/query/options.mjs +91 -77
  47. package/esm2022/lib/resources/request.mjs +5 -5
  48. package/esm2022/lib/resources/resource.mjs +118 -88
  49. package/esm2022/lib/resources/response.mjs +174 -0
  50. package/esm2022/lib/resources/types/action.mjs +29 -26
  51. package/esm2022/lib/resources/types/batch.mjs +18 -16
  52. package/esm2022/lib/resources/types/count.mjs +7 -7
  53. package/esm2022/lib/resources/types/entity-set.mjs +38 -25
  54. package/esm2022/lib/resources/types/entity.mjs +14 -11
  55. package/esm2022/lib/resources/types/function.mjs +25 -28
  56. package/esm2022/lib/resources/types/metadata.mjs +9 -5
  57. package/esm2022/lib/resources/types/navigation-property.mjs +37 -31
  58. package/esm2022/lib/resources/types/property.mjs +32 -50
  59. package/esm2022/lib/resources/types/reference.mjs +6 -7
  60. package/esm2022/lib/resources/types/singleton.mjs +11 -7
  61. package/esm2022/lib/resources/types/value.mjs +16 -12
  62. package/esm2022/lib/schema/callable.mjs +10 -10
  63. package/esm2022/lib/schema/element.mjs +15 -9
  64. package/esm2022/lib/schema/entity-container.mjs +4 -2
  65. package/esm2022/lib/schema/enum-type.mjs +6 -7
  66. package/esm2022/lib/schema/index.mjs +2 -1
  67. package/esm2022/lib/schema/parsers/callable.mjs +10 -7
  68. package/esm2022/lib/schema/parsers/edm.mjs +6 -4
  69. package/esm2022/lib/schema/parsers/enum-type.mjs +15 -8
  70. package/esm2022/lib/schema/parsers/structured-type.mjs +66 -55
  71. package/esm2022/lib/schema/schema.mjs +18 -34
  72. package/esm2022/lib/schema/singleton.mjs +9 -0
  73. package/esm2022/lib/schema/structured-type.mjs +18 -23
  74. package/esm2022/lib/services/base.mjs +4 -4
  75. package/esm2022/lib/services/entity-set.mjs +12 -2
  76. package/esm2022/lib/services/entity.mjs +2 -2
  77. package/esm2022/lib/services/factory.mjs +22 -11
  78. package/esm2022/lib/services/singleton.mjs +8 -2
  79. package/esm2022/lib/settings.mjs +7 -99
  80. package/esm2022/lib/types.mjs +12 -1
  81. package/esm2022/lib/utils/http.mjs +8 -6
  82. package/fesm2022/angular-odata.mjs +7413 -6579
  83. package/fesm2022/angular-odata.mjs.map +1 -1
  84. package/lib/{resources/responses/annotations.d.ts → annotations.d.ts} +3 -2
  85. package/lib/api.d.ts +29 -26
  86. package/lib/cache/memory.d.ts +1 -1
  87. package/lib/client.d.ts +0 -20
  88. package/lib/constants.d.ts +3 -0
  89. package/lib/index.d.ts +1 -0
  90. package/lib/loaders.d.ts +7 -1
  91. package/lib/metadata/csdl/csdl-annotation.d.ts +123 -0
  92. package/lib/metadata/csdl/csdl-entity-container.d.ts +26 -0
  93. package/lib/metadata/csdl/csdl-entity-set.d.ts +20 -0
  94. package/lib/metadata/csdl/csdl-enum-type.d.ts +29 -0
  95. package/lib/metadata/csdl/csdl-function-action.d.ts +105 -0
  96. package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +8 -0
  97. package/lib/metadata/csdl/csdl-reference.d.ts +30 -0
  98. package/lib/metadata/csdl/csdl-schema.d.ts +34 -0
  99. package/lib/metadata/csdl/csdl-singleton.d.ts +16 -0
  100. package/lib/metadata/csdl/csdl-structural-property.d.ts +70 -0
  101. package/lib/metadata/csdl/csdl-structured-type.d.ts +73 -0
  102. package/lib/metadata/csdl/csdl-type-definition.d.ts +22 -0
  103. package/lib/metadata/index.d.ts +2 -0
  104. package/lib/metadata/metadata.d.ts +10 -0
  105. package/lib/{resources/responses/metadata.d.ts → metadata/parser.d.ts} +19 -7
  106. package/lib/models/collection.d.ts +23 -12
  107. package/lib/models/model.d.ts +19 -19
  108. package/lib/models/options.d.ts +43 -27
  109. package/lib/module.d.ts +2 -1
  110. package/lib/options.d.ts +5 -0
  111. package/lib/resources/index.d.ts +1 -1
  112. package/lib/resources/{responses/options.d.ts → options.d.ts} +2 -2
  113. package/lib/resources/path/handlers.d.ts +4 -2
  114. package/lib/resources/path/segments.d.ts +13 -1
  115. package/lib/resources/query/builder.d.ts +6 -5
  116. package/lib/resources/query/expressions/apply.d.ts +125 -0
  117. package/lib/resources/query/expressions/base.d.ts +1 -1
  118. package/lib/resources/query/expressions/compute.d.ts +4 -4
  119. package/lib/resources/query/expressions/count.d.ts +3 -3
  120. package/lib/resources/query/expressions/expand.d.ts +8 -8
  121. package/lib/resources/query/expressions/filter.d.ts +3 -3
  122. package/lib/resources/query/expressions/index.d.ts +1 -0
  123. package/lib/resources/query/expressions/orderby.d.ts +7 -6
  124. package/lib/resources/query/expressions/search.d.ts +2 -2
  125. package/lib/resources/query/expressions/select.d.ts +4 -3
  126. package/lib/resources/query/expressions/syntax.d.ts +77 -4
  127. package/lib/resources/query/handlers.d.ts +32 -9
  128. package/lib/resources/query/options.d.ts +20 -10
  129. package/lib/resources/resource.d.ts +32 -16
  130. package/lib/resources/{responses/response.d.ts → response.d.ts} +17 -5
  131. package/lib/resources/types/action.d.ts +12 -10
  132. package/lib/resources/types/batch.d.ts +12 -6
  133. package/lib/resources/types/count.d.ts +1 -5
  134. package/lib/resources/types/entity-set.d.ts +13 -6
  135. package/lib/resources/types/entity.d.ts +3 -4
  136. package/lib/resources/types/function.d.ts +11 -11
  137. package/lib/resources/types/metadata.d.ts +1 -1
  138. package/lib/resources/types/navigation-property.d.ts +13 -7
  139. package/lib/resources/types/property.d.ts +15 -8
  140. package/lib/resources/types/reference.d.ts +2 -4
  141. package/lib/resources/types/singleton.d.ts +4 -6
  142. package/lib/resources/types/value.d.ts +2 -6
  143. package/lib/schema/callable.d.ts +5 -7
  144. package/lib/schema/element.d.ts +11 -4
  145. package/lib/schema/entity-container.d.ts +2 -0
  146. package/lib/schema/enum-type.d.ts +4 -7
  147. package/lib/schema/index.d.ts +1 -0
  148. package/lib/schema/parsers/callable.d.ts +7 -8
  149. package/lib/schema/parsers/enum-type.d.ts +15 -5
  150. package/lib/schema/parsers/structured-type.d.ts +6 -8
  151. package/lib/schema/schema.d.ts +6 -9
  152. package/lib/schema/singleton.d.ts +10 -0
  153. package/lib/schema/structured-type.d.ts +5 -8
  154. package/lib/services/entity-set.d.ts +7 -3
  155. package/lib/services/factory.d.ts +14 -2
  156. package/lib/services/singleton.d.ts +4 -2
  157. package/lib/settings.d.ts +0 -10
  158. package/lib/types.d.ts +23 -3
  159. package/lib/utils/http.d.ts +1 -1
  160. package/package.json +5 -1
  161. package/schematics/apigen/angular/api-config.d.ts +15 -0
  162. package/schematics/apigen/angular/api-config.js +34 -0
  163. package/schematics/apigen/angular/api-config.js.map +1 -0
  164. package/schematics/apigen/angular/base.d.ts +51 -0
  165. package/schematics/apigen/angular/base.js +200 -0
  166. package/schematics/apigen/angular/base.js.map +1 -0
  167. package/schematics/apigen/angular/entity.d.ts +24 -0
  168. package/schematics/apigen/angular/entity.js +71 -0
  169. package/schematics/apigen/angular/entity.js.map +1 -0
  170. package/schematics/apigen/angular/enum.d.ts +25 -0
  171. package/schematics/apigen/angular/enum.js +56 -0
  172. package/schematics/apigen/angular/enum.js.map +1 -0
  173. package/schematics/apigen/angular/import.d.ts +6 -0
  174. package/schematics/apigen/angular/import.js +18 -0
  175. package/schematics/apigen/angular/import.js.map +1 -0
  176. package/schematics/apigen/angular/module.d.ts +18 -0
  177. package/schematics/apigen/angular/module.js +41 -0
  178. package/schematics/apigen/angular/module.js.map +1 -0
  179. package/schematics/apigen/angular/service.d.ts +20 -0
  180. package/schematics/apigen/angular/service.js +76 -0
  181. package/schematics/apigen/angular/service.js.map +1 -0
  182. package/schematics/apigen/files/api-config/__fileName__.ts +9 -0
  183. package/schematics/apigen/files/entity/__fileName__.ts +7 -0
  184. package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +18 -0
  185. package/schematics/apigen/files/entityset-service/__fileName__.ts +27 -0
  186. package/schematics/apigen/files/enum/__fileName__.ts +4 -0
  187. package/schematics/apigen/files/index/__fileName__.ts +2 -0
  188. package/schematics/apigen/files/module/__fileName__.ts +9 -0
  189. package/schematics/apigen/files/singleton-service/__fileName__.ts +18 -0
  190. package/schematics/apigen/index.d.ts +3 -0
  191. package/schematics/apigen/index.js +106 -0
  192. package/schematics/apigen/index.js.map +1 -0
  193. package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +120 -0
  194. package/schematics/apigen/metadata/csdl/csdl-annotation.js +98 -0
  195. package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -0
  196. package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +26 -0
  197. package/schematics/apigen/metadata/csdl/csdl-entity-container.js +30 -0
  198. package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -0
  199. package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +20 -0
  200. package/schematics/apigen/metadata/csdl/csdl-entity-set.js +26 -0
  201. package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -0
  202. package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +28 -0
  203. package/schematics/apigen/metadata/csdl/csdl-enum-type.js +33 -0
  204. package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -0
  205. package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +103 -0
  206. package/schematics/apigen/metadata/csdl/csdl-function-action.js +84 -0
  207. package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -0
  208. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +8 -0
  209. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +11 -0
  210. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -0
  211. package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +30 -0
  212. package/schematics/apigen/metadata/csdl/csdl-reference.js +29 -0
  213. package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -0
  214. package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +32 -0
  215. package/schematics/apigen/metadata/csdl/csdl-schema.js +26 -0
  216. package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -0
  217. package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +18 -0
  218. package/schematics/apigen/metadata/csdl/csdl-singleton.js +25 -0
  219. package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -0
  220. package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +63 -0
  221. package/schematics/apigen/metadata/csdl/csdl-structural-property.js +50 -0
  222. package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -0
  223. package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +64 -0
  224. package/schematics/apigen/metadata/csdl/csdl-structured-type.js +71 -0
  225. package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -0
  226. package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +22 -0
  227. package/schematics/apigen/metadata/csdl/csdl-type-definition.js +19 -0
  228. package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -0
  229. package/schematics/apigen/metadata/index.d.ts +1 -0
  230. package/schematics/apigen/metadata/index.js +18 -0
  231. package/schematics/apigen/metadata/index.js.map +1 -0
  232. package/schematics/apigen/metadata/metadata.d.ts +11 -0
  233. package/schematics/apigen/metadata/metadata.js +30 -0
  234. package/schematics/apigen/metadata/metadata.js.map +1 -0
  235. package/schematics/apigen/metadata/parser.d.ts +110 -0
  236. package/schematics/apigen/metadata/parser.js +568 -0
  237. package/schematics/apigen/metadata/parser.js.map +1 -0
  238. package/schematics/apigen/schema.d.ts +8 -0
  239. package/schematics/apigen/schema.js +3 -0
  240. package/schematics/apigen/schema.js.map +1 -0
  241. package/schematics/apigen/schema.json +36 -0
  242. package/schematics/apigen/utils.d.ts +1 -0
  243. package/schematics/apigen/utils.js +75 -0
  244. package/schematics/apigen/utils.js.map +1 -0
  245. package/schematics/collection.json +14 -0
  246. package/schematics/ng-add/index.d.ts +2 -0
  247. package/schematics/ng-add/index.js +13 -0
  248. package/schematics/ng-add/index.js.map +1 -0
  249. package/schematics/random.d.ts +1 -0
  250. package/schematics/random.js +604 -0
  251. package/schematics/random.js.map +1 -0
  252. package/esm2022/lib/resources/responses/annotations.mjs +0 -137
  253. package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +0 -33
  254. package/esm2022/lib/resources/responses/csdl/csdl-entity-container.mjs +0 -11
  255. package/esm2022/lib/resources/responses/csdl/csdl-entity-set.mjs +0 -9
  256. package/esm2022/lib/resources/responses/csdl/csdl-enum-type.mjs +0 -15
  257. package/esm2022/lib/resources/responses/csdl/csdl-function-action.mjs +0 -56
  258. package/esm2022/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +0 -7
  259. package/esm2022/lib/resources/responses/csdl/csdl-reference.mjs +0 -23
  260. package/esm2022/lib/resources/responses/csdl/csdl-schema.mjs +0 -18
  261. package/esm2022/lib/resources/responses/csdl/csdl-singleton.mjs +0 -8
  262. package/esm2022/lib/resources/responses/csdl/csdl-structural-property.mjs +0 -39
  263. package/esm2022/lib/resources/responses/csdl/csdl-structured-type.mjs +0 -34
  264. package/esm2022/lib/resources/responses/csdl/csdl-type-definition.mjs +0 -14
  265. package/esm2022/lib/resources/responses/index.mjs +0 -5
  266. package/esm2022/lib/resources/responses/metadata.mjs +0 -547
  267. package/esm2022/lib/resources/responses/options.mjs +0 -56
  268. package/esm2022/lib/resources/responses/response.mjs +0 -174
  269. package/esm2022/lib/resources/responses/types.mjs +0 -2
  270. package/lib/resources/responses/csdl/csdl-annotation.d.ts +0 -27
  271. package/lib/resources/responses/csdl/csdl-entity-container.d.ts +0 -12
  272. package/lib/resources/responses/csdl/csdl-entity-set.d.ts +0 -8
  273. package/lib/resources/responses/csdl/csdl-enum-type.d.ts +0 -12
  274. package/lib/resources/responses/csdl/csdl-function-action.d.ts +0 -49
  275. package/lib/resources/responses/csdl/csdl-navigation-property-binding.d.ts +0 -5
  276. package/lib/resources/responses/csdl/csdl-reference.d.ts +0 -18
  277. package/lib/resources/responses/csdl/csdl-schema.d.ts +0 -20
  278. package/lib/resources/responses/csdl/csdl-singleton.d.ts +0 -7
  279. package/lib/resources/responses/csdl/csdl-structural-property.d.ts +0 -31
  280. package/lib/resources/responses/csdl/csdl-structured-type.d.ts +0 -27
  281. package/lib/resources/responses/csdl/csdl-type-definition.d.ts +0 -11
  282. package/lib/resources/responses/index.d.ts +0 -4
  283. package/lib/resources/responses/types.d.ts +0 -13
@@ -1,11 +1,11 @@
1
1
  import { HttpEventType } from '@angular/common/http';
2
2
  import { NEVER } from 'rxjs';
3
3
  import { catchError, map } from 'rxjs/operators';
4
- import { ODataInMemoryCache } from './cache/index';
4
+ import { ODataInMemoryCache } from './cache';
5
5
  import { DEFAULT_VERSION } from './constants';
6
- import { ODataCollection, ODataModel } from './models/index';
6
+ import { ODataCollection, ODataModel, } from './models';
7
7
  import { ODataApiOptions } from './options';
8
- import { ODataActionResource, ODataBatchResource, ODataEntityResource, ODataEntitySetResource, ODataFunctionResource, ODataMetadataResource, ODataNavigationPropertyResource, ODataPathSegments, ODataQueryOptions, ODataRequest, ODataResponse, ODataSingletonResource, } from './resources/index';
8
+ import { ODataQueryOptions, ODataPathSegments, ODataRequest, ODataResponse, ODataBatchResource, ODataMetadataResource, ODataActionResource, ODataFunctionResource, ODataEntityResource, ODataEntitySetResource, ODataSingletonResource, ODataNavigationPropertyResource, } from './resources';
9
9
  import { EDM_PARSERS, ODataSchema, } from './schema';
10
10
  import { NONE_PARSER, PathSegment, } from './types';
11
11
  /**
@@ -16,20 +16,13 @@ export class ODataApi {
16
16
  //# region Find by Type
17
17
  // Memoize
18
18
  this.memo = {
19
- forType: {
20
- enum: new Map(),
21
- structured: new Map(),
22
- callable: new Map(),
23
- entitySet: new Map(),
24
- parser: new Map(),
25
- options: new Map(),
26
- },
27
- byName: {
28
- enum: new Map(),
29
- structured: new Map(),
30
- callable: new Map(),
31
- entitySet: new Map(),
32
- },
19
+ enumTypes: new Map(),
20
+ structuredTypes: new Map(),
21
+ callables: new Map(),
22
+ entitySets: new Map(),
23
+ singletons: new Map(),
24
+ parsers: new Map(),
25
+ options: new Map(),
33
26
  };
34
27
  this.serviceRootUrl = config.serviceRootUrl;
35
28
  if (this.serviceRootUrl.indexOf('?') != -1)
@@ -38,28 +31,37 @@ export class ODataApi {
38
31
  this.serviceRootUrl += '/';
39
32
  this.metadataUrl = `${this.serviceRootUrl}$metadata`;
40
33
  this.name = config.name;
41
- this.version = config.version || DEFAULT_VERSION;
42
- this.default = config.default || false;
43
- this.creation = config.creation || new Date();
34
+ this.version = config.version ?? DEFAULT_VERSION;
35
+ this.default = config.default ?? false;
36
+ this.creation = config.creation ?? new Date();
44
37
  this.options = new ODataApiOptions(Object.assign({ version: this.version }, config.options || {}));
45
38
  this.cache = config.cache || new ODataInMemoryCache();
46
39
  this.errorHandler = config.errorHandler;
47
40
  this.parsers = new Map(Object.entries(config.parsers || EDM_PARSERS));
48
- this.schemas = (config.schemas || []).map((schema) => new ODataSchema(schema, this));
41
+ this.schemas = (config.schemas ?? []).map((schema) => new ODataSchema(schema, this));
49
42
  }
50
43
  configure(settings = {}) {
51
44
  this.requester = settings.requester;
52
45
  this.schemas.forEach((schema) => {
53
46
  schema.configure({
54
47
  options: this.options.parserOptions,
55
- parserForType: (type) => this.parserForType(type),
56
- findOptionsForType: (type) => this.findOptionsForType(type),
48
+ });
49
+ });
50
+ }
51
+ populate(metadata) {
52
+ const config = metadata.toConfig();
53
+ this.version = config.version ?? DEFAULT_VERSION;
54
+ const schemas = (config.schemas ?? []).map((schema) => new ODataSchema(schema, this));
55
+ this.schemas = [...this.schemas, ...schemas];
56
+ schemas.forEach((schema) => {
57
+ schema.configure({
58
+ options: this.options.parserOptions,
57
59
  });
58
60
  });
59
61
  }
60
62
  fromJson(json) {
61
- const segments = new ODataPathSegments(json.segments);
62
- const query = new ODataQueryOptions(json.options);
63
+ const segments = ODataPathSegments.fromJson(json.segments);
64
+ const query = ODataQueryOptions.fromJson(json.options);
63
65
  switch (segments.last()?.name) {
64
66
  case PathSegment.entitySet:
65
67
  if (segments.last()?.hasKey()) {
@@ -98,24 +100,24 @@ export class ODataApi {
98
100
  * @param path Name of the singleton
99
101
  * @returns
100
102
  */
101
- singleton(path) {
102
- const entitySet = this.findEntitySetByName(path);
103
- const schema = entitySet !== undefined
104
- ? this.findStructuredTypeForType(entitySet.entityType)
105
- : undefined;
106
- return ODataSingletonResource.factory(this, { path, schema });
103
+ singleton(name) {
104
+ const singleton = this.findSingleton(name);
105
+ return ODataSingletonResource.factory(this, {
106
+ path: singleton?.name ?? name,
107
+ type: singleton?.singletonType,
108
+ });
107
109
  }
108
110
  /**
109
111
  * Build an entity set resource.
110
112
  * @param path Name of the entity set
111
113
  * @returns
112
114
  */
113
- entitySet(path) {
114
- const entitySet = this.findEntitySetByName(path);
115
- const schema = entitySet !== undefined
116
- ? this.findStructuredTypeForType(entitySet.entityType)
117
- : undefined;
118
- return ODataEntitySetResource.factory(this, { path, schema });
115
+ entitySet(name) {
116
+ const entitySet = this.findEntitySet(name);
117
+ return ODataEntitySetResource.factory(this, {
118
+ path: entitySet?.name ?? name,
119
+ type: entitySet?.entityType,
120
+ });
119
121
  }
120
122
  /**
121
123
  * Unbound Action
@@ -123,8 +125,12 @@ export class ODataApi {
123
125
  * @returns ODataActionResource
124
126
  */
125
127
  action(path) {
126
- const schema = this.findCallableForType(path);
127
- return ODataActionResource.factory(this, { path, schema });
128
+ const callable = this.findCallable(path);
129
+ return ODataActionResource.factory(this, {
130
+ path,
131
+ outgoingType: callable?.type(),
132
+ incomingType: callable?.returnType(),
133
+ });
128
134
  }
129
135
  /**
130
136
  * Unbound Function
@@ -132,8 +138,21 @@ export class ODataApi {
132
138
  * @returns ODataFunctionResource
133
139
  */
134
140
  function(path) {
135
- const schema = this.findCallableForType(path);
136
- return ODataFunctionResource.factory(this, { path, schema });
141
+ const callable = this.findCallable(path);
142
+ return ODataFunctionResource.factory(this, {
143
+ path,
144
+ outgoingType: callable?.type(),
145
+ incomingType: callable?.returnType(),
146
+ });
147
+ }
148
+ callable(type) {
149
+ return this.findCallable(type);
150
+ }
151
+ enumType(type) {
152
+ return this.findEnumType(type);
153
+ }
154
+ structuredType(type) {
155
+ return this.findStructuredType(type);
137
156
  }
138
157
  //request(req: ODataRequest<any>): Observable<any> {
139
158
  request(method, resource, options) {
@@ -185,7 +204,15 @@ export class ODataApi {
185
204
  throw new Error(`Unreachable: unhandled observe type ${options.observe}}`);
186
205
  }
187
206
  }
188
- findSchemaForType(type) {
207
+ createSchema(config) {
208
+ const schema = new ODataSchema(config, this);
209
+ schema.configure({
210
+ options: this.options.parserOptions,
211
+ });
212
+ this.schemas.push(schema);
213
+ return schema;
214
+ }
215
+ findSchema(type) {
189
216
  const schemas = this.schemas.filter((s) => s.isNamespaceOf(type));
190
217
  if (schemas.length === 0)
191
218
  return undefined;
@@ -195,152 +222,165 @@ export class ODataApi {
195
222
  .sort((s1, s2) => s1.namespace.length - s2.namespace.length)
196
223
  .pop();
197
224
  }
198
- findEnumTypeForType(type) {
199
- if (this.memo.forType.enum.has(type)) {
200
- return this.memo.forType.enum.get(type);
225
+ //#region EnumTypes
226
+ findEnumType(value) {
227
+ if (this.memo.enumTypes.has(value)) {
228
+ return this.memo.enumTypes.get(value);
201
229
  }
202
- const enumType = this.findSchemaForType(type)?.findEnumTypeForType(type);
203
- this.memo.forType.enum.set(type, enumType);
230
+ const enumTypes = this.schemas.reduce((acc, schema) => [...acc, ...schema.enums], []);
231
+ let enumType = enumTypes.find((e) => e.type() === value);
232
+ enumType = enumType ?? enumTypes.find((e) => e.name === value);
233
+ this.memo.enumTypes.set(value, enumType);
204
234
  return enumType;
205
235
  }
206
- findStructuredTypeForType(type) {
207
- if (this.memo.forType.structured.has(type)) {
208
- return this.memo.forType.structured.get(type);
236
+ //#endregion
237
+ //#region StructuredTypes
238
+ findStructuredType(value) {
239
+ if (this.memo.structuredTypes.has(value)) {
240
+ return this.memo.structuredTypes.get(value);
209
241
  }
210
- const structuredType = this.findSchemaForType(type)?.findStructuredTypeForType(type);
211
- this.memo.forType.structured.set(type, structuredType);
242
+ const structuredTypes = this.schemas.reduce((acc, schema) => [...acc, ...schema.entities], []);
243
+ let structuredType = structuredTypes.find((e) => e.type() === value);
244
+ structuredType =
245
+ structuredType ?? structuredTypes.find((e) => e.name === value);
246
+ this.memo.structuredTypes.set(value, structuredType);
212
247
  return structuredType;
213
248
  }
214
- findCallableForType(type, bindingType) {
215
- const key = bindingType !== undefined ? `${bindingType}/${type}` : type;
216
- if (this.memo.forType.callable.has(key)) {
217
- return this.memo.forType.callable.get(key);
249
+ //#endregion
250
+ //#region Callables
251
+ findCallable(value, bindingType) {
252
+ const key = bindingType !== undefined ? `${bindingType}/${value}` : value;
253
+ if (this.memo.callables.has(key)) {
254
+ return this.memo.callables.get(key);
218
255
  }
219
- const callable = this.findSchemaForType(type)?.findCallableForType(type, bindingType);
220
- this.memo.forType.callable.set(key, callable);
256
+ const bindingStructuredType = bindingType !== undefined
257
+ ? this.findStructuredType(bindingType)
258
+ : undefined;
259
+ const callables = this.schemas.reduce((acc, schema) => [...acc, ...schema.callables], []);
260
+ let callable = callables.find((c) => {
261
+ const isCallableType = c.type() == value;
262
+ const callableBindingType = c.binding()?.type;
263
+ const callableBindingStructuredType = callableBindingType !== undefined
264
+ ? this.findStructuredType(callableBindingType)
265
+ : undefined;
266
+ return (isCallableType &&
267
+ (!bindingStructuredType ||
268
+ (callableBindingStructuredType &&
269
+ bindingStructuredType.isSubtypeOf(callableBindingStructuredType))));
270
+ });
271
+ callable =
272
+ callable ??
273
+ callables.find((c) => {
274
+ const isCallableType = c.name == value;
275
+ const callableBindingType = c.binding()?.type;
276
+ const callableBindingStructuredType = callableBindingType !== undefined
277
+ ? this.findStructuredType(callableBindingType)
278
+ : undefined;
279
+ return (isCallableType &&
280
+ (!bindingStructuredType ||
281
+ (callableBindingStructuredType &&
282
+ bindingStructuredType.isSubtypeOf(callableBindingStructuredType))));
283
+ });
284
+ this.memo.callables.set(key, callable);
221
285
  return callable;
222
286
  }
223
- findEntitySetForType(type) {
224
- if (this.memo.forType.entitySet.has(type)) {
225
- return this.memo.forType.entitySet.get(type);
287
+ //#endregion
288
+ //#region EntitySets
289
+ findEntitySet(value) {
290
+ if (this.memo.entitySets.has(value)) {
291
+ return this.memo.entitySets.get(value);
226
292
  }
227
- const entitySet = this.findSchemaForType(type)?.findEntitySetForType(type);
228
- this.memo.forType.entitySet.set(type, entitySet);
293
+ const entitySets = this.schemas.reduce((acc, schema) => [...acc, ...schema.entitySets], []);
294
+ let entitySet = entitySets.find((e) => e.type() === value);
295
+ entitySet = entitySet ?? entitySets.find((e) => e.name === value);
296
+ this.memo.entitySets.set(value, entitySet);
229
297
  return entitySet;
230
298
  }
231
- findModelForType(type) {
232
- return this.findStructuredTypeForType(type)?.model;
299
+ //#endregion
300
+ //#region Singletons
301
+ findSingleton(value) {
302
+ if (this.memo.singletons.has(value)) {
303
+ return this.memo.singletons.get(value);
304
+ }
305
+ const singletons = this.schemas.reduce((acc, schema) => [...acc, ...schema.singletons], []);
306
+ let singleton = singletons.find((e) => e.type() === value);
307
+ singleton = singleton ?? singletons.find((e) => e.name === value);
308
+ this.memo.singletons.set(value, singleton);
309
+ return singleton;
233
310
  }
234
- modelForType(type) {
235
- let Model = this.findModelForType(type);
236
- if (Model === undefined) {
237
- // Build Ad-hoc model
238
- let schema = this.findStructuredTypeForType(type);
239
- if (schema === undefined)
240
- throw Error(`No schema for ${type}`);
241
- Model = class extends ODataModel {
242
- };
243
- // Build Meta
244
- Model.buildMeta({ schema });
311
+ //#endregion
312
+ findModel(type) {
313
+ return this.findStructuredType(type)?.model;
314
+ }
315
+ createModel(structured) {
316
+ if (structured.model !== undefined)
317
+ return structured.model;
318
+ // Build Ad-hoc model
319
+ const Model = class extends ODataModel {
320
+ };
321
+ // Build Meta
322
+ Model.meta = this.optionsForType(structured.type(), {
323
+ structuredType: structured,
324
+ });
325
+ if (Model.meta !== undefined) {
245
326
  // Configure
246
327
  Model.meta.configure({
247
328
  options: this.options.parserOptions,
248
- parserForType: (type) => this.parserForType(type),
249
- findOptionsForType: (type) => this.findOptionsForType(type),
250
329
  });
251
- // Store New Model for next time
252
- schema.model = Model;
253
330
  }
331
+ // Store New Model for next time
332
+ structured.model = Model;
254
333
  return Model;
255
334
  }
256
- findCollectionForType(type) {
257
- return this.findStructuredTypeForType(type)?.collection;
335
+ modelForType(type) {
336
+ let Model = this.findModel(type);
337
+ if (Model === undefined) {
338
+ const structured = this.findStructuredType(type);
339
+ if (structured === undefined)
340
+ throw Error(`No structured type for ${type}`);
341
+ Model = this.createModel(structured);
342
+ }
343
+ return Model;
344
+ }
345
+ findCollection(type) {
346
+ return this.findStructuredType(type)?.collection;
347
+ }
348
+ createCollection(structured, model) {
349
+ if (structured.collection !== undefined)
350
+ return structured.collection;
351
+ if (model === undefined)
352
+ model = this.createModel(structured);
353
+ const Collection = class extends ODataCollection {
354
+ static { this.model = model; }
355
+ };
356
+ structured.collection = Collection;
357
+ return Collection;
258
358
  }
259
359
  collectionForType(type) {
260
- let Collection = this.findCollectionForType(type);
360
+ let Collection = this.findCollection(type);
261
361
  if (Collection === undefined) {
262
- let schema = this.findStructuredTypeForType(type);
263
- if (schema === undefined)
264
- throw Error('');
265
- Collection = class extends ODataCollection {
266
- };
267
- Collection.model = this.modelForType(type);
268
- // Store New Collection for next time
269
- schema.collection = Collection;
362
+ const structured = this.findStructuredType(type);
363
+ if (structured === undefined)
364
+ throw Error(`No structured type for ${type}`);
365
+ const Model = this.modelForType(type);
366
+ Collection = this.createCollection(structured, Model);
270
367
  }
271
368
  return Collection;
272
369
  }
273
- findServiceForType(type) {
274
- return this.findEntitySetForType(type)?.service;
275
- }
276
370
  findEntitySetForEntityType(entityType) {
277
- if (this.memo.forType.entitySet.has(entityType)) {
278
- return this.memo.forType.entitySet.get(entityType);
371
+ if (this.memo.entitySets.has(entityType)) {
372
+ return this.memo.entitySets.get(entityType);
279
373
  }
280
374
  const entitySet = this.schemas
281
375
  .reduce((acc, schema) => [...acc, ...schema.entitySets], [])
282
376
  .find((e) => e.entityType === entityType);
283
- this.memo.forType.entitySet.set(entityType, entitySet);
377
+ this.memo.entitySets.set(entityType, entitySet);
284
378
  return entitySet;
285
379
  }
286
- findServiceForEntityType(entityType) {
287
- return this.findEntitySetForEntityType(entityType)?.service;
288
- }
289
- findEnumTypeByName(name) {
290
- if (this.memo.byName.enum.has(name)) {
291
- return this.memo.byName.enum.get(name);
292
- }
293
- const enumType = this.schemas
294
- .reduce((acc, schema) => [...acc, ...schema.enums], [])
295
- .find((e) => e.name === name);
296
- this.memo.byName.enum.set(name, enumType);
297
- return enumType;
298
- }
299
- findStructuredTypeByName(name) {
300
- if (this.memo.byName.structured.has(name)) {
301
- return this.memo.byName.structured.get(name);
302
- }
303
- const structuredType = this.schemas
304
- .reduce((acc, schema) => [...acc, ...schema.entities], [])
305
- .find((e) => e.name === name);
306
- this.memo.byName.structured.set(name, structuredType);
307
- return structuredType;
308
- }
309
- findCallableByName(name, bindingType) {
310
- const key = bindingType !== undefined ? `${bindingType}/${name}` : name;
311
- if (this.memo.byName.callable.has(key)) {
312
- return this.memo.byName.callable.get(key);
313
- }
314
- const callable = this.schemas
315
- .reduce((acc, schema) => [...acc, ...schema.callables], [])
316
- .find((c) => c.name === name &&
317
- (bindingType === undefined || c.binding()?.type === bindingType));
318
- this.memo.byName.callable.set(key, callable);
319
- return callable;
320
- }
321
- findEntitySetByName(name) {
322
- if (this.memo.byName.entitySet.has(name)) {
323
- return this.memo.byName.entitySet.get(name);
324
- }
325
- const schema = this.schemas
326
- .reduce((acc, schema) => [...acc, ...schema.entitySets], [])
327
- .find((e) => e.name === name);
328
- this.memo.byName.entitySet.set(name, schema);
329
- return schema;
330
- }
331
- findModelByName(name) {
332
- return this.findStructuredTypeByName(name)?.model;
333
- }
334
- findCollectionByName(name) {
335
- return this.findStructuredTypeByName(name)?.collection;
336
- }
337
- findServiceByName(name) {
338
- return this.findEntitySetByName(name)?.service;
339
- }
340
380
  parserForType(type, bindingType) {
341
381
  const key = bindingType !== undefined ? `${bindingType}/${type}` : type;
342
- if (this.memo.forType.parser.has(key)) {
343
- return this.memo.forType.parser.get(key);
382
+ if (this.memo.parsers.has(key)) {
383
+ return this.memo.parsers.get(key);
344
384
  }
345
385
  // None Parser by default
346
386
  let parser = NONE_PARSER;
@@ -349,26 +389,31 @@ export class ODataApi {
349
389
  parser = this.parsers.get(type);
350
390
  }
351
391
  else if (!type.startsWith('Edm.')) {
352
- // EnumType, ComplexType and EntityType Parsers
353
- let value = this.findCallableForType(type, bindingType) ||
354
- this.findEnumTypeForType(type) ||
355
- this.findStructuredTypeForType(type);
392
+ // Callable, EnumType, StructuredType (ComplexType and EntityType) Parsers
393
+ let value = this.findCallable(type, bindingType) ??
394
+ this.findEnumType(type) ??
395
+ this.findStructuredType(type);
356
396
  parser = value?.parser;
357
397
  }
358
398
  // Set Parser for next time
359
- this.memo.forType.parser.set(key, parser);
399
+ this.memo.parsers.set(key, parser);
360
400
  return parser;
361
401
  }
362
- findOptionsForType(type) {
402
+ optionsForType(type, { structuredType, config, } = {}) {
363
403
  // Strucutred Options
364
- if (this.memo.forType.options.has(type)) {
365
- return this.memo.forType.options.get(type);
404
+ if (this.memo.options.has(type)) {
405
+ return this.memo.options.get(type);
406
+ }
407
+ let meta = undefined;
408
+ if (!type.startsWith('Edm.')) {
409
+ structuredType = this.findStructuredType(type) ?? structuredType;
410
+ if (structuredType !== undefined) {
411
+ meta = ODataModel.buildMetaOptions({ config, structuredType });
412
+ }
366
413
  }
367
- const st = this.findStructuredTypeForType(type);
368
- const options = st?.model?.meta;
369
414
  // Set Options for next time
370
- this.memo.forType.options.set(type, options);
371
- return options;
415
+ this.memo.options.set(type, meta);
416
+ return meta;
372
417
  }
373
418
  }
374
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBYyxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFxQixNQUFNLGdCQUFnQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLCtCQUErQixFQUUvQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLFlBQVksRUFFWixhQUFhLEVBRWIsc0JBQXNCLEdBQ3ZCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLFdBQVcsRUFJWCxXQUFXLEdBRVosTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUlMLFdBQVcsRUFFWCxXQUFXLEdBRVosTUFBTSxTQUFTLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQW1CbkIsWUFBWSxNQUFpQjtRQXFPN0IsdUJBQXVCO1FBQ3ZCLFVBQVU7UUFDRixTQUFJLEdBZVI7WUFDRixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLElBQUksR0FBRyxFQUEwQztnQkFDdkQsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFn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NEI7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgTkVWRVIsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9EYXRhQ2FjaGUsIE9EYXRhSW5NZW1vcnlDYWNoZSB9IGZyb20gJy4vY2FjaGUvaW5kZXgnO1xuaW1wb3J0IHsgREVGQVVMVF9WRVJTSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFDb2xsZWN0aW9uLCBPRGF0YU1vZGVsLCBPRGF0YU1vZGVsT3B0aW9ucyB9IGZyb20gJy4vbW9kZWxzL2luZGV4JztcbmltcG9ydCB7IE9EYXRhQXBpT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQge1xuICBPRGF0YUFjdGlvblJlc291cmNlLFxuICBPRGF0YUJhdGNoUmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25SZXNvdXJjZSxcbiAgT0RhdGFNZXRhZGF0YVJlc291cmNlLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUGF0aFNlZ21lbnRzLFxuICBPRGF0YVF1ZXJ5T3B0aW9ucyxcbiAgT0RhdGFSZXF1ZXN0LFxuICBPRGF0YVJlc291cmNlLFxuICBPRGF0YVJlc3BvbnNlLFxuICBPRGF0YVNlZ21lbnQsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG59IGZyb20gJy4vcmVzb3VyY2VzL2luZGV4JztcbmltcG9ydCB7XG4gIEVETV9QQVJTRVJTLFxuICBPRGF0YUNhbGxhYmxlLFxuICBPRGF0YUVudGl0eVNldCxcbiAgT0RhdGFFbnVtVHlwZSxcbiAgT0RhdGFTY2hlbWEsXG4gIE9EYXRhU3RydWN0dXJlZFR5cGUsXG59IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7IE9EYXRhRW50aXR5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZW50aXR5JztcbmltcG9ydCB7XG4gIEFwaUNvbmZpZyxcbiAgQXBpT3B0aW9ucyxcbiAgRWRtVHlwZSxcbiAgTk9ORV9QQVJTRVIsXG4gIFBhcnNlcixcbiAgUGF0aFNlZ21lbnQsXG4gIFF1ZXJ5T3B0aW9uLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBBcGkgYWJzdHJhY3Rpb24gZm9yIGNvbnN1bWluZyBPRGF0YSBzZXJ2aWNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE9EYXRhQXBpIHtcbiAgcmVxdWVzdGVyPzogKHJlcXVlc3Q6IE9EYXRhUmVxdWVzdDxhbnk+KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIHNlcnZpY2VSb290VXJsOiBzdHJpbmc7XG4gIG1ldGFkYXRhVXJsOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgZGVmYXVsdDogYm9vbGVhbjtcbiAgY3JlYXRpb246IERhdGU7XG4gIC8vIE9wdGlvbnNcbiAgb3B0aW9uczogT0RhdGFBcGlPcHRpb25zO1xuICAvLyBDYWNoZVxuICBjYWNoZSE6IE9EYXRhQ2FjaGU7XG4gIC8vIEVycm9yIEhhbmRsZXJcbiAgZXJyb3JIYW5kbGVyPzogKGVycm9yOiBhbnksIGNhdWdodDogT2JzZXJ2YWJsZTxhbnk+KSA9PiBPYnNlcnZhYmxlPG5ldmVyPjtcbiAgLy8gQmFzZSBQYXJzZXJzXG4gIHBhcnNlcnM6IE1hcDxzdHJpbmcsIFBhcnNlcjxhbnk+PjtcbiAgLy8gU2NoZW1hc1xuICBzY2hlbWFzOiBPRGF0YVNjaGVtYVtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQXBpQ29uZmlnKSB7XG4gICAgdGhpcy5zZXJ2aWNlUm9vdFVybCA9IGNvbmZpZy5zZXJ2aWNlUm9vdFVybDtcbiAgICBpZiAodGhpcy5zZXJ2aWNlUm9vdFVybC5pbmRleE9mKCc/JykgIT0gLTEpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlICdzZXJ2aWNlUm9vdFVybCcgc2hvdWxkIG5vdCBjb250YWluIHF1ZXJ5IHN0cmluZy4gUGxlYXNlIHVzZSAncGFyYW1zJyB0byBhZGQgZXh0cmEgcGFyYW1ldGVyc1wiLFxuICAgICAgKTtcbiAgICBpZiAoIXRoaXMuc2VydmljZVJvb3RVcmwuZW5kc1dpdGgoJy8nKSkgdGhpcy5zZXJ2aWNlUm9vdFVybCArPSAnLyc7XG4gICAgdGhpcy5tZXRhZGF0YVVybCA9IGAke3RoaXMuc2VydmljZVJvb3RVcmx9JG1ldGFkYXRhYDtcbiAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSBjb25maWcudmVyc2lvbiB8fCBERUZBVUxUX1ZFUlNJT047XG4gICAgdGhpcy5kZWZhdWx0ID0gY29uZmlnLmRlZmF1bHQgfHwgZmFsc2U7XG4gICAgdGhpcy5jcmVhdGlvbiA9IGNvbmZpZy5jcmVhdGlvbiB8fCBuZXcgRGF0ZSgpO1xuICAgIHRoaXMub3B0aW9ucyA9IG5ldyBPRGF0YUFwaU9wdGlvbnMoXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICA8QXBpT3B0aW9ucz57IHZlcnNpb246IHRoaXMudmVyc2lvbiB9LFxuICAgICAgICBjb25maWcub3B0aW9ucyB8fCB7fSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHRoaXMuY2FjaGUgPSAoY29uZmlnLmNhY2hlIGFzIE9EYXRhQ2FjaGUpIHx8IG5ldyBPRGF0YUluTWVtb3J5Q2FjaGUoKTtcbiAgICB0aGlzLmVycm9ySGFuZGxlciA9IGNvbmZpZy5lcnJvckhhbmRsZXI7XG5cbiAgICB0aGlzLnBhcnNlcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5wYXJzZXJzIHx8IEVETV9QQVJTRVJTKSk7XG5cbiAgICB0aGlzLnNjaGVtYXMgPSAoY29uZmlnLnNjaGVtYXMgfHwgW10pLm1hcChcbiAgICAgIChzY2hlbWEpID0+IG5ldyBPRGF0YVNjaGVtYShzY2hlbWEsIHRoaXMpLFxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmUoXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIHJlcXVlc3Rlcj86IChyZXF1ZXN0OiBPRGF0YVJlcXVlc3Q8YW55PikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5yZXF1ZXN0ZXIgPSBzZXR0aW5ncy5yZXF1ZXN0ZXI7XG4gICAgdGhpcy5zY2hlbWFzLmZvckVhY2goKHNjaGVtYSkgPT4ge1xuICAgICAgc2NoZW1hLmNvbmZpZ3VyZSh7XG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5wYXJzZXJPcHRpb25zLFxuICAgICAgICBwYXJzZXJGb3JUeXBlOiAodHlwZTogc3RyaW5nIHwgRWRtVHlwZSkgPT4gdGhpcy5wYXJzZXJGb3JUeXBlKHR5cGUpLFxuICAgICAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IHRoaXMuZmluZE9wdGlvbnNGb3JUeXBlKHR5cGUpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmcm9tSnNvbjxQLCBSPihqc29uOiB7XG4gICAgc2VnbWVudHM6IE9EYXRhU2VnbWVudFtdO1xuICAgIG9wdGlvbnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9KTogT0RhdGFBY3Rpb25SZXNvdXJjZTxQLCBSPiB8IE9EYXRhRnVuY3Rpb25SZXNvdXJjZTxQLCBSPjtcbiAgZnJvbUpzb248RT4oanNvbjoge1xuICAgIHNlZ21lbnRzOiBPRGF0YVNlZ21lbnRbXTtcbiAgICBvcHRpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgfSk6XG4gICAgfCBPRGF0YUVudGl0eVJlc291cmNlPEU+XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPEU+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPEU+XG4gICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPEU+O1xuICBmcm9tSnNvbihqc29uOiB7XG4gICAgc2VnbWVudHM6IE9EYXRhU2VnbWVudFtdO1xuICAgIG9wdGlvbnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9KSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBuZXcgT0RhdGFQYXRoU2VnbWVudHMoanNvbi5zZWdtZW50cyk7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgT0RhdGFRdWVyeU9wdGlvbnMoanNvbi5vcHRpb25zKTtcbiAgICBzd2l0Y2ggKHNlZ21lbnRzLmxhc3QoKT8ubmFtZSBhcyBQYXRoU2VnbWVudCkge1xuICAgICAgY2FzZSBQYXRoU2VnbWVudC5lbnRpdHlTZXQ6XG4gICAgICAgIGlmIChzZWdtZW50cy5sYXN0KCk/Lmhhc0tleSgpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBPRGF0YUVudGl0eVJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuZXcgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBQYXRoU2VnbWVudC5uYXZpZ2F0aW9uUHJvcGVydHk6XG4gICAgICAgIHJldHVybiBuZXcgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQuc2luZ2xldG9uOlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhU2luZ2xldG9uUmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LmFjdGlvbjpcbiAgICAgICAgcmV0dXJuIG5ldyBPRGF0YUFjdGlvblJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgY2FzZSBQYXRoU2VnbWVudC5mdW5jdGlvbjpcbiAgICAgICAgcmV0dXJuIG5ldyBPRGF0YUZ1bmN0aW9uUmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTm8gUmVzb3VyY2UgZm9yIGpzb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIG1ldGFkYXRhIHJlc291cmNlLlxuICAgKiBAcmV0dXJucyBPRGF0YU1ldGFkYXRhUmVzb3VyY2VcbiAgICovXG4gIG1ldGFkYXRhKCk6IE9EYXRhTWV0YWRhdGFSZXNvdXJjZSB7XG4gICAgcmV0dXJuIE9EYXRhTWV0YWRhdGFSZXNvdXJjZS5mYWN0b3J5KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgYmF0Y2ggcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIE9EYXRhQmF0Y2hSZXNvdXJjZVxuICAgKi9cbiAgYmF0Y2goKTogT0RhdGFCYXRjaFJlc291cmNlIHtcbiAgICByZXR1cm4gT0RhdGFCYXRjaFJlc291cmNlLmZhY3RvcnkodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBzaW5nbGV0b24gcmVzb3VyY2UuXG4gICAqIEBwYXJhbSBwYXRoIE5hbWUgb2YgdGhlIHNpbmdsZXRvblxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc2luZ2xldG9uPFQ+KHBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGVudGl0eVNldCA9IHRoaXMuZmluZEVudGl0eVNldEJ5TmFtZShwYXRoKTtcbiAgICBjb25zdCBzY2hlbWEgPVxuICAgICAgZW50aXR5U2V0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4oZW50aXR5U2V0LmVudGl0eVR5cGUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBPRGF0YVNpbmdsZXRvblJlc291cmNlLmZhY3Rvcnk8VD4odGhpcywgeyBwYXRoLCBzY2hlbWEgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW4gZW50aXR5IHNldCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHBhdGggTmFtZSBvZiB0aGUgZW50aXR5IHNldFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZW50aXR5U2V0PFQ+KHBhdGg6IHN0cmluZyk6IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD4ge1xuICAgIGNvbnN0IGVudGl0eVNldCA9IHRoaXMuZmluZEVudGl0eVNldEJ5TmFtZShwYXRoKTtcbiAgICBjb25zdCBzY2hlbWEgPVxuICAgICAgZW50aXR5U2V0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4oZW50aXR5U2V0LmVudGl0eVR5cGUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBPRGF0YUVudGl0eVNldFJlc291cmNlLmZhY3Rvcnk8VD4odGhpcywgeyBwYXRoLCBzY2hlbWEgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5ib3VuZCBBY3Rpb25cbiAgICogQHBhcmFtICB7c3RyaW5nfSBwYXRoP1xuICAgKiBAcmV0dXJucyBPRGF0YUFjdGlvblJlc291cmNlXG4gICAqL1xuICBhY3Rpb248UCwgUj4ocGF0aDogc3RyaW5nKTogT0RhdGFBY3Rpb25SZXNvdXJjZTxQLCBSPiB7XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5maW5kQ2FsbGFibGVGb3JUeXBlPFI+KHBhdGgpO1xuICAgIHJldHVybiBPRGF0YUFjdGlvblJlc291cmNlLmZhY3Rvcnk8UCwgUj4odGhpcywgeyBwYXRoLCBzY2hlbWEgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5ib3VuZCBGdW5jdGlvblxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBhdGg/XG4gICAqIEByZXR1cm5zIE9EYXRhRnVuY3Rpb25SZXNvdXJjZVxuICAgKi9cbiAgZnVuY3Rpb248UCwgUj4ocGF0aDogc3RyaW5nKTogT0RhdGFGdW5jdGlvblJlc291cmNlPFAsIFI+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmZpbmRDYWxsYWJsZUZvclR5cGU8Uj4ocGF0aCk7XG4gICAgcmV0dXJuIE9EYXRhRnVuY3Rpb25SZXNvdXJjZS5mYWN0b3J5PFAsIFI+KHRoaXMsIHsgcGF0aCwgc2NoZW1hIH0pO1xuICB9XG5cbiAgLy9yZXF1ZXN0KHJlcTogT0RhdGFSZXF1ZXN0PGFueT4pOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXF1ZXN0PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keT86IGFueTtcbiAgICAgIGV0YWc/OiBzdHJpbmc7XG4gICAgICByZXNwb25zZVR5cGU/OlxuICAgICAgICB8ICdhcnJheWJ1ZmZlcidcbiAgICAgICAgfCAnYmxvYidcbiAgICAgICAgfCAnanNvbidcbiAgICAgICAgfCAndGV4dCdcbiAgICAgICAgfCAndmFsdWUnXG4gICAgICAgIHwgJ3Byb3BlcnR5J1xuICAgICAgICB8ICdlbnRpdHknXG4gICAgICAgIHwgJ2VudGl0aWVzJztcbiAgICAgIG9ic2VydmU/OiAnYm9keScgfCAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uW107XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcmVxID0gT0RhdGFSZXF1ZXN0LmZhY3RvcnkodGhpcywgbWV0aG9kLCByZXNvdXJjZSwge1xuICAgICAgYm9keTogb3B0aW9ucy5ib2R5LFxuICAgICAgZXRhZzogb3B0aW9ucy5ldGFnLFxuICAgICAgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LFxuICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsXG4gICAgICBvYnNlcnZlOiAob3B0aW9ucy5vYnNlcnZlID09PSAnZXZlbnRzJyA/ICdldmVudHMnIDogJ3Jlc3BvbnNlJykgYXNcbiAgICAgICAgfCAnZXZlbnRzJ1xuICAgICAgICB8ICdyZXNwb25zZScsXG4gICAgICB3aXRoQ291bnQ6IG9wdGlvbnMud2l0aENvdW50LFxuICAgICAgYm9keVF1ZXJ5T3B0aW9uczogb3B0aW9ucy5ib2R5UXVlcnlPcHRpb25zLFxuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MsXG4gICAgICBmZXRjaFBvbGljeTogb3B0aW9ucy5mZXRjaFBvbGljeSxcbiAgICAgIHBhcnNlck9wdGlvbnM6IG9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMsXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzJCA9IHRoaXMucmVxdWVzdGVyICE9PSB1bmRlZmluZWQgPyB0aGlzLnJlcXVlc3RlcihyZXEpIDogTkVWRVI7XG5cbiAgICByZXMkID0gcmVzJC5waXBlKFxuICAgICAgbWFwKChyZXM6IEh0dHBFdmVudDxhbnk+KSA9PlxuICAgICAgICByZXMudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZVxuICAgICAgICAgID8gT0RhdGFSZXNwb25zZS5mcm9tSHR0cFJlc3BvbnNlPGFueT4ocmVxLCByZXMpXG4gICAgICAgICAgOiByZXMsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5lcnJvckhhbmRsZXIgIT09IHVuZGVmaW5lZClcbiAgICAgIHJlcyQgPSByZXMkLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmVycm9ySGFuZGxlcikpO1xuXG4gICAgaWYgKG9wdGlvbnMub2JzZXJ2ZSA9PT0gJ2V2ZW50cycpIHtcbiAgICAgIHJldHVybiByZXMkO1xuICAgIH1cblxuICAgIHJlcyQgPSB0aGlzLmNhY2hlLmhhbmRsZVJlcXVlc3QocmVxLCByZXMkKTtcblxuICAgIHN3aXRjaCAob3B0aW9ucy5vYnNlcnZlIHx8ICdib2R5Jykge1xuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICAgIHN3aXRjaCAob3B0aW9ucy5yZXNwb25zZVR5cGUpIHtcbiAgICAgICAgICBjYXNlICdlbnRpdGllcyc6XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMuZW50aXRpZXMoKSkpO1xuICAgICAgICAgIGNhc2UgJ2VudGl0eSc6XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMuZW50aXR5KCkpKTtcbiAgICAgICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMucHJvcGVydHkoKSkpO1xuICAgICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy52YWx1ZSgpIGFzIFQpKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gT3RoZXIgcmVzcG9uc2VUeXBlcyAoYXJyYXlidWZmZXIsIGJsb2IsIGpzb24sIHRleHQpIHJldHVybiBib2R5XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMuYm9keSkpO1xuICAgICAgICB9XG4gICAgICBjYXNlICdyZXNwb25zZSc6XG4gICAgICAgIC8vIFRoZSByZXNwb25zZSBzdHJlYW0gd2FzIHJlcXVlc3RlZCBkaXJlY3RseSwgc28gcmV0dXJuIGl0LlxuICAgICAgICByZXR1cm4gcmVzJDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEd1YXJkIGFnYWluc3QgbmV3IGZ1dHVyZSBvYnNlcnZlIHR5cGVzIGJlaW5nIGFkZGVkLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFVucmVhY2hhYmxlOiB1bmhhbmRsZWQgb2JzZXJ2ZSB0eXBlICR7b3B0aW9ucy5vYnNlcnZlfX1gLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIyByZWdpb24gRmluZCBieSBUeXBlXG4gIC8vIE1lbW9pemVcbiAgcHJpdmF0ZSBtZW1vOiB7XG4gICAgZm9yVHlwZToge1xuICAgICAgZW51bTogTWFwPHN0cmluZywgT0RhdGFFbnVtVHlwZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIHN0cnVjdHVyZWQ6IE1hcDxzdHJpbmcsIE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgICBjYWxsYWJsZTogTWFwPHN0cmluZywgT0RhdGFDYWxsYWJsZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIGVudGl0eVNldDogTWFwPHN0cmluZywgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ+O1xuICAgICAgcGFyc2VyOiBNYXA8c3RyaW5nLCBQYXJzZXI8YW55Pj47XG4gICAgICBvcHRpb25zOiBNYXA8c3RyaW5nLCBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICB9O1xuICAgIGJ5TmFtZToge1xuICAgICAgZW51bTogTWFwPHN0cmluZywgT0RhdGFFbnVtVHlwZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIHN0cnVjdHVyZWQ6IE1hcDxzdHJpbmcsIE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgICBjYWxsYWJsZTogTWFwPHN0cmluZywgT0RhdGFDYWxsYWJsZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIGVudGl0eVNldDogTWFwPHN0cmluZywgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ+O1xuICAgIH07XG4gIH0gPSB7XG4gICAgZm9yVHlwZToge1xuICAgICAgZW51bTogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW51bVR5cGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIHN0cnVjdHVyZWQ6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgICBjYWxsYWJsZTogbmV3IE1hcDxzdHJpbmcsIE9EYXRhQ2FsbGFibGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIGVudGl0eVNldDogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkPigpLFxuICAgICAgcGFyc2VyOiBuZXcgTWFwPHN0cmluZywgUGFyc2VyPGFueT4+KCksXG4gICAgICBvcHRpb25zOiBuZXcgTWFwPHN0cmluZywgT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICB9LFxuICAgIGJ5TmFtZToge1xuICAgICAgZW51bTogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW51bVR5cGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIHN0cnVjdHVyZWQ6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgICBjYWxsYWJsZTogbmV3IE1hcDxzdHJpbmcsIE9EYXRhQ2FsbGFibGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIGVudGl0eVNldDogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkPigpLFxuICAgIH0sXG4gIH07XG5cbiAgcHJpdmF0ZSBmaW5kU2NoZW1hRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzY2hlbWFzID0gdGhpcy5zY2hlbWFzLmZpbHRlcigocykgPT4gcy5pc05hbWVzcGFjZU9mKHR5cGUpKTtcbiAgICBpZiAoc2NoZW1hcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHNjaGVtYXMubGVuZ3RoID09PSAxKSByZXR1cm4gc2NoZW1hc1swXTtcbiAgICByZXR1cm4gc2NoZW1hc1xuICAgICAgLnNvcnQoKHMxLCBzMikgPT4gczEubmFtZXNwYWNlLmxlbmd0aCAtIHMyLm5hbWVzcGFjZS5sZW5ndGgpXG4gICAgICAucG9wKCk7XG4gIH1cblxuICBwdWJsaWMgZmluZEVudW1UeXBlRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUuZW51bS5oYXModHlwZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uZm9yVHlwZS5lbnVtLmdldCh0eXBlKSBhcyBPRGF0YUVudW1UeXBlPFQ+IHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnVtVHlwZSA9IHRoaXMuZmluZFNjaGVtYUZvclR5cGUodHlwZSk/LmZpbmRFbnVtVHlwZUZvclR5cGU8VD4odHlwZSk7XG4gICAgdGhpcy5tZW1vLmZvclR5cGUuZW51bS5zZXQodHlwZSwgZW51bVR5cGUpO1xuICAgIHJldHVybiBlbnVtVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5zdHJ1Y3R1cmVkLmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5mb3JUeXBlLnN0cnVjdHVyZWQuZ2V0KHR5cGUpIGFzXG4gICAgICAgIHwgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3RydWN0dXJlZFR5cGUgPVxuICAgICAgdGhpcy5maW5kU2NoZW1hRm9yVHlwZSh0eXBlKT8uZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPih0eXBlKTtcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5zdHJ1Y3R1cmVkLnNldCh0eXBlLCBzdHJ1Y3R1cmVkVHlwZSk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRUeXBlO1xuICB9XG5cbiAgcHVibGljIGZpbmRDYWxsYWJsZUZvclR5cGU8VD4odHlwZTogc3RyaW5nLCBiaW5kaW5nVHlwZT86IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgPyBgJHtiaW5kaW5nVHlwZX0vJHt0eXBlfWAgOiB0eXBlO1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5jYWxsYWJsZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5mb3JUeXBlLmNhbGxhYmxlLmdldChrZXkpIGFzXG4gICAgICAgIHwgT0RhdGFDYWxsYWJsZTxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2FsbGFibGUgPSB0aGlzLmZpbmRTY2hlbWFGb3JUeXBlKHR5cGUpPy5maW5kQ2FsbGFibGVGb3JUeXBlPFQ+KFxuICAgICAgdHlwZSxcbiAgICAgIGJpbmRpbmdUeXBlLFxuICAgICk7XG4gICAgdGhpcy5tZW1vLmZvclR5cGUuY2FsbGFibGUuc2V0KGtleSwgY2FsbGFibGUpO1xuICAgIHJldHVybiBjYWxsYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0Rm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0Lmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5mb3JUeXBlLmVudGl0eVNldC5nZXQodHlwZSkgYXNcbiAgICAgICAgfCBPRGF0YUVudGl0eVNldFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZW50aXR5U2V0ID0gdGhpcy5maW5kU2NoZW1hRm9yVHlwZSh0eXBlKT8uZmluZEVudGl0eVNldEZvclR5cGUodHlwZSk7XG4gICAgdGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0LnNldCh0eXBlLCBlbnRpdHlTZXQpO1xuICAgIHJldHVybiBlbnRpdHlTZXQ7XG4gIH1cblxuICBwdWJsaWMgZmluZE1vZGVsRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPGFueT4odHlwZSk/Lm1vZGVsO1xuICB9XG5cbiAgcHVibGljIG1vZGVsRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgTW9kZWwgPSB0aGlzLmZpbmRNb2RlbEZvclR5cGUodHlwZSk7XG4gICAgaWYgKE1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEJ1aWxkIEFkLWhvYyBtb2RlbFxuICAgICAgbGV0IHNjaGVtYSA9IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxhbnk+KHR5cGUpO1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBFcnJvcihgTm8gc2NoZW1hIGZvciAke3R5cGV9YCk7XG4gICAgICBNb2RlbCA9IGNsYXNzIGV4dGVuZHMgT0RhdGFNb2RlbDxhbnk+IHt9IGFzIHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgICAgLy8gQnVpbGQgTWV0YVxuICAgICAgTW9kZWwuYnVpbGRNZXRhKHsgc2NoZW1hIH0pO1xuICAgICAgLy8gQ29uZmlndXJlXG4gICAgICBNb2RlbC5tZXRhLmNvbmZpZ3VyZSh7XG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5wYXJzZXJPcHRpb25zLFxuICAgICAgICBwYXJzZXJGb3JUeXBlOiAodHlwZTogc3RyaW5nIHwgRWRtVHlwZSkgPT4gdGhpcy5wYXJzZXJGb3JUeXBlKHR5cGUpLFxuICAgICAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IHRoaXMuZmluZE9wdGlvbnNGb3JUeXBlKHR5cGUpLFxuICAgICAgfSk7XG4gICAgICAvLyBTdG9yZSBOZXcgTW9kZWwgZm9yIG5leHQgdGltZVxuICAgICAgc2NoZW1hLm1vZGVsID0gTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBNb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kQ29sbGVjdGlvbkZvclR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxhbnk+KHR5cGUpPy5jb2xsZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGNvbGxlY3Rpb25Gb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGxldCBDb2xsZWN0aW9uID0gdGhpcy5maW5kQ29sbGVjdGlvbkZvclR5cGUodHlwZSk7XG4gICAgaWYgKENvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IHNjaGVtYSA9IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxhbnk+KHR5cGUpO1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBFcnJvcignJyk7XG4gICAgICBDb2xsZWN0aW9uID0gY2xhc3MgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248XG4gICAgICAgIGFueSxcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+XG4gICAgICA+IHt9IGFzIHR5cGVvZiBPRGF0YUNvbGxlY3Rpb247XG4gICAgICBDb2xsZWN0aW9uLm1vZGVsID0gdGhpcy5tb2RlbEZvclR5cGUodHlwZSk7XG4gICAgICAvLyBTdG9yZSBOZXcgQ29sbGVjdGlvbiBmb3IgbmV4dCB0aW1lXG4gICAgICBzY2hlbWEuY29sbGVjdGlvbiA9IENvbGxlY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBDb2xsZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGZpbmRTZXJ2aWNlRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kRW50aXR5U2V0Rm9yVHlwZSh0eXBlKT8uc2VydmljZSBhc1xuICAgICAgfCB0eXBlb2YgT0RhdGFFbnRpdHlTZXJ2aWNlXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0Rm9yRW50aXR5VHlwZShlbnRpdHlUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0LmhhcyhlbnRpdHlUeXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5mb3JUeXBlLmVudGl0eVNldC5nZXQoZW50aXR5VHlwZSkgYXNcbiAgICAgICAgfCBPRGF0YUVudGl0eVNldFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZW50aXR5U2V0ID0gdGhpcy5zY2hlbWFzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnRpdHlTZXRzXSxcbiAgICAgICAgPE9EYXRhRW50aXR5U2V0W10+W10sXG4gICAgICApXG4gICAgICAuZmluZCgoZSkgPT4gZS5lbnRpdHlUeXBlID09PSBlbnRpdHlUeXBlKTtcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5lbnRpdHlTZXQuc2V0KGVudGl0eVR5cGUsIGVudGl0eVNldCk7XG4gICAgcmV0dXJuIGVudGl0eVNldDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kU2VydmljZUZvckVudGl0eVR5cGUoZW50aXR5VHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZEVudGl0eVNldEZvckVudGl0eVR5cGUoZW50aXR5VHlwZSk/LnNlcnZpY2UgYXNcbiAgICAgIHwgdHlwZW9mIE9EYXRhRW50aXR5U2VydmljZVxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZmluZEVudW1UeXBlQnlOYW1lPFQ+KG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uYnlOYW1lLmVudW0uaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmJ5TmFtZS5lbnVtLmdldChuYW1lKSBhcyBPRGF0YUVudW1UeXBlPFQ+IHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnVtVHlwZSA9IHRoaXMuc2NoZW1hc1xuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW51bXNdLFxuICAgICAgICA8T0RhdGFFbnVtVHlwZTxUPltdPltdLFxuICAgICAgKVxuICAgICAgLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gbmFtZSk7XG4gICAgdGhpcy5tZW1vLmJ5TmFtZS5lbnVtLnNldChuYW1lLCBlbnVtVHlwZSk7XG4gICAgcmV0dXJuIGVudW1UeXBlO1xuICB9XG5cbiAgcHVibGljIGZpbmRTdHJ1Y3R1cmVkVHlwZUJ5TmFtZTxUPihuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmJ5TmFtZS5zdHJ1Y3R1cmVkLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5ieU5hbWUuc3RydWN0dXJlZC5nZXQobmFtZSkgYXNcbiAgICAgICAgfCBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdHJ1Y3R1cmVkVHlwZSA9IHRoaXMuc2NoZW1hc1xuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW50aXRpZXNdLFxuICAgICAgICA8T0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPltdPltdLFxuICAgICAgKVxuICAgICAgLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gbmFtZSk7XG4gICAgdGhpcy5tZW1vLmJ5TmFtZS5zdHJ1Y3R1cmVkLnNldChuYW1lLCBzdHJ1Y3R1cmVkVHlwZSk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRUeXBlO1xuICB9XG5cbiAgcHVibGljIGZpbmRDYWxsYWJsZUJ5TmFtZTxUPihuYW1lOiBzdHJpbmcsIGJpbmRpbmdUeXBlPzogc3RyaW5nKSB7XG4gICAgY29uc3Qga2V5ID0gYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZCA/IGAke2JpbmRpbmdUeXBlfS8ke25hbWV9YCA6IG5hbWU7XG4gICAgaWYgKHRoaXMubWVtby5ieU5hbWUuY2FsbGFibGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uYnlOYW1lLmNhbGxhYmxlLmdldChrZXkpIGFzIE9EYXRhQ2FsbGFibGU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNhbGxhYmxlID0gdGhpcy5zY2hlbWFzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5jYWxsYWJsZXNdLFxuICAgICAgICA8T0RhdGFDYWxsYWJsZTxUPltdPltdLFxuICAgICAgKVxuICAgICAgLmZpbmQoXG4gICAgICAgIChjKSA9PlxuICAgICAgICAgIGMubmFtZSA9PT0gbmFtZSAmJlxuICAgICAgICAgIChiaW5kaW5nVHlwZSA9PT0gdW5kZWZpbmVkIHx8IGMuYmluZGluZygpPy50eXBlID09PSBiaW5kaW5nVHlwZSksXG4gICAgICApO1xuICAgIHRoaXMubWVtby5ieU5hbWUuY2FsbGFibGUuc2V0KGtleSwgY2FsbGFibGUpO1xuICAgIHJldHVybiBjYWxsYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0QnlOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uYnlOYW1lLmVudGl0eVNldC5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uYnlOYW1lLmVudGl0eVNldC5nZXQobmFtZSkgYXMgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hc1xuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW50aXR5U2V0c10sXG4gICAgICAgIDxPRGF0YUVudGl0eVNldFtdPltdLFxuICAgICAgKVxuICAgICAgLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gbmFtZSk7XG4gICAgdGhpcy5tZW1vLmJ5TmFtZS5lbnRpdHlTZXQuc2V0KG5hbWUsIHNjaGVtYSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kTW9kZWxCeU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlQnlOYW1lPGFueT4obmFtZSk/Lm1vZGVsIGFzXG4gICAgICB8IHR5cGVvZiBPRGF0YU1vZGVsXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kQ29sbGVjdGlvbkJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVCeU5hbWU8YW55PihuYW1lKT8uY29sbGVjdGlvbiBhc1xuICAgICAgfCB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kU2VydmljZUJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kRW50aXR5U2V0QnlOYW1lKG5hbWUpPy5zZXJ2aWNlIGFzXG4gICAgICB8IHR5cGVvZiBPRGF0YUVudGl0eVNlcnZpY2VcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHBhcnNlckZvclR5cGU8VD4odHlwZTogc3RyaW5nIHwgRWRtVHlwZSwgYmluZGluZ1R5cGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSBiaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkID8gYCR7YmluZGluZ1R5cGV9LyR7dHlwZX1gIDogdHlwZTtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUucGFyc2VyLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUucGFyc2VyLmdldChrZXkpIGFzIFBhcnNlcjxUPjtcbiAgICB9XG4gICAgLy8gTm9uZSBQYXJzZXIgYnkgZGVmYXVsdFxuICAgIGxldCBwYXJzZXI6IFBhcnNlcjxUPiA9IE5PTkVfUEFSU0VSO1xuICAgIGlmICh0aGlzLnBhcnNlcnMuaGFzKHR5cGUpKSB7XG4gICAgICAvLyBFZG0sIEJhc2UgUGFyc2Vyc1xuICAgICAgcGFyc2VyID0gdGhpcy5wYXJzZXJzLmdldCh0eXBlKSBhcyBQYXJzZXI8VD47XG4gICAgfSBlbHNlIGlmICghdHlwZS5zdGFydHNXaXRoKCdFZG0uJykpIHtcbiAgICAgIC8vIEVudW1UeXBlLCBDb21wbGV4VHlwZSBhbmQgRW50aXR5VHlwZSBQYXJzZXJzXG4gICAgICBsZXQgdmFsdWUgPVxuICAgICAgICB0aGlzLmZpbmRDYWxsYWJsZUZvclR5cGU8VD4odHlwZSwgYmluZGluZ1R5cGUpIHx8XG4gICAgICAgIHRoaXMuZmluZEVudW1UeXBlRm9yVHlwZTxUPih0eXBlKSB8fFxuICAgICAgICB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4odHlwZSk7XG4gICAgICBwYXJzZXIgPSB2YWx1ZT8ucGFyc2VyIGFzIFBhcnNlcjxUPjtcbiAgICB9XG4gICAgLy8gU2V0IFBhcnNlciBmb3IgbmV4dCB0aW1lXG4gICAgdGhpcy5tZW1vLmZvclR5cGUucGFyc2VyLnNldChrZXksIHBhcnNlcik7XG4gICAgcmV0dXJuIHBhcnNlcjtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kT3B0aW9uc0ZvclR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgLy8gU3RydWN1dHJlZCBPcHRpb25zXG4gICAgaWYgKHRoaXMubWVtby5mb3JUeXBlLm9wdGlvbnMuaGFzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUub3B0aW9ucy5nZXQodHlwZSkgYXNcbiAgICAgICAgfCBPRGF0YU1vZGVsT3B0aW9uczxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3QgPSB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4odHlwZSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHN0Py5tb2RlbD8ubWV0YTtcbiAgICAvLyBTZXQgT3B0aW9ucyBmb3IgbmV4dCB0aW1lXG4gICAgdGhpcy5tZW1vLmZvclR5cGUub3B0aW9ucy5zZXQodHlwZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbn1cbiJdfQ==
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBYyxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFFTCxlQUFlLEVBQ2YsVUFBVSxHQUVYLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsK0JBQStCLEdBQ2hDLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxXQUFXLEVBSVgsV0FBVyxHQUdaLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFJTCxXQUFXLEVBR1gsV0FBVyxHQUdaLE1BQU0sU0FBUyxDQUFDO0FBR2pCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFtQm5CLFlBQVksTUFBaUI7UUFtUTdCLHVCQUF1QjtRQUN2QixVQUFVO1FBQ0YsU0FBSSxHQVFSO1lBQ0YsU0FBUyxFQUFFLElBQUksR0FBRyxFQUEwQztZQUM1RCxlQUFlLEVBQUUsSUFBSSxHQUFHLEVBQWdEO1lBQ3hFLFNBQVMsRUFBRSxJQUFJ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LEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7YUFDaEU7U0FDRjtRQUNELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgTkVWRVIsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9EYXRhQ2FjaGUsIE9EYXRhSW5NZW1vcnlDYWNoZSB9IGZyb20gJy4vY2FjaGUnO1xuaW1wb3J0IHsgREVGQVVMVF9WRVJTSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgTW9kZWxPcHRpb25zLFxuICBPRGF0YUNvbGxlY3Rpb24sXG4gIE9EYXRhTW9kZWwsXG4gIE9EYXRhTW9kZWxPcHRpb25zLFxufSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBPRGF0YUFwaU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFPcHRpb25zLCBPRGF0YVJlc291cmNlLCBPRGF0YVNlZ21lbnQgfSBmcm9tICcuL3Jlc291cmNlcyc7XG5pbXBvcnQge1xuICBPRGF0YVF1ZXJ5T3B0aW9ucyxcbiAgT0RhdGFQYXRoU2VnbWVudHMsXG4gIE9EYXRhUmVxdWVzdCxcbiAgT0RhdGFSZXNwb25zZSxcbiAgT0RhdGFCYXRjaFJlc291cmNlLFxuICBPRGF0YU1ldGFkYXRhUmVzb3VyY2UsXG4gIE9EYXRhQWN0aW9uUmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25SZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbn0gZnJvbSAnLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHtcbiAgRURNX1BBUlNFUlMsXG4gIE9EYXRhQ2FsbGFibGUsXG4gIE9EYXRhRW50aXR5U2V0LFxuICBPRGF0YUVudW1UeXBlLFxuICBPRGF0YVNjaGVtYSxcbiAgT0RhdGFTaW5nbGV0b24sXG4gIE9EYXRhU3RydWN0dXJlZFR5cGUsXG59IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7XG4gIEFwaUNvbmZpZyxcbiAgQXBpT3B0aW9ucyxcbiAgRWRtVHlwZSxcbiAgTk9ORV9QQVJTRVIsXG4gIE9EYXRhVmVyc2lvbixcbiAgUGFyc2VyLFxuICBQYXRoU2VnbWVudCxcbiAgUXVlcnlPcHRpb24sXG4gIFNjaGVtYUNvbmZpZyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YU1ldGFkYXRhIH0gZnJvbSAnLi9tZXRhZGF0YS9tZXRhZGF0YSc7XG5cbi8qKlxuICogQXBpIGFic3RyYWN0aW9uIGZvciBjb25zdW1pbmcgT0RhdGEgc2VydmljZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPRGF0YUFwaSB7XG4gIHJlcXVlc3Rlcj86IChyZXF1ZXN0OiBPRGF0YVJlcXVlc3Q8YW55PikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBzZXJ2aWNlUm9vdFVybDogc3RyaW5nO1xuICBtZXRhZGF0YVVybDogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICB2ZXJzaW9uOiBPRGF0YVZlcnNpb247XG4gIGRlZmF1bHQ6IGJvb2xlYW47XG4gIGNyZWF0aW9uOiBEYXRlO1xuICAvLyBPcHRpb25zXG4gIG9wdGlvbnM6IE9EYXRhQXBpT3B0aW9ucztcbiAgLy8gQ2FjaGVcbiAgY2FjaGUhOiBPRGF0YUNhY2hlO1xuICAvLyBFcnJvciBIYW5kbGVyXG4gIGVycm9ySGFuZGxlcj86IChlcnJvcjogYW55LCBjYXVnaHQ6IE9ic2VydmFibGU8YW55PikgPT4gT2JzZXJ2YWJsZTxuZXZlcj47XG4gIC8vIEJhc2UgUGFyc2Vyc1xuICBwYXJzZXJzOiBNYXA8c3RyaW5nLCBQYXJzZXI8YW55Pj47XG4gIC8vIFNjaGVtYXNcbiAgc2NoZW1hczogT0RhdGFTY2hlbWFbXTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEFwaUNvbmZpZykge1xuICAgIHRoaXMuc2VydmljZVJvb3RVcmwgPSBjb25maWcuc2VydmljZVJvb3RVcmw7XG4gICAgaWYgKHRoaXMuc2VydmljZVJvb3RVcmwuaW5kZXhPZignPycpICE9IC0xKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSAnc2VydmljZVJvb3RVcmwnIHNob3VsZCBub3QgY29udGFpbiBxdWVyeSBzdHJpbmcuIFBsZWFzZSB1c2UgJ3BhcmFtcycgdG8gYWRkIGV4dHJhIHBhcmFtZXRlcnNcIixcbiAgICAgICk7XG4gICAgaWYgKCF0aGlzLnNlcnZpY2VSb290VXJsLmVuZHNXaXRoKCcvJykpIHRoaXMuc2VydmljZVJvb3RVcmwgKz0gJy8nO1xuICAgIHRoaXMubWV0YWRhdGFVcmwgPSBgJHt0aGlzLnNlcnZpY2VSb290VXJsfSRtZXRhZGF0YWA7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy52ZXJzaW9uID0gY29uZmlnLnZlcnNpb24gPz8gREVGQVVMVF9WRVJTSU9OO1xuICAgIHRoaXMuZGVmYXVsdCA9IGNvbmZpZy5kZWZhdWx0ID8/IGZhbHNlO1xuICAgIHRoaXMuY3JlYXRpb24gPSBjb25maWcuY3JlYXRpb24gPz8gbmV3IERhdGUoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBuZXcgT0RhdGFBcGlPcHRpb25zKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgPEFwaU9wdGlvbnM+eyB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfSxcbiAgICAgICAgY29uZmlnLm9wdGlvbnMgfHwge30sXG4gICAgICApLFxuICAgICk7XG5cbiAgICB0aGlzLmNhY2hlID0gKGNvbmZpZy5jYWNoZSBhcyBPRGF0YUNhY2hlKSB8fCBuZXcgT0RhdGFJbk1lbW9yeUNhY2hlKCk7XG4gICAgdGhpcy5lcnJvckhhbmRsZXIgPSBjb25maWcuZXJyb3JIYW5kbGVyO1xuXG4gICAgdGhpcy5wYXJzZXJzID0gbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcucGFyc2VycyB8fCBFRE1fUEFSU0VSUykpO1xuXG4gICAgdGhpcy5zY2hlbWFzID0gKGNvbmZpZy5zY2hlbWFzID8/IFtdKS5tYXAoXG4gICAgICAoc2NoZW1hKSA9PiBuZXcgT0RhdGFTY2hlbWEoc2NoZW1hLCB0aGlzKSxcbiAgICApO1xuICB9XG5cbiAgY29uZmlndXJlKFxuICAgIHNldHRpbmdzOiB7XG4gICAgICByZXF1ZXN0ZXI/OiAocmVxdWVzdDogT0RhdGFSZXF1ZXN0PGFueT4pID0+IE9ic2VydmFibGU8YW55PjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHRoaXMucmVxdWVzdGVyID0gc2V0dGluZ3MucmVxdWVzdGVyO1xuICAgIHRoaXMuc2NoZW1hcy5mb3JFYWNoKChzY2hlbWEpID0+IHtcbiAgICAgIHNjaGVtYS5jb25maWd1cmUoe1xuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcG9wdWxhdGUobWV0YWRhdGE6IE9EYXRhTWV0YWRhdGEpIHtcbiAgICBjb25zdCBjb25maWcgPSBtZXRhZGF0YS50b0NvbmZpZygpO1xuICAgIHRoaXMudmVyc2lvbiA9IGNvbmZpZy52ZXJzaW9uID8/IERFRkFVTFRfVkVSU0lPTjtcbiAgICBjb25zdCBzY2hlbWFzID0gKGNvbmZpZy5zY2hlbWFzID8/IFtdKS5tYXAoXG4gICAgICAoc2NoZW1hKSA9PiBuZXcgT0RhdGFTY2hlbWEoc2NoZW1hLCB0aGlzKSxcbiAgICApO1xuICAgIHRoaXMuc2NoZW1hcyA9IFsuLi50aGlzLnNjaGVtYXMsIC4uLnNjaGVtYXNdO1xuICAgIHNjaGVtYXMuZm9yRWFjaCgoc2NoZW1hKSA9PiB7XG4gICAgICBzY2hlbWEuY29uZmlndXJlKHtcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZyb21Kc29uPFAsIFI+KGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pOiBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+IHwgT0RhdGFGdW5jdGlvblJlc291cmNlPFAsIFI+O1xuICBmcm9tSnNvbjxFPihqc29uOiB7XG4gICAgc2VnbWVudHM6IE9EYXRhU2VnbWVudFtdO1xuICAgIG9wdGlvbnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9KTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8RT47XG4gIGZyb21Kc29uKGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IE9EYXRhUGF0aFNlZ21lbnRzLmZyb21Kc29uKGpzb24uc2VnbWVudHMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gT0RhdGFRdWVyeU9wdGlvbnMuZnJvbUpzb248YW55Pihqc29uLm9wdGlvbnMpO1xuICAgIHN3aXRjaCAoc2VnbWVudHMubGFzdCgpPy5uYW1lIGFzIFBhdGhTZWdtZW50KSB7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LmVudGl0eVNldDpcbiAgICAgICAgaWYgKHNlZ21lbnRzLmxhc3QoKT8uaGFzS2V5KCkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE9EYXRhRW50aXR5UmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBPRGF0YUVudGl0eVNldFJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgICB9XG4gICAgICBjYXNlIFBhdGhTZWdtZW50Lm5hdmlnYXRpb25Qcm9wZXJ0eTpcbiAgICAgICAgcmV0dXJuIG5ldyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgY2FzZSBQYXRoU2VnbWVudC5zaW5nbGV0b246XG4gICAgICAgIHJldHVybiBuZXcgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQuYWN0aW9uOlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhQWN0aW9uUmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LmZ1bmN0aW9uOlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhRnVuY3Rpb25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBSZXNvdXJjZSBmb3IganNvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgbWV0YWRhdGEgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIE9EYXRhTWV0YWRhdGFSZXNvdXJjZVxuICAgKi9cbiAgbWV0YWRhdGEoKTogT0RhdGFNZXRhZGF0YVJlc291cmNlIHtcbiAgICByZXR1cm4gT0RhdGFNZXRhZGF0YVJlc291cmNlLmZhY3RvcnkodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBiYXRjaCByZXNvdXJjZS5cbiAgICogQHJldHVybnMgT0RhdGFCYXRjaFJlc291cmNlXG4gICAqL1xuICBiYXRjaCgpOiBPRGF0YUJhdGNoUmVzb3VyY2Uge1xuICAgIHJldHVybiBPRGF0YUJhdGNoUmVzb3VyY2UuZmFjdG9yeSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHNpbmdsZXRvbiByZXNvdXJjZS5cbiAgICogQHBhcmFtIHBhdGggTmFtZSBvZiB0aGUgc2luZ2xldG9uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzaW5nbGV0b248VD4obmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2luZ2xldG9uID0gdGhpcy5maW5kU2luZ2xldG9uKG5hbWUpO1xuICAgIHJldHVybiBPRGF0YVNpbmdsZXRvblJlc291cmNlLmZhY3Rvcnk8VD4odGhpcywge1xuICAgICAgcGF0aDogc2luZ2xldG9uPy5uYW1lID8/IG5hbWUsXG4gICAgICB0eXBlOiBzaW5nbGV0b24/LnNpbmdsZXRvblR5cGUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW4gZW50aXR5IHNldCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHBhdGggTmFtZSBvZiB0aGUgZW50aXR5IHNldFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZW50aXR5U2V0PFQ+KG5hbWU6IHN0cmluZyk6IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD4ge1xuICAgIGNvbnN0IGVudGl0eVNldCA9IHRoaXMuZmluZEVudGl0eVNldChuYW1lKTtcbiAgICByZXR1cm4gT0RhdGFFbnRpdHlTZXRSZXNvdXJjZS5mYWN0b3J5PFQ+KHRoaXMsIHtcbiAgICAgIHBhdGg6IGVudGl0eVNldD8ubmFtZSA/PyBuYW1lLFxuICAgICAgdHlwZTogZW50aXR5U2V0Py5lbnRpdHlUeXBlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYm91bmQgQWN0aW9uXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcGF0aD9cbiAgICogQHJldHVybnMgT0RhdGFBY3Rpb25SZXNvdXJjZVxuICAgKi9cbiAgYWN0aW9uPFAsIFI+KHBhdGg6IHN0cmluZyk6IE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj4ge1xuICAgIGNvbnN0IGNhbGxhYmxlID0gdGhpcy5maW5kQ2FsbGFibGU8Uj4ocGF0aCk7XG4gICAgcmV0dXJuIE9EYXRhQWN0aW9uUmVzb3VyY2UuZmFjdG9yeTxQLCBSPih0aGlzLCB7XG4gICAgICBwYXRoLFxuICAgICAgb3V0Z29pbmdUeXBlOiBjYWxsYWJsZT8udHlwZSgpLFxuICAgICAgaW5jb21pbmdUeXBlOiBjYWxsYWJsZT8ucmV0dXJuVHlwZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYm91bmQgRnVuY3Rpb25cbiAgICogQHBhcmFtICB7c3RyaW5nfSBwYXRoP1xuICAgKiBAcmV0dXJucyBPRGF0YUZ1bmN0aW9uUmVzb3VyY2VcbiAgICovXG4gIGZ1bmN0aW9uPFAsIFI+KHBhdGg6IHN0cmluZyk6IE9EYXRhRnVuY3Rpb25SZXNvdXJjZTxQLCBSPiB7XG4gICAgY29uc3QgY2FsbGFibGUgPSB0aGlzLmZpbmRDYWxsYWJsZTxSPihwYXRoKTtcbiAgICByZXR1cm4gT0RhdGFGdW5jdGlvblJlc291cmNlLmZhY3Rvcnk8UCwgUj4odGhpcywge1xuICAgICAgcGF0aCxcbiAgICAgIG91dGdvaW5nVHlwZTogY2FsbGFibGU/LnR5cGUoKSxcbiAgICAgIGluY29taW5nVHlwZTogY2FsbGFibGU/LnJldHVyblR5cGUoKSxcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGxhYmxlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRDYWxsYWJsZTxUPih0eXBlKTtcbiAgfVxuXG4gIGVudW1UeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRFbnVtVHlwZTxUPih0eXBlKTtcbiAgfVxuXG4gIHN0cnVjdHVyZWRUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxUPih0eXBlKTtcbiAgfVxuXG4gIC8vcmVxdWVzdChyZXE6IE9EYXRhUmVxdWVzdDxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmVxdWVzdDxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk/OiBhbnk7XG4gICAgICBldGFnPzogc3RyaW5nO1xuICAgICAgcmVzcG9uc2VUeXBlPzpcbiAgICAgICAgfCAnYXJyYXlidWZmZXInXG4gICAgICAgIHwgJ2Jsb2InXG4gICAgICAgIHwgJ2pzb24nXG4gICAgICAgIHwgJ3RleHQnXG4gICAgICAgIHwgJ3ZhbHVlJ1xuICAgICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgICAgfCAnZW50aXR5J1xuICAgICAgICB8ICdlbnRpdGllcyc7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknIHwgJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbltdO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHJlcSA9IE9EYXRhUmVxdWVzdC5mYWN0b3J5KHRoaXMsIG1ldGhvZCwgcmVzb3VyY2UsIHtcbiAgICAgIGJvZHk6IG9wdGlvbnMuYm9keSxcbiAgICAgIGV0YWc6IG9wdGlvbnMuZXRhZyxcbiAgICAgIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dCxcbiAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLFxuICAgICAgb2JzZXJ2ZTogKG9wdGlvbnMub2JzZXJ2ZSA9PT0gJ2V2ZW50cycgPyAnZXZlbnRzJyA6ICdyZXNwb25zZScpIGFzXG4gICAgICAgIHwgJ2V2ZW50cydcbiAgICAgICAgfCAncmVzcG9uc2UnLFxuICAgICAgd2l0aENvdW50OiBvcHRpb25zLndpdGhDb3VudCxcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM6IG9wdGlvbnMuYm9keVF1ZXJ5T3B0aW9ucyxcbiAgICAgIHJlcG9ydFByb2dyZXNzOiBvcHRpb25zLnJlcG9ydFByb2dyZXNzLFxuICAgICAgZmV0Y2hQb2xpY3k6IG9wdGlvbnMuZmV0Y2hQb2xpY3ksXG4gICAgICBwYXJzZXJPcHRpb25zOiBvcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IG9wdGlvbnMud2l0aENyZWRlbnRpYWxzLFxuICAgIH0pO1xuXG4gICAgbGV0IHJlcyQgPSB0aGlzLnJlcXVlc3RlciAhPT0gdW5kZWZpbmVkID8gdGhpcy5yZXF1ZXN0ZXIocmVxKSA6IE5FVkVSO1xuXG4gICAgcmVzJCA9IHJlcyQucGlwZShcbiAgICAgIG1hcCgocmVzOiBIdHRwRXZlbnQ8YW55PikgPT5cbiAgICAgICAgcmVzLnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2VcbiAgICAgICAgICA/IE9EYXRhUmVzcG9uc2UuZnJvbUh0dHBSZXNwb25zZTxhbnk+KHJlcSwgcmVzKVxuICAgICAgICAgIDogcmVzLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZXJyb3JIYW5kbGVyICE9PSB1bmRlZmluZWQpXG4gICAgICByZXMkID0gcmVzJC5waXBlKGNhdGNoRXJyb3IodGhpcy5lcnJvckhhbmRsZXIpKTtcblxuICAgIGlmIChvcHRpb25zLm9ic2VydmUgPT09ICdldmVudHMnKSB7XG4gICAgICByZXR1cm4gcmVzJDtcbiAgICB9XG5cbiAgICByZXMkID0gdGhpcy5jYWNoZS5oYW5kbGVSZXF1ZXN0KHJlcSwgcmVzJCk7XG5cbiAgICBzd2l0Y2ggKG9wdGlvbnMub2JzZXJ2ZSB8fCAnYm9keScpIHtcbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMucmVzcG9uc2VUeXBlKSB7XG4gICAgICAgICAgY2FzZSAnZW50aXRpZXMnOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLmVudGl0aWVzKCkpKTtcbiAgICAgICAgICBjYXNlICdlbnRpdHknOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLmVudGl0eSgpKSk7XG4gICAgICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLnByb3BlcnR5KCkpKTtcbiAgICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMudmFsdWUoKSBhcyBUKSk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIE90aGVyIHJlc3BvbnNlVHlwZXMgKGFycmF5YnVmZmVyLCBibG9iLCBqc29uLCB0ZXh0KSByZXR1cm4gYm9keVxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLmJvZHkpKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAncmVzcG9uc2UnOlxuICAgICAgICAvLyBUaGUgcmVzcG9uc2Ugc3RyZWFtIHdhcyByZXF1ZXN0ZWQgZGlyZWN0bHksIHNvIHJldHVybiBpdC5cbiAgICAgICAgcmV0dXJuIHJlcyQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IG5ldyBmdXR1cmUgb2JzZXJ2ZSB0eXBlcyBiZWluZyBhZGRlZC5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbnJlYWNoYWJsZTogdW5oYW5kbGVkIG9ic2VydmUgdHlwZSAke29wdGlvbnMub2JzZXJ2ZX19YCxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyMgcmVnaW9uIEZpbmQgYnkgVHlwZVxuICAvLyBNZW1vaXplXG4gIHByaXZhdGUgbWVtbzoge1xuICAgIGVudW1UeXBlczogTWFwPHN0cmluZywgT0RhdGFFbnVtVHlwZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICBzdHJ1Y3R1cmVkVHlwZXM6IE1hcDxzdHJpbmcsIE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgY2FsbGFibGVzOiBNYXA8c3RyaW5nLCBPRGF0YUNhbGxhYmxlPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgIGVudGl0eVNldHM6IE1hcDxzdHJpbmcsIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkPjtcbiAgICBzaW5nbGV0b25zOiBNYXA8c3RyaW5nLCBPRGF0YVNpbmdsZXRvbiB8IHVuZGVmaW5lZD47XG4gICAgcGFyc2VyczogTWFwPHN0cmluZywgUGFyc2VyPGFueT4+O1xuICAgIG9wdGlvbnM6IE1hcDxzdHJpbmcsIE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ+O1xuICB9ID0ge1xuICAgIGVudW1UeXBlczogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW51bVR5cGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICBzdHJ1Y3R1cmVkVHlwZXM6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgY2FsbGFibGVzOiBuZXcgTWFwPHN0cmluZywgT0RhdGFDYWxsYWJsZTxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgIGVudGl0eVNldHM6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUVudGl0eVNldCB8IHVuZGVmaW5lZD4oKSxcbiAgICBzaW5nbGV0b25zOiBuZXcgTWFwPHN0cmluZywgT0RhdGFTaW5nbGV0b24gfCB1bmRlZmluZWQ+KCksXG4gICAgcGFyc2VyczogbmV3IE1hcDxzdHJpbmcsIFBhcnNlcjxhbnk+PigpLFxuICAgIG9wdGlvbnM6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICB9O1xuXG4gIHB1YmxpYyBjcmVhdGVTY2hlbWEoY29uZmlnOiBTY2hlbWFDb25maWcpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBuZXcgT0RhdGFTY2hlbWEoY29uZmlnLCB0aGlzKTtcbiAgICBzY2hlbWEuY29uZmlndXJlKHtcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5wYXJzZXJPcHRpb25zLFxuICAgIH0pO1xuICAgIHRoaXMuc2NoZW1hcy5wdXNoKHNjaGVtYSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kU2NoZW1hKHR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHNjaGVtYXMgPSB0aGlzLnNjaGVtYXMuZmlsdGVyKChzKSA9PiBzLmlzTmFtZXNwYWNlT2YodHlwZSkpO1xuICAgIGlmIChzY2hlbWFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc2NoZW1hcy5sZW5ndGggPT09IDEpIHJldHVybiBzY2hlbWFzWzBdO1xuICAgIHJldHVybiBzY2hlbWFzXG4gICAgICAuc29ydCgoczEsIHMyKSA9PiBzMS5uYW1lc3BhY2UubGVuZ3RoIC0gczIubmFtZXNwYWNlLmxlbmd0aClcbiAgICAgIC5wb3AoKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBFbnVtVHlwZXNcbiAgcHVibGljIGZpbmRFbnVtVHlwZTxUPih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5lbnVtVHlwZXMuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5lbnVtVHlwZXMuZ2V0KHZhbHVlKSBhcyBPRGF0YUVudW1UeXBlPFQ+IHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnVtVHlwZXMgPSB0aGlzLnNjaGVtYXMucmVkdWNlKFxuICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW51bXNdLFxuICAgICAgPE9EYXRhRW51bVR5cGU8VD5bXT5bXSxcbiAgICApO1xuICAgIGxldCBlbnVtVHlwZSA9IGVudW1UeXBlcy5maW5kKChlKSA9PiBlLnR5cGUoKSA9PT0gdmFsdWUpO1xuICAgIGVudW1UeXBlID0gZW51bVR5cGUgPz8gZW51bVR5cGVzLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gdmFsdWUpO1xuICAgIHRoaXMubWVtby5lbnVtVHlwZXMuc2V0KHZhbHVlLCBlbnVtVHlwZSk7XG4gICAgcmV0dXJuIGVudW1UeXBlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBTdHJ1Y3R1cmVkVHlwZXNcbiAgcHVibGljIGZpbmRTdHJ1Y3R1cmVkVHlwZTxUPih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5zdHJ1Y3R1cmVkVHlwZXMuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5zdHJ1Y3R1cmVkVHlwZXMuZ2V0KHZhbHVlKSBhc1xuICAgICAgICB8IE9EYXRhU3RydWN0dXJlZFR5cGU8VD5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0cnVjdHVyZWRUeXBlcyA9IHRoaXMuc2NoZW1hcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnRpdGllc10sXG4gICAgICA8T0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPltdPltdLFxuICAgICk7XG4gICAgbGV0IHN0cnVjdHVyZWRUeXBlID0gc3RydWN0dXJlZFR5cGVzLmZpbmQoKGUpID0+IGUudHlwZSgpID09PSB2YWx1ZSk7XG4gICAgc3RydWN0dXJlZFR5cGUgPVxuICAgICAgc3RydWN0dXJlZFR5cGUgPz8gc3RydWN0dXJlZFR5cGVzLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gdmFsdWUpO1xuICAgIHRoaXMubWVtby5zdHJ1Y3R1cmVkVHlwZXMuc2V0KHZhbHVlLCBzdHJ1Y3R1cmVkVHlwZSk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRUeXBlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDYWxsYWJsZXNcbiAgcHVibGljIGZpbmRDYWxsYWJsZTxSPih2YWx1ZTogc3RyaW5nLCBiaW5kaW5nVHlwZT86IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgPyBgJHtiaW5kaW5nVHlwZX0vJHt2YWx1ZX1gIDogdmFsdWU7XG4gICAgaWYgKHRoaXMubWVtby5jYWxsYWJsZXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uY2FsbGFibGVzLmdldChrZXkpIGFzIE9EYXRhQ2FsbGFibGU8Uj4gfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYmluZGluZ1N0cnVjdHVyZWRUeXBlID1cbiAgICAgIGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxhbnk+KGJpbmRpbmdUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjYWxsYWJsZXMgPSB0aGlzLnNjaGVtYXMucmVkdWNlKFxuICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuY2FsbGFibGVzXSxcbiAgICAgIDxPRGF0YUNhbGxhYmxlPFI+W10+W10sXG4gICAgKTtcbiAgICBsZXQgY2FsbGFibGUgPSBjYWxsYWJsZXMuZmluZCgoYykgPT4ge1xuICAgICAgY29uc3QgaXNDYWxsYWJsZVR5cGUgPSBjLnR5cGUoKSA9PSB2YWx1ZTtcbiAgICAgIGNvbnN0IGNhbGxhYmxlQmluZGluZ1R5cGUgPSBjLmJpbmRpbmcoKT8udHlwZTtcbiAgICAgIGNvbnN0IGNhbGxhYmxlQmluZGluZ1N0cnVjdHVyZWRUeXBlID1cbiAgICAgICAgY2FsbGFibGVCaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZShjYWxsYWJsZUJpbmRpbmdUeXBlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBpc0NhbGxhYmxlVHlwZSAmJlxuICAgICAgICAoIWJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSB8fFxuICAgICAgICAgIChjYWxsYWJsZUJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSAmJlxuICAgICAgICAgICAgYmluZGluZ1N0cnVjdHVyZWRUeXBlLmlzU3VidHlwZU9mKGNhbGxhYmxlQmluZGluZ1N0cnVjdHVyZWRUeXBlKSkpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNhbGxhYmxlID1cbiAgICAgIGNhbGxhYmxlID8/XG4gICAgICBjYWxsYWJsZXMuZmluZCgoYykgPT4ge1xuICAgICAgICBjb25zdCBpc0NhbGxhYmxlVHlwZSA9IGMubmFtZSA9PSB2YWx1ZTtcbiAgICAgICAgY29uc3QgY2FsbGFibGVCaW5kaW5nVHlwZSA9IGMuYmluZGluZygpPy50eXBlO1xuICAgICAgICBjb25zdCBjYWxsYWJsZUJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSA9XG4gICAgICAgICAgY2FsbGFibGVCaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlKGNhbGxhYmxlQmluZGluZ1R5cGUpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGlzQ2FsbGFibGVUeXBlICYmXG4gICAgICAgICAgKCFiaW5kaW5nU3RydWN0dXJlZFR5cGUgfHxcbiAgICAgICAgICAgIChjYWxsYWJsZUJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSAmJlxuICAgICAgICAgICAgICBiaW5kaW5nU3RydWN0dXJlZFR5cGUuaXNTdWJ0eXBlT2YoY2FsbGFibGVCaW5kaW5nU3RydWN0dXJlZFR5cGUpKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5tZW1vLmNhbGxhYmxlcy5zZXQoa2V5LCBjYWxsYWJsZSk7XG4gICAgcmV0dXJuIGNhbGxhYmxlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBFbnRpdHlTZXRzXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmVudGl0eVNldHMuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5lbnRpdHlTZXRzLmdldCh2YWx1ZSkgYXMgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGVudGl0eVNldHMgPSB0aGlzLnNjaGVtYXMucmVkdWNlKFxuICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW50aXR5U2V0c10sXG4gICAgICA8T0RhdGFFbnRpdHlTZXRbXT5bXSxcbiAgICApO1xuICAgIGxldCBlbnRpdHlTZXQgPSBlbnRpdHlTZXRzLmZpbmQoKGUpID0+IGUudHlwZSgpID09PSB2YWx1ZSk7XG4gICAgZW50aXR5U2V0ID0gZW50aXR5U2V0ID8/IGVudGl0eVNldHMuZmluZCgoZSkgPT4gZS5uYW1lID09PSB2YWx1ZSk7XG4gICAgdGhpcy5tZW1vLmVudGl0eVNldHMuc2V0KHZhbHVlLCBlbnRpdHlTZXQpO1xuICAgIHJldHVybiBlbnRpdHlTZXQ7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFNpbmdsZXRvbnNcbiAgcHVibGljIGZpbmRTaW5nbGV0b24odmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uc2luZ2xldG9ucy5oYXModmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLnNpbmdsZXRvbnMuZ2V0KHZhbHVlKSBhcyBPRGF0YVNpbmdsZXRvbiB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc2luZ2xldG9ucyA9IHRoaXMuc2NoZW1hcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5zaW5nbGV0b25zXSxcbiAgICAgIDxPRGF0YVNpbmdsZXRvbltdPltdLFxuICAgICk7XG4gICAgbGV0IHNpbmdsZXRvbiA9IHNpbmdsZXRvbnMuZmluZCgoZSkgPT4gZS50eXBlKCkgPT09IHZhbHVlKTtcbiAgICBzaW5nbGV0b24gPSBzaW5nbGV0b24gPz8gc2luZ2xldG9ucy5maW5kKChlKSA9PiBlLm5hbWUgPT09IHZhbHVlKTtcbiAgICB0aGlzLm1lbW8uc2luZ2xldG9ucy5zZXQodmFsdWUsIHNpbmdsZXRvbik7XG4gICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBwdWJsaWMgZmluZE1vZGVsKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxhbnk+KHR5cGUpPy5tb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVNb2RlbChzdHJ1Y3R1cmVkOiBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4pIHtcbiAgICBpZiAoc3RydWN0dXJlZC5tb2RlbCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gc3RydWN0dXJlZC5tb2RlbDtcbiAgICAvLyBCdWlsZCBBZC1ob2MgbW9kZWxcbiAgICBjb25zdCBNb2RlbCA9IGNsYXNzIGV4dGVuZHMgT0RhdGFNb2RlbDxhbnk+IHt9IGFzIHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgIC8vIEJ1aWxkIE1ldGFcbiAgICBNb2RlbC5tZXRhID0gdGhpcy5vcHRpb25zRm9yVHlwZShzdHJ1Y3R1cmVkLnR5cGUoKSwge1xuICAgICAgc3RydWN0dXJlZFR5cGU6IHN0cnVjdHVyZWQsXG4gICAgfSkhO1xuICAgIGlmIChNb2RlbC5tZXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIENvbmZpZ3VyZVxuICAgICAgTW9kZWwubWV0YS5jb25maWd1cmUoe1xuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTdG9yZSBOZXcgTW9kZWwgZm9yIG5leHQgdGltZVxuICAgIHN0cnVjdHVyZWQubW9kZWwgPSBNb2RlbDtcbiAgICByZXR1cm4gTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgbW9kZWxGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuZmluZE1vZGVsKHR5cGUpO1xuICAgIGlmIChNb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzdHJ1Y3R1cmVkID0gdGhpcy5maW5kU3RydWN0dXJlZFR5cGU8YW55Pih0eXBlKTtcbiAgICAgIGlmIChzdHJ1Y3R1cmVkID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRocm93IEVycm9yKGBObyBzdHJ1Y3R1cmVkIHR5cGUgZm9yICR7dHlwZX1gKTtcbiAgICAgIE1vZGVsID0gdGhpcy5jcmVhdGVNb2RlbChzdHJ1Y3R1cmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIE1vZGVsO1xuICB9XG5cbiAgcHVibGljIGZpbmRDb2xsZWN0aW9uKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxhbnk+KHR5cGUpPy5jb2xsZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUNvbGxlY3Rpb24oXG4gICAgc3RydWN0dXJlZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+LFxuICAgIG1vZGVsPzogdHlwZW9mIE9EYXRhTW9kZWw8YW55PixcbiAgKSB7XG4gICAgaWYgKHN0cnVjdHVyZWQuY29sbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gc3RydWN0dXJlZC5jb2xsZWN0aW9uO1xuICAgIGlmIChtb2RlbCA9PT0gdW5kZWZpbmVkKSBtb2RlbCA9IHRoaXMuY3JlYXRlTW9kZWwoc3RydWN0dXJlZCk7XG4gICAgY29uc3QgQ29sbGVjdGlvbiA9IGNsYXNzIGV4dGVuZHMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PiB7XG4gICAgICBzdGF0aWMgb3ZlcnJpZGUgbW9kZWwgPSBtb2RlbCE7XG4gICAgfSBhcyB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uO1xuICAgIHN0cnVjdHVyZWQuY29sbGVjdGlvbiA9IENvbGxlY3Rpb247XG4gICAgcmV0dXJuIENvbGxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgY29sbGVjdGlvbkZvclR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IENvbGxlY3Rpb24gPSB0aGlzLmZpbmRDb2xsZWN0aW9uKHR5cGUpO1xuICAgIGlmIChDb2xsZWN0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHN0cnVjdHVyZWQgPSB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxhbnk+KHR5cGUpO1xuICAgICAgaWYgKHN0cnVjdHVyZWQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHN0cnVjdHVyZWQgdHlwZSBmb3IgJHt0eXBlfWApO1xuICAgICAgY29uc3QgTW9kZWwgPSB0aGlzLm1vZGVsRm9yVHlwZSh0eXBlKTtcbiAgICAgIENvbGxlY3Rpb24gPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb24oc3RydWN0dXJlZCwgTW9kZWwpO1xuICAgIH1cbiAgICByZXR1cm4gQ29sbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0Rm9yRW50aXR5VHlwZShlbnRpdHlUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmVudGl0eVNldHMuaGFzKGVudGl0eVR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmVudGl0eVNldHMuZ2V0KGVudGl0eVR5cGUpIGFzIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnRpdHlTZXQgPSB0aGlzLnNjaGVtYXNcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmVudGl0eVNldHNdLFxuICAgICAgICA8T0RhdGFFbnRpdHlTZXRbXT5bXSxcbiAgICAgIClcbiAgICAgIC5maW5kKChlKSA9PiBlLmVudGl0eVR5cGUgPT09IGVudGl0eVR5cGUpO1xuICAgIHRoaXMubWVtby5lbnRpdHlTZXRzLnNldChlbnRpdHlUeXBlLCBlbnRpdHlTZXQpO1xuICAgIHJldHVybiBlbnRpdHlTZXQ7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VyRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcgfCBFZG1UeXBlLCBiaW5kaW5nVHlwZT86IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgPyBgJHtiaW5kaW5nVHlwZX0vJHt0eXBlfWAgOiB0eXBlO1xuICAgIGlmICh0aGlzLm1lbW8ucGFyc2Vycy5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5wYXJzZXJzLmdldChrZXkpIGFzIFBhcnNlcjxUPjtcbiAgICB9XG4gICAgLy8gTm9uZSBQYXJzZXIgYnkgZGVmYXVsdFxuICAgIGxldCBwYXJzZXI6IFBhcnNlcjxUPiA9IE5PTkVfUEFSU0VSO1xuICAgIGlmICh0aGlzLnBhcnNlcnMuaGFzKHR5cGUpKSB7XG4gICAgICAvLyBFZG0sIEJhc2UgUGFyc2Vyc1xuICAgICAgcGFyc2VyID0gdGhpcy5wYXJzZXJzLmdldCh0eXBlKSBhcyBQYXJzZXI8VD47XG4gICAgfSBlbHNlIGlmICghdHlwZS5zdGFydHNXaXRoKCdFZG0uJykpIHtcbiAgICAgIC8vIENhbGxhYmxlLCBFbnVtVHlwZSwgU3RydWN0dXJlZFR5cGUgKENvbXBsZXhUeXBlIGFuZCBFbnRpdHlUeXBlKSBQYXJzZXJzXG4gICAgICBsZXQgdmFsdWUgPVxuICAgICAgICB0aGlzLmZpbmRDYWxsYWJsZTxUPih0eXBlLCBiaW5kaW5nVHlwZSkgPz9cbiAgICAgICAgdGhpcy5maW5kRW51bVR5cGU8VD4odHlwZSkgPz9cbiAgICAgICAgdGhpcy5maW5kU3RydWN0dXJlZFR5cGU8VD4odHlwZSk7XG4gICAgICBwYXJzZXIgPSB2YWx1ZT8ucGFyc2VyIGFzIFBhcnNlcjxUPjtcbiAgICB9XG4gICAgLy8gU2V0IFBhcnNlciBmb3IgbmV4dCB0aW1lXG4gICAgdGhpcy5tZW1vLnBhcnNlcnMuc2V0KGtleSwgcGFyc2VyKTtcbiAgICByZXR1cm4gcGFyc2VyO1xuICB9XG5cbiAgcHVibGljIG9wdGlvbnNGb3JUeXBlPFQ+KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICB7XG4gICAgICBzdHJ1Y3R1cmVkVHlwZSxcbiAgICAgIGNvbmZpZyxcbiAgICB9OiB7IHN0cnVjdHVyZWRUeXBlPzogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPjsgY29uZmlnPzogTW9kZWxPcHRpb25zIH0gPSB7fSxcbiAgKSB7XG4gICAgLy8gU3RydWN1dHJlZCBPcHRpb25zXG4gICAgaWYgKHRoaXMubWVtby5vcHRpb25zLmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5vcHRpb25zLmdldCh0eXBlKSBhcyBPRGF0YU1vZGVsT3B0aW9uczxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsZXQgbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8VD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlLnN0YXJ0c1dpdGgoJ0VkbS4nKSkge1xuICAgICAgc3RydWN0dXJlZFR5cGUgPSB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxUPih0eXBlKSA/PyBzdHJ1Y3R1cmVkVHlwZTtcbiAgICAgIGlmIChzdHJ1Y3R1cmVkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGEgPSBPRGF0YU1vZGVsLmJ1aWxkTWV0YU9wdGlvbnMoeyBjb25maWcsIHN0cnVjdHVyZWRUeXBlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTZXQgT3B0aW9ucyBmb3IgbmV4dCB0aW1lXG4gICAgdGhpcy5tZW1vLm9wdGlvbnMuc2V0KHR5cGUsIG1ldGEpO1xuICAgIHJldHVybiBtZXRhO1xuICB9XG59XG4iXX0=