angular-odata 0.128.0 → 0.131.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 (246) hide show
  1. package/README.md +27 -244
  2. package/fesm2022/angular-odata.mjs +2320 -1118
  3. package/fesm2022/angular-odata.mjs.map +1 -1
  4. package/lib/api.d.ts +10 -11
  5. package/lib/cache/cache.d.ts +2 -2
  6. package/lib/cache/memory.d.ts +2 -2
  7. package/lib/cache/storage.d.ts +2 -2
  8. package/lib/index.d.ts +1 -0
  9. package/lib/loaders.d.ts +8 -8
  10. package/lib/metadata/csdl/csdl-annotation.d.ts +62 -26
  11. package/lib/metadata/csdl/csdl-entity-container.d.ts +8 -3
  12. package/lib/metadata/csdl/csdl-entity-set.d.ts +7 -2
  13. package/lib/metadata/csdl/csdl-enum-type.d.ts +11 -3
  14. package/lib/metadata/csdl/csdl-function-action.d.ts +54 -11
  15. package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
  16. package/lib/metadata/csdl/csdl-reference.d.ts +26 -3
  17. package/lib/metadata/csdl/csdl-schema.d.ts +5 -2
  18. package/lib/metadata/csdl/csdl-singleton.d.ts +5 -0
  19. package/lib/metadata/csdl/csdl-structural-property.d.ts +19 -3
  20. package/lib/metadata/csdl/csdl-structured-type.d.ts +28 -7
  21. package/lib/metadata/csdl/csdl-type-definition.d.ts +3 -0
  22. package/lib/metadata/metadata.d.ts +16 -3
  23. package/lib/models/collection.d.ts +2 -1
  24. package/lib/models/model.d.ts +6 -5
  25. package/lib/models/options.d.ts +11 -4
  26. package/lib/module.d.ts +3 -3
  27. package/lib/options.d.ts +3 -3
  28. package/lib/resources/path/segments.d.ts +3 -3
  29. package/lib/resources/query/builder.d.ts +3 -2
  30. package/lib/resources/query/expressions/apply.d.ts +1 -1
  31. package/lib/resources/query/expressions/compute.d.ts +1 -1
  32. package/lib/resources/query/expressions/count.d.ts +1 -1
  33. package/lib/resources/query/expressions/expand.d.ts +5 -2
  34. package/lib/resources/query/expressions/filter.d.ts +2 -1
  35. package/lib/resources/query/expressions/orderby.d.ts +2 -1
  36. package/lib/resources/query/expressions/search.d.ts +2 -1
  37. package/lib/resources/query/expressions/select.d.ts +2 -1
  38. package/lib/resources/query/expressions/syntax.d.ts +2 -2
  39. package/lib/resources/query/handlers.d.ts +17 -5
  40. package/lib/resources/query/options.d.ts +3 -3
  41. package/lib/resources/resource.d.ts +36 -8
  42. package/lib/resources/types/action.d.ts +4 -4
  43. package/lib/resources/types/entity-set.d.ts +15 -8
  44. package/lib/resources/types/entity.d.ts +5 -1
  45. package/lib/resources/types/function.d.ts +4 -4
  46. package/lib/resources/types/navigation-property.d.ts +12 -3
  47. package/lib/resources/types/property.d.ts +14 -3
  48. package/lib/resources/types/singleton.d.ts +5 -1
  49. package/lib/schema/annotation.d.ts +3 -3
  50. package/lib/schema/callable.d.ts +3 -3
  51. package/lib/schema/element.d.ts +3 -3
  52. package/lib/schema/entity-container.d.ts +2 -2
  53. package/lib/schema/entity-set.d.ts +2 -2
  54. package/lib/schema/enum-type.d.ts +10 -10
  55. package/lib/schema/parsers/callable.d.ts +4 -4
  56. package/lib/schema/parsers/enum-type.d.ts +15 -15
  57. package/lib/schema/parsers/structured-type.d.ts +8 -5
  58. package/lib/schema/schema.d.ts +3 -3
  59. package/lib/schema/singleton.d.ts +2 -2
  60. package/lib/schema/structured-type.d.ts +7 -4
  61. package/lib/services/entity-set.d.ts +9 -6
  62. package/lib/services/entity.d.ts +1 -1
  63. package/lib/services/singleton.d.ts +1 -1
  64. package/lib/settings.d.ts +2 -2
  65. package/lib/types.d.ts +82 -69
  66. package/lib/utils/enums.d.ts +12 -12
  67. package/lib/utils/http.d.ts +1 -1
  68. package/lib/utils/objects.d.ts +1 -1
  69. package/lib/utils/odata.d.ts +2 -2
  70. package/lib/utils/strings.d.ts +2 -2
  71. package/package.json +3 -5
  72. package/schematics/apigen/angular/api-config.js +7 -1
  73. package/schematics/apigen/angular/api-config.js.map +1 -1
  74. package/schematics/apigen/angular/base.d.ts +22 -2
  75. package/schematics/apigen/angular/base.js +82 -42
  76. package/schematics/apigen/angular/base.js.map +1 -1
  77. package/schematics/apigen/angular/entity.js +7 -1
  78. package/schematics/apigen/angular/entity.js.map +1 -1
  79. package/schematics/apigen/angular/enum.js +1 -0
  80. package/schematics/apigen/angular/enum.js.map +1 -1
  81. package/schematics/apigen/angular/module.js.map +1 -1
  82. package/schematics/apigen/angular/service.js +3 -2
  83. package/schematics/apigen/angular/service.js.map +1 -1
  84. package/schematics/apigen/files/api-config/__fileName__.ts +8 -6
  85. package/schematics/apigen/files/entity/__fileName__.ts +2 -2
  86. package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +1 -1
  87. package/schematics/apigen/files/entityset-service/__fileName__.ts +1 -1
  88. package/schematics/apigen/files/enum/__fileName__.ts +1 -1
  89. package/schematics/apigen/files/metadata/metadata.json +1 -0
  90. package/schematics/apigen/files/singleton-service/__fileName__.ts +1 -1
  91. package/schematics/apigen/index.js +56 -12
  92. package/schematics/apigen/index.js.map +1 -1
  93. package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +56 -23
  94. package/schematics/apigen/metadata/csdl/csdl-annotation.js +143 -13
  95. package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -1
  96. package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +3 -0
  97. package/schematics/apigen/metadata/csdl/csdl-entity-container.js +19 -0
  98. package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -1
  99. package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +3 -0
  100. package/schematics/apigen/metadata/csdl/csdl-entity-set.js +11 -0
  101. package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -1
  102. package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +6 -0
  103. package/schematics/apigen/metadata/csdl/csdl-enum-type.js +17 -0
  104. package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -1
  105. package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +37 -0
  106. package/schematics/apigen/metadata/csdl/csdl-function-action.js +52 -0
  107. package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -1
  108. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
  109. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +6 -0
  110. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -1
  111. package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +15 -3
  112. package/schematics/apigen/metadata/csdl/csdl-reference.js +26 -2
  113. package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -1
  114. package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +3 -0
  115. package/schematics/apigen/metadata/csdl/csdl-schema.js +37 -0
  116. package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -1
  117. package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +3 -0
  118. package/schematics/apigen/metadata/csdl/csdl-singleton.js +8 -0
  119. package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -1
  120. package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +16 -0
  121. package/schematics/apigen/metadata/csdl/csdl-structural-property.js +53 -0
  122. package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -1
  123. package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +22 -3
  124. package/schematics/apigen/metadata/csdl/csdl-structured-type.js +47 -2
  125. package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -1
  126. package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +3 -0
  127. package/schematics/apigen/metadata/csdl/csdl-type-definition.js +19 -0
  128. package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -1
  129. package/schematics/apigen/metadata/metadata.d.ts +10 -0
  130. package/schematics/apigen/metadata/metadata.js +12 -6
  131. package/schematics/apigen/metadata/metadata.js.map +1 -1
  132. package/schematics/apigen/metadata/parser.js.map +1 -1
  133. package/schematics/apigen/schema.d.ts +2 -1
  134. package/schematics/apigen/schema.json +15 -14
  135. package/schematics/apigen/utils.d.ts +1 -0
  136. package/schematics/apigen/utils.js +25 -1
  137. package/schematics/apigen/utils.js.map +1 -1
  138. package/schematics/ng-add/index.js +1 -2
  139. package/schematics/ng-add/index.js.map +1 -1
  140. package/esm2022/angular-odata.mjs +0 -5
  141. package/esm2022/lib/annotations.mjs +0 -140
  142. package/esm2022/lib/api.mjs +0 -419
  143. package/esm2022/lib/cache/cache.mjs +0 -175
  144. package/esm2022/lib/cache/index.mjs +0 -4
  145. package/esm2022/lib/cache/memory.mjs +0 -30
  146. package/esm2022/lib/cache/storage.mjs +0 -55
  147. package/esm2022/lib/client.mjs +0 -212
  148. package/esm2022/lib/constants.mjs +0 -95
  149. package/esm2022/lib/helper.mjs +0 -280
  150. package/esm2022/lib/index.mjs +0 -21
  151. package/esm2022/lib/loaders.mjs +0 -39
  152. package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -95
  153. package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -27
  154. package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -24
  155. package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -37
  156. package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -94
  157. package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -7
  158. package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -23
  159. package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -39
  160. package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -15
  161. package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -70
  162. package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -92
  163. package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -15
  164. package/esm2022/lib/metadata/index.mjs +0 -3
  165. package/esm2022/lib/metadata/metadata.mjs +0 -14
  166. package/esm2022/lib/metadata/parser.mjs +0 -563
  167. package/esm2022/lib/models/collection.mjs +0 -814
  168. package/esm2022/lib/models/index.mjs +0 -4
  169. package/esm2022/lib/models/model.mjs +0 -553
  170. package/esm2022/lib/models/options.mjs +0 -1179
  171. package/esm2022/lib/module.mjs +0 -55
  172. package/esm2022/lib/options.mjs +0 -36
  173. package/esm2022/lib/resources/index.mjs +0 -7
  174. package/esm2022/lib/resources/options.mjs +0 -56
  175. package/esm2022/lib/resources/path/handlers.mjs +0 -79
  176. package/esm2022/lib/resources/path/index.mjs +0 -3
  177. package/esm2022/lib/resources/path/segments.mjs +0 -148
  178. package/esm2022/lib/resources/query/builder.mjs +0 -636
  179. package/esm2022/lib/resources/query/expressions/apply.mjs +0 -236
  180. package/esm2022/lib/resources/query/expressions/base.mjs +0 -25
  181. package/esm2022/lib/resources/query/expressions/compute.mjs +0 -54
  182. package/esm2022/lib/resources/query/expressions/count.mjs +0 -116
  183. package/esm2022/lib/resources/query/expressions/expand.mjs +0 -147
  184. package/esm2022/lib/resources/query/expressions/filter.mjs +0 -178
  185. package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
  186. package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -79
  187. package/esm2022/lib/resources/query/expressions/search.mjs +0 -141
  188. package/esm2022/lib/resources/query/expressions/select.mjs +0 -47
  189. package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -751
  190. package/esm2022/lib/resources/query/handlers.mjs +0 -420
  191. package/esm2022/lib/resources/query/index.mjs +0 -5
  192. package/esm2022/lib/resources/query/options.mjs +0 -139
  193. package/esm2022/lib/resources/request.mjs +0 -196
  194. package/esm2022/lib/resources/resource.mjs +0 -311
  195. package/esm2022/lib/resources/response.mjs +0 -174
  196. package/esm2022/lib/resources/types/action.mjs +0 -116
  197. package/esm2022/lib/resources/types/batch.mjs +0 -428
  198. package/esm2022/lib/resources/types/count.mjs +0 -33
  199. package/esm2022/lib/resources/types/entity-set.mjs +0 -131
  200. package/esm2022/lib/resources/types/entity.mjs +0 -112
  201. package/esm2022/lib/resources/types/function.mjs +0 -146
  202. package/esm2022/lib/resources/types/index.mjs +0 -15
  203. package/esm2022/lib/resources/types/media.mjs +0 -44
  204. package/esm2022/lib/resources/types/metadata.mjs +0 -35
  205. package/esm2022/lib/resources/types/navigation-property.mjs +0 -256
  206. package/esm2022/lib/resources/types/options.mjs +0 -2
  207. package/esm2022/lib/resources/types/property.mjs +0 -197
  208. package/esm2022/lib/resources/types/reference.mjs +0 -87
  209. package/esm2022/lib/resources/types/singleton.mjs +0 -130
  210. package/esm2022/lib/resources/types/value.mjs +0 -48
  211. package/esm2022/lib/schema/annotation.mjs +0 -37
  212. package/esm2022/lib/schema/callable.mjs +0 -66
  213. package/esm2022/lib/schema/element.mjs +0 -67
  214. package/esm2022/lib/schema/entity-container.mjs +0 -11
  215. package/esm2022/lib/schema/entity-set.mjs +0 -9
  216. package/esm2022/lib/schema/enum-type.mjs +0 -68
  217. package/esm2022/lib/schema/index.mjs +0 -9
  218. package/esm2022/lib/schema/parsers/callable.mjs +0 -110
  219. package/esm2022/lib/schema/parsers/edm.mjs +0 -101
  220. package/esm2022/lib/schema/parsers/enum-type.mjs +0 -130
  221. package/esm2022/lib/schema/parsers/index.mjs +0 -5
  222. package/esm2022/lib/schema/parsers/structured-type.mjs +0 -514
  223. package/esm2022/lib/schema/schema.mjs +0 -45
  224. package/esm2022/lib/schema/singleton.mjs +0 -9
  225. package/esm2022/lib/schema/structured-type.mjs +0 -213
  226. package/esm2022/lib/services/base.mjs +0 -29
  227. package/esm2022/lib/services/entity-set.mjs +0 -155
  228. package/esm2022/lib/services/entity.mjs +0 -12
  229. package/esm2022/lib/services/factory.mjs +0 -44
  230. package/esm2022/lib/services/index.mjs +0 -5
  231. package/esm2022/lib/services/singleton.mjs +0 -54
  232. package/esm2022/lib/settings.mjs +0 -112
  233. package/esm2022/lib/types.mjs +0 -118
  234. package/esm2022/lib/utils/arraybuffers.mjs +0 -46
  235. package/esm2022/lib/utils/arrays.mjs +0 -10
  236. package/esm2022/lib/utils/dates.mjs +0 -18
  237. package/esm2022/lib/utils/durations.mjs +0 -40
  238. package/esm2022/lib/utils/enums.mjs +0 -61
  239. package/esm2022/lib/utils/http.mjs +0 -95
  240. package/esm2022/lib/utils/index.mjs +0 -10
  241. package/esm2022/lib/utils/objects.mjs +0 -204
  242. package/esm2022/lib/utils/odata.mjs +0 -22
  243. package/esm2022/lib/utils/strings.mjs +0 -20
  244. package/esm2022/lib/utils/types.mjs +0 -136
  245. package/esm2022/lib/utils/urls.mjs +0 -24
  246. package/esm2022/public-api.mjs +0 -5
