angular-odata 0.122.0 → 0.124.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 (163) hide show
  1. package/esm2022/lib/api.mjs +373 -0
  2. package/esm2022/lib/cache/cache.mjs +175 -0
  3. package/{esm2020 → esm2022}/lib/cache/storage.mjs +1 -1
  4. package/esm2022/lib/client.mjs +252 -0
  5. package/{esm2020 → esm2022}/lib/helper.mjs +1 -1
  6. package/{esm2020 → esm2022}/lib/loaders.mjs +1 -1
  7. package/esm2022/lib/models/collection.mjs +865 -0
  8. package/esm2022/lib/models/model.mjs +535 -0
  9. package/esm2022/lib/models/options.mjs +1117 -0
  10. package/{esm2020 → esm2022}/lib/module.mjs +5 -5
  11. package/esm2022/lib/resources/path/segments.mjs +124 -0
  12. package/esm2022/lib/resources/query/builder.mjs +624 -0
  13. package/esm2022/lib/resources/query/expressions/base.mjs +20 -0
  14. package/esm2022/lib/resources/query/expressions/compute.mjs +39 -0
  15. package/esm2022/lib/resources/query/expressions/count.mjs +99 -0
  16. package/esm2022/lib/resources/query/expressions/expand.mjs +125 -0
  17. package/esm2022/lib/resources/query/expressions/filter.mjs +161 -0
  18. package/esm2022/lib/resources/query/expressions/orderby.mjs +56 -0
  19. package/esm2022/lib/resources/query/expressions/search.mjs +122 -0
  20. package/esm2022/lib/resources/query/expressions/select.mjs +31 -0
  21. package/esm2022/lib/resources/query/expressions/syntax.mjs +444 -0
  22. package/{esm2020 → esm2022}/lib/resources/query/handlers.mjs +1 -1
  23. package/esm2022/lib/resources/query/options.mjs +115 -0
  24. package/{esm2020 → esm2022}/lib/resources/request.mjs +1 -1
  25. package/esm2022/lib/resources/resource.mjs +257 -0
  26. package/{esm2020 → esm2022}/lib/resources/responses/annotations.mjs +1 -1
  27. package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +33 -0
  28. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-container.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-set.mjs +1 -1
  30. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-enum-type.mjs +1 -1
  31. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-function-action.mjs +1 -1
  32. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +1 -1
  33. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-reference.mjs +1 -1
  34. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-schema.mjs +1 -1
  35. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-singleton.mjs +1 -1
  36. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structural-property.mjs +1 -1
  37. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structured-type.mjs +1 -1
  38. package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-type-definition.mjs +1 -1
  39. package/esm2022/lib/resources/responses/metadata.mjs +547 -0
  40. package/{esm2020 → esm2022}/lib/resources/responses/response.mjs +1 -1
  41. package/{esm2020 → esm2022}/lib/resources/types/action.mjs +1 -1
  42. package/{esm2020 → esm2022}/lib/resources/types/batch.mjs +1 -1
  43. package/{esm2020 → esm2022}/lib/resources/types/count.mjs +1 -1
  44. package/{esm2020 → esm2022}/lib/resources/types/entity-set.mjs +1 -1
  45. package/{esm2020 → esm2022}/lib/resources/types/entity.mjs +1 -1
  46. package/{esm2020 → esm2022}/lib/resources/types/function.mjs +1 -1
  47. package/{esm2020 → esm2022}/lib/resources/types/media.mjs +1 -1
  48. package/{esm2020 → esm2022}/lib/resources/types/navigation-property.mjs +1 -1
  49. package/{esm2020 → esm2022}/lib/resources/types/property.mjs +1 -1
  50. package/{esm2020 → esm2022}/lib/resources/types/reference.mjs +1 -1
  51. package/{esm2020 → esm2022}/lib/resources/types/singleton.mjs +1 -1
  52. package/{esm2020 → esm2022}/lib/resources/types/value.mjs +1 -1
  53. package/{esm2020 → esm2022}/lib/schema/annotation.mjs +1 -1
  54. package/{esm2020 → esm2022}/lib/schema/callable.mjs +1 -1
  55. package/{esm2020 → esm2022}/lib/schema/element.mjs +1 -1
  56. package/{esm2020 → esm2022}/lib/schema/entity-container.mjs +1 -1
  57. package/{esm2020 → esm2022}/lib/schema/enum-type.mjs +1 -1
  58. package/{esm2020 → esm2022}/lib/schema/parsers/callable.mjs +1 -1
  59. package/esm2022/lib/schema/parsers/edm.mjs +99 -0
  60. package/{esm2020 → esm2022}/lib/schema/parsers/enum-type.mjs +2 -2
  61. package/esm2022/lib/schema/parsers/structured-type.mjs +502 -0
  62. package/{esm2020 → esm2022}/lib/schema/schema.mjs +1 -1
  63. package/esm2022/lib/schema/structured-type.mjs +207 -0
  64. package/esm2022/lib/services/base.mjs +29 -0
  65. package/{esm2020 → esm2022}/lib/services/entity-set.mjs +1 -1
  66. package/{esm2020 → esm2022}/lib/services/factory.mjs +4 -4
  67. package/{esm2020 → esm2022}/lib/services/singleton.mjs +1 -1
  68. package/{esm2020 → esm2022}/lib/settings.mjs +1 -1
  69. package/{esm2020 → esm2022}/lib/types.mjs +1 -1
  70. package/{esm2020 → esm2022}/lib/utils/arrays.mjs +1 -1
  71. package/{esm2020 → esm2022}/lib/utils/durations.mjs +1 -1
  72. package/esm2022/lib/utils/enums.mjs +61 -0
  73. package/{esm2020 → esm2022}/lib/utils/http.mjs +1 -1
  74. package/{esm2020 → esm2022}/lib/utils/objects.mjs +1 -1
  75. package/{esm2020 → esm2022}/lib/utils/odata.mjs +1 -1
  76. package/esm2022/lib/utils/types.mjs +136 -0
  77. package/{fesm2020 → fesm2022}/angular-odata.mjs +544 -373
  78. package/fesm2022/angular-odata.mjs.map +1 -0
  79. package/lib/helper.d.ts +1 -1
  80. package/lib/models/model.d.ts +4 -2
  81. package/lib/models/options.d.ts +7 -8
  82. package/lib/resources/path/segments.d.ts +15 -6
  83. package/lib/resources/query/builder.d.ts +21 -20
  84. package/lib/resources/query/expressions/base.d.ts +6 -4
  85. package/lib/resources/query/expressions/compute.d.ts +10 -8
  86. package/lib/resources/query/expressions/count.d.ts +14 -11
  87. package/lib/resources/query/expressions/expand.d.ts +23 -19
  88. package/lib/resources/query/expressions/filter.d.ts +22 -20
  89. package/lib/resources/query/expressions/orderby.d.ts +12 -9
  90. package/lib/resources/query/expressions/search.d.ts +12 -9
  91. package/lib/resources/query/expressions/select.d.ts +9 -7
  92. package/lib/resources/query/expressions/syntax.d.ts +75 -71
  93. package/lib/resources/query/handlers.d.ts +2 -2
  94. package/lib/resources/query/options.d.ts +15 -6
  95. package/lib/resources/resource.d.ts +2 -2
  96. package/lib/resources/responses/types.d.ts +3 -3
  97. package/lib/resources/types/options.d.ts +7 -7
  98. package/lib/schema/parsers/structured-type.d.ts +8 -5
  99. package/lib/schema/structured-type.d.ts +2 -1
  100. package/lib/types.d.ts +15 -15
  101. package/lib/utils/durations.d.ts +1 -1
  102. package/lib/utils/enums.d.ts +3 -0
  103. package/lib/utils/types.d.ts +1 -0
  104. package/package.json +9 -15
  105. package/esm2020/lib/api.mjs +0 -373
  106. package/esm2020/lib/cache/cache.mjs +0 -173
  107. package/esm2020/lib/client.mjs +0 -252
  108. package/esm2020/lib/models/collection.mjs +0 -861
  109. package/esm2020/lib/models/model.mjs +0 -507
  110. package/esm2020/lib/models/options.mjs +0 -1110
  111. package/esm2020/lib/resources/path/segments.mjs +0 -124
  112. package/esm2020/lib/resources/query/builder.mjs +0 -588
  113. package/esm2020/lib/resources/query/expressions/base.mjs +0 -20
  114. package/esm2020/lib/resources/query/expressions/compute.mjs +0 -39
  115. package/esm2020/lib/resources/query/expressions/count.mjs +0 -89
  116. package/esm2020/lib/resources/query/expressions/expand.mjs +0 -115
  117. package/esm2020/lib/resources/query/expressions/filter.mjs +0 -161
  118. package/esm2020/lib/resources/query/expressions/orderby.mjs +0 -56
  119. package/esm2020/lib/resources/query/expressions/search.mjs +0 -122
  120. package/esm2020/lib/resources/query/expressions/select.mjs +0 -31
  121. package/esm2020/lib/resources/query/expressions/syntax.mjs +0 -409
  122. package/esm2020/lib/resources/query/options.mjs +0 -115
  123. package/esm2020/lib/resources/resource.mjs +0 -251
  124. package/esm2020/lib/resources/responses/csdl/csdl-annotation.mjs +0 -33
  125. package/esm2020/lib/resources/responses/metadata.mjs +0 -547
  126. package/esm2020/lib/schema/parsers/edm.mjs +0 -104
  127. package/esm2020/lib/schema/parsers/structured-type.mjs +0 -490
  128. package/esm2020/lib/schema/structured-type.mjs +0 -202
  129. package/esm2020/lib/services/base.mjs +0 -29
  130. package/esm2020/lib/utils/enums.mjs +0 -45
  131. package/esm2020/lib/utils/types.mjs +0 -133
  132. package/fesm2015/angular-odata.mjs +0 -11811
  133. package/fesm2015/angular-odata.mjs.map +0 -1
  134. package/fesm2020/angular-odata.mjs.map +0 -1
  135. /package/{esm2020 → esm2022}/angular-odata.mjs +0 -0
  136. /package/{esm2020 → esm2022}/lib/cache/index.mjs +0 -0
  137. /package/{esm2020 → esm2022}/lib/cache/memory.mjs +0 -0
  138. /package/{esm2020 → esm2022}/lib/constants.mjs +0 -0
  139. /package/{esm2020 → esm2022}/lib/index.mjs +0 -0
  140. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  141. /package/{esm2020 → esm2022}/lib/options.mjs +0 -0
  142. /package/{esm2020 → esm2022}/lib/resources/index.mjs +0 -0
  143. /package/{esm2020 → esm2022}/lib/resources/path/handlers.mjs +0 -0
  144. /package/{esm2020 → esm2022}/lib/resources/path/index.mjs +0 -0
  145. /package/{esm2020 → esm2022}/lib/resources/query/expressions/index.mjs +0 -0
  146. /package/{esm2020 → esm2022}/lib/resources/query/index.mjs +0 -0
  147. /package/{esm2020 → esm2022}/lib/resources/responses/index.mjs +0 -0
  148. /package/{esm2020 → esm2022}/lib/resources/responses/options.mjs +0 -0
  149. /package/{esm2020 → esm2022}/lib/resources/responses/types.mjs +0 -0
  150. /package/{esm2020 → esm2022}/lib/resources/types/index.mjs +0 -0
  151. /package/{esm2020 → esm2022}/lib/resources/types/metadata.mjs +0 -0
  152. /package/{esm2020 → esm2022}/lib/resources/types/options.mjs +0 -0
  153. /package/{esm2020 → esm2022}/lib/schema/entity-set.mjs +0 -0
  154. /package/{esm2020 → esm2022}/lib/schema/index.mjs +0 -0
  155. /package/{esm2020 → esm2022}/lib/schema/parsers/index.mjs +0 -0
  156. /package/{esm2020 → esm2022}/lib/services/entity.mjs +0 -0
  157. /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
  158. /package/{esm2020 → esm2022}/lib/utils/arraybuffers.mjs +0 -0
  159. /package/{esm2020 → esm2022}/lib/utils/dates.mjs +0 -0
  160. /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
  161. /package/{esm2020 → esm2022}/lib/utils/strings.mjs +0 -0
  162. /package/{esm2020 → esm2022}/lib/utils/urls.mjs +0 -0
  163. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -0,0 +1,373 @@
