angular-odata 0.130.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 (159) hide show
  1. package/fesm2022/angular-odata.mjs +2298 -2162
  2. package/fesm2022/angular-odata.mjs.map +1 -1
  3. package/lib/api.d.ts +10 -11
  4. package/lib/cache/cache.d.ts +2 -2
  5. package/lib/cache/memory.d.ts +2 -2
  6. package/lib/cache/storage.d.ts +2 -2
  7. package/lib/loaders.d.ts +8 -8
  8. package/lib/metadata/csdl/csdl-annotation.d.ts +3 -3
  9. package/lib/metadata/csdl/csdl-entity-container.d.ts +2 -2
  10. package/lib/metadata/csdl/csdl-entity-set.d.ts +2 -2
  11. package/lib/metadata/csdl/csdl-enum-type.d.ts +3 -3
  12. package/lib/metadata/csdl/csdl-function-action.d.ts +4 -4
  13. package/lib/metadata/csdl/csdl-reference.d.ts +2 -2
  14. package/lib/metadata/csdl/csdl-schema.d.ts +2 -2
  15. package/lib/metadata/csdl/csdl-structural-property.d.ts +3 -3
  16. package/lib/metadata/csdl/csdl-structured-type.d.ts +3 -3
  17. package/lib/metadata/metadata.d.ts +2 -2
  18. package/lib/models/options.d.ts +2 -2
  19. package/lib/module.d.ts +3 -3
  20. package/lib/options.d.ts +3 -3
  21. package/lib/resources/query/expressions/apply.d.ts +1 -1
  22. package/lib/resources/query/expressions/compute.d.ts +1 -1
  23. package/lib/resources/query/expressions/count.d.ts +1 -1
  24. package/lib/resources/query/expressions/expand.d.ts +4 -3
  25. package/lib/resources/query/expressions/filter.d.ts +2 -1
  26. package/lib/resources/query/expressions/orderby.d.ts +2 -1
  27. package/lib/resources/query/expressions/search.d.ts +2 -1
  28. package/lib/resources/query/expressions/select.d.ts +2 -1
  29. package/lib/resources/query/handlers.d.ts +17 -5
  30. package/lib/resources/resource.d.ts +5 -5
  31. package/lib/resources/types/action.d.ts +2 -2
  32. package/lib/resources/types/entity-set.d.ts +2 -2
  33. package/lib/resources/types/navigation-property.d.ts +2 -2
  34. package/lib/resources/types/property.d.ts +2 -2
  35. package/lib/schema/annotation.d.ts +3 -3
  36. package/lib/schema/callable.d.ts +3 -3
  37. package/lib/schema/element.d.ts +3 -3
  38. package/lib/schema/entity-container.d.ts +2 -2
  39. package/lib/schema/entity-set.d.ts +2 -2
  40. package/lib/schema/enum-type.d.ts +2 -2
  41. package/lib/schema/parsers/callable.d.ts +4 -4
  42. package/lib/schema/parsers/enum-type.d.ts +3 -3
  43. package/lib/schema/parsers/structured-type.d.ts +4 -4
  44. package/lib/schema/schema.d.ts +3 -3
  45. package/lib/schema/singleton.d.ts +2 -2
  46. package/lib/schema/structured-type.d.ts +3 -3
  47. package/lib/services/entity.d.ts +1 -1
  48. package/lib/settings.d.ts +2 -2
  49. package/lib/types.d.ts +76 -74
  50. package/lib/utils/odata.d.ts +2 -2
  51. package/package.json +3 -5
  52. package/schematics/apigen/files/api-config/__fileName__.ts +4 -4
  53. package/esm2022/angular-odata.mjs +0 -5
  54. package/esm2022/lib/annotations.mjs +0 -146
  55. package/esm2022/lib/api.mjs +0 -439
  56. package/esm2022/lib/cache/cache.mjs +0 -177
  57. package/esm2022/lib/cache/index.mjs +0 -4
  58. package/esm2022/lib/cache/memory.mjs +0 -30
  59. package/esm2022/lib/cache/storage.mjs +0 -57
  60. package/esm2022/lib/client.mjs +0 -215
  61. package/esm2022/lib/constants.mjs +0 -95
  62. package/esm2022/lib/helper.mjs +0 -288
  63. package/esm2022/lib/index.mjs +0 -22
  64. package/esm2022/lib/loaders.mjs +0 -43
  65. package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -273
  66. package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -59
  67. package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -50
  68. package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -74
  69. package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -204
  70. package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -15
  71. package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -76
  72. package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -87
  73. package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -37
  74. package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -145
  75. package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -159
  76. package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -46
  77. package/esm2022/lib/metadata/index.mjs +0 -3
  78. package/esm2022/lib/metadata/metadata.mjs +0 -41
  79. package/esm2022/lib/metadata/parser.mjs +0 -564
  80. package/esm2022/lib/models/collection.mjs +0 -816
  81. package/esm2022/lib/models/index.mjs +0 -4
  82. package/esm2022/lib/models/model.mjs +0 -577
  83. package/esm2022/lib/models/options.mjs +0 -1227
  84. package/esm2022/lib/module.mjs +0 -55
  85. package/esm2022/lib/options.mjs +0 -91
  86. package/esm2022/lib/resources/index.mjs +0 -7
  87. package/esm2022/lib/resources/options.mjs +0 -66
  88. package/esm2022/lib/resources/path/handlers.mjs +0 -81
  89. package/esm2022/lib/resources/path/index.mjs +0 -3
  90. package/esm2022/lib/resources/path/segments.mjs +0 -149
  91. package/esm2022/lib/resources/query/builder.mjs +0 -645
  92. package/esm2022/lib/resources/query/expressions/apply.mjs +0 -238
  93. package/esm2022/lib/resources/query/expressions/base.mjs +0 -26
  94. package/esm2022/lib/resources/query/expressions/compute.mjs +0 -55
  95. package/esm2022/lib/resources/query/expressions/count.mjs +0 -118
  96. package/esm2022/lib/resources/query/expressions/expand.mjs +0 -154
  97. package/esm2022/lib/resources/query/expressions/filter.mjs +0 -180
  98. package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
  99. package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -81
  100. package/esm2022/lib/resources/query/expressions/search.mjs +0 -144
  101. package/esm2022/lib/resources/query/expressions/select.mjs +0 -49
  102. package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -770
  103. package/esm2022/lib/resources/query/handlers.mjs +0 -423
  104. package/esm2022/lib/resources/query/index.mjs +0 -5
  105. package/esm2022/lib/resources/query/options.mjs +0 -140
  106. package/esm2022/lib/resources/request.mjs +0 -210
  107. package/esm2022/lib/resources/resource.mjs +0 -316
  108. package/esm2022/lib/resources/response.mjs +0 -180
  109. package/esm2022/lib/resources/types/action.mjs +0 -118
  110. package/esm2022/lib/resources/types/batch.mjs +0 -428
  111. package/esm2022/lib/resources/types/count.mjs +0 -33
  112. package/esm2022/lib/resources/types/entity-set.mjs +0 -131
  113. package/esm2022/lib/resources/types/entity.mjs +0 -112
  114. package/esm2022/lib/resources/types/function.mjs +0 -149
  115. package/esm2022/lib/resources/types/index.mjs +0 -15
  116. package/esm2022/lib/resources/types/media.mjs +0 -44
  117. package/esm2022/lib/resources/types/metadata.mjs +0 -35
  118. package/esm2022/lib/resources/types/navigation-property.mjs +0 -246
  119. package/esm2022/lib/resources/types/options.mjs +0 -2
  120. package/esm2022/lib/resources/types/property.mjs +0 -187
  121. package/esm2022/lib/resources/types/reference.mjs +0 -87
  122. package/esm2022/lib/resources/types/singleton.mjs +0 -125
  123. package/esm2022/lib/resources/types/value.mjs +0 -48
  124. package/esm2022/lib/schema/annotation.mjs +0 -44
  125. package/esm2022/lib/schema/callable.mjs +0 -69
  126. package/esm2022/lib/schema/element.mjs +0 -70
  127. package/esm2022/lib/schema/entity-container.mjs +0 -13
  128. package/esm2022/lib/schema/entity-set.mjs +0 -11
  129. package/esm2022/lib/schema/enum-type.mjs +0 -69
  130. package/esm2022/lib/schema/index.mjs +0 -9
  131. package/esm2022/lib/schema/parsers/callable.mjs +0 -123
  132. package/esm2022/lib/schema/parsers/edm.mjs +0 -101
  133. package/esm2022/lib/schema/parsers/enum-type.mjs +0 -148
  134. package/esm2022/lib/schema/parsers/index.mjs +0 -5
  135. package/esm2022/lib/schema/parsers/structured-type.mjs +0 -548
  136. package/esm2022/lib/schema/schema.mjs +0 -52
  137. package/esm2022/lib/schema/singleton.mjs +0 -11
  138. package/esm2022/lib/schema/structured-type.mjs +0 -220
  139. package/esm2022/lib/services/base.mjs +0 -32
  140. package/esm2022/lib/services/entity-set.mjs +0 -161
  141. package/esm2022/lib/services/entity.mjs +0 -12
  142. package/esm2022/lib/services/factory.mjs +0 -39
  143. package/esm2022/lib/services/index.mjs +0 -5
  144. package/esm2022/lib/services/singleton.mjs +0 -55
  145. package/esm2022/lib/settings.mjs +0 -113
  146. package/esm2022/lib/types.mjs +0 -118
  147. package/esm2022/lib/utils/arraybuffers.mjs +0 -46
  148. package/esm2022/lib/utils/arrays.mjs +0 -10
  149. package/esm2022/lib/utils/dates.mjs +0 -18
  150. package/esm2022/lib/utils/durations.mjs +0 -40
  151. package/esm2022/lib/utils/enums.mjs +0 -61
  152. package/esm2022/lib/utils/http.mjs +0 -95
  153. package/esm2022/lib/utils/index.mjs +0 -10
  154. package/esm2022/lib/utils/objects.mjs +0 -204
  155. package/esm2022/lib/utils/odata.mjs +0 -22
  156. package/esm2022/lib/utils/strings.mjs +0 -20
  157. package/esm2022/lib/utils/types.mjs +0 -136
  158. package/esm2022/lib/utils/urls.mjs +0 -24
  159. package/esm2022/public-api.mjs +0 -5
