angular-odata 0.92.0 → 0.95.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 (196) hide show
  1. package/{esm2015/angular-odata.js → esm2020/angular-odata.mjs} +0 -0
  2. package/esm2020/lib/api.mjs +303 -0
  3. package/{esm2015/lib/cache/cache.js → esm2020/lib/cache/cache.mjs} +3 -3
  4. package/{esm2015/lib/cache/index.js → esm2020/lib/cache/index.mjs} +0 -0
  5. package/{esm2015/lib/cache/memory.js → esm2020/lib/cache/memory.mjs} +1 -1
  6. package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +2 -2
  7. package/esm2020/lib/client.mjs +271 -0
  8. package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +3 -1
  9. package/esm2020/lib/helper.mjs +268 -0
  10. package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
  11. package/esm2020/lib/models/collection.mjs +741 -0
  12. package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
  13. package/esm2020/lib/models/model.mjs +453 -0
  14. package/esm2020/lib/models/options.mjs +945 -0
  15. package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +7 -7
  16. package/esm2020/lib/options.mjs +32 -0
  17. package/{esm2015/lib/resources/index.js → esm2020/lib/resources/index.mjs} +0 -0
  18. package/{esm2015/lib/resources/path/handlers.js → esm2020/lib/resources/path/handlers.mjs} +1 -1
  19. package/{esm2015/lib/resources/path/index.js → esm2020/lib/resources/path/index.mjs} +0 -0
  20. package/esm2020/lib/resources/path/segments.mjs +124 -0
  21. package/esm2020/lib/resources/query/builder.mjs +590 -0
  22. package/esm2020/lib/resources/query/expressions.mjs +207 -0
  23. package/esm2020/lib/resources/query/handlers.mjs +186 -0
  24. package/{esm2015/lib/resources/query/index.js → esm2020/lib/resources/query/index.mjs} +0 -0
  25. package/esm2020/lib/resources/query/options.mjs +103 -0
  26. package/esm2020/lib/resources/query/syntax.mjs +406 -0
  27. package/esm2020/lib/resources/request.mjs +167 -0
  28. package/esm2020/lib/resources/resource.mjs +326 -0
  29. package/esm2020/lib/resources/responses/annotations.mjs +119 -0
  30. package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
  31. package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
  32. package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
  33. package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
  34. package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
  35. package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
  36. package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
  37. package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
  38. package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
  39. package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
  40. package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
  41. package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
  42. package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
  43. package/esm2020/lib/resources/responses/metadata.mjs +547 -0
  44. package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +0 -0
  45. package/{esm2015/lib/resources/responses/response.js → esm2020/lib/resources/responses/response.mjs} +0 -0
  46. package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +0 -0
  47. package/esm2020/lib/resources/types/action.mjs +101 -0
  48. package/esm2020/lib/resources/types/batch.mjs +288 -0
  49. package/esm2020/lib/resources/types/count.mjs +27 -0
  50. package/esm2020/lib/resources/types/entity-set.mjs +94 -0
  51. package/esm2020/lib/resources/types/entity.mjs +106 -0
  52. package/esm2020/lib/resources/types/function.mjs +137 -0
  53. package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
  54. package/esm2020/lib/resources/types/media.mjs +41 -0
  55. package/esm2020/lib/resources/types/metadata.mjs +30 -0
  56. package/esm2020/lib/resources/types/navigation-property.mjs +226 -0
  57. package/esm2020/lib/resources/types/options.mjs +2 -0
  58. package/esm2020/lib/resources/types/property.mjs +183 -0
  59. package/esm2020/lib/resources/types/reference.mjs +85 -0
  60. package/esm2020/lib/resources/types/singleton.mjs +126 -0
  61. package/esm2020/lib/resources/types/value.mjs +41 -0
  62. package/esm2020/lib/schema/annotation.mjs +37 -0
  63. package/esm2020/lib/schema/callable.mjs +62 -0
  64. package/esm2020/lib/schema/element.mjs +51 -0
  65. package/esm2020/lib/schema/entity-container.mjs +9 -0
  66. package/esm2020/lib/schema/entity-set.mjs +9 -0
  67. package/esm2020/lib/schema/enum-type.mjs +71 -0
  68. package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +0 -0
  69. package/esm2020/lib/schema/parsers/callable.mjs +113 -0
  70. package/{esm2015/lib/schema/parsers/edm.js → esm2020/lib/schema/parsers/edm.mjs} +2 -2
  71. package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
  72. package/{esm2015/lib/schema/parsers/index.js → esm2020/lib/schema/parsers/index.mjs} +0 -0
  73. package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
  74. package/esm2020/lib/schema/schema.mjs +61 -0
  75. package/esm2020/lib/schema/structured-type.mjs +198 -0
  76. package/esm2020/lib/services/base.mjs +29 -0
  77. package/esm2020/lib/services/entity-set.mjs +143 -0
  78. package/esm2020/lib/services/entity.mjs +12 -0
  79. package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
  80. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  81. package/{esm2015/lib/services/singleton.js → esm2020/lib/services/singleton.mjs} +1 -1
  82. package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
  83. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  84. package/esm2020/lib/types.mjs +37 -0
  85. package/{esm2015/lib/utils/arraybuffers.js → esm2020/lib/utils/arraybuffers.mjs} +0 -0
  86. package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
  87. package/{esm2015/lib/utils/durations.js → esm2020/lib/utils/durations.mjs} +0 -0
  88. package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
  89. package/{esm2015/lib/utils/http.js → esm2020/lib/utils/http.mjs} +0 -0
  90. package/{esm2015/lib/utils/index.js → esm2020/lib/utils/index.mjs} +0 -0
  91. package/{esm2015/lib/utils/objects.js → esm2020/lib/utils/objects.mjs} +0 -0
  92. package/esm2020/lib/utils/odata.mjs +22 -0
  93. package/{esm2015/lib/utils/strings.js → esm2020/lib/utils/strings.mjs} +0 -0
  94. package/{esm2015/lib/utils/types.js → esm2020/lib/utils/types.mjs} +0 -0
  95. package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
  96. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  97. package/fesm2015/{angular-odata.js → angular-odata.mjs} +849 -750
  98. package/fesm2015/angular-odata.mjs.map +1 -0
  99. package/fesm2020/angular-odata.mjs +10274 -0
  100. package/fesm2020/angular-odata.mjs.map +1 -0
  101. package/lib/api.d.ts +10 -10
  102. package/lib/cache/cache.d.ts +2 -2
  103. package/lib/cache/storage.d.ts +1 -1
  104. package/lib/client.d.ts +3 -3
  105. package/lib/constants.d.ts +1 -0
  106. package/lib/models/collection.d.ts +11 -19
  107. package/lib/models/model.d.ts +22 -18
  108. package/lib/models/options.d.ts +16 -21
  109. package/lib/module.d.ts +1 -1
  110. package/lib/options.d.ts +1 -0
  111. package/lib/resources/path/segments.d.ts +1 -1
  112. package/lib/resources/query/expressions.d.ts +37 -27
  113. package/lib/resources/query/handlers.d.ts +7 -11
  114. package/lib/resources/query/options.d.ts +2 -2
  115. package/lib/resources/query/syntax.d.ts +52 -54
  116. package/lib/resources/request.d.ts +1 -1
  117. package/lib/resources/resource.d.ts +25 -8
  118. package/lib/resources/types/action.d.ts +12 -19
  119. package/lib/resources/types/batch.d.ts +1 -3
  120. package/lib/resources/types/count.d.ts +5 -4
  121. package/lib/resources/types/entity-set.d.ts +11 -15
  122. package/lib/resources/types/entity.d.ts +12 -15
  123. package/lib/resources/types/function.d.ts +11 -18
  124. package/lib/resources/types/media.d.ts +6 -5
  125. package/lib/resources/types/metadata.d.ts +3 -5
  126. package/lib/resources/types/navigation-property.d.ts +15 -21
  127. package/lib/resources/types/property.d.ts +13 -19
  128. package/lib/resources/types/reference.d.ts +39 -6
  129. package/lib/resources/types/singleton.d.ts +12 -16
  130. package/lib/resources/types/value.d.ts +9 -5
  131. package/lib/schema/{base.d.ts → annotation.d.ts} +0 -0
  132. package/lib/schema/callable.d.ts +2 -18
  133. package/lib/schema/element.d.ts +39 -0
  134. package/lib/schema/entity-container.d.ts +2 -12
  135. package/lib/schema/entity-set.d.ts +2 -18
  136. package/lib/schema/enum-type.d.ts +2 -26
  137. package/lib/schema/parsers/enum-type.d.ts +4 -4
  138. package/lib/schema/parsers/structured-type.d.ts +4 -4
  139. package/lib/schema/schema.d.ts +2 -2
  140. package/lib/schema/structured-type.d.ts +8 -26
  141. package/lib/services/base.d.ts +2 -2
  142. package/lib/services/entity-set.d.ts +2 -2
  143. package/lib/services/entity.d.ts +1 -1
  144. package/lib/services/singleton.d.ts +2 -2
  145. package/lib/settings.d.ts +5 -5
  146. package/lib/types.d.ts +1 -0
  147. package/package.json +21 -8
  148. package/bundles/angular-odata.umd.js +0 -11861
  149. package/bundles/angular-odata.umd.js.map +0 -1
  150. package/esm2015/lib/api.js +0 -296
  151. package/esm2015/lib/client.js +0 -272
  152. package/esm2015/lib/helper.js +0 -268
  153. package/esm2015/lib/models/collection.js +0 -734
  154. package/esm2015/lib/models/model.js +0 -438
  155. package/esm2015/lib/models/options.js +0 -942
  156. package/esm2015/lib/options.js +0 -31
  157. package/esm2015/lib/resources/path/segments.js +0 -124
  158. package/esm2015/lib/resources/query/builder.js +0 -591
  159. package/esm2015/lib/resources/query/expressions.js +0 -194
  160. package/esm2015/lib/resources/query/handlers.js +0 -192
  161. package/esm2015/lib/resources/query/options.js +0 -103
  162. package/esm2015/lib/resources/query/syntax.js +0 -367
  163. package/esm2015/lib/resources/request.js +0 -168
  164. package/esm2015/lib/resources/resource.js +0 -243
  165. package/esm2015/lib/resources/responses/annotations.js +0 -121
  166. package/esm2015/lib/resources/responses/metadata.js +0 -548
  167. package/esm2015/lib/resources/types/action.js +0 -105
  168. package/esm2015/lib/resources/types/batch.js +0 -294
  169. package/esm2015/lib/resources/types/count.js +0 -33
  170. package/esm2015/lib/resources/types/entity-set.js +0 -101
  171. package/esm2015/lib/resources/types/entity.js +0 -137
  172. package/esm2015/lib/resources/types/function.js +0 -130
  173. package/esm2015/lib/resources/types/media.js +0 -47
  174. package/esm2015/lib/resources/types/metadata.js +0 -36
  175. package/esm2015/lib/resources/types/navigation-property.js +0 -205
  176. package/esm2015/lib/resources/types/options.js +0 -2
  177. package/esm2015/lib/resources/types/property.js +0 -151
  178. package/esm2015/lib/resources/types/reference.js +0 -74
  179. package/esm2015/lib/resources/types/singleton.js +0 -167
  180. package/esm2015/lib/resources/types/value.js +0 -35
  181. package/esm2015/lib/schema/base.js +0 -37
  182. package/esm2015/lib/schema/callable.js +0 -82
  183. package/esm2015/lib/schema/entity-container.js +0 -24
  184. package/esm2015/lib/schema/entity-set.js +0 -35
  185. package/esm2015/lib/schema/enum-type.js +0 -102
  186. package/esm2015/lib/schema/parsers/callable.js +0 -107
  187. package/esm2015/lib/schema/parsers/enum-type.js +0 -107
  188. package/esm2015/lib/schema/parsers/structured-type.js +0 -392
  189. package/esm2015/lib/schema/schema.js +0 -52
  190. package/esm2015/lib/schema/structured-type.js +0 -220
  191. package/esm2015/lib/services/base.js +0 -23
  192. package/esm2015/lib/services/entity-set.js +0 -146
  193. package/esm2015/lib/services/entity.js +0 -12
  194. package/esm2015/lib/types.js +0 -37
  195. package/esm2015/lib/utils/odata.js +0 -21
  196. package/fesm2015/angular-odata.js.map +0 -1