@@ -1,419 +0,0 @@
1
- import { HttpEventType } from '@angular/common/http';
2
- import { NEVER } from 'rxjs';
3
- import { catchError, map } from 'rxjs/operators';
4
- import { ODataInMemoryCache } from './cache';
5
- import { DEFAULT_VERSION } from './constants';
6
- import { ODataCollection, ODataModel, } from './models';
7
- import { ODataApiOptions } from './options';
8
- import { ODataQueryOptions, ODataPathSegments, ODataRequest, ODataResponse, ODataBatchResource, ODataMetadataResource, ODataActionResource, ODataFunctionResource, ODataEntityResource, ODataEntitySetResource, ODataSingletonResource, ODataNavigationPropertyResource, } from './resources';
9
- import { EDM_PARSERS, ODataSchema, } from './schema';
10
- import { NONE_PARSER, PathSegment, } from './types';
11
- /**
12
- * Api abstraction for consuming OData services.
13
- */
14
- export class ODataApi {
15
- constructor(config) {
16
- //# region Find by Type
17
- // Memoize
18
- this.memo = {
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(),
26
- };
27
- this.serviceRootUrl = config.serviceRootUrl;
28
- if (this.serviceRootUrl.indexOf('?') != -1)
29
- throw new Error("The 'serviceRootUrl' should not contain query string. Please use 'params' to add extra parameters");
30
- if (!this.serviceRootUrl.endsWith('/'))
31
- this.serviceRootUrl += '/';
32
- this.metadataUrl = `${this.serviceRootUrl}$metadata`;
33
- this.name = config.name;
34
- this.version = config.version ?? DEFAULT_VERSION;
35
- this.default = config.default ?? false;
36
- this.creation = config.creation ?? new Date();
37
- this.options = new ODataApiOptions(Object.assign({ version: this.version }, config.options || {}));
38
- this.cache = config.cache || new ODataInMemoryCache();
39
- this.errorHandler = config.errorHandler;
40
- this.parsers = new Map(Object.entries(config.parsers || EDM_PARSERS));
41
- this.schemas = (config.schemas ?? []).map((schema) => new ODataSchema(schema, this));
42
- }
43
- configure(settings = {}) {
44
- this.requester = settings.requester;
45
- this.schemas.forEach((schema) => {
46
- schema.configure({
47
- options: this.options.parserOptions,
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,
59
- });
60
- });
61
- }
62
- fromJson(json) {
63
- const segments = ODataPathSegments.fromJson(json.segments);
64
- const query = ODataQueryOptions.fromJson(json.options);
65
- switch (segments.last()?.name) {
66
- case PathSegment.entitySet:
67
- if (segments.last()?.hasKey()) {
68
- return new ODataEntityResource(this, { segments, query });
69
- }
70
- else {
71
- return new ODataEntitySetResource(this, { segments, query });
72
- }
73
- case PathSegment.navigationProperty:
74
- return new ODataNavigationPropertyResource(this, { segments, query });
75
- case PathSegment.singleton:
76
- return new ODataSingletonResource(this, { segments, query });
77
- case PathSegment.action:
78
- return new ODataActionResource(this, { segments, query });
79
- case PathSegment.function:
80
- return new ODataFunctionResource(this, { segments, query });
81
- }
82
- throw new Error('No Resource for json');
83
- }
84
- /**
85
- * Build a metadata resource.
86
- * @returns ODataMetadataResource
87
- */
88
- metadata() {
89
- return ODataMetadataResource.factory(this);
90
- }
91
- /**
92
- * Build a batch resource.
93
- * @returns ODataBatchResource
94
- */
95
- batch() {
96
- return ODataBatchResource.factory(this);
97
- }
98
- /**
99
- * Build a singleton resource.
100
- * @param path Name of the singleton
101
- * @returns
102
- */
103
- singleton(name) {
104
- const singleton = this.findSingleton(name);
105
- return ODataSingletonResource.factory(this, {
106
- path: singleton?.name ?? name,
107
- type: singleton?.singletonType,
108
- });
109
- }
110
- /**
111
- * Build an entity set resource.
112
- * @param path Name of the entity set
113
- * @returns
114
- */
115
- entitySet(name) {
116
- const entitySet = this.findEntitySet(name);
117
- return ODataEntitySetResource.factory(this, {
118
- path: entitySet?.name ?? name,
119
- type: entitySet?.entityType,
120
- });
121
- }
122
- /**
123
- * Unbound Action
124
- * @param {string} path?
125
- * @returns ODataActionResource
126
- */
127
- action(path) {
128
- const callable = this.findCallable(path);
129
- return ODataActionResource.factory(this, {
130
- path,
131
- outgoingType: callable?.type(),
132
- incomingType: callable?.returnType(),
133
- });
134
- }
135
- /**
136
- * Unbound Function
137
- * @param {string} path?
138
- * @returns ODataFunctionResource
139
- */
140
- function(path) {
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);
156
- }
157
- //request(req: ODataRequest<any>): Observable<any> {
158
- request(method, resource, options) {
159
- let req = ODataRequest.factory(this, method, resource, {
160
- body: options.body,
161
- etag: options.etag,
162
- context: options.context,
163
- headers: options.headers,
164
- params: options.params,
165
- responseType: options.responseType,
166
- observe: (options.observe === 'events' ? 'events' : 'response'),
167
- withCount: options.withCount,
168
- bodyQueryOptions: options.bodyQueryOptions,
169
- reportProgress: options.reportProgress,
170
- fetchPolicy: options.fetchPolicy,
171
- parserOptions: options.parserOptions,
172
- withCredentials: options.withCredentials,
173
- });
174
- let res$ = this.requester !== undefined ? this.requester(req) : NEVER;
175
- res$ = res$.pipe(map((res) => res.type === HttpEventType.Response
176
- ? ODataResponse.fromHttpResponse(req, res)
177
- : res));
178
- if (this.errorHandler !== undefined)
179
- res$ = res$.pipe(catchError(this.errorHandler));
180
- if (options.observe === 'events') {
181
- return res$;
182
- }
183
- res$ = this.cache.handleRequest(req, res$);
184
- switch (options.observe || 'body') {
185
- case 'body':
186
- switch (options.responseType) {
187
- case 'entities':
188
- return res$.pipe(map((res) => res.entities()));
189
- case 'entity':
190
- return res$.pipe(map((res) => res.entity()));
191
- case 'property':
192
- return res$.pipe(map((res) => res.property()));
193
- case 'value':
194
- return res$.pipe(map((res) => res.value()));
195
- default:
196
- // Other responseTypes (arraybuffer, blob, json, text) return body
197
- return res$.pipe(map((res) => res.body));
198
- }
199
- case 'response':
200
- // The response stream was requested directly, so return it.
201
- return res$;
202
- default:
203
- // Guard against new future observe types being added.
204
- throw new Error(`Unreachable: unhandled observe type ${options.observe}}`);
205
- }
206
- }
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) {
216
- const schemas = this.schemas.filter((s) => s.isNamespaceOf(type));
217
- if (schemas.length === 0)
218
- return undefined;
219
- if (schemas.length === 1)
220
- return schemas[0];
221
- return schemas
222
- .sort((s1, s2) => s1.namespace.length - s2.namespace.length)
223
- .pop();
224
- }
225
- //#region EnumTypes
226
- findEnumType(value) {
227
- if (this.memo.enumTypes.has(value)) {
228
- return this.memo.enumTypes.get(value);
229
- }
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);
234
- return enumType;
235
- }
236
- //#endregion
237
- //#region StructuredTypes
238
- findStructuredType(value) {
239
- if (this.memo.structuredTypes.has(value)) {
240
- return this.memo.structuredTypes.get(value);
241
- }
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);
247
- return structuredType;
248
- }
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);
255
- }
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);
285
- return callable;
286
- }
287
- //#endregion
288
- //#region EntitySets
289
- findEntitySet(value) {
290
- if (this.memo.entitySets.has(value)) {
291
- return this.memo.entitySets.get(value);
292
- }
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);
297
- return entitySet;
298
- }
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;
310
- }
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) {
326
- // Configure
327
- Model.meta.configure({
328
- options: this.options.parserOptions,
329
- });
330
- }
331
- // Store New Model for next time
332
- structured.model = Model;
333
- return Model;
334
- }
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;
358
- }
359
- collectionForType(type) {
360
- let Collection = this.findCollection(type);
361
- if (Collection === undefined) {
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);
367
- }
368
- return Collection;
369
- }
370
- findEntitySetForEntityType(entityType) {
371
- if (this.memo.entitySets.has(entityType)) {
372
- return this.memo.entitySets.get(entityType);
373
- }
374
- const entitySet = this.schemas
375
- .reduce((acc, schema) => [...acc, ...schema.entitySets], [])
376
- .find((e) => e.entityType === entityType);
377
- this.memo.entitySets.set(entityType, entitySet);
378
- return entitySet;
379
- }
380
- parserForType(type, bindingType) {
381
- const key = bindingType !== undefined ? `${bindingType}/${type}` : type;
382
- if (this.memo.parsers.has(key)) {
383
- return this.memo.parsers.get(key);
384
- }
385
- // None Parser by default
386
- let parser = NONE_PARSER;
387
- if (this.parsers.has(type)) {
388
- // Edm, Base Parsers
389
- parser = this.parsers.get(type);
390
- }
391
- else if (!type.startsWith('Edm.')) {
392
- // Callable, EnumType, StructuredType (ComplexType and EntityType) Parsers
393
- let value = this.findCallable(type, bindingType) ??
394
- this.findEnumType(type) ??
395
- this.findStructuredType(type);
396
- parser = value?.parser;
397
- }
398
- // Set Parser for next time
399
- this.memo.parsers.set(key, parser);
400
- return parser;
401
- }
402
- optionsForType(type, { structuredType, config, } = {}) {
403
- // Strucutred Options
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
- }
413
- }
414
- // Set Options for next time
415
- this.memo.options.set(type, meta);
416
- return meta;
417
- }
418
- }
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=