@@ -1,564 +0,0 @@
1
- import { VERSION_4_0 } from '../constants';
2
- import { ODataMetadata } from './metadata';
3
- var FieldType;
4
- (function (FieldType) {
5
- FieldType[FieldType["ATTRIBUTE"] = 0] = "ATTRIBUTE";
6
- FieldType[FieldType["TAG"] = 1] = "TAG";
7
- })(FieldType || (FieldType = {}));
8
- class Field {
9
- name;
10
- fieldType;
11
- constructor(name, fieldType) {
12
- this.name = name;
13
- this.fieldType = fieldType;
14
- }
15
- }
16
- export class ODataMetadataParser {
17
- // TAGS
18
- static TAG_EDMX = 'edmx:Edmx';
19
- static TAG_DATA_SERVICES = 'edmx:DataServices';
20
- static TAG_REFERENCE = 'edmx:Reference';
21
- static TAG_INCLUDE = 'edmx:Include';
22
- static TAG_INCLUDE_ANNOTATIONS = 'edmx:IncludeAnnotations';
23
- static TAG_TERM = 'Term';
24
- static TAG_ANNOTATIONS = 'Annotations';
25
- static TAG_ANNOTATION = 'Annotation';
26
- static TAG_SCHEMA = 'Schema';
27
- static TAG_ENUM_TYPE = 'EnumType';
28
- static TAG_MEMBER = 'Member';
29
- static TAG_COMPLEX_TYPE = 'ComplexType';
30
- static TAG_ENTITY_TYPE = 'EntityType';
31
- static TAG_PROPERTY = 'Property';
32
- static TAG_KEY = 'Key';
33
- static TAG_PROPERTY_REF = 'PropertyRef';
34
- static TAG_NAVIGATION_PROPERTY = 'NavigationProperty';
35
- static TAG_REFERENTIAL_CONSTRAINT = 'ReferentialConstraint';
36
- static TAG_ON_DELETE = 'OnDelete';
37
- static TAG_FUNCTION = 'Function';
38
- static TAG_RETURN_TYPE = 'ReturnType';
39
- static TAG_PARAMETER = 'Parameter';
40
- static TAG_ACTION = 'Action';
41
- static TAG_ENTITY_CONTAINER = 'EntityContainer';
42
- static TAG_ENTITY_SET = 'EntitySet';
43
- static TAG_SINGLETON = 'Singleton';
44
- static TAG_COLLECTION = 'Collection';
45
- static TAG_RECORD = 'Record';
46
- static TAG_STRING = 'String';
47
- static TAG_ENUM_MEMBER = 'EnumMember';
48
- static TAG_PROPERTY_VALUE = 'PropertyValue';
49
- static TAG_PROPERTY_PATH = 'PropertyPath';
50
- static TAG_NAVIGATION_PROPERTY_PATH = 'NavigationPropertyPath';
51
- static TAG_FUNCTION_IMPORT = 'FunctionImport';
52
- static TAG_ACTION_IMPORT = 'ActionImport';
53
- static TAG_NAVIGATION_PROPERTY_BINDING = 'NavigationPropertyBinding';
54
- static TAG_TYPE_DEFINITION = 'TypeDefinition';
55
- // ATTRIBUTES
56
- static ATTRIBUTE_VERSION = 'Version';
57
- static ATTRIBUTE_URI = 'Uri';
58
- static ATTRIBUTE_ALIAS = 'Alias';
59
- static ATTRIBUTE_NAMESPACE = 'Namespace';
60
- static ATTRIBUTE_TERM_NAMESPACE = 'TermNamespace';
61
- static ATTRIBUTE_QUALIFIER = 'Qualifier';
62
- static ATTRIBUTE_STRING = 'String';
63
- static ATTRIBUTE_DATE = 'Date';
64
- static ATTRIBUTE_BOOL = 'Bool';
65
- static ATTRIBUTE_INT = 'Int';
66
- static ATTRIBUTE_TARGET_NAMESPACE = 'TargetNamespace';
67
- static ATTRIBUTE_TERM = 'Term';
68
- static ATTRIBUTE_NAME = 'Name';
69
- static ATTRIBUTE_VALUE = 'Value';
70
- static ATTRIBUTE_BASE_TYPE = 'BaseType';
71
- static ATTRIBUTE_OPEN_TYPE = 'OpenType';
72
- static ATTRIBUTE_TYPE = 'Type';
73
- static ATTRIBUTE_NULLABLE = 'Nullable';
74
- static ATTRIBUTE_MAX_LENGTH = 'MaxLength';
75
- static ATTRIBUTE_PRECISION = 'Precision';
76
- static ATTRIBUTE_SCALE = 'Scale';
77
- static ATTRIBUTE_UNICODE = 'Unicode';
78
- static ATTRIBUTE_SRID = 'SRID';
79
- static ATTRIBUTE_DEFAULT_VALUE = 'DefaultValue';
80
- static ATTRIBUTE_PARTNER = 'Partner';
81
- static ATTRIBUTE_PROPERTY = 'Property';
82
- static ATTRIBUTE_REFERENCED_PROPERTY = 'ReferencedProperty';
83
- static ATTRIBUTE_HAS_STREAM = 'HasStream';
84
- static ATTRIBUTE_CONTAINS_TARGET = 'ContainsTarget';
85
- static ATTRIBUTE_IS_BOUND = 'IsBound';
86
- static ATTRIBUTE_ENTITY_SET_PATH = 'EntitySetPath';
87
- static ATTRIBUTE_IS_COMPOSABLE = 'IsComposable';
88
- static ATTRIBUTE_ENTITY_TYPE = 'EntityType';
89
- static ATTRIBUTE_PATH = 'Path';
90
- static ATTRIBUTE_TARGET = 'Target';
91
- static ATTRIBUTE_FUNCTION = 'Function';
92
- static ATTRIBUTE_ACTION = 'Action';
93
- static ATTRIBUTE_ENTITY_SET = 'EntitySet';
94
- static ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT = 'IncludeInServiceDocument';
95
- static ATTRIBUTE_ABSTRACT = 'Abstract';
96
- static ATTRIBUTE_UNDERLYING_TYPE = 'UnderlyingType';
97
- static ATTRIBUTE_IS_FLAGS = 'IsFlags';
98
- static ATTRIBUTE_EXTENDS = 'Extends';
99
- static ATTRIBUTE_BASE_TERM = 'BaseTerm';
100
- static ATTRIBUTE_APPLIES_TO = 'AppliesTo';
101
- document;
102
- constructor(xml) {
103
- try {
104
- const parser = new DOMParser();
105
- this.document = parser.parseFromString(xml, 'text/xml');
106
- this.checkVersion(document);
107
- }
108
- catch (error) {
109
- throw new Error('Unable to parse metadata, ' + error);
110
- }
111
- }
112
- metadata() {
113
- const version = this.getFieldValueByAttribute(new Field(ODataMetadataParser.ATTRIBUTE_VERSION, FieldType.ATTRIBUTE), this.document.documentElement.attributes);
114
- const references = this.getObjects(this.document.documentElement, ODataMetadataParser.TAG_REFERENCE, [
115
- new Field(ODataMetadataParser.ATTRIBUTE_URI, FieldType.ATTRIBUTE),
116
- new Field(ODataMetadataParser.TAG_INCLUDE, FieldType.TAG),
117
- new Field(ODataMetadataParser.TAG_INCLUDE_ANNOTATIONS, FieldType.TAG),
118
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
119
- ]);
120
- const dataServices = this.document.documentElement.getElementsByTagName(ODataMetadataParser.TAG_DATA_SERVICES)[0];
121
- const schemas = this.getObjects(dataServices, ODataMetadataParser.TAG_SCHEMA, [
122
- new Field(ODataMetadataParser.ATTRIBUTE_NAMESPACE, FieldType.ATTRIBUTE),
123
- new Field(ODataMetadataParser.ATTRIBUTE_ALIAS, FieldType.ATTRIBUTE),
124
- new Field(ODataMetadataParser.TAG_ENUM_TYPE, FieldType.TAG),
125
- new Field(ODataMetadataParser.TAG_COMPLEX_TYPE, FieldType.TAG),
126
- new Field(ODataMetadataParser.TAG_ENTITY_TYPE, FieldType.TAG),
127
- new Field(ODataMetadataParser.TAG_FUNCTION, FieldType.TAG),
128
- new Field(ODataMetadataParser.TAG_ACTION, FieldType.TAG),
129
- new Field(ODataMetadataParser.TAG_ENTITY_CONTAINER, FieldType.TAG),
130
- new Field(ODataMetadataParser.TAG_TYPE_DEFINITION, FieldType.TAG),
131
- new Field(ODataMetadataParser.TAG_TERM, FieldType.TAG),
132
- new Field(ODataMetadataParser.TAG_ANNOTATIONS, FieldType.TAG),
133
- ]);
134
- return new ODataMetadata(version, references, schemas);
135
- }
136
- checkVersion(document) {
137
- // check version
138
- const attributes = document.documentElement.attributes;
139
- if (!attributes) {
140
- throw new Error('OData version is not specified in the metadata');
141
- }
142
- const attr = attributes.getNamedItem('Version');
143
- if (attr === null) {
144
- throw new Error('OData version is not specified in the metadata');
145
- }
146
- const odataVersion = attr?.nodeValue;
147
- if (odataVersion !== VERSION_4_0) {
148
- throw new Error('OData version "' + odataVersion + '" is not supported');
149
- }
150
- }
151
- getObjects(parentElement, tag, fieldNames) {
152
- let objects = [];
153
- const children = parentElement.children;
154
- for (let index = 0; index < children.length; index++) {
155
- const element = children.item(index);
156
- if (!element || element.nodeName !== tag) {
157
- continue;
158
- }
159
- const attributes = element.attributes;
160
- const fieldValues = this.getFieldValues(fieldNames, attributes, element);
161
- fieldValues['TextContent'] = element.textContent;
162
- switch (tag) {
163
- case ODataMetadataParser.TAG_REFERENCE:
164
- case ODataMetadataParser.TAG_INCLUDE:
165
- case ODataMetadataParser.TAG_INCLUDE_ANNOTATIONS:
166
- case ODataMetadataParser.TAG_TERM:
167
- case ODataMetadataParser.TAG_ANNOTATIONS:
168
- case ODataMetadataParser.TAG_COLLECTION:
169
- case ODataMetadataParser.TAG_RECORD:
170
- case ODataMetadataParser.TAG_STRING:
171
- case ODataMetadataParser.TAG_ENUM_MEMBER:
172
- case ODataMetadataParser.TAG_PROPERTY_VALUE:
173
- case ODataMetadataParser.TAG_PROPERTY_PATH:
174
- case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_PATH:
175
- case ODataMetadataParser.TAG_ANNOTATION:
176
- case ODataMetadataParser.TAG_SCHEMA:
177
- case ODataMetadataParser.TAG_ENUM_TYPE:
178
- case ODataMetadataParser.TAG_COMPLEX_TYPE:
179
- case ODataMetadataParser.TAG_ENTITY_TYPE:
180
- case ODataMetadataParser.TAG_FUNCTION:
181
- case ODataMetadataParser.TAG_MEMBER:
182
- case ODataMetadataParser.TAG_PROPERTY:
183
- case ODataMetadataParser.TAG_PROPERTY_REF:
184
- case ODataMetadataParser.TAG_NAVIGATION_PROPERTY:
185
- case ODataMetadataParser.TAG_REFERENTIAL_CONSTRAINT:
186
- case ODataMetadataParser.TAG_PARAMETER:
187
- case ODataMetadataParser.TAG_ACTION:
188
- case ODataMetadataParser.TAG_ENTITY_SET:
189
- case ODataMetadataParser.TAG_SINGLETON:
190
- case ODataMetadataParser.TAG_FUNCTION_IMPORT:
191
- case ODataMetadataParser.TAG_ACTION_IMPORT:
192
- case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING:
193
- case ODataMetadataParser.TAG_TYPE_DEFINITION:
194
- case ODataMetadataParser.TAG_ENTITY_CONTAINER:
195
- objects.push(fieldValues);
196
- break;
197
- default:
198
- throw new Error('Unknwon tag:' + tag);
199
- }
200
- }
201
- return objects;
202
- }
203
- getObject(parentElement, tag, fieldNames) {
204
- let object;
205
- const children = parentElement.children;
206
- let element;
207
- for (let index = 0; index < children.length; index++) {
208
- if (children && children.item(index)?.nodeName === tag) {
209
- if (element !== undefined && element !== null) {
210
- throw new Error('Expected one ' + tag);
211
- }
212
- element = children.item(index);
213
- }
214
- }
215
- if (element !== undefined && element !== null) {
216
- const attributes = element.attributes;
217
- const fieldValues = this.getFieldValues(fieldNames, attributes, element);
218
- fieldValues['TextContent'] = element.textContent;
219
- switch (tag) {
220
- case ODataMetadataParser.TAG_KEY:
221
- case ODataMetadataParser.TAG_RETURN_TYPE:
222
- case ODataMetadataParser.TAG_ON_DELETE:
223
- return fieldValues;
224
- default:
225
- throw new Error('Unknwon tag:' + tag);
226
- }
227
- }
228
- return object;
229
- }
230
- getFieldValues(fields, attributes, element) {
231
- const fieldValues = {};
232
- for (const field of fields) {
233
- if (field.fieldType === FieldType.TAG) {
234
- fieldValues[field.name] = this.getFieldValueByTag(field, element);
235
- }
236
- else if (field.fieldType === FieldType.ATTRIBUTE) {
237
- fieldValues[field.name] = this.getFieldValueByAttribute(field, attributes);
238
- }
239
- else {
240
- throw new Error('Unknown field type: ' + field.fieldType);
241
- }
242
- }
243
- return fieldValues;
244
- }
245
- getFieldValueByAttribute(field, attributes) {
246
- switch (field.name) {
247
- case ODataMetadataParser.ATTRIBUTE_VERSION:
248
- case ODataMetadataParser.ATTRIBUTE_URI:
249
- case ODataMetadataParser.ATTRIBUTE_NAMESPACE:
250
- case ODataMetadataParser.ATTRIBUTE_ALIAS:
251
- case ODataMetadataParser.ATTRIBUTE_TERM_NAMESPACE:
252
- case ODataMetadataParser.ATTRIBUTE_TERM:
253
- case ODataMetadataParser.ATTRIBUTE_QUALIFIER:
254
- case ODataMetadataParser.ATTRIBUTE_STRING:
255
- case ODataMetadataParser.ATTRIBUTE_BOOL:
256
- case ODataMetadataParser.ATTRIBUTE_INT:
257
- case ODataMetadataParser.ATTRIBUTE_TARGET_NAMESPACE:
258
- case ODataMetadataParser.ATTRIBUTE_NAME:
259
- case ODataMetadataParser.ATTRIBUTE_TYPE:
260
- case ODataMetadataParser.ATTRIBUTE_SRID:
261
- case ODataMetadataParser.ATTRIBUTE_DEFAULT_VALUE:
262
- case ODataMetadataParser.ATTRIBUTE_PARTNER:
263
- case ODataMetadataParser.ATTRIBUTE_PROPERTY:
264
- case ODataMetadataParser.ATTRIBUTE_REFERENCED_PROPERTY:
265
- case ODataMetadataParser.ATTRIBUTE_BASE_TYPE:
266
- case ODataMetadataParser.ATTRIBUTE_ENTITY_SET_PATH:
267
- case ODataMetadataParser.ATTRIBUTE_ENTITY_TYPE:
268
- case ODataMetadataParser.ATTRIBUTE_PATH:
269
- case ODataMetadataParser.ATTRIBUTE_TARGET:
270
- case ODataMetadataParser.ATTRIBUTE_FUNCTION:
271
- case ODataMetadataParser.ATTRIBUTE_ACTION:
272
- case ODataMetadataParser.ATTRIBUTE_ENTITY_SET:
273
- case ODataMetadataParser.ATTRIBUTE_UNDERLYING_TYPE:
274
- case ODataMetadataParser.ATTRIBUTE_EXTENDS:
275
- case ODataMetadataParser.ATTRIBUTE_BASE_TERM:
276
- case ODataMetadataParser.ATTRIBUTE_APPLIES_TO:
277
- return this.getAttributeValue(attributes, field.name);
278
- case ODataMetadataParser.ATTRIBUTE_NULLABLE:
279
- case ODataMetadataParser.ATTRIBUTE_UNICODE:
280
- case ODataMetadataParser.ATTRIBUTE_OPEN_TYPE:
281
- case ODataMetadataParser.ATTRIBUTE_HAS_STREAM:
282
- case ODataMetadataParser.ATTRIBUTE_IS_BOUND:
283
- case ODataMetadataParser.ATTRIBUTE_IS_COMPOSABLE:
284
- case ODataMetadataParser.ATTRIBUTE_CONTAINS_TARGET:
285
- case ODataMetadataParser.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT:
286
- case ODataMetadataParser.ATTRIBUTE_ABSTRACT:
287
- case ODataMetadataParser.ATTRIBUTE_IS_FLAGS:
288
- return this.propertyValueToBoolean(this.getAttributeValue(attributes, field.name));
289
- case ODataMetadataParser.ATTRIBUTE_VALUE:
290
- case ODataMetadataParser.ATTRIBUTE_MAX_LENGTH:
291
- case ODataMetadataParser.ATTRIBUTE_PRECISION:
292
- case ODataMetadataParser.ATTRIBUTE_SCALE:
293
- return this.propertyValueToNumber(this.getAttributeValue(attributes, field.name));
294
- case ODataMetadataParser.ATTRIBUTE_DATE:
295
- return this.propertyValueToDate(this.getAttributeValue(attributes, field.name));
296
- default:
297
- throw new Error('Unknwon attribute:' + field.name);
298
- }
299
- }
300
- getFieldValueByTag(field, element) {
301
- switch (field.name) {
302
- case ODataMetadataParser.TAG_INCLUDE:
303
- return this.getObjects(element, field.name, [
304
- new Field(ODataMetadataParser.ATTRIBUTE_NAMESPACE, FieldType.ATTRIBUTE),
305
- new Field(ODataMetadataParser.ATTRIBUTE_ALIAS, FieldType.ATTRIBUTE),
306
- ]);
307
- case ODataMetadataParser.TAG_INCLUDE_ANNOTATIONS:
308
- return this.getObjects(element, field.name, [
309
- new Field(ODataMetadataParser.ATTRIBUTE_TERM_NAMESPACE, FieldType.ATTRIBUTE),
310
- new Field(ODataMetadataParser.ATTRIBUTE_QUALIFIER, FieldType.ATTRIBUTE),
311
- new Field(ODataMetadataParser.ATTRIBUTE_TARGET_NAMESPACE, FieldType.ATTRIBUTE),
312
- ]);
313
- case ODataMetadataParser.TAG_TERM:
314
- return this.getObjects(element, field.name, [
315
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
316
- new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
317
- new Field(ODataMetadataParser.ATTRIBUTE_BASE_TERM, FieldType.ATTRIBUTE),
318
- new Field(ODataMetadataParser.ATTRIBUTE_DEFAULT_VALUE, FieldType.ATTRIBUTE),
319
- new Field(ODataMetadataParser.ATTRIBUTE_APPLIES_TO, FieldType.ATTRIBUTE),
320
- new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
321
- new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
322
- new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
323
- new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
324
- new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
325
- new Field(ODataMetadataParser.ATTRIBUTE_STRING, FieldType.ATTRIBUTE),
326
- new Field(ODataMetadataParser.ATTRIBUTE_BOOL, FieldType.ATTRIBUTE),
327
- new Field(ODataMetadataParser.ATTRIBUTE_INT, FieldType.ATTRIBUTE),
328
- ]);
329
- case ODataMetadataParser.TAG_ANNOTATIONS:
330
- return this.getObjects(element, field.name, [
331
- new Field(ODataMetadataParser.ATTRIBUTE_TARGET, FieldType.ATTRIBUTE),
332
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
333
- new Field(ODataMetadataParser.ATTRIBUTE_QUALIFIER, FieldType.ATTRIBUTE),
334
- ]);
335
- case ODataMetadataParser.TAG_ANNOTATION:
336
- return this.getObjects(element, field.name, [
337
- new Field(ODataMetadataParser.ATTRIBUTE_TERM, FieldType.ATTRIBUTE),
338
- new Field(ODataMetadataParser.ATTRIBUTE_STRING, FieldType.ATTRIBUTE),
339
- new Field(ODataMetadataParser.ATTRIBUTE_BOOL, FieldType.ATTRIBUTE),
340
- new Field(ODataMetadataParser.ATTRIBUTE_INT, FieldType.ATTRIBUTE),
341
- new Field(ODataMetadataParser.TAG_COLLECTION, FieldType.TAG),
342
- new Field(ODataMetadataParser.TAG_RECORD, FieldType.TAG),
343
- new Field(ODataMetadataParser.TAG_ENUM_MEMBER, FieldType.TAG),
344
- ]);
345
- case ODataMetadataParser.TAG_COLLECTION:
346
- return this.getObjects(element, field.name, [
347
- new Field(ODataMetadataParser.TAG_STRING, FieldType.TAG),
348
- new Field(ODataMetadataParser.TAG_RECORD, FieldType.TAG),
349
- new Field(ODataMetadataParser.TAG_PROPERTY_PATH, FieldType.TAG),
350
- new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY_PATH, FieldType.TAG),
351
- ]);
352
- case ODataMetadataParser.TAG_RECORD:
353
- return this.getObjects(element, field.name, [
354
- new Field(ODataMetadataParser.TAG_PROPERTY_VALUE, FieldType.TAG),
355
- ]);
356
- case ODataMetadataParser.TAG_STRING:
357
- return this.getObjects(element, field.name, []);
358
- case ODataMetadataParser.TAG_ENUM_MEMBER:
359
- return this.getObjects(element, field.name, []);
360
- case ODataMetadataParser.TAG_PROPERTY_VALUE:
361
- return this.getObjects(element, field.name, [
362
- new Field(ODataMetadataParser.ATTRIBUTE_PROPERTY, FieldType.ATTRIBUTE),
363
- new Field(ODataMetadataParser.ATTRIBUTE_STRING, FieldType.ATTRIBUTE),
364
- new Field(ODataMetadataParser.ATTRIBUTE_DATE, FieldType.ATTRIBUTE),
365
- new Field(ODataMetadataParser.TAG_ENUM_MEMBER, FieldType.TAG),
366
- ]);
367
- case ODataMetadataParser.TAG_PROPERTY_PATH:
368
- return this.getObjects(element, field.name, [
369
- new Field(ODataMetadataParser.TAG_PROPERTY_VALUE, FieldType.TAG),
370
- ]);
371
- case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_PATH:
372
- return this.getObjects(element, field.name, [
373
- new Field(ODataMetadataParser.TAG_PROPERTY_VALUE, FieldType.TAG),
374
- ]);
375
- case ODataMetadataParser.TAG_ENUM_TYPE:
376
- return this.getObjects(element, field.name, [
377
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
378
- new Field(ODataMetadataParser.TAG_MEMBER, FieldType.TAG),
379
- new Field(ODataMetadataParser.ATTRIBUTE_UNDERLYING_TYPE, FieldType.ATTRIBUTE),
380
- new Field(ODataMetadataParser.ATTRIBUTE_IS_FLAGS, FieldType.ATTRIBUTE),
381
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
382
- ]);
383
- case ODataMetadataParser.TAG_COMPLEX_TYPE:
384
- return this.getObjects(element, field.name, [
385
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
386
- new Field(ODataMetadataParser.TAG_PROPERTY, FieldType.TAG),
387
- new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY, FieldType.TAG),
388
- new Field(ODataMetadataParser.ATTRIBUTE_BASE_TYPE, FieldType.ATTRIBUTE),
389
- new Field(ODataMetadataParser.ATTRIBUTE_OPEN_TYPE, FieldType.ATTRIBUTE),
390
- new Field(ODataMetadataParser.ATTRIBUTE_ABSTRACT, FieldType.ATTRIBUTE),
391
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
392
- ]);
393
- case ODataMetadataParser.TAG_ENTITY_TYPE:
394
- return this.getObjects(element, field.name, [
395
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
396
- new Field(ODataMetadataParser.TAG_KEY, FieldType.TAG),
397
- new Field(ODataMetadataParser.TAG_PROPERTY, FieldType.TAG),
398
- new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY, FieldType.TAG),
399
- new Field(ODataMetadataParser.ATTRIBUTE_BASE_TYPE, FieldType.ATTRIBUTE),
400
- new Field(ODataMetadataParser.ATTRIBUTE_OPEN_TYPE, FieldType.ATTRIBUTE),
401
- new Field(ODataMetadataParser.ATTRIBUTE_ABSTRACT, FieldType.ATTRIBUTE),
402
- new Field(ODataMetadataParser.ATTRIBUTE_HAS_STREAM, FieldType.ATTRIBUTE),
403
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
404
- ]);
405
- case ODataMetadataParser.TAG_FUNCTION:
406
- return this.getObjects(element, field.name, [
407
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
408
- new Field(ODataMetadataParser.TAG_RETURN_TYPE, FieldType.TAG),
409
- new Field(ODataMetadataParser.ATTRIBUTE_IS_BOUND, FieldType.ATTRIBUTE),
410
- new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET_PATH, FieldType.ATTRIBUTE),
411
- new Field(ODataMetadataParser.ATTRIBUTE_IS_COMPOSABLE, FieldType.ATTRIBUTE),
412
- new Field(ODataMetadataParser.TAG_PARAMETER, FieldType.TAG),
413
- ]);
414
- case ODataMetadataParser.TAG_MEMBER:
415
- return this.getObjects(element, field.name, [
416
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
417
- new Field(ODataMetadataParser.ATTRIBUTE_VALUE, FieldType.ATTRIBUTE),
418
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
419
- ]);
420
- case ODataMetadataParser.TAG_PROPERTY:
421
- return this.getObjects(element, field.name, [
422
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
423
- new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
424
- new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
425
- new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
426
- new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
427
- new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
428
- new Field(ODataMetadataParser.ATTRIBUTE_UNICODE, FieldType.ATTRIBUTE),
429
- new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
430
- new Field(ODataMetadataParser.ATTRIBUTE_DEFAULT_VALUE, FieldType.ATTRIBUTE),
431
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
432
- ]);
433
- case ODataMetadataParser.TAG_KEY:
434
- return this.getObject(element, field.name, [
435
- new Field(ODataMetadataParser.TAG_PROPERTY_REF, FieldType.TAG),
436
- ]);
437
- case ODataMetadataParser.TAG_PROPERTY_REF:
438
- return this.getObjects(element, field.name, [
439
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
440
- new Field(ODataMetadataParser.ATTRIBUTE_ALIAS, FieldType.ATTRIBUTE),
441
- ]);
442
- case ODataMetadataParser.TAG_NAVIGATION_PROPERTY:
443
- return this.getObjects(element, field.name, [
444
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
445
- new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
446
- new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
447
- new Field(ODataMetadataParser.ATTRIBUTE_PARTNER, FieldType.ATTRIBUTE),
448
- new Field(ODataMetadataParser.ATTRIBUTE_CONTAINS_TARGET, FieldType.ATTRIBUTE),
449
- new Field(ODataMetadataParser.TAG_REFERENTIAL_CONSTRAINT, FieldType.TAG),
450
- new Field(ODataMetadataParser.TAG_ON_DELETE, FieldType.TAG),
451
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
452
- ]);
453
- case ODataMetadataParser.TAG_REFERENTIAL_CONSTRAINT:
454
- return this.getObjects(element, field.name, [
455
- new Field(ODataMetadataParser.ATTRIBUTE_PROPERTY, FieldType.ATTRIBUTE),
456
- new Field(ODataMetadataParser.ATTRIBUTE_REFERENCED_PROPERTY, FieldType.ATTRIBUTE),
457
- ]);
458
- case ODataMetadataParser.TAG_ON_DELETE:
459
- return this.getObject(element, field.name, [
460
- new Field(ODataMetadataParser.ATTRIBUTE_ACTION, FieldType.ATTRIBUTE),
461
- ]);
462
- case ODataMetadataParser.TAG_PARAMETER:
463
- return this.getObjects(element, field.name, [
464
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
465
- new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
466
- new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
467
- new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
468
- new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
469
- new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
470
- new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
471
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
472
- ]);
473
- case ODataMetadataParser.TAG_RETURN_TYPE:
474
- return this.getObject(element, field.name, [
475
- new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
476
- new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
477
- new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
478
- new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
479
- new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
480
- new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
481
- ]);
482
- case ODataMetadataParser.TAG_ACTION:
483
- return this.getObjects(element, field.name, [
484
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
485
- new Field(ODataMetadataParser.TAG_RETURN_TYPE, FieldType.TAG),
486
- new Field(ODataMetadataParser.ATTRIBUTE_IS_BOUND, FieldType.ATTRIBUTE),
487
- new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET_PATH, FieldType.ATTRIBUTE),
488
- new Field(ODataMetadataParser.TAG_PARAMETER, FieldType.TAG),
489
- ]);
490
- case ODataMetadataParser.TAG_ENTITY_CONTAINER:
491
- return this.getObjects(element, field.name, [
492
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
493
- new Field(ODataMetadataParser.ATTRIBUTE_EXTENDS, FieldType.ATTRIBUTE),
494
- new Field(ODataMetadataParser.TAG_ENTITY_SET, FieldType.TAG),
495
- new Field(ODataMetadataParser.TAG_SINGLETON, FieldType.TAG),
496
- new Field(ODataMetadataParser.TAG_FUNCTION_IMPORT, FieldType.TAG),
497
- new Field(ODataMetadataParser.TAG_ACTION_IMPORT, FieldType.TAG),
498
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
499
- ]);
500
- case ODataMetadataParser.TAG_ENTITY_SET:
501
- return this.getObjects(element, field.name, [
502
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
503
- new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_TYPE, FieldType.ATTRIBUTE),
504
- new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING, FieldType.TAG),
505
- new Field(ODataMetadataParser.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT, FieldType.ATTRIBUTE),
506
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
507
- ]);
508
- case ODataMetadataParser.TAG_SINGLETON:
509
- return this.getObjects(element, field.name, [
510
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
511
- new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
512
- new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING, FieldType.TAG),
513
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
514
- ]);
515
- case ODataMetadataParser.TAG_FUNCTION_IMPORT:
516
- return this.getObjects(element, field.name, [
517
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
518
- new Field(ODataMetadataParser.ATTRIBUTE_FUNCTION, FieldType.ATTRIBUTE),
519
- new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET, FieldType.ATTRIBUTE),
520
- new Field(ODataMetadataParser.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT, FieldType.ATTRIBUTE),
521
- ]);
522
- case ODataMetadataParser.TAG_ACTION_IMPORT:
523
- return this.getObjects(element, field.name, [
524
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
525
- new Field(ODataMetadataParser.ATTRIBUTE_ACTION, FieldType.ATTRIBUTE),
526
- new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET, FieldType.ATTRIBUTE),
527
- ]);
528
- case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING:
529
- return this.getObjects(element, field.name, [
530
- new Field(ODataMetadataParser.ATTRIBUTE_PATH, FieldType.ATTRIBUTE),
531
- new Field(ODataMetadataParser.ATTRIBUTE_TARGET, FieldType.ATTRIBUTE),
532
- ]);
533
- case ODataMetadataParser.TAG_TYPE_DEFINITION:
534
- return this.getObjects(element, field.name, [
535
- new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
536
- new Field(ODataMetadataParser.ATTRIBUTE_UNDERLYING_TYPE, FieldType.ATTRIBUTE),
537
- new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
538
- new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
539
- new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
540
- new Field(ODataMetadataParser.ATTRIBUTE_UNICODE, FieldType.ATTRIBUTE),
541
- new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
542
- new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
543
- ]);
544
- default:
545
- throw new Error('Unknwon tag:' + field.name);
546
- }
547
- }
548
- getAttributeValue(attributes, attributeName) {
549
- const attribute = attributes.getNamedItem(attributeName);
550
- return attribute !== null && attribute.nodeValue
551
- ? attribute.nodeValue
552
- : undefined;
553
- }
554
- propertyValueToNumber(attributeValue) {
555
- return attributeValue !== undefined ? Number(attributeValue) : undefined;
556
- }
557
- propertyValueToBoolean(attributeValue) {
558
- return attributeValue !== undefined ? attributeValue === 'true' : false;
559
- }
560
- propertyValueToDate(attributeValue) {
561
- return attributeValue !== undefined ? new Date(attributeValue) : undefined;
562
- }
563
- }
564
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL21ldGFkYXRhL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0MsSUFBSyxTQUdKO0FBSEQsV0FBSyxTQUFTO0lBQ1osbURBQVMsQ0FBQTtJQUNULHVDQUFHLENBQUE7QUFDTCxDQUFDLEVBSEksU0FBUyxLQUFULFNBQVMsUUFHYjtBQUVELE1BQU0sS0FBSztJQUVBO0lBQ0E7SUFGVCxZQUNTLElBQVksRUFDWixTQUFvQjtRQURwQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osY0FBUyxHQUFULFNBQVMsQ0FBVztJQUMxQixDQUFDO0NBQ0w7QUFFRCxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLE9BQU87SUFDQyxNQUFNLENBQVUsUUFBUSxHQUFHLFdBQVcsQ0FBQztJQUN2QyxNQUFNLENBQVUsaUJBQWlCLEdBQUcsbUJBQW1CLENBQUM7SUFDeEQsTUFBTSxDQUFVLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztJQUNqRCxNQUFNLENBQVUsV0FBVyxHQUFHLGNBQWMsQ0FBQztJQUM3QyxNQUFNLENBQVUsdUJBQXVCLEdBQUcseUJBQXlCLENBQUM7SUFDcEUsTUFBTSxDQUFVLFFBQVEsR0FBRyxNQUFNLENBQUM7SUFDbEMsTUFBTSxDQUFVLGVBQWUsR0FBRyxhQUFhLENBQUM7SUFDaEQsTUFBTSxDQUFVLGNBQWMsR0FBRyxZQUFZLENBQUM7SUFDOUMsTUFBTSxDQUFVLFVBQVUsR0FBRyxRQUFRLENBQUM7SUFDdEMsTUFBTSxDQUFVLGFBQWEsR0FBRyxVQUFVLENBQUM7SUFDM0MsTUFBTSxDQUFVLFVBQVUsR0FBRyxRQUFRLENBQUM7SUFDdEMsTUFBTSxDQUFV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O1lBQ0w7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRVMsaUJBQWlCLENBQUMsVUFBd0IsRUFBRSxhQUFxQjtRQUN6RSxNQUFNLFNBQVMsR0FBZ0IsVUFBVSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0RSxPQUFPLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLFNBQVM7WUFDOUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTO1lBQ3JCLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztJQUVTLHFCQUFxQixDQUFDLGNBQXVCO1FBQ3JELE9BQU8sY0FBYyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDM0UsQ0FBQztJQUVTLHNCQUFzQixDQUFDLGNBQXVCO1FBQ3RELE9BQU8sY0FBYyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzFFLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxjQUF1QjtRQUNuRCxPQUFPLGNBQWMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDN0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENzZGxSZWZlcmVuY2UgfSBmcm9tICcuL2NzZGwvY3NkbC1yZWZlcmVuY2UnO1xuXG5pbXBvcnQgeyBDc2RsU2NoZW1hIH0gZnJvbSAnLi9jc2RsL2NzZGwtc2NoZW1hJztcbmltcG9ydCB7IFZFUlNJT05fNF8wIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhTWV0YWRhdGEgfSBmcm9tICcuL21ldGFkYXRhJztcblxuZW51bSBGaWVsZFR5cGUge1xuICBBVFRSSUJVVEUsXG4gIFRBRyxcbn1cblxuY2xhc3MgRmllbGQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyBmaWVsZFR5cGU6IEZpZWxkVHlwZSxcbiAgKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFNZXRhZGF0YVBhcnNlciB7XG4gIC8vIFRBR1NcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0VETVggPSAnZWRteDpFZG14JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0RBVEFfU0VSVklDRVMgPSAnZWRteDpEYXRhU2VydmljZXMnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfUkVGRVJFTkNFID0gJ2VkbXg6UmVmZXJlbmNlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0lOQ0xVREUgPSAnZWRteDpJbmNsdWRlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0lOQ0xVREVfQU5OT1RBVElPTlMgPSAnZWRteDpJbmNsdWRlQW5ub3RhdGlvbnMnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfVEVSTSA9ICdUZXJtJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0FOTk9UQVRJT05TID0gJ0Fubm90YXRpb25zJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0FOTk9UQVRJT04gPSAnQW5ub3RhdGlvbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19TQ0hFTUEgPSAnU2NoZW1hJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0VOVU1fVFlQRSA9ICdFbnVtVHlwZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19NRU1CRVIgPSAnTWVtYmVyJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0NPTVBMRVhfVFlQRSA9ICdDb21wbGV4VHlwZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19FTlRJVFlfVFlQRSA9ICdFbnRpdHlUeXBlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1BST1BFUlRZID0gJ1Byb3BlcnR5JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0tFWSA9ICdLZXknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfUFJPUEVSVFlfUkVGID0gJ1Byb3BlcnR5UmVmJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX05BVklHQVRJT05fUFJPUEVSVFkgPSAnTmF2aWdhdGlvblByb3BlcnR5JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1JFRkVSRU5USUFMX0NPTlNUUkFJTlQgPSAnUmVmZXJlbnRpYWxDb25zdHJhaW50JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX09OX0RFTEVURSA9ICdPbkRlbGV0ZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19GVU5DVElPTiA9ICdGdW5jdGlvbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19SRVRVUk5fVFlQRSA9ICdSZXR1cm5UeXBlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1BBUkFNRVRFUiA9ICdQYXJhbWV0ZXInO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfQUNUSU9OID0gJ0FjdGlvbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19FTlRJVFlfQ09OVEFJTkVSID0gJ0VudGl0eUNvbnRhaW5lcic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19FTlRJVFlfU0VUID0gJ0VudGl0eVNldCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19TSU5HTEVUT04gPSAnU2luZ2xldG9uJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0NPTExFQ1RJT04gPSAnQ29sbGVjdGlvbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19SRUNPUkQgPSAnUmVjb3JkJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1NUUklORyA9ICdTdHJpbmcnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfRU5VTV9NRU1CRVIgPSAnRW51bU1lbWJlcic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19QUk9QRVJUWV9WQUxVRSA9ICdQcm9wZXJ0eVZhbHVlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1BST1BFUlRZX1BBVEggPSAnUHJvcGVydHlQYXRoJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX05BVklHQVRJT05fUFJPUEVSVFlfUEFUSCA9XG4gICAgJ05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfRlVOQ1RJT05fSU1QT1JUID0gJ0Z1bmN0aW9uSW1wb3J0JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0FDVElPTl9JTVBPUlQgPSAnQWN0aW9uSW1wb3J0JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX05BVklHQVRJT05fUFJPUEVSVFlfQklORElORyA9XG4gICAgJ05hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfVFlQRV9ERUZJTklUSU9OID0gJ1R5cGVEZWZpbml0aW9uJztcblxuICAvLyBBVFRSSUJVVEVTXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9WRVJTSU9OID0gJ1ZlcnNpb24nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfVVJJID0gJ1VyaSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9BTElBUyA9ICdBbGlhcyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9OQU1FU1BBQ0UgPSAnTmFtZXNwYWNlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1RFUk1fTkFNRVNQQUNFID0gJ1Rlcm1OYW1lc3BhY2UnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfUVVBTElGSUVSID0gJ1F1YWxpZmllcic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9TVFJJTkcgPSAnU3RyaW5nJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0RBVEUgPSAnRGF0ZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9CT09MID0gJ0Jvb2wnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfSU5UID0gJ0ludCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9UQVJHRVRfTkFNRVNQQUNFID0gJ1RhcmdldE5hbWVzcGFjZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9URVJNID0gJ1Rlcm0nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfTkFNRSA9ICdOYW1lJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1ZBTFVFID0gJ1ZhbHVlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0JBU0VfVFlQRSA9ICdCYXNlVHlwZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9PUEVOX1RZUEUgPSAnT3BlblR5cGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfVFlQRSA9ICdUeXBlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX05VTExBQkxFID0gJ051bGxhYmxlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX01BWF9MRU5HVEggPSAnTWF4TGVuZ3RoJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1BSRUNJU0lPTiA9ICdQcmVjaXNpb24nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfU0NBTEUgPSAnU2NhbGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfVU5JQ09ERSA9ICdVbmljb2RlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1NSSUQgPSAnU1JJRCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9ERUZBVUxUX1ZBTFVFID0gJ0RlZmF1bHRWYWx1ZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9QQVJUTkVSID0gJ1BhcnRuZXInO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfUFJPUEVSVFkgPSAnUHJvcGVydHknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfUkVGRVJFTkNFRF9QUk9QRVJUWSA9ICdSZWZlcmVuY2VkUHJvcGVydHknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfSEFTX1NUUkVBTSA9ICdIYXNTdHJlYW0nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfQ09OVEFJTlNfVEFSR0VUID0gJ0NvbnRhaW5zVGFyZ2V0JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0lTX0JPVU5EID0gJ0lzQm91bmQnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfRU5USVRZX1NFVF9QQVRIID0gJ0VudGl0eVNldFBhdGgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfSVNfQ09NUE9TQUJMRSA9ICdJc0NvbXBvc2FibGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfRU5USVRZX1RZUEUgPSAnRW50aXR5VHlwZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9QQVRIID0gJ1BhdGgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfVEFSR0VUID0gJ1RhcmdldCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9GVU5DVElPTiA9ICdGdW5jdGlvbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9BQ1RJT04gPSAnQWN0aW9uJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0VOVElUWV9TRVQgPSAnRW50aXR5U2V0JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0lOQ0xVREVfSU5fU0VSVklDRV9ET0NVTUVOVCA9XG4gICAgJ0luY2x1ZGVJblNlcnZpY2VEb2N1bWVudCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9BQlNUUkFDVCA9ICdBYnN0cmFjdCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9VTkRFUkxZSU5HX1RZUEUgPSAnVW5kZXJseWluZ1R5cGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfSVNfRkxBR1MgPSAnSXNGbGFncyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9FWFRFTkRTID0gJ0V4dGVuZHMnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfQkFTRV9URVJNID0gJ0Jhc2VUZXJtJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0FQUExJRVNfVE8gPSAnQXBwbGllc1RvJztcblxuICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnQ6IERvY3VtZW50O1xuXG4gIGNvbnN0cnVjdG9yKHhtbDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlcjogRE9NUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgdGhpcy5kb2N1bWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoeG1sLCAndGV4dC94bWwnKTtcblxuICAgICAgdGhpcy5jaGVja1ZlcnNpb24oZG9jdW1lbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBtZXRhZGF0YSwgJyArIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBtZXRhZGF0YSgpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5nZXRGaWVsZFZhbHVlQnlBdHRyaWJ1dGUoXG4gICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVkVSU0lPTiwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hdHRyaWJ1dGVzLFxuICAgICk7XG5cbiAgICBjb25zdCByZWZlcmVuY2VzID0gdGhpcy5nZXRPYmplY3RzKFxuICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19SRUZFUkVOQ0UsXG4gICAgICBbXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9VUkksIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfSU5DTFVERSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19JTkNMVURFX0FOTk9UQVRJT05TLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgXSxcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YVNlcnZpY2VzOiBFbGVtZW50ID1cbiAgICAgIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19EQVRBX1NFUlZJQ0VTLFxuICAgICAgKVswXTtcbiAgICBjb25zdCBzY2hlbWFzID0gdGhpcy5nZXRPYmplY3RzKFxuICAgICAgZGF0YVNlcnZpY2VzLFxuICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfU0NIRU1BLFxuICAgICAgW1xuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRVNQQUNFLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FMSUFTLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVU1fVFlQRSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19DT01QTEVYX1RZUEUsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5USVRZX1RZUEUsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRlVOQ1RJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQUNUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVElUWV9DT05UQUlORVIsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfVFlQRV9ERUZJTklUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1RFUk0sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTlMsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgXSxcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBPRGF0YU1ldGFkYXRhKHZlcnNpb24sIHJlZmVyZW5jZXMsIHNjaGVtYXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrVmVyc2lvbihkb2N1bWVudDogRG9jdW1lbnQpIHtcbiAgICAvLyBjaGVjayB2ZXJzaW9uXG4gICAgY29uc3QgYXR0cmlidXRlczogTmFtZWROb2RlTWFwID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgaWYgKCFhdHRyaWJ1dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09EYXRhIHZlcnNpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgbWV0YWRhdGEnKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cjogQXR0ciB8IG51bGwgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnVmVyc2lvbicpO1xuICAgIGlmIChhdHRyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09EYXRhIHZlcnNpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgbWV0YWRhdGEnKTtcbiAgICB9XG4gICAgY29uc3Qgb2RhdGFWZXJzaW9uID0gYXR0cj8ubm9kZVZhbHVlO1xuICAgIGlmIChvZGF0YVZlcnNpb24gIT09IFZFUlNJT05fNF8wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09EYXRhIHZlcnNpb24gXCInICsgb2RhdGFWZXJzaW9uICsgJ1wiIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0T2JqZWN0cyhcbiAgICBwYXJlbnRFbGVtZW50OiBFbGVtZW50LFxuICAgIHRhZzogc3RyaW5nLFxuICAgIGZpZWxkTmFtZXM6IEZpZWxkW10sXG4gICk6IGFueVtdIHtcbiAgICBsZXQgb2JqZWN0czogYW55W10gPSBbXTtcblxuICAgIGNvbnN0IGNoaWxkcmVuOiBIVE1MQ29sbGVjdGlvbiA9IHBhcmVudEVsZW1lbnQuY2hpbGRyZW47XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGNoaWxkcmVuLml0ZW0oaW5kZXgpO1xuXG4gICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlTmFtZSAhPT0gdGFnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzOiBOYW1lZE5vZGVNYXAgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgICBjb25zdCBmaWVsZFZhbHVlczogYW55ID0gdGhpcy5nZXRGaWVsZFZhbHVlcyhcbiAgICAgICAgZmllbGROYW1lcyxcbiAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICk7XG4gICAgICBmaWVsZFZhbHVlc1snVGV4dENvbnRlbnQnXSA9IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFRkVSRU5DRTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19JTkNMVURFOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0lOQ0xVREVfQU5OT1RBVElPTlM6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfVEVSTTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OUzpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19DT0xMRUNUSU9OOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFQ09SRDpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19TVFJJTkc6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5VTV9NRU1CRVI6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFlfVkFMVUU6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFlfUEFUSDpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19OQVZJR0FUSU9OX1BST1BFUlRZX1BBVEg6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTjpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19TQ0hFTUE6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5VTV9UWVBFOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0NPTVBMRVhfVFlQRTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlRJVFlfVFlQRTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19GVU5DVElPTjpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19NRU1CRVI6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFk6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFlfUkVGOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFk6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUkVGRVJFTlRJQUxfQ09OU1RSQUlOVDpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QQVJBTUVURVI6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQUNUSU9OOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVElUWV9TRVQ6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfU0lOR0xFVE9OOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0ZVTkNUSU9OX0lNUE9SVDpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BQ1RJT05fSU1QT1JUOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFlfQklORElORzpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19UWVBFX0RFRklOSVRJT046XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5USVRZX0NPTlRBSU5FUjpcbiAgICAgICAgICBvYmplY3RzLnB1c2goZmllbGRWYWx1ZXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbndvbiB0YWc6JyArIHRhZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0T2JqZWN0KFxuICAgIHBhcmVudEVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZmllbGROYW1lczogRmllbGRbXSxcbiAgKTogYW55IHtcbiAgICBsZXQgb2JqZWN0OiBhbnk7XG5cbiAgICBjb25zdCBjaGlsZHJlbjogSFRNTENvbGxlY3Rpb24gPSBwYXJlbnRFbGVtZW50LmNoaWxkcmVuO1xuICAgIGxldCBlbGVtZW50OiBFbGVtZW50IHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4uaXRlbShpbmRleCk/Lm5vZGVOYW1lID09PSB0YWcpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBvbmUgJyArIHRhZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudCA9IGNoaWxkcmVuLml0ZW0oaW5kZXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50ICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgYXR0cmlidXRlczogTmFtZWROb2RlTWFwID0gZWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgICAgY29uc3QgZmllbGRWYWx1ZXM6IGFueSA9IHRoaXMuZ2V0RmllbGRWYWx1ZXMoXG4gICAgICAgIGZpZWxkTmFtZXMsXG4gICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICApO1xuICAgICAgZmllbGRWYWx1ZXNbJ1RleHRDb250ZW50J10gPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19LRVk6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUkVUVVJOX1RZUEU6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfT05fREVMRVRFOlxuICAgICAgICAgIHJldHVybiBmaWVsZFZhbHVlcztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua253b24gdGFnOicgKyB0YWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RmllbGRWYWx1ZXMoXG4gICAgZmllbGRzOiBGaWVsZFtdLFxuICAgIGF0dHJpYnV0ZXM6IE5hbWVkTm9kZU1hcCxcbiAgICBlbGVtZW50OiBFbGVtZW50LFxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgZmllbGRWYWx1ZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmZpZWxkVHlwZSA9PT0gRmllbGRUeXBlLlRBRykge1xuICAgICAgICBmaWVsZFZhbHVlc1tmaWVsZC5uYW1lXSA9IHRoaXMuZ2V0RmllbGRWYWx1ZUJ5VGFnKGZpZWxkLCBlbGVtZW50KTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQuZmllbGRUeXBlID09PSBGaWVsZFR5cGUuQVRUUklCVVRFKSB7XG4gICAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkLm5hbWVdID0gdGhpcy5nZXRGaWVsZFZhbHVlQnlBdHRyaWJ1dGUoXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBmaWVsZCB0eXBlOiAnICsgZmllbGQuZmllbGRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGRWYWx1ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RmllbGRWYWx1ZUJ5QXR0cmlidXRlKFxuICAgIGZpZWxkOiBGaWVsZCxcbiAgICBhdHRyaWJ1dGVzOiBOYW1lZE5vZGVNYXAsXG4gICk6IGFueSB7XG4gICAgc3dpdGNoIChmaWVsZC5uYW1lKSB7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1ZFUlNJT046XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1VSSTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRVNQQUNFOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9BTElBUzpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVEVSTV9OQU1FU1BBQ0U6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RFUk06XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1FVQUxJRklFUjpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfU1RSSU5HOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9CT09MOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JTlQ6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RBUkdFVF9OQU1FU1BBQ0U6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUU6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RZUEU6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NSSUQ6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0RFRkFVTFRfVkFMVUU6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1BBUlRORVI6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1BST1BFUlRZOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9SRUZFUkVOQ0VEX1BST1BFUlRZOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9CQVNFX1RZUEU6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0VOVElUWV9TRVRfUEFUSDpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfRU5USVRZX1RZUEU6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1BBVEg6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RBUkdFVDpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfRlVOQ1RJT046XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FDVElPTjpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfRU5USVRZX1NFVDpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVU5ERVJMWUlOR19UWVBFOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9FWFRFTkRTOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9CQVNFX1RFUk06XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FQUExJRVNfVE86XG4gICAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZXMsIGZpZWxkLm5hbWUpO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OVUxMQUJMRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVU5JQ09ERTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfT1BFTl9UWVBFOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9IQVNfU1RSRUFNOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JU19CT1VORDpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfSVNfQ09NUE9TQUJMRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQ09OVEFJTlNfVEFSR0VUOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JTkNMVURFX0lOX1NFUlZJQ0VfRE9DVU1FTlQ6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FCU1RSQUNUOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JU19GTEFHUzpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlWYWx1ZVRvQm9vbGVhbihcbiAgICAgICAgICB0aGlzLmdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZXMsIGZpZWxkLm5hbWUpLFxuICAgICAgICApO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9WQUxVRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTUFYX0xFTkdUSDpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUFJFQ0lTSU9OOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TQ0FMRTpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlWYWx1ZVRvTnVtYmVyKFxuICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywgZmllbGQubmFtZSksXG4gICAgICAgICk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0RBVEU6XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5VmFsdWVUb0RhdGUoXG4gICAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVzLCBmaWVsZC5uYW1lKSxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbndvbiBhdHRyaWJ1dGU6JyArIGZpZWxkLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRGaWVsZFZhbHVlQnlUYWcoZmllbGQ6IEZpZWxkLCBlbGVtZW50OiBFbGVtZW50KTogYW55W10ge1xuICAgIHN3aXRjaCAoZmllbGQubmFtZSkge1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19JTkNMVURFOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FU1BBQ0UsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FMSUFTLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0lOQ0xVREVfQU5OT1RBVElPTlM6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RFUk1fTkFNRVNQQUNFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1FVQUxJRklFUixcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9UQVJHRVRfTkFNRVNQQUNFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfVEVSTTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9UWVBFLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9CQVNFX1RFUk0sXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfREVGQVVMVF9WQUxVRSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9BUFBMSUVTX1RPLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05VTExBQkxFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX01BWF9MRU5HVEgsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUFJFQ0lTSU9OLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TQ0FMRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NSSUQsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TVFJJTkcsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9CT09MLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfSU5ULCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT05TOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVEFSR0VULCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUVVBTElGSUVSLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RFUk0sIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TVFJJTkcsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9CT09MLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfSU5ULCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQ09MTEVDVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFQ09SRCwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVU1fTUVNQkVSLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0NPTExFQ1RJT046XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19TVFJJTkcsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19SRUNPUkQsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWV9QQVRILCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19OQVZJR0FUSU9OX1BST1BFUlRZX1BBVEgsXG4gICAgICAgICAgICBGaWVsZFR5cGUuVEFHLFxuICAgICAgICAgICksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19SRUNPUkQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWV9WQUxVRSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19TVFJJTkc6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW10pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlVNX01FTUJFUjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZX1ZBTFVFOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9QUk9QRVJUWSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfU1RSSU5HLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfREFURSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVU1fTUVNQkVSLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZX1BBVEg6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWV9WQUxVRSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19OQVZJR0FUSU9OX1BST1BFUlRZX1BBVEg6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWV9WQUxVRSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlVNX1RZUEU6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfTUVNQkVSLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9VTkRFUkxZSU5HX1RZUEUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfSVNfRkxBR1MsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQ09NUExFWF9UWVBFOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfTkFWSUdBVElPTl9QUk9QRVJUWSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQkFTRV9UWVBFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX09QRU5fVFlQRSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9BQlNUUkFDVCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlRJVFlfVFlQRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19LRVksIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFksIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0JBU0VfVFlQRSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9PUEVOX1RZUEUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQUJTVFJBQ1QsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfSEFTX1NUUkVBTSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19GVU5DVElPTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19SRVRVUk5fVFlQRSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfSVNfQk9VTkQsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfRU5USVRZX1NFVF9QQVRILFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0lTX0NPTVBPU0FCTEUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BBUkFNRVRFUiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19NRU1CRVI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVkFMVUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RZUEUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05VTExBQkxFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX01BWF9MRU5HVEgsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUFJFQ0lTSU9OLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TQ0FMRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1VOSUNPREUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TUklELCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9ERUZBVUxUX1ZBTFVFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0tFWTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0KGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFlfUkVGLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZX1JFRjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9BTElBUywgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19OQVZJR0FUSU9OX1BST1BFUlRZOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RZUEUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05VTExBQkxFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9QQVJUTkVSLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9DT05UQUlOU19UQVJHRVQsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUkVGRVJFTlRJQUxfQ09OU1RSQUlOVCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5UQUcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfT05fREVMRVRFLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19SRUZFUkVOVElBTF9DT05TVFJBSU5UOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9QUk9QRVJUWSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9SRUZFUkVOQ0VEX1BST1BFUlRZLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfT05fREVMRVRFOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9BQ1RJT04sIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUEFSQU1FVEVSOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RZUEUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05VTExBQkxFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX01BWF9MRU5HVEgsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUFJFQ0lTSU9OLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TQ0FMRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NSSUQsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFVFVSTl9UWVBFOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9UWVBFLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OVUxMQUJMRSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9NQVhfTEVOR1RILFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1BSRUNJU0lPTixcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfU0NBTEUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TUklELCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FDVElPTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19SRVRVUk5fVFlQRSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfSVNfQk9VTkQsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfRU5USVRZX1NFVF9QQVRILFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QQVJBTUVURVIsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5USVRZX0NPTlRBSU5FUjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9FWFRFTkRTLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5USVRZX1NFVCwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1NJTkdMRVRPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0ZVTkNUSU9OX0lNUE9SVCwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FDVElPTl9JTVBPUlQsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVElUWV9TRVQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9FTlRJVFlfVFlQRSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19OQVZJR0FUSU9OX1BST1BFUlRZX0JJTkRJTkcsXG4gICAgICAgICAgICBGaWVsZFR5cGUuVEFHLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfSU5DTFVERV9JTl9TRVJWSUNFX0RPQ1VNRU5ULFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1NJTkdMRVRPTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9UWVBFLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19OQVZJR0FUSU9OX1BST1BFUlRZX0JJTkRJTkcsXG4gICAgICAgICAgICBGaWVsZFR5cGUuVEFHLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRlVOQ1RJT05fSU1QT1JUOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfRlVOQ1RJT04sXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfRU5USVRZX1NFVCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JTkNMVURFX0lOX1NFUlZJQ0VfRE9DVU1FTlQsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BQ1RJT05fSU1QT1JUOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FDVElPTiwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfRU5USVRZX1NFVCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFlfQklORElORzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1BBVEgsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9UQVJHRVQsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfVFlQRV9ERUZJTklUSU9OOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVU5ERVJMWUlOR19UWVBFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX01BWF9MRU5HVEgsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUFJFQ0lTSU9OLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TQ0FMRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1VOSUNPREUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TUklELCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtud29uIHRhZzonICsgZmllbGQubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZXM6IE5hbWVkTm9kZU1hcCwgYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYXR0cmlidXRlOiBBdHRyIHwgbnVsbCA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpO1xuICAgIHJldHVybiBhdHRyaWJ1dGUgIT09IG51bGwgJiYgYXR0cmlidXRlLm5vZGVWYWx1ZVxuICAgICAgPyBhdHRyaWJ1dGUubm9kZVZhbHVlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlVG9OdW1iZXIoYXR0cmlidXRlVmFsdWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWUgIT09IHVuZGVmaW5lZCA/IE51bWJlcihhdHRyaWJ1dGVWYWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZVRvQm9vbGVhbihhdHRyaWJ1dGVWYWx1ZT86IHN0cmluZykge1xuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZSAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlVmFsdWUgPT09ICd0cnVlJyA6IGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb3BlcnR5VmFsdWVUb0RhdGUoYXR0cmlidXRlVmFsdWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWUgIT09IHVuZGVmaW5lZCA/IG5ldyBEYXRlKGF0dHJpYnV0ZVZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19