angular-odata 0.78.1 → 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 (224) hide show
  1. package/README.md +133 -62
  2. package/{esm2015/angular-odata.js → esm2020/angular-odata.mjs} +0 -0
  3. package/esm2020/lib/api.mjs +303 -0
  4. package/{esm2015/lib/cache/cache.js → esm2020/lib/cache/cache.mjs} +12 -5
  5. package/{esm2015/lib/cache/index.js → esm2020/lib/cache/index.mjs} +0 -0
  6. package/{esm2015/lib/cache/memory.js → esm2020/lib/cache/memory.mjs} +0 -0
  7. package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +1 -1
  8. package/esm2020/lib/client.mjs +271 -0
  9. package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +9 -3
  10. package/esm2020/lib/helper.mjs +268 -0
  11. package/esm2020/lib/index.mjs +19 -0
  12. package/esm2020/lib/models/collection.mjs +741 -0
  13. package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
  14. package/esm2020/lib/models/model.mjs +453 -0
  15. package/esm2020/lib/models/options.mjs +945 -0
  16. package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +6 -6
  17. package/esm2020/lib/options.mjs +32 -0
  18. package/esm2020/lib/resources/index.mjs +7 -0
  19. package/esm2020/lib/resources/path/handlers.mjs +69 -0
  20. package/esm2020/lib/resources/path/index.mjs +3 -0
  21. package/esm2020/lib/resources/path/segments.mjs +124 -0
  22. package/esm2020/lib/resources/query/builder.mjs +590 -0
  23. package/esm2020/lib/resources/query/expressions.mjs +207 -0
  24. package/esm2020/lib/resources/query/handlers.mjs +186 -0
  25. package/esm2020/lib/resources/query/index.mjs +4 -0
  26. package/esm2020/lib/resources/query/options.mjs +103 -0
  27. package/esm2020/lib/resources/query/syntax.mjs +406 -0
  28. package/esm2020/lib/resources/request.mjs +167 -0
  29. package/esm2020/lib/resources/resource.mjs +326 -0
  30. package/esm2020/lib/resources/responses/annotations.mjs +119 -0
  31. package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
  32. package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
  33. package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
  34. package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
  35. package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
  36. package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
  37. package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
  38. package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
  39. package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
  40. package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
  41. package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
  42. package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
  43. package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
  44. package/esm2020/lib/resources/responses/metadata.mjs +547 -0
  45. package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +1 -1
  46. package/esm2020/lib/resources/responses/response.mjs +170 -0
  47. package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +1 -1
  48. package/esm2020/lib/resources/types/action.mjs +101 -0
  49. package/esm2020/lib/resources/types/batch.mjs +288 -0
  50. package/esm2020/lib/resources/types/count.mjs +27 -0
  51. package/esm2020/lib/resources/types/entity-set.mjs +94 -0
  52. package/esm2020/lib/resources/types/entity.mjs +106 -0
  53. package/esm2020/lib/resources/types/function.mjs +137 -0
  54. package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
  55. package/esm2020/lib/resources/types/media.mjs +41 -0
  56. package/esm2020/lib/resources/types/metadata.mjs +30 -0
  57. package/esm2020/lib/resources/types/navigation-property.mjs +226 -0
  58. package/esm2020/lib/resources/types/options.mjs +2 -0
  59. package/esm2020/lib/resources/types/property.mjs +183 -0
  60. package/esm2020/lib/resources/types/reference.mjs +85 -0
  61. package/esm2020/lib/resources/types/singleton.mjs +126 -0
  62. package/esm2020/lib/resources/types/value.mjs +41 -0
  63. package/esm2020/lib/schema/annotation.mjs +37 -0
  64. package/esm2020/lib/schema/callable.mjs +62 -0
  65. package/esm2020/lib/schema/element.mjs +51 -0
  66. package/esm2020/lib/schema/entity-container.mjs +9 -0
  67. package/esm2020/lib/schema/entity-set.mjs +9 -0
  68. package/esm2020/lib/schema/enum-type.mjs +71 -0
  69. package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +2 -1
  70. package/esm2020/lib/schema/parsers/callable.mjs +113 -0
  71. package/esm2020/lib/schema/parsers/edm.mjs +95 -0
  72. package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
  73. package/esm2020/lib/schema/parsers/index.mjs +5 -0
  74. package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
  75. package/esm2020/lib/schema/schema.mjs +61 -0
  76. package/esm2020/lib/schema/structured-type.mjs +198 -0
  77. package/esm2020/lib/services/base.mjs +29 -0
  78. package/esm2020/lib/services/entity-set.mjs +143 -0
  79. package/esm2020/lib/services/entity.mjs +12 -0
  80. package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
  81. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  82. package/esm2020/lib/services/singleton.mjs +48 -0
  83. package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
  84. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  85. package/esm2020/lib/types.mjs +37 -0
  86. package/esm2020/lib/utils/arraybuffers.mjs +46 -0
  87. package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
  88. package/esm2020/lib/utils/durations.mjs +40 -0
  89. package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
  90. package/esm2020/lib/utils/http.mjs +93 -0
  91. package/esm2020/lib/utils/index.mjs +10 -0
  92. package/esm2020/lib/utils/objects.mjs +195 -0
  93. package/esm2020/lib/utils/odata.mjs +22 -0
  94. package/esm2020/lib/utils/strings.mjs +20 -0
  95. package/esm2020/lib/utils/types.mjs +134 -0
  96. package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
  97. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  98. package/fesm2015/{angular-odata.js → angular-odata.mjs} +5068 -3943
  99. package/fesm2015/angular-odata.mjs.map +1 -0
  100. package/fesm2020/angular-odata.mjs +10274 -0
  101. package/fesm2020/angular-odata.mjs.map +1 -0
  102. package/lib/api.d.ts +17 -16
  103. package/lib/cache/cache.d.ts +2 -2
  104. package/lib/client.d.ts +93 -18
  105. package/lib/constants.d.ts +6 -2
  106. package/lib/helper.d.ts +3 -3
  107. package/lib/index.d.ts +0 -1
  108. package/lib/models/collection.d.ts +36 -47
  109. package/lib/models/model.d.ts +47 -40
  110. package/lib/models/options.d.ts +53 -52
  111. package/lib/options.d.ts +50 -2
  112. package/lib/resources/index.d.ts +2 -3
  113. package/lib/resources/path/handlers.d.ts +27 -0
  114. package/lib/resources/path/index.d.ts +2 -0
  115. package/lib/resources/{path-segments.d.ts → path/segments.d.ts} +4 -16
  116. package/lib/resources/{builder.d.ts → query/builder.d.ts} +12 -7
  117. package/lib/resources/query/expressions.d.ts +63 -0
  118. package/lib/resources/query/handlers.d.ts +89 -0
  119. package/lib/resources/query/index.d.ts +3 -0
  120. package/lib/resources/query/options.d.ts +38 -0
  121. package/lib/resources/query/syntax.d.ts +175 -0
  122. package/lib/resources/request.d.ts +8 -6
  123. package/lib/resources/resource.d.ts +49 -55
  124. package/lib/resources/responses/metadata.d.ts +1 -1
  125. package/lib/resources/responses/types.d.ts +1 -1
  126. package/lib/resources/types/action.d.ts +55 -69
  127. package/lib/resources/types/batch.d.ts +13 -8
  128. package/lib/resources/types/count.d.ts +16 -19
  129. package/lib/resources/types/entity-set.d.ts +24 -62
  130. package/lib/resources/types/entity.d.ts +35 -43
  131. package/lib/resources/types/function.d.ts +63 -71
  132. package/lib/resources/types/media.d.ts +20 -22
  133. package/lib/resources/types/metadata.d.ts +5 -7
  134. package/lib/resources/types/navigation-property.d.ts +100 -85
  135. package/lib/resources/types/options.d.ts +8 -8
  136. package/lib/resources/types/property.d.ts +63 -73
  137. package/lib/resources/types/reference.d.ts +72 -16
  138. package/lib/resources/types/singleton.d.ts +75 -43
  139. package/lib/resources/types/value.d.ts +18 -9
  140. package/lib/schema/annotation.d.ts +18 -0
  141. package/lib/schema/callable.d.ts +27 -11
  142. package/lib/schema/element.d.ts +39 -0
  143. package/lib/schema/entity-container.d.ts +3 -8
  144. package/lib/schema/entity-set.d.ts +3 -9
  145. package/lib/schema/enum-type.d.ts +41 -14
  146. package/lib/schema/index.d.ts +1 -0
  147. package/lib/{parsers → schema/parsers}/callable.d.ts +2 -2
  148. package/lib/schema/parsers/edm.d.ts +4 -0
  149. package/lib/{parsers → schema/parsers}/enum-type.d.ts +13 -7
  150. package/lib/{parsers → schema/parsers}/index.d.ts +0 -0
  151. package/lib/{parsers → schema/parsers}/structured-type.d.ts +14 -9
  152. package/lib/schema/schema.d.ts +6 -8
  153. package/lib/schema/structured-type.d.ts +97 -18
  154. package/lib/services/base.d.ts +12 -12
  155. package/lib/services/entity-set.d.ts +15 -12
  156. package/lib/services/entity.d.ts +4 -1
  157. package/lib/services/singleton.d.ts +6 -3
  158. package/lib/settings.d.ts +4 -4
  159. package/lib/types.d.ts +7 -3
  160. package/lib/utils/arraybuffers.d.ts +4 -0
  161. package/lib/{parsers/edm.d.ts → utils/durations.d.ts} +3 -3
  162. package/lib/utils/http.d.ts +9 -0
  163. package/lib/utils/index.d.ts +5 -2
  164. package/lib/utils/objects.d.ts +1 -1
  165. package/lib/utils/strings.d.ts +4 -0
  166. package/lib/utils/types.d.ts +2 -0
  167. package/package.json +21 -8
  168. package/bundles/angular-odata.umd.js +0 -10756
  169. package/bundles/angular-odata.umd.js.map +0 -1
  170. package/esm2015/lib/api.js +0 -251
  171. package/esm2015/lib/client.js +0 -197
  172. package/esm2015/lib/helper.js +0 -269
  173. package/esm2015/lib/index.js +0 -21
  174. package/esm2015/lib/models/collection.js +0 -660
  175. package/esm2015/lib/models/model.js +0 -421
  176. package/esm2015/lib/models/options.js +0 -889
  177. package/esm2015/lib/options.js +0 -31
  178. package/esm2015/lib/parsers/callable.js +0 -110
  179. package/esm2015/lib/parsers/edm.js +0 -310
  180. package/esm2015/lib/parsers/enum-type.js +0 -97
  181. package/esm2015/lib/parsers/index.js +0 -5
  182. package/esm2015/lib/parsers/structured-type.js +0 -394
  183. package/esm2015/lib/resources/builder.js +0 -537
  184. package/esm2015/lib/resources/index.js +0 -8
  185. package/esm2015/lib/resources/path-segments.js +0 -156
  186. package/esm2015/lib/resources/query-options.js +0 -157
  187. package/esm2015/lib/resources/request.js +0 -141
  188. package/esm2015/lib/resources/resource.js +0 -328
  189. package/esm2015/lib/resources/responses/annotations.js +0 -121
  190. package/esm2015/lib/resources/responses/metadata.js +0 -548
  191. package/esm2015/lib/resources/responses/response.js +0 -170
  192. package/esm2015/lib/resources/types/action.js +0 -146
  193. package/esm2015/lib/resources/types/batch.js +0 -330
  194. package/esm2015/lib/resources/types/count.js +0 -50
  195. package/esm2015/lib/resources/types/entity-set.js +0 -164
  196. package/esm2015/lib/resources/types/entity.js +0 -158
  197. package/esm2015/lib/resources/types/function.js +0 -166
  198. package/esm2015/lib/resources/types/media.js +0 -46
  199. package/esm2015/lib/resources/types/metadata.js +0 -36
  200. package/esm2015/lib/resources/types/navigation-property.js +0 -214
  201. package/esm2015/lib/resources/types/options.js +0 -2
  202. package/esm2015/lib/resources/types/property.js +0 -190
  203. package/esm2015/lib/resources/types/reference.js +0 -50
  204. package/esm2015/lib/resources/types/singleton.js +0 -147
  205. package/esm2015/lib/resources/types/value.js +0 -30
  206. package/esm2015/lib/schema/annotation.js +0 -7
  207. package/esm2015/lib/schema/callable.js +0 -50
  208. package/esm2015/lib/schema/entity-container.js +0 -17
  209. package/esm2015/lib/schema/entity-set.js +0 -23
  210. package/esm2015/lib/schema/enum-type.js +0 -68
  211. package/esm2015/lib/schema/schema.js +0 -55
  212. package/esm2015/lib/schema/structured-type.js +0 -107
  213. package/esm2015/lib/services/base.js +0 -23
  214. package/esm2015/lib/services/entity-set.js +0 -143
  215. package/esm2015/lib/services/entity.js +0 -10
  216. package/esm2015/lib/services/singleton.js +0 -46
  217. package/esm2015/lib/types.js +0 -37
  218. package/esm2015/lib/utils/http.js +0 -59
  219. package/esm2015/lib/utils/index.js +0 -7
  220. package/esm2015/lib/utils/objects.js +0 -140
  221. package/esm2015/lib/utils/odata.js +0 -21
  222. package/esm2015/lib/utils/types.js +0 -103
  223. package/fesm2015/angular-odata.js.map +0 -1
  224. package/lib/resources/query-options.d.ts +0 -57