@@ -1,392 +0,0 @@
1
- import { Objects, Strings, Types } from '../../utils';
2
- import { NONE_PARSER, } from '../../types';
3
- import { ODataEnumTypeParser } from './enum-type';
4
- import { COMPUTED, DESCRIPTION, LONG_DESCRIPTION } from '../../constants';
5
- import { ODataAnnotatable } from '../base';
6
- import { raw } from '../../resources/query';
7
- import { ODataParserOptions } from '../../options';
8
- export class ODataEntityTypeKey {
9
- constructor({ name, alias }) {
10
- this.name = name;
11
- this.alias = alias;
12
- }
13
- }
14
- export class ODataReferential {
15
- constructor({ property, referencedProperty, }) {
16
- this.property = property;
17
- this.referencedProperty = referencedProperty;
18
- }
19
- }
20
- export class ODataStructuredTypeFieldParser extends ODataAnnotatable {
21
- constructor(name, structuredType, field) {
22
- super(field);
23
- this.name = name;
24
- this.structuredType = structuredType;
25
- this.type = field.type;
26
- this.parser = NONE_PARSER;
27
- this.referentials = (field.referentials || []).map((referential) => new ODataReferential(referential));
28
- this.default = field.default;
29
- this.maxLength = field.maxLength;
30
- this.nullable = field.nullable !== undefined ? field.nullable : true;
31
- this.collection = Boolean(field.collection);
32
- this.navigation = Boolean(field.navigation);
33
- this.precision = field.precision;
34
- this.scale = field.scale;
35
- }
36
- validate(value, { method, navigation = false, } = {}) {
37
- let errors;
38
- if (this.collection && Array.isArray(value)) {
39
- errors = value.map((v) => this.validate(v, { method, navigation }));
40
- }
41
- else if ((this.isStructuredType() &&
42
- typeof value === 'object' &&
43
- value !== null) ||
44
- (this.navigation && value !== undefined)) {
45
- errors =
46
- this.structured().validate(value, { method, navigation }) ||
47
- {};
48
- }
49
- else if (this.isEnumType() &&
50
- (typeof value === 'string' || typeof value === 'number')) {
51
- errors = this.enum().validate(value, { method, navigation });
52
- }
53
- else {
54
- // IsEdmType
55
- const computed = this.annotatedValue(COMPUTED);
56
- errors = [];
57
- if (!this.nullable &&
58
- (value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
59
- !(computed && method === 'create') // Not (Is Computed field and create) ?
60
- ) {
61
- errors.push(`required`);
62
- }
63
- if (this.maxLength !== undefined &&
64
- typeof value === 'string' &&
65
- value.length > this.maxLength) {
66
- errors.push(`maxlength`);
67
- }
68
- }
69
- return !Types.isEmpty(errors) ? errors : undefined;
70
- }
71
- //#region Deserialize
72
- parse(parser, value, options) {
73
- const type = Types.isPlainObject(value)
74
- ? options === null || options === void 0 ? void 0 : options.helper.type(value)
75
- : undefined;
76
- if (type !== undefined) {
77
- return parser
78
- .childParser((c) => c.isTypeOf(type))
79
- .deserialize(value, options);
80
- }
81
- return parser.deserialize(value, options);
82
- }
83
- deserialize(value, options) {
84
- const parserOptions = options !== undefined
85
- ? new ODataParserOptions(options)
86
- : this.optionsHelper;
87
- if (this.parser instanceof ODataStructuredTypeParser) {
88
- const parser = this.parser;
89
- return Array.isArray(value)
90
- ? value.map((v) => this.parse(parser, v, parserOptions))
91
- : this.parse(parser, value, parserOptions);
92
- }
93
- return this.parser.deserialize(value, Object.assign({ field: this }, parserOptions));
94
- }
95
- //#endregion
96
- //#region Serialize
97
- toJson(parser, value, options) {
98
- const type = Types.isPlainObject(value)
99
- ? options === null || options === void 0 ? void 0 : options.helper.type(value)
100
- : undefined;
101
- if (type !== undefined) {
102
- return parser
103
- .childParser((c) => c.isTypeOf(type))
104
- .serialize(value, options);
105
- }
106
- return parser.serialize(value, options);
107
- }
108
- serialize(value, options) {
109
- const parserOptions = options !== undefined
110
- ? new ODataParserOptions(options)
111
- : this.optionsHelper;
112
- if (this.parser instanceof ODataStructuredTypeParser) {
113
- const parser = this.parser;
114
- return Array.isArray(value)
115
- ? value.map((v) => this.toJson(parser, v, parserOptions))
116
- : this.toJson(parser, value, parserOptions);
117
- }
118
- return this.parser.serialize(value, Object.assign({ field: this }, parserOptions));
119
- }
120
- //#endregion
121
- //#region Encode
122
- encode(value, options) {
123
- const parserOptions = options !== undefined
124
- ? new ODataParserOptions(options)
125
- : this.optionsHelper;
126
- return this.parser.encode(value, Object.assign({ field: this }, parserOptions));
127
- }
128
- //#endregion
129
- configure({ parserForType, options, }) {
130
- this.optionsHelper = options;
131
- this.parser = parserForType(this.type);
132
- if (this.default !== undefined) {
133
- this.default = this.deserialize(this.default, options);
134
- }
135
- }
136
- //#region Json Schema
137
- // https://json-schema.org/
138
- toJsonSchema(options = {}) {
139
- let schema = this.parser instanceof ODataStructuredTypeFieldParser ||
140
- this.parser instanceof ODataStructuredTypeParser ||
141
- this.parser instanceof ODataEnumTypeParser
142
- ? this.parser.toJsonSchema(options)
143
- : { title: this.name, type: 'object' };
144
- if ([
145
- 'Edm.String',
146
- 'Edm.Date',
147
- 'Edm.TimeOfDay',
148
- 'Edm.DateTimeOffset',
149
- 'Edm.Guid',
150
- 'Edm.Binary',
151
- ].indexOf(this.type) !== -1) {
152
- schema.type = 'string';
153
- if (this.type === 'Edm.Date')
154
- schema.format = 'date';
155
- else if (this.type === 'Edm.TimeOfDay')
156
- schema.format = 'time';
157
- else if (this.type === 'Edm.DateTimeOffset')
158
- schema.format = 'date-time';
159
- else if (this.type === 'Edm.Guid')
160
- schema.pattern =
161
- '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$';
162
- else if (this.type === 'Edm.Binary')
163
- schema.contentEncoding = 'base64';
164
- else if (this.type === 'Edm.String' && this.maxLength)
165
- schema.maxLength = this.maxLength;
166
- }
167
- else if (['Edm.Int64', 'Edm.Int32', 'Edm.Int16', 'Edm.Byte', 'Edm.SByte'].indexOf(this.type) !== -1) {
168
- //TODO: Range
169
- schema.type = 'integer';
170
- }
171
- else if (['Edm.Decimal', 'Edm.Double'].indexOf(this.type) !== -1) {
172
- schema.type = 'number';
173
- }
174
- else if (['Edm.Boolean'].indexOf(this.type) !== -1) {
175
- schema.type = 'boolean';
176
- }
177
- if (this.default)
178
- schema.default = this.default;
179
- if (this.nullable)
180
- schema.type = [schema.type, 'null'];
181
- if (this.collection)
182
- schema = {
183
- type: 'array',
184
- items: schema,
185
- additionalItems: false,
186
- };
187
- return schema;
188
- }
189
- //#endregion
190
- isKey() {
191
- var _a;
192
- return (((_a = this.structuredType.keys) === null || _a === void 0 ? void 0 : _a.find((k) => k.name === this.name)) !== undefined);
193
- }
194
- hasReferentials() {
195
- return this.referentials.length !== 0;
196
- }
197
- isEdmType() {
198
- return this.type.startsWith('Edm.');
199
- }
200
- isEnumType() {
201
- return this.parser instanceof ODataEnumTypeParser;
202
- }
203
- enum() {
204
- if (!this.isEnumType())
205
- throw new Error('Field are not EnumType');
206
- return this.parser;
207
- }
208
- isStructuredType() {
209
- return this.parser instanceof ODataStructuredTypeParser;
210
- }
211
- structured() {
212
- if (!this.isStructuredType())
213
- throw new Error('Field are not StrucuturedType');
214
- return this.parser;
215
- }
216
- }
217
- export class ODataStructuredTypeParser extends ODataAnnotatable {
218
- constructor(config, namespace, alias) {
219
- super(config);
220
- this.children = [];
221
- this.name = config.name;
222
- this.base = config.base;
223
- this.open = config.open || false;
224
- this.namespace = namespace;
225
- this.alias = alias;
226
- if (Array.isArray(config.keys))
227
- this.keys = config.keys.map((key) => new ODataEntityTypeKey(key));
228
- this.fields = Object.entries(config.fields).map(([name, config]) => new ODataStructuredTypeFieldParser(name, this, config));
229
- }
230
- /**
231
- * Create a nicer looking title.
232
- * Titleize is meant for creating pretty output.
233
- * @param term The term of the annotation to find.
234
- * @returns The titleized string.
235
- */
236
- titelize(term) {
237
- return this.annotatedValue(term) || Strings.titleCase(this.name);
238
- }
239
- isTypeOf(type) {
240
- var names = [`${this.namespace}.${this.name}`];
241
- if (this.alias)
242
- names.push(`${this.alias}.${this.name}`);
243
- return names.indexOf(type) !== -1;
244
- }
245
- typeFor(name) {
246
- const field = this.fields.find((f) => f.name === name);
247
- if (field === undefined && this.parent !== undefined)
248
- return this.parent.typeFor(name);
249
- return field !== undefined ? field.type : undefined;
250
- }
251
- findChildParser(predicate) {
252
- if (predicate(this))
253
- return this;
254
- let match;
255
- for (let ch of this.children) {
256
- match = ch.findChildParser(predicate);
257
- if (match !== undefined)
258
- break;
259
- }
260
- return match;
261
- }
262
- childParser(predicate) {
263
- return this.findChildParser(predicate) || NONE_PARSER;
264
- }
265
- // Deserialize
266
- deserialize(value, options) {
267
- const parserOptions = options !== undefined
268
- ? new ODataParserOptions(options)
269
- : this.optionsHelper;
270
- if (this.parent !== undefined)
271
- value = this.parent.deserialize(value, parserOptions);
272
- const fields = this.fields.filter((f) => f.name in value && value[f.name] !== undefined && value[f.name] !== null);
273
- return Object.assign(Object.assign({}, value), fields.reduce((acc, f) => (Object.assign(Object.assign({}, acc), { [f.name]: f.deserialize(value[f.name], parserOptions) })), {}));
274
- }
275
- // Serialize
276
- serialize(value, options) {
277
- const parserOptions = options !== undefined
278
- ? new ODataParserOptions(options)
279
- : this.optionsHelper;
280
- if (this.parent !== undefined)
281
- value = this.parent.serialize(value, parserOptions);
282
- const fields = this.fields.filter((f) => f.name in value &&
283
- value[f.name] !== undefined &&
284
- value[f.name] !== null);
285
- return Object.assign(Object.assign({}, value), fields.reduce((acc, f) => (Object.assign(Object.assign({}, acc), { [f.name]: f.serialize(value[f.name], parserOptions) })), {}));
286
- }
287
- // Encode
288
- encode(value, options) {
289
- const parserOptions = options !== undefined
290
- ? new ODataParserOptions(options)
291
- : this.optionsHelper;
292
- return raw(JSON.stringify(this.serialize(value, parserOptions)));
293
- }
294
- configure({ parserForType, options, }) {
295
- this.optionsHelper = options;
296
- if (this.base) {
297
- const parent = parserForType(this.base);
298
- parent.children.push(this);
299
- this.parent = parent;
300
- }
301
- this.fields.forEach((f) => f.configure({ parserForType, options }));
302
- }
303
- resolveKey(value) {
304
- var _a;
305
- let key = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.resolveKey(value)) || {};
306
- if (Array.isArray(this.keys) && this.keys.length > 0) {
307
- for (var k of this.keys) {
308
- let v = value;
309
- let structured = this;
310
- let field;
311
- for (let name of k.name.split('/')) {
312
- if (structured === undefined)
313
- break;
314
- field = structured.fields.find((f) => f.name === name);
315
- if (field !== undefined) {
316
- v = Types.isPlainObject(v) ? v[field.name] : v;
317
- structured = field.isStructuredType()
318
- ? field.structured()
319
- : undefined;
320
- }
321
- }
322
- if (field !== undefined && v !== undefined) {
323
- key[k.alias || field.name] = field.encode(v);
324
- }
325
- }
326
- }
327
- if (Types.isEmpty(key))
328
- return undefined;
329
- return Objects.resolveKey(key);
330
- }
331
- defaults() {
332
- var _a;
333
- let value = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.defaults()) || {};
334
- let fields = this.fields.filter((f) => f.default !== undefined || f.isStructuredType());
335
- return Object.assign(Object.assign({}, value), fields.reduce((acc, f) => {
336
- let value = f.isStructuredType()
337
- ? f.structured().defaults()
338
- : f.default;
339
- return Types.isEmpty(value) ? acc : Object.assign(Object.assign({}, acc), { [f.name]: value });
340
- }, {}));
341
- }
342
- // Json Schema
343
- toJsonSchema(options = {}) {
344
- var _a;
345
- let schema = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.toJsonSchema(options)) || {
346
- $schema: 'http://json-schema.org/draft-07/schema#',
347
- $id: `${this.namespace}.${this.name}`,
348
- title: this.titelize(DESCRIPTION),
349
- description: this.annotatedValue(LONG_DESCRIPTION),
350
- type: 'object',
351
- properties: {},
352
- required: [],
353
- };
354
- const fields = this.fields.filter((f) => (!f.navigation || (options.expand && f.name in options.expand)) &&
355
- (!options.select || options.select.indexOf(f.name) !== -1));
356
- schema.properties = Object.assign({}, schema.properties, fields
357
- .map((f) => {
358
- let expand = options.expand && f.name in options.expand
359
- ? options.expand[f.name]
360
- : undefined;
361
- let schema = f.toJsonSchema(expand);
362
- if (options.custom && f.name in options.custom)
363
- schema = options.custom[f.name](schema, f);
364
- return { [f.name]: schema };
365
- })
366
- .reduce((acc, v) => Object.assign(acc, v), {}));
367
- schema.required = [
368
- ...schema.required,
369
- ...fields
370
- .filter((f) => options.required && f.name in options.required
371
- ? options.required[f.name]
372
- : !f.nullable)
373
- .map((f) => f.name),
374
- ];
375
- return schema;
376
- }
377
- validate(attrs, { method, navigation = false, } = {}) {
378
- var _a;
379
- const errors = (((_a = this.parent) === null || _a === void 0 ? void 0 : _a.validate(attrs, { method, navigation })) ||
380
- {});
381
- const fields = this.fields.filter((f) => !f.navigation || navigation);
382
- for (var field of fields) {
383
- const value = attrs[field.name];
384
- const errs = field.validate(value, { method, navigation });
385
- if (errs !== undefined) {
386
- errors[field.name] = errs;
387
- }
388
- }
389
- return !Types.isEmpty(errors) ? errors : undefined;
390
- }
391
- }
392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9wYXJzZXJzL3N0cnVjdHVyZWQtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUtMLFdBQVcsR0FHWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQW1CbkQsTUFBTSxPQUFPLGtCQUFrQjtJQUc3QixZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBb0M7UUFDM0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFZLEVBQ1YsUUFBUSxFQUNSLGtCQUFrQixHQUluQjtRQUNDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sOEJBQ1gsU0FBUSxnQkFBZ0I7SUFpQnhCLFlBQ0UsSUFBWSxFQUNaLGNBQThDLEVBQzlDLEtBQWdDO1FBRWhDLEtBQUss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RyxLQUFLLE1BS2hCLEVBQUU7O1FBRU4sTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUNsRSxFQUFFLENBQTRCLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsQ0FBQztRQUN0RSxLQUFLLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUN4QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQWUsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQzthQUMzQjtTQUNGO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9iamVjdHMsIFN0cmluZ3MsIFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgUGFyc2VyLFxuICBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnLFxuICBTdHJ1Y3R1cmVkVHlwZUNvbmZpZyxcbiAgT3B0aW9uc0hlbHBlcixcbiAgTk9ORV9QQVJTRVIsXG4gIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zLFxuICBPcHRpb25zLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YUVudW1UeXBlUGFyc2VyIH0gZnJvbSAnLi9lbnVtLXR5cGUnO1xuaW1wb3J0IHsgQ09NUFVURUQsIERFU0NSSVBUSU9OLCBMT05HX0RFU0NSSVBUSU9OIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhQW5ub3RhdGFibGUgfSBmcm9tICcuLi9iYXNlJztcbmltcG9ydCB7IHJhdyB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9xdWVyeSc7XG5pbXBvcnQgeyBPRGF0YVBhcnNlck9wdGlvbnMgfSBmcm9tICcuLi8uLi9vcHRpb25zJztcblxuLy8gSlNPTiBTQ0hFTUFcbnR5cGUgSnNvblNjaGVtYVNlbGVjdDxUPiA9IEFycmF5PGtleW9mIFQ+O1xudHlwZSBKc29uU2NoZW1hQ3VzdG9tPFQ+ID0ge1xuICBbUCBpbiBrZXlvZiBUXT86IChcbiAgICBzY2hlbWE6IGFueSxcbiAgICBmaWVsZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPFRbUF0+XG4gICkgPT4gYW55O1xufTtcbnR5cGUgSnNvblNjaGVtYUV4cGFuZDxUPiA9IHsgW1AgaW4ga2V5b2YgVF0/OiBKc29uU2NoZW1hT3B0aW9uczxUW1BdPiB9O1xudHlwZSBKc29uU2NoZW1hUmVxdWlyZWQ8VD4gPSB7IFtQIGluIGtleW9mIFRdPzogYm9vbGVhbiB9O1xuZXhwb3J0IHR5cGUgSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7XG4gIHNlbGVjdD86IEpzb25TY2hlbWFTZWxlY3Q8VD47XG4gIGN1c3RvbT86IEpzb25TY2hlbWFDdXN0b208VD47XG4gIGV4cGFuZD86IEpzb25TY2hlbWFFeHBhbmQ8VD47XG4gIHJlcXVpcmVkPzogSnNvblNjaGVtYVJlcXVpcmVkPFQ+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhRW50aXR5VHlwZUtleSB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHsgbmFtZSwgYWxpYXMgfTogeyBuYW1lOiBzdHJpbmc7IGFsaWFzPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFSZWZlcmVudGlhbCB7XG4gIHByb3BlcnR5OiBzdHJpbmc7XG4gIHJlZmVyZW5jZWRQcm9wZXJ0eTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgcHJvcGVydHksXG4gICAgcmVmZXJlbmNlZFByb3BlcnR5LFxuICB9OiB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICByZWZlcmVuY2VkUHJvcGVydHk6IHN0cmluZztcbiAgfSkge1xuICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICB0aGlzLnJlZmVyZW5jZWRQcm9wZXJ0eSA9IHJlZmVyZW5jZWRQcm9wZXJ0eTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPFQ+XG4gIGV4dGVuZHMgT0RhdGFBbm5vdGF0YWJsZVxuICBpbXBsZW1lbnRzIFBhcnNlcjxUPlxue1xuICBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RydWN0dXJlZFR5cGU6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PjtcbiAgdHlwZTogc3RyaW5nO1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyPFQ+O1xuICBkZWZhdWx0PzogYW55O1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIGNvbGxlY3Rpb246IGJvb2xlYW47XG4gIG51bGxhYmxlOiBib29sZWFuO1xuICBuYXZpZ2F0aW9uOiBib29sZWFuO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyO1xuICByZWZlcmVudGlhbHM6IE9EYXRhUmVmZXJlbnRpYWxbXTtcbiAgb3B0aW9uc0hlbHBlcj86IE9wdGlvbnNIZWxwZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cnVjdHVyZWRUeXBlOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4sXG4gICAgZmllbGQ6IFN0cnVjdHVyZWRUeXBlRmllbGRDb25maWdcbiAgKSB7XG4gICAgc3VwZXIoZmllbGQpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdHJ1Y3R1cmVkVHlwZSA9IHN0cnVjdHVyZWRUeXBlO1xuICAgIHRoaXMudHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgdGhpcy5wYXJzZXIgPSBOT05FX1BBUlNFUjtcbiAgICB0aGlzLnJlZmVyZW50aWFscyA9IChmaWVsZC5yZWZlcmVudGlhbHMgfHwgW10pLm1hcChcbiAgICAgIChyZWZlcmVudGlhbCkgPT4gbmV3IE9EYXRhUmVmZXJlbnRpYWwocmVmZXJlbnRpYWwpXG4gICAgKTtcbiAgICB0aGlzLmRlZmF1bHQgPSBmaWVsZC5kZWZhdWx0O1xuICAgIHRoaXMubWF4TGVuZ3RoID0gZmllbGQubWF4TGVuZ3RoO1xuICAgIHRoaXMubnVsbGFibGUgPSBmaWVsZC5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gZmllbGQubnVsbGFibGUgOiB0cnVlO1xuICAgIHRoaXMuY29sbGVjdGlvbiA9IEJvb2xlYW4oZmllbGQuY29sbGVjdGlvbik7XG4gICAgdGhpcy5uYXZpZ2F0aW9uID0gQm9vbGVhbihmaWVsZC5uYXZpZ2F0aW9uKTtcbiAgICB0aGlzLnByZWNpc2lvbiA9IGZpZWxkLnByZWNpc2lvbjtcbiAgICB0aGlzLnNjYWxlID0gZmllbGQuc2NhbGU7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTpcbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgfCBzdHJpbmdbXVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZXJyb3JzO1xuICAgIGlmICh0aGlzLmNvbGxlY3Rpb24gJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGVycm9ycyA9IHZhbHVlLm1hcCgodikgPT4gdGhpcy52YWxpZGF0ZSh2LCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSkgYXMge1xuICAgICAgICBbbmFtZTogc3RyaW5nXTogYW55W107XG4gICAgICB9W107XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICh0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHZhbHVlICE9PSBudWxsKSB8fFxuICAgICAgKHRoaXMubmF2aWdhdGlvbiAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgZXJyb3JzID1cbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmVkKCkudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pIHx8XG4gICAgICAgICh7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnlbXSB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5pc0VudW1UeXBlKCkgJiZcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgKSB7XG4gICAgICBlcnJvcnMgPSB0aGlzLmVudW0oKS52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzRWRtVHlwZVxuICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmFubm90YXRlZFZhbHVlPGJvb2xlYW4+KENPTVBVVEVEKTtcbiAgICAgIGVycm9ycyA9IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5udWxsYWJsZSAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAnbW9kaWZ5JykpICYmIC8vIElzIG51bGwgb3IgdW5kZWZpbmVkIHdpdGhvdXQgcGF0Y2g/XG4gICAgICAgICEoY29tcHV0ZWQgJiYgbWV0aG9kID09PSAnY3JlYXRlJykgLy8gTm90IChJcyBDb21wdXRlZCBmaWVsZCBhbmQgY3JlYXRlKSA/XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYHJlcXVpcmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtYXhsZW5ndGhgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICFUeXBlcy5pc0VtcHR5KGVycm9ycykgPyBlcnJvcnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyNyZWdpb24gRGVzZXJpYWxpemVcbiAgcHJpdmF0ZSBwYXJzZShcbiAgICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD4sXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zPzogT3B0aW9uc0hlbHBlclxuICApOiBhbnkge1xuICAgIGNvbnN0IHR5cGUgPSBUeXBlcy5pc1BsYWluT2JqZWN0KHZhbHVlKVxuICAgICAgPyBvcHRpb25zPy5oZWxwZXIudHlwZSh2YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwYXJzZXJcbiAgICAgICAgLmNoaWxkUGFyc2VyKChjKSA9PiBjLmlzVHlwZU9mKHR5cGUpKVxuICAgICAgICAuZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBPcHRpb25zKTogVCB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5vcHRpb25zSGVscGVyO1xuICAgIGlmICh0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXIpIHtcbiAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD47XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS5tYXAoKHYpID0+IHRoaXMucGFyc2UocGFyc2VyLCB2LCBwYXJzZXJPcHRpb25zKSlcbiAgICAgICAgOiB0aGlzLnBhcnNlKHBhcnNlciwgdmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIHtcbiAgICAgIGZpZWxkOiB0aGlzLFxuICAgICAgLi4ucGFyc2VyT3B0aW9ucyxcbiAgICB9IGFzIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2VyaWFsaXplXG4gIHByaXZhdGUgdG9Kc29uKFxuICAgIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPixcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBPcHRpb25zSGVscGVyXG4gICk6IGFueSB7XG4gICAgY29uc3QgdHlwZSA9IFR5cGVzLmlzUGxhaW5PYmplY3QodmFsdWUpXG4gICAgICA/IG9wdGlvbnM/LmhlbHBlci50eXBlKHZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBhcnNlclxuICAgICAgICAuY2hpbGRQYXJzZXIoKGMpID0+IGMuaXNUeXBlT2YodHlwZSkpXG4gICAgICAgIC5zZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBzZXJpYWxpemUodmFsdWU6IFQsIG9wdGlvbnM/OiBPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgaWYgKHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcikge1xuICAgICAgY29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXIgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICA/ICh2YWx1ZSBhcyBhbnlbXSkubWFwKCh2KSA9PiB0aGlzLnRvSnNvbihwYXJzZXIsIHYsIHBhcnNlck9wdGlvbnMpKVxuICAgICAgICA6IHRoaXMudG9Kc29uKHBhcnNlciwgdmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuc2VyaWFsaXplKHZhbHVlLCB7XG4gICAgICBmaWVsZDogdGhpcyxcbiAgICAgIC4uLnBhcnNlck9wdGlvbnMsXG4gICAgfSBhcyBTdHJ1Y3R1cmVkVHlwZUZpZWxkT3B0aW9ucyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEVuY29kZVxuICBlbmNvZGUodmFsdWU6IFQsIG9wdGlvbnM/OiBPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmVuY29kZSh2YWx1ZSwge1xuICAgICAgZmllbGQ6IHRoaXMsXG4gICAgICAuLi5wYXJzZXJPcHRpb25zLFxuICAgIH0gYXMgU3RydWN0dXJlZFR5cGVGaWVsZE9wdGlvbnMpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgcGFyc2VyRm9yVHlwZSxcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gUGFyc2VyPGFueT47XG4gICAgb3B0aW9uczogT3B0aW9uc0hlbHBlcjtcbiAgfSkge1xuICAgIHRoaXMub3B0aW9uc0hlbHBlciA9IG9wdGlvbnM7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXJGb3JUeXBlKHRoaXMudHlwZSk7XG4gICAgaWYgKHRoaXMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlc2VyaWFsaXplKHRoaXMuZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8jcmVnaW9uIEpzb24gU2NoZW1hXG4gIC8vIGh0dHBzOi8vanNvbi1zY2hlbWEub3JnL1xuICB0b0pzb25TY2hlbWEob3B0aW9uczogSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGxldCBzY2hlbWE6IGFueSA9XG4gICAgICB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlciB8fFxuICAgICAgdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyIHx8XG4gICAgICB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhRW51bVR5cGVQYXJzZXJcbiAgICAgICAgPyB0aGlzLnBhcnNlci50b0pzb25TY2hlbWEob3B0aW9ucylcbiAgICAgICAgOiAoeyB0aXRsZTogdGhpcy5uYW1lLCB0eXBlOiAnb2JqZWN0JyB9IGFzIGFueSk7XG5cbiAgICBpZiAoXG4gICAgICBbXG4gICAgICAgICdFZG0uU3RyaW5nJyxcbiAgICAgICAgJ0VkbS5EYXRlJyxcbiAgICAgICAgJ0VkbS5UaW1lT2ZEYXknLFxuICAgICAgICAnRWRtLkRhdGVUaW1lT2Zmc2V0JyxcbiAgICAgICAgJ0VkbS5HdWlkJyxcbiAgICAgICAgJ0VkbS5CaW5hcnknLFxuICAgICAgXS5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xXG4gICAgKSB7XG4gICAgICBzY2hlbWEudHlwZSA9ICdzdHJpbmcnO1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5EYXRlJykgc2NoZW1hLmZvcm1hdCA9ICdkYXRlJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5UaW1lT2ZEYXknKSBzY2hlbWEuZm9ybWF0ID0gJ3RpbWUnO1xuICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09PSAnRWRtLkRhdGVUaW1lT2Zmc2V0Jykgc2NoZW1hLmZvcm1hdCA9ICdkYXRlLXRpbWUnO1xuICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09PSAnRWRtLkd1aWQnKVxuICAgICAgICBzY2hlbWEucGF0dGVybiA9XG4gICAgICAgICAgJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5CaW5hcnknKSBzY2hlbWEuY29udGVudEVuY29kaW5nID0gJ2Jhc2U2NCc7XG4gICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdFZG0uU3RyaW5nJyAmJiB0aGlzLm1heExlbmd0aClcbiAgICAgICAgc2NoZW1hLm1heExlbmd0aCA9IHRoaXMubWF4TGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBbJ0VkbS5JbnQ2NCcsICdFZG0uSW50MzInLCAnRWRtLkludDE2JywgJ0VkbS5CeXRlJywgJ0VkbS5TQnl0ZSddLmluZGV4T2YoXG4gICAgICAgIHRoaXMudHlwZVxuICAgICAgKSAhPT0gLTFcbiAgICApIHtcbiAgICAgIC8vVE9ETzogUmFuZ2VcbiAgICAgIHNjaGVtYS50eXBlID0gJ2ludGVnZXInO1xuICAgIH0gZWxzZSBpZiAoWydFZG0uRGVjaW1hbCcsICdFZG0uRG91YmxlJ10uaW5kZXhPZih0aGlzLnR5cGUpICE9PSAtMSkge1xuICAgICAgc2NoZW1hLnR5cGUgPSAnbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKFsnRWRtLkJvb2xlYW4nXS5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xKSB7XG4gICAgICBzY2hlbWEudHlwZSA9ICdib29sZWFuJztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVmYXVsdCkgc2NoZW1hLmRlZmF1bHQgPSB0aGlzLmRlZmF1bHQ7XG4gICAgaWYgKHRoaXMubnVsbGFibGUpIHNjaGVtYS50eXBlID0gW3NjaGVtYS50eXBlLCAnbnVsbCddO1xuICAgIGlmICh0aGlzLmNvbGxlY3Rpb24pXG4gICAgICBzY2hlbWEgPSB7XG4gICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgIGl0ZW1zOiBzY2hlbWEsXG4gICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICB9O1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgaXNLZXkoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RydWN0dXJlZFR5cGUua2V5cz8uZmluZCgoaykgPT4gay5uYW1lID09PSB0aGlzLm5hbWUpICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgaGFzUmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnJlZmVyZW50aWFscy5sZW5ndGggIT09IDA7XG4gIH1cblxuICBpc0VkbVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZS5zdGFydHNXaXRoKCdFZG0uJyk7XG4gIH1cblxuICBpc0VudW1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhRW51bVR5cGVQYXJzZXI7XG4gIH1cblxuICBlbnVtKCkge1xuICAgIGlmICghdGhpcy5pc0VudW1UeXBlKCkpIHRocm93IG5ldyBFcnJvcignRmllbGQgYXJlIG5vdCBFbnVtVHlwZScpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBhcyBPRGF0YUVudW1UeXBlUGFyc2VyPFQ+O1xuICB9XG5cbiAgaXNTdHJ1Y3R1cmVkVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyO1xuICB9XG5cbiAgc3RydWN0dXJlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNTdHJ1Y3R1cmVkVHlwZSgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWVsZCBhcmUgbm90IFN0cnVjdXR1cmVkVHlwZScpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+XG4gIGV4dGVuZHMgT0RhdGFBbm5vdGF0YWJsZVxuICBpbXBsZW1lbnRzIFBhcnNlcjxUPlxue1xuICBuYW1lOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBvcGVuOiBib29sZWFuO1xuICBjaGlsZHJlbjogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+W10gPSBbXTtcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGJhc2U/OiBzdHJpbmc7XG4gIHBhcmVudD86IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PjtcbiAga2V5cz86IE9EYXRhRW50aXR5VHlwZUtleVtdO1xuICBmaWVsZHM6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxhbnk+W107XG4gIG9wdGlvbnNIZWxwZXI/OiBPcHRpb25zSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZzogU3RydWN0dXJlZFR5cGVDb25maWc8VD4sXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLmJhc2UgPSBjb25maWcuYmFzZTtcbiAgICB0aGlzLm9wZW4gPSBjb25maWcub3BlbiB8fCBmYWxzZTtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmtleXMpKVxuICAgICAgdGhpcy5rZXlzID0gY29uZmlnLmtleXMubWFwKChrZXkpID0+IG5ldyBPRGF0YUVudGl0eVR5cGVLZXkoa2V5KSk7XG4gICAgdGhpcy5maWVsZHMgPSBPYmplY3QuZW50cmllczxTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnPihcbiAgICAgIGNvbmZpZy5maWVsZHMgYXMgeyBbUCBpbiBrZXlvZiBUXTogU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyB9XG4gICAgKS5tYXAoXG4gICAgICAoW25hbWUsIGNvbmZpZ10pID0+IG5ldyBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIobmFtZSwgdGhpcywgY29uZmlnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmljZXIgbG9va2luZyB0aXRsZS5cbiAgICogVGl0bGVpemUgaXMgbWVhbnQgZm9yIGNyZWF0aW5nIHByZXR0eSBvdXRwdXQuXG4gICAqIEBwYXJhbSB0ZXJtIFRoZSB0ZXJtIG9mIHRoZSBhbm5vdGF0aW9uIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIFRoZSB0aXRsZWl6ZWQgc3RyaW5nLlxuICAgKi9cbiAgdGl0ZWxpemUodGVybTogc3RyaW5nIHwgUmVnRXhwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hbm5vdGF0ZWRWYWx1ZSh0ZXJtKSB8fCBTdHJpbmdzLnRpdGxlQ2FzZSh0aGlzLm5hbWUpO1xuICB9XG5cbiAgaXNUeXBlT2YodHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIG5hbWVzID0gW2Ake3RoaXMubmFtZXNwYWNlfS4ke3RoaXMubmFtZX1gXTtcbiAgICBpZiAodGhpcy5hbGlhcykgbmFtZXMucHVzaChgJHt0aGlzLmFsaWFzfS4ke3RoaXMubmFtZX1gKTtcbiAgICByZXR1cm4gbmFtZXMuaW5kZXhPZih0eXBlKSAhPT0gLTE7XG4gIH1cblxuICB0eXBlRm9yKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5maW5kKChmKSA9PiBmLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQudHlwZUZvcihuYW1lKTtcbiAgICByZXR1cm4gZmllbGQgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnR5cGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBmaW5kQ2hpbGRQYXJzZXIoXG4gICAgcHJlZGljYXRlOiAocDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+KSA9PiBib29sZWFuXG4gICk6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByZWRpY2F0ZSh0aGlzKSkgcmV0dXJuIHRoaXM7XG4gICAgbGV0IG1hdGNoOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgbWF0Y2ggPSBjaC5maW5kQ2hpbGRQYXJzZXIocHJlZGljYXRlKTtcbiAgICAgIGlmIChtYXRjaCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgY2hpbGRQYXJzZXIoXG4gICAgcHJlZGljYXRlOiAocDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+KSA9PiBib29sZWFuXG4gICk6IFBhcnNlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kQ2hpbGRQYXJzZXIocHJlZGljYXRlKSB8fCBOT05FX1BBUlNFUjtcbiAgfVxuXG4gIC8vIERlc2VyaWFsaXplXG4gIGRlc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBPcHRpb25zKTogVCB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5vcHRpb25zSGVscGVyO1xuICAgIGlmICh0aGlzLnBhcmVudCAhPT0gdW5kZWZpbmVkKVxuICAgICAgdmFsdWUgPSB0aGlzLnBhcmVudC5kZXNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMuZmlsdGVyKFxuICAgICAgKGYpID0+XG4gICAgICAgIGYubmFtZSBpbiB2YWx1ZSAmJiB2YWx1ZVtmLm5hbWVdICE9PSB1bmRlZmluZWQgJiYgdmFsdWVbZi5uYW1lXSAhPT0gbnVsbFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgLi4uZmllbGRzLnJlZHVjZShcbiAgICAgICAgKGFjYywgZikgPT4gKHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW2YubmFtZV06IGYuZGVzZXJpYWxpemUodmFsdWVbZi5uYW1lXSwgcGFyc2VyT3B0aW9ucyksXG4gICAgICAgIH0pLFxuICAgICAgICB7fVxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gU2VyaWFsaXplXG4gIHNlcmlhbGl6ZSh2YWx1ZTogVCwgb3B0aW9ucz86IE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMub3B0aW9uc0hlbHBlcjtcbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZClcbiAgICAgIHZhbHVlID0gdGhpcy5wYXJlbnQuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgZi5uYW1lIGluIHZhbHVlICYmXG4gICAgICAgICh2YWx1ZSBhcyBhbnkpW2YubmFtZV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAodmFsdWUgYXMgYW55KVtmLm5hbWVdICE9PSBudWxsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICAuLi5maWVsZHMucmVkdWNlKFxuICAgICAgICAoYWNjLCBmKSA9PiAoe1xuICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICBbZi5uYW1lXTogZi5zZXJpYWxpemUoKHZhbHVlIGFzIGFueSlbZi5uYW1lXSwgcGFyc2VyT3B0aW9ucyksXG4gICAgICAgIH0pLFxuICAgICAgICB7fVxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gRW5jb2RlXG4gIGVuY29kZSh2YWx1ZTogVCwgb3B0aW9ucz86IE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMub3B0aW9uc0hlbHBlcjtcbiAgICByZXR1cm4gcmF3KEpTT04uc3RyaW5naWZ5KHRoaXMuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKSkpO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBwYXJzZXJGb3JUeXBlLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBwYXJzZXJGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBQYXJzZXI8YW55PjtcbiAgICBvcHRpb25zOiBPcHRpb25zSGVscGVyO1xuICB9KSB7XG4gICAgdGhpcy5vcHRpb25zSGVscGVyID0gb3B0aW9ucztcbiAgICBpZiAodGhpcy5iYXNlKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJzZXJGb3JUeXBlKHRoaXMuYmFzZSkgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+O1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyk7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgdGhpcy5maWVsZHMuZm9yRWFjaCgoZikgPT4gZi5jb25maWd1cmUoeyBwYXJzZXJGb3JUeXBlLCBvcHRpb25zIH0pKTtcbiAgfVxuXG4gIHJlc29sdmVLZXkodmFsdWU6IGFueSk6IGFueSB7XG4gICAgbGV0IGtleSA9IHRoaXMucGFyZW50Py5yZXNvbHZlS2V5KHZhbHVlKSB8fCB7fTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmtleXMpICYmIHRoaXMua2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBrIG9mIHRoaXMua2V5cykge1xuICAgICAgICBsZXQgdiA9IHZhbHVlIGFzIGFueTtcbiAgICAgICAgbGV0IHN0cnVjdHVyZWQgPSB0aGlzIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBvZiBrLm5hbWUuc3BsaXQoJy8nKSkge1xuICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICAgIGZpZWxkID0gc3RydWN0dXJlZC5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdiA9IFR5cGVzLmlzUGxhaW5PYmplY3QodikgPyB2W2ZpZWxkLm5hbWVdIDogdjtcbiAgICAgICAgICAgIHN0cnVjdHVyZWQgPSBmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICAgICAgICAgICAgPyBmaWVsZC5zdHJ1Y3R1cmVkKClcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkICYmIHYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGtleVtrLmFsaWFzIHx8IGZpZWxkLm5hbWVdID0gZmllbGQuZW5jb2RlKHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChUeXBlcy5pc0VtcHR5KGtleSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdHMucmVzb2x2ZUtleShrZXkpO1xuICB9XG5cbiAgZGVmYXVsdHMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMucGFyZW50Py5kZWZhdWx0cygpIHx8IHt9O1xuICAgIGxldCBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoXG4gICAgICAoZikgPT4gZi5kZWZhdWx0ICE9PSB1bmRlZmluZWQgfHwgZi5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIC4uLmZpZWxkcy5yZWR1Y2UoKGFjYywgZikgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBmLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICAgICAgID8gZi5zdHJ1Y3R1cmVkKCkuZGVmYXVsdHMoKVxuICAgICAgICAgIDogZi5kZWZhdWx0O1xuICAgICAgICByZXR1cm4gVHlwZXMuaXNFbXB0eSh2YWx1ZSkgPyBhY2MgOiB7IC4uLmFjYywgW2YubmFtZV06IHZhbHVlIH07XG4gICAgICB9LCB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEpzb24gU2NoZW1hXG4gIHRvSnNvblNjaGVtYShvcHRpb25zOiBKc29uU2NoZW1hT3B0aW9uczxUPiA9IHt9KSB7XG4gICAgbGV0IHNjaGVtYTogYW55ID0gdGhpcy5wYXJlbnQ/LnRvSnNvblNjaGVtYShvcHRpb25zKSB8fCB7XG4gICAgICAkc2NoZW1hOiAnaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjJyxcbiAgICAgICRpZDogYCR7dGhpcy5uYW1lc3BhY2V9LiR7dGhpcy5uYW1lfWAsXG4gICAgICB0aXRsZTogdGhpcy50aXRlbGl6ZShERVNDUklQVElPTiksXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5hbm5vdGF0ZWRWYWx1ZShMT05HX0RFU0NSSVBUSU9OKSxcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge30sXG4gICAgICByZXF1aXJlZDogW10sXG4gICAgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgKCFmLm5hdmlnYXRpb24gfHwgKG9wdGlvbnMuZXhwYW5kICYmIGYubmFtZSBpbiBvcHRpb25zLmV4cGFuZCkpICYmXG4gICAgICAgICghb3B0aW9ucy5zZWxlY3QgfHwgKDxzdHJpbmdbXT5vcHRpb25zLnNlbGVjdCkuaW5kZXhPZihmLm5hbWUpICE9PSAtMSlcbiAgICApO1xuICAgIHNjaGVtYS5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgc2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICBmaWVsZHNcbiAgICAgICAgLm1hcCgoZikgPT4ge1xuICAgICAgICAgIGxldCBleHBhbmQgPVxuICAgICAgICAgICAgb3B0aW9ucy5leHBhbmQgJiYgZi5uYW1lIGluIG9wdGlvbnMuZXhwYW5kXG4gICAgICAgICAgICAgID8gKG9wdGlvbnMuZXhwYW5kIGFzIGFueSlbZi5uYW1lXVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBsZXQgc2NoZW1hID0gZi50b0pzb25TY2hlbWEoZXhwYW5kKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jdXN0b20gJiYgZi5uYW1lIGluIG9wdGlvbnMuY3VzdG9tKVxuICAgICAgICAgICAgc2NoZW1hID0gKFxuICAgICAgICAgICAgICBvcHRpb25zLmN1c3RvbVtmLm5hbWUgYXMga2V5b2YgVF0gYXMgKFxuICAgICAgICAgICAgICAgIHNjaGVtYTogYW55LFxuICAgICAgICAgICAgICAgIGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PlxuICAgICAgICAgICAgICApID0+IGFueVxuICAgICAgICAgICAgKShzY2hlbWEsIGYpO1xuICAgICAgICAgIHJldHVybiB7IFtmLm5hbWVdOiBzY2hlbWEgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCB2KSA9PiBPYmplY3QuYXNzaWduKGFjYywgdiksIHt9KVxuICAgICk7XG4gICAgc2NoZW1hLnJlcXVpcmVkID0gW1xuICAgICAgLi4uc2NoZW1hLnJlcXVpcmVkLFxuICAgICAgLi4uZmllbGRzXG4gICAgICAgIC5maWx0ZXIoKGYpID0+XG4gICAgICAgICAgb3B0aW9ucy5yZXF1aXJlZCAmJiBmLm5hbWUgaW4gb3B0aW9ucy5yZXF1aXJlZFxuICAgICAgICAgICAgPyBvcHRpb25zLnJlcXVpcmVkW2YubmFtZSBhcyBrZXlvZiBUXVxuICAgICAgICAgICAgOiAhZi5udWxsYWJsZVxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGYpID0+IGYubmFtZSksXG4gICAgXTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgYXR0cnM6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgY3JlYXRlPzogYm9vbGVhbjtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXJyb3JzID0gKHRoaXMucGFyZW50Py52YWxpZGF0ZShhdHRycywgeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgfHxcbiAgICAgIHt9KSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoKGYpID0+ICFmLm5hdmlnYXRpb24gfHwgbmF2aWdhdGlvbik7XG4gICAgZm9yICh2YXIgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF0dHJzW2ZpZWxkLm5hbWUgYXMga2V5b2YgVF07XG4gICAgICBjb25zdCBlcnJzID0gZmllbGQudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICAgICAgaWYgKGVycnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcnNbZmllbGQubmFtZV0gPSBlcnJzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -1,52 +0,0 @@
1
- import { OData } from '../utils/odata';
2
- import { ODataAnnotatable } from './base';
3
- import { ODataCallable } from './callable';
4
- import { ODataEntityContainer } from './entity-container';
5
- import { ODataEnumType } from './enum-type';
6
- import { ODataStructuredType } from './structured-type';
7
- export class ODataSchema extends ODataAnnotatable {
8
- constructor(config, api) {
9
- super(config);
10
- this.api = api;
11
- this.namespace = config.namespace;
12
- this.alias = config.alias;
13
- this.enums = (config.enums || []).map((config) => new ODataEnumType(config, this));
14
- this.entities = (config.entities || []).map((config) => new ODataStructuredType(config, this));
15
- this.callables = OData.mergeCallableParameters(config.callables || []).map((config) => new ODataCallable(config, this));
16
- this.containers = (config.containers || []).map((config) => new ODataEntityContainer(config, this));
17
- }
18
- isNamespaceOf(type) {
19
- return (type.startsWith(this.namespace) ||
20
- (this.alias && type.startsWith(this.alias)));
21
- }
22
- get entitySets() {
23
- return this.containers.reduce((acc, container) => [...acc, ...container.entitySets], []);
24
- }
25
- //#region Find for Type
26
- findEnumTypeForType(type) {
27
- return this.enums.find((e) => e.isTypeOf(type));
28
- }
29
- findStructuredTypeForType(type) {
30
- return this.entities.find((e) => e.isTypeOf(type));
31
- }
32
- findCallableForType(type, bindingType) {
33
- return this.callables.find((c) => {
34
- var _a;
35
- return c.isTypeOf(type) &&
36
- (bindingType === undefined || bindingType === ((_a = c.binding()) === null || _a === void 0 ? void 0 : _a.type));
37
- });
38
- }
39
- findEntitySetForType(type) {
40
- return this.entitySets.find((e) => e.isTypeOf(type));
41
- }
42
- //#endregion
43
- configure({ parserForType, findOptionsForType, }) {
44
- // Configure Enums
45
- this.enums.forEach((enu) => enu.configure());
46
- // Configure Entities
47
- this.entities.forEach((config) => config.configure({ parserForType, findOptionsForType }));
48
- // Configure callables
49
- this.callables.forEach((callable) => callable.configure({ parserForType }));
50
- }
51
- }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBbUIsTUFBTSxRQUFRLENBQUM7QUFFM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhELE1BQU0sT0FBTyxXQUFZLFNBQVEsZ0JBQWdCO0lBUy9DLFlBQVksTUFBb0IsRUFBRSxHQUFhO1FBQzdDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQ25DLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQzVDLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQ3pDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJ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O0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYXJzZXIsIFNjaGVtYUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgT0RhdGEgfSBmcm9tICcuLi91dGlscy9vZGF0YSc7XG5pbXBvcnQgeyBPRGF0YUFubm90YXRhYmxlLCBPRGF0YUFubm90YXRpb24gfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgT0RhdGFBcGkgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHsgT0RhdGFDYWxsYWJsZSB9IGZyb20gJy4vY2FsbGFibGUnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlDb250YWluZXIgfSBmcm9tICcuL2VudGl0eS1jb250YWluZXInO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlTZXQgfSBmcm9tICcuL2VudGl0eS1zZXQnO1xuaW1wb3J0IHsgT0RhdGFFbnVtVHlwZSB9IGZyb20gJy4vZW51bS10eXBlJztcbmltcG9ydCB7IE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuL3N0cnVjdHVyZWQtdHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVNjaGVtYSBleHRlbmRzIE9EYXRhQW5ub3RhdGFibGUge1xuICBhcGk6IE9EYXRhQXBpO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGVudW1zOiBPRGF0YUVudW1UeXBlPGFueT5bXTtcbiAgZW50aXRpZXM6IE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PltdO1xuICBjYWxsYWJsZXM6IE9EYXRhQ2FsbGFibGU8YW55PltdO1xuICBjb250YWluZXJzOiBPRGF0YUVudGl0eUNvbnRhaW5lcltdO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2NoZW1hQ29uZmlnLCBhcGk6IE9EYXRhQXBpKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLmFwaSA9IGFwaTtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IGNvbmZpZy5uYW1lc3BhY2U7XG4gICAgdGhpcy5hbGlhcyA9IGNvbmZpZy5hbGlhcztcbiAgICB0aGlzLmVudW1zID0gKGNvbmZpZy5lbnVtcyB8fCBbXSkubWFwKFxuICAgICAgKGNvbmZpZykgPT4gbmV3IE9EYXRhRW51bVR5cGUoY29uZmlnLCB0aGlzKVxuICAgICk7XG4gICAgdGhpcy5lbnRpdGllcyA9IChjb25maWcuZW50aXRpZXMgfHwgW10pLm1hcChcbiAgICAgIChjb25maWcpID0+IG5ldyBPRGF0YVN0cnVjdHVyZWRUeXBlKGNvbmZpZywgdGhpcylcbiAgICApO1xuICAgIHRoaXMuY2FsbGFibGVzID0gT0RhdGEubWVyZ2VDYWxsYWJsZVBhcmFtZXRlcnMoY29uZmlnLmNhbGxhYmxlcyB8fCBbXSkubWFwKFxuICAgICAgKGNvbmZpZykgPT4gbmV3IE9EYXRhQ2FsbGFibGUoY29uZmlnLCB0aGlzKVxuICAgICk7XG4gICAgdGhpcy5jb250YWluZXJzID0gKGNvbmZpZy5jb250YWluZXJzIHx8IFtdKS5tYXAoXG4gICAgICAoY29uZmlnKSA9PiBuZXcgT0RhdGFFbnRpdHlDb250YWluZXIoY29uZmlnLCB0aGlzKVxuICAgICk7XG4gIH1cblxuICBpc05hbWVzcGFjZU9mKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlLnN0YXJ0c1dpdGgodGhpcy5uYW1lc3BhY2UpIHx8XG4gICAgICAodGhpcy5hbGlhcyAmJiB0eXBlLnN0YXJ0c1dpdGgodGhpcy5hbGlhcykpXG4gICAgKTtcbiAgfVxuXG4gIGdldCBlbnRpdHlTZXRzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcnMucmVkdWNlKFxuICAgICAgKGFjYywgY29udGFpbmVyKSA9PiBbLi4uYWNjLCAuLi5jb250YWluZXIuZW50aXR5U2V0c10sXG4gICAgICBbXSBhcyBPRGF0YUVudGl0eVNldFtdXG4gICAgKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBGaW5kIGZvciBUeXBlXG4gIHB1YmxpYyBmaW5kRW51bVR5cGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVudW1zLmZpbmQoKGUpID0+IGUuaXNUeXBlT2YodHlwZSkpIGFzXG4gICAgICB8IE9EYXRhRW51bVR5cGU8VD5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50aXRpZXMuZmluZCgoZSkgPT4gZS5pc1R5cGVPZih0eXBlKSkgYXNcbiAgICAgIHwgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZmluZENhbGxhYmxlRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcsIGJpbmRpbmdUeXBlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbGFibGVzLmZpbmQoXG4gICAgICAoYykgPT5cbiAgICAgICAgYy5pc1R5cGVPZih0eXBlKSAmJlxuICAgICAgICAoYmluZGluZ1R5cGUgPT09IHVuZGVmaW5lZCB8fCBiaW5kaW5nVHlwZSA9PT0gYy5iaW5kaW5nKCk/LnR5cGUpXG4gICAgKSBhcyBPRGF0YUNhbGxhYmxlPFQ+IHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnRpdHlTZXRGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVudGl0eVNldHMuZmluZCgoZSkgPT4gZS5pc1R5cGVPZih0eXBlKSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgY29uZmlndXJlKHtcbiAgICBwYXJzZXJGb3JUeXBlLFxuICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgfToge1xuICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IFBhcnNlcjxhbnk+O1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gYW55O1xuICB9KSB7XG4gICAgLy8gQ29uZmlndXJlIEVudW1zXG4gICAgdGhpcy5lbnVtcy5mb3JFYWNoKChlbnUpID0+IGVudS5jb25maWd1cmUoKSk7XG4gICAgLy8gQ29uZmlndXJlIEVudGl0aWVzXG4gICAgdGhpcy5lbnRpdGllcy5mb3JFYWNoKChjb25maWcpID0+XG4gICAgICBjb25maWcuY29uZmlndXJlKHsgcGFyc2VyRm9yVHlwZSwgZmluZE9wdGlvbnNGb3JUeXBlIH0pXG4gICAgKTtcbiAgICAvLyBDb25maWd1cmUgY2FsbGFibGVzXG4gICAgdGhpcy5jYWxsYWJsZXMuZm9yRWFjaCgoY2FsbGFibGUpID0+IGNhbGxhYmxlLmNvbmZpZ3VyZSh7IHBhcnNlckZvclR5cGUgfSkpO1xuICB9XG59XG4iXX0=