angular-odata 0.80.0 → 0.99.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 (237) hide show
  1. package/README.md +69 -34
  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} +3 -3
  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} +1 -1
  7. package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +2 -2
  8. package/esm2020/lib/client.mjs +271 -0
  9. package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +8 -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} +7 -7
  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/base.mjs +20 -0
  24. package/esm2020/lib/resources/query/expressions/compute.mjs +38 -0
  25. package/esm2020/lib/resources/query/expressions/expand.mjs +57 -0
  26. package/esm2020/lib/resources/query/expressions/filter.mjs +154 -0
  27. package/esm2020/lib/resources/query/expressions/index.mjs +7 -0
  28. package/esm2020/lib/resources/query/expressions/orderby.mjs +54 -0
  29. package/esm2020/lib/resources/query/expressions/search.mjs +113 -0
  30. package/esm2020/lib/resources/query/expressions/select.mjs +32 -0
  31. package/esm2020/lib/resources/query/expressions/syntax.mjs +371 -0
  32. package/esm2020/lib/resources/query/handlers.mjs +188 -0
  33. package/esm2020/lib/resources/query/index.mjs +4 -0
  34. package/esm2020/lib/resources/query/options.mjs +103 -0
  35. package/esm2020/lib/resources/request.mjs +167 -0
  36. package/esm2020/lib/resources/resource.mjs +326 -0
  37. package/esm2020/lib/resources/responses/annotations.mjs +119 -0
  38. package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
  39. package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
  40. package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
  41. package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
  42. package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
  43. package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
  44. package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
  45. package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
  46. package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
  47. package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
  48. package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
  49. package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
  50. package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
  51. package/esm2020/lib/resources/responses/metadata.mjs +547 -0
  52. package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +0 -0
  53. package/{esm2015/lib/resources/responses/response.js → esm2020/lib/resources/responses/response.mjs} +0 -0
  54. package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +0 -0
  55. package/esm2020/lib/resources/types/action.mjs +101 -0
  56. package/esm2020/lib/resources/types/batch.mjs +309 -0
  57. package/esm2020/lib/resources/types/count.mjs +27 -0
  58. package/esm2020/lib/resources/types/entity-set.mjs +94 -0
  59. package/esm2020/lib/resources/types/entity.mjs +106 -0
  60. package/esm2020/lib/resources/types/function.mjs +137 -0
  61. package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
  62. package/esm2020/lib/resources/types/media.mjs +41 -0
  63. package/esm2020/lib/resources/types/metadata.mjs +30 -0
  64. package/esm2020/lib/resources/types/navigation-property.mjs +226 -0
  65. package/esm2020/lib/resources/types/options.mjs +2 -0
  66. package/esm2020/lib/resources/types/property.mjs +183 -0
  67. package/esm2020/lib/resources/types/reference.mjs +85 -0
  68. package/esm2020/lib/resources/types/singleton.mjs +126 -0
  69. package/esm2020/lib/resources/types/value.mjs +41 -0
  70. package/esm2020/lib/schema/annotation.mjs +37 -0
  71. package/esm2020/lib/schema/callable.mjs +62 -0
  72. package/esm2020/lib/schema/element.mjs +51 -0
  73. package/esm2020/lib/schema/entity-container.mjs +9 -0
  74. package/esm2020/lib/schema/entity-set.mjs +9 -0
  75. package/esm2020/lib/schema/enum-type.mjs +71 -0
  76. package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +2 -1
  77. package/esm2020/lib/schema/parsers/callable.mjs +113 -0
  78. package/esm2020/lib/schema/parsers/edm.mjs +95 -0
  79. package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
  80. package/esm2020/lib/schema/parsers/index.mjs +5 -0
  81. package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
  82. package/esm2020/lib/schema/schema.mjs +61 -0
  83. package/esm2020/lib/schema/structured-type.mjs +198 -0
  84. package/esm2020/lib/services/base.mjs +29 -0
  85. package/esm2020/lib/services/entity-set.mjs +143 -0
  86. package/esm2020/lib/services/entity.mjs +12 -0
  87. package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
  88. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  89. package/esm2020/lib/services/singleton.mjs +48 -0
  90. package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
  91. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  92. package/esm2020/lib/types.mjs +37 -0
  93. package/esm2020/lib/utils/arraybuffers.mjs +46 -0
  94. package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
  95. package/esm2020/lib/utils/durations.mjs +40 -0
  96. package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
  97. package/esm2020/lib/utils/http.mjs +93 -0
  98. package/esm2020/lib/utils/index.mjs +10 -0
  99. package/esm2020/lib/utils/objects.mjs +195 -0
  100. package/esm2020/lib/utils/odata.mjs +22 -0
  101. package/esm2020/lib/utils/strings.mjs +20 -0
  102. package/esm2020/lib/utils/types.mjs +134 -0
  103. package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
  104. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  105. package/fesm2015/{angular-odata.js → angular-odata.mjs} +4508 -3427
  106. package/fesm2015/angular-odata.mjs.map +1 -0
  107. package/fesm2020/angular-odata.mjs +10510 -0
  108. package/fesm2020/angular-odata.mjs.map +1 -0
  109. package/lib/api.d.ts +14 -14
  110. package/lib/cache/cache.d.ts +2 -2
  111. package/lib/cache/storage.d.ts +1 -1
  112. package/lib/client.d.ts +60 -9
  113. package/lib/constants.d.ts +5 -2
  114. package/lib/index.d.ts +0 -1
  115. package/lib/models/collection.d.ts +30 -42
  116. package/lib/models/model.d.ts +37 -30
  117. package/lib/models/options.d.ts +30 -38
  118. package/lib/module.d.ts +1 -1
  119. package/lib/options.d.ts +47 -0
  120. package/lib/resources/index.d.ts +2 -3
  121. package/lib/resources/path/handlers.d.ts +27 -0
  122. package/lib/resources/path/index.d.ts +2 -0
  123. package/lib/resources/{path-segments.d.ts → path/segments.d.ts} +4 -16
  124. package/lib/resources/{builder.d.ts → query/builder.d.ts} +12 -7
  125. package/lib/resources/query/expressions/base.d.ts +19 -0
  126. package/lib/resources/query/expressions/compute.d.ts +26 -0
  127. package/lib/resources/query/expressions/expand.d.ts +40 -0
  128. package/lib/resources/query/expressions/filter.d.ts +58 -0
  129. package/lib/resources/query/expressions/index.d.ts +6 -0
  130. package/lib/resources/query/expressions/orderby.d.ts +37 -0
  131. package/lib/resources/query/expressions/search.d.ts +47 -0
  132. package/lib/resources/query/expressions/select.d.ts +21 -0
  133. package/lib/resources/query/expressions/syntax.d.ts +177 -0
  134. package/lib/resources/query/handlers.d.ts +104 -0
  135. package/lib/resources/query/index.d.ts +3 -0
  136. package/lib/resources/query/options.d.ts +38 -0
  137. package/lib/resources/request.d.ts +4 -3
  138. package/lib/resources/resource.d.ts +42 -48
  139. package/lib/resources/types/action.d.ts +14 -61
  140. package/lib/resources/types/batch.d.ts +16 -3
  141. package/lib/resources/types/count.d.ts +9 -17
  142. package/lib/resources/types/entity-set.d.ts +12 -51
  143. package/lib/resources/types/entity.d.ts +13 -31
  144. package/lib/resources/types/function.d.ts +13 -60
  145. package/lib/resources/types/media.d.ts +9 -8
  146. package/lib/resources/types/metadata.d.ts +3 -5
  147. package/lib/resources/types/navigation-property.d.ts +74 -65
  148. package/lib/resources/types/options.d.ts +1 -1
  149. package/lib/resources/types/property.d.ts +49 -57
  150. package/lib/resources/types/reference.d.ts +65 -9
  151. package/lib/resources/types/singleton.d.ts +53 -31
  152. package/lib/resources/types/value.d.ts +16 -7
  153. package/lib/schema/annotation.d.ts +18 -0
  154. package/lib/schema/callable.d.ts +4 -20
  155. package/lib/schema/element.d.ts +39 -0
  156. package/lib/schema/entity-container.d.ts +2 -12
  157. package/lib/schema/entity-set.d.ts +2 -18
  158. package/lib/schema/enum-type.d.ts +19 -25
  159. package/lib/schema/index.d.ts +1 -0
  160. package/lib/{parsers → schema/parsers}/callable.d.ts +2 -2
  161. package/lib/schema/parsers/edm.d.ts +4 -0
  162. package/lib/{parsers → schema/parsers}/enum-type.d.ts +12 -11
  163. package/lib/{parsers → schema/parsers}/index.d.ts +0 -0
  164. package/lib/{parsers → schema/parsers}/structured-type.d.ts +12 -12
  165. package/lib/schema/schema.d.ts +3 -10
  166. package/lib/schema/structured-type.d.ts +65 -27
  167. package/lib/services/base.d.ts +2 -2
  168. package/lib/services/entity-set.d.ts +5 -2
  169. package/lib/services/entity.d.ts +4 -1
  170. package/lib/services/singleton.d.ts +5 -2
  171. package/lib/settings.d.ts +5 -5
  172. package/lib/types.d.ts +1 -0
  173. package/lib/utils/arraybuffers.d.ts +4 -0
  174. package/lib/{parsers/edm.d.ts → utils/durations.d.ts} +3 -3
  175. package/lib/utils/http.d.ts +1 -0
  176. package/lib/utils/index.d.ts +1 -0
  177. package/lib/utils/objects.d.ts +1 -0
  178. package/lib/utils/strings.d.ts +1 -0
  179. package/lib/utils/types.d.ts +2 -0
  180. package/package.json +21 -8
  181. package/bundles/angular-odata.umd.js +0 -11048
  182. package/bundles/angular-odata.umd.js.map +0 -1
  183. package/esm2015/lib/api.js +0 -297
  184. package/esm2015/lib/client.js +0 -221
  185. package/esm2015/lib/helper.js +0 -271
  186. package/esm2015/lib/index.js +0 -21
  187. package/esm2015/lib/models/collection.js +0 -687
  188. package/esm2015/lib/models/model.js +0 -423
  189. package/esm2015/lib/models/options.js +0 -909
  190. package/esm2015/lib/options.js +0 -31
  191. package/esm2015/lib/parsers/callable.js +0 -107
  192. package/esm2015/lib/parsers/edm.js +0 -192
  193. package/esm2015/lib/parsers/enum-type.js +0 -102
  194. package/esm2015/lib/parsers/index.js +0 -5
  195. package/esm2015/lib/parsers/structured-type.js +0 -389
  196. package/esm2015/lib/resources/builder.js +0 -537
  197. package/esm2015/lib/resources/index.js +0 -8
  198. package/esm2015/lib/resources/path-segments.js +0 -156
  199. package/esm2015/lib/resources/query-options.js +0 -157
  200. package/esm2015/lib/resources/request.js +0 -149
  201. package/esm2015/lib/resources/resource.js +0 -337
  202. package/esm2015/lib/resources/responses/annotations.js +0 -121
  203. package/esm2015/lib/resources/responses/metadata.js +0 -548
  204. package/esm2015/lib/resources/types/action.js +0 -180
  205. package/esm2015/lib/resources/types/batch.js +0 -288
  206. package/esm2015/lib/resources/types/count.js +0 -55
  207. package/esm2015/lib/resources/types/entity-set.js +0 -169
  208. package/esm2015/lib/resources/types/entity.js +0 -170
  209. package/esm2015/lib/resources/types/function.js +0 -205
  210. package/esm2015/lib/resources/types/media.js +0 -47
  211. package/esm2015/lib/resources/types/metadata.js +0 -36
  212. package/esm2015/lib/resources/types/navigation-property.js +0 -232
  213. package/esm2015/lib/resources/types/options.js +0 -2
  214. package/esm2015/lib/resources/types/property.js +0 -195
  215. package/esm2015/lib/resources/types/reference.js +0 -50
  216. package/esm2015/lib/resources/types/singleton.js +0 -159
  217. package/esm2015/lib/resources/types/value.js +0 -30
  218. package/esm2015/lib/schema/annotation.js +0 -7
  219. package/esm2015/lib/schema/callable.js +0 -82
  220. package/esm2015/lib/schema/entity-container.js +0 -22
  221. package/esm2015/lib/schema/entity-set.js +0 -33
  222. package/esm2015/lib/schema/enum-type.js +0 -101
  223. package/esm2015/lib/schema/schema.js +0 -60
  224. package/esm2015/lib/schema/structured-type.js +0 -148
  225. package/esm2015/lib/services/base.js +0 -23
  226. package/esm2015/lib/services/entity-set.js +0 -143
  227. package/esm2015/lib/services/entity.js +0 -10
  228. package/esm2015/lib/services/singleton.js +0 -46
  229. package/esm2015/lib/types.js +0 -37
  230. package/esm2015/lib/utils/http.js +0 -89
  231. package/esm2015/lib/utils/index.js +0 -9
  232. package/esm2015/lib/utils/objects.js +0 -139
  233. package/esm2015/lib/utils/odata.js +0 -21
  234. package/esm2015/lib/utils/strings.js +0 -13
  235. package/esm2015/lib/utils/types.js +0 -103
  236. package/fesm2015/angular-odata.js.map +0 -1
  237. package/lib/resources/query-options.d.ts +0 -57
