breeze-client 2.1.6 → 2.1.7-mjs

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 (378) hide show
  1. package/LICENSE +1 -1
  2. package/adapter-ajax-angularjs/{breeze-client-adapter-ajax-angularjs.d.ts → index.d.ts} +1 -0
  3. package/adapter-ajax-fetch/{breeze-client-adapter-ajax-fetch.d.ts → index.d.ts} +1 -0
  4. package/adapter-ajax-httpclient/{breeze-client-adapter-ajax-httpclient.d.ts → index.d.ts} +1 -0
  5. package/adapter-ajax-jquery/{breeze-client-adapter-ajax-jquery.d.ts → index.d.ts} +1 -0
  6. package/adapter-ajax-post/{breeze-client-adapter-ajax-post.d.ts → index.d.ts} +1 -0
  7. package/adapter-data-service-odata/{breeze-client-adapter-data-service-odata.d.ts → index.d.ts} +1 -0
  8. package/adapter-data-service-webapi/{breeze-client-adapter-data-service-webapi.d.ts → index.d.ts} +1 -0
  9. package/adapter-model-library-backing-store/{breeze-client-adapter-model-library-backing-store.d.ts → index.d.ts} +1 -0
  10. package/adapter-model-library-ko/{breeze-client-adapter-model-library-ko.d.ts → index.d.ts} +1 -0
  11. package/adapter-uri-builder-json/{breeze-client-adapter-uri-builder-json.d.ts → index.d.ts} +1 -0
  12. package/adapter-uri-builder-odata/{breeze-client-adapter-uri-builder-odata.d.ts → index.d.ts} +1 -0
  13. package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +135 -0
  14. package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +49 -0
  15. package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
  16. package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +135 -0
  17. package/esm2022/adapter-ajax-fetch/adapter-core.mjs +49 -0
  18. package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
  19. package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +139 -0
  20. package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +49 -0
  21. package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
  22. package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +107 -0
  23. package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
  24. package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
  25. package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
  26. package/esm2022/adapter-data-service-odata/adapter-core.mjs +49 -0
  27. package/{esm5/adapter-data-service-odata/adapter-data-service-odata.js → esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs} +138 -147
  28. package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
  29. package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +100 -0
  30. package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
  31. package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +269 -0
  32. package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
  33. package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +241 -0
  34. package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
  35. package/esm2022/adapter-uri-builder-json/adapter-core.mjs +49 -0
  36. package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +37 -0
  37. package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
  38. package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +49 -0
  39. package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +191 -0
  40. package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
  41. package/esm2022/breeze-client.mjs +5 -0
  42. package/esm2022/index.mjs +2 -0
  43. package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
  44. package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
  45. package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
  46. package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +421 -0
  47. package/esm2022/src/abstract-data-service-adapter.mjs +325 -0
  48. package/esm2022/src/array.mjs +4 -0
  49. package/esm2022/src/assert-param.mjs +330 -0
  50. package/esm2022/src/breeze.mjs +85 -0
  51. package/esm2022/src/complex-array.mjs +117 -0
  52. package/esm2022/src/config.mjs +232 -0
  53. package/esm2022/src/core.mjs +712 -0
  54. package/esm2022/src/csdl-metadata-parser.mjs +385 -0
  55. package/esm2022/src/data-service.mjs +239 -0
  56. package/esm2022/src/data-type.mjs +507 -0
  57. package/esm2022/src/default-property-interceptor.mjs +460 -0
  58. package/{esm2015/src/entity-action.js → esm2022/src/entity-action.mjs} +25 -25
  59. package/esm2022/src/entity-aspect.mjs +897 -0
  60. package/esm2022/src/entity-group.mjs +192 -0
  61. package/esm2022/src/entity-key.mjs +127 -0
  62. package/esm2022/src/entity-manager.mjs +2183 -0
  63. package/esm2022/src/entity-metadata.mjs +2242 -0
  64. package/esm2022/src/entity-query.mjs +1024 -0
  65. package/esm2022/src/entity-state.mjs +107 -0
  66. package/esm2022/src/enum.mjs +143 -0
  67. package/esm2022/src/event.mjs +264 -0
  68. package/esm2022/src/interface-registry.mjs +39 -0
  69. package/esm2022/src/key-generator.mjs +110 -0
  70. package/esm2022/src/local-query-comparison-options.mjs +75 -0
  71. package/esm2022/src/mapping-context.mjs +422 -0
  72. package/{esm5/src/naming-convention.js → esm2022/src/naming-convention.mjs} +35 -29
  73. package/esm2022/src/observable-array.mjs +183 -0
  74. package/esm2022/src/predicate.mjs +1259 -0
  75. package/esm2022/src/primitive-array.mjs +85 -0
  76. package/esm2022/src/query-options.mjs +160 -0
  77. package/esm2022/src/relation-array.mjs +173 -0
  78. package/esm2022/src/save-options.mjs +51 -0
  79. package/esm2022/src/unattached-children-map.mjs +56 -0
  80. package/{esm5/src/validate.js → esm2022/src/validate.mjs} +116 -110
  81. package/esm2022/src/validation-options.mjs +78 -0
  82. package/{fesm2015/breeze-client-adapter-ajax-angularjs.js → fesm2022/breeze-client-adapter-ajax-angularjs.mjs} +6 -1
  83. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
  84. package/{fesm2015/breeze-client-adapter-ajax-fetch.js → fesm2022/breeze-client-adapter-ajax-fetch.mjs} +9 -4
  85. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
  86. package/{fesm2015/breeze-client-adapter-ajax-httpclient.js → fesm2022/breeze-client-adapter-ajax-httpclient.mjs} +6 -4
  87. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
  88. package/{fesm2015/breeze-client-adapter-ajax-jquery.js → fesm2022/breeze-client-adapter-ajax-jquery.mjs} +6 -2
  89. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
  90. package/{fesm2015/breeze-client-adapter-ajax-post.js → fesm2022/breeze-client-adapter-ajax-post.mjs} +1 -1
  91. package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +1 -0
  92. package/{fesm2015/breeze-client-adapter-data-service-odata.js → fesm2022/breeze-client-adapter-data-service-odata.mjs} +68 -69
  93. package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +1 -0
  94. package/{fesm2015/breeze-client-adapter-data-service-webapi.js → fesm2022/breeze-client-adapter-data-service-webapi.mjs} +30 -30
  95. package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
  96. package/{fesm2015/breeze-client-adapter-model-library-backing-store.js → fesm2022/breeze-client-adapter-model-library-backing-store.mjs} +14 -13
  97. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
  98. package/{fesm2015/breeze-client-adapter-model-library-ko.js → fesm2022/breeze-client-adapter-model-library-ko.mjs} +14 -13
  99. package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +1 -0
  100. package/{fesm2015/breeze-client-adapter-uri-builder-json.js → fesm2022/breeze-client-adapter-uri-builder-json.mjs} +9 -8
  101. package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
  102. package/{fesm2015/breeze-client-adapter-uri-builder-odata.js → fesm2022/breeze-client-adapter-uri-builder-odata.mjs} +86 -86
  103. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
  104. package/{fesm2015/breeze-client-mixin-get-entity-graph.js → fesm2022/breeze-client-mixin-get-entity-graph.mjs} +1 -1
  105. package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
  106. package/{fesm2015/breeze-client-mixin-save-queuing.js → fesm2022/breeze-client-mixin-save-queuing.mjs} +23 -2
  107. package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +1 -0
  108. package/{fesm2015/breeze-client.js → fesm2022/breeze-client.mjs} +2126 -1577
  109. package/fesm2022/breeze-client.mjs.map +1 -0
  110. package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
  111. package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
  112. package/package.json +93 -11
  113. package/src/abstract-data-service-adapter.d.ts +20 -0
  114. package/src/config.d.ts +1 -1
  115. package/src/core.d.ts +1 -1
  116. package/src/entity-aspect.d.ts +1 -1
  117. package/src/entity-metadata.d.ts +8 -6
  118. package/src/entity-query.d.ts +18 -4
  119. package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
  120. package/adapter-ajax-angularjs/package.json +0 -13
  121. package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
  122. package/adapter-ajax-fetch/package.json +0 -13
  123. package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
  124. package/adapter-ajax-httpclient/package.json +0 -13
  125. package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
  126. package/adapter-ajax-jquery/package.json +0 -13
  127. package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
  128. package/adapter-ajax-post/package.json +0 -13
  129. package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
  130. package/adapter-data-service-odata/package.json +0 -13
  131. package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
  132. package/adapter-data-service-webapi/package.json +0 -13
  133. package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
  134. package/adapter-model-library-backing-store/package.json +0 -13
  135. package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
  136. package/adapter-model-library-ko/package.json +0 -13
  137. package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
  138. package/adapter-uri-builder-json/package.json +0 -13
  139. package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
  140. package/adapter-uri-builder-odata/package.json +0 -13
  141. package/breeze-client.d.ts +0 -8
  142. package/breeze-client.metadata.json +0 -1
  143. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
  144. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
  145. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
  146. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
  147. package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
  148. package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
  149. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
  150. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
  151. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
  152. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
  153. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
  154. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
  155. package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
  156. package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
  157. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
  158. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
  159. package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
  160. package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
  161. package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
  162. package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
  163. package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -747
  164. package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
  165. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
  166. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
  167. package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -333
  168. package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
  169. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
  170. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
  171. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
  172. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
  173. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
  174. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
  175. package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
  176. package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
  177. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
  178. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
  179. package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
  180. package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
  181. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
  182. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
  183. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
  184. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
  185. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
  186. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
  187. package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
  188. package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
  189. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
  190. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
  191. package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
  192. package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
  193. package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
  194. package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
  195. package/bundles/breeze-client.umd.js +0 -14181
  196. package/bundles/breeze-client.umd.js.map +0 -1
  197. package/bundles/breeze-client.umd.min.js +0 -16
  198. package/bundles/breeze-client.umd.min.js.map +0 -1
  199. package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
  200. package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
  201. package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  202. package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
  203. package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
  204. package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  205. package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
  206. package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
  207. package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  208. package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
  209. package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  210. package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
  211. package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  212. package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
  213. package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -463
  214. package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  215. package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -100
  216. package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  217. package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
  218. package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  219. package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
  220. package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  221. package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
  222. package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
  223. package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  224. package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
  225. package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
  226. package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  227. package/esm2015/breeze-client.js +0 -9
  228. package/esm2015/index.js +0 -2
  229. package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  230. package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  231. package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  232. package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
  233. package/esm2015/src/abstract-data-service-adapter.js +0 -296
  234. package/esm2015/src/array.js +0 -4
  235. package/esm2015/src/assert-param.js +0 -312
  236. package/esm2015/src/breeze.js +0 -85
  237. package/esm2015/src/complex-array.js +0 -119
  238. package/esm2015/src/config.js +0 -223
  239. package/esm2015/src/core.js +0 -714
  240. package/esm2015/src/csdl-metadata-parser.js +0 -385
  241. package/esm2015/src/data-service.js +0 -203
  242. package/esm2015/src/data-type.js +0 -503
  243. package/esm2015/src/default-property-interceptor.js +0 -460
  244. package/esm2015/src/entity-aspect.js +0 -804
  245. package/esm2015/src/entity-group.js +0 -187
  246. package/esm2015/src/entity-key.js +0 -116
  247. package/esm2015/src/entity-manager.js +0 -2094
  248. package/esm2015/src/entity-metadata.js +0 -2109
  249. package/esm2015/src/entity-query.js +0 -996
  250. package/esm2015/src/entity-state.js +0 -107
  251. package/esm2015/src/enum.js +0 -141
  252. package/esm2015/src/event.js +0 -256
  253. package/esm2015/src/interface-registry.js +0 -41
  254. package/esm2015/src/key-generator.js +0 -108
  255. package/esm2015/src/local-query-comparison-options.js +0 -65
  256. package/esm2015/src/mapping-context.js +0 -411
  257. package/esm2015/src/naming-convention.js +0 -88
  258. package/esm2015/src/observable-array.js +0 -185
  259. package/esm2015/src/predicate.js +0 -1242
  260. package/esm2015/src/primitive-array.js +0 -87
  261. package/esm2015/src/query-options.js +0 -152
  262. package/esm2015/src/relation-array.js +0 -175
  263. package/esm2015/src/save-options.js +0 -41
  264. package/esm2015/src/unattached-children-map.js +0 -58
  265. package/esm2015/src/validate.js +0 -991
  266. package/esm2015/src/validation-options.js +0 -64
  267. package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
  268. package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
  269. package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  270. package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
  271. package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
  272. package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  273. package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
  274. package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
  275. package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  276. package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
  277. package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  278. package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
  279. package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  280. package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
  281. package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  282. package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -105
  283. package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  284. package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
  285. package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  286. package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
  287. package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  288. package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
  289. package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
  290. package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  291. package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
  292. package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
  293. package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  294. package/esm5/breeze-client.js +0 -9
  295. package/esm5/index.js +0 -2
  296. package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  297. package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  298. package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  299. package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
  300. package/esm5/src/abstract-data-service-adapter.js +0 -302
  301. package/esm5/src/array.js +0 -4
  302. package/esm5/src/assert-param.js +0 -317
  303. package/esm5/src/breeze.js +0 -85
  304. package/esm5/src/complex-array.js +0 -119
  305. package/esm5/src/config.js +0 -228
  306. package/esm5/src/core.js +0 -722
  307. package/esm5/src/csdl-metadata-parser.js +0 -385
  308. package/esm5/src/data-service.js +0 -207
  309. package/esm5/src/data-type.js +0 -510
  310. package/esm5/src/default-property-interceptor.js +0 -460
  311. package/esm5/src/entity-action.js +0 -52
  312. package/esm5/src/entity-aspect.js +0 -810
  313. package/esm5/src/entity-group.js +0 -189
  314. package/esm5/src/entity-key.js +0 -118
  315. package/esm5/src/entity-manager.js +0 -2112
  316. package/esm5/src/entity-metadata.js +0 -2144
  317. package/esm5/src/entity-query.js +0 -1023
  318. package/esm5/src/entity-state.js +0 -114
  319. package/esm5/src/enum.js +0 -144
  320. package/esm5/src/event.js +0 -259
  321. package/esm5/src/interface-registry.js +0 -43
  322. package/esm5/src/key-generator.js +0 -111
  323. package/esm5/src/local-query-comparison-options.js +0 -67
  324. package/esm5/src/mapping-context.js +0 -413
  325. package/esm5/src/observable-array.js +0 -201
  326. package/esm5/src/predicate.js +0 -1307
  327. package/esm5/src/primitive-array.js +0 -87
  328. package/esm5/src/query-options.js +0 -167
  329. package/esm5/src/relation-array.js +0 -175
  330. package/esm5/src/save-options.js +0 -43
  331. package/esm5/src/unattached-children-map.js +0 -60
  332. package/esm5/src/validation-options.js +0 -66
  333. package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  334. package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
  335. package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  336. package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
  337. package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
  338. package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
  339. package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
  340. package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  341. package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
  342. package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
  343. package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  344. package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
  345. package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
  346. package/fesm2015/breeze-client.js.map +0 -1
  347. package/fesm5/breeze-client-adapter-ajax-angularjs.js +0 -186
  348. package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  349. package/fesm5/breeze-client-adapter-ajax-fetch.js +0 -186
  350. package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
  351. package/fesm5/breeze-client-adapter-ajax-httpclient.js +0 -193
  352. package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  353. package/fesm5/breeze-client-adapter-ajax-jquery.js +0 -111
  354. package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
  355. package/fesm5/breeze-client-adapter-ajax-post.js +0 -86
  356. package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
  357. package/fesm5/breeze-client-adapter-data-service-odata.js +0 -523
  358. package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
  359. package/fesm5/breeze-client-adapter-data-service-webapi.js +0 -111
  360. package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
  361. package/fesm5/breeze-client-adapter-model-library-backing-store.js +0 -276
  362. package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  363. package/fesm5/breeze-client-adapter-model-library-ko.js +0 -248
  364. package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
  365. package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
  366. package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
  367. package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
  368. package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  369. package/fesm5/breeze-client-mixin-get-entity-graph.js +0 -254
  370. package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
  371. package/fesm5/breeze-client-mixin-save-queuing.js +0 -356
  372. package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
  373. package/fesm5/breeze-client.js +0 -13903
  374. package/fesm5/breeze-client.js.map +0 -1
  375. package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
  376. package/mixin-get-entity-graph/package.json +0 -13
  377. package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
  378. package/mixin-save-queuing/package.json +0 -13
@@ -1,71 +1,26 @@
1
- import { __extends } from "tslib";
2
1
  import * as breeze from 'breeze-client';
3
2
  import { appendQueryStringParameter } from './adapter-core';
4
- var core = breeze.core;
3
+ let core = breeze.core;
5
4
  /** @hidden */
6
- var DataServiceODataAdapter = /** @class */ (function (_super) {
7
- __extends(DataServiceODataAdapter, _super);
8
- function DataServiceODataAdapter() {
9
- var _this = _super.call(this) || this;
10
- // _catchNoConnectionError = abstractDsaProto._catchNoConnectionError;
11
- // changeRequestInterceptor = abstractDsaProto.changeRequestInterceptor;
12
- // _createChangeRequestInterceptor = abstractDsaProto._createChangeRequestInterceptor;
13
- _this.headers = { "DataServiceVersion": "2.0" };
14
- _this.jsonResultsAdapter = new breeze.JsonResultsAdapter({
15
- name: "OData_default",
16
- visitNode: function (node, mappingContext, nodeContext) {
17
- var result = {};
18
- if (node == null)
19
- return result;
20
- var metadata = node.__metadata;
21
- if (metadata != null) {
22
- // TODO: may be able to make this more efficient by caching of the previous value.
23
- var entityTypeName = breeze.MetadataStore.normalizeTypeName(metadata.type);
24
- var et = entityTypeName && mappingContext.entityManager.metadataStore.getEntityType(entityTypeName, true);
25
- // OData response doesn't distinguish a projection from a whole entity.
26
- // We'll assume that whole-entity data would have at least as many properties (<=)
27
- // as the EntityType has mapped properties on the basis that
28
- // most projections remove properties rather than add them.
29
- // If not, assume it's a projection and do NOT treat as an entity
30
- if (et && et._mappedPropertiesCount <= Object.keys(node).length - 1) {
31
- // if (et && et._mappedPropertiesCount === Object.keys(node).length - 1) { // OLD
32
- result.entityType = et;
33
- var uriKey = metadata.uri || metadata.id;
34
- if (uriKey) {
35
- // Strip baseUri to make uriKey a relative uri
36
- // Todo: why is this necessary when absolute works for every OData source tested?
37
- var re = new RegExp('^' + mappingContext.dataService.serviceName, 'i');
38
- uriKey = uriKey.replace(re, '');
39
- }
40
- result.extraMetadata = {
41
- uriKey: uriKey,
42
- etag: metadata.etag
43
- };
44
- }
45
- }
46
- // OData v3 - projection arrays will be enclosed in a results array
47
- if (node.results) {
48
- result.node = node.results;
49
- }
50
- var propertyName = nodeContext.propertyName;
51
- result.ignore = node.__deferred != null || propertyName === "__metadata" ||
52
- // EntityKey properties can be produced by EDMX models
53
- (propertyName === "EntityKey" && node.$type && core.stringStartsWith(node.$type, "System.Data"));
54
- return result;
55
- }
56
- });
57
- _this.name = "OData";
58
- return _this;
5
+ export class DataServiceODataAdapter extends breeze.AbstractDataServiceAdapter {
6
+ relativeUrl;
7
+ // _catchNoConnectionError = abstractDsaProto._catchNoConnectionError;
8
+ // changeRequestInterceptor = abstractDsaProto.changeRequestInterceptor;
9
+ // _createChangeRequestInterceptor = abstractDsaProto._createChangeRequestInterceptor;
10
+ headers = { "DataServiceVersion": "2.0" };
11
+ constructor() {
12
+ super();
13
+ this.name = "OData";
59
14
  }
60
- DataServiceODataAdapter.register = function (config) {
15
+ static register(config) {
61
16
  config = config || breeze.config;
62
17
  config.registerAdapter("dataService", DataServiceODataAdapter);
63
18
  return config.initializeAdapterInstance("dataService", "OData", true);
64
- };
65
- DataServiceODataAdapter.prototype.initialize = function () {
19
+ }
20
+ initialize() {
66
21
  OData = core.requireLib("OData", "Needed to support remote OData services");
67
22
  OData.jsonHandler.recognizeDates = true;
68
- };
23
+ }
69
24
  // Absolute URL is the default as of Breeze 1.5.5.
70
25
  // To use relative URL (like pre-1.5.5), add adapterInstance.relativeUrl = true:
71
26
  //
@@ -79,9 +34,9 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
79
34
  // return somehowConvert(url);
80
35
  // }
81
36
  //
82
- DataServiceODataAdapter.prototype.fetchMetadata = function (metadataStore, dataService) {
83
- var serviceName = dataService.serviceName;
84
- var url;
37
+ fetchMetadata(metadataStore, dataService) {
38
+ let serviceName = dataService.serviceName;
39
+ let url;
85
40
  if (this.relativeUrl === true) {
86
41
  url = dataService.qualifyUrl('$metadata');
87
42
  }
@@ -91,9 +46,9 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
91
46
  else {
92
47
  url = this.getAbsoluteUrl(dataService, '$metadata');
93
48
  }
94
- var mheaders = core.extend({}, this.headers);
49
+ let mheaders = core.extend({}, this.headers);
95
50
  mheaders.Accept = 'application/*; odata.metadata=full';
96
- var promise = new Promise(function (resolve, reject) {
51
+ let promise = new Promise((resolve, reject) => {
97
52
  // OData.read(url,
98
53
  OData.read({
99
54
  requestUri: url,
@@ -103,10 +58,10 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
103
58
  // data.dataServices.schema is an array of schemas. with properties of
104
59
  // entityContainer[], association[], entityType[], and namespace.
105
60
  if (!data || !data.dataServices) {
106
- var error = new Error("Metadata query failed for: " + url);
61
+ let error = new Error("Metadata query failed for: " + url);
107
62
  return reject(error);
108
63
  }
109
- var csdlMetadata = data.dataServices;
64
+ let csdlMetadata = data.dataServices;
110
65
  // might have been fetched by another query
111
66
  if (!metadataStore.hasMetadataFor(serviceName)) {
112
67
  try {
@@ -119,16 +74,15 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
119
74
  }
120
75
  return resolve(csdlMetadata);
121
76
  }, function (error) {
122
- var err = createError(error, url);
77
+ let err = createError(error, url);
123
78
  err.message = "Metadata query failed for: " + url + "; " + (err.message || "");
124
79
  return reject(err);
125
80
  }, OData.metadataHandler);
126
81
  });
127
82
  return promise;
128
- };
129
- DataServiceODataAdapter.prototype.executeQuery = function (mappingContext) {
130
- var _this = this;
131
- var url;
83
+ }
84
+ executeQuery(mappingContext) {
85
+ let url;
132
86
  if (this.relativeUrl === true) {
133
87
  url = mappingContext.getUrl();
134
88
  }
@@ -139,17 +93,17 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
139
93
  url = this.getAbsoluteUrl(mappingContext.dataService, mappingContext.getUrl());
140
94
  }
141
95
  // Add query params if .withParameters was used
142
- var query = mappingContext.query;
96
+ let query = mappingContext.query;
143
97
  if (!core.isEmpty(query.parameters)) {
144
- var paramString = toQueryString(query.parameters);
98
+ let paramString = toQueryString(query.parameters);
145
99
  url = appendQueryStringParameter(url, paramString);
146
100
  }
147
- var promise = new Promise(function (resolve, reject) {
101
+ let promise = new Promise((resolve, reject) => {
148
102
  OData.read({
149
103
  requestUri: url,
150
- headers: core.extend({}, _this.headers)
104
+ headers: core.extend({}, this.headers)
151
105
  }, function (data, response) {
152
- var inlineCount;
106
+ let inlineCount;
153
107
  if (data.__count) {
154
108
  // OData can return data.__count as a string
155
109
  inlineCount = parseInt(data.__count, 10);
@@ -157,7 +111,7 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
157
111
  // Odata returns different result structure when it returns multiple entities (data.results) vs single entity (data directly).
158
112
  // @see http://www.odata.org/documentation/odata-version-2-0/json-format/#RepresentingCollectionsOfEntries
159
113
  // and http://www.odata.org/documentation/odata-version-2-0/json-format/#RepresentingEntries
160
- var results;
114
+ let results;
161
115
  if (data.results) {
162
116
  results = data.results;
163
117
  }
@@ -170,12 +124,11 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
170
124
  });
171
125
  });
172
126
  return promise;
173
- };
174
- DataServiceODataAdapter.prototype.saveChanges = function (odataSaveContext, saveBundle) {
175
- var _this = this;
176
- var adapter = odataSaveContext.adapter = this;
177
- var saveContext = odataSaveContext;
178
- var url;
127
+ }
128
+ saveChanges(odataSaveContext, saveBundle) {
129
+ let adapter = odataSaveContext.adapter = this;
130
+ let saveContext = odataSaveContext;
131
+ let url;
179
132
  if (this.relativeUrl === true) {
180
133
  saveContext.routePrefix = adapter.getRoutePrefix(saveContext.dataService);
181
134
  url = saveContext.dataService.qualifyUrl("$batch");
@@ -188,48 +141,48 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
188
141
  saveContext.routePrefix = adapter.getAbsoluteUrl(saveContext.dataService, '');
189
142
  url = saveContext.routePrefix + '$batch';
190
143
  }
191
- var requestData = createChangeRequests(saveContext, saveBundle);
192
- var tempKeys = saveContext.tempKeys;
193
- var contentKeys = saveContext.contentKeys;
194
- var promise = new Promise(function (resolve, reject) {
144
+ let requestData = createChangeRequests(saveContext, saveBundle);
145
+ let tempKeys = saveContext.tempKeys;
146
+ let contentKeys = saveContext.contentKeys;
147
+ let promise = new Promise((resolve, reject) => {
195
148
  OData.request({
196
- headers: core.extend({}, _this.headers),
149
+ headers: core.extend({}, this.headers),
197
150
  requestUri: url,
198
151
  method: "POST",
199
152
  data: requestData
200
153
  }, function (data, response) {
201
- var entities = [];
202
- var keyMappings = [];
203
- var saveResult = { entities: entities, keyMappings: keyMappings };
154
+ let entities = [];
155
+ let keyMappings = [];
156
+ let saveResult = { entities: entities, keyMappings: keyMappings };
204
157
  data.__batchResponses.forEach(function (br) {
205
158
  br.__changeResponses.forEach(function (cr) {
206
- var response = cr.response || cr;
207
- var statusCode = response.statusCode;
159
+ let response = cr.response || cr;
160
+ let statusCode = response.statusCode;
208
161
  if ((!statusCode) || statusCode >= 400) {
209
162
  reject(createError(cr, url));
210
163
  return;
211
164
  }
212
- var contentId = cr.headers["Content-ID"];
165
+ let contentId = cr.headers["Content-ID"];
213
166
  // Olingo sends different case of 'ID' for the header name.
214
167
  if (!contentId) {
215
168
  contentId = cr.headers["Content-Id"];
216
169
  }
217
- var rawEntity = cr.data;
170
+ let rawEntity = cr.data;
218
171
  if (rawEntity) {
219
- var tempKey = tempKeys[contentId];
172
+ let tempKey = tempKeys[contentId];
220
173
  if (tempKey) {
221
- var entityType = tempKey.entityType;
174
+ let entityType = tempKey.entityType;
222
175
  if (entityType.autoGeneratedKeyType !== breeze.AutoGeneratedKeyType.None) {
223
- var tempValue = tempKey.values[0];
224
- var realKey = entityType.getEntityKeyFromRawEntity(rawEntity, breeze.DataProperty.getRawValueFromServer);
225
- var keyMapping = { entityTypeName: entityType.name, tempValue: tempValue, realValue: realKey.values[0] };
176
+ let tempValue = tempKey.values[0];
177
+ let realKey = entityType.getEntityKeyFromRawEntity(rawEntity, breeze.DataProperty.getRawValueFromServer);
178
+ let keyMapping = { entityTypeName: entityType.name, tempValue: tempValue, realValue: realKey.values[0] };
226
179
  keyMappings.push(keyMapping);
227
180
  }
228
181
  }
229
182
  entities.push(rawEntity);
230
183
  }
231
184
  else {
232
- var origEntity = contentKeys[contentId];
185
+ let origEntity = contentKeys[contentId];
233
186
  entities.push(origEntity);
234
187
  }
235
188
  });
@@ -240,11 +193,54 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
240
193
  }, OData.batchHandler);
241
194
  });
242
195
  return promise;
243
- };
244
- DataServiceODataAdapter.prototype.getAbsoluteUrl = function (dataService, url) {
245
- var serviceName = dataService.qualifyUrl('');
196
+ }
197
+ jsonResultsAdapter = new breeze.JsonResultsAdapter({
198
+ name: "OData_default",
199
+ visitNode: function (node, mappingContext, nodeContext) {
200
+ let result = {};
201
+ if (node == null)
202
+ return result;
203
+ let metadata = node.__metadata;
204
+ if (metadata != null) {
205
+ // TODO: may be able to make this more efficient by caching of the previous value.
206
+ let entityTypeName = breeze.MetadataStore.normalizeTypeName(metadata.type);
207
+ let et = entityTypeName && mappingContext.entityManager.metadataStore.getEntityType(entityTypeName, true);
208
+ // OData response doesn't distinguish a projection from a whole entity.
209
+ // We'll assume that whole-entity data would have at least as many properties (<=)
210
+ // as the EntityType has mapped properties on the basis that
211
+ // most projections remove properties rather than add them.
212
+ // If not, assume it's a projection and do NOT treat as an entity
213
+ if (et && et._mappedPropertiesCount <= Object.keys(node).length - 1) {
214
+ // if (et && et._mappedPropertiesCount === Object.keys(node).length - 1) { // OLD
215
+ result.entityType = et;
216
+ let uriKey = metadata.uri || metadata.id;
217
+ if (uriKey) {
218
+ // Strip baseUri to make uriKey a relative uri
219
+ // Todo: why is this necessary when absolute works for every OData source tested?
220
+ let re = new RegExp('^' + mappingContext.dataService.serviceName, 'i');
221
+ uriKey = uriKey.replace(re, '');
222
+ }
223
+ result.extraMetadata = {
224
+ uriKey: uriKey,
225
+ etag: metadata.etag
226
+ };
227
+ }
228
+ }
229
+ // OData v3 - projection arrays will be enclosed in a results array
230
+ if (node.results) {
231
+ result.node = node.results;
232
+ }
233
+ let propertyName = nodeContext.propertyName;
234
+ result.ignore = node.__deferred != null || propertyName === "__metadata" ||
235
+ // EntityKey properties can be produced by EDMX models
236
+ (propertyName === "EntityKey" && node.$type && core.stringStartsWith(node.$type, "System.Data"));
237
+ return result;
238
+ }
239
+ });
240
+ getAbsoluteUrl(dataService, url) {
241
+ let serviceName = dataService.qualifyUrl('');
246
242
  // only prefix with serviceName if not already on the url
247
- var base = (core.stringStartsWith(url, serviceName)) ? '' : serviceName;
243
+ let base = (core.stringStartsWith(url, serviceName)) ? '' : serviceName;
248
244
  // If no protocol, turn base into an absolute URI
249
245
  if (window && serviceName.indexOf('//') < 0) {
250
246
  // no protocol; make it absolute
@@ -253,14 +249,14 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
253
249
  base;
254
250
  }
255
251
  return base + url;
256
- };
257
- DataServiceODataAdapter.prototype.getRoutePrefix = function (dataService) {
252
+ }
253
+ getRoutePrefix(dataService) {
258
254
  // Get the routePrefix from a Web API OData service name.
259
255
  // The routePrefix is presumed to be the pathname within the dataService.serviceName
260
256
  // Examples of servicename -> routePrefix:
261
257
  // 'http://localhost:55802/odata/' -> 'odata/'
262
258
  // 'http://198.154.121.75/service/odata/' -> 'service/odata/'
263
- var parser;
259
+ let parser;
264
260
  if (typeof document === 'object') { // browser
265
261
  parser = document.createElement('a');
266
262
  parser.href = dataService.serviceName;
@@ -270,7 +266,7 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
270
266
  // assumes existence of node's url.parse method.
271
267
  parser = url.parse(dataService.serviceName);
272
268
  }
273
- var prefix = parser.pathname;
269
+ let prefix = parser.pathname;
274
270
  if (prefix[0] === '/') {
275
271
  prefix = prefix.substr(1);
276
272
  } // drop leading '/' (all but IE)
@@ -278,14 +274,12 @@ var DataServiceODataAdapter = /** @class */ (function (_super) {
278
274
  prefix += '/';
279
275
  } // ensure trailing '/'
280
276
  return prefix;
281
- };
282
- return DataServiceODataAdapter;
283
- }(breeze.AbstractDataServiceAdapter));
284
- export { DataServiceODataAdapter };
277
+ }
278
+ }
285
279
  // crude serializer. Doesn't recurse
286
280
  function toQueryString(obj) {
287
- var parts = [];
288
- for (var i in obj) {
281
+ let parts = [];
282
+ for (let i in obj) {
289
283
  if (obj.hasOwnProperty(i)) {
290
284
  parts.push(encodeURIComponent(i) + "=" + encodeURIComponent(obj[i]));
291
285
  }
@@ -310,18 +304,18 @@ function transformValue(prop, val) {
310
304
  return val;
311
305
  }
312
306
  function createChangeRequests(saveContext, saveBundle) {
313
- var changeRequestInterceptor = saveContext.adapter._createChangeRequestInterceptor(saveContext, saveBundle);
314
- var changeRequests = [];
315
- var tempKeys = [];
316
- var contentKeys = [];
317
- var entityManager = saveContext.entityManager;
318
- var helper = entityManager.helper;
319
- var id = 0;
320
- var routePrefix = saveContext.routePrefix;
307
+ let changeRequestInterceptor = saveContext.adapter._createChangeRequestInterceptor(saveContext, saveBundle);
308
+ let changeRequests = [];
309
+ let tempKeys = [];
310
+ let contentKeys = [];
311
+ let entityManager = saveContext.entityManager;
312
+ let helper = entityManager.helper;
313
+ let id = 0;
314
+ let routePrefix = saveContext.routePrefix;
321
315
  saveBundle.entities.forEach(function (entity, index) {
322
- var aspect = entity.entityAspect;
316
+ let aspect = entity.entityAspect;
323
317
  id = id + 1; // we are deliberately skipping id=0 because Content-ID = 0 seems to be ignored.
324
- var request = { headers: { "Content-ID": id, "DataServiceVersion": "2.0" } };
318
+ let request = { headers: { "Content-ID": id, "DataServiceVersion": "2.0" } };
325
319
  contentKeys[id] = entity;
326
320
  if (aspect.entityState.isAdded()) {
327
321
  request.requestUri = routePrefix + entity.entityType.defaultResourceName;
@@ -357,8 +351,8 @@ function createChangeRequests(saveContext, saveBundle) {
357
351
  };
358
352
  }
359
353
  function updateDeleteMergeRequest(request, aspect, routePrefix) {
360
- var uriKey;
361
- var extraMetadata = aspect.extraMetadata;
354
+ let uriKey;
355
+ let extraMetadata = aspect.extraMetadata;
362
356
  if (extraMetadata == null) {
363
357
  uriKey = getUriKey(aspect);
364
358
  aspect.extraMetadata = {
@@ -376,18 +370,18 @@ function updateDeleteMergeRequest(request, aspect, routePrefix) {
376
370
  uriKey.indexOf('//') > 0 ? uriKey : routePrefix + uriKey;
377
371
  }
378
372
  function getUriKey(aspect) {
379
- var entityType = aspect.entity.entityType;
380
- var resourceName = entityType.defaultResourceName;
381
- var kps = entityType.keyProperties;
382
- var uriKey = resourceName + "(";
373
+ let entityType = aspect.entity.entityType;
374
+ let resourceName = entityType.defaultResourceName;
375
+ let kps = entityType.keyProperties;
376
+ let uriKey = resourceName + "(";
383
377
  if (kps.length === 1) {
384
378
  uriKey = uriKey + fmtProperty(kps[0], aspect) + ")";
385
379
  }
386
380
  else {
387
- var delim_1 = "";
381
+ let delim = "";
388
382
  kps.forEach(function (kp) {
389
- uriKey = uriKey + delim_1 + kp.nameOnServer + "=" + fmtProperty(kp, aspect);
390
- delim_1 = ",";
383
+ uriKey = uriKey + delim + kp.nameOnServer + "=" + fmtProperty(kp, aspect);
384
+ delim = ",";
391
385
  });
392
386
  uriKey = uriKey + ")";
393
387
  }
@@ -399,8 +393,8 @@ function fmtProperty(prop, aspect) {
399
393
  function createError(error, url) {
400
394
  // OData errors can have the message buried very deeply - and nonobviously
401
395
  // this code is tricky so be careful changing the response.body parsing.
402
- var result = new Error();
403
- var response = error && error.response;
396
+ let result = new Error();
397
+ let response = error && error.response;
404
398
  if (!response) {
405
399
  // in case DataJS returns "No handler for this data"
406
400
  result.message = error;
@@ -415,15 +409,15 @@ function createError(error, url) {
415
409
  result.url = url;
416
410
  result.body = response.body;
417
411
  if (response.body) {
418
- var nextErr = void 0;
412
+ let nextErr;
419
413
  try {
420
- var body = JSON.parse(response.body);
414
+ let body = JSON.parse(response.body);
421
415
  result.body = body;
422
416
  // OData v3 logic
423
417
  if (body['odata.error']) {
424
418
  body = body['odata.error'];
425
419
  }
426
- var msg = "";
420
+ let msg = "";
427
421
  do {
428
422
  nextErr = body.error || body.innererror;
429
423
  if (!nextErr)
@@ -442,29 +436,26 @@ function createError(error, url) {
442
436
  return result;
443
437
  }
444
438
  function getMessage(body) {
445
- var msg = body.message || "";
439
+ let msg = body.message || "";
446
440
  return ((typeof (msg) === "string") ? msg : msg.value) + "; ";
447
441
  }
448
442
  breeze.config.registerAdapter("dataService", DataServiceODataAdapter);
449
- var webApiODataCtor = function () {
443
+ let webApiODataCtor = function () {
450
444
  this.name = "webApiOData";
451
445
  };
452
- var ɵ0 = webApiODataCtor;
453
446
  breeze.core.extend(webApiODataCtor.prototype, DataServiceODataAdapter.prototype);
454
447
  breeze.config.registerAdapter("dataService", webApiODataCtor);
455
448
  // OData 4 adapter
456
- var webApiOData4Ctor = function () {
449
+ let webApiOData4Ctor = function () {
457
450
  this.name = "webApiOData4";
458
451
  };
459
- var ɵ1 = webApiOData4Ctor;
460
452
  breeze.core.extend(webApiOData4Ctor.prototype, webApiODataCtor.prototype);
461
453
  webApiOData4Ctor.prototype.initialize = function () {
462
454
  // Aargh... they moved the cheese.
463
- var datajs = core.requireLib("datajs", "Needed to support remote OData v4 services");
455
+ let datajs = core.requireLib("datajs", "Needed to support remote OData v4 services");
464
456
  OData = datajs.V4.oData;
465
457
  OData.json.jsonHandler.recognizeDates = true;
466
458
  };
467
459
  webApiOData4Ctor.prototype.headers = { "OData-Version": "4.0" };
468
460
  breeze.config.registerAdapter("dataService", webApiOData4Ctor);
469
- export { ɵ0, ɵ1 };
470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1kYXRhLXNlcnZpY2Utb2RhdGEuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50L2FkYXB0ZXItZGF0YS1zZXJ2aWNlLW9kYXRhLyIsInNvdXJjZXMiOlsiYWRhcHRlci1kYXRhLXNlcnZpY2Utb2RhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFZdkIsY0FBYztBQUNkO0lBQTZDLDJDQUFpQztJQU81RTtRQUFBLFlBQ0UsaUJBQU8sU0FFUjtRQVJELHNFQUFzRTtRQUN0RSx3RUFBd0U7UUFDeEUsc0ZBQXNGO1FBQ3RGLGFBQU8sR0FBRyxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxDQUFDO1FBa04xQyx3QkFBa0IsR0FBOEIsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUM7WUFDNUUsSUFBSSxFQUFFLGVBQWU7WUFFckIsU0FBUyxFQUFFLFVBQVUsSUFBUyxFQUFFLGNBQXFDLEVBQUUsV0FBK0I7Z0JBQ3BHLElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxJQUFJLElBQUksSUFBSTtvQkFBRSxPQUFPLE1BQU0sQ0FBQztnQkFDaEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDL0IsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO29CQUNwQixrRkFBa0Y7b0JBQ2xGLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzRSxJQUFJLEVBQUUsR0FBRyxjQUFjLElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMs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LE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBQ0YsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsZ0JBQXVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJyZWV6ZSBmcm9tICdicmVlemUtY2xpZW50JztcclxuaW1wb3J0IHsgYXBwZW5kUXVlcnlTdHJpbmdQYXJhbWV0ZXIgfSBmcm9tICcuL2FkYXB0ZXItY29yZSc7XHJcblxyXG5sZXQgY29yZSA9IGJyZWV6ZS5jb3JlO1xyXG5cclxuZGVjbGFyZSB2YXIgd2luZG93OiBhbnk7XHJcbmRlY2xhcmUgdmFyIGRvY3VtZW50OiBhbnk7XHJcbmRlY2xhcmUgdmFyIHVybDogYW55OyAvLyBuZWVkZWQgdG8gYWNjZXNzIG5vZGUncyB1cmwucGFyc2VcclxuZGVjbGFyZSB2YXIgT0RhdGE6IGFueTtcclxuXHJcbmludGVyZmFjZSBPRGF0YVNhdmVDb250ZXh0IGV4dGVuZHMgYnJlZXplLlNhdmVDb250ZXh0IHtcclxuICB0ZW1wS2V5czogYnJlZXplLkVudGl0eUtleVtdO1xyXG4gIGNvbnRlbnRLZXlzOiBicmVlemUuRW50aXR5W107XHJcbn1cclxuXHJcbi8qKiBAaGlkZGVuICovXHJcbmV4cG9ydCBjbGFzcyBEYXRhU2VydmljZU9EYXRhQWRhcHRlciBleHRlbmRzIGJyZWV6ZS5BYnN0cmFjdERhdGFTZXJ2aWNlQWRhcHRlciB7XHJcbiAgcmVsYXRpdmVVcmw6IGJvb2xlYW4gfCAoKGRzOiBicmVlemUuRGF0YVNlcnZpY2UsIHVybDogc3RyaW5nKSA9PiBzdHJpbmcpO1xyXG4gIC8vIF9jYXRjaE5vQ29ubmVjdGlvbkVycm9yID0gYWJzdHJhY3REc2FQcm90by5fY2F0Y2hOb0Nvbm5lY3Rpb25FcnJvcjtcclxuICAvLyBjaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3IgPSBhYnN0cmFjdERzYVByb3RvLmNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcjtcclxuICAvLyBfY3JlYXRlQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yID0gYWJzdHJhY3REc2FQcm90by5fY3JlYXRlQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yO1xyXG4gIGhlYWRlcnMgPSB7IFwiRGF0YVNlcnZpY2VWZXJzaW9uXCI6IFwiMi4wXCIgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5uYW1lID0gXCJPRGF0YVwiO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlZ2lzdGVyKGNvbmZpZz86IGJyZWV6ZS5CcmVlemVDb25maWcpIHtcclxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCBicmVlemUuY29uZmlnO1xyXG4gICAgY29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImRhdGFTZXJ2aWNlXCIsIERhdGFTZXJ2aWNlT0RhdGFBZGFwdGVyKTtcclxuICAgIHJldHVybiBjb25maWcuaW5pdGlhbGl6ZUFkYXB0ZXJJbnN0YW5jZShcImRhdGFTZXJ2aWNlXCIsIFwiT0RhdGFcIiwgdHJ1ZSkgYXMgRGF0YVNlcnZpY2VPRGF0YUFkYXB0ZXI7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkge1xyXG4gICAgT0RhdGEgPSBjb3JlLnJlcXVpcmVMaWIoXCJPRGF0YVwiLCBcIk5lZWRlZCB0byBzdXBwb3J0IHJlbW90ZSBPRGF0YSBzZXJ2aWNlc1wiKTtcclxuICAgIE9EYXRhLmpzb25IYW5kbGVyLnJlY29nbml6ZURhdGVzID0gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLyBBYnNvbHV0ZSBVUkwgaXMgdGhlIGRlZmF1bHQgYXMgb2YgQnJlZXplIDEuNS41LiAgXHJcbiAgLy8gVG8gdXNlIHJlbGF0aXZlIFVSTCAobGlrZSBwcmUtMS41LjUpLCBhZGQgYWRhcHRlckluc3RhbmNlLnJlbGF0aXZlVXJsID0gdHJ1ZTpcclxuICAvL1xyXG4gIC8vICAgICBsZXQgZHMgPSBicmVlemUuY29uZmlnLmluaXRpYWxpemVBZGFwdGVySW5zdGFuY2UoXCJkYXRhU2VydmljZVwiLCBcIndlYkFwaU9EYXRhXCIpO1xyXG4gIC8vICAgICBkcy5yZWxhdGl2ZVVybCA9IHRydWU7IFxyXG4gIC8vXHJcbiAgLy8gVG8gdXNlIGN1c3RvbSB1cmwgY29uc3RydWN0aW9uLCBhZGQgYWRhcHRlckluc3RhbmNlLnJlbGF0aXZlVXJsID0gbXlmdW5jdGlvbihkYXRhU2VydmljZSwgdXJsKTpcclxuICAvL1xyXG4gIC8vICAgICBsZXQgZHMgPSBicmVlemUuY29uZmlnLmluaXRpYWxpemVBZGFwdGVySW5zdGFuY2UoXCJkYXRhU2VydmljZVwiLCBcIndlYkFwaU9EYXRhXCIpO1xyXG4gIC8vICAgICBkcy5yZWxhdGl2ZVVybCA9IGZ1bmN0aW9uKGRhdGFTZXJ2aWNlLCB1cmwpIHtcclxuICAvLyAgICAgICAgcmV0dXJuIHNvbWVob3dDb252ZXJ0KHVybCk7XHJcbiAgLy8gICAgIH1cclxuICAvL1xyXG5cclxuICBmZXRjaE1ldGFkYXRhKG1ldGFkYXRhU3RvcmU6IGJyZWV6ZS5NZXRhZGF0YVN0b3JlLCBkYXRhU2VydmljZTogYnJlZXplLkRhdGFTZXJ2aWNlKSB7XHJcbiAgICBsZXQgc2VydmljZU5hbWUgPSBkYXRhU2VydmljZS5zZXJ2aWNlTmFtZTtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmc7XHJcbiAgICBpZiAodGhpcy5yZWxhdGl2ZVVybCA9PT0gdHJ1ZSkge1xyXG4gICAgICB1cmwgPSBkYXRhU2VydmljZS5xdWFsaWZ5VXJsKCckbWV0YWRhdGEnKTtcclxuICAgIH0gZWxzZSBpZiAoY29yZS5pc0Z1bmN0aW9uKHRoaXMucmVsYXRpdmVVcmwpKSB7XHJcbiAgICAgIHVybCA9ICh0aGlzLnJlbGF0aXZlVXJsIGFzIGFueSkoZGF0YVNlcnZpY2UsICckbWV0YWRhdGEnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVybCA9IHRoaXMuZ2V0QWJzb2x1dGVVcmwoZGF0YVNlcnZpY2UsICckbWV0YWRhdGEnKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWhlYWRlcnMgPSBjb3JlLmV4dGVuZCh7fSwgdGhpcy5oZWFkZXJzKTtcclxuICAgIChtaGVhZGVycyBhcyBhbnkpLkFjY2VwdCA9ICdhcHBsaWNhdGlvbi8qOyBvZGF0YS5tZXRhZGF0YT1mdWxsJztcclxuXHJcbiAgICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgLy8gT0RhdGEucmVhZCh1cmwsXHJcbiAgICAgIE9EYXRhLnJlYWQoe1xyXG4gICAgICAgIHJlcXVlc3RVcmk6IHVybCxcclxuICAgICAgICAvLyBoZWFkZXJzOiB7IFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwifVxyXG4gICAgICAgIGhlYWRlcnM6IG1oZWFkZXJzXHJcbiAgICAgIH0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgICAgLy8gZGF0YS5kYXRhU2VydmljZXMuc2NoZW1hIGlzIGFuIGFycmF5IG9mIHNjaGVtYXMuIHdpdGggcHJvcGVydGllcyBvZlxyXG4gICAgICAgICAgLy8gZW50aXR5Q29udGFpbmVyW10sIGFzc29jaWF0aW9uW10sIGVudGl0eVR5cGVbXSwgYW5kIG5hbWVzcGFjZS5cclxuICAgICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5kYXRhU2VydmljZXMpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKFwiTWV0YWRhdGEgcXVlcnkgZmFpbGVkIGZvcjogXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBjc2RsTWV0YWRhdGEgPSBkYXRhLmRhdGFTZXJ2aWNlcztcclxuXHJcbiAgICAgICAgICAvLyBtaWdodCBoYXZlIGJlZW4gZmV0Y2hlZCBieSBhbm90aGVyIHF1ZXJ5XHJcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhU3RvcmUuaGFzTWV0YWRhdGFGb3Ioc2VydmljZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgbWV0YWRhdGFTdG9yZS5pbXBvcnRNZXRhZGF0YShjc2RsTWV0YWRhdGEpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXCJNZXRhZGF0YSBxdWVyeSBmYWlsZWQgZm9yIFwiICsgdXJsICsgXCI7IFVuYWJsZSB0byBwcm9jZXNzIHJldHVybmVkIG1ldGFkYXRhOiBcIiArIGUubWVzc2FnZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBtZXRhZGF0YVN0b3JlLmFkZERhdGFTZXJ2aWNlKGRhdGFTZXJ2aWNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShjc2RsTWV0YWRhdGEpO1xyXG5cclxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgICAgbGV0IGVyciA9IGNyZWF0ZUVycm9yKGVycm9yLCB1cmwpO1xyXG4gICAgICAgICAgZXJyLm1lc3NhZ2UgPSBcIk1ldGFkYXRhIHF1ZXJ5IGZhaWxlZCBmb3I6IFwiICsgdXJsICsgXCI7IFwiICsgKGVyci5tZXNzYWdlIHx8IFwiXCIpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgT0RhdGEubWV0YWRhdGFIYW5kbGVyXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZXhlY3V0ZVF1ZXJ5KG1hcHBpbmdDb250ZXh0OiBicmVlemUuTWFwcGluZ0NvbnRleHQpIHtcclxuICAgIGxldCB1cmw6IHN0cmluZztcclxuICAgIGlmICh0aGlzLnJlbGF0aXZlVXJsID09PSB0cnVlKSB7XHJcbiAgICAgIHVybCA9IG1hcHBpbmdDb250ZXh0LmdldFVybCgpO1xyXG4gICAgfSBlbHNlIGlmIChjb3JlLmlzRnVuY3Rpb24odGhpcy5yZWxhdGl2ZVVybCkpIHtcclxuICAgICAgdXJsID0gKHRoaXMucmVsYXRpdmVVcmwgYXMgYW55KShtYXBwaW5nQ29udGV4dC5kYXRhU2VydmljZSwgbWFwcGluZ0NvbnRleHQuZ2V0VXJsKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdXJsID0gdGhpcy5nZXRBYnNvbHV0ZVVybChtYXBwaW5nQ29udGV4dC5kYXRhU2VydmljZSwgbWFwcGluZ0NvbnRleHQuZ2V0VXJsKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCBxdWVyeSBwYXJhbXMgaWYgLndpdGhQYXJhbWV0ZXJzIHdhcyB1c2VkXHJcbiAgICBsZXQgcXVlcnkgPSBtYXBwaW5nQ29udGV4dC5xdWVyeSBhcyBicmVlemUuRW50aXR5UXVlcnk7XHJcbiAgICBpZiAoIWNvcmUuaXNFbXB0eShxdWVyeS5wYXJhbWV0ZXJzKSkge1xyXG4gICAgICBsZXQgcGFyYW1TdHJpbmcgPSB0b1F1ZXJ5U3RyaW5nKHF1ZXJ5LnBhcmFtZXRlcnMpO1xyXG4gICAgICB1cmwgPSBhcHBlbmRRdWVyeVN0cmluZ1BhcmFtZXRlcih1cmwsIHBhcmFtU3RyaW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlPGJyZWV6ZS5RdWVyeVJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBPRGF0YS5yZWFkKHtcclxuICAgICAgICByZXF1ZXN0VXJpOiB1cmwsXHJcbiAgICAgICAgaGVhZGVyczogY29yZS5leHRlbmQoe30sIHRoaXMuaGVhZGVycylcclxuICAgICAgfSxcclxuICAgICAgICBmdW5jdGlvbiAoZGF0YTogYW55LCByZXNwb25zZTogYW55KSB7XHJcbiAgICAgICAgICBsZXQgaW5saW5lQ291bnQ6IGFueTtcclxuICAgICAgICAgIGlmIChkYXRhLl9fY291bnQpIHtcclxuICAgICAgICAgICAgLy8gT0RhdGEgY2FuIHJldHVybiBkYXRhLl9fY291bnQgYXMgYSBzdHJpbmdcclxuICAgICAgICAgICAgaW5saW5lQ291bnQgPSBwYXJzZUludChkYXRhLl9fY291bnQsIDEwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIE9kYXRhIHJldHVybnMgZGlmZmVyZW50IHJlc3VsdCBzdHJ1Y3R1cmUgd2hlbiBpdCByZXR1cm5zIG11bHRpcGxlIGVudGl0aWVzIChkYXRhLnJlc3VsdHMpIHZzIHNpbmdsZSBlbnRpdHkgKGRhdGEgZGlyZWN0bHkpLlxyXG4gICAgICAgICAgLy8gQHNlZSBodHRwOi8vd3d3Lm9kYXRhLm9yZy9kb2N1bWVudGF0aW9uL29kYXRhLXZlcnNpb24tMi0wL2pzb24tZm9ybWF0LyNSZXByZXNlbnRpbmdDb2xsZWN0aW9uc09mRW50cmllc1xyXG4gICAgICAgICAgLy8gYW5kIGh0dHA6Ly93d3cub2RhdGEub3JnL2RvY3VtZW50YXRpb24vb2RhdGEtdmVyc2lvbi0yLTAvanNvbi1mb3JtYXQvI1JlcHJlc2VudGluZ0VudHJpZXNcclxuICAgICAgICAgIGxldCByZXN1bHRzOiBhbnk7XHJcbiAgICAgICAgICBpZiAoZGF0YS5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHMgPSBkYXRhLnJlc3VsdHM7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHRzID0gZGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgcmVzdWx0czogcmVzdWx0cywgaW5saW5lQ291bnQ6IGlubGluZUNvdW50LCBodHRwUmVzcG9uc2U6IHJlc3BvbnNlLCBxdWVyeTogcXVlcnkgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChjcmVhdGVFcnJvcihlcnJvciwgdXJsKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG5cclxuICBzYXZlQ2hhbmdlcyhvZGF0YVNhdmVDb250ZXh0OiBicmVlemUuU2F2ZUNvbnRleHQsIHNhdmVCdW5kbGU6IGJyZWV6ZS5TYXZlQnVuZGxlKTogUHJvbWlzZTxicmVlemUuU2F2ZVJlc3VsdD4ge1xyXG4gICAgbGV0IGFkYXB0ZXIgPSBvZGF0YVNhdmVDb250ZXh0LmFkYXB0ZXIgPSB0aGlzO1xyXG4gICAgbGV0IHNhdmVDb250ZXh0ID0gb2RhdGFTYXZlQ29udGV4dCBhcyBPRGF0YVNhdmVDb250ZXh0O1xyXG4gICAgbGV0IHVybDogc3RyaW5nO1xyXG4gICAgaWYgKHRoaXMucmVsYXRpdmVVcmwgPT09IHRydWUpIHtcclxuICAgICAgc2F2ZUNvbnRleHQucm91dGVQcmVmaXggPSBhZGFwdGVyLmdldFJvdXRlUHJlZml4KHNhdmVDb250ZXh0LmRhdGFTZXJ2aWNlKTtcclxuICAgICAgdXJsID0gc2F2ZUNvbnRleHQuZGF0YVNlcnZpY2UucXVhbGlmeVVybChcIiRiYXRjaFwiKTtcclxuICAgIH0gZWxzZSBpZiAoY29yZS5pc0Z1bmN0aW9uKGFkYXB0ZXIucmVsYXRpdmVVcmwpKSB7XHJcbiAgICAgIHNhdmVDb250ZXh0LnJvdXRlUHJlZml4ID0gKGFkYXB0ZXIucmVsYXRpdmVVcmwgYXMgRnVuY3Rpb24pKHNhdmVDb250ZXh0LmRhdGFTZXJ2aWNlLCAnJyk7XHJcbiAgICAgIHVybCA9IHNhdmVDb250ZXh0LnJvdXRlUHJlZml4ICsgJyRiYXRjaCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzYXZlQ29udGV4dC5yb3V0ZVByZWZpeCA9IGFkYXB0ZXIuZ2V0QWJzb2x1dGVVcmwoc2F2ZUNvbnRleHQuZGF0YVNlcnZpY2UsICcnKTtcclxuICAgICAgdXJsID0gc2F2ZUNvbnRleHQucm91dGVQcmVmaXggKyAnJGJhdGNoJztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVxdWVzdERhdGEgPSBjcmVhdGVDaGFuZ2VSZXF1ZXN0cyhzYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZSk7XHJcbiAgICBsZXQgdGVtcEtleXMgPSBzYXZlQ29udGV4dC50ZW1wS2V5cztcclxuICAgIGxldCBjb250ZW50S2V5cyA9IHNhdmVDb250ZXh0LmNvbnRlbnRLZXlzO1xyXG4gICAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxicmVlemUuU2F2ZVJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBPRGF0YS5yZXF1ZXN0KHtcclxuICAgICAgICBoZWFkZXJzOiBjb3JlLmV4dGVuZCh7fSwgdGhpcy5oZWFkZXJzKSxcclxuICAgICAgICByZXF1ZXN0VXJpOiB1cmwsXHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBkYXRhOiByZXF1ZXN0RGF0YVxyXG4gICAgICB9LCBmdW5jdGlvbiAoZGF0YTogYW55LCByZXNwb25zZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGVudGl0aWVzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGxldCBrZXlNYXBwaW5nczogYnJlZXplLktleU1hcHBpbmdbXSA9IFtdO1xyXG4gICAgICAgIGxldCBzYXZlUmVzdWx0OiBicmVlemUuU2F2ZVJlc3VsdCA9IHsgZW50aXRpZXM6IGVudGl0aWVzLCBrZXlNYXBwaW5nczoga2V5TWFwcGluZ3MgfTtcclxuICAgICAgICBkYXRhLl9fYmF0Y2hSZXNwb25zZXMuZm9yRWFjaChmdW5jdGlvbiAoYnI6IGFueSkge1xyXG4gICAgICAgICAgYnIuX19jaGFuZ2VSZXNwb25zZXMuZm9yRWFjaChmdW5jdGlvbiAoY3I6IGFueSkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBjci5yZXNwb25zZSB8fCBjcjtcclxuICAgICAgICAgICAgbGV0IHN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlO1xyXG4gICAgICAgICAgICBpZiAoKCFzdGF0dXNDb2RlKSB8fCBzdGF0dXNDb2RlID49IDQwMCkge1xyXG4gICAgICAgICAgICAgIHJlamVjdChjcmVhdGVFcnJvcihjciwgdXJsKSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGVudElkID0gY3IuaGVhZGVyc1tcIkNvbnRlbnQtSURcIl07XHJcbiAgICAgICAgICAgIC8vIE9saW5nbyBzZW5kcyBkaWZmZXJlbnQgY2FzZSBvZiAnSUQnIGZvciB0aGUgaGVhZGVyIG5hbWUuXHJcbiAgICAgICAgICAgIGlmICghY29udGVudElkKSB7XHJcbiAgICAgICAgICAgICAgY29udGVudElkID0gY3IuaGVhZGVyc1tcIkNvbnRlbnQtSWRcIl07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCByYXdFbnRpdHkgPSBjci5kYXRhO1xyXG4gICAgICAgICAgICBpZiAocmF3RW50aXR5KSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRlbXBLZXkgPSB0ZW1wS2V5c1tjb250ZW50SWRdO1xyXG4gICAgICAgICAgICAgIGlmICh0ZW1wS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW50aXR5VHlwZSA9IHRlbXBLZXkuZW50aXR5VHlwZTtcclxuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlUeXBlLmF1dG9HZW5lcmF0ZWRLZXlUeXBlICE9PSBicmVlemUuQXV0b0dlbmVyYXRlZEtleVR5cGUuTm9uZSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdGVtcFZhbHVlID0gdGVtcEtleS52YWx1ZXNbMF07XHJcbiAgICAgICAgICAgICAgICAgIGxldCByZWFsS2V5ID0gZW50aXR5VHlwZS5nZXRFbnRpdHlLZXlGcm9tUmF3RW50aXR5KHJhd0VudGl0eSwgYnJlZXplLkRhdGFQcm9wZXJ0eS5nZXRSYXdWYWx1ZUZyb21TZXJ2ZXIpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQga2V5TWFwcGluZyA9IHsgZW50aXR5VHlwZU5hbWU6IGVudGl0eVR5cGUubmFtZSwgdGVtcFZhbHVlOiB0ZW1wVmFsdWUsIHJlYWxWYWx1ZTogcmVhbEtleS52YWx1ZXNbMF0gfTtcclxuICAgICAgICAgICAgICAgICAga2V5TWFwcGluZ3MucHVzaChrZXlNYXBwaW5nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZW50aXRpZXMucHVzaChyYXdFbnRpdHkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBvcmlnRW50aXR5ID0gY29udGVudEtleXNbY29udGVudElkXTtcclxuICAgICAgICAgICAgICBlbnRpdGllcy5wdXNoKG9yaWdFbnRpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZShzYXZlUmVzdWx0KTtcclxuICAgICAgfSwgZnVuY3Rpb24gKGVycjogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdChjcmVhdGVFcnJvcihlcnIsIHVybCkpO1xyXG4gICAgICB9LCBPRGF0YS5iYXRjaEhhbmRsZXIpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuXHJcbiAgfVxyXG5cclxuICBqc29uUmVzdWx0c0FkYXB0ZXI6IGJyZWV6ZS5Kc29uUmVzdWx0c0FkYXB0ZXIgPSBuZXcgYnJlZXplLkpzb25SZXN1bHRzQWRhcHRlcih7XHJcbiAgICBuYW1lOiBcIk9EYXRhX2RlZmF1bHRcIixcclxuXHJcbiAgICB2aXNpdE5vZGU6IGZ1bmN0aW9uIChub2RlOiBhbnksIG1hcHBpbmdDb250ZXh0OiBicmVlemUuTWFwcGluZ0NvbnRleHQsIG5vZGVDb250ZXh0OiBicmVlemUuTm9kZUNvbnRleHQpIHtcclxuICAgICAgbGV0IHJlc3VsdDogYW55ID0ge307XHJcbiAgICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIGxldCBtZXRhZGF0YSA9IG5vZGUuX19tZXRhZGF0YTtcclxuICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHtcclxuICAgICAgICAvLyBUT0RPOiBtYXkgYmUgYWJsZSB0byBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQgYnkgY2FjaGluZyBvZiB0aGUgcHJldmlvdXMgdmFsdWUuXHJcbiAgICAgICAgbGV0IGVudGl0eVR5cGVOYW1lID0gYnJlZXplLk1ldGFkYXRhU3RvcmUubm9ybWFsaXplVHlwZU5hbWUobWV0YWRhdGEudHlwZSk7XHJcbiAgICAgICAgbGV0IGV0ID0gZW50aXR5VHlwZU5hbWUgJiYgbWFwcGluZ0NvbnRleHQuZW50aXR5TWFuYWdlci5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoZW50aXR5VHlwZU5hbWUsIHRydWUpO1xyXG4gICAgICAgIC8vIE9EYXRhIHJlc3BvbnNlIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYSBwcm9qZWN0aW9uIGZyb20gYSB3aG9sZSBlbnRpdHkuXHJcbiAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHRoYXQgd2hvbGUtZW50aXR5IGRhdGEgd291bGQgaGF2ZSBhdCBsZWFzdCBhcyBtYW55IHByb3BlcnRpZXMgICg8PSlcclxuICAgICAgICAvLyBhcyB0aGUgRW50aXR5VHlwZSBoYXMgbWFwcGVkIHByb3BlcnRpZXMgb24gdGhlIGJhc2lzIHRoYXRcclxuICAgICAgICAvLyBtb3N0IHByb2plY3Rpb25zIHJlbW92ZSBwcm9wZXJ0aWVzIHJhdGhlciB0aGFuIGFkZCB0aGVtLlxyXG4gICAgICAgIC8vIElmIG5vdCwgYXNzdW1lIGl0J3MgYSBwcm9qZWN0aW9uIGFuZCBkbyBOT1QgdHJlYXQgYXMgYW4gZW50aXR5XHJcbiAgICAgICAgaWYgKGV0ICYmIGV0Ll9tYXBwZWRQcm9wZXJ0aWVzQ291bnQgPD0gT2JqZWN0LmtleXMobm9kZSkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgLy8gaWYgKGV0ICYmIGV0Ll9tYXBwZWRQcm9wZXJ0aWVzQ291bnQgPT09IE9iamVjdC5rZXlzKG5vZGUpLmxlbmd0aCAtIDEpIHsgLy8gT0xEXHJcbiAgICAgICAgICByZXN1bHQuZW50aXR5VHlwZSA9IGV0O1xyXG4gICAgICAgICAgbGV0IHVyaUtleSA9IG1ldGFkYXRhLnVyaSB8fCBtZXRhZGF0YS5pZDtcclxuICAgICAgICAgIGlmICh1cmlLZXkpIHtcclxuICAgICAgICAgICAgLy8gU3RyaXAgYmFzZVVyaSB0byBtYWtlIHVyaUtleSBhIHJlbGF0aXZlIHVyaVxyXG4gICAgICAgICAgICAvLyBUb2RvOiB3aHkgaXMgdGhpcyBuZWNlc3Nhcnkgd2hlbiBhYnNvbHV0ZSB3b3JrcyBmb3IgZXZlcnkgT0RhdGEgc291cmNlIHRlc3RlZD9cclxuICAgICAgICAgICAgbGV0IHJlID0gbmV3IFJlZ0V4cCgnXicgKyBtYXBwaW5nQ29udGV4dC5kYXRhU2VydmljZS5zZXJ2aWNlTmFtZSwgJ2knKTtcclxuICAgICAgICAgICAgdXJpS2V5ID0gdXJpS2V5LnJlcGxhY2UocmUsICcnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlc3VsdC5leHRyYU1ldGFkYXRhID0ge1xyXG4gICAgICAgICAgICB1cmlLZXk6IHVyaUtleSxcclxuICAgICAgICAgICAgZXRhZzogbWV0YWRhdGEuZXRhZ1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gT0RhdGEgdjMgLSBwcm9qZWN0aW9uIGFycmF5cyB3aWxsIGJlIGVuY2xvc2VkIGluIGEgcmVzdWx0cyBhcnJheVxyXG4gICAgICBpZiAobm9kZS5yZXN1bHRzKSB7XHJcbiAgICAgICAgcmVzdWx0Lm5vZGUgPSBub2RlLnJlc3VsdHM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwcm9wZXJ0eU5hbWUgPSBub2RlQ29udGV4dC5wcm9wZXJ0eU5hbWU7XHJcbiAgICAgIHJlc3VsdC5pZ25vcmUgPSBub2RlLl9fZGVmZXJyZWQgIT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUgPT09IFwiX19tZXRhZGF0YVwiIHx8XHJcbiAgICAgICAgLy8gRW50aXR5S2V5IHByb3BlcnRpZXMgY2FuIGJlIHByb2R1Y2VkIGJ5IEVETVggbW9kZWxzXHJcbiAgICAgICAgKHByb3BlcnR5TmFtZSA9PT0gXCJFbnRpdHlLZXlcIiAmJiBub2RlLiR0eXBlICYmIGNvcmUuc3RyaW5nU3RhcnRzV2l0aChub2RlLiR0eXBlLCBcIlN5c3RlbS5EYXRhXCIpKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG4gIGdldEFic29sdXRlVXJsKGRhdGFTZXJ2aWNlOiBicmVlemUuRGF0YVNlcnZpY2UsIHVybDogc3RyaW5nKSB7XHJcbiAgICBsZXQgc2VydmljZU5hbWUgPSBkYXRhU2VydmljZS5xdWFsaWZ5VXJsKCcnKTtcclxuICAgIC8vIG9ubHkgcHJlZml4IHdpdGggc2VydmljZU5hbWUgaWYgbm90IGFscmVhZHkgb24gdGhlIHVybFxyXG4gICAgbGV0IGJhc2UgPSAoY29yZS5zdHJpbmdTdGFydHNXaXRoKHVybCwgc2VydmljZU5hbWUpKSA/ICcnIDogc2VydmljZU5hbWU7XHJcbiAgICAvLyBJZiBubyBwcm90b2NvbCwgdHVybiBiYXNlIGludG8gYW4gYWJzb2x1dGUgVVJJXHJcbiAgICBpZiAod2luZG93ICYmIHNlcnZpY2VOYW1lLmluZGV4T2YoJy8vJykgPCAwKSB7XHJcbiAgICAgIC8vIG5vIHByb3RvY29sOyBtYWtlIGl0IGFic29sdXRlXHJcbiAgICAgIGJhc2UgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3QgK1xyXG4gICAgICAgIChjb3JlLnN0cmluZ1N0YXJ0c1dpdGgoc2VydmljZU5hbWUsICcvJykgPyAnJyA6ICcvJykgK1xyXG4gICAgICAgIGJhc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmFzZSArIHVybDtcclxuICB9XHJcblxyXG4gIGdldFJvdXRlUHJlZml4KGRhdGFTZXJ2aWNlOiBicmVlemUuRGF0YVNlcnZpY2UpIHtcclxuICAgIC8vIEdldCB0aGUgcm91dGVQcmVmaXggZnJvbSBhIFdlYiBBUEkgT0RhdGEgc2VydmljZSBuYW1lLlxyXG4gICAgLy8gVGhlIHJvdXRlUHJlZml4IGlzIHByZXN1bWVkIHRvIGJlIHRoZSBwYXRobmFtZSB3aXRoaW4gdGhlIGRhdGFTZXJ2aWNlLnNlcnZpY2VOYW1lXHJcbiAgICAvLyBFeGFtcGxlcyBvZiBzZXJ2aWNlbmFtZSAtPiByb3V0ZVByZWZpeDpcclxuICAgIC8vICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6NTU4MDIvb2RhdGEvJyAtPiAnb2RhdGEvJ1xyXG4gICAgLy8gICAnaHR0cDovLzE5OC4xNTQuMTIxLjc1L3NlcnZpY2Uvb2RhdGEvJyAtPiAnc2VydmljZS9vZGF0YS8nXHJcbiAgICBsZXQgcGFyc2VyOiBhbnk7XHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAnb2JqZWN0JykgeyAvLyBicm93c2VyXHJcbiAgICAgIHBhcnNlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgcGFyc2VyLmhyZWYgPSBkYXRhU2VydmljZS5zZXJ2aWNlTmFtZTtcclxuICAgIH0gZWxzZSB7IC8vIG5vZGVcclxuICAgICAgLy8gVE9ETzogaG93IHRvIGJlc3QgaGFuZGxlIHRoaXNcclxuICAgICAgLy8gYXNzdW1lcyBleGlzdGVuY2Ugb2Ygbm9kZSdzIHVybC5wYXJzZSBtZXRob2QuXHJcbiAgICAgIHBhcnNlciA9IHVybC5wYXJzZShkYXRhU2VydmljZS5zZXJ2aWNlTmFtZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcHJlZml4ID0gcGFyc2VyLnBhdGhuYW1lO1xyXG4gICAgaWYgKHByZWZpeFswXSA9PT0gJy8nKSB7XHJcbiAgICAgIHByZWZpeCA9IHByZWZpeC5zdWJzdHIoMSk7XHJcbiAgICB9IC8vIGRyb3AgbGVhZGluZyAnLycgIChhbGwgYnV0IElFKVxyXG4gICAgaWYgKHByZWZpeC5zdWJzdHIoLTEpICE9PSAnLycpIHtcclxuICAgICAgcHJlZml4ICs9ICcvJztcclxuICAgIH0gICAgICAvLyBlbnN1cmUgdHJhaWxpbmcgJy8nXHJcbiAgICByZXR1cm4gcHJlZml4O1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbi8vIGNydWRlIHNlcmlhbGl6ZXIuICBEb2Vzbid0IHJlY3Vyc2VcclxuZnVuY3Rpb24gdG9RdWVyeVN0cmluZyhvYmo6IE9iamVjdCkge1xyXG4gIGxldCBwYXJ0czogc3RyaW5nW10gPSBbXTtcclxuICBmb3IgKGxldCBpIGluIG9iaikge1xyXG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICBwYXJ0cy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChpKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9ialtpXSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcGFydHMuam9pbihcIiZcIik7XHJcbn1cclxuXHJcbi8qKiBUcmFuc2Zvcm0gZGF0YSBwcm9wZXJ0aWVzIHdoaWxlIHVud3JhcHBpbmcgZW50aXRpZXMgKi9cclxuZnVuY3Rpb24gdHJhbnNmb3JtVmFsdWUocHJvcDogYnJlZXplLkRhdGFQcm9wZXJ0eSwgdmFsOiBhbnkpIHtcclxuICBpZiAocHJvcC5pc1VubWFwcGVkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIGlmIChwcm9wLmRhdGFUeXBlID09PSBicmVlemUuRGF0YVR5cGUuRGF0ZVRpbWVPZmZzZXQpIHtcclxuICAgIC8vIFRoZSBkYXRhanMgbGliIHRyaWVzIHRvIHRyZWF0IGNsaWVudCBkYXRlVGltZXMgdGhhdCBhcmUgZGVmaW5lZCBhcyBEYXRlVGltZU9mZnNldCBvbiB0aGUgc2VydmVyIGRpZmZlcmVudGx5XHJcbiAgICAvLyBmcm9tIG90aGVyIGRhdGVUaW1lcy4gVGhpcyBmaXggY29tcGVuc2F0ZXMgYmVmb3JlIHRoZSBzYXZlLlxyXG4gICAgdmFsID0gdmFsICYmIG5ldyBEYXRlKHZhbC5nZXRUaW1lKCkgLSAodmFsLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMCkpO1xyXG4gIH0gZWxzZSBpZiAocHJvcC5kYXRhVHlwZSA9PT0gYnJlZXplLkRhdGFUeXBlLkRhdGVPbmx5KSB7XHJcbiAgICB2YWwgPSBicmVlemUuRGF0YVR5cGUudG9EYXRlT25seVN0cmluZyh2YWwpO1xyXG4gIH0gZWxzZSBpZiAoKHByb3AuZGF0YVR5cGUgYXMgYnJlZXplLkRhdGFUeXBlKS5xdW90ZUpzb25PRGF0YSkge1xyXG4gICAgdmFsID0gdmFsICE9IG51bGwgPyB2YWwudG9TdHJpbmcoKSA6IHZhbDtcclxuICB9XHJcbiAgcmV0dXJuIHZhbDtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlQ2hhbmdlUmVxdWVzdHMoc2F2ZUNvbnRleHQ6IE9EYXRhU2F2ZUNvbnRleHQsIHNhdmVCdW5kbGU6IGJyZWV6ZS5TYXZlQnVuZGxlKSB7XHJcbiAgbGV0IGNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvciA9IChzYXZlQ29udGV4dC5hZGFwdGVyIGFzIERhdGFTZXJ2aWNlT0RhdGFBZGFwdGVyKS5fY3JlYXRlQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yKHNhdmVDb250ZXh0LCBzYXZlQnVuZGxlKTtcclxuICBsZXQgY2hhbmdlUmVxdWVzdHM6IGFueVtdID0gW107XHJcbiAgbGV0IHRlbXBLZXlzOiBicmVlemUuRW50aXR5S2V5W10gPSBbXTtcclxuICBsZXQgY29udGVudEtleXM6IGJyZWV6ZS5FbnRpdHlbXSA9IFtdO1xyXG4gIGxldCBlbnRpdHlNYW5hZ2VyID0gc2F2ZUNvbnRleHQuZW50aXR5TWFuYWdlcjtcclxuICBsZXQgaGVscGVyID0gZW50aXR5TWFuYWdlci5oZWxwZXI7XHJcbiAgbGV0IGlkID0gMDtcclxuICBsZXQgcm91dGVQcmVmaXggPSBzYXZlQ29udGV4dC5yb3V0ZVByZWZpeDtcclxuXHJcbiAgc2F2ZUJ1bmRsZS5lbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHksIGluZGV4KSB7XHJcbiAgICBsZXQgYXNwZWN0ID0gZW50aXR5LmVudGl0eUFzcGVjdDtcclxuICAgIGlkID0gaWQgKyAxOyAvLyB3ZSBhcmUgZGVsaWJlcmF0ZWx5IHNraXBwaW5nIGlkPTAgYmVjYXVzZSBDb250ZW50LUlEID0gMCBzZWVtcyB0byBiZSBpZ25vcmVkLlxyXG4gICAgbGV0IHJlcXVlc3QgPSB7IGhlYWRlcnM6IHsgXCJDb250ZW50LUlEXCI6IGlkLCBcIkRhdGFTZXJ2aWNlVmVyc2lvblwiOiBcIjIuMFwiIH0gfSBhcyBhbnk7XHJcbiAgICBjb250ZW50S2V5c1tpZF0gPSBlbnRpdHk7XHJcbiAgICBpZiAoYXNwZWN0LmVudGl0eVN0YXRlLmlzQWRkZWQoKSkge1xyXG4gICAgICByZXF1ZXN0LnJlcXVlc3RVcmkgPSByb3V0ZVByZWZpeCArIGVudGl0eS5lbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWU7XHJcbiAgICAgIHJlcXVlc3QubWV0aG9kID0gXCJQT1NUXCI7XHJcbiAgICAgIHJlcXVlc3QuZGF0YSA9IGhlbHBlci51bndyYXBJbnN0YW5jZShlbnRpdHksIHRyYW5zZm9ybVZhbHVlKTtcclxuICAgICAgdGVtcEtleXNbaWRdID0gYXNwZWN0LmdldEtleSgpO1xyXG4gICAgfSBlbHNlIGlmIChhc3BlY3QuZW50aXR5U3RhdGUuaXNNb2RpZmllZCgpKSB7XHJcbiAgICAgIHVwZGF0ZURlbGV0ZU1lcmdlUmVxdWVzdChyZXF1ZXN0LCBhc3BlY3QsIHJvdXRlUHJlZml4ISk7XHJcbiAgICAgIHJlcXVlc3QubWV0aG9kID0gXCJNRVJHRVwiO1xyXG4gICAgICByZXF1ZXN0LmRhdGEgPSBoZWxwZXIudW53cmFwQ2hhbmdlZFZhbHVlcyhlbnRpdHksIGVudGl0eU1hbmFnZXIubWV0YWRhdGFTdG9yZSwgdHJhbnNmb3JtVmFsdWUpO1xyXG4gICAgICAvLyBzaG91bGQgYmUgYSBQQVRDSC9NRVJHRVxyXG4gICAgfSBlbHNlIGlmIChhc3BlY3QuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgdXBkYXRlRGVsZXRlTWVyZ2VSZXF1ZXN0KHJlcXVlc3QsIGFzcGVjdCwgcm91dGVQcmVmaXghKTtcclxuICAgICAgcmVxdWVzdC5tZXRob2QgPSBcIkRFTEVURVwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcmVxdWVzdCA9IGNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvci5nZXRSZXF1ZXN0KHJlcXVlc3QsIGVudGl0eSwgaW5kZXgpO1xyXG4gICAgY2hhbmdlUmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcclxuICB9KTtcclxuICBzYXZlQ29udGV4dC5jb250ZW50S2V5cyA9IGNvbnRlbnRLZXlzO1xyXG4gIHNhdmVDb250ZXh0LnRlbXBLZXlzID0gdGVtcEtleXM7XHJcbiAgY2hhbmdlUmVxdWVzdEludGVyY2VwdG9yLmRvbmUoY2hhbmdlUmVxdWVzdHMpO1xyXG4gIHJldHVybiB7XHJcbiAgICBfX2JhdGNoUmVxdWVzdHM6IFtcclxuICAgICAge1xyXG4gICAgICAgIF9fY2hhbmdlUmVxdWVzdHM6IGNoYW5nZVJlcXVlc3RzXHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlRGVsZXRlTWVyZ2VSZXF1ZXN0KHJlcXVlc3Q6IGFueSwgYXNwZWN0OiBicmVlemUuRW50aXR5QXNwZWN0LCByb3V0ZVByZWZpeDogc3RyaW5nKSB7XHJcbiAgbGV0IHVyaUtleTogc3RyaW5nO1xyXG4gIGxldCBleHRyYU1ldGFkYXRhID0gYXNwZWN0LmV4dHJhTWV0YWRhdGE7XHJcbiAgaWYgKGV4dHJhTWV0YWRhdGEgPT0gbnVsbCkge1xyXG4gICAgdXJpS2V5ID0gZ2V0VXJpS2V5KGFzcGVjdCk7XHJcbiAgICBhc3BlY3QuZXh0cmFNZXRhZGF0YSA9IHtcclxuICAgICAgdXJpS2V5OiB1cmlLZXlcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIHVyaUtleSA9IGV4dHJhTWV0YWRhdGEudXJpS2V5O1xyXG4gICAgaWYgKGV4dHJhTWV0YWRhdGEuZXRhZykge1xyXG4gICAgICByZXF1ZXN0LmhlYWRlcnNbXCJJZi1NYXRjaFwiXSA9IGV4dHJhTWV0YWRhdGEuZXRhZztcclxuICAgIH1cclxuICB9XHJcbiAgcmVxdWVzdC5yZXF1ZXN0VXJpID1cclxuICAgIC8vIHVzZSByb3V0ZVByZWZpeCBpZiB1cmlLZXkgbGFja3MgcHJvdG9jb2wgKGkuZS4sIHJlbGF0aXZlIHVyaSlcclxuICAgIHVyaUtleS5pbmRleE9mKCcvLycpID4gMCA/IHVyaUtleSA6IHJvdXRlUHJlZml4ICsgdXJpS2V5O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRVcmlLZXkoYXNwZWN0OiBicmVlemUuRW50aXR5QXNwZWN0KSB7XHJcbiAgbGV0IGVudGl0eVR5cGUgPSBhc3BlY3QuZW50aXR5IS5lbnRpdHlUeXBlO1xyXG4gIGxldCByZXNvdXJjZU5hbWUgPSBlbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWU7XHJcbiAgbGV0IGtwcyA9IGVudGl0eVR5cGUua2V5UHJvcGVydGllcztcclxuICBsZXQgdXJpS2V5ID0gcmVzb3VyY2VOYW1lICsgXCIoXCI7XHJcbiAgaWYgKGtwcy5sZW5ndGggPT09IDEpIHtcclxuICAgIHVyaUtleSA9IHVyaUtleSArIGZtdFByb3BlcnR5KGtwc1swXSwgYXNwZWN0KSArIFwiKVwiO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgZGVsaW0gPSBcIlwiO1xyXG4gICAga3BzLmZvckVhY2goZnVuY3Rpb24gKGtwKSB7XHJcbiAgICAgIHVyaUtleSA9IHVyaUtleSArIGRlbGltICsga3AubmFtZU9uU2VydmVyICsgXCI9XCIgKyBmbXRQcm9wZXJ0eShrcCwgYXNwZWN0KTtcclxuICAgICAgZGVsaW0gPSBcIixcIjtcclxuICAgIH0pO1xyXG4gICAgdXJpS2V5ID0gdXJpS2V5ICsgXCIpXCI7XHJcbiAgfVxyXG4gIHJldHVybiB1cmlLZXk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZtdFByb3BlcnR5KHByb3A6IGJyZWV6ZS5EYXRhUHJvcGVydHksIGFzcGVjdDogYnJlZXplLkVudGl0eUFzcGVjdCkge1xyXG4gIHJldHVybiAocHJvcC5kYXRhVHlwZSBhcyBicmVlemUuRGF0YVR5cGUpLmZtdE9EYXRhIShhc3BlY3QuZ2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRXJyb3IoZXJyb3I6IGFueSwgdXJsOiBzdHJpbmcpIHtcclxuICAvLyBPRGF0YSBlcnJvcnMgY2FuIGhhdmUgdGhlIG1lc3NhZ2UgYnVyaWVkIHZlcnkgZGVlcGx5IC0gYW5kIG5vbm9idmlvdXNseVxyXG4gIC8vIHRoaXMgY29kZSBpcyB0cmlja3kgc28gYmUgY2FyZWZ1bCBjaGFuZ2luZyB0aGUgcmVzcG9uc2UuYm9keSBwYXJzaW5nLlxyXG4gIGxldCByZXN1bHQgPSBuZXcgRXJyb3IoKSBhcyBicmVlemUuU2VydmVyRXJyb3I7XHJcbiAgbGV0IHJlc3BvbnNlID0gZXJyb3IgJiYgZXJyb3IucmVzcG9uc2U7XHJcbiAgaWYgKCFyZXNwb25zZSkge1xyXG4gICAgLy8gaW4gY2FzZSBEYXRhSlMgcmV0dXJucyBcIk5vIGhhbmRsZXIgZm9yIHRoaXMgZGF0YVwiXHJcbiAgICByZXN1bHQubWVzc2FnZSA9IGVycm9yO1xyXG4gICAgcmVzdWx0LnN0YXR1c1RleHQgPSBlcnJvcjtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG4gIHJlc3VsdC5tZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcclxuICByZXN1bHQuc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XHJcbiAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1c0NvZGU7XHJcbiAgLy8gbm9uIHN0ZFxyXG4gIGlmICh1cmwpIHJlc3VsdC51cmwgPSB1cmw7XHJcbiAgcmVzdWx0LmJvZHkgPSByZXNwb25zZS5ib2R5O1xyXG4gIGlmIChyZXNwb25zZS5ib2R5KSB7XHJcbiAgICBsZXQgbmV4dEVycjogYW55O1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICByZXN1bHQuYm9keSA9IGJvZHk7XHJcbiAgICAgIC8vIE9EYXRhIHYzIGxvZ2ljXHJcbiAgICAgIGlmIChib2R5WydvZGF0YS5lcnJvciddKSB7XHJcbiAgICAgICAgYm9keSA9IGJvZHlbJ29kYXRhLmVycm9yJ107XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG1zZyA9IFwiXCI7XHJcbiAgICAgIGRvIHtcclxuICAgICAgICBuZXh0RXJyID0gYm9keS5lcnJvciB8fCBib2R5LmlubmVyZXJyb3I7XHJcbiAgICAgICAgaWYgKCFuZXh0RXJyKSBtc2cgPSBtc2cgKyBnZXRNZXNzYWdlKGJvZHkpO1xyXG4gICAgICAgIG5leHRFcnIgPSBuZXh0RXJyIHx8IGJvZHkuaW50ZXJuYWxleGNlcHRpb247XHJcbiAgICAgICAgYm9keSA9IG5leHRFcnIgfHwgYm9keTtcclxuICAgICAgfSB3aGlsZSAobmV4dEVycik7XHJcbiAgICAgIGlmIChtc2cubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJlc3VsdC5tZXNzYWdlID0gbXNnO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuICBicmVlemUuQWJzdHJhY3REYXRhU2VydmljZUFkYXB0ZXIuX2NhdGNoTm9Db25uZWN0aW9uRXJyb3IocmVzdWx0KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRNZXNzYWdlKGJvZHk6IGFueSkge1xyXG4gIGxldCBtc2cgPSBib2R5Lm1lc3NhZ2UgfHwgXCJcIjtcclxuICByZXR1cm4gKCh0eXBlb2YgKG1zZykgPT09IFwic3RyaW5nXCIpID8gbXNnIDogbXNnLnZhbHVlKSArIFwiOyBcIjtcclxufVxyXG5cclxuYnJlZXplLmNvbmZpZy5yZWdpc3RlckFkYXB0ZXIoXCJkYXRhU2VydmljZVwiLCBEYXRhU2VydmljZU9EYXRhQWRhcHRlcik7XHJcblxyXG5cclxubGV0IHdlYkFwaU9EYXRhQ3RvciA9IGZ1bmN0aW9uICgpIHtcclxuICB0aGlzLm5hbWUgPSBcIndlYkFwaU9EYXRhXCI7XHJcbn07XHJcblxyXG5icmVlemUuY29yZS5leHRlbmQod2ViQXBpT0RhdGFDdG9yLnByb3RvdHlwZSwgRGF0YVNlcnZpY2VPRGF0YUFkYXB0ZXIucHJvdG90eXBlKTtcclxuXHJcbmJyZWV6ZS5jb25maWcucmVnaXN0ZXJBZGFwdGVyKFwiZGF0YVNlcnZpY2VcIiwgd2ViQXBpT0RhdGFDdG9yIGFzIGFueSk7XHJcbi8vIE9EYXRhIDQgYWRhcHRlclxyXG5sZXQgd2ViQXBpT0RhdGE0Q3RvciA9IGZ1bmN0aW9uICgpIHtcclxuICB0aGlzLm5hbWUgPSBcIndlYkFwaU9EYXRhNFwiO1xyXG59O1xyXG5icmVlemUuY29yZS5leHRlbmQod2ViQXBpT0RhdGE0Q3Rvci5wcm90b3R5cGUsIHdlYkFwaU9EYXRhQ3Rvci5wcm90b3R5cGUpO1xyXG53ZWJBcGlPRGF0YTRDdG9yLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKCkge1xyXG4gIC8vIEFhcmdoLi4uIHRoZXkgbW92ZWQgdGhlIGNoZWVzZS5cclxuICBsZXQgZGF0YWpzID0gY29yZS5yZXF1aXJlTGliKFwiZGF0YWpzXCIsIFwiTmVlZGVkIHRvIHN1cHBvcnQgcmVtb3RlIE9EYXRhIHY0IHNlcnZpY2VzXCIpO1xyXG4gIE9EYXRhID0gZGF0YWpzLlY0Lm9EYXRhO1xyXG4gIE9EYXRhLmpzb24uanNvbkhhbmRsZXIucmVjb2duaXplRGF0ZXMgPSB0cnVlO1xyXG59O1xyXG53ZWJBcGlPRGF0YTRDdG9yLnByb3RvdHlwZS5oZWFkZXJzID0geyBcIk9EYXRhLVZlcnNpb25cIjogXCI0LjBcIiB9O1xyXG5icmVlemUuY29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImRhdGFTZXJ2aWNlXCIsIHdlYkFwaU9EYXRhNEN0b3IgYXMgYW55KTtcclxuXHJcblxyXG5cclxuXHJcbiJdfQ==
461
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1kYXRhLXNlcnZpY2Utb2RhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlci1kYXRhLXNlcnZpY2Utb2RhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUQsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQVl2QixjQUFjO0FBQ2QsTUFBTSxPQUFPLHVCQUF3QixTQUFRLE1BQU0sQ0FBQywwQkFBMEI7SUFDNUUsV0FBVyxDQUE4RDtJQUN6RSxzRUFBc0U7SUFDdEUsd0VBQXdFO0lBQ3hFLHNGQUFzRjtJQUN0RixPQUFPLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUUxQztRQUNFLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBNEI7UUFDMUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDL0QsT0FBTyxNQUFNLENBQUMseUJBQXlCLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQTRCLENBQUM7SUFDbkcsQ0FBQztJQUVELFVBQVU7UUFDUixLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUseUNBQXlDLENBQUMsQ0FBQztRQUM1RSxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDMUMsQ0FBQztJQUdELG9EQUFvRDtJQUNwRCxnRkFBZ0Y7SUFDaEYsRUFBRTtJQUNGLHNGQUFzRjtJQUN0Riw4QkFBOEI7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QyxDQUFDO0FBQ0YsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsZ0JBQXVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJyZWV6ZSBmcm9tICdicmVlemUtY2xpZW50JztcclxuaW1wb3J0IHsgYXBwZW5kUXVlcnlTdHJpbmdQYXJhbWV0ZXIgfSBmcm9tICcuL2FkYXB0ZXItY29yZSc7XHJcblxyXG5sZXQgY29yZSA9IGJyZWV6ZS5jb3JlO1xyXG5cclxuZGVjbGFyZSB2YXIgd2luZG93OiBhbnk7XHJcbmRlY2xhcmUgdmFyIGRvY3VtZW50OiBhbnk7XHJcbmRlY2xhcmUgdmFyIHVybDogYW55OyAvLyBuZWVkZWQgdG8gYWNjZXNzIG5vZGUncyB1cmwucGFyc2VcclxuZGVjbGFyZSB2YXIgT0RhdGE6IGFueTtcclxuXHJcbmludGVyZmFjZSBPRGF0YVNhdmVDb250ZXh0IGV4dGVuZHMgYnJlZXplLlNhdmVDb250ZXh0IHtcclxuICB0ZW1wS2V5czogYnJlZXplLkVudGl0eUtleVtdO1xyXG4gIGNvbnRlbnRLZXlzOiBicmVlemUuRW50aXR5W107XHJcbn1cclxuXHJcbi8qKiBAaGlkZGVuICovXHJcbmV4cG9ydCBjbGFzcyBEYXRhU2VydmljZU9EYXRhQWRhcHRlciBleHRlbmRzIGJyZWV6ZS5BYnN0cmFjdERhdGFTZXJ2aWNlQWRhcHRlciB7XHJcbiAgcmVsYXRpdmVVcmw6IGJvb2xlYW4gfCAoKGRzOiBicmVlemUuRGF0YVNlcnZpY2UsIHVybDogc3RyaW5nKSA9PiBzdHJpbmcpO1xyXG4gIC8vIF9jYXRjaE5vQ29ubmVjdGlvbkVycm9yID0gYWJzdHJhY3REc2FQcm90by5fY2F0Y2hOb0Nvbm5lY3Rpb25FcnJvcjtcclxuICAvLyBjaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3IgPSBhYnN0cmFjdERzYVByb3RvLmNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvcjtcclxuICAvLyBfY3JlYXRlQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yID0gYWJzdHJhY3REc2FQcm90by5fY3JlYXRlQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yO1xyXG4gIGhlYWRlcnMgPSB7IFwiRGF0YVNlcnZpY2VWZXJzaW9uXCI6IFwiMi4wXCIgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5uYW1lID0gXCJPRGF0YVwiO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlZ2lzdGVyKGNvbmZpZz86IGJyZWV6ZS5CcmVlemVDb25maWcpIHtcclxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCBicmVlemUuY29uZmlnO1xyXG4gICAgY29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImRhdGFTZXJ2aWNlXCIsIERhdGFTZXJ2aWNlT0RhdGFBZGFwdGVyKTtcclxuICAgIHJldHVybiBjb25maWcuaW5pdGlhbGl6ZUFkYXB0ZXJJbnN0YW5jZShcImRhdGFTZXJ2aWNlXCIsIFwiT0RhdGFcIiwgdHJ1ZSkgYXMgRGF0YVNlcnZpY2VPRGF0YUFkYXB0ZXI7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkge1xyXG4gICAgT0RhdGEgPSBjb3JlLnJlcXVpcmVMaWIoXCJPRGF0YVwiLCBcIk5lZWRlZCB0byBzdXBwb3J0IHJlbW90ZSBPRGF0YSBzZXJ2aWNlc1wiKTtcclxuICAgIE9EYXRhLmpzb25IYW5kbGVyLnJlY29nbml6ZURhdGVzID0gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLyBBYnNvbHV0ZSBVUkwgaXMgdGhlIGRlZmF1bHQgYXMgb2YgQnJlZXplIDEuNS41LiAgXHJcbiAgLy8gVG8gdXNlIHJlbGF0aXZlIFVSTCAobGlrZSBwcmUtMS41LjUpLCBhZGQgYWRhcHRlckluc3RhbmNlLnJlbGF0aXZlVXJsID0gdHJ1ZTpcclxuICAvL1xyXG4gIC8vICAgICBsZXQgZHMgPSBicmVlemUuY29uZmlnLmluaXRpYWxpemVBZGFwdGVySW5zdGFuY2UoXCJkYXRhU2VydmljZVwiLCBcIndlYkFwaU9EYXRhXCIpO1xyXG4gIC8vICAgICBkcy5yZWxhdGl2ZVVybCA9IHRydWU7IFxyXG4gIC8vXHJcbiAgLy8gVG8gdXNlIGN1c3RvbSB1cmwgY29uc3RydWN0aW9uLCBhZGQgYWRhcHRlckluc3RhbmNlLnJlbGF0aXZlVXJsID0gbXlmdW5jdGlvbihkYXRhU2VydmljZSwgdXJsKTpcclxuICAvL1xyXG4gIC8vICAgICBsZXQgZHMgPSBicmVlemUuY29uZmlnLmluaXRpYWxpemVBZGFwdGVySW5zdGFuY2UoXCJkYXRhU2VydmljZVwiLCBcIndlYkFwaU9EYXRhXCIpO1xyXG4gIC8vICAgICBkcy5yZWxhdGl2ZVVybCA9IGZ1bmN0aW9uKGRhdGFTZXJ2aWNlLCB1cmwpIHtcclxuICAvLyAgICAgICAgcmV0dXJuIHNvbWVob3dDb252ZXJ0KHVybCk7XHJcbiAgLy8gICAgIH1cclxuICAvL1xyXG5cclxuICBmZXRjaE1ldGFkYXRhKG1ldGFkYXRhU3RvcmU6IGJyZWV6ZS5NZXRhZGF0YVN0b3JlLCBkYXRhU2VydmljZTogYnJlZXplLkRhdGFTZXJ2aWNlKSB7XHJcbiAgICBsZXQgc2VydmljZU5hbWUgPSBkYXRhU2VydmljZS5zZXJ2aWNlTmFtZTtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmc7XHJcbiAgICBpZiAodGhpcy5yZWxhdGl2ZVVybCA9PT0gdHJ1ZSkge1xyXG4gICAgICB1cmwgPSBkYXRhU2VydmljZS5xdWFsaWZ5VXJsKCckbWV0YWRhdGEnKTtcclxuICAgIH0gZWxzZSBpZiAoY29yZS5pc0Z1bmN0aW9uKHRoaXMucmVsYXRpdmVVcmwpKSB7XHJcbiAgICAgIHVybCA9ICh0aGlzLnJlbGF0aXZlVXJsIGFzIGFueSkoZGF0YVNlcnZpY2UsICckbWV0YWRhdGEnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVybCA9IHRoaXMuZ2V0QWJzb2x1dGVVcmwoZGF0YVNlcnZpY2UsICckbWV0YWRhdGEnKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWhlYWRlcnMgPSBjb3JlLmV4dGVuZCh7fSwgdGhpcy5oZWFkZXJzKTtcclxuICAgIChtaGVhZGVycyBhcyBhbnkpLkFjY2VwdCA9ICdhcHBsaWNhdGlvbi8qOyBvZGF0YS5tZXRhZGF0YT1mdWxsJztcclxuXHJcbiAgICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgLy8gT0RhdGEucmVhZCh1cmwsXHJcbiAgICAgIE9EYXRhLnJlYWQoe1xyXG4gICAgICAgIHJlcXVlc3RVcmk6IHVybCxcclxuICAgICAgICAvLyBoZWFkZXJzOiB7IFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwifVxyXG4gICAgICAgIGhlYWRlcnM6IG1oZWFkZXJzXHJcbiAgICAgIH0sXHJcbiAgICAgICAgZnVuY3Rpb24gKGRhdGE6IGFueSkge1xyXG4gICAgICAgICAgLy8gZGF0YS5kYXRhU2VydmljZXMuc2NoZW1hIGlzIGFuIGFycmF5IG9mIHNjaGVtYXMuIHdpdGggcHJvcGVydGllcyBvZlxyXG4gICAgICAgICAgLy8gZW50aXR5Q29udGFpbmVyW10sIGFzc29jaWF0aW9uW10sIGVudGl0eVR5cGVbXSwgYW5kIG5hbWVzcGFjZS5cclxuICAgICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5kYXRhU2VydmljZXMpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKFwiTWV0YWRhdGEgcXVlcnkgZmFpbGVkIGZvcjogXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBjc2RsTWV0YWRhdGEgPSBkYXRhLmRhdGFTZXJ2aWNlcztcclxuXHJcbiAgICAgICAgICAvLyBtaWdodCBoYXZlIGJlZW4gZmV0Y2hlZCBieSBhbm90aGVyIHF1ZXJ5XHJcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhU3RvcmUuaGFzTWV0YWRhdGFGb3Ioc2VydmljZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgbWV0YWRhdGFTdG9yZS5pbXBvcnRNZXRhZGF0YShjc2RsTWV0YWRhdGEpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXCJNZXRhZGF0YSBxdWVyeSBmYWlsZWQgZm9yIFwiICsgdXJsICsgXCI7IFVuYWJsZSB0byBwcm9jZXNzIHJldHVybmVkIG1ldGFkYXRhOiBcIiArIGUubWVzc2FnZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBtZXRhZGF0YVN0b3JlLmFkZERhdGFTZXJ2aWNlKGRhdGFTZXJ2aWNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShjc2RsTWV0YWRhdGEpO1xyXG5cclxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgICAgbGV0IGVyciA9IGNyZWF0ZUVycm9yKGVycm9yLCB1cmwpO1xyXG4gICAgICAgICAgZXJyLm1lc3NhZ2UgPSBcIk1ldGFkYXRhIHF1ZXJ5IGZhaWxlZCBmb3I6IFwiICsgdXJsICsgXCI7IFwiICsgKGVyci5tZXNzYWdlIHx8IFwiXCIpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgT0RhdGEubWV0YWRhdGFIYW5kbGVyXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZXhlY3V0ZVF1ZXJ5KG1hcHBpbmdDb250ZXh0OiBicmVlemUuTWFwcGluZ0NvbnRleHQpIHtcclxuICAgIGxldCB1cmw6IHN0cmluZztcclxuICAgIGlmICh0aGlzLnJlbGF0aXZlVXJsID09PSB0cnVlKSB7XHJcbiAgICAgIHVybCA9IG1hcHBpbmdDb250ZXh0LmdldFVybCgpO1xyXG4gICAgfSBlbHNlIGlmIChjb3JlLmlzRnVuY3Rpb24odGhpcy5yZWxhdGl2ZVVybCkpIHtcclxuICAgICAgdXJsID0gKHRoaXMucmVsYXRpdmVVcmwgYXMgYW55KShtYXBwaW5nQ29udGV4dC5kYXRhU2VydmljZSwgbWFwcGluZ0NvbnRleHQuZ2V0VXJsKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdXJsID0gdGhpcy5nZXRBYnNvbHV0ZVVybChtYXBwaW5nQ29udGV4dC5kYXRhU2VydmljZSwgbWFwcGluZ0NvbnRleHQuZ2V0VXJsKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCBxdWVyeSBwYXJhbXMgaWYgLndpdGhQYXJhbWV0ZXJzIHdhcyB1c2VkXHJcbiAgICBsZXQgcXVlcnkgPSBtYXBwaW5nQ29udGV4dC5xdWVyeSBhcyBicmVlemUuRW50aXR5UXVlcnk7XHJcbiAgICBpZiAoIWNvcmUuaXNFbXB0eShxdWVyeS5wYXJhbWV0ZXJzKSkge1xyXG4gICAgICBsZXQgcGFyYW1TdHJpbmcgPSB0b1F1ZXJ5U3RyaW5nKHF1ZXJ5LnBhcmFtZXRlcnMpO1xyXG4gICAgICB1cmwgPSBhcHBlbmRRdWVyeVN0cmluZ1BhcmFtZXRlcih1cmwsIHBhcmFtU3RyaW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlPGJyZWV6ZS5RdWVyeVJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBPRGF0YS5yZWFkKHtcclxuICAgICAgICByZXF1ZXN0VXJpOiB1cmwsXHJcbiAgICAgICAgaGVhZGVyczogY29yZS5leHRlbmQoe30sIHRoaXMuaGVhZGVycylcclxuICAgICAgfSxcclxuICAgICAgICBmdW5jdGlvbiAoZGF0YTogYW55LCByZXNwb25zZTogYW55KSB7XHJcbiAgICAgICAgICBsZXQgaW5saW5lQ291bnQ6IGFueTtcclxuICAgICAgICAgIGlmIChkYXRhLl9fY291bnQpIHtcclxuICAgICAgICAgICAgLy8gT0RhdGEgY2FuIHJldHVybiBkYXRhLl9fY291bnQgYXMgYSBzdHJpbmdcclxuICAgICAgICAgICAgaW5saW5lQ291bnQgPSBwYXJzZUludChkYXRhLl9fY291bnQsIDEwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIE9kYXRhIHJldHVybnMgZGlmZmVyZW50IHJlc3VsdCBzdHJ1Y3R1cmUgd2hlbiBpdCByZXR1cm5zIG11bHRpcGxlIGVudGl0aWVzIChkYXRhLnJlc3VsdHMpIHZzIHNpbmdsZSBlbnRpdHkgKGRhdGEgZGlyZWN0bHkpLlxyXG4gICAgICAgICAgLy8gQHNlZSBodHRwOi8vd3d3Lm9kYXRhLm9yZy9kb2N1bWVudGF0aW9uL29kYXRhLXZlcnNpb24tMi0wL2pzb24tZm9ybWF0LyNSZXByZXNlbnRpbmdDb2xsZWN0aW9uc09mRW50cmllc1xyXG4gICAgICAgICAgLy8gYW5kIGh0dHA6Ly93d3cub2RhdGEub3JnL2RvY3VtZW50YXRpb24vb2RhdGEtdmVyc2lvbi0yLTAvanNvbi1mb3JtYXQvI1JlcHJlc2VudGluZ0VudHJpZXNcclxuICAgICAgICAgIGxldCByZXN1bHRzOiBhbnk7XHJcbiAgICAgICAgICBpZiAoZGF0YS5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHMgPSBkYXRhLnJlc3VsdHM7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHRzID0gZGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgcmVzdWx0czogcmVzdWx0cywgaW5saW5lQ291bnQ6IGlubGluZUNvdW50LCBodHRwUmVzcG9uc2U6IHJlc3BvbnNlLCBxdWVyeTogcXVlcnkgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChjcmVhdGVFcnJvcihlcnJvciwgdXJsKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG5cclxuICBzYXZlQ2hhbmdlcyhvZGF0YVNhdmVDb250ZXh0OiBicmVlemUuU2F2ZUNvbnRleHQsIHNhdmVCdW5kbGU6IGJyZWV6ZS5TYXZlQnVuZGxlKTogUHJvbWlzZTxicmVlemUuU2F2ZVJlc3VsdD4ge1xyXG4gICAgbGV0IGFkYXB0ZXIgPSBvZGF0YVNhdmVDb250ZXh0LmFkYXB0ZXIgPSB0aGlzO1xyXG4gICAgbGV0IHNhdmVDb250ZXh0ID0gb2RhdGFTYXZlQ29udGV4dCBhcyBPRGF0YVNhdmVDb250ZXh0O1xyXG4gICAgbGV0IHVybDogc3RyaW5nO1xyXG4gICAgaWYgKHRoaXMucmVsYXRpdmVVcmwgPT09IHRydWUpIHtcclxuICAgICAgc2F2ZUNvbnRleHQucm91dGVQcmVmaXggPSBhZGFwdGVyLmdldFJvdXRlUHJlZml4KHNhdmVDb250ZXh0LmRhdGFTZXJ2aWNlKTtcclxuICAgICAgdXJsID0gc2F2ZUNvbnRleHQuZGF0YVNlcnZpY2UucXVhbGlmeVVybChcIiRiYXRjaFwiKTtcclxuICAgIH0gZWxzZSBpZiAoY29yZS5pc0Z1bmN0aW9uKGFkYXB0ZXIucmVsYXRpdmVVcmwpKSB7XHJcbiAgICAgIHNhdmVDb250ZXh0LnJvdXRlUHJlZml4ID0gKGFkYXB0ZXIucmVsYXRpdmVVcmwgYXMgRnVuY3Rpb24pKHNhdmVDb250ZXh0LmRhdGFTZXJ2aWNlLCAnJyk7XHJcbiAgICAgIHVybCA9IHNhdmVDb250ZXh0LnJvdXRlUHJlZml4ICsgJyRiYXRjaCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzYXZlQ29udGV4dC5yb3V0ZVByZWZpeCA9IGFkYXB0ZXIuZ2V0QWJzb2x1dGVVcmwoc2F2ZUNvbnRleHQuZGF0YVNlcnZpY2UsICcnKTtcclxuICAgICAgdXJsID0gc2F2ZUNvbnRleHQucm91dGVQcmVmaXggKyAnJGJhdGNoJztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVxdWVzdERhdGEgPSBjcmVhdGVDaGFuZ2VSZXF1ZXN0cyhzYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZSk7XHJcbiAgICBsZXQgdGVtcEtleXMgPSBzYXZlQ29udGV4dC50ZW1wS2V5cztcclxuICAgIGxldCBjb250ZW50S2V5cyA9IHNhdmVDb250ZXh0LmNvbnRlbnRLZXlzO1xyXG4gICAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxicmVlemUuU2F2ZVJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBPRGF0YS5yZXF1ZXN0KHtcclxuICAgICAgICBoZWFkZXJzOiBjb3JlLmV4dGVuZCh7fSwgdGhpcy5oZWFkZXJzKSxcclxuICAgICAgICByZXF1ZXN0VXJpOiB1cmwsXHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBkYXRhOiByZXF1ZXN0RGF0YVxyXG4gICAgICB9LCBmdW5jdGlvbiAoZGF0YTogYW55LCByZXNwb25zZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGVudGl0aWVzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGxldCBrZXlNYXBwaW5nczogYnJlZXplLktleU1hcHBpbmdbXSA9IFtdO1xyXG4gICAgICAgIGxldCBzYXZlUmVzdWx0OiBicmVlemUuU2F2ZVJlc3VsdCA9IHsgZW50aXRpZXM6IGVudGl0aWVzLCBrZXlNYXBwaW5nczoga2V5TWFwcGluZ3MgfTtcclxuICAgICAgICBkYXRhLl9fYmF0Y2hSZXNwb25zZXMuZm9yRWFjaChmdW5jdGlvbiAoYnI6IGFueSkge1xyXG4gICAgICAgICAgYnIuX19jaGFuZ2VSZXNwb25zZXMuZm9yRWFjaChmdW5jdGlvbiAoY3I6IGFueSkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBjci5yZXNwb25zZSB8fCBjcjtcclxuICAgICAgICAgICAgbGV0IHN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlO1xyXG4gICAgICAgICAgICBpZiAoKCFzdGF0dXNDb2RlKSB8fCBzdGF0dXNDb2RlID49IDQwMCkge1xyXG4gICAgICAgICAgICAgIHJlamVjdChjcmVhdGVFcnJvcihjciwgdXJsKSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGVudElkID0gY3IuaGVhZGVyc1tcIkNvbnRlbnQtSURcIl07XHJcbiAgICAgICAgICAgIC8vIE9saW5nbyBzZW5kcyBkaWZmZXJlbnQgY2FzZSBvZiAnSUQnIGZvciB0aGUgaGVhZGVyIG5hbWUuXHJcbiAgICAgICAgICAgIGlmICghY29udGVudElkKSB7XHJcbiAgICAgICAgICAgICAgY29udGVudElkID0gY3IuaGVhZGVyc1tcIkNvbnRlbnQtSWRcIl07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCByYXdFbnRpdHkgPSBjci5kYXRhO1xyXG4gICAgICAgICAgICBpZiAocmF3RW50aXR5KSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRlbXBLZXkgPSB0ZW1wS2V5c1tjb250ZW50SWRdO1xyXG4gICAgICAgICAgICAgIGlmICh0ZW1wS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW50aXR5VHlwZSA9IHRlbXBLZXkuZW50aXR5VHlwZTtcclxuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlUeXBlLmF1dG9HZW5lcmF0ZWRLZXlUeXBlICE9PSBicmVlemUuQXV0b0dlbmVyYXRlZEtleVR5cGUuTm9uZSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdGVtcFZhbHVlID0gdGVtcEtleS52YWx1ZXNbMF07XHJcbiAgICAgICAgICAgICAgICAgIGxldCByZWFsS2V5ID0gZW50aXR5VHlwZS5nZXRFbnRpdHlLZXlGcm9tUmF3RW50aXR5KHJhd0VudGl0eSwgYnJlZXplLkRhdGFQcm9wZXJ0eS5nZXRSYXdWYWx1ZUZyb21TZXJ2ZXIpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQga2V5TWFwcGluZyA9IHsgZW50aXR5VHlwZU5hbWU6IGVudGl0eVR5cGUubmFtZSwgdGVtcFZhbHVlOiB0ZW1wVmFsdWUsIHJlYWxWYWx1ZTogcmVhbEtleS52YWx1ZXNbMF0gfTtcclxuICAgICAgICAgICAgICAgICAga2V5TWFwcGluZ3MucHVzaChrZXlNYXBwaW5nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZW50aXRpZXMucHVzaChyYXdFbnRpdHkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBvcmlnRW50aXR5ID0gY29udGVudEtleXNbY29udGVudElkXTtcclxuICAgICAgICAgICAgICBlbnRpdGllcy5wdXNoKG9yaWdFbnRpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZShzYXZlUmVzdWx0KTtcclxuICAgICAgfSwgZnVuY3Rpb24gKGVycjogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdChjcmVhdGVFcnJvcihlcnIsIHVybCkpO1xyXG4gICAgICB9LCBPRGF0YS5iYXRjaEhhbmRsZXIpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuXHJcbiAgfVxyXG5cclxuICBqc29uUmVzdWx0c0FkYXB0ZXI6IGJyZWV6ZS5Kc29uUmVzdWx0c0FkYXB0ZXIgPSBuZXcgYnJlZXplLkpzb25SZXN1bHRzQWRhcHRlcih7XHJcbiAgICBuYW1lOiBcIk9EYXRhX2RlZmF1bHRcIixcclxuXHJcbiAgICB2aXNpdE5vZGU6IGZ1bmN0aW9uIChub2RlOiBhbnksIG1hcHBpbmdDb250ZXh0OiBicmVlemUuTWFwcGluZ0NvbnRleHQsIG5vZGVDb250ZXh0OiBicmVlemUuTm9kZUNvbnRleHQpIHtcclxuICAgICAgbGV0IHJlc3VsdDogYW55ID0ge307XHJcbiAgICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIGxldCBtZXRhZGF0YSA9IG5vZGUuX19tZXRhZGF0YTtcclxuICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHtcclxuICAgICAgICAvLyBUT0RPOiBtYXkgYmUgYWJsZSB0byBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQgYnkgY2FjaGluZyBvZiB0aGUgcHJldmlvdXMgdmFsdWUuXHJcbiAgICAgICAgbGV0IGVudGl0eVR5cGVOYW1lID0gYnJlZXplLk1ldGFkYXRhU3RvcmUubm9ybWFsaXplVHlwZU5hbWUobWV0YWRhdGEudHlwZSk7XHJcbiAgICAgICAgbGV0IGV0ID0gZW50aXR5VHlwZU5hbWUgJiYgbWFwcGluZ0NvbnRleHQuZW50aXR5TWFuYWdlci5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoZW50aXR5VHlwZU5hbWUsIHRydWUpO1xyXG4gICAgICAgIC8vIE9EYXRhIHJlc3BvbnNlIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYSBwcm9qZWN0aW9uIGZyb20gYSB3aG9sZSBlbnRpdHkuXHJcbiAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHRoYXQgd2hvbGUtZW50aXR5IGRhdGEgd291bGQgaGF2ZSBhdCBsZWFzdCBhcyBtYW55IHByb3BlcnRpZXMgICg8PSlcclxuICAgICAgICAvLyBhcyB0aGUgRW50aXR5VHlwZSBoYXMgbWFwcGVkIHByb3BlcnRpZXMgb24gdGhlIGJhc2lzIHRoYXRcclxuICAgICAgICAvLyBtb3N0IHByb2plY3Rpb25zIHJlbW92ZSBwcm9wZXJ0aWVzIHJhdGhlciB0aGFuIGFkZCB0aGVtLlxyXG4gICAgICAgIC8vIElmIG5vdCwgYXNzdW1lIGl0J3MgYSBwcm9qZWN0aW9uIGFuZCBkbyBOT1QgdHJlYXQgYXMgYW4gZW50aXR5XHJcbiAgICAgICAgaWYgKGV0ICYmIGV0Ll9tYXBwZWRQcm9wZXJ0aWVzQ291bnQgPD0gT2JqZWN0LmtleXMobm9kZSkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgLy8gaWYgKGV0ICYmIGV0Ll9tYXBwZWRQcm9wZXJ0aWVzQ291bnQgPT09IE9iamVjdC5rZXlzKG5vZGUpLmxlbmd0aCAtIDEpIHsgLy8gT0xEXHJcbiAgICAgICAgICByZXN1bHQuZW50aXR5VHlwZSA9IGV0O1xyXG4gICAgICAgICAgbGV0IHVyaUtleSA9IG1ldGFkYXRhLnVyaSB8fCBtZXRhZGF0YS5pZDtcclxuICAgICAgICAgIGlmICh1cmlLZXkpIHtcclxuICAgICAgICAgICAgLy8gU3RyaXAgYmFzZVVyaSB0byBtYWtlIHVyaUtleSBhIHJlbGF0aXZlIHVyaVxyXG4gICAgICAgICAgICAvLyBUb2RvOiB3aHkgaXMgdGhpcyBuZWNlc3Nhcnkgd2hlbiBhYnNvbHV0ZSB3b3JrcyBmb3IgZXZlcnkgT0RhdGEgc291cmNlIHRlc3RlZD9cclxuICAgICAgICAgICAgbGV0IHJlID0gbmV3IFJlZ0V4cCgnXicgKyBtYXBwaW5nQ29udGV4dC5kYXRhU2VydmljZS5zZXJ2aWNlTmFtZSwgJ2knKTtcclxuICAgICAgICAgICAgdXJpS2V5ID0gdXJpS2V5LnJlcGxhY2UocmUsICcnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlc3VsdC5leHRyYU1ldGFkYXRhID0ge1xyXG4gICAgICAgICAgICB1cmlLZXk6IHVyaUtleSxcclxuICAgICAgICAgICAgZXRhZzogbWV0YWRhdGEuZXRhZ1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gT0RhdGEgdjMgLSBwcm9qZWN0aW9uIGFycmF5cyB3aWxsIGJlIGVuY2xvc2VkIGluIGEgcmVzdWx0cyBhcnJheVxyXG4gICAgICBpZiAobm9kZS5yZXN1bHRzKSB7XHJcbiAgICAgICAgcmVzdWx0Lm5vZGUgPSBub2RlLnJlc3VsdHM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwcm9wZXJ0eU5hbWUgPSBub2RlQ29udGV4dC5wcm9wZXJ0eU5hbWU7XHJcbiAgICAgIHJlc3VsdC5pZ25vcmUgPSBub2RlLl9fZGVmZXJyZWQgIT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUgPT09IFwiX19tZXRhZGF0YVwiIHx8XHJcbiAgICAgICAgLy8gRW50aXR5S2V5IHByb3BlcnRpZXMgY2FuIGJlIHByb2R1Y2VkIGJ5IEVETVggbW9kZWxzXHJcbiAgICAgICAgKHByb3BlcnR5TmFtZSA9PT0gXCJFbnRpdHlLZXlcIiAmJiBub2RlLiR0eXBlICYmIGNvcmUuc3RyaW5nU3RhcnRzV2l0aChub2RlLiR0eXBlLCBcIlN5c3RlbS5EYXRhXCIpKTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG4gIGdldEFic29sdXRlVXJsKGRhdGFTZXJ2aWNlOiBicmVlemUuRGF0YVNlcnZpY2UsIHVybDogc3RyaW5nKSB7XHJcbiAgICBsZXQgc2VydmljZU5hbWUgPSBkYXRhU2VydmljZS5xdWFsaWZ5VXJsKCcnKTtcclxuICAgIC8vIG9ubHkgcHJlZml4IHdpdGggc2VydmljZU5hbWUgaWYgbm90IGFscmVhZHkgb24gdGhlIHVybFxyXG4gICAgbGV0IGJhc2UgPSAoY29yZS5zdHJpbmdTdGFydHNXaXRoKHVybCwgc2VydmljZU5hbWUpKSA/ICcnIDogc2VydmljZU5hbWU7XHJcbiAgICAvLyBJZiBubyBwcm90b2NvbCwgdHVybiBiYXNlIGludG8gYW4gYWJzb2x1dGUgVVJJXHJcbiAgICBpZiAod2luZG93ICYmIHNlcnZpY2VOYW1lLmluZGV4T2YoJy8vJykgPCAwKSB7XHJcbiAgICAgIC8vIG5vIHByb3RvY29sOyBtYWtlIGl0IGFic29sdXRlXHJcbiAgICAgIGJhc2UgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3QgK1xyXG4gICAgICAgIChjb3JlLnN0cmluZ1N0YXJ0c1dpdGgoc2VydmljZU5hbWUsICcvJykgPyAnJyA6ICcvJykgK1xyXG4gICAgICAgIGJhc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmFzZSArIHVybDtcclxuICB9XHJcblxyXG4gIGdldFJvdXRlUHJlZml4KGRhdGFTZXJ2aWNlOiBicmVlemUuRGF0YVNlcnZpY2UpIHtcclxuICAgIC8vIEdldCB0aGUgcm91dGVQcmVmaXggZnJvbSBhIFdlYiBBUEkgT0RhdGEgc2VydmljZSBuYW1lLlxyXG4gICAgLy8gVGhlIHJvdXRlUHJlZml4IGlzIHByZXN1bWVkIHRvIGJlIHRoZSBwYXRobmFtZSB3aXRoaW4gdGhlIGRhdGFTZXJ2aWNlLnNlcnZpY2VOYW1lXHJcbiAgICAvLyBFeGFtcGxlcyBvZiBzZXJ2aWNlbmFtZSAtPiByb3V0ZVByZWZpeDpcclxuICAgIC8vICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6NTU4MDIvb2RhdGEvJyAtPiAnb2RhdGEvJ1xyXG4gICAgLy8gICAnaHR0cDovLzE5OC4xNTQuMTIxLjc1L3NlcnZpY2Uvb2RhdGEvJyAtPiAnc2VydmljZS9vZGF0YS8nXHJcbiAgICBsZXQgcGFyc2VyOiBhbnk7XHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAnb2JqZWN0JykgeyAvLyBicm93c2VyXHJcbiAgICAgIHBhcnNlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgcGFyc2VyLmhyZWYgPSBkYXRhU2VydmljZS5zZXJ2aWNlTmFtZTtcclxuICAgIH0gZWxzZSB7IC8vIG5vZGVcclxuICAgICAgLy8gVE9ETzogaG93IHRvIGJlc3QgaGFuZGxlIHRoaXNcclxuICAgICAgLy8gYXNzdW1lcyBleGlzdGVuY2Ugb2Ygbm9kZSdzIHVybC5wYXJzZSBtZXRob2QuXHJcbiAgICAgIHBhcnNlciA9IHVybC5wYXJzZShkYXRhU2VydmljZS5zZXJ2aWNlTmFtZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcHJlZml4ID0gcGFyc2VyLnBhdGhuYW1lO1xyXG4gICAgaWYgKHByZWZpeFswXSA9PT0gJy8nKSB7XHJcbiAgICAgIHByZWZpeCA9IHByZWZpeC5zdWJzdHIoMSk7XHJcbiAgICB9IC8vIGRyb3AgbGVhZGluZyAnLycgIChhbGwgYnV0IElFKVxyXG4gICAgaWYgKHByZWZpeC5zdWJzdHIoLTEpICE9PSAnLycpIHtcclxuICAgICAgcHJlZml4ICs9ICcvJztcclxuICAgIH0gICAgICAvLyBlbnN1cmUgdHJhaWxpbmcgJy8nXHJcbiAgICByZXR1cm4gcHJlZml4O1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbi8vIGNydWRlIHNlcmlhbGl6ZXIuICBEb2Vzbid0IHJlY3Vyc2VcclxuZnVuY3Rpb24gdG9RdWVyeVN0cmluZyhvYmo6IE9iamVjdCkge1xyXG4gIGxldCBwYXJ0czogc3RyaW5nW10gPSBbXTtcclxuICBmb3IgKGxldCBpIGluIG9iaikge1xyXG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICBwYXJ0cy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChpKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9ialtpXSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcGFydHMuam9pbihcIiZcIik7XHJcbn1cclxuXHJcbi8qKiBUcmFuc2Zvcm0gZGF0YSBwcm9wZXJ0aWVzIHdoaWxlIHVud3JhcHBpbmcgZW50aXRpZXMgKi9cclxuZnVuY3Rpb24gdHJhbnNmb3JtVmFsdWUocHJvcDogYnJlZXplLkRhdGFQcm9wZXJ0eSwgdmFsOiBhbnkpIHtcclxuICBpZiAocHJvcC5pc1VubWFwcGVkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIGlmIChwcm9wLmRhdGFUeXBlID09PSBicmVlemUuRGF0YVR5cGUuRGF0ZVRpbWVPZmZzZXQpIHtcclxuICAgIC8vIFRoZSBkYXRhanMgbGliIHRyaWVzIHRvIHRyZWF0IGNsaWVudCBkYXRlVGltZXMgdGhhdCBhcmUgZGVmaW5lZCBhcyBEYXRlVGltZU9mZnNldCBvbiB0aGUgc2VydmVyIGRpZmZlcmVudGx5XHJcbiAgICAvLyBmcm9tIG90aGVyIGRhdGVUaW1lcy4gVGhpcyBmaXggY29tcGVuc2F0ZXMgYmVmb3JlIHRoZSBzYXZlLlxyXG4gICAgdmFsID0gdmFsICYmIG5ldyBEYXRlKHZhbC5nZXRUaW1lKCkgLSAodmFsLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMCkpO1xyXG4gIH0gZWxzZSBpZiAocHJvcC5kYXRhVHlwZSA9PT0gYnJlZXplLkRhdGFUeXBlLkRhdGVPbmx5KSB7XHJcbiAgICB2YWwgPSBicmVlemUuRGF0YVR5cGUudG9EYXRlT25seVN0cmluZyh2YWwpO1xyXG4gIH0gZWxzZSBpZiAoKHByb3AuZGF0YVR5cGUgYXMgYnJlZXplLkRhdGFUeXBlKS5xdW90ZUpzb25PRGF0YSkge1xyXG4gICAgdmFsID0gdmFsICE9IG51bGwgPyB2YWwudG9TdHJpbmcoKSA6IHZhbDtcclxuICB9XHJcbiAgcmV0dXJuIHZhbDtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlQ2hhbmdlUmVxdWVzdHMoc2F2ZUNvbnRleHQ6IE9EYXRhU2F2ZUNvbnRleHQsIHNhdmVCdW5kbGU6IGJyZWV6ZS5TYXZlQnVuZGxlKSB7XHJcbiAgbGV0IGNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvciA9IChzYXZlQ29udGV4dC5hZGFwdGVyIGFzIERhdGFTZXJ2aWNlT0RhdGFBZGFwdGVyKS5fY3JlYXRlQ2hhbmdlUmVxdWVzdEludGVyY2VwdG9yKHNhdmVDb250ZXh0LCBzYXZlQnVuZGxlKTtcclxuICBsZXQgY2hhbmdlUmVxdWVzdHM6IGFueVtdID0gW107XHJcbiAgbGV0IHRlbXBLZXlzOiBicmVlemUuRW50aXR5S2V5W10gPSBbXTtcclxuICBsZXQgY29udGVudEtleXM6IGJyZWV6ZS5FbnRpdHlbXSA9IFtdO1xyXG4gIGxldCBlbnRpdHlNYW5hZ2VyID0gc2F2ZUNvbnRleHQuZW50aXR5TWFuYWdlcjtcclxuICBsZXQgaGVscGVyID0gZW50aXR5TWFuYWdlci5oZWxwZXI7XHJcbiAgbGV0IGlkID0gMDtcclxuICBsZXQgcm91dGVQcmVmaXggPSBzYXZlQ29udGV4dC5yb3V0ZVByZWZpeDtcclxuXHJcbiAgc2F2ZUJ1bmRsZS5lbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHksIGluZGV4KSB7XHJcbiAgICBsZXQgYXNwZWN0ID0gZW50aXR5LmVudGl0eUFzcGVjdDtcclxuICAgIGlkID0gaWQgKyAxOyAvLyB3ZSBhcmUgZGVsaWJlcmF0ZWx5IHNraXBwaW5nIGlkPTAgYmVjYXVzZSBDb250ZW50LUlEID0gMCBzZWVtcyB0byBiZSBpZ25vcmVkLlxyXG4gICAgbGV0IHJlcXVlc3QgPSB7IGhlYWRlcnM6IHsgXCJDb250ZW50LUlEXCI6IGlkLCBcIkRhdGFTZXJ2aWNlVmVyc2lvblwiOiBcIjIuMFwiIH0gfSBhcyBhbnk7XHJcbiAgICBjb250ZW50S2V5c1tpZF0gPSBlbnRpdHk7XHJcbiAgICBpZiAoYXNwZWN0LmVudGl0eVN0YXRlLmlzQWRkZWQoKSkge1xyXG4gICAgICByZXF1ZXN0LnJlcXVlc3RVcmkgPSByb3V0ZVByZWZpeCArIGVudGl0eS5lbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWU7XHJcbiAgICAgIHJlcXVlc3QubWV0aG9kID0gXCJQT1NUXCI7XHJcbiAgICAgIHJlcXVlc3QuZGF0YSA9IGhlbHBlci51bndyYXBJbnN0YW5jZShlbnRpdHksIHRyYW5zZm9ybVZhbHVlKTtcclxuICAgICAgdGVtcEtleXNbaWRdID0gYXNwZWN0LmdldEtleSgpO1xyXG4gICAgfSBlbHNlIGlmIChhc3BlY3QuZW50aXR5U3RhdGUuaXNNb2RpZmllZCgpKSB7XHJcbiAgICAgIHVwZGF0ZURlbGV0ZU1lcmdlUmVxdWVzdChyZXF1ZXN0LCBhc3BlY3QsIHJvdXRlUHJlZml4ISk7XHJcbiAgICAgIHJlcXVlc3QubWV0aG9kID0gXCJNRVJHRVwiO1xyXG4gICAgICByZXF1ZXN0LmRhdGEgPSBoZWxwZXIudW53cmFwQ2hhbmdlZFZhbHVlcyhlbnRpdHksIGVudGl0eU1hbmFnZXIubWV0YWRhdGFTdG9yZSwgdHJhbnNmb3JtVmFsdWUpO1xyXG4gICAgICAvLyBzaG91bGQgYmUgYSBQQVRDSC9NRVJHRVxyXG4gICAgfSBlbHNlIGlmIChhc3BlY3QuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgdXBkYXRlRGVsZXRlTWVyZ2VSZXF1ZXN0KHJlcXVlc3QsIGFzcGVjdCwgcm91dGVQcmVmaXghKTtcclxuICAgICAgcmVxdWVzdC5tZXRob2QgPSBcIkRFTEVURVwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcmVxdWVzdCA9IGNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvci5nZXRSZXF1ZXN0KHJlcXVlc3QsIGVudGl0eSwgaW5kZXgpO1xyXG4gICAgY2hhbmdlUmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcclxuICB9KTtcclxuICBzYXZlQ29udGV4dC5jb250ZW50S2V5cyA9IGNvbnRlbnRLZXlzO1xyXG4gIHNhdmVDb250ZXh0LnRlbXBLZXlzID0gdGVtcEtleXM7XHJcbiAgY2hhbmdlUmVxdWVzdEludGVyY2VwdG9yLmRvbmUoY2hhbmdlUmVxdWVzdHMpO1xyXG4gIHJldHVybiB7XHJcbiAgICBfX2JhdGNoUmVxdWVzdHM6IFtcclxuICAgICAge1xyXG4gICAgICAgIF9fY2hhbmdlUmVxdWVzdHM6IGNoYW5nZVJlcXVlc3RzXHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlRGVsZXRlTWVyZ2VSZXF1ZXN0KHJlcXVlc3Q6IGFueSwgYXNwZWN0OiBicmVlemUuRW50aXR5QXNwZWN0LCByb3V0ZVByZWZpeDogc3RyaW5nKSB7XHJcbiAgbGV0IHVyaUtleTogc3RyaW5nO1xyXG4gIGxldCBleHRyYU1ldGFkYXRhID0gYXNwZWN0LmV4dHJhTWV0YWRhdGE7XHJcbiAgaWYgKGV4dHJhTWV0YWRhdGEgPT0gbnVsbCkge1xyXG4gICAgdXJpS2V5ID0gZ2V0VXJpS2V5KGFzcGVjdCk7XHJcbiAgICBhc3BlY3QuZXh0cmFNZXRhZGF0YSA9IHtcclxuICAgICAgdXJpS2V5OiB1cmlLZXlcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIHVyaUtleSA9IGV4dHJhTWV0YWRhdGEudXJpS2V5O1xyXG4gICAgaWYgKGV4dHJhTWV0YWRhdGEuZXRhZykge1xyXG4gICAgICByZXF1ZXN0LmhlYWRlcnNbXCJJZi1NYXRjaFwiXSA9IGV4dHJhTWV0YWRhdGEuZXRhZztcclxuICAgIH1cclxuICB9XHJcbiAgcmVxdWVzdC5yZXF1ZXN0VXJpID1cclxuICAgIC8vIHVzZSByb3V0ZVByZWZpeCBpZiB1cmlLZXkgbGFja3MgcHJvdG9jb2wgKGkuZS4sIHJlbGF0aXZlIHVyaSlcclxuICAgIHVyaUtleS5pbmRleE9mKCcvLycpID4gMCA/IHVyaUtleSA6IHJvdXRlUHJlZml4ICsgdXJpS2V5O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRVcmlLZXkoYXNwZWN0OiBicmVlemUuRW50aXR5QXNwZWN0KSB7XHJcbiAgbGV0IGVudGl0eVR5cGUgPSBhc3BlY3QuZW50aXR5IS5lbnRpdHlUeXBlO1xyXG4gIGxldCByZXNvdXJjZU5hbWUgPSBlbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWU7XHJcbiAgbGV0IGtwcyA9IGVudGl0eVR5cGUua2V5UHJvcGVydGllcztcclxuICBsZXQgdXJpS2V5ID0gcmVzb3VyY2VOYW1lICsgXCIoXCI7XHJcbiAgaWYgKGtwcy5sZW5ndGggPT09IDEpIHtcclxuICAgIHVyaUtleSA9IHVyaUtleSArIGZtdFByb3BlcnR5KGtwc1swXSwgYXNwZWN0KSArIFwiKVwiO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgZGVsaW0gPSBcIlwiO1xyXG4gICAga3BzLmZvckVhY2goZnVuY3Rpb24gKGtwKSB7XHJcbiAgICAgIHVyaUtleSA9IHVyaUtleSArIGRlbGltICsga3AubmFtZU9uU2VydmVyICsgXCI9XCIgKyBmbXRQcm9wZXJ0eShrcCwgYXNwZWN0KTtcclxuICAgICAgZGVsaW0gPSBcIixcIjtcclxuICAgIH0pO1xyXG4gICAgdXJpS2V5ID0gdXJpS2V5ICsgXCIpXCI7XHJcbiAgfVxyXG4gIHJldHVybiB1cmlLZXk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZtdFByb3BlcnR5KHByb3A6IGJyZWV6ZS5EYXRhUHJvcGVydHksIGFzcGVjdDogYnJlZXplLkVudGl0eUFzcGVjdCkge1xyXG4gIHJldHVybiAocHJvcC5kYXRhVHlwZSBhcyBicmVlemUuRGF0YVR5cGUpLmZtdE9EYXRhIShhc3BlY3QuZ2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRXJyb3IoZXJyb3I6IGFueSwgdXJsOiBzdHJpbmcpIHtcclxuICAvLyBPRGF0YSBlcnJvcnMgY2FuIGhhdmUgdGhlIG1lc3NhZ2UgYnVyaWVkIHZlcnkgZGVlcGx5IC0gYW5kIG5vbm9idmlvdXNseVxyXG4gIC8vIHRoaXMgY29kZSBpcyB0cmlja3kgc28gYmUgY2FyZWZ1bCBjaGFuZ2luZyB0aGUgcmVzcG9uc2UuYm9keSBwYXJzaW5nLlxyXG4gIGxldCByZXN1bHQgPSBuZXcgRXJyb3IoKSBhcyBicmVlemUuU2VydmVyRXJyb3I7XHJcbiAgbGV0IHJlc3BvbnNlID0gZXJyb3IgJiYgZXJyb3IucmVzcG9uc2U7XHJcbiAgaWYgKCFyZXNwb25zZSkge1xyXG4gICAgLy8gaW4gY2FzZSBEYXRhSlMgcmV0dXJucyBcIk5vIGhhbmRsZXIgZm9yIHRoaXMgZGF0YVwiXHJcbiAgICByZXN1bHQubWVzc2FnZSA9IGVycm9yO1xyXG4gICAgcmVzdWx0LnN0YXR1c1RleHQgPSBlcnJvcjtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG4gIHJlc3VsdC5tZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcclxuICByZXN1bHQuc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XHJcbiAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1c0NvZGU7XHJcbiAgLy8gbm9uIHN0ZFxyXG4gIGlmICh1cmwpIHJlc3VsdC51cmwgPSB1cmw7XHJcbiAgcmVzdWx0LmJvZHkgPSByZXNwb25zZS5ib2R5O1xyXG4gIGlmIChyZXNwb25zZS5ib2R5KSB7XHJcbiAgICBsZXQgbmV4dEVycjogYW55O1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICByZXN1bHQuYm9keSA9IGJvZHk7XHJcbiAgICAgIC8vIE9EYXRhIHYzIGxvZ2ljXHJcbiAgICAgIGlmIChib2R5WydvZGF0YS5lcnJvciddKSB7XHJcbiAgICAgICAgYm9keSA9IGJvZHlbJ29kYXRhLmVycm9yJ107XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG1zZyA9IFwiXCI7XHJcbiAgICAgIGRvIHtcclxuICAgICAgICBuZXh0RXJyID0gYm9keS5lcnJvciB8fCBib2R5LmlubmVyZXJyb3I7XHJcbiAgICAgICAgaWYgKCFuZXh0RXJyKSBtc2cgPSBtc2cgKyBnZXRNZXNzYWdlKGJvZHkpO1xyXG4gICAgICAgIG5leHRFcnIgPSBuZXh0RXJyIHx8IGJvZHkuaW50ZXJuYWxleGNlcHRpb247XHJcbiAgICAgICAgYm9keSA9IG5leHRFcnIgfHwgYm9keTtcclxuICAgICAgfSB3aGlsZSAobmV4dEVycik7XHJcbiAgICAgIGlmIChtc2cubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJlc3VsdC5tZXNzYWdlID0gbXNnO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuICBicmVlemUuQWJzdHJhY3REYXRhU2VydmljZUFkYXB0ZXIuX2NhdGNoTm9Db25uZWN0aW9uRXJyb3IocmVzdWx0KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRNZXNzYWdlKGJvZHk6IGFueSkge1xyXG4gIGxldCBtc2cgPSBib2R5Lm1lc3NhZ2UgfHwgXCJcIjtcclxuICByZXR1cm4gKCh0eXBlb2YgKG1zZykgPT09IFwic3RyaW5nXCIpID8gbXNnIDogbXNnLnZhbHVlKSArIFwiOyBcIjtcclxufVxyXG5cclxuYnJlZXplLmNvbmZpZy5yZWdpc3RlckFkYXB0ZXIoXCJkYXRhU2VydmljZVwiLCBEYXRhU2VydmljZU9EYXRhQWRhcHRlcik7XHJcblxyXG5cclxubGV0IHdlYkFwaU9EYXRhQ3RvciA9IGZ1bmN0aW9uICgpIHtcclxuICB0aGlzLm5hbWUgPSBcIndlYkFwaU9EYXRhXCI7XHJcbn07XHJcblxyXG5icmVlemUuY29yZS5leHRlbmQod2ViQXBpT0RhdGFDdG9yLnByb3RvdHlwZSwgRGF0YVNlcnZpY2VPRGF0YUFkYXB0ZXIucHJvdG90eXBlKTtcclxuXHJcbmJyZWV6ZS5jb25maWcucmVnaXN0ZXJBZGFwdGVyKFwiZGF0YVNlcnZpY2VcIiwgd2ViQXBpT0RhdGFDdG9yIGFzIGFueSk7XHJcbi8vIE9EYXRhIDQgYWRhcHRlclxyXG5sZXQgd2ViQXBpT0RhdGE0Q3RvciA9IGZ1bmN0aW9uICgpIHtcclxuICB0aGlzLm5hbWUgPSBcIndlYkFwaU9EYXRhNFwiO1xyXG59O1xyXG5icmVlemUuY29yZS5leHRlbmQod2ViQXBpT0RhdGE0Q3Rvci5wcm90b3R5cGUsIHdlYkFwaU9EYXRhQ3Rvci5wcm90b3R5cGUpO1xyXG53ZWJBcGlPRGF0YTRDdG9yLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKCkge1xyXG4gIC8vIEFhcmdoLi4uIHRoZXkgbW92ZWQgdGhlIGNoZWVzZS5cclxuICBsZXQgZGF0YWpzID0gY29yZS5yZXF1aXJlTGliKFwiZGF0YWpzXCIsIFwiTmVlZGVkIHRvIHN1cHBvcnQgcmVtb3RlIE9EYXRhIHY0IHNlcnZpY2VzXCIpO1xyXG4gIE9EYXRhID0gZGF0YWpzLlY0Lm9EYXRhO1xyXG4gIE9EYXRhLmpzb24uanNvbkhhbmRsZXIucmVjb2duaXplRGF0ZXMgPSB0cnVlO1xyXG59O1xyXG53ZWJBcGlPRGF0YTRDdG9yLnByb3RvdHlwZS5oZWFkZXJzID0geyBcIk9EYXRhLVZlcnNpb25cIjogXCI0LjBcIiB9O1xyXG5icmVlemUuY29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImRhdGFTZXJ2aWNlXCIsIHdlYkFwaU9EYXRhNEN0b3IgYXMgYW55KTtcclxuXHJcblxyXG5cclxuXHJcbiJdfQ==