@@ -1,97 +0,0 @@
1
- import { Enums } from '../utils';
2
- import { raw } from '../resources/builder';
3
- import { ODataAnnotation } from '../schema/annotation';
4
- import { ODataParserOptions } from '../options';
5
- export class ODataEnumTypeFieldParser {
6
- constructor(name, field) {
7
- this.name = name;
8
- this.value = field.value;
9
- this.annotations = (field.annotations || []).map((annot) => new ODataAnnotation(annot));
10
- }
11
- findAnnotation(predicate) {
12
- return this.annotations.find(predicate);
13
- }
14
- }
15
- export class ODataEnumTypeParser {
16
- constructor(config, namespace, alias) {
17
- this.name = config.name;
18
- this.namespace = namespace;
19
- this.alias = alias;
20
- this.flags = config.flags;
21
- this.members = config.members;
22
- this.fields = Object.entries(config.fields).map(([name, f]) => new ODataEnumTypeFieldParser(name, f));
23
- }
24
- configure({ options }) {
25
- this.optionsHelper = options;
26
- }
27
- isTypeOf(type) {
28
- var names = [`${this.namespace}.${this.name}`];
29
- if (this.alias)
30
- names.push(`${this.alias}.${this.name}`);
31
- return names.indexOf(type) !== -1;
32
- }
33
- // Deserialize
34
- deserialize(value, options) {
35
- // string -> number
36
- const parserOptions = options !== undefined
37
- ? new ODataParserOptions(options)
38
- : this.optionsHelper;
39
- if (this.flags) {
40
- return Enums.toValues(this.members, value).reduce((acc, v) => acc | v, 0);
41
- }
42
- else {
43
- return Enums.toValue(this.members, value);
44
- }
45
- }
46
- // Serialize
47
- serialize(value, options) {
48
- // Enum are string | number
49
- // string | number -> string
50
- const parserOptions = options !== undefined
51
- ? new ODataParserOptions(options)
52
- : this.optionsHelper;
53
- if (this.flags) {
54
- const names = Enums.toNames(this.members, value);
55
- return !(parserOptions === null || parserOptions === void 0 ? void 0 : parserOptions.stringAsEnum)
56
- ? `${this.namespace}.${this.name}'${names.join(', ')}'`
57
- : names.join(', ');
58
- }
59
- else {
60
- const name = Enums.toName(this.members, value);
61
- return !(parserOptions === null || parserOptions === void 0 ? void 0 : parserOptions.stringAsEnum)
62
- ? `${this.namespace}.${this.name}'${name}'`
63
- : name;
64
- }
65
- }
66
- //Encode
67
- encode(value, options) {
68
- const parserOptions = options !== undefined
69
- ? new ODataParserOptions(options)
70
- : this.optionsHelper;
71
- const serialized = this.serialize(value, parserOptions);
72
- return (parserOptions === null || parserOptions === void 0 ? void 0 : parserOptions.stringAsEnum)
73
- ? raw(`'${serialized}'`)
74
- : raw(serialized);
75
- }
76
- // Json Schema
77
- toJsonSchema() {
78
- let property = {
79
- title: this.name,
80
- type: 'string',
81
- };
82
- property.enum = this.fields.map((f) => f.name);
83
- return property;
84
- }
85
- validate(member, { method, navigation = false, } = {}) {
86
- if (this.flags) {
87
- let members = Enums.toValues(this.members, member);
88
- return members.some((member) => !(member in this.members))
89
- ? ['mismatch']
90
- : undefined;
91
- }
92
- else {
93
- return !(member in this.members) ? ['mismatch'] : undefined;
94
- }
95
- }
96
- }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3BhcnNlcnMvZW51bS10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVF2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFaEQsTUFBTSxPQUFPLHdCQUF3QjtJQUtuQyxZQUFZLElBQVksRUFBRSxLQUEwQjtRQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUM5QyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQsY0FBYyxDQUFDLFNBQThDO1FBQzNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLG1CQUFtQjtJQVM5QixZQUFZLE1BQXlCLEVBQUUsU0FBaUIsRUFBRSxLQUFjO1FBQ3RFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFH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eEQsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO2dCQUNkLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDZjthQUFNO1lBQ0wsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW51bXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyByYXcgfSBmcm9tICcuLi9yZXNvdXJjZXMvYnVpbGRlcic7XG5pbXBvcnQgeyBPRGF0YUFubm90YXRpb24gfSBmcm9tICcuLi9zY2hlbWEvYW5ub3RhdGlvbic7XG5pbXBvcnQge1xuICBFbnVtVHlwZUNvbmZpZyxcbiAgUGFyc2VyLFxuICBPcHRpb25zSGVscGVyLFxuICBFbnVtVHlwZUZpZWxkQ29uZmlnLFxuICBPcHRpb25zLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YVBhcnNlck9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIE9EYXRhRW51bVR5cGVGaWVsZFBhcnNlciB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlcjtcbiAgYW5ub3RhdGlvbnM6IE9EYXRhQW5ub3RhdGlvbltdO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgZmllbGQ6IEVudW1UeXBlRmllbGRDb25maWcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmFsdWUgPSBmaWVsZC52YWx1ZTtcbiAgICB0aGlzLmFubm90YXRpb25zID0gKGZpZWxkLmFubm90YXRpb25zIHx8IFtdKS5tYXAoXG4gICAgICAoYW5ub3QpID0+IG5ldyBPRGF0YUFubm90YXRpb24oYW5ub3QpXG4gICAgKTtcbiAgfVxuXG4gIGZpbmRBbm5vdGF0aW9uKHByZWRpY2F0ZTogKGFubm90OiBPRGF0YUFubm90YXRpb24pID0+IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhRW51bVR5cGVQYXJzZXI8VD4gaW1wbGVtZW50cyBQYXJzZXI8VD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgZmxhZ3M/OiBib29sZWFuO1xuICBtZW1iZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfSB8IHsgW3ZhbHVlOiBudW1iZXJdOiBzdHJpbmcgfTtcbiAgZmllbGRzOiBPRGF0YUVudW1UeXBlRmllbGRQYXJzZXJbXTtcbiAgb3B0aW9uc0hlbHBlcj86IE9wdGlvbnNIZWxwZXI7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBFbnVtVHlwZUNvbmZpZzxUPiwgbmFtZXNwYWNlOiBzdHJpbmcsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICAgIHRoaXMuZmxhZ3MgPSBjb25maWcuZmxhZ3M7XG4gICAgdGhpcy5tZW1iZXJzID0gY29uZmlnLm1lbWJlcnM7XG4gICAgdGhpcy5maWVsZHMgPSBPYmplY3QuZW50cmllcyhjb25maWcuZmllbGRzKS5tYXAoXG4gICAgICAoW25hbWUsIGZdKSA9PiBuZXcgT0RhdGFFbnVtVHlwZUZpZWxkUGFyc2VyKG5hbWUsIGYpXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7IG9wdGlvbnMgfTogeyBvcHRpb25zOiBPcHRpb25zSGVscGVyIH0pIHtcbiAgICB0aGlzLm9wdGlvbnNIZWxwZXIgPSBvcHRpb25zO1xuICB9XG5cbiAgaXNUeXBlT2YodHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIG5hbWVzID0gW2Ake3RoaXMubmFtZXNwYWNlfS4ke3RoaXMubmFtZX1gXTtcbiAgICBpZiAodGhpcy5hbGlhcykgbmFtZXMucHVzaChgJHt0aGlzLmFsaWFzfS4ke3RoaXMubmFtZX1gKTtcbiAgICByZXR1cm4gbmFtZXMuaW5kZXhPZih0eXBlKSAhPT0gLTE7XG4gIH1cblxuICAvLyBEZXNlcmlhbGl6ZVxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogT3B0aW9ucyk6IFQge1xuICAgIC8vIHN0cmluZyAtPiBudW1iZXJcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgaWYgKHRoaXMuZmxhZ3MpIHtcbiAgICAgIHJldHVybiBFbnVtcy50b1ZhbHVlcyh0aGlzLm1lbWJlcnMsIHZhbHVlKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHYpID0+IGFjYyB8IHYsXG4gICAgICAgIDBcbiAgICAgICkgYXMgYW55O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRW51bXMudG9WYWx1ZSh0aGlzLm1lbWJlcnMsIHZhbHVlKSBhcyBhbnk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VyaWFsaXplXG4gIHNlcmlhbGl6ZSh2YWx1ZTogVCwgb3B0aW9ucz86IE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIC8vIEVudW0gYXJlIHN0cmluZyB8IG51bWJlclxuICAgIC8vIHN0cmluZyB8IG51bWJlciAtPiBzdHJpbmdcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgaWYgKHRoaXMuZmxhZ3MpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gRW51bXMudG9OYW1lcyh0aGlzLm1lbWJlcnMsIHZhbHVlKTtcbiAgICAgIHJldHVybiAhcGFyc2VyT3B0aW9ucz8uc3RyaW5nQXNFbnVtXG4gICAgICAgID8gYCR7dGhpcy5uYW1lc3BhY2V9LiR7dGhpcy5uYW1lfScke25hbWVzLmpvaW4oJywgJyl9J2BcbiAgICAgICAgOiBuYW1lcy5qb2luKCcsICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuYW1lID0gRW51bXMudG9OYW1lKHRoaXMubWVtYmVycywgdmFsdWUpO1xuICAgICAgcmV0dXJuICFwYXJzZXJPcHRpb25zPy5zdHJpbmdBc0VudW1cbiAgICAgICAgPyBgJHt0aGlzLm5hbWVzcGFjZX0uJHt0aGlzLm5hbWV9JyR7bmFtZX0nYFxuICAgICAgICA6IG5hbWU7XG4gICAgfVxuICB9XG5cbiAgLy9FbmNvZGVcbiAgZW5jb2RlKHZhbHVlOiBULCBvcHRpb25zPzogT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5vcHRpb25zSGVscGVyO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gICAgcmV0dXJuIHBhcnNlck9wdGlvbnM/LnN0cmluZ0FzRW51bVxuICAgICAgPyByYXcoYCcke3NlcmlhbGl6ZWR9J2ApXG4gICAgICA6IHJhdyhzZXJpYWxpemVkKTtcbiAgfVxuXG4gIC8vIEpzb24gU2NoZW1hXG4gIHRvSnNvblNjaGVtYSgpIHtcbiAgICBsZXQgcHJvcGVydHkgPSA8YW55PntcbiAgICAgIHRpdGxlOiB0aGlzLm5hbWUsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9O1xuICAgIHByb3BlcnR5LmVudW0gPSB0aGlzLmZpZWxkcy5tYXAoKGYpID0+IGYubmFtZSk7XG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgbWVtYmVyOiBzdHJpbmcgfCBudW1iZXIsXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAncGF0Y2gnO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5mbGFncykge1xuICAgICAgbGV0IG1lbWJlcnMgPSBFbnVtcy50b1ZhbHVlcyh0aGlzLm1lbWJlcnMsIG1lbWJlcik7XG4gICAgICByZXR1cm4gbWVtYmVycy5zb21lKChtZW1iZXIpID0+ICEobWVtYmVyIGluIHRoaXMubWVtYmVycykpXG4gICAgICAgID8gWydtaXNtYXRjaCddXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIShtZW1iZXIgaW4gdGhpcy5tZW1iZXJzKSA/IFsnbWlzbWF0Y2gnXSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,5 +0,0 @@
1
- export * from './edm';
2
- export * from './enum-type';
3
- export * from './structured-type';
4
- export * from './callable';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcGFyc2Vycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLE9BQU8sQ0FBQztBQUN0QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9lZG0nO1xuZXhwb3J0ICogZnJvbSAnLi9lbnVtLXR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJ1Y3R1cmVkLXR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWxsYWJsZSc7XG4iXX0=
@@ -1,394 +0,0 @@
1
- import { Objects, Types } from '../utils';
2
- import { NONE_PARSER, } from '../types';
3
- import { ODataEnumTypeParser } from './enum-type';
4
- import { COMPUTED } from '../constants';
5
- import { ODataAnnotation } from '../schema/annotation';
6
- import { raw } from '../resources/builder';
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 {
21
- constructor(name, structuredType, field) {
22
- this.name = name;
23
- this.structuredType = structuredType;
24
- this.type = field.type;
25
- this.parser = NONE_PARSER;
26
- this.annotations = (field.annotations || []).map((annot) => new ODataAnnotation(annot));
27
- this.referentials = (field.referentials || []).map((referential) => new ODataReferential(referential));
28
- this.default = field.default;
29
- this.maxLength = field.maxLength;
30
- this.collection = field.collection !== undefined ? field.collection : false;
31
- this.nullable = field.nullable !== undefined ? field.nullable : true;
32
- this.navigation = field.navigation !== undefined ? field.navigation : false;
33
- this.precision = field.precision;
34
- this.scale = field.scale;
35
- }
36
- findAnnotation(predicate) {
37
- return this.annotations.find(predicate);
38
- }
39
- validate(value, { method, navigation = false, } = {}) {
40
- let errors;
41
- if (this.collection && Array.isArray(value)) {
42
- errors = value.map((v) => this.validate(v, { method, navigation }));
43
- }
44
- else if ((this.isStructuredType() &&
45
- typeof value === 'object' &&
46
- value !== null) ||
47
- (this.navigation && value !== undefined)) {
48
- errors =
49
- this.structured().validate(value, { method, navigation }) ||
50
- {};
51
- }
52
- else if (this.isEnumType() &&
53
- (typeof value === 'string' || typeof value === 'number')) {
54
- errors = this.enum().validate(value, { method, navigation });
55
- }
56
- else {
57
- // IsEdmType
58
- const computed = this.findAnnotation((a) => a.term === COMPUTED);
59
- errors = [];
60
- if (!this.nullable &&
61
- (value === null || (value === undefined && method !== 'patch')) && // Is null or undefined without patch?
62
- !((computed === null || computed === void 0 ? void 0 : computed.bool) && method === 'create') // Not (Is Computed field and create) ?
63
- ) {
64
- errors.push(`required`);
65
- }
66
- if (this.maxLength !== undefined &&
67
- typeof value === 'string' &&
68
- value.length > this.maxLength) {
69
- errors.push(`maxlength`);
70
- }
71
- }
72
- return !Types.isEmpty(errors) ? errors : undefined;
73
- }
74
- //#region Deserialize
75
- parse(parser, value, options) {
76
- const type = Types.isPlainObject(value)
77
- ? options === null || options === void 0 ? void 0 : options.helper.type(value)
78
- : undefined;
79
- if (type !== undefined) {
80
- return parser
81
- .childParser((c) => c.isTypeOf(type))
82
- .deserialize(value, options);
83
- }
84
- return parser.deserialize(value, options);
85
- }
86
- deserialize(value, options) {
87
- const parserOptions = options !== undefined
88
- ? new ODataParserOptions(options)
89
- : this.optionsHelper;
90
- if (this.parser instanceof ODataStructuredTypeParser) {
91
- const parser = this.parser;
92
- return Array.isArray(value)
93
- ? value.map((v) => this.parse(parser, v, parserOptions))
94
- : this.parse(parser, value, parserOptions);
95
- }
96
- return this.parser.deserialize(value, Object.assign({ field: this }, parserOptions));
97
- }
98
- //#endregion
99
- //#region Serialize
100
- toJson(parser, value, options) {
101
- const type = Types.isPlainObject(value)
102
- ? options === null || options === void 0 ? void 0 : options.helper.type(value)
103
- : undefined;
104
- if (type !== undefined) {
105
- return parser
106
- .childParser((c) => c.isTypeOf(type))
107
- .serialize(value, options);
108
- }
109
- return parser.serialize(value, options);
110
- }
111
- serialize(value, options) {
112
- const parserOptions = options !== undefined
113
- ? new ODataParserOptions(options)
114
- : this.optionsHelper;
115
- if (this.parser instanceof ODataStructuredTypeParser) {
116
- const parser = this.parser;
117
- return Array.isArray(value)
118
- ? value.map((v) => this.toJson(parser, v, parserOptions))
119
- : this.toJson(parser, value, parserOptions);
120
- }
121
- return this.parser.serialize(value, Object.assign({ field: this }, parserOptions));
122
- }
123
- //#endregion
124
- //#region Encode
125
- encode(value, options) {
126
- const parserOptions = options !== undefined
127
- ? new ODataParserOptions(options)
128
- : this.optionsHelper;
129
- return this.parser.encode(value, Object.assign({ field: this }, parserOptions));
130
- }
131
- //#endregion
132
- configure({ parserForType, options, }) {
133
- this.optionsHelper = options;
134
- this.parser = parserForType(this.type);
135
- if (this.default !== undefined)
136
- this.default = this.deserialize(this.default, options);
137
- }
138
- //#region Json Schema
139
- // https://json-schema.org/
140
- toJsonSchema(options = {}) {
141
- let schema = this.parser instanceof ODataStructuredTypeFieldParser ||
142
- this.parser instanceof ODataStructuredTypeParser ||
143
- this.parser instanceof ODataEnumTypeParser
144
- ? this.parser.toJsonSchema(options)
145
- : { title: this.name, type: 'object' };
146
- if ([
147
- 'Edm.String',
148
- 'Edm.Date',
149
- 'Edm.TimeOfDay',
150
- 'Edm.DateTimeOffset',
151
- 'Edm.Guid',
152
- 'Edm.Binary',
153
- ].indexOf(this.type) !== -1) {
154
- schema.type = 'string';
155
- if (this.type === 'Edm.Date')
156
- schema.format = 'date';
157
- else if (this.type === 'Edm.TimeOfDay')
158
- schema.format = 'time';
159
- else if (this.type === 'Edm.DateTimeOffset')
160
- schema.format = 'date-time';
161
- else if (this.type === 'Edm.Guid')
162
- schema.pattern =
163
- '^[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}$';
164
- else if (this.type === 'Edm.Binary')
165
- schema.contentEncoding = 'base64';
166
- else if (this.type === 'Edm.String' && this.maxLength)
167
- schema.maxLength = this.maxLength;
168
- }
169
- else if (['Edm.Int64', 'Edm.Int32', 'Edm.Int16', 'Edm.Byte', 'Edm.SByte'].indexOf(this.type) !== -1) {
170
- //TODO: Range
171
- schema.type = 'integer';
172
- }
173
- else if (['Edm.Decimal', 'Edm.Double'].indexOf(this.type) !== -1) {
174
- schema.type = 'number';
175
- }
176
- else if (['Edm.Boolean'].indexOf(this.type) !== -1) {
177
- schema.type = 'boolean';
178
- }
179
- if (this.default)
180
- schema.default = this.default;
181
- if (this.nullable)
182
- schema.type = [schema.type, 'null'];
183
- if (this.collection)
184
- schema = {
185
- type: 'array',
186
- items: schema,
187
- additionalItems: false,
188
- };
189
- return schema;
190
- }
191
- //#endregion
192
- isKey() {
193
- var _a;
194
- return (((_a = this.structuredType.keys) === null || _a === void 0 ? void 0 : _a.find((k) => k.name === this.name)) !== undefined);
195
- }
196
- hasReferentials() {
197
- return this.referentials.length !== 0;
198
- }
199
- isEdmType() {
200
- return this.type.startsWith('Edm.');
201
- }
202
- isEnumType() {
203
- return this.parser instanceof ODataEnumTypeParser;
204
- }
205
- enum() {
206
- if (!this.isEnumType())
207
- throw new Error('Field are not EnumType');
208
- return this.parser;
209
- }
210
- isStructuredType() {
211
- return this.parser instanceof ODataStructuredTypeParser;
212
- }
213
- structured() {
214
- if (!this.isStructuredType())
215
- throw new Error('Field are not StrucuturedType');
216
- return this.parser;
217
- }
218
- }
219
- export class ODataStructuredTypeParser {
220
- constructor(config, namespace, alias) {
221
- this.children = [];
222
- this.name = config.name;
223
- this.base = config.base;
224
- this.open = config.open || false;
225
- this.namespace = namespace;
226
- this.alias = alias;
227
- if (Array.isArray(config.keys))
228
- this.keys = config.keys.map((key) => new ODataEntityTypeKey(key));
229
- this.fields = Object.entries(config.fields).map(([name, config]) => new ODataStructuredTypeFieldParser(name, this, config));
230
- }
231
- isTypeOf(type) {
232
- var names = [`${this.namespace}.${this.name}`];
233
- if (this.alias)
234
- names.push(`${this.alias}.${this.name}`);
235
- return names.indexOf(type) !== -1;
236
- }
237
- typeFor(name) {
238
- const field = this.fields.find((f) => f.name === name);
239
- if (field === undefined && this.parent !== undefined)
240
- return this.parent.typeFor(name);
241
- return field !== undefined ? field.type : undefined;
242
- }
243
- findChildParser(predicate) {
244
- if (predicate(this))
245
- return this;
246
- let match;
247
- for (let ch of this.children) {
248
- match = ch.findChildParser(predicate);
249
- if (match !== undefined)
250
- break;
251
- }
252
- return match;
253
- }
254
- childParser(predicate) {
255
- return this.findChildParser(predicate) || NONE_PARSER;
256
- }
257
- // Deserialize
258
- deserialize(value, options) {
259
- const parserOptions = options !== undefined
260
- ? new ODataParserOptions(options)
261
- : this.optionsHelper;
262
- if (this.parent !== undefined)
263
- value = this.parent.deserialize(value, parserOptions);
264
- return Object.assign({}, value, this.fields
265
- .filter((f) => f.name in value &&
266
- value[f.name] !== undefined &&
267
- value[f.name] !== null)
268
- .reduce((acc, f) => Object.assign(acc, {
269
- [f.name]: f.deserialize(value[f.name], parserOptions),
270
- }), {}));
271
- }
272
- // Serialize
273
- serialize(value, options) {
274
- const parserOptions = options !== undefined
275
- ? new ODataParserOptions(options)
276
- : this.optionsHelper;
277
- if (this.parent !== undefined)
278
- value = this.parent.serialize(value, parserOptions);
279
- return Object.assign({}, value, this.fields
280
- .filter((f) => f.name in value &&
281
- value[f.name] !== undefined &&
282
- value[f.name] !== null)
283
- .reduce((acc, f) => Object.assign(acc, {
284
- [f.name]: f.serialize(value[f.name], parserOptions),
285
- }), {}));
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)
323
- return undefined;
324
- let name = k.alias || field.name;
325
- key[name] = field.encode(v);
326
- }
327
- }
328
- if (Types.isEmpty(key))
329
- return undefined;
330
- return Objects.resolveKey(key);
331
- }
332
- defaults() {
333
- var _a;
334
- let value = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.defaults()) || {};
335
- let fields = this.fields.filter((f) => f.default !== undefined || f.isStructuredType());
336
- return Object.assign({}, value, fields.reduce((acc, f) => {
337
- let value = f.isStructuredType()
338
- ? f.structured().defaults()
339
- : f.default;
340
- if (!Types.isEmpty(value))
341
- Object.assign(acc, { [f.name]: value });
342
- return acc;
343
- }, {}));
344
- }
345
- // Json Schema
346
- toJsonSchema(options = {}) {
347
- var _a;
348
- let schema = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.toJsonSchema(options)) || {
349
- $schema: 'http://json-schema.org/draft-07/schema#',
350
- $id: `${this.namespace}.${this.name}`,
351
- title: this.name,
352
- type: 'object',
353
- properties: {},
354
- required: [],
355
- };
356
- const fields = this.fields.filter((f) => (!f.navigation || (options.expand && f.name in options.expand)) &&
357
- (!options.select || options.select.indexOf(f.name) !== -1));
358
- schema.properties = Object.assign({}, schema.properties, fields
359
- .map((f) => {
360
- let expand = options.expand && f.name in options.expand
361
- ? options.expand[f.name]
362
- : undefined;
363
- let schema = f.toJsonSchema(expand);
364
- if (options.custom && f.name in options.custom)
365
- schema = options.custom[f.name](schema, f);
366
- return { [f.name]: schema };
367
- })
368
- .reduce((acc, v) => Object.assign(acc, v), {}));
369
- schema.required = [
370
- ...schema.required,
371
- ...fields
372
- .filter((f) => options.required && f.name in options.required
373
- ? options.required[f.name]
374
- : !f.nullable)
375
- .map((f) => f.name),
376
- ];
377
- return schema;
378
- }
379
- validate(attrs, { method, navigation = false, } = {}) {
380
- var _a;
381
- const errors = (((_a = this.parent) === null || _a === void 0 ? void 0 : _a.validate(attrs, { method, navigation })) ||
382
- {});
383
- const fields = this.fields.filter((f) => !f.navigation || navigation);
384
- for (var field of fields) {
385
- const value = attrs[field.name];
386
- const errs = field.validate(value, { method, navigation });
387
- if (errs !== undefined) {
388
- errors[field.name] = errs;
389
- }
390
- }
391
- return !Types.isEmpty(errors) ? errors : undefined;
392
- }
393
- }
394
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3BhcnNlcnMvc3RydWN0dXJlZC10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFDLE9BQU8sRUFLTCxXQUFXLEdBR1osTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFtQmhELE1BQU0sT0FBTyxrQkFBa0I7SUFHN0IsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQW9DO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBWSxFQUNWLFFBQVEsRUFDUixrQkFBa0IsR0FJbkI7UUFDQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLDhCQUE4QjtJQWdCekMsWUFDRSxJQUFZLEVBQ1osY0FBOEMsRUFDOUMsS0FBZ0M7UUFFaEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFj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bHMnO1xuaW1wb3J0IHtcbiAgUGFyc2VyLFxuICBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnLFxuICBTdHJ1Y3R1cmVkVHlwZUNvbmZpZyxcbiAgT3B0aW9uc0hlbHBlcixcbiAgTk9ORV9QQVJTRVIsXG4gIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zLFxuICBPcHRpb25zLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YUVudW1UeXBlUGFyc2VyIH0gZnJvbSAnLi9lbnVtLXR5cGUnO1xuaW1wb3J0IHsgQ09NUFVURUQgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFBbm5vdGF0aW9uIH0gZnJvbSAnLi4vc2NoZW1hL2Fubm90YXRpb24nO1xuaW1wb3J0IHsgcmF3IH0gZnJvbSAnLi4vcmVzb3VyY2VzL2J1aWxkZXInO1xuaW1wb3J0IHsgT0RhdGFQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucyc7XG5cbi8vIEpTT04gU0NIRU1BXG50eXBlIEpzb25TY2hlbWFTZWxlY3Q8VD4gPSBBcnJheTxrZXlvZiBUPjtcbnR5cGUgSnNvblNjaGVtYUN1c3RvbTxUPiA9IHtcbiAgW1AgaW4ga2V5b2YgVF0/OiAoXG4gICAgc2NoZW1hOiBhbnksXG4gICAgZmllbGQ6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxUW1BdPlxuICApID0+IGFueTtcbn07XG50eXBlIEpzb25TY2hlbWFFeHBhbmQ8VD4gPSB7IFtQIGluIGtleW9mIFRdPzogSnNvblNjaGVtYU9wdGlvbnM8VFtQXT4gfTtcbnR5cGUgSnNvblNjaGVtYVJlcXVpcmVkPFQ+ID0geyBbUCBpbiBrZXlvZiBUXT86IGJvb2xlYW4gfTtcbmV4cG9ydCB0eXBlIEpzb25TY2hlbWFPcHRpb25zPFQ+ID0ge1xuICBzZWxlY3Q/OiBKc29uU2NoZW1hU2VsZWN0PFQ+O1xuICBjdXN0b20/OiBKc29uU2NoZW1hQ3VzdG9tPFQ+O1xuICBleHBhbmQ/OiBKc29uU2NoZW1hRXhwYW5kPFQ+O1xuICByZXF1aXJlZD86IEpzb25TY2hlbWFSZXF1aXJlZDxUPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUVudGl0eVR5cGVLZXkge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFsaWFzPzogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcih7IG5hbWUsIGFsaWFzIH06IHsgbmFtZTogc3RyaW5nOyBhbGlhcz86IHN0cmluZyB9KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhUmVmZXJlbnRpYWwge1xuICBwcm9wZXJ0eTogc3RyaW5nO1xuICByZWZlcmVuY2VkUHJvcGVydHk6IHN0cmluZztcbiAgY29uc3RydWN0b3Ioe1xuICAgIHByb3BlcnR5LFxuICAgIHJlZmVyZW5jZWRQcm9wZXJ0eSxcbiAgfToge1xuICAgIHByb3BlcnR5OiBzdHJpbmc7XG4gICAgcmVmZXJlbmNlZFByb3BlcnR5OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgdGhpcy5yZWZlcmVuY2VkUHJvcGVydHkgPSByZWZlcmVuY2VkUHJvcGVydHk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxUPiBpbXBsZW1lbnRzIFBhcnNlcjxUPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJ1Y3R1cmVkVHlwZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+O1xuICB0eXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgcGFyc2VyOiBQYXJzZXI8VD47XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgY29sbGVjdGlvbjogYm9vbGVhbjtcbiAgbnVsbGFibGU6IGJvb2xlYW47XG4gIG5hdmlnYXRpb246IGJvb2xlYW47XG4gIHByZWNpc2lvbj86IG51bWJlcjtcbiAgc2NhbGU/OiBudW1iZXI7XG4gIHJlZmVyZW50aWFsczogT0RhdGFSZWZlcmVudGlhbFtdO1xuICBhbm5vdGF0aW9uczogT0RhdGFBbm5vdGF0aW9uW107XG4gIG9wdGlvbnNIZWxwZXI/OiBPcHRpb25zSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdHJ1Y3R1cmVkVHlwZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+LFxuICAgIGZpZWxkOiBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnXG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdHJ1Y3R1cmVkVHlwZSA9IHN0cnVjdHVyZWRUeXBlO1xuICAgIHRoaXMudHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgdGhpcy5wYXJzZXIgPSBOT05FX1BBUlNFUjtcbiAgICB0aGlzLmFubm90YXRpb25zID0gKGZpZWxkLmFubm90YXRpb25zIHx8IFtdKS5tYXAoXG4gICAgICAoYW5ub3QpID0+IG5ldyBPRGF0YUFubm90YXRpb24oYW5ub3QpXG4gICAgKTtcbiAgICB0aGlzLnJlZmVyZW50aWFscyA9IChmaWVsZC5yZWZlcmVudGlhbHMgfHwgW10pLm1hcChcbiAgICAgIChyZWZlcmVudGlhbCkgPT4gbmV3IE9EYXRhUmVmZXJlbnRpYWwocmVmZXJlbnRpYWwpXG4gICAgKTtcbiAgICB0aGlzLmRlZmF1bHQgPSBmaWVsZC5kZWZhdWx0O1xuICAgIHRoaXMubWF4TGVuZ3RoID0gZmllbGQubWF4TGVuZ3RoO1xuICAgIHRoaXMuY29sbGVjdGlvbiA9IGZpZWxkLmNvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCA/IGZpZWxkLmNvbGxlY3Rpb24gOiBmYWxzZTtcbiAgICB0aGlzLm51bGxhYmxlID0gZmllbGQubnVsbGFibGUgIT09IHVuZGVmaW5lZCA/IGZpZWxkLm51bGxhYmxlIDogdHJ1ZTtcbiAgICB0aGlzLm5hdmlnYXRpb24gPSBmaWVsZC5uYXZpZ2F0aW9uICE9PSB1bmRlZmluZWQgPyBmaWVsZC5uYXZpZ2F0aW9uIDogZmFsc2U7XG4gICAgdGhpcy5wcmVjaXNpb24gPSBmaWVsZC5wcmVjaXNpb247XG4gICAgdGhpcy5zY2FsZSA9IGZpZWxkLnNjYWxlO1xuICB9XG4gIGZpbmRBbm5vdGF0aW9uKHByZWRpY2F0ZTogKGFubm90OiBPRGF0YUFubm90YXRpb24pID0+IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ3BhdGNoJztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOlxuICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICB8IHN0cmluZ1tdXG4gICAgfCB1bmRlZmluZWQge1xuICAgIGxldCBlcnJvcnM7XG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbiAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZXJyb3JzID0gdmFsdWUubWFwKCh2KSA9PiB0aGlzLnZhbGlkYXRlKHYsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pKSBhcyB7XG4gICAgICAgIFtuYW1lOiBzdHJpbmddOiBhbnlbXTtcbiAgICAgIH1bXTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKHRoaXMuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdmFsdWUgIT09IG51bGwpIHx8XG4gICAgICAodGhpcy5uYXZpZ2F0aW9uICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICBlcnJvcnMgPVxuICAgICAgICB0aGlzLnN0cnVjdHVyZWQoKS52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgfHxcbiAgICAgICAgKHt9IGFzIHsgW25hbWU6IHN0cmluZ106IGFueVtdIH0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmlzRW51bVR5cGUoKSAmJlxuICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJylcbiAgICApIHtcbiAgICAgIGVycm9ycyA9IHRoaXMuZW51bSgpLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSXNFZG1UeXBlXG4gICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuZmluZEFubm90YXRpb24oKGEpID0+IGEudGVybSA9PT0gQ09NUFVURUQpO1xuICAgICAgZXJyb3JzID0gW107XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLm51bGxhYmxlICYmXG4gICAgICAgICh2YWx1ZSA9PT0gbnVsbCB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBtZXRob2QgIT09ICdwYXRjaCcpKSAmJiAvLyBJcyBudWxsIG9yIHVuZGVmaW5lZCB3aXRob3V0IHBhdGNoP1xuICAgICAgICAhKGNvbXB1dGVkPy5ib29sICYmIG1ldGhvZCA9PT0gJ2NyZWF0ZScpIC8vIE5vdCAoSXMgQ29tcHV0ZWQgZmllbGQgYW5kIGNyZWF0ZSkgP1xuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGByZXF1aXJlZGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdmFsdWUubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaChgbWF4bGVuZ3RoYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8jcmVnaW9uIERlc2VyaWFsaXplXG4gIHByaXZhdGUgcGFyc2UoXG4gICAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+LFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9ucz86IE9wdGlvbnNIZWxwZXJcbiAgKTogYW55IHtcbiAgICBjb25zdCB0eXBlID0gVHlwZXMuaXNQbGFpbk9iamVjdCh2YWx1ZSlcbiAgICAgID8gb3B0aW9ucz8uaGVscGVyLnR5cGUodmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcGFyc2VyXG4gICAgICAgIC5jaGlsZFBhcnNlcigoYykgPT4gYy5pc1R5cGVPZih0eXBlKSlcbiAgICAgICAgLmRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlci5kZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogT3B0aW9ucyk6IFQge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMub3B0aW9uc0hlbHBlcjtcbiAgICBpZiAodGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyKSB7XG4gICAgICBjb25zdCBwYXJzZXIgPSB0aGlzLnBhcnNlciBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+O1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgID8gdmFsdWUubWFwKCh2KSA9PiB0aGlzLnBhcnNlKHBhcnNlciwgdiwgcGFyc2VyT3B0aW9ucykpXG4gICAgICAgIDogdGhpcy5wYXJzZShwYXJzZXIsIHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCB7XG4gICAgICBmaWVsZDogdGhpcyxcbiAgICAgIC4uLnBhcnNlck9wdGlvbnMsXG4gICAgfSBhcyBTdHJ1Y3R1cmVkVHlwZUZpZWxkT3B0aW9ucyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFNlcmlhbGl6ZVxuICBwcml2YXRlIHRvSnNvbihcbiAgICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD4sXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zPzogT3B0aW9uc0hlbHBlclxuICApOiBhbnkge1xuICAgIGNvbnN0IHR5cGUgPSBUeXBlcy5pc1BsYWluT2JqZWN0KHZhbHVlKVxuICAgICAgPyBvcHRpb25zPy5oZWxwZXIudHlwZSh2YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwYXJzZXJcbiAgICAgICAgLmNoaWxkUGFyc2VyKChjKSA9PiBjLmlzVHlwZU9mKHR5cGUpKVxuICAgICAgICAuc2VyaWFsaXplKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlci5zZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgc2VyaWFsaXplKHZhbHVlOiBULCBvcHRpb25zPzogT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5vcHRpb25zSGVscGVyO1xuICAgIGlmICh0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXIpIHtcbiAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD47XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyAodmFsdWUgYXMgYW55W10pLm1hcCgodikgPT4gdGhpcy50b0pzb24ocGFyc2VyLCB2LCBwYXJzZXJPcHRpb25zKSlcbiAgICAgICAgOiB0aGlzLnRvSnNvbihwYXJzZXIsIHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwge1xuICAgICAgZmllbGQ6IHRoaXMsXG4gICAgICAuLi5wYXJzZXJPcHRpb25zLFxuICAgIH0gYXMgU3RydWN0dXJlZFR5cGVGaWVsZE9wdGlvbnMpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBFbmNvZGVcbiAgZW5jb2RlKHZhbHVlOiBULCBvcHRpb25zPzogT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5vcHRpb25zSGVscGVyO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5lbmNvZGUodmFsdWUsIHtcbiAgICAgIGZpZWxkOiB0aGlzLFxuICAgICAgLi4ucGFyc2VyT3B0aW9ucyxcbiAgICB9IGFzIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBjb25maWd1cmUoe1xuICAgIHBhcnNlckZvclR5cGUsXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IFBhcnNlcjxhbnk+O1xuICAgIG9wdGlvbnM6IE9wdGlvbnNIZWxwZXI7XG4gIH0pIHtcbiAgICB0aGlzLm9wdGlvbnNIZWxwZXIgPSBvcHRpb25zO1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyRm9yVHlwZSh0aGlzLnR5cGUpO1xuICAgIGlmICh0aGlzLmRlZmF1bHQgIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuZGVmYXVsdCA9IHRoaXMuZGVzZXJpYWxpemUodGhpcy5kZWZhdWx0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBKc29uIFNjaGVtYVxuICAvLyBodHRwczovL2pzb24tc2NoZW1hLm9yZy9cbiAgdG9Kc29uU2NoZW1hKG9wdGlvbnM6IEpzb25TY2hlbWFPcHRpb25zPFQ+ID0ge30pIHtcbiAgICBsZXQgc2NoZW1hOiBhbnkgPVxuICAgICAgdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIgfHxcbiAgICAgIHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlciB8fFxuICAgICAgdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YUVudW1UeXBlUGFyc2VyXG4gICAgICAgID8gdGhpcy5wYXJzZXIudG9Kc29uU2NoZW1hKG9wdGlvbnMpXG4gICAgICAgIDogKHsgdGl0bGU6IHRoaXMubmFtZSwgdHlwZTogJ29iamVjdCcgfSBhcyBhbnkpO1xuXG4gICAgaWYgKFxuICAgICAgW1xuICAgICAgICAnRWRtLlN0cmluZycsXG4gICAgICAgICdFZG0uRGF0ZScsXG4gICAgICAgICdFZG0uVGltZU9mRGF5JyxcbiAgICAgICAgJ0VkbS5EYXRlVGltZU9mZnNldCcsXG4gICAgICAgICdFZG0uR3VpZCcsXG4gICAgICAgICdFZG0uQmluYXJ5JyxcbiAgICAgIF0uaW5kZXhPZih0aGlzLnR5cGUpICE9PSAtMVxuICAgICkge1xuICAgICAgc2NoZW1hLnR5cGUgPSAnc3RyaW5nJztcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdFZG0uRGF0ZScpIHNjaGVtYS5mb3JtYXQgPSAnZGF0ZSc7XG4gICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdFZG0uVGltZU9mRGF5Jykgc2NoZW1hLmZvcm1hdCA9ICd0aW1lJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5EYXRlVGltZU9mZnNldCcpIHNjaGVtYS5mb3JtYXQgPSAnZGF0ZS10aW1lJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5HdWlkJylcbiAgICAgICAgc2NoZW1hLnBhdHRlcm4gPVxuICAgICAgICAgICdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCc7XG4gICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdFZG0uQmluYXJ5Jykgc2NoZW1hLmNvbnRlbnRFbmNvZGluZyA9ICdiYXNlNjQnO1xuICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09PSAnRWRtLlN0cmluZycgJiYgdGhpcy5tYXhMZW5ndGgpXG4gICAgICAgIHNjaGVtYS5tYXhMZW5ndGggPSB0aGlzLm1heExlbmd0aDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgWydFZG0uSW50NjQnLCAnRWRtLkludDMyJywgJ0VkbS5JbnQxNicsICdFZG0uQnl0ZScsICdFZG0uU0J5dGUnXS5pbmRleE9mKFxuICAgICAgICB0aGlzLnR5cGVcbiAgICAgICkgIT09IC0xXG4gICAgKSB7XG4gICAgICAvL1RPRE86IFJhbmdlXG4gICAgICBzY2hlbWEudHlwZSA9ICdpbnRlZ2VyJztcbiAgICB9IGVsc2UgaWYgKFsnRWRtLkRlY2ltYWwnLCAnRWRtLkRvdWJsZSddLmluZGV4T2YodGhpcy50eXBlKSAhPT0gLTEpIHtcbiAgICAgIHNjaGVtYS50eXBlID0gJ251bWJlcic7XG4gICAgfSBlbHNlIGlmIChbJ0VkbS5Cb29sZWFuJ10uaW5kZXhPZih0aGlzLnR5cGUpICE9PSAtMSkge1xuICAgICAgc2NoZW1hLnR5cGUgPSAnYm9vbGVhbic7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlZmF1bHQpIHNjaGVtYS5kZWZhdWx0ID0gdGhpcy5kZWZhdWx0O1xuICAgIGlmICh0aGlzLm51bGxhYmxlKSBzY2hlbWEudHlwZSA9IFtzY2hlbWEudHlwZSwgJ251bGwnXTtcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uKVxuICAgICAgc2NoZW1hID0ge1xuICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICBpdGVtczogc2NoZW1hLFxuICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgfTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGlzS2V5KCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0cnVjdHVyZWRUeXBlLmtleXM/LmZpbmQoKGspID0+IGsubmFtZSA9PT0gdGhpcy5uYW1lKSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIGhhc1JlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVudGlhbHMubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgaXNFZG1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUuc3RhcnRzV2l0aCgnRWRtLicpO1xuICB9XG5cbiAgaXNFbnVtVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YUVudW1UeXBlUGFyc2VyO1xuICB9XG5cbiAgZW51bSgpIHtcbiAgICBpZiAoIXRoaXMuaXNFbnVtVHlwZSgpKSB0aHJvdyBuZXcgRXJyb3IoJ0ZpZWxkIGFyZSBub3QgRW51bVR5cGUnKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgYXMgT0RhdGFFbnVtVHlwZVBhcnNlcjxUPjtcbiAgfVxuXG4gIGlzU3RydWN0dXJlZFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjtcbiAgfVxuXG4gIHN0cnVjdHVyZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmllbGQgYXJlIG5vdCBTdHJ1Y3V0dXJlZFR5cGUnKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPiBpbXBsZW1lbnRzIFBhcnNlcjxUPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIG9wZW46IGJvb2xlYW47XG4gIGNoaWxkcmVuOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT5bXSA9IFtdO1xuICBhbGlhcz86IHN0cmluZztcbiAgYmFzZT86IHN0cmluZztcbiAgcGFyZW50PzogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+O1xuICBrZXlzPzogT0RhdGFFbnRpdHlUeXBlS2V5W107XG4gIGZpZWxkczogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT5bXTtcbiAgb3B0aW9uc0hlbHBlcj86IE9wdGlvbnNIZWxwZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29uZmlnOiBTdHJ1Y3R1cmVkVHlwZUNvbmZpZzxUPixcbiAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICBhbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLmJhc2UgPSBjb25maWcuYmFzZTtcbiAgICB0aGlzLm9wZW4gPSBjb25maWcub3BlbiB8fCBmYWxzZTtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmtleXMpKVxuICAgICAgdGhpcy5rZXlzID0gY29uZmlnLmtleXMubWFwKChrZXkpID0+IG5ldyBPRGF0YUVudGl0eVR5cGVLZXkoa2V5KSk7XG4gICAgdGhpcy5maWVsZHMgPSBPYmplY3QuZW50cmllczxTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnPihcbiAgICAgIGNvbmZpZy5maWVsZHMgYXMgeyBbUCBpbiBrZXlvZiBUXTogU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyB9XG4gICAgKS5tYXAoXG4gICAgICAoW25hbWUsIGNvbmZpZ10pID0+IG5ldyBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIobmFtZSwgdGhpcywgY29uZmlnKVxuICAgICk7XG4gIH1cblxuICBpc1R5cGVPZih0eXBlOiBzdHJpbmcpIHtcbiAgICB2YXIgbmFtZXMgPSBbYCR7dGhpcy5uYW1lc3BhY2V9LiR7dGhpcy5uYW1lfWBdO1xuICAgIGlmICh0aGlzLmFsaWFzKSBuYW1lcy5wdXNoKGAke3RoaXMuYWxpYXN9LiR7dGhpcy5uYW1lfWApO1xuICAgIHJldHVybiBuYW1lcy5pbmRleE9mKHR5cGUpICE9PSAtMTtcbiAgfVxuXG4gIHR5cGVGb3IobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gbmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgJiYgdGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC50eXBlRm9yKG5hbWUpO1xuICAgIHJldHVybiBmaWVsZCAhPT0gdW5kZWZpbmVkID8gZmllbGQudHlwZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZpbmRDaGlsZFBhcnNlcihcbiAgICBwcmVkaWNhdGU6IChwOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4pID0+IGJvb2xlYW5cbiAgKTogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocHJlZGljYXRlKHRoaXMpKSByZXR1cm4gdGhpcztcbiAgICBsZXQgbWF0Y2g6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBjaCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBtYXRjaCA9IGNoLmZpbmRDaGlsZFBhcnNlcihwcmVkaWNhdGUpO1xuICAgICAgaWYgKG1hdGNoICE9PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH1cblxuICBjaGlsZFBhcnNlcihcbiAgICBwcmVkaWNhdGU6IChwOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4pID0+IGJvb2xlYW5cbiAgKTogUGFyc2VyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRDaGlsZFBhcnNlcihwcmVkaWNhdGUpIHx8IE5PTkVfUEFSU0VSO1xuICB9XG5cbiAgLy8gRGVzZXJpYWxpemVcbiAgZGVzZXJpYWxpemUodmFsdWU6IGFueSwgb3B0aW9ucz86IE9wdGlvbnMpOiBUIHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgaWYgKHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWQpXG4gICAgICB2YWx1ZSA9IHRoaXMucGFyZW50LmRlc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgdmFsdWUsXG4gICAgICB0aGlzLmZpZWxkc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChmKSA9PlxuICAgICAgICAgICAgZi5uYW1lIGluIHZhbHVlICYmXG4gICAgICAgICAgICB2YWx1ZVtmLm5hbWVdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHZhbHVlW2YubmFtZV0gIT09IG51bGxcbiAgICAgICAgKVxuICAgICAgICAucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGYpID0+XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgICAgICBbZi5uYW1lXTogZi5kZXNlcmlhbGl6ZSh2YWx1ZVtmLm5hbWVdLCBwYXJzZXJPcHRpb25zKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9XG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLy8gU2VyaWFsaXplXG4gIHNlcmlhbGl6ZSh2YWx1ZTogVCwgb3B0aW9ucz86IE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMub3B0aW9uc0hlbHBlcjtcbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZClcbiAgICAgIHZhbHVlID0gdGhpcy5wYXJlbnQuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgdmFsdWUsXG4gICAgICB0aGlzLmZpZWxkc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChmKSA9PlxuICAgICAgICAgICAgZi5uYW1lIGluIHZhbHVlICYmXG4gICAgICAgICAgICAodmFsdWUgYXMgYW55KVtmLm5hbWVdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICh2YWx1ZSBhcyBhbnkpW2YubmFtZV0gIT09IG51bGxcbiAgICAgICAgKVxuICAgICAgICAucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGYpID0+XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgICAgICBbZi5uYW1lXTogZi5zZXJpYWxpemUoKHZhbHVlIGFzIGFueSlbZi5uYW1lXSwgcGFyc2VyT3B0aW9ucyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB7fVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8vIEVuY29kZVxuICBlbmNvZGUodmFsdWU6IFQsIG9wdGlvbnM/OiBPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgcmV0dXJuIHJhdyhKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucykpKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgcGFyc2VyRm9yVHlwZSxcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gUGFyc2VyPGFueT47XG4gICAgb3B0aW9uczogT3B0aW9uc0hlbHBlcjtcbiAgfSkge1xuICAgIHRoaXMub3B0aW9uc0hlbHBlciA9IG9wdGlvbnM7XG4gICAgaWYgKHRoaXMuYmFzZSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gcGFyc2VyRm9yVHlwZSh0aGlzLmJhc2UpIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PjtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHRoaXMuZmllbGRzLmZvckVhY2goKGYpID0+IGYuY29uZmlndXJlKHsgcGFyc2VyRm9yVHlwZSwgb3B0aW9ucyB9KSk7XG4gIH1cblxuICByZXNvbHZlS2V5KHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGxldCBrZXkgPSB0aGlzLnBhcmVudD8ucmVzb2x2ZUtleSh2YWx1ZSkgfHwge307XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5rZXlzKSAmJiB0aGlzLmtleXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgayBvZiB0aGlzLmtleXMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICAgIGxldCBzdHJ1Y3R1cmVkID0gdGhpcyBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBmaWVsZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IG5hbWUgb2Ygay5uYW1lLnNwbGl0KCcvJykpIHtcbiAgICAgICAgICBpZiAoc3RydWN0dXJlZCA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICBmaWVsZCA9IHN0cnVjdHVyZWQuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHYgPSBUeXBlcy5pc1BsYWluT2JqZWN0KHYpID8gdltmaWVsZC5uYW1lXSA6IHY7XG4gICAgICAgICAgICBzdHJ1Y3R1cmVkID0gZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICAgICAgICAgID8gZmllbGQuc3RydWN0dXJlZCgpXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IG5hbWUgPSBrLmFsaWFzIHx8IGZpZWxkLm5hbWU7XG4gICAgICAgIGtleVtuYW1lXSA9IGZpZWxkLmVuY29kZSh2KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFR5cGVzLmlzRW1wdHkoa2V5KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0cy5yZXNvbHZlS2V5KGtleSk7XG4gIH1cblxuICBkZWZhdWx0cygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5wYXJlbnQ/LmRlZmF1bHRzKCkgfHwge307XG4gICAgbGV0IGZpZWxkcyA9IHRoaXMuZmllbGRzLmZpbHRlcihcbiAgICAgIChmKSA9PiBmLmRlZmF1bHQgIT09IHVuZGVmaW5lZCB8fCBmLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHZhbHVlLFxuICAgICAgZmllbGRzLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGYuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICAgICAgPyBmLnN0cnVjdHVyZWQoKS5kZWZhdWx0cygpXG4gICAgICAgICAgOiBmLmRlZmF1bHQ7XG4gICAgICAgIGlmICghVHlwZXMuaXNFbXB0eSh2YWx1ZSkpIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtmLm5hbWVdOiB2YWx1ZSB9KTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KVxuICAgICk7XG4gIH1cblxuICAvLyBKc29uIFNjaGVtYVxuICB0b0pzb25TY2hlbWEob3B0aW9uczogSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGxldCBzY2hlbWE6IGFueSA9IHRoaXMucGFyZW50Py50b0pzb25TY2hlbWEob3B0aW9ucykgfHwge1xuICAgICAgJHNjaGVtYTogJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIycsXG4gICAgICAkaWQ6IGAke3RoaXMubmFtZXNwYWNlfS4ke3RoaXMubmFtZX1gLFxuICAgICAgdGl0bGU6IHRoaXMubmFtZSxcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge30sXG4gICAgICByZXF1aXJlZDogW10sXG4gICAgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgKCFmLm5hdmlnYXRpb24gfHwgKG9wdGlvbnMuZXhwYW5kICYmIGYubmFtZSBpbiBvcHRpb25zLmV4cGFuZCkpICYmXG4gICAgICAgICghb3B0aW9ucy5zZWxlY3QgfHwgKDxzdHJpbmdbXT5vcHRpb25zLnNlbGVjdCkuaW5kZXhPZihmLm5hbWUpICE9PSAtMSlcbiAgICApO1xuICAgIHNjaGVtYS5wcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgc2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICBmaWVsZHNcbiAgICAgICAgLm1hcCgoZikgPT4ge1xuICAgICAgICAgIGxldCBleHBhbmQgPVxuICAgICAgICAgICAgb3B0aW9ucy5leHBhbmQgJiYgZi5uYW1lIGluIG9wdGlvbnMuZXhwYW5kXG4gICAgICAgICAgICAgID8gKG9wdGlvbnMuZXhwYW5kIGFzIGFueSlbZi5uYW1lXVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBsZXQgc2NoZW1hID0gZi50b0pzb25TY2hlbWEoZXhwYW5kKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jdXN0b20gJiYgZi5uYW1lIGluIG9wdGlvbnMuY3VzdG9tKVxuICAgICAgICAgICAgc2NoZW1hID0gKFxuICAgICAgICAgICAgICBvcHRpb25zLmN1c3RvbVtmLm5hbWUgYXMga2V5b2YgVF0gYXMgKFxuICAgICAgICAgICAgICAgIHNjaGVtYTogYW55LFxuICAgICAgICAgICAgICAgIGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PlxuICAgICAgICAgICAgICApID0+IGFueVxuICAgICAgICAgICAgKShzY2hlbWEsIGYpO1xuICAgICAgICAgIHJldHVybiB7IFtmLm5hbWVdOiBzY2hlbWEgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCB2KSA9PiBPYmplY3QuYXNzaWduKGFjYywgdiksIHt9KVxuICAgICk7XG4gICAgc2NoZW1hLnJlcXVpcmVkID0gW1xuICAgICAgLi4uc2NoZW1hLnJlcXVpcmVkLFxuICAgICAgLi4uZmllbGRzXG4gICAgICAgIC5maWx0ZXIoKGYpID0+XG4gICAgICAgICAgb3B0aW9ucy5yZXF1aXJlZCAmJiBmLm5hbWUgaW4gb3B0aW9ucy5yZXF1aXJlZFxuICAgICAgICAgICAgPyBvcHRpb25zLnJlcXVpcmVkW2YubmFtZSBhcyBrZXlvZiBUXVxuICAgICAgICAgICAgOiAhZi5udWxsYWJsZVxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGYpID0+IGYubmFtZSksXG4gICAgXTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgYXR0cnM6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgY3JlYXRlPzogYm9vbGVhbjtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAncGF0Y2gnO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlcnJvcnMgPSAodGhpcy5wYXJlbnQ/LnZhbGlkYXRlKGF0dHJzLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fFxuICAgICAge30pIGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzLmZpbHRlcigoZikgPT4gIWYubmF2aWdhdGlvbiB8fCBuYXZpZ2F0aW9uKTtcbiAgICBmb3IgKHZhciBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXR0cnNbZmllbGQubmFtZSBhcyBrZXlvZiBUXTtcbiAgICAgIGNvbnN0IGVycnMgPSBmaWVsZC52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgICBpZiAoZXJycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yc1tmaWVsZC5uYW1lXSA9IGVycnM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=