@@ -1,537 +0,0 @@
1
- import { __rest } from "tslib";
2
- const COMPARISON_OPERATORS = ['eq', 'ne', 'gt', 'ge', 'lt', 'le'];
3
- const LOGICAL_OPERATORS = ['and', 'or', 'not'];
4
- const COLLECTION_OPERATORS = ['any', 'all'];
5
- const BOOLEAN_FUNCTIONS = ['startswith', 'endswith', 'contains'];
6
- const SUPPORTED_EXPAND_PROPERTIES = [
7
- 'expand',
8
- 'levels',
9
- 'select',
10
- 'top',
11
- 'count',
12
- 'orderby',
13
- 'filter',
14
- ];
15
- const FUNCTION_REGEX = /\((.*)\)/;
16
- const INDEXOF_REGEX = /(?!indexof)\((\w+)\)/;
17
- export var StandardAggregateMethods;
18
- (function (StandardAggregateMethods) {
19
- StandardAggregateMethods["sum"] = "sum";
20
- StandardAggregateMethods["min"] = "min";
21
- StandardAggregateMethods["max"] = "max";
22
- StandardAggregateMethods["average"] = "average";
23
- StandardAggregateMethods["countdistinct"] = "countdistinct";
24
- })(StandardAggregateMethods || (StandardAggregateMethods = {}));
25
- export var QueryCustomTypes;
26
- (function (QueryCustomTypes) {
27
- QueryCustomTypes[QueryCustomTypes["Raw"] = 0] = "Raw";
28
- QueryCustomTypes[QueryCustomTypes["Alias"] = 1] = "Alias";
29
- QueryCustomTypes[QueryCustomTypes["Duration"] = 2] = "Duration";
30
- QueryCustomTypes[QueryCustomTypes["Binary"] = 3] = "Binary";
31
- })(QueryCustomTypes || (QueryCustomTypes = {}));
32
- //https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_QueryOptions
33
- export const raw = (value) => ({
34
- type: QueryCustomTypes.Raw,
35
- value,
36
- });
37
- export const alias = (value, name) => ({
38
- type: QueryCustomTypes.Alias,
39
- value,
40
- name,
41
- });
42
- export const duration = (value) => ({
43
- type: QueryCustomTypes.Duration,
44
- value,
45
- });
46
- export const binary = (value) => ({
47
- type: QueryCustomTypes.Binary,
48
- value,
49
- });
50
- export const isQueryCustomType = (value) => typeof value === 'object' &&
51
- 'type' in value &&
52
- value.type in QueryCustomTypes;
53
- export const ITEM_ROOT = '';
54
- export default function ({ select, search, skiptoken, format, top, skip, filter, transform, orderBy, key, count, expand, action, func, } = {}) {
55
- const [path, params] = buildPathAndQuery({
56
- select,
57
- search,
58
- skiptoken,
59
- format,
60
- top,
61
- skip,
62
- filter,
63
- transform,
64
- orderBy,
65
- key,
66
- count,
67
- expand,
68
- action,
69
- func,
70
- });
71
- return buildUrl(path, params);
72
- }
73
- export function buildPathAndQuery({ select, search, skiptoken, format, top, skip, filter, transform, orderBy, key, count, expand, action, func, } = {}) {
74
- let path = '';
75
- let aliases = [];
76
- const query = {};
77
- // key is not (null, undefined)
78
- if (key != undefined) {
79
- path += `(${handleValue(key, aliases)})`;
80
- }
81
- if (select) {
82
- query.$select = Array.isArray(select) ? select.join(',') : select;
83
- }
84
- if (search) {
85
- query.$search = search;
86
- }
87
- if (skiptoken) {
88
- query.$skiptoken = skiptoken;
89
- }
90
- if (format) {
91
- query.$format = format;
92
- }
93
- if (filter || typeof count === 'object') {
94
- query.$filter = buildFilter(typeof count === 'object' ? count : filter, aliases);
95
- }
96
- if (transform) {
97
- query.$apply = buildTransforms(transform);
98
- }
99
- if (expand) {
100
- query.$expand = buildExpand(expand);
101
- }
102
- if (orderBy) {
103
- query.$orderby = buildOrderBy(orderBy);
104
- }
105
- if (count) {
106
- if (typeof count === 'boolean') {
107
- query.$count = true;
108
- }
109
- else {
110
- path += '/$count';
111
- }
112
- }
113
- if (typeof top === 'number') {
114
- query.$top = top;
115
- }
116
- if (typeof skip === 'number') {
117
- query.$skip = skip;
118
- }
119
- if (action) {
120
- path += `/${action}`;
121
- }
122
- if (func) {
123
- if (typeof func === 'string') {
124
- path += `/${func}`;
125
- }
126
- else if (typeof func === 'object') {
127
- const [funcName] = Object.keys(func);
128
- const funcArgs = handleValue(func[funcName], aliases);
129
- path += `/${funcName}`;
130
- if (funcArgs !== '') {
131
- path += `(${funcArgs})`;
132
- }
133
- }
134
- }
135
- if (aliases.length > 0) {
136
- Object.assign(query, aliases.reduce((acc, alias) => Object.assign(acc, { [`@${alias.name}`]: handleValue(alias.value) }), {}));
137
- }
138
- // Filter empty values
139
- const params = Object.entries(query)
140
- .filter(([, value]) => value !== undefined && value !== '')
141
- .reduce((acc, [key, value]) => Object.assign(acc, { [key]: value }), {});
142
- return [path, params];
143
- }
144
- function renderPrimitiveValue(key, val, aliases = []) {
145
- return `${key} eq ${handleValue(val, aliases)}`;
146
- }
147
- function buildFilter(filters = {}, aliases = [], propPrefix = '') {
148
- return (Array.isArray(filters) ? filters : [filters]).reduce((acc, filter) => {
149
- if (filter) {
150
- const builtFilter = buildFilterCore(filter, aliases, propPrefix);
151
- if (builtFilter) {
152
- acc.push(builtFilter);
153
- }
154
- }
155
- return acc;
156
- }, []).join(' and ');
157
- function buildFilterCore(filter = {}, aliases = [], propPrefix = '') {
158
- let filterExpr = '';
159
- if (typeof filter === 'string') {
160
- // Use raw filter string
161
- filterExpr = filter;
162
- }
163
- else if (filter && typeof filter === 'object') {
164
- const filtersArray = Object.keys(filter).reduce((result, filterKey) => {
165
- const value = filter[filterKey];
166
- let propName = '';
167
- if (propPrefix) {
168
- if (filterKey === ITEM_ROOT) {
169
- propName = propPrefix;
170
- }
171
- else if (INDEXOF_REGEX.test(filterKey)) {
172
- propName = filterKey.replace(INDEXOF_REGEX, (_, $1) => $1.trim() === ITEM_ROOT
173
- ? `(${propPrefix})`
174
- : `(${propPrefix}/${$1.trim()})`);
175
- }
176
- else if (FUNCTION_REGEX.test(filterKey)) {
177
- propName = filterKey.replace(FUNCTION_REGEX, (_, $1) => $1.trim() === ITEM_ROOT
178
- ? `(${propPrefix})`
179
- : `(${propPrefix}/${$1.trim()})`);
180
- }
181
- else {
182
- propName = `${propPrefix}/${filterKey}`;
183
- }
184
- }
185
- else {
186
- propName = filterKey;
187
- }
188
- if (filterKey === ITEM_ROOT && Array.isArray(value)) {
189
- return result.concat(value.map((arrayValue) => renderPrimitiveValue(propName, arrayValue)));
190
- }
191
- if (['number', 'string', 'boolean'].indexOf(typeof value) !== -1 ||
192
- value instanceof Date ||
193
- value === null) {
194
- // Simple key/value handled as equals operator
195
- result.push(renderPrimitiveValue(propName, value, aliases));
196
- }
197
- else if (Array.isArray(value)) {
198
- const op = filterKey;
199
- const builtFilters = value
200
- .map((v) => buildFilter(v, aliases, propPrefix))
201
- .filter((f) => f)
202
- .map((f) => LOGICAL_OPERATORS.indexOf(op) !== -1 ? `(${f})` : f);
203
- if (builtFilters.length) {
204
- if (LOGICAL_OPERATORS.indexOf(op) !== -1) {
205
- if (builtFilters.length) {
206
- if (op === 'not') {
207
- result.push(parseNot(builtFilters));
208
- }
209
- else {
210
- result.push(`(${builtFilters.join(` ${op} `)})`);
211
- }
212
- }
213
- }
214
- else {
215
- result.push(builtFilters.join(` ${op} `));
216
- }
217
- }
218
- }
219
- else if (LOGICAL_OPERATORS.indexOf(propName) !== -1) {
220
- const op = propName;
221
- const builtFilters = Object.keys(value).map((valueKey) => buildFilterCore({ [valueKey]: value[valueKey] }));
222
- if (builtFilters.length) {
223
- if (op === 'not') {
224
- result.push(parseNot(builtFilters));
225
- }
226
- else {
227
- result.push(`${builtFilters.join(` ${op} `)}`);
228
- }
229
- }
230
- }
231
- else if (typeof value === 'object') {
232
- if ('type' in value) {
233
- result.push(renderPrimitiveValue(propName, value, aliases));
234
- }
235
- else {
236
- const operators = Object.keys(value);
237
- operators.forEach((op) => {
238
- if (COMPARISON_OPERATORS.indexOf(op) !== -1) {
239
- result.push(`${propName} ${op} ${handleValue(value[op], aliases)}`);
240
- }
241
- else if (LOGICAL_OPERATORS.indexOf(op) !== -1) {
242
- if (Array.isArray(value[op])) {
243
- result.push(value[op]
244
- .map((v) => '(' + buildFilterCore(v, aliases, propName) + ')')
245
- .join(` ${op} `));
246
- }
247
- else {
248
- result.push('(' + buildFilterCore(value[op], aliases, propName) + ')');
249
- }
250
- }
251
- else if (COLLECTION_OPERATORS.indexOf(op) !== -1) {
252
- const collectionClause = buildCollectionClause(filterKey.toLowerCase(), value[op], op, propName);
253
- if (collectionClause) {
254
- result.push(collectionClause);
255
- }
256
- }
257
- else if (op === 'has') {
258
- result.push(`${propName} ${op} ${handleValue(value[op], aliases)}`);
259
- }
260
- else if (op === 'in') {
261
- const resultingValues = Array.isArray(value[op])
262
- ? value[op]
263
- : value[op].value.map((typedValue) => ({
264
- type: value[op].type,
265
- value: typedValue,
266
- }));
267
- result.push(propName +
268
- ' in (' +
269
- resultingValues
270
- .map((v) => handleValue(v, aliases))
271
- .join(',') +
272
- ')');
273
- }
274
- else if (BOOLEAN_FUNCTIONS.indexOf(op) !== -1) {
275
- // Simple boolean functions (startswith, endswith, contains)
276
- result.push(`${op}(${propName},${handleValue(value[op], aliases)})`);
277
- }
278
- else {
279
- // Nested property
280
- const filter = buildFilterCore(value, aliases, propName);
281
- if (filter) {
282
- result.push(filter);
283
- }
284
- }
285
- });
286
- }
287
- }
288
- else if (value === undefined) {
289
- // Ignore/omit filter if value is `undefined`
290
- }
291
- else {
292
- throw new Error(`Unexpected value type: ${value}`);
293
- }
294
- return result;
295
- }, []);
296
- filterExpr = filtersArray.join(' and ');
297
- } /* else {
298
- throw new Error(`Unexpected filters type: ${filter}`);
299
- } */
300
- return filterExpr;
301
- }
302
- function buildCollectionClause(lambdaParameter, value, op, propName) {
303
- let clause = '';
304
- if (typeof value === 'string' || value instanceof String) {
305
- clause = getStringCollectionClause(lambdaParameter, value, op, propName);
306
- }
307
- else if (value) {
308
- // normalize {any:[{prop1: 1}, {prop2: 1}]} --> {any:{prop1: 1, prop2: 1}}; same for 'all',
309
- // simple values collection: {any:[{'': 'simpleVal1'}, {'': 'simpleVal2'}]} --> {any:{'': ['simpleVal1', 'simpleVal2']}}; same for 'all',
310
- const filterValue = Array.isArray(value)
311
- ? value.reduce((acc, item) => {
312
- if (item.hasOwnProperty(ITEM_ROOT)) {
313
- if (!acc.hasOwnProperty(ITEM_ROOT)) {
314
- acc[ITEM_ROOT] = [];
315
- }
316
- acc[ITEM_ROOT].push(item[ITEM_ROOT]);
317
- return acc;
318
- }
319
- return Object.assign(Object.assign({}, acc), item);
320
- }, {})
321
- : value;
322
- const filter = buildFilterCore(filterValue, aliases, lambdaParameter);
323
- clause = `${propName}/${op}(${filter ? `${lambdaParameter}:${filter}` : ''})`;
324
- }
325
- return clause;
326
- }
327
- }
328
- function getStringCollectionClause(lambdaParameter, value, collectionOperator, propName) {
329
- let clause = '';
330
- const conditionOperator = collectionOperator == 'all' ? 'ne' : 'eq';
331
- clause = `${propName}/${collectionOperator}(${lambdaParameter}: ${lambdaParameter} ${conditionOperator} '${value}')`;
332
- return clause;
333
- }
334
- function escapeIllegalChars(string) {
335
- string = string.replace(/%/g, '%25');
336
- string = string.replace(/\+/g, '%2B');
337
- string = string.replace(/\//g, '%2F');
338
- string = string.replace(/\?/g, '%3F');
339
- string = string.replace(/#/g, '%23');
340
- string = string.replace(/&/g, '%26');
341
- string = string.replace(/'/g, "''");
342
- return string;
343
- }
344
- function handleValue(value, aliases) {
345
- if (typeof value === 'string') {
346
- return `'${escapeIllegalChars(value)}'`;
347
- }
348
- else if (value instanceof Date) {
349
- return value.toISOString();
350
- }
351
- else if (typeof value === 'number') {
352
- return value;
353
- }
354
- else if (Array.isArray(value)) {
355
- return `[${value.map((d) => handleValue(d)).join(',')}]`;
356
- }
357
- else if (value === null) {
358
- return value;
359
- }
360
- else if (typeof value === 'object') {
361
- switch (value.type) {
362
- case QueryCustomTypes.Raw:
363
- return value.value;
364
- case QueryCustomTypes.Duration:
365
- return `duration'${value.value}'`;
366
- case QueryCustomTypes.Binary:
367
- return `binary'${value.value}'`;
368
- case QueryCustomTypes.Alias:
369
- // Store
370
- if (Array.isArray(aliases))
371
- aliases.push(value);
372
- return `@${value.name}`;
373
- default:
374
- return Object.entries(value)
375
- .filter(([, v]) => v !== undefined)
376
- .map(([k, v]) => `${k}=${handleValue(v, aliases)}`)
377
- .join(',');
378
- }
379
- }
380
- return value;
381
- }
382
- function buildExpand(expands) {
383
- if (typeof expands === 'number') {
384
- return expands;
385
- }
386
- else if (typeof expands === 'string') {
387
- if (expands.indexOf('/') === -1) {
388
- return expands;
389
- }
390
- // Change `Foo/Bar/Baz` to `Foo($expand=Bar($expand=Baz))`
391
- return expands
392
- .split('/')
393
- .reverse()
394
- .reduce((results, item, index, arr) => {
395
- if (index === 0) {
396
- // Inner-most item
397
- return `$expand=${item}`;
398
- }
399
- else if (index === arr.length - 1) {
400
- // Outer-most item, don't add `$expand=` prefix (added above)
401
- return `${item}(${results})`;
402
- }
403
- else {
404
- // Other items
405
- return `$expand=${item}(${results})`;
406
- }
407
- }, '');
408
- }
409
- else if (Array.isArray(expands)) {
410
- return `${expands
411
- .map((e) => buildExpand(e))
412
- .join(',')}`;
413
- }
414
- else if (typeof expands === 'object') {
415
- const expandKeys = Object.keys(expands);
416
- if (expandKeys.some((key) => SUPPORTED_EXPAND_PROPERTIES.indexOf(key.toLowerCase()) !== -1)) {
417
- return expandKeys
418
- .map((key) => {
419
- let value;
420
- switch (key) {
421
- case 'filter':
422
- value = buildFilter(expands[key]);
423
- break;
424
- case 'orderBy':
425
- value = buildOrderBy(expands[key]);
426
- break;
427
- case 'levels':
428
- case 'count':
429
- case 'top':
430
- value = `${expands[key]}`;
431
- break;
432
- default:
433
- value = buildExpand(expands[key]);
434
- }
435
- return `$${key.toLowerCase()}=${value}`;
436
- })
437
- .join(';');
438
- }
439
- else {
440
- return expandKeys
441
- .map((key) => {
442
- const builtExpand = buildExpand(expands[key]);
443
- return builtExpand ? `${key}(${builtExpand})` : key;
444
- })
445
- .join(',');
446
- }
447
- }
448
- return '';
449
- }
450
- function buildTransforms(transforms) {
451
- // Wrap single object an array for simplified processing
452
- const transformsArray = Array.isArray(transforms) ? transforms : [transforms];
453
- const transformsResult = transformsArray.reduce((result, transform) => {
454
- const { aggregate, filter, groupBy } = transform, rest = __rest(transform, ["aggregate", "filter", "groupBy"]);
455
- // TODO: support as many of the following:
456
- // topcount, topsum, toppercent,
457
- // bottomsum, bottomcount, bottompercent,
458
- // identity, concat, expand, search, compute, isdefined
459
- const unsupportedKeys = Object.keys(rest);
460
- if (unsupportedKeys.length) {
461
- throw new Error(`Unsupported transform(s): ${unsupportedKeys}`);
462
- }
463
- if (aggregate) {
464
- result.push(`aggregate(${buildAggregate(aggregate)})`);
465
- }
466
- if (filter) {
467
- const builtFilter = buildFilter(filter);
468
- if (builtFilter) {
469
- result.push(`filter(${buildFilter(builtFilter)})`);
470
- }
471
- }
472
- if (groupBy) {
473
- result.push(`groupby(${buildGroupBy(groupBy)})`);
474
- }
475
- return result;
476
- }, []);
477
- return transformsResult.join('/') || undefined;
478
- }
479
- function buildAggregate(aggregate) {
480
- // Wrap single object in an array for simplified processing
481
- const aggregateArray = Array.isArray(aggregate) ? aggregate : [aggregate];
482
- return aggregateArray
483
- .map((aggregateItem) => {
484
- return typeof aggregateItem === 'string'
485
- ? aggregateItem
486
- : Object.keys(aggregateItem).map((aggregateKey) => {
487
- const aggregateValue = aggregateItem[aggregateKey];
488
- // TODO: Are these always required? Can/should we default them if so?
489
- if (!aggregateValue.with) {
490
- throw new Error(`'with' property required for '${aggregateKey}'`);
491
- }
492
- if (!aggregateValue.as) {
493
- throw new Error(`'as' property required for '${aggregateKey}'`);
494
- }
495
- return `${aggregateKey} with ${aggregateValue.with} as ${aggregateValue.as}`;
496
- });
497
- })
498
- .join(',');
499
- }
500
- function buildGroupBy(groupBy) {
501
- if (!groupBy.properties) {
502
- throw new Error(`'properties' property required for groupBy`);
503
- }
504
- let result = `(${groupBy.properties.join(',')})`;
505
- if (groupBy.transform) {
506
- result += `,${buildTransforms(groupBy.transform)}`;
507
- }
508
- return result;
509
- }
510
- function buildOrderBy(orderBy, prefix = '') {
511
- if (Array.isArray(orderBy)) {
512
- return orderBy
513
- .map((value) => Array.isArray(value) &&
514
- value.length === 2 &&
515
- ['asc', 'desc'].indexOf(value[1]) !== -1
516
- ? value.join(' ')
517
- : value)
518
- .map((v) => `${prefix}${v}`)
519
- .join(',');
520
- }
521
- else if (typeof orderBy === 'object') {
522
- return Object.entries(orderBy)
523
- .map(([k, v]) => buildOrderBy(v, `${k}/`))
524
- .map((v) => `${prefix}${v}`)
525
- .join(',');
526
- }
527
- return `${prefix}${orderBy}`;
528
- }
529
- function buildUrl(path, params) {
530
- // This can be refactored using URL API. But IE does not support it.
531
- const queries = Object.entries(params).map(([key, value]) => `${key}=${value}`);
532
- return queries.length ? `${path}?${queries.join('&')}` : path;
533
- }
534
- function parseNot(builtFilters) {
535
- return `not(${builtFilters.join(' and ')})`;
536
- }
537
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9yZXNvdXJjZXMvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0MsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM1QyxNQUFNLGlCQUFpQixHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqRSxNQUFNLDJCQUEyQixHQUFHO0lBQ2xDLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLEtBQUs7SUFDTCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7Q0FDVCxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDO0FBQ2xDLE1BQU0sYUFBYSxHQUFHLHNCQUFzQixDQUFDO0FBUTdDLE1BQU0sQ0FBTixJQUFZLHdCQU1YO0FBTkQsV0FBWSx3QkFBd0I7SUFDbEMsdUNBQVcsQ0FBQTtJQUNYLHVDQUFXLENBQUE7SUFDWCx1Q0FBVyxDQUFBO0lBQ1gsK0NBQW1CLENBQUE7SUFDbkIsMkRBQStCLENBQUE7QUFDakMsQ0FBQyxFQU5XLHdCQUF3QixLQUF4Qix3QkFBd0IsUUFNbkM7QUE0Q0QsTUFBTSxDQUFOLElBQVksZ0JBS1g7QUFMRCxXQUFZLGdCQUFnQjtJQUMxQixxREFBRyxDQUFBO0lBQ0gseURBQUssQ0FBQTtJQUNMLCtEQUFRLENBQUE7SUFDUiwyREFBTSxDQUFBO0FBQ1IsQ0FBQyxFQUxXLGdCQUFnQixLQUFoQixn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LENBQWlCLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3pELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7YUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFZLEVBQUUsTUFBK0I7SUFDN0Qsb0VBQW9FO0lBQ3BFLE1BQU0sT0FBTyxHQUFhLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUNsRCxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FDcEMsQ0FBQztJQUNGLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDaEUsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLFlBQXNCO0lBQ3RDLE9BQU8sT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IENPTVBBUklTT05fT1BFUkFUT1JTID0gWydlcScsICduZScsICdndCcsICdnZScsICdsdCcsICdsZSddO1xuY29uc3QgTE9HSUNBTF9PUEVSQVRPUlMgPSBbJ2FuZCcsICdvcicsICdub3QnXTtcbmNvbnN0IENPTExFQ1RJT05fT1BFUkFUT1JTID0gWydhbnknLCAnYWxsJ107XG5jb25zdCBCT09MRUFOX0ZVTkNUSU9OUyA9IFsnc3RhcnRzd2l0aCcsICdlbmRzd2l0aCcsICdjb250YWlucyddO1xuY29uc3QgU1VQUE9SVEVEX0VYUEFORF9QUk9QRVJUSUVTID0gW1xuICAnZXhwYW5kJyxcbiAgJ2xldmVscycsXG4gICdzZWxlY3QnLFxuICAndG9wJyxcbiAgJ2NvdW50JyxcbiAgJ29yZGVyYnknLFxuICAnZmlsdGVyJyxcbl07XG5cbmNvbnN0IEZVTkNUSU9OX1JFR0VYID0gL1xcKCguKilcXCkvO1xuY29uc3QgSU5ERVhPRl9SRUdFWCA9IC8oPyFpbmRleG9mKVxcKChcXHcrKVxcKS87XG5cbmV4cG9ydCB0eXBlIFVucGFja2VkPFQ+ID0gVCBleHRlbmRzIChpbmZlciBVKVtdID8gVSA6IFQ7XG5leHBvcnQgdHlwZSBTZWxlY3Q8VD4gPSBTZWxlY3RUeXBlPFQ+IHwgU2VsZWN0VHlwZTxUPltdO1xuZXhwb3J0IHR5cGUgU2VsZWN0VHlwZTxUPiA9IHN0cmluZyB8IGtleW9mIFQ7XG5leHBvcnQgdHlwZSBGaWx0ZXIgPSBGaWx0ZXJUeXBlIHwgRmlsdGVyVHlwZVtdO1xuZXhwb3J0IHR5cGUgRmlsdGVyVHlwZSA9IHN0cmluZyB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuXG5leHBvcnQgZW51bSBTdGFuZGFyZEFnZ3JlZ2F0ZU1ldGhvZHMge1xuICBzdW0gPSAnc3VtJyxcbiAgbWluID0gJ21pbicsXG4gIG1heCA9ICdtYXgnLFxuICBhdmVyYWdlID0gJ2F2ZXJhZ2UnLFxuICBjb3VudGRpc3RpbmN0ID0gJ2NvdW50ZGlzdGluY3QnLFxufVxuZXhwb3J0IHR5cGUgQWdncmVnYXRlID1cbiAgfCBzdHJpbmdcbiAgfCB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IHsgd2l0aDogU3RhbmRhcmRBZ2dyZWdhdGVNZXRob2RzOyBhczogc3RyaW5nIH0gfTtcblxuLy8gT3JkZXJCeVxuXG5leHBvcnQgdHlwZSBPcmRlckJ5PFQ+ID0gT3JkZXJCeVR5cGU8VD4gfCBPcmRlckJ5VHlwZTxUPltdO1xuZXhwb3J0IHR5cGUgT3JkZXJCeVR5cGU8VD4gPSBzdHJpbmcgfCBPcmRlckJ5T2JqZWN0PFQ+O1xuZXhwb3J0IHR5cGUgT3JkZXJCeU9iamVjdDxUPiA9IGtleW9mIFQgfCBba2V5b2YgVCB8IHN0cmluZywgJ2FzYycgfCAnZGVzYyddO1xuLy9UT0RPOiBzdXBwb3J0IGFuZ3VsYXIgMTIgcmVjdXJzaXZlIHR5cGU6XG4vKlxuZXhwb3J0IHR5cGUgT3JkZXJCeU9wdGlvbnM8VD4gPSBrZXlvZiBUIHwgWyBrZXlvZiBUIHwgc3RyaW5nLCAnYXNjJyB8ICdkZXNjJyBdO1xuZXhwb3J0IHR5cGUgTmVzdGVkT3JkZXJCeTxUPiA9IHsgW1AgaW4ga2V5b2YgVF0/OiBUW1BdIGV4dGVuZHMgQXJyYXk8aW5mZXIgRT4gPyBPcmRlckJ5PEU+IDogT3JkZXJCeTxUW1BdPiB9XG5leHBvcnQgdHlwZSBPcmRlckJ5PFQ+ID0gc3RyaW5nIHwgT3JkZXJCeU9wdGlvbnM8VD4gfCBBcnJheTxPcmRlckJ5T3B0aW9uczxUPj4gfCBOZXN0ZWRPcmRlckJ5PFQ+O1xuKi9cblxuLy8gRXhwYW5kXG5leHBvcnQgdHlwZSBFeHBhbmQ8VD4gPSBFeHBhbmRUeXBlPFQ+IHwgRXhwYW5kVHlwZTxUPltdO1xuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZTxUPiA9IHN0cmluZyB8IEV4cGFuZE9iamVjdDxUPjtcbmV4cG9ydCB0eXBlIEV4cGFuZE9iamVjdDxUPiA9IGtleW9mIFQgfCBOZXN0ZWRFeHBhbmRPcHRpb25zPFQ+O1xuZXhwb3J0IHR5cGUgTmVzdGVkRXhwYW5kT3B0aW9uczxUPiA9IHtcbiAgW1AgaW4ga2V5b2YgVF0/OiBFeHBhbmRPcHRpb25zPFVucGFja2VkPFRbUF0+Pjtcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRPcHRpb25zPFQ+ID0ge1xuICBzZWxlY3Q/OiBTZWxlY3Q8VD47XG4gIGZpbHRlcj86IEZpbHRlcjtcbiAgb3JkZXJCeT86IE9yZGVyQnk8VD47XG4gIHRvcD86IG51bWJlcjtcbiAgbGV2ZWxzPzogbnVtYmVyIHwgJ21heCc7XG4gIGNvdW50PzogYm9vbGVhbiB8IEZpbHRlcjtcbiAgZXhwYW5kPzogRXhwYW5kPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtPFQ+ID0ge1xuICBhZ2dyZWdhdGU/OiBBZ2dyZWdhdGUgfCBBcnJheTxBZ2dyZWdhdGU+O1xuICBmaWx0ZXI/OiBGaWx0ZXI7XG4gIGdyb3VwQnk/OiBHcm91cEJ5PFQ+O1xufTtcbmV4cG9ydCB0eXBlIEdyb3VwQnk8VD4gPSB7XG4gIHByb3BlcnRpZXM6IEFycmF5PGtleW9mIFQ+O1xuICB0cmFuc2Zvcm0/OiBUcmFuc2Zvcm08VD47XG59O1xuXG5leHBvcnQgZW51bSBRdWVyeUN1c3RvbVR5cGVzIHtcbiAgUmF3LFxuICBBbGlhcyxcbiAgRHVyYXRpb24sXG4gIEJpbmFyeSxcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlDdXN0b21UeXBlID0ge1xuICB0eXBlOiBRdWVyeUN1c3RvbVR5cGVzO1xuICB2YWx1ZTogYW55O1xuICBuYW1lPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFZhbHVlID0gc3RyaW5nIHwgRGF0ZSB8IG51bWJlciB8IGJvb2xlYW4gfCBRdWVyeUN1c3RvbVR5cGU7XG5cbi8vaHR0cHM6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL29kYXRhL29kYXRhL3Y0LjAxL29kYXRhLXY0LjAxLXBhcnQyLXVybC1jb252ZW50aW9ucy5odG1sI3NlY19RdWVyeU9wdGlvbnNcbmV4cG9ydCBjb25zdCByYXcgPSAodmFsdWU6IHN0cmluZyk6IFF1ZXJ5Q3VzdG9tVHlwZSA9PiAoe1xuICB0eXBlOiBRdWVyeUN1c3RvbVR5cGVzLlJhdyxcbiAgdmFsdWUsXG59KTtcbmV4cG9ydCBjb25zdCBhbGlhcyA9ICh2YWx1ZTogYW55LCBuYW1lPzogc3RyaW5nKTogUXVlcnlDdXN0b21UeXBlID0+ICh7XG4gIHR5cGU6IFF1ZXJ5Q3VzdG9tVHlwZXMuQWxpYXMsXG4gIHZhbHVlLFxuICBuYW1lLFxufSk7XG5leHBvcnQgY29uc3QgZHVyYXRpb24gPSAodmFsdWU6IHN0cmluZyk6IFF1ZXJ5Q3VzdG9tVHlwZSA9PiAoe1xuICB0eXBlOiBRdWVyeUN1c3RvbVR5cGVzLkR1cmF0aW9uLFxuICB2YWx1ZSxcbn0pO1xuZXhwb3J0IGNvbnN0IGJpbmFyeSA9ICh2YWx1ZTogc3RyaW5nKTogUXVlcnlDdXN0b21UeXBlID0+ICh7XG4gIHR5cGU6IFF1ZXJ5Q3VzdG9tVHlwZXMuQmluYXJ5LFxuICB2YWx1ZSxcbn0pO1xuZXhwb3J0IGNvbnN0IGlzUXVlcnlDdXN0b21UeXBlID0gKHZhbHVlOiBhbnkpID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgJ3R5cGUnIGluIHZhbHVlICYmXG4gIHZhbHVlLnR5cGUgaW4gUXVlcnlDdXN0b21UeXBlcztcbmV4cG9ydCB0eXBlIFF1ZXJ5T3B0aW9uczxUPiA9IEV4cGFuZE9wdGlvbnM8VD4gJiB7XG4gIHNlYXJjaDogc3RyaW5nO1xuICB0cmFuc2Zvcm06IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXTtcbiAgc2tpcDogbnVtYmVyO1xuICBza2lwdG9rZW46IHN0cmluZztcbiAga2V5OiBzdHJpbmcgfCBudW1iZXIgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgY291bnQ6IGJvb2xlYW4gfCBGaWx0ZXI7XG4gIGFjdGlvbjogc3RyaW5nO1xuICBmdW5jOiBzdHJpbmcgfCB7IFtmdW5jdGlvbk5hbWU6IHN0cmluZ106IHsgW3BhcmFtZXRlck5hbWU6IHN0cmluZ106IGFueSB9IH07XG4gIGZvcm1hdDogc3RyaW5nO1xuICBhbGlhc2VzOiBRdWVyeUN1c3RvbVR5cGVbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBJVEVNX1JPT1QgPSAnJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gPFQ+KHtcbiAgc2VsZWN0LFxuICBzZWFyY2gsXG4gIHNraXB0b2tlbixcbiAgZm9ybWF0LFxuICB0b3AsXG4gIHNraXAsXG4gIGZpbHRlcixcbiAgdHJhbnNmb3JtLFxuICBvcmRlckJ5LFxuICBrZXksXG4gIGNvdW50LFxuICBleHBhbmQsXG4gIGFjdGlvbixcbiAgZnVuYyxcbn06IFBhcnRpYWw8UXVlcnlPcHRpb25zPFQ+PiA9IHt9KSB7XG4gIGNvbnN0IFtwYXRoLCBwYXJhbXNdID0gYnVpbGRQYXRoQW5kUXVlcnkoe1xuICAgIHNlbGVjdCxcbiAgICBzZWFyY2gsXG4gICAgc2tpcHRva2VuLFxuICAgIGZvcm1hdCxcbiAgICB0b3AsXG4gICAgc2tpcCxcbiAgICBmaWx0ZXIsXG4gICAgdHJhbnNmb3JtLFxuICAgIG9yZGVyQnksXG4gICAga2V5LFxuICAgIGNvdW50LFxuICAgIGV4cGFuZCxcbiAgICBhY3Rpb24sXG4gICAgZnVuYyxcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1aWxkVXJsKHBhdGgsIHBhcmFtcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBhdGhBbmRRdWVyeTxUPih7XG4gIHNlbGVjdCxcbiAgc2VhcmNoLFxuICBza2lwdG9rZW4sXG4gIGZvcm1hdCxcbiAgdG9wLFxuICBza2lwLFxuICBmaWx0ZXIsXG4gIHRyYW5zZm9ybSxcbiAgb3JkZXJCeSxcbiAga2V5LFxuICBjb3VudCxcbiAgZXhwYW5kLFxuICBhY3Rpb24sXG4gIGZ1bmMsXG59OiBQYXJ0aWFsPFF1ZXJ5T3B0aW9uczxUPj4gPSB7fSk6IFtzdHJpbmcsIHsgW25hbWU6IHN0cmluZ106IGFueSB9XSB7XG4gIGxldCBwYXRoOiBzdHJpbmcgPSAnJztcbiAgbGV0IGFsaWFzZXM6IFF1ZXJ5Q3VzdG9tVHlwZVtdID0gW107XG5cbiAgY29uc3QgcXVlcnk6IGFueSA9IHt9O1xuXG4gIC8vIGtleSBpcyBub3QgKG51bGwsIHVuZGVmaW5lZClcbiAgaWYgKGtleSAhPSB1bmRlZmluZWQpIHtcbiAgICBwYXRoICs9IGAoJHtoYW5kbGVWYWx1ZShrZXkgYXMgVmFsdWUsIGFsaWFzZXMpfSlgO1xuICB9XG5cbiAgaWYgKHNlbGVjdCkge1xuICAgIHF1ZXJ5LiRzZWxlY3QgPSBBcnJheS5pc0FycmF5KHNlbGVjdCkgPyBzZWxlY3Quam9pbignLCcpIDogc2VsZWN0O1xuICB9XG5cbiAgaWYgKHNlYXJjaCkge1xuICAgIHF1ZXJ5LiRzZWFyY2ggPSBzZWFyY2g7XG4gIH1cblxuICBpZiAoc2tpcHRva2VuKSB7XG4gICAgcXVlcnkuJHNraXB0b2tlbiA9IHNraXB0b2tlbjtcbiAgfVxuXG4gIGlmIChmb3JtYXQpIHtcbiAgICBxdWVyeS4kZm9ybWF0ID0gZm9ybWF0O1xuICB9XG5cbiAgaWYgKGZpbHRlciB8fCB0eXBlb2YgY291bnQgPT09ICdvYmplY3QnKSB7XG4gICAgcXVlcnkuJGZpbHRlciA9IGJ1aWxkRmlsdGVyKFxuICAgICAgdHlwZW9mIGNvdW50ID09PSAnb2JqZWN0JyA/IGNvdW50IDogZmlsdGVyLFxuICAgICAgYWxpYXNlc1xuICAgICk7XG4gIH1cblxuICBpZiAodHJhbnNmb3JtKSB7XG4gICAgcXVlcnkuJGFwcGx5ID0gYnVpbGRUcmFuc2Zvcm1zKHRyYW5zZm9ybSk7XG4gIH1cblxuICBpZiAoZXhwYW5kKSB7XG4gICAgcXVlcnkuJGV4cGFuZCA9IGJ1aWxkRXhwYW5kKGV4cGFuZCk7XG4gIH1cblxuICBpZiAob3JkZXJCeSkge1xuICAgIHF1ZXJ5LiRvcmRlcmJ5ID0gYnVpbGRPcmRlckJ5KG9yZGVyQnkpO1xuICB9XG5cbiAgaWYgKGNvdW50KSB7XG4gICAgaWYgKHR5cGVvZiBjb3VudCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBxdWVyeS4kY291bnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoICs9ICcvJGNvdW50JztcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHRvcCA9PT0gJ251bWJlcicpIHtcbiAgICBxdWVyeS4kdG9wID0gdG9wO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBza2lwID09PSAnbnVtYmVyJykge1xuICAgIHF1ZXJ5LiRza2lwID0gc2tpcDtcbiAgfVxuXG4gIGlmIChhY3Rpb24pIHtcbiAgICBwYXRoICs9IGAvJHthY3Rpb259YDtcbiAgfVxuXG4gIGlmIChmdW5jKSB7XG4gICAgaWYgKHR5cGVvZiBmdW5jID09PSAnc3RyaW5nJykge1xuICAgICAgcGF0aCArPSBgLyR7ZnVuY31gO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZ1bmMgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBbZnVuY05hbWVdID0gT2JqZWN0LmtleXMoZnVuYyk7XG4gICAgICBjb25zdCBmdW5jQXJncyA9IGhhbmRsZVZhbHVlKGZ1bmNbZnVuY05hbWVdIGFzIFZhbHVlLCBhbGlhc2VzKTtcblxuICAgICAgcGF0aCArPSBgLyR7ZnVuY05hbWV9YDtcbiAgICAgIGlmIChmdW5jQXJncyAhPT0gJycpIHtcbiAgICAgICAgcGF0aCArPSBgKCR7ZnVuY0FyZ3N9KWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsaWFzZXMubGVuZ3RoID4gMCkge1xuICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICBxdWVyeSxcbiAgICAgIGFsaWFzZXMucmVkdWNlKFxuICAgICAgICAoYWNjLCBhbGlhcykgPT5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKGFjYywgeyBbYEAke2FsaWFzLm5hbWV9YF06IGhhbmRsZVZhbHVlKGFsaWFzLnZhbHVlKSB9KSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLy8gRmlsdGVyIGVtcHR5IHZhbHVlc1xuICBjb25zdCBwYXJhbXMgPSBPYmplY3QuZW50cmllcyhxdWVyeSlcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKVxuICAgIC5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiBPYmplY3QuYXNzaWduKGFjYywgeyBba2V5XTogdmFsdWUgfSksIHt9KTtcblxuICByZXR1cm4gW3BhdGgsIHBhcmFtc107XG59XG5cbmZ1bmN0aW9uIHJlbmRlclByaW1pdGl2ZVZhbHVlKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsOiBhbnksXG4gIGFsaWFzZXM6IFF1ZXJ5Q3VzdG9tVHlwZVtdID0gW11cbikge1xuICByZXR1cm4gYCR7a2V5fSBlcSAke2hhbmRsZVZhbHVlKHZhbCwgYWxpYXNlcyl9YDtcbn1cblxuZnVuY3Rpb24gYnVpbGRGaWx0ZXIoXG4gIGZpbHRlcnM6IEZpbHRlciA9IHt9LFxuICBhbGlhc2VzOiBRdWVyeUN1c3RvbVR5cGVbXSA9IFtdLFxuICBwcm9wUHJlZml4ID0gJydcbik6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgKEFycmF5LmlzQXJyYXkoZmlsdGVycykgPyBmaWx0ZXJzIDogW2ZpbHRlcnNdKS5yZWR1Y2UoXG4gICAgICAoYWNjOiBzdHJpbmdbXSwgZmlsdGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICBjb25zdCBidWlsdEZpbHRlciA9IGJ1aWxkRmlsdGVyQ29yZShmaWx0ZXIsIGFsaWFzZXMsIHByb3BQcmVmaXgpO1xuICAgICAgICAgIGlmIChidWlsdEZpbHRlcikge1xuICAgICAgICAgICAgYWNjLnB1c2goYnVpbHRGaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIFtdXG4gICAgKSBhcyBzdHJpbmdbXVxuICApLmpvaW4oJyBhbmQgJyk7XG5cbiAgZnVuY3Rpb24gYnVpbGRGaWx0ZXJDb3JlKFxuICAgIGZpbHRlcjogRmlsdGVyID0ge30sXG4gICAgYWxpYXNlczogUXVlcnlDdXN0b21UeXBlW10gPSBbXSxcbiAgICBwcm9wUHJlZml4ID0gJydcbiAgKSB7XG4gICAgbGV0IGZpbHRlckV4cHIgPSAnJztcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFVzZSByYXcgZmlsdGVyIHN0cmluZ1xuICAgICAgZmlsdGVyRXhwciA9IGZpbHRlcjtcbiAgICB9IGVsc2UgaWYgKGZpbHRlciAmJiB0eXBlb2YgZmlsdGVyID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgZmlsdGVyc0FycmF5ID0gT2JqZWN0LmtleXMoZmlsdGVyKS5yZWR1Y2UoXG4gICAgICAgIChyZXN1bHQ6IGFueVtdLCBmaWx0ZXJLZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IChmaWx0ZXIgYXMgYW55KVtmaWx0ZXJLZXldO1xuICAgICAgICAgIGxldCBwcm9wTmFtZSA9ICcnO1xuICAgICAgICAgIGlmIChwcm9wUHJlZml4KSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyS2V5ID09PSBJVEVNX1JPT1QpIHtcbiAgICAgICAgICAgICAgcHJvcE5hbWUgPSBwcm9wUHJlZml4O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChJTkRFWE9GX1JFR0VYLnRlc3QoZmlsdGVyS2V5KSkge1xuICAgICAgICAgICAgICBwcm9wTmFtZSA9IGZpbHRlcktleS5yZXBsYWNlKElOREVYT0ZfUkVHRVgsIChfLCAkMSkgPT5cbiAgICAgICAgICAgICAgICAkMS50cmltKCkgPT09IElURU1fUk9PVFxuICAgICAgICAgICAgICAgICAgPyBgKCR7cHJvcFByZWZpeH0pYFxuICAgICAgICAgICAgICAgICAgOiBgKCR7cHJvcFByZWZpeH0vJHskMS50cmltKCl9KWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRlVOQ1RJT05fUkVHRVgudGVzdChmaWx0ZXJLZXkpKSB7XG4gICAgICAgICAgICAgIHByb3BOYW1lID0gZmlsdGVyS2V5LnJlcGxhY2UoRlVOQ1RJT05fUkVHRVgsIChfLCAkMSkgPT5cbiAgICAgICAgICAgICAgICAkMS50cmltKCkgPT09IElURU1fUk9PVFxuICAgICAgICAgICAgICAgICAgPyBgKCR7cHJvcFByZWZpeH0pYFxuICAgICAgICAgICAgICAgICAgOiBgKCR7cHJvcFByZWZpeH0vJHskMS50cmltKCl9KWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHByb3BOYW1lID0gYCR7cHJvcFByZWZpeH0vJHtmaWx0ZXJLZXl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvcE5hbWUgPSBmaWx0ZXJLZXk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpbHRlcktleSA9PT0gSVRFTV9ST09UICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNvbmNhdChcbiAgICAgICAgICAgICAgdmFsdWUubWFwKChhcnJheVZhbHVlOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgcmVuZGVyUHJpbWl0aXZlVmFsdWUocHJvcE5hbWUsIGFycmF5VmFsdWUpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgWydudW1iZXInLCAnc3RyaW5nJywgJ2Jvb2xlYW4nXS5pbmRleE9mKHR5cGVvZiB2YWx1ZSkgIT09IC0xIHx8XG4gICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgIHZhbHVlID09PSBudWxsXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBTaW1wbGUga2V5L3ZhbHVlIGhhbmRsZWQgYXMgZXF1YWxzIG9wZXJhdG9yXG4gICAgICAgICAgICByZXN1bHQucHVzaChyZW5kZXJQcmltaXRpdmVWYWx1ZShwcm9wTmFtZSwgdmFsdWUsIGFsaWFzZXMpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBvcCA9IGZpbHRlcktleTtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWx0RmlsdGVycyA9IHZhbHVlXG4gICAgICAgICAgICAgIC5tYXAoKHYpID0+IGJ1aWxkRmlsdGVyKHYsIGFsaWFzZXMsIHByb3BQcmVmaXgpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChmKSA9PiBmKVxuICAgICAgICAgICAgICAubWFwKChmKSA9PlxuICAgICAgICAgICAgICAgIExPR0lDQUxfT1BFUkFUT1JTLmluZGV4T2Yob3ApICE9PSAtMSA/IGAoJHtmfSlgIDogZlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGJ1aWx0RmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgaWYgKExPR0lDQUxfT1BFUkFUT1JTLmluZGV4T2Yob3ApICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChidWlsdEZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBpZiAob3AgPT09ICdub3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlTm90KGJ1aWx0RmlsdGVycyBhcyBzdHJpbmdbXSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYCgke2J1aWx0RmlsdGVycy5qb2luKGAgJHtvcH0gYCl9KWApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChidWlsdEZpbHRlcnMuam9pbihgICR7b3B9IGApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoTE9HSUNBTF9PUEVSQVRPUlMuaW5kZXhPZihwcm9wTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBvcCA9IHByb3BOYW1lO1xuICAgICAgICAgICAgY29uc3QgYnVpbHRGaWx0ZXJzID0gT2JqZWN0LmtleXModmFsdWUpLm1hcCgodmFsdWVLZXkpID0+XG4gICAgICAgICAgICAgIGJ1aWxkRmlsdGVyQ29yZSh7IFt2YWx1ZUtleV06IHZhbHVlW3ZhbHVlS2V5XSB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChidWlsdEZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGlmIChvcCA9PT0gJ25vdCcpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwYXJzZU5vdChidWlsdEZpbHRlcnMgYXMgc3RyaW5nW10pKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChgJHtidWlsdEZpbHRlcnMuam9pbihgICR7b3B9IGApfWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoJ3R5cGUnIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJlbmRlclByaW1pdGl2ZVZhbHVlKHByb3BOYW1lLCB2YWx1ZSwgYWxpYXNlcykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgICAgICAgICBvcGVyYXRvcnMuZm9yRWFjaCgob3ApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQ09NUEFSSVNPTl9PUEVSQVRPUlMuaW5kZXhPZihvcCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7cHJvcE5hbWV9ICR7b3B9ICR7aGFuZGxlVmFsdWUodmFsdWVbb3BdLCBhbGlhc2VzKX1gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTE9HSUNBTF9PUEVSQVRPUlMuaW5kZXhPZihvcCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZVtvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW29wXVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHY6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCcgKyBidWlsZEZpbHRlckNvcmUodiwgYWxpYXNlcywgcHJvcE5hbWUpICsgJyknXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihgICR7b3B9IGApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAnKCcgKyBidWlsZEZpbHRlckNvcmUodmFsdWVbb3BdLCBhbGlhc2VzLCBwcm9wTmFtZSkgKyAnKSdcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENPTExFQ1RJT05fT1BFUkFUT1JTLmluZGV4T2Yob3ApICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkNsYXVzZSA9IGJ1aWxkQ29sbGVjdGlvbkNsYXVzZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyS2V5LnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlW29wXSxcbiAgICAgICAgICAgICAgICAgICAgb3AsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25DbGF1c2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29sbGVjdGlvbkNsYXVzZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJ2hhcycpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgJHtwcm9wTmFtZX0gJHtvcH0gJHtoYW5kbGVWYWx1ZSh2YWx1ZVtvcF0sIGFsaWFzZXMpfWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJ2luJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0aW5nVmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZVtvcF0pXG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWVbb3BdXG4gICAgICAgICAgICAgICAgICAgIDogdmFsdWVbb3BdLnZhbHVlLm1hcCgodHlwZWRWYWx1ZTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmFsdWVbb3BdLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgJyBpbiAoJyArXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh2OiBhbnkpID0+IGhhbmRsZVZhbHVlKHYsIGFsaWFzZXMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywnKSArXG4gICAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQk9PTEVBTl9GVU5DVElPTlMuaW5kZXhPZihvcCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTaW1wbGUgYm9vbGVhbiBmdW5jdGlvbnMgKHN0YXJ0c3dpdGgsIGVuZHN3aXRoLCBjb250YWlucylcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgJHtvcH0oJHtwcm9wTmFtZX0sJHtoYW5kbGVWYWx1ZSh2YWx1ZVtvcF0sIGFsaWFzZXMpfSlgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBOZXN0ZWQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGJ1aWxkRmlsdGVyQ29yZSh2YWx1ZSwgYWxpYXNlcywgcHJvcE5hbWUpO1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmaWx0ZXIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUvb21pdCBmaWx0ZXIgaWYgdmFsdWUgaXMgYHVuZGVmaW5lZGBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIHR5cGU6ICR7dmFsdWV9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgICAgW11cbiAgICAgICk7XG5cbiAgICAgIGZpbHRlckV4cHIgPSBmaWx0ZXJzQXJyYXkuam9pbignIGFuZCAnKTtcbiAgICB9IC8qIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZmlsdGVycyB0eXBlOiAke2ZpbHRlcn1gKTtcbiAgICAgIH0gKi9cbiAgICByZXR1cm4gZmlsdGVyRXhwcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkQ29sbGVjdGlvbkNsYXVzZShcbiAgICBsYW1iZGFQYXJhbWV0ZXI6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZ1xuICApIHtcbiAgICBsZXQgY2xhdXNlID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgY2xhdXNlID0gZ2V0U3RyaW5nQ29sbGVjdGlvbkNsYXVzZShsYW1iZGFQYXJhbWV0ZXIsIHZhbHVlLCBvcCwgcHJvcE5hbWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIC8vIG5vcm1hbGl6ZSB7YW55Olt7cHJvcDE6IDF9LCB7cHJvcDI6IDF9XX0gLS0+IHthbnk6e3Byb3AxOiAxLCBwcm9wMjogMX19OyBzYW1lIGZvciAnYWxsJyxcbiAgICAgIC8vIHNpbXBsZSB2YWx1ZXMgY29sbGVjdGlvbjoge2FueTpbeycnOiAnc2ltcGxlVmFsMSd9LCB7Jyc6ICdzaW1wbGVWYWwyJ31dfSAtLT4ge2FueTp7Jyc6IFsnc2ltcGxlVmFsMScsICdzaW1wbGVWYWwyJ119fTsgc2FtZSBmb3IgJ2FsbCcsXG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgID8gdmFsdWUucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmhhc093blByb3BlcnR5KElURU1fUk9PVCkpIHtcbiAgICAgICAgICAgICAgaWYgKCFhY2MuaGFzT3duUHJvcGVydHkoSVRFTV9ST09UKSkge1xuICAgICAgICAgICAgICAgIGFjY1tJVEVNX1JPT1RdID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYWNjW0lURU1fUk9PVF0ucHVzaChpdGVtW0lURU1fUk9PVF0pO1xuICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uYWNjLCAuLi5pdGVtIH07XG4gICAgICAgICAgfSwge30pXG4gICAgICAgIDogdmFsdWU7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IGJ1aWxkRmlsdGVyQ29yZShmaWx0ZXJWYWx1ZSwgYWxpYXNlcywgbGFtYmRhUGFyYW1ldGVyKTtcbiAgICAgIGNsYXVzZSA9IGAke3Byb3BOYW1lfS8ke29wfSgke1xuICAgICAgICBmaWx0ZXIgPyBgJHtsYW1iZGFQYXJhbWV0ZXJ9OiR7ZmlsdGVyfWAgOiAnJ1xuICAgICAgfSlgO1xuICAgIH1cbiAgICByZXR1cm4gY2xhdXNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0cmluZ0NvbGxlY3Rpb25DbGF1c2UoXG4gIGxhbWJkYVBhcmFtZXRlcjogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuICBjb2xsZWN0aW9uT3BlcmF0b3I6IHN0cmluZyxcbiAgcHJvcE5hbWU6IHN0cmluZ1xuKSB7XG4gIGxldCBjbGF1c2UgPSAnJztcbiAgY29uc3QgY29uZGl0aW9uT3BlcmF0b3IgPSBjb2xsZWN0aW9uT3BlcmF0b3IgPT0gJ2FsbCcgPyAnbmUnIDogJ2VxJztcbiAgY2xhdXNlID0gYCR7cHJvcE5hbWV9LyR7Y29sbGVjdGlvbk9wZXJhdG9yfSgke2xhbWJkYVBhcmFtZXRlcn06ICR7bGFtYmRhUGFyYW1ldGVyfSAke2NvbmRpdGlvbk9wZXJhdG9yfSAnJHt2YWx1ZX0nKWA7XG5cbiAgcmV0dXJuIGNsYXVzZTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlSWxsZWdhbENoYXJzKHN0cmluZzogc3RyaW5nKSB7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8lL2csICclMjUnKTtcbiAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL1xcKy9nLCAnJTJCJyk7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXC8vZywgJyUyRicpO1xuICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFw/L2csICclM0YnKTtcbiAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoLyMvZywgJyUyMycpO1xuICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvJi9nLCAnJTI2Jyk7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8nL2csIFwiJydcIik7XG4gIHJldHVybiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVZhbHVlKHZhbHVlOiBWYWx1ZSwgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdKTogYW55IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gYCcke2VzY2FwZUlsbGVnYWxDaGFycyh2YWx1ZSl9J2A7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBgWyR7dmFsdWUubWFwKChkKSA9PiBoYW5kbGVWYWx1ZShkKSkuam9pbignLCcpfV1gO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHZhbHVlLnR5cGUpIHtcbiAgICAgIGNhc2UgUXVlcnlDdXN0b21UeXBlcy5SYXc6XG4gICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgICAgIGNhc2UgUXVlcnlDdXN0b21UeXBlcy5EdXJhdGlvbjpcbiAgICAgICAgcmV0dXJuIGBkdXJhdGlvbicke3ZhbHVlLnZhbHVlfSdgO1xuICAgICAgY2FzZSBRdWVyeUN1c3RvbVR5cGVzLkJpbmFyeTpcbiAgICAgICAgcmV0dXJuIGBiaW5hcnknJHt2YWx1ZS52YWx1ZX0nYDtcbiAgICAgIGNhc2UgUXVlcnlDdXN0b21UeXBlcy5BbGlhczpcbiAgICAgICAgLy8gU3RvcmVcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWxpYXNlcykpIGFsaWFzZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBgQCR7dmFsdWUubmFtZX1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHZhbHVlKVxuICAgICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBgJHtrfT0ke2hhbmRsZVZhbHVlKHYgYXMgVmFsdWUsIGFsaWFzZXMpfWApXG4gICAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBidWlsZEV4cGFuZDxUPihleHBhbmRzOiBFeHBhbmQ8VD4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGV4cGFuZHMgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGV4cGFuZHMgYXMgYW55O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBhbmRzID09PSAnc3RyaW5nJykge1xuICAgIGlmIChleHBhbmRzLmluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBleHBhbmRzO1xuICAgIH1cblxuICAgIC8vIENoYW5nZSBgRm9vL0Jhci9CYXpgIHRvIGBGb28oJGV4cGFuZD1CYXIoJGV4cGFuZD1CYXopKWBcbiAgICByZXR1cm4gZXhwYW5kc1xuICAgICAgLnNwbGl0KCcvJylcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5yZWR1Y2UoKHJlc3VsdHMsIGl0ZW0sIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gSW5uZXItbW9zdCBpdGVtXG4gICAgICAgICAgcmV0dXJuIGAkZXhwYW5kPSR7aXRlbX1gO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSBhcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIE91dGVyLW1vc3QgaXRlbSwgZG9uJ3QgYWRkIGAkZXhwYW5kPWAgcHJlZml4IChhZGRlZCBhYm92ZSlcbiAgICAgICAgICByZXR1cm4gYCR7aXRlbX0oJHtyZXN1bHRzfSlgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyIGl0ZW1zXG4gICAgICAgICAgcmV0dXJuIGAkZXhwYW5kPSR7aXRlbX0oJHtyZXN1bHRzfSlgO1xuICAgICAgICB9XG4gICAgICB9LCAnJyk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleHBhbmRzKSkge1xuICAgIHJldHVybiBgJHsoZXhwYW5kcyBhcyBBcnJheTxOZXN0ZWRFeHBhbmRPcHRpb25zPGFueT4+KVxuICAgICAgLm1hcCgoZSkgPT4gYnVpbGRFeHBhbmQoZSkpXG4gICAgICAuam9pbignLCcpfWA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cGFuZHMgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXhwYW5kS2V5cyA9IE9iamVjdC5rZXlzKGV4cGFuZHMpO1xuXG4gICAgaWYgKFxuICAgICAgZXhwYW5kS2V5cy5zb21lKFxuICAgICAgICAoa2V5KSA9PiBTVVBQT1JURURfRVhQQU5EX1BST1BFUlRJRVMuaW5kZXhPZihrZXkudG9Mb3dlckNhc2UoKSkgIT09IC0xXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZXhwYW5kS2V5c1xuICAgICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgICAgICAgIHZhbHVlID0gYnVpbGRGaWx0ZXIoKGV4cGFuZHMgYXMgTmVzdGVkRXhwYW5kT3B0aW9uczxhbnk+KVtrZXldKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdvcmRlckJ5JzpcbiAgICAgICAgICAgICAgdmFsdWUgPSBidWlsZE9yZGVyQnkoXG4gICAgICAgICAgICAgICAgKGV4cGFuZHMgYXMgTmVzdGVkRXhwYW5kT3B0aW9uczxhbnk+KVtrZXldIGFzIE9yZGVyQnk8VD5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdsZXZlbHMnOlxuICAgICAgICAgICAgY2FzZSAnY291bnQnOlxuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgdmFsdWUgPSBgJHsoZXhwYW5kcyBhcyBOZXN0ZWRFeHBhbmRPcHRpb25zPGFueT4pW2tleV19YDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB2YWx1ZSA9IGJ1aWxkRXhwYW5kKFxuICAgICAgICAgICAgICAgIChleHBhbmRzIGFzIE5lc3RlZEV4cGFuZE9wdGlvbnM8YW55Pilba2V5XSBhcyBFeHBhbmQ8VD5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGAkJHtrZXkudG9Mb3dlckNhc2UoKX09JHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignOycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZXhwYW5kS2V5c1xuICAgICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsdEV4cGFuZCA9IGJ1aWxkRXhwYW5kKFxuICAgICAgICAgICAgKGV4cGFuZHMgYXMgTmVzdGVkRXhwYW5kT3B0aW9uczxhbnk+KVtcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICBdIGFzIE5lc3RlZEV4cGFuZE9wdGlvbnM8YW55PlxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGJ1aWx0RXhwYW5kID8gYCR7a2V5fSgke2J1aWx0RXhwYW5kfSlgIDoga2V5O1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignLCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVHJhbnNmb3JtczxUPih0cmFuc2Zvcm1zOiBUcmFuc2Zvcm08VD4gfCBUcmFuc2Zvcm08VD5bXSkge1xuICAvLyBXcmFwIHNpbmdsZSBvYmplY3QgYW4gYXJyYXkgZm9yIHNpbXBsaWZpZWQgcHJvY2Vzc2luZ1xuICBjb25zdCB0cmFuc2Zvcm1zQXJyYXkgPSBBcnJheS5pc0FycmF5KHRyYW5zZm9ybXMpID8gdHJhbnNmb3JtcyA6IFt0cmFuc2Zvcm1zXTtcblxuICBjb25zdCB0cmFuc2Zvcm1zUmVzdWx0ID0gdHJhbnNmb3Jtc0FycmF5LnJlZHVjZShcbiAgICAocmVzdWx0OiBzdHJpbmdbXSwgdHJhbnNmb3JtKSA9PiB7XG4gICAgICBjb25zdCB7IGFnZ3JlZ2F0ZSwgZmlsdGVyLCBncm91cEJ5LCAuLi5yZXN0IH0gPSB0cmFuc2Zvcm07XG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgYXMgbWFueSBvZiB0aGUgZm9sbG93aW5nOlxuICAgICAgLy8gICB0b3Bjb3VudCwgdG9wc3VtLCB0b3BwZXJjZW50LFxuICAgICAgLy8gICBib3R0b21zdW0sIGJvdHRvbWNvdW50LCBib3R0b21wZXJjZW50LFxuICAgICAgLy8gICBpZGVudGl0eSwgY29uY2F0LCBleHBhbmQsIHNlYXJjaCwgY29tcHV0ZSwgaXNkZWZpbmVkXG4gICAgICBjb25zdCB1bnN1cHBvcnRlZEtleXMgPSBPYmplY3Qua2V5cyhyZXN0KTtcbiAgICAgIGlmICh1bnN1cHBvcnRlZEtleXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdHJhbnNmb3JtKHMpOiAke3Vuc3VwcG9ydGVkS2V5c31gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFnZ3JlZ2F0ZSkge1xuICAgICAgICByZXN1bHQucHVzaChgYWdncmVnYXRlKCR7YnVpbGRBZ2dyZWdhdGUoYWdncmVnYXRlKX0pYCk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgIGNvbnN0IGJ1aWx0RmlsdGVyID0gYnVpbGRGaWx0ZXIoZmlsdGVyKTtcbiAgICAgICAgaWYgKGJ1aWx0RmlsdGVyKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goYGZpbHRlcigke2J1aWxkRmlsdGVyKGJ1aWx0RmlsdGVyKX0pYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChncm91cEJ5KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGBncm91cGJ5KCR7YnVpbGRHcm91cEJ5KGdyb3VwQnkpfSlgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgcmV0dXJuIHRyYW5zZm9ybXNSZXN1bHQuam9pbignLycpIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBZ2dyZWdhdGUoYWdncmVnYXRlOiBBZ2dyZWdhdGUgfCBBZ2dyZWdhdGVbXSkge1xuICAvLyBXcmFwIHNpbmdsZSBvYmplY3QgaW4gYW4gYXJyYXkgZm9yIHNpbXBsaWZpZWQgcHJvY2Vzc2luZ1xuICBjb25zdCBhZ2dyZWdhdGVBcnJheSA9IEFycmF5LmlzQXJyYXkoYWdncmVnYXRlKSA/IGFnZ3JlZ2F0ZSA6IFthZ2dyZWdhdGVdO1xuXG4gIHJldHVybiBhZ2dyZWdhdGVBcnJheVxuICAgIC5tYXAoKGFnZ3JlZ2F0ZUl0ZW0pID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgYWdncmVnYXRlSXRlbSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBhZ2dyZWdhdGVJdGVtXG4gICAgICAgIDogT2JqZWN0LmtleXMoYWdncmVnYXRlSXRlbSkubWFwKChhZ2dyZWdhdGVLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVZhbHVlID0gYWdncmVnYXRlSXRlbVthZ2dyZWdhdGVLZXldO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBBcmUgdGhlc2UgYWx3YXlzIHJlcXVpcmVkPyAgQ2FuL3Nob3VsZCB3ZSBkZWZhdWx0IHRoZW0gaWYgc28/XG4gICAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZVZhbHVlLndpdGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnd2l0aCcgcHJvcGVydHkgcmVxdWlyZWQgZm9yICcke2FnZ3JlZ2F0ZUtleX0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZVZhbHVlLmFzKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJ2FzJyBwcm9wZXJ0eSByZXF1aXJlZCBmb3IgJyR7YWdncmVnYXRlS2V5fSdgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGAke2FnZ3JlZ2F0ZUtleX0gd2l0aCAke2FnZ3JlZ2F0ZVZhbHVlLndpdGh9IGFzICR7YWdncmVnYXRlVmFsdWUuYXN9YDtcbiAgICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5qb2luKCcsJyk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkR3JvdXBCeTxUPihncm91cEJ5OiBHcm91cEJ5PFQ+KSB7XG4gIGlmICghZ3JvdXBCeS5wcm9wZXJ0aWVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAncHJvcGVydGllcycgcHJvcGVydHkgcmVxdWlyZWQgZm9yIGdyb3VwQnlgKTtcbiAgfVxuXG4gIGxldCByZXN1bHQgPSBgKCR7Z3JvdXBCeS5wcm9wZXJ0aWVzLmpvaW4oJywnKX0pYDtcblxuICBpZiAoZ3JvdXBCeS50cmFuc2Zvcm0pIHtcbiAgICByZXN1bHQgKz0gYCwke2J1aWxkVHJhbnNmb3Jtcyhncm91cEJ5LnRyYW5zZm9ybSl9YDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkT3JkZXJCeTxUPihvcmRlckJ5OiBPcmRlckJ5PFQ+LCBwcmVmaXg6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3JkZXJCeSkpIHtcbiAgICByZXR1cm4gKG9yZGVyQnkgYXMgT3JkZXJCeU9iamVjdDxUPltdKVxuICAgICAgLm1hcCgodmFsdWUpID0+XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBbJ2FzYycsICdkZXNjJ10uaW5kZXhPZih2YWx1ZVsxXSkgIT09IC0xXG4gICAgICAgICAgPyB2YWx1ZS5qb2luKCcgJylcbiAgICAgICAgICA6IHZhbHVlXG4gICAgICApXG4gICAgICAubWFwKCh2KSA9PiBgJHtwcmVmaXh9JHt2fWApXG4gICAgICAuam9pbignLCcpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBvcmRlckJ5ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhvcmRlckJ5KVxuICAgICAgLm1hcCgoW2ssIHZdKSA9PiBidWlsZE9yZGVyQnkodiBhcyBPcmRlckJ5PGFueT4sIGAke2t9L2ApKVxuICAgICAgLm1hcCgodikgPT4gYCR7cHJlZml4fSR7dn1gKVxuICAgICAgLmpvaW4oJywnKTtcbiAgfVxuICByZXR1cm4gYCR7cHJlZml4fSR7b3JkZXJCeX1gO1xufVxuXG5mdW5jdGlvbiBidWlsZFVybChwYXRoOiBzdHJpbmcsIHBhcmFtczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0pOiBzdHJpbmcge1xuICAvLyBUaGlzIGNhbiBiZSByZWZhY3RvcmVkIHVzaW5nIFVSTCBBUEkuIEJ1dCBJRSBkb2VzIG5vdCBzdXBwb3J0IGl0LlxuICBjb25zdCBxdWVyaWVzOiBzdHJpbmdbXSA9IE9iamVjdC5lbnRyaWVzKHBhcmFtcykubWFwKFxuICAgIChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09JHt2YWx1ZX1gXG4gICk7XG4gIHJldHVybiBxdWVyaWVzLmxlbmd0aCA/IGAke3BhdGh9PyR7cXVlcmllcy5qb2luKCcmJyl9YCA6IHBhdGg7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTm90KGJ1aWx0RmlsdGVyczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYG5vdCgke2J1aWx0RmlsdGVycy5qb2luKCcgYW5kICcpfSlgO1xufVxuIl19
@@ -1,8 +0,0 @@
1
- export * from './builder';
2
- export * from './query-options';
3
- export * from './path-segments';
4
- export * from './request';
5
- export * from './resource';
6
- export * from './types';
7
- export * from './responses';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYnVpbGRlcic7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5LW9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXRoLXNlZ21lbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVxdWVzdCc7XG5leHBvcnQgKiBmcm9tICcuL3Jlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNwb25zZXMnO1xuIl19