1
+ import { HttpEventType } from '@angular/common/http';
2
+ import { NEVER } from 'rxjs';
3
+ import { catchError, map } from 'rxjs/operators';
4
+ import { ODataInMemoryCache } from './cache/index';
5
+ import { DEFAULT_VERSION } from './constants';
6
+ import { ODataCollection, ODataModel } from './models/index';
7
+ import { ODataApiOptions } from './options';
8
+ import { ODataActionResource, ODataBatchResource, ODataEntityResource, ODataEntitySetResource, ODataFunctionResource, ODataMetadataResource, ODataNavigationPropertyResource, ODataPathSegments, ODataQueryOptions, ODataRequest, ODataResponse, ODataSingletonResource, } from './resources/index';
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
+ 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
+ },
33
+ };
34
+ this.serviceRootUrl = config.serviceRootUrl;
35
+ if (this.serviceRootUrl.indexOf('?') != -1)
36
+ throw new Error("The 'serviceRootUrl' should not contain query string. Please use 'params' to add extra parameters");
37
+ if (!this.serviceRootUrl.endsWith('/'))
38
+ this.serviceRootUrl += '/';
39
+ this.metadataUrl = `${this.serviceRootUrl}$metadata`;
40
+ this.name = config.name;
41
+ this.version = config.version || DEFAULT_VERSION;
42
+ this.default = config.default || false;
43
+ this.creation = config.creation || new Date();
44
+ this.options = new ODataApiOptions(Object.assign({ version: this.version }, config.options || {}));
45
+ this.cache = config.cache || new ODataInMemoryCache();
46
+ this.errorHandler = config.errorHandler;
47
+ this.parsers = new Map(Object.entries(config.parsers || EDM_PARSERS));
48
+ this.schemas = (config.schemas || []).map((schema) => new ODataSchema(schema, this));
49
+ }
50
+ configure(settings = {}) {
51
+ this.requester = settings.requester;
52
+ this.schemas.forEach((schema) => {
53
+ schema.configure({
54
+ options: this.options.parserOptions,
55
+ parserForType: (type) => this.parserForType(type),
56
+ findOptionsForType: (type) => this.findOptionsForType(type),
57
+ });
58
+ });
59
+ }
60
+ fromJSON(json) {
61
+ const segments = new ODataPathSegments(json.segments);
62
+ const query = new ODataQueryOptions(json.options);
63
+ switch (segments.last()?.name) {
64
+ case PathSegment.entitySet:
65
+ if (segments.last()?.hasKey()) {
66
+ return new ODataEntityResource(this, { segments, query });
67
+ }
68
+ else {
69
+ return new ODataEntitySetResource(this, { segments, query });
70
+ }
71
+ case PathSegment.navigationProperty:
72
+ return new ODataNavigationPropertyResource(this, { segments, query });
73
+ case PathSegment.singleton:
74
+ return new ODataSingletonResource(this, { segments, query });
75
+ case PathSegment.action:
76
+ return new ODataActionResource(this, { segments, query });
77
+ case PathSegment.function:
78
+ return new ODataFunctionResource(this, { segments, query });
79
+ }
80
+ throw new Error('No Resource for json');
81
+ }
82
+ /**
83
+ * Build a metadata resource.
84
+ * @returns ODataMetadataResource
85
+ */
86
+ metadata() {
87
+ return ODataMetadataResource.factory(this);
88
+ }
89
+ /**
90
+ * Build a batch resource.
91
+ * @returns ODataBatchResource
92
+ */
93
+ batch() {
94
+ return ODataBatchResource.factory(this);
95
+ }
96
+ /**
97
+ * Build a singleton resource.
98
+ * @param path Name of the singleton
99
+ * @returns
100
+ */
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 });
107
+ }
108
+ /**
109
+ * Build an entity set resource.
110
+ * @param path Name of the entity set
111
+ * @returns
112
+ */
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 });
119
+ }
120
+ /**
121
+ * Unbound Action
122
+ * @param {string} path?
123
+ * @returns ODataActionResource
124
+ */
125
+ action(path) {
126
+ const schema = this.findCallableForType(path);
127
+ return ODataActionResource.factory(this, { path, schema });
128
+ }
129
+ /**
130
+ * Unbound Function
131
+ * @param {string} path?
132
+ * @returns ODataFunctionResource
133
+ */
134
+ function(path) {
135
+ const schema = this.findCallableForType(path);
136
+ return ODataFunctionResource.factory(this, { path, schema });
137
+ }
138
+ //request(req: ODataRequest<any>): Observable<any> {
139
+ request(method, resource, options) {
140
+ let req = ODataRequest.factory(this, method, resource, {
141
+ body: options.body,
142
+ etag: options.etag,
143
+ context: options.context,
144
+ headers: options.headers,
145
+ params: options.params,
146
+ responseType: options.responseType,
147
+ observe: (options.observe === 'events' ? 'events' : 'response'),
148
+ withCount: options.withCount,
149
+ bodyQueryOptions: options.bodyQueryOptions,
150
+ reportProgress: options.reportProgress,
151
+ fetchPolicy: options.fetchPolicy,
152
+ withCredentials: options.withCredentials,
153
+ });
154
+ let res$ = this.requester !== undefined ? this.requester(req) : NEVER;
155
+ res$ = res$.pipe(map((res) => res.type === HttpEventType.Response
156
+ ? ODataResponse.fromHttpResponse(req, res)
157
+ : res));
158
+ if (this.errorHandler !== undefined)
159
+ res$ = res$.pipe(catchError(this.errorHandler));
160
+ if (options.observe === 'events') {
161
+ return res$;
162
+ }
163
+ res$ = this.cache.handleRequest(req, res$);
164
+ switch (options.observe || 'body') {
165
+ case 'body':
166
+ switch (options.responseType) {
167
+ case 'entities':
168
+ return res$.pipe(map((res) => res.entities()));
169
+ case 'entity':
170
+ return res$.pipe(map((res) => res.entity()));
171
+ case 'property':
172
+ return res$.pipe(map((res) => res.property()));
173
+ case 'value':
174
+ return res$.pipe(map((res) => res.value()));
175
+ default:
176
+ // Other responseTypes (arraybuffer, blob, json, text) return body
177
+ return res$.pipe(map((res) => res.body));
178
+ }
179
+ case 'response':
180
+ // The response stream was requested directly, so return it.
181
+ return res$;
182
+ default:
183
+ // Guard against new future observe types being added.
184
+ throw new Error(`Unreachable: unhandled observe type ${options.observe}}`);
185
+ }
186
+ }
187
+ findSchemaForType(type) {
188
+ const schemas = this.schemas.filter((s) => s.isNamespaceOf(type));
189
+ if (schemas.length === 0)
190
+ return undefined;
191
+ if (schemas.length === 1)
192
+ return schemas[0];
193
+ return schemas
194
+ .sort((s1, s2) => s1.namespace.length - s2.namespace.length)
195
+ .pop();
196
+ }
197
+ findEnumTypeForType(type) {
198
+ if (this.memo.forType.enum.has(type)) {
199
+ return this.memo.forType.enum.get(type);
200
+ }
201
+ const enumType = this.findSchemaForType(type)?.findEnumTypeForType(type);
202
+ this.memo.forType.enum.set(type, enumType);
203
+ return enumType;
204
+ }
205
+ findStructuredTypeForType(type) {
206
+ if (this.memo.forType.structured.has(type)) {
207
+ return this.memo.forType.structured.get(type);
208
+ }
209
+ const structuredType = this.findSchemaForType(type)?.findStructuredTypeForType(type);
210
+ this.memo.forType.structured.set(type, structuredType);
211
+ return structuredType;
212
+ }
213
+ findCallableForType(type, bindingType) {
214
+ const key = bindingType !== undefined ? `${bindingType}/${type}` : type;
215
+ if (this.memo.forType.callable.has(key)) {
216
+ return this.memo.forType.callable.get(key);
217
+ }
218
+ const callable = this.findSchemaForType(type)?.findCallableForType(type, bindingType);
219
+ this.memo.forType.callable.set(key, callable);
220
+ return callable;
221
+ }
222
+ findEntitySetForType(type) {
223
+ if (this.memo.forType.entitySet.has(type)) {
224
+ return this.memo.forType.entitySet.get(type);
225
+ }
226
+ const entitySet = this.findSchemaForType(type)?.findEntitySetForType(type);
227
+ this.memo.forType.entitySet.set(type, entitySet);
228
+ return entitySet;
229
+ }
230
+ findModelForType(type) {
231
+ return this.findStructuredTypeForType(type)?.model;
232
+ }
233
+ modelForType(type) {
234
+ let Model = this.findModelForType(type);
235
+ if (Model === undefined) {
236
+ // Build Ad-hoc model
237
+ let schema = this.findStructuredTypeForType(type);
238
+ if (schema === undefined)
239
+ throw Error(`No schema for ${type}`);
240
+ Model = class extends ODataModel {
241
+ };
242
+ // Build Meta
243
+ Model.buildMeta({ schema });
244
+ // Configure
245
+ Model.meta.configure({
246
+ options: this.options.parserOptions,
247
+ parserForType: (type) => this.parserForType(type),
248
+ findOptionsForType: (type) => this.findOptionsForType(type),
249
+ });
250
+ // Store New Model for next time
251
+ schema.model = Model;
252
+ }
253
+ return Model;
254
+ }
255
+ findCollectionForType(type) {
256
+ return this.findStructuredTypeForType(type)?.collection;
257
+ }
258
+ collectionForType(type) {
259
+ let Collection = this.findCollectionForType(type);
260
+ if (Collection === undefined) {
261
+ let schema = this.findStructuredTypeForType(type);
262
+ if (schema === undefined)
263
+ throw Error('');
264
+ Collection = class extends ODataCollection {
265
+ };
266
+ Collection.model = this.modelForType(type);
267
+ // Store New Collection for next time
268
+ schema.collection = Collection;
269
+ }
270
+ return Collection;
271
+ }
272
+ findServiceForType(type) {
273
+ return this.findEntitySetForType(type)?.service;
274
+ }
275
+ findEntitySetForEntityType(entityType) {
276
+ if (this.memo.forType.entitySet.has(entityType)) {
277
+ return this.memo.forType.entitySet.get(entityType);
278
+ }
279
+ const entitySet = this.schemas
280
+ .reduce((acc, schema) => [...acc, ...schema.entitySets], [])
281
+ .find((e) => e.entityType === entityType);
282
+ this.memo.forType.entitySet.set(entityType, entitySet);
283
+ return entitySet;
284
+ }
285
+ findServiceForEntityType(entityType) {
286
+ return this.findEntitySetForEntityType(entityType)?.service;
287
+ }
288
+ findEnumTypeByName(name) {
289
+ if (this.memo.byName.enum.has(name)) {
290
+ return this.memo.byName.enum.get(name);
291
+ }
292
+ const enumType = this.schemas
293
+ .reduce((acc, schema) => [...acc, ...schema.enums], [])
294
+ .find((e) => e.name === name);
295
+ this.memo.byName.enum.set(name, enumType);
296
+ return enumType;
297
+ }
298
+ findStructuredTypeByName(name) {
299
+ if (this.memo.byName.structured.has(name)) {
300
+ return this.memo.byName.structured.get(name);
301
+ }
302
+ const structuredType = this.schemas
303
+ .reduce((acc, schema) => [...acc, ...schema.entities], [])
304
+ .find((e) => e.name === name);
305
+ this.memo.byName.structured.set(name, structuredType);
306
+ return structuredType;
307
+ }
308
+ findCallableByName(name, bindingType) {
309
+ const key = bindingType !== undefined ? `${bindingType}/${name}` : name;
310
+ if (this.memo.byName.callable.has(key)) {
311
+ return this.memo.byName.callable.get(key);
312
+ }
313
+ const callable = this.schemas
314
+ .reduce((acc, schema) => [...acc, ...schema.callables], [])
315
+ .find((c) => c.name === name &&
316
+ (bindingType === undefined || c.binding()?.type === bindingType));
317
+ this.memo.byName.callable.set(key, callable);
318
+ return callable;
319
+ }
320
+ findEntitySetByName(name) {
321
+ if (this.memo.byName.entitySet.has(name)) {
322
+ return this.memo.byName.entitySet.get(name);
323
+ }
324
+ const schema = this.schemas
325
+ .reduce((acc, schema) => [...acc, ...schema.entitySets], [])
326
+ .find((e) => e.name === name);
327
+ this.memo.byName.entitySet.set(name, schema);
328
+ return schema;
329
+ }
330
+ findModelByName(name) {
331
+ return this.findStructuredTypeByName(name)?.model;
332
+ }
333
+ findCollectionByName(name) {
334
+ return this.findStructuredTypeByName(name)?.collection;
335
+ }
336
+ findServiceByName(name) {
337
+ return this.findEntitySetByName(name)?.service;
338
+ }
339
+ parserForType(type, bindingType) {
340
+ const key = bindingType !== undefined ? `${bindingType}/${type}` : type;
341
+ if (this.memo.forType.parser.has(key)) {
342
+ return this.memo.forType.parser.get(key);
343
+ }
344
+ // None Parser by default
345
+ let parser = NONE_PARSER;
346
+ if (this.parsers.has(type)) {
347
+ // Edm, Base Parsers
348
+ parser = this.parsers.get(type);
349
+ }
350
+ else if (!type.startsWith('Edm.')) {
351
+ // EnumType, ComplexType and EntityType Parsers
352
+ let value = this.findCallableForType(type, bindingType) ||
353
+ this.findEnumTypeForType(type) ||
354
+ this.findStructuredTypeForType(type);
355
+ parser = value?.parser;
356
+ }
357
+ // Set Parser for next time
358
+ this.memo.forType.parser.set(key, parser);
359
+ return parser;
360
+ }
361
+ findOptionsForType(type) {
362
+ // Strucutred Options
363
+ if (this.memo.forType.options.has(type)) {
364
+ return this.memo.forType.options.get(type);
365
+ }
366
+ const st = this.findStructuredTypeForType(type);
367
+ const options = st?.model?.meta;
368
+ // Set Options for next time
369
+ this.memo.forType.options.set(type, options);
370
+ return options;
371
+ }
372
+ }
373
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBYyxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFxQixNQUFNLGdCQUFnQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLCtCQUErQixFQUUvQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLFlBQVksRUFFWixhQUFhLEVBRWIsc0JBQXNCLEdBQ3ZCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLFdBQVcsRUFJWCxXQUFXLEdBRVosTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUlMLFdBQVcsRUFFWCxXQUFXLEdBRVosTUFBTSxTQUFTLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQW1CbkIsWUFBWSxNQUFpQjtRQW9PN0IsdUJBQXVCO1FBQ3ZCLFVBQVU7UUFDRixTQUFJLEdBZVI7WUFDRixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLElBQUksR0FBRyxFQUEwQztnQkFDdkQsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFn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QU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBORVZFUiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT0RhdGFDYWNoZSwgT0RhdGFJbk1lbW9yeUNhY2hlIH0gZnJvbSAnLi9jYWNoZS9pbmRleCc7XG5pbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24sIE9EYXRhTW9kZWwsIE9EYXRhTW9kZWxPcHRpb25zIH0gZnJvbSAnLi9tb2RlbHMvaW5kZXgnO1xuaW1wb3J0IHsgT0RhdGFBcGlPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7XG4gIE9EYXRhQWN0aW9uUmVzb3VyY2UsXG4gIE9EYXRhQmF0Y2hSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFGdW5jdGlvblJlc291cmNlLFxuICBPRGF0YU1ldGFkYXRhUmVzb3VyY2UsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhT3B0aW9ucyxcbiAgT0RhdGFQYXRoU2VnbWVudHMsXG4gIE9EYXRhUXVlcnlPcHRpb25zLFxuICBPRGF0YVJlcXVlc3QsXG4gIE9EYXRhUmVzb3VyY2UsXG4gIE9EYXRhUmVzcG9uc2UsXG4gIE9EYXRhU2VnbWVudCxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbn0gZnJvbSAnLi9yZXNvdXJjZXMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgRURNX1BBUlNFUlMsXG4gIE9EYXRhQ2FsbGFibGUsXG4gIE9EYXRhRW50aXR5U2V0LFxuICBPRGF0YUVudW1UeXBlLFxuICBPRGF0YVNjaGVtYSxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZSxcbn0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9lbnRpdHknO1xuaW1wb3J0IHtcbiAgQXBpQ29uZmlnLFxuICBBcGlPcHRpb25zLFxuICBFZG1UeXBlLFxuICBOT05FX1BBUlNFUixcbiAgUGFyc2VyLFxuICBQYXRoU2VnbWVudCxcbiAgUXVlcnlPcHRpb24sXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEFwaSBhYnN0cmFjdGlvbiBmb3IgY29uc3VtaW5nIE9EYXRhIHNlcnZpY2VzLlxuICovXG5leHBvcnQgY2xhc3MgT0RhdGFBcGkge1xuICByZXF1ZXN0ZXI/OiAocmVxdWVzdDogT0RhdGFSZXF1ZXN0PGFueT4pID0+IE9ic2VydmFibGU8YW55PjtcbiAgc2VydmljZVJvb3RVcmw6IHN0cmluZztcbiAgbWV0YWRhdGFVcmw6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBkZWZhdWx0OiBib29sZWFuO1xuICBjcmVhdGlvbjogRGF0ZTtcbiAgLy8gT3B0aW9uc1xuICBvcHRpb25zOiBPRGF0YUFwaU9wdGlvbnM7XG4gIC8vIENhY2hlXG4gIGNhY2hlITogT0RhdGFDYWNoZTtcbiAgLy8gRXJyb3IgSGFuZGxlclxuICBlcnJvckhhbmRsZXI/OiAoZXJyb3I6IGFueSwgY2F1Z2h0OiBPYnNlcnZhYmxlPGFueT4pID0+IE9ic2VydmFibGU8bmV2ZXI+O1xuICAvLyBCYXNlIFBhcnNlcnNcbiAgcGFyc2VyczogTWFwPHN0cmluZywgUGFyc2VyPGFueT4+O1xuICAvLyBTY2hlbWFzXG4gIHNjaGVtYXM6IE9EYXRhU2NoZW1hW107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBBcGlDb25maWcpIHtcbiAgICB0aGlzLnNlcnZpY2VSb290VXJsID0gY29uZmlnLnNlcnZpY2VSb290VXJsO1xuICAgIGlmICh0aGlzLnNlcnZpY2VSb290VXJsLmluZGV4T2YoJz8nKSAhPSAtMSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUaGUgJ3NlcnZpY2VSb290VXJsJyBzaG91bGQgbm90IGNvbnRhaW4gcXVlcnkgc3RyaW5nLiBQbGVhc2UgdXNlICdwYXJhbXMnIHRvIGFkZCBleHRyYSBwYXJhbWV0ZXJzXCIsXG4gICAgICApO1xuICAgIGlmICghdGhpcy5zZXJ2aWNlUm9vdFVybC5lbmRzV2l0aCgnLycpKSB0aGlzLnNlcnZpY2VSb290VXJsICs9ICcvJztcbiAgICB0aGlzLm1ldGFkYXRhVXJsID0gYCR7dGhpcy5zZXJ2aWNlUm9vdFVybH0kbWV0YWRhdGFgO1xuICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMudmVyc2lvbiA9IGNvbmZpZy52ZXJzaW9uIHx8IERFRkFVTFRfVkVSU0lPTjtcbiAgICB0aGlzLmRlZmF1bHQgPSBjb25maWcuZGVmYXVsdCB8fCBmYWxzZTtcbiAgICB0aGlzLmNyZWF0aW9uID0gY29uZmlnLmNyZWF0aW9uIHx8IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5vcHRpb25zID0gbmV3IE9EYXRhQXBpT3B0aW9ucyhcbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgIDxBcGlPcHRpb25zPnsgdmVyc2lvbjogdGhpcy52ZXJzaW9uIH0sXG4gICAgICAgIGNvbmZpZy5vcHRpb25zIHx8IHt9LFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgdGhpcy5jYWNoZSA9IChjb25maWcuY2FjaGUgYXMgT0RhdGFDYWNoZSkgfHwgbmV3IE9EYXRhSW5NZW1vcnlDYWNoZSgpO1xuICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gY29uZmlnLmVycm9ySGFuZGxlcjtcblxuICAgIHRoaXMucGFyc2VycyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLnBhcnNlcnMgfHwgRURNX1BBUlNFUlMpKTtcblxuICAgIHRoaXMuc2NoZW1hcyA9IChjb25maWcuc2NoZW1hcyB8fCBbXSkubWFwKFxuICAgICAgKHNjaGVtYSkgPT4gbmV3IE9EYXRhU2NoZW1hKHNjaGVtYSwgdGhpcyksXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShcbiAgICBzZXR0aW5nczoge1xuICAgICAgcmVxdWVzdGVyPzogKHJlcXVlc3Q6IE9EYXRhUmVxdWVzdDxhbnk+KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLnJlcXVlc3RlciA9IHNldHRpbmdzLnJlcXVlc3RlcjtcbiAgICB0aGlzLnNjaGVtYXMuZm9yRWFjaCgoc2NoZW1hKSA9PiB7XG4gICAgICBzY2hlbWEuY29uZmlndXJlKHtcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcgfCBFZG1UeXBlKSA9PiB0aGlzLnBhcnNlckZvclR5cGUodHlwZSksXG4gICAgICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gdGhpcy5maW5kT3B0aW9uc0ZvclR5cGUodHlwZSksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZyb21KU09OPFAsIFI+KGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pOiBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+IHwgT0RhdGFGdW5jdGlvblJlc291cmNlPFAsIFI+O1xuICBmcm9tSlNPTjxFPihqc29uOiB7XG4gICAgc2VnbWVudHM6IE9EYXRhU2VnbWVudFtdO1xuICAgIG9wdGlvbnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9KTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8RT47XG4gIGZyb21KU09OKGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IG5ldyBPRGF0YVBhdGhTZWdtZW50cyhqc29uLnNlZ21lbnRzKTtcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBPRGF0YVF1ZXJ5T3B0aW9ucyhqc29uLm9wdGlvbnMpO1xuICAgIHN3aXRjaCAoc2VnbWVudHMubGFzdCgpPy5uYW1lIGFzIFBhdGhTZWdtZW50KSB7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LmVudGl0eVNldDpcbiAgICAgICAgaWYgKHNlZ21lbnRzLmxhc3QoKT8uaGFzS2V5KCkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE9EYXRhRW50aXR5UmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBPRGF0YUVudGl0eVNldFJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgICB9XG4gICAgICBjYXNlIFBhdGhTZWdtZW50Lm5hdmlnYXRpb25Qcm9wZXJ0eTpcbiAgICAgICAgcmV0dXJuIG5ldyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgY2FzZSBQYXRoU2VnbWVudC5zaW5nbGV0b246XG4gICAgICAgIHJldHVybiBuZXcgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQuYWN0aW9uOlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhQWN0aW9uUmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LmZ1bmN0aW9uOlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhRnVuY3Rpb25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBSZXNvdXJjZSBmb3IganNvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgbWV0YWRhdGEgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIE9EYXRhTWV0YWRhdGFSZXNvdXJjZVxuICAgKi9cbiAgbWV0YWRhdGEoKTogT0RhdGFNZXRhZGF0YVJlc291cmNlIHtcbiAgICByZXR1cm4gT0RhdGFNZXRhZGF0YVJlc291cmNlLmZhY3RvcnkodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBiYXRjaCByZXNvdXJjZS5cbiAgICogQHJldHVybnMgT0RhdGFCYXRjaFJlc291cmNlXG4gICAqL1xuICBiYXRjaCgpOiBPRGF0YUJhdGNoUmVzb3VyY2Uge1xuICAgIHJldHVybiBPRGF0YUJhdGNoUmVzb3VyY2UuZmFjdG9yeSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHNpbmdsZXRvbiByZXNvdXJjZS5cbiAgICogQHBhcmFtIHBhdGggTmFtZSBvZiB0aGUgc2luZ2xldG9uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzaW5nbGV0b248VD4ocGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgZW50aXR5U2V0ID0gdGhpcy5maW5kRW50aXR5U2V0QnlOYW1lKHBhdGgpO1xuICAgIGNvbnN0IHNjaGVtYSA9XG4gICAgICBlbnRpdHlTZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPihlbnRpdHlTZXQuZW50aXR5VHlwZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UuZmFjdG9yeTxUPih0aGlzLCB7IHBhdGgsIHNjaGVtYSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBlbnRpdHkgc2V0IHJlc291cmNlLlxuICAgKiBAcGFyYW0gcGF0aCBOYW1lIG9mIHRoZSBlbnRpdHkgc2V0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBlbnRpdHlTZXQ8VD4ocGF0aDogc3RyaW5nKTogT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPiB7XG4gICAgY29uc3QgZW50aXR5U2V0ID0gdGhpcy5maW5kRW50aXR5U2V0QnlOYW1lKHBhdGgpO1xuICAgIGNvbnN0IHNjaGVtYSA9XG4gICAgICBlbnRpdHlTZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPihlbnRpdHlTZXQuZW50aXR5VHlwZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UuZmFjdG9yeTxUPih0aGlzLCB7IHBhdGgsIHNjaGVtYSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJvdW5kIEFjdGlvblxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBhdGg/XG4gICAqIEByZXR1cm5zIE9EYXRhQWN0aW9uUmVzb3VyY2VcbiAgICovXG4gIGFjdGlvbjxQLCBSPihwYXRoOiBzdHJpbmcpOiBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmZpbmRDYWxsYWJsZUZvclR5cGU8Uj4ocGF0aCk7XG4gICAgcmV0dXJuIE9EYXRhQWN0aW9uUmVzb3VyY2UuZmFjdG9yeTxQLCBSPih0aGlzLCB7IHBhdGgsIHNjaGVtYSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJvdW5kIEZ1bmN0aW9uXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcGF0aD9cbiAgICogQHJldHVybnMgT0RhdGFGdW5jdGlvblJlc291cmNlXG4gICAqL1xuICBmdW5jdGlvbjxQLCBSPihwYXRoOiBzdHJpbmcpOiBPRGF0YUZ1bmN0aW9uUmVzb3VyY2U8UCwgUj4ge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZmluZENhbGxhYmxlRm9yVHlwZTxSPihwYXRoKTtcbiAgICByZXR1cm4gT0RhdGFGdW5jdGlvblJlc291cmNlLmZhY3Rvcnk8UCwgUj4odGhpcywgeyBwYXRoLCBzY2hlbWEgfSk7XG4gIH1cblxuICAvL3JlcXVlc3QocmVxOiBPRGF0YVJlcXVlc3Q8YW55Pik6IE9ic2VydmFibGU8YW55PiB7XG4gIHJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5PzogYW55O1xuICAgICAgZXRhZz86IHN0cmluZztcbiAgICAgIHJlc3BvbnNlVHlwZT86XG4gICAgICAgIHwgJ2FycmF5YnVmZmVyJ1xuICAgICAgICB8ICdibG9iJ1xuICAgICAgICB8ICdqc29uJ1xuICAgICAgICB8ICd0ZXh0J1xuICAgICAgICB8ICd2YWx1ZSdcbiAgICAgICAgfCAncHJvcGVydHknXG4gICAgICAgIHwgJ2VudGl0eSdcbiAgICAgICAgfCAnZW50aXRpZXMnO1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gICAgICBib2R5UXVlcnlPcHRpb25zPzogUXVlcnlPcHRpb25bXTtcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCByZXEgPSBPRGF0YVJlcXVlc3QuZmFjdG9yeSh0aGlzLCBtZXRob2QsIHJlc291cmNlLCB7XG4gICAgICBib2R5OiBvcHRpb25zLmJvZHksXG4gICAgICBldGFnOiBvcHRpb25zLmV0YWcsXG4gICAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsXG4gICAgICBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLFxuICAgICAgcmVzcG9uc2VUeXBlOiBvcHRpb25zLnJlc3BvbnNlVHlwZSxcbiAgICAgIG9ic2VydmU6IChvcHRpb25zLm9ic2VydmUgPT09ICdldmVudHMnID8gJ2V2ZW50cycgOiAncmVzcG9uc2UnKSBhc1xuICAgICAgICB8ICdldmVudHMnXG4gICAgICAgIHwgJ3Jlc3BvbnNlJyxcbiAgICAgIHdpdGhDb3VudDogb3B0aW9ucy53aXRoQ291bnQsXG4gICAgICBib2R5UXVlcnlPcHRpb25zOiBvcHRpb25zLmJvZHlRdWVyeU9wdGlvbnMsXG4gICAgICByZXBvcnRQcm9ncmVzczogb3B0aW9ucy5yZXBvcnRQcm9ncmVzcyxcbiAgICAgIGZldGNoUG9saWN5OiBvcHRpb25zLmZldGNoUG9saWN5LFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBvcHRpb25zLndpdGhDcmVkZW50aWFscyxcbiAgICB9KTtcblxuICAgIGxldCByZXMkID0gdGhpcy5yZXF1ZXN0ZXIgIT09IHVuZGVmaW5lZCA/IHRoaXMucmVxdWVzdGVyKHJlcSkgOiBORVZFUjtcblxuICAgIHJlcyQgPSByZXMkLnBpcGUoXG4gICAgICBtYXAoKHJlczogSHR0cEV2ZW50PGFueT4pID0+XG4gICAgICAgIHJlcy50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlXG4gICAgICAgICAgPyBPRGF0YVJlc3BvbnNlLmZyb21IdHRwUmVzcG9uc2U8YW55PihyZXEsIHJlcylcbiAgICAgICAgICA6IHJlcyxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmVycm9ySGFuZGxlciAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmVzJCA9IHJlcyQucGlwZShjYXRjaEVycm9yKHRoaXMuZXJyb3JIYW5kbGVyKSk7XG5cbiAgICBpZiAob3B0aW9ucy5vYnNlcnZlID09PSAnZXZlbnRzJykge1xuICAgICAgcmV0dXJuIHJlcyQ7XG4gICAgfVxuXG4gICAgcmVzJCA9IHRoaXMuY2FjaGUuaGFuZGxlUmVxdWVzdChyZXEsIHJlcyQpO1xuXG4gICAgc3dpdGNoIChvcHRpb25zLm9ic2VydmUgfHwgJ2JvZHknKSB7XG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnJlc3BvbnNlVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2VudGl0aWVzJzpcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy5lbnRpdGllcygpKSk7XG4gICAgICAgICAgY2FzZSAnZW50aXR5JzpcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy5lbnRpdHkoKSkpO1xuICAgICAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy5wcm9wZXJ0eSgpKSk7XG4gICAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLnZhbHVlKCkgYXMgVCkpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBPdGhlciByZXNwb25zZVR5cGVzIChhcnJheWJ1ZmZlciwgYmxvYiwganNvbiwgdGV4dCkgcmV0dXJuIGJvZHlcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy5ib2R5KSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3Jlc3BvbnNlJzpcbiAgICAgICAgLy8gVGhlIHJlc3BvbnNlIHN0cmVhbSB3YXMgcmVxdWVzdGVkIGRpcmVjdGx5LCBzbyByZXR1cm4gaXQuXG4gICAgICAgIHJldHVybiByZXMkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBuZXcgZnV0dXJlIG9ic2VydmUgdHlwZXMgYmVpbmcgYWRkZWQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5yZWFjaGFibGU6IHVuaGFuZGxlZCBvYnNlcnZlIHR5cGUgJHtvcHRpb25zLm9ic2VydmV9fWAsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8jIHJlZ2lvbiBGaW5kIGJ5IFR5cGVcbiAgLy8gTWVtb2l6ZVxuICBwcml2YXRlIG1lbW86IHtcbiAgICBmb3JUeXBlOiB7XG4gICAgICBlbnVtOiBNYXA8c3RyaW5nLCBPRGF0YUVudW1UeXBlPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgICAgc3RydWN0dXJlZDogTWFwPHN0cmluZywgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIGNhbGxhYmxlOiBNYXA8c3RyaW5nLCBPRGF0YUNhbGxhYmxlPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgICAgZW50aXR5U2V0OiBNYXA8c3RyaW5nLCBPRGF0YUVudGl0eVNldCB8IHVuZGVmaW5lZD47XG4gICAgICBwYXJzZXI6IE1hcDxzdHJpbmcsIFBhcnNlcjxhbnk+PjtcbiAgICAgIG9wdGlvbnM6IE1hcDxzdHJpbmcsIE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgIH07XG4gICAgYnlOYW1lOiB7XG4gICAgICBlbnVtOiBNYXA8c3RyaW5nLCBPRGF0YUVudW1UeXBlPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgICAgc3RydWN0dXJlZDogTWFwPHN0cmluZywgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIGNhbGxhYmxlOiBNYXA8c3RyaW5nLCBPRGF0YUNhbGxhYmxlPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgICAgZW50aXR5U2V0OiBNYXA8c3RyaW5nLCBPRGF0YUVudGl0eVNldCB8IHVuZGVmaW5lZD47XG4gICAgfTtcbiAgfSA9IHtcbiAgICBmb3JUeXBlOiB7XG4gICAgICBlbnVtOiBuZXcgTWFwPHN0cmluZywgT0RhdGFFbnVtVHlwZTxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgICAgc3RydWN0dXJlZDogbmV3IE1hcDxzdHJpbmcsIE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIGNhbGxhYmxlOiBuZXcgTWFwPHN0cmluZywgT0RhdGFDYWxsYWJsZTxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgICAgZW50aXR5U2V0OiBuZXcgTWFwPHN0cmluZywgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ+KCksXG4gICAgICBwYXJzZXI6IG5ldyBNYXA8c3RyaW5nLCBQYXJzZXI8YW55Pj4oKSxcbiAgICAgIG9wdGlvbnM6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgIH0sXG4gICAgYnlOYW1lOiB7XG4gICAgICBlbnVtOiBuZXcgTWFwPHN0cmluZywgT0RhdGFFbnVtVHlwZTxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgICAgc3RydWN0dXJlZDogbmV3IE1hcDxzdHJpbmcsIE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIGNhbGxhYmxlOiBuZXcgTWFwPHN0cmluZywgT0RhdGFDYWxsYWJsZTxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgICAgZW50aXR5U2V0OiBuZXcgTWFwPHN0cmluZywgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ+KCksXG4gICAgfSxcbiAgfTtcblxuICBwcml2YXRlIGZpbmRTY2hlbWFGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHNjaGVtYXMgPSB0aGlzLnNjaGVtYXMuZmlsdGVyKChzKSA9PiBzLmlzTmFtZXNwYWNlT2YodHlwZSkpO1xuICAgIGlmIChzY2hlbWFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc2NoZW1hcy5sZW5ndGggPT09IDEpIHJldHVybiBzY2hlbWFzWzBdO1xuICAgIHJldHVybiBzY2hlbWFzXG4gICAgICAuc29ydCgoczEsIHMyKSA9PiBzMS5uYW1lc3BhY2UubGVuZ3RoIC0gczIubmFtZXNwYWNlLmxlbmd0aClcbiAgICAgIC5wb3AoKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW51bVR5cGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5lbnVtLmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5mb3JUeXBlLmVudW0uZ2V0KHR5cGUpIGFzIE9EYXRhRW51bVR5cGU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGVudW1UeXBlID0gdGhpcy5maW5kU2NoZW1hRm9yVHlwZSh0eXBlKT8uZmluZEVudW1UeXBlRm9yVHlwZTxUPih0eXBlKTtcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5lbnVtLnNldCh0eXBlLCBlbnVtVHlwZSk7XG4gICAgcmV0dXJuIGVudW1UeXBlO1xuICB9XG5cbiAgcHVibGljIGZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5mb3JUeXBlLnN0cnVjdHVyZWQuaGFzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUuc3RydWN0dXJlZC5nZXQodHlwZSkgYXNcbiAgICAgICAgfCBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdHJ1Y3R1cmVkVHlwZSA9XG4gICAgICB0aGlzLmZpbmRTY2hlbWFGb3JUeXBlKHR5cGUpPy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPFQ+KHR5cGUpO1xuICAgIHRoaXMubWVtby5mb3JUeXBlLnN0cnVjdHVyZWQuc2V0KHR5cGUsIHN0cnVjdHVyZWRUeXBlKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZmluZENhbGxhYmxlRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcsIGJpbmRpbmdUeXBlPzogc3RyaW5nKSB7XG4gICAgY29uc3Qga2V5ID0gYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZCA/IGAke2JpbmRpbmdUeXBlfS8ke3R5cGV9YCA6IHR5cGU7XG4gICAgaWYgKHRoaXMubWVtby5mb3JUeXBlLmNhbGxhYmxlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUuY2FsbGFibGUuZ2V0KGtleSkgYXNcbiAgICAgICAgfCBPRGF0YUNhbGxhYmxlPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjYWxsYWJsZSA9IHRoaXMuZmluZFNjaGVtYUZvclR5cGUodHlwZSk/LmZpbmRDYWxsYWJsZUZvclR5cGU8VD4oXG4gICAgICB0eXBlLFxuICAgICAgYmluZGluZ1R5cGUsXG4gICAgKTtcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5jYWxsYWJsZS5zZXQoa2V5LCBjYWxsYWJsZSk7XG4gICAgcmV0dXJuIGNhbGxhYmxlO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnRpdHlTZXRGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5lbnRpdHlTZXQuaGFzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0LmdldCh0eXBlKSBhc1xuICAgICAgICB8IE9EYXRhRW50aXR5U2V0XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnRpdHlTZXQgPSB0aGlzLmZpbmRTY2hlbWFGb3JUeXBlKHR5cGUpPy5maW5kRW50aXR5U2V0Rm9yVHlwZSh0eXBlKTtcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5lbnRpdHlTZXQuc2V0KHR5cGUsIGVudGl0eVNldCk7XG4gICAgcmV0dXJuIGVudGl0eVNldDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kTW9kZWxGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8YW55Pih0eXBlKT8ubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgbW9kZWxGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuZmluZE1vZGVsRm9yVHlwZSh0eXBlKTtcbiAgICBpZiAoTW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQnVpbGQgQWQtaG9jIG1vZGVsXG4gICAgICBsZXQgc2NoZW1hID0gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPGFueT4odHlwZSk7XG4gICAgICBpZiAoc2NoZW1hID09PSB1bmRlZmluZWQpIHRocm93IEVycm9yKGBObyBzY2hlbWEgZm9yICR7dHlwZX1gKTtcbiAgICAgIE1vZGVsID0gY2xhc3MgZXh0ZW5kcyBPRGF0YU1vZGVsPGFueT4ge30gYXMgdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgICAvLyBCdWlsZCBNZXRhXG4gICAgICBNb2RlbC5idWlsZE1ldGEoeyBzY2hlbWEgfSk7XG4gICAgICAvLyBDb25maWd1cmVcbiAgICAgIE1vZGVsLm1ldGEuY29uZmlndXJlKHtcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcgfCBFZG1UeXBlKSA9PiB0aGlzLnBhcnNlckZvclR5cGUodHlwZSksXG4gICAgICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gdGhpcy5maW5kT3B0aW9uc0ZvclR5cGUodHlwZSksXG4gICAgICB9KTtcbiAgICAgIC8vIFN0b3JlIE5ldyBNb2RlbCBmb3IgbmV4dCB0aW1lXG4gICAgICBzY2hlbWEubW9kZWwgPSBNb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIE1vZGVsO1xuICB9XG5cbiAgcHVibGljIGZpbmRDb2xsZWN0aW9uRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPGFueT4odHlwZSk/LmNvbGxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgY29sbGVjdGlvbkZvclR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IENvbGxlY3Rpb24gPSB0aGlzLmZpbmRDb2xsZWN0aW9uRm9yVHlwZSh0eXBlKTtcbiAgICBpZiAoQ29sbGVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgc2NoZW1hID0gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPGFueT4odHlwZSk7XG4gICAgICBpZiAoc2NoZW1hID09PSB1bmRlZmluZWQpIHRocm93IEVycm9yKCcnKTtcbiAgICAgIENvbGxlY3Rpb24gPSBjbGFzcyBleHRlbmRzIE9EYXRhQ29sbGVjdGlvbjxcbiAgICAgICAgYW55LFxuICAgICAgICBPRGF0YU1vZGVsPGFueT5cbiAgICAgID4ge30gYXMgdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICAgIENvbGxlY3Rpb24ubW9kZWwgPSB0aGlzLm1vZGVsRm9yVHlwZSh0eXBlKTtcbiAgICAgIC8vIFN0b3JlIE5ldyBDb2xsZWN0aW9uIGZvciBuZXh0IHRpbWVcbiAgICAgIHNjaGVtYS5jb2xsZWN0aW9uID0gQ29sbGVjdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIENvbGxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgZmluZFNlcnZpY2VGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRFbnRpdHlTZXRGb3JUeXBlKHR5cGUpPy5zZXJ2aWNlIGFzXG4gICAgICB8IHR5cGVvZiBPRGF0YUVudGl0eVNlcnZpY2VcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnRpdHlTZXRGb3JFbnRpdHlUeXBlKGVudGl0eVR5cGU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5lbnRpdHlTZXQuaGFzKGVudGl0eVR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0LmdldChlbnRpdHlUeXBlKSBhc1xuICAgICAgICB8IE9EYXRhRW50aXR5U2V0XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnRpdHlTZXQgPSB0aGlzLnNjaGVtYXNcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmVudGl0eVNldHNdLFxuICAgICAgICA8T0RhdGFFbnRpdHlTZXRbXT5bXSxcbiAgICAgIClcbiAgICAgIC5maW5kKChlKSA9PiBlLmVudGl0eVR5cGUgPT09IGVudGl0eVR5cGUpO1xuICAgIHRoaXMubWVtby5mb3JUeXBlLmVudGl0eVNldC5zZXQoZW50aXR5VHlwZSwgZW50aXR5U2V0KTtcbiAgICByZXR1cm4gZW50aXR5U2V0O1xuICB9XG5cbiAgcHVibGljIGZpbmRTZXJ2aWNlRm9yRW50aXR5VHlwZShlbnRpdHlUeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kRW50aXR5U2V0Rm9yRW50aXR5VHlwZShlbnRpdHlUeXBlKT8uc2VydmljZSBhc1xuICAgICAgfCB0eXBlb2YgT0RhdGFFbnRpdHlTZXJ2aWNlXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW51bVR5cGVCeU5hbWU8VD4obmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5ieU5hbWUuZW51bS5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uYnlOYW1lLmVudW0uZ2V0KG5hbWUpIGFzIE9EYXRhRW51bVR5cGU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGVudW1UeXBlID0gdGhpcy5zY2hlbWFzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnVtc10sXG4gICAgICAgIDxPRGF0YUVudW1UeXBlPFQ+W10+W10sXG4gICAgICApXG4gICAgICAuZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICB0aGlzLm1lbW8uYnlOYW1lLmVudW0uc2V0KG5hbWUsIGVudW1UeXBlKTtcbiAgICByZXR1cm4gZW51bVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZmluZFN0cnVjdHVyZWRUeXBlQnlOYW1lPFQ+KG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uYnlOYW1lLnN0cnVjdHVyZWQuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmJ5TmFtZS5zdHJ1Y3R1cmVkLmdldChuYW1lKSBhc1xuICAgICAgICB8IE9EYXRhU3RydWN0dXJlZFR5cGU8VD5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0cnVjdHVyZWRUeXBlID0gdGhpcy5zY2hlbWFzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnRpdGllc10sXG4gICAgICAgIDxPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+W10+W10sXG4gICAgICApXG4gICAgICAuZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICB0aGlzLm1lbW8uYnlOYW1lLnN0cnVjdHVyZWQuc2V0KG5hbWUsIHN0cnVjdHVyZWRUeXBlKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZmluZENhbGxhYmxlQnlOYW1lPFQ+KG5hbWU6IHN0cmluZywgYmluZGluZ1R5cGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSBiaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkID8gYCR7YmluZGluZ1R5cGV9LyR7bmFtZX1gIDogbmFtZTtcbiAgICBpZiAodGhpcy5tZW1vLmJ5TmFtZS5jYWxsYWJsZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5ieU5hbWUuY2FsbGFibGUuZ2V0KGtleSkgYXMgT0RhdGFDYWxsYWJsZTxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2FsbGFibGUgPSB0aGlzLnNjaGVtYXNcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmNhbGxhYmxlc10sXG4gICAgICAgIDxPRGF0YUNhbGxhYmxlPFQ+W10+W10sXG4gICAgICApXG4gICAgICAuZmluZChcbiAgICAgICAgKGMpID0+XG4gICAgICAgICAgYy5uYW1lID09PSBuYW1lICYmXG4gICAgICAgICAgKGJpbmRpbmdUeXBlID09PSB1bmRlZmluZWQgfHwgYy5iaW5kaW5nKCk/LnR5cGUgPT09IGJpbmRpbmdUeXBlKSxcbiAgICAgICk7XG4gICAgdGhpcy5tZW1vLmJ5TmFtZS5jYWxsYWJsZS5zZXQoa2V5LCBjYWxsYWJsZSk7XG4gICAgcmV0dXJuIGNhbGxhYmxlO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnRpdHlTZXRCeU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5ieU5hbWUuZW50aXR5U2V0LmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5ieU5hbWUuZW50aXR5U2V0LmdldChuYW1lKSBhcyBPRGF0YUVudGl0eVNldCB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zY2hlbWFzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnRpdHlTZXRzXSxcbiAgICAgICAgPE9EYXRhRW50aXR5U2V0W10+W10sXG4gICAgICApXG4gICAgICAuZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICB0aGlzLm1lbW8uYnlOYW1lLmVudGl0eVNldC5zZXQobmFtZSwgc2NoZW1hKTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgcHVibGljIGZpbmRNb2RlbEJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVCeU5hbWU8YW55PihuYW1lKT8ubW9kZWwgYXNcbiAgICAgIHwgdHlwZW9mIE9EYXRhTW9kZWxcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRDb2xsZWN0aW9uQnlOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUJ5TmFtZTxhbnk+KG5hbWUpPy5jb2xsZWN0aW9uIGFzXG4gICAgICB8IHR5cGVvZiBPRGF0YUNvbGxlY3Rpb25cbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRTZXJ2aWNlQnlOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRFbnRpdHlTZXRCeU5hbWUobmFtZSk/LnNlcnZpY2UgYXNcbiAgICAgIHwgdHlwZW9mIE9EYXRhRW50aXR5U2VydmljZVxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VyRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcgfCBFZG1UeXBlLCBiaW5kaW5nVHlwZT86IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgPyBgJHtiaW5kaW5nVHlwZX0vJHt0eXBlfWAgOiB0eXBlO1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5wYXJzZXIuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uZm9yVHlwZS5wYXJzZXIuZ2V0KGtleSkgYXMgUGFyc2VyPFQ+O1xuICAgIH1cbiAgICAvLyBOb25lIFBhcnNlciBieSBkZWZhdWx0XG4gICAgbGV0IHBhcnNlcjogUGFyc2VyPFQ+ID0gTk9ORV9QQVJTRVI7XG4gICAgaWYgKHRoaXMucGFyc2Vycy5oYXModHlwZSkpIHtcbiAgICAgIC8vIEVkbSwgQmFzZSBQYXJzZXJzXG4gICAgICBwYXJzZXIgPSB0aGlzLnBhcnNlcnMuZ2V0KHR5cGUpIGFzIFBhcnNlcjxUPjtcbiAgICB9IGVsc2UgaWYgKCF0eXBlLnN0YXJ0c1dpdGgoJ0VkbS4nKSkge1xuICAgICAgLy8gRW51bVR5cGUsIENvbXBsZXhUeXBlIGFuZCBFbnRpdHlUeXBlIFBhcnNlcnNcbiAgICAgIGxldCB2YWx1ZSA9XG4gICAgICAgIHRoaXMuZmluZENhbGxhYmxlRm9yVHlwZTxUPih0eXBlLCBiaW5kaW5nVHlwZSkgfHxcbiAgICAgICAgdGhpcy5maW5kRW51bVR5cGVGb3JUeXBlPFQ+KHR5cGUpIHx8XG4gICAgICAgIHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPih0eXBlKTtcbiAgICAgIHBhcnNlciA9IHZhbHVlPy5wYXJzZXIgYXMgUGFyc2VyPFQ+O1xuICAgIH1cbiAgICAvLyBTZXQgUGFyc2VyIGZvciBuZXh0IHRpbWVcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5wYXJzZXIuc2V0KGtleSwgcGFyc2VyKTtcbiAgICByZXR1cm4gcGFyc2VyO1xuICB9XG5cbiAgcHVibGljIGZpbmRPcHRpb25zRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcpIHtcbiAgICAvLyBTdHJ1Y3V0cmVkIE9wdGlvbnNcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUub3B0aW9ucy5oYXModHlwZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uZm9yVHlwZS5vcHRpb25zLmdldCh0eXBlKSBhc1xuICAgICAgICB8IE9EYXRhTW9kZWxPcHRpb25zPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdCA9IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPih0eXBlKTtcbiAgICBjb25zdCBvcHRpb25zID0gc3Q/Lm1vZGVsPy5tZXRhO1xuICAgIC8vIFNldCBPcHRpb25zIGZvciBuZXh0IHRpbWVcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5vcHRpb25zLnNldCh0eXBlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxufVxuIl19