breeze-client 2.1.2 → 2.1.3-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 (397) 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/esm2020/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +130 -0
  14. package/esm2020/adapter-ajax-angularjs/adapter-core.mjs +49 -0
  15. package/esm2020/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
  16. package/esm2020/adapter-ajax-fetch/adapter-ajax-fetch.mjs +132 -0
  17. package/esm2020/adapter-ajax-fetch/adapter-core.mjs +49 -0
  18. package/esm2020/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
  19. package/esm2020/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +137 -0
  20. package/esm2020/adapter-ajax-httpclient/adapter-core.mjs +49 -0
  21. package/esm2020/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
  22. package/esm2020/adapter-ajax-jquery/adapter-ajax-jquery.mjs +103 -0
  23. package/esm2020/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
  24. package/esm2020/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
  25. package/esm2020/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
  26. package/esm2020/adapter-data-service-odata/adapter-core.mjs +49 -0
  27. package/esm2020/adapter-data-service-odata/adapter-data-service-odata.mjs +456 -0
  28. package/esm2020/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
  29. package/esm2020/adapter-data-service-webapi/adapter-data-service-webapi.mjs +93 -0
  30. package/esm2020/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
  31. package/esm2020/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +268 -0
  32. package/esm2020/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
  33. package/esm2020/adapter-model-library-ko/adapter-model-library-ko.mjs +240 -0
  34. package/esm2020/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
  35. package/esm2020/adapter-uri-builder-json/adapter-core.mjs +49 -0
  36. package/esm2020/adapter-uri-builder-json/adapter-uri-builder-json.mjs +36 -0
  37. package/esm2020/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
  38. package/esm2020/adapter-uri-builder-odata/adapter-core.mjs +49 -0
  39. package/esm2020/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +190 -0
  40. package/esm2020/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
  41. package/esm2020/breeze-client.mjs +5 -0
  42. package/esm2020/index.mjs +2 -0
  43. package/esm2020/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
  44. package/esm2020/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
  45. package/esm2020/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
  46. package/esm2020/mixin-save-queuing/mixin-save-queuing.mjs +400 -0
  47. package/esm2020/src/abstract-data-service-adapter.mjs +296 -0
  48. package/esm2020/src/array.mjs +4 -0
  49. package/esm2020/src/assert-param.mjs +312 -0
  50. package/esm2020/src/breeze.mjs +85 -0
  51. package/esm2020/src/complex-array.mjs +117 -0
  52. package/esm2020/src/config.mjs +223 -0
  53. package/esm2020/src/core.mjs +707 -0
  54. package/esm2020/src/csdl-metadata-parser.mjs +385 -0
  55. package/esm2020/src/data-service.mjs +203 -0
  56. package/esm2020/src/data-type.mjs +444 -0
  57. package/esm2020/src/default-property-interceptor.mjs +460 -0
  58. package/esm2020/src/entity-action.mjs +45 -0
  59. package/esm2020/src/entity-aspect.mjs +806 -0
  60. package/esm2020/src/entity-group.mjs +187 -0
  61. package/esm2020/src/entity-key.mjs +116 -0
  62. package/esm2020/src/entity-manager.mjs +2094 -0
  63. package/esm2020/src/entity-metadata.mjs +2109 -0
  64. package/esm2020/src/entity-query.mjs +996 -0
  65. package/esm2020/src/entity-state.mjs +99 -0
  66. package/esm2020/src/enum.mjs +141 -0
  67. package/esm2020/src/event.mjs +256 -0
  68. package/esm2020/src/interface-registry.mjs +41 -0
  69. package/esm2020/src/key-generator.mjs +108 -0
  70. package/esm2020/src/local-query-comparison-options.mjs +65 -0
  71. package/esm2020/src/mapping-context.mjs +405 -0
  72. package/esm2020/src/naming-convention.mjs +88 -0
  73. package/esm2020/src/observable-array.mjs +183 -0
  74. package/esm2020/src/predicate.mjs +1232 -0
  75. package/esm2020/src/primitive-array.mjs +85 -0
  76. package/esm2020/src/query-options.mjs +152 -0
  77. package/esm2020/src/relation-array.mjs +173 -0
  78. package/esm2020/src/save-options.mjs +41 -0
  79. package/esm2020/src/unattached-children-map.mjs +58 -0
  80. package/esm2020/src/validate.mjs +988 -0
  81. package/esm2020/src/validation-options.mjs +64 -0
  82. package/fesm2015/{breeze-client-adapter-ajax-angularjs.js → breeze-client-adapter-ajax-angularjs.mjs} +1 -1
  83. package/fesm2015/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
  84. package/fesm2015/{breeze-client-adapter-ajax-fetch.js → breeze-client-adapter-ajax-fetch.mjs} +5 -3
  85. package/fesm2015/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
  86. package/fesm2015/{breeze-client-adapter-ajax-httpclient.js → breeze-client-adapter-ajax-httpclient.mjs} +1 -1
  87. package/fesm2015/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
  88. package/fesm2015/{breeze-client-adapter-ajax-jquery.js → breeze-client-adapter-ajax-jquery.mjs} +2 -2
  89. package/fesm2015/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
  90. package/fesm2015/{breeze-client-adapter-ajax-post.js → breeze-client-adapter-ajax-post.mjs} +1 -1
  91. package/fesm2015/breeze-client-adapter-ajax-post.mjs.map +1 -0
  92. package/fesm2015/{breeze-client-adapter-data-service-odata.js → breeze-client-adapter-data-service-odata.mjs} +20 -22
  93. package/fesm2015/breeze-client-adapter-data-service-odata.mjs.map +1 -0
  94. package/fesm2015/{breeze-client-adapter-data-service-webapi.js → breeze-client-adapter-data-service-webapi.mjs} +13 -13
  95. package/fesm2015/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
  96. package/fesm2015/{breeze-client-adapter-model-library-backing-store.js → breeze-client-adapter-model-library-backing-store.mjs} +13 -13
  97. package/fesm2015/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
  98. package/fesm2015/{breeze-client-adapter-model-library-ko.js → breeze-client-adapter-model-library-ko.mjs} +13 -13
  99. package/fesm2015/breeze-client-adapter-model-library-ko.mjs.map +1 -0
  100. package/fesm2015/{breeze-client-adapter-uri-builder-json.js → breeze-client-adapter-uri-builder-json.mjs} +8 -8
  101. package/fesm2015/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
  102. package/fesm2015/{breeze-client-adapter-uri-builder-odata.js → breeze-client-adapter-uri-builder-odata.mjs} +85 -86
  103. package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
  104. package/fesm2015/{breeze-client-mixin-get-entity-graph.js → breeze-client-mixin-get-entity-graph.mjs} +1 -1
  105. package/fesm2015/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
  106. package/fesm2015/{breeze-client-mixin-save-queuing.js → breeze-client-mixin-save-queuing.mjs} +1 -1
  107. package/fesm2015/breeze-client-mixin-save-queuing.mjs.map +1 -0
  108. package/fesm2015/{breeze-client.js → breeze-client.mjs} +417 -422
  109. package/fesm2015/breeze-client.mjs.map +1 -0
  110. package/{fesm5/breeze-client-adapter-ajax-angularjs.js → fesm2020/breeze-client-adapter-ajax-angularjs.mjs} +41 -42
  111. package/fesm2020/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
  112. package/{fesm5/breeze-client-adapter-ajax-fetch.js → fesm2020/breeze-client-adapter-ajax-fetch.mjs} +44 -43
  113. package/fesm2020/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
  114. package/{fesm5/breeze-client-adapter-ajax-httpclient.js → fesm2020/breeze-client-adapter-ajax-httpclient.mjs} +43 -44
  115. package/fesm2020/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
  116. package/{fesm5/breeze-client-adapter-ajax-jquery.js → fesm2020/breeze-client-adapter-ajax-jquery.mjs} +18 -19
  117. package/fesm2020/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
  118. package/{fesm5/breeze-client-adapter-ajax-post.js → fesm2020/breeze-client-adapter-ajax-post.mjs} +8 -11
  119. package/fesm2020/breeze-client-adapter-ajax-post.mjs.map +1 -0
  120. package/{fesm5/breeze-client-adapter-data-service-odata.js → fesm2020/breeze-client-adapter-data-service-odata.mjs} +126 -134
  121. package/fesm2020/breeze-client-adapter-data-service-odata.mjs.map +1 -0
  122. package/{fesm5/breeze-client-adapter-data-service-webapi.js → fesm2020/breeze-client-adapter-data-service-webapi.mjs} +38 -42
  123. package/fesm2020/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
  124. package/{fesm5/breeze-client-adapter-model-library-backing-store.js → fesm2020/breeze-client-adapter-model-library-backing-store.mjs} +63 -64
  125. package/fesm2020/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
  126. package/{fesm5/breeze-client-adapter-model-library-ko.js → fesm2020/breeze-client-adapter-model-library-ko.mjs} +57 -58
  127. package/fesm2020/breeze-client-adapter-model-library-ko.mjs.map +1 -0
  128. package/fesm2020/breeze-client-adapter-uri-builder-json.mjs +91 -0
  129. package/fesm2020/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
  130. package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs +245 -0
  131. package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
  132. package/{fesm5/breeze-client-mixin-get-entity-graph.js → fesm2020/breeze-client-mixin-get-entity-graph.mjs} +45 -45
  133. package/fesm2020/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
  134. package/{fesm5/breeze-client-mixin-save-queuing.js → fesm2020/breeze-client-mixin-save-queuing.mjs} +116 -126
  135. package/fesm2020/breeze-client-mixin-save-queuing.mjs.map +1 -0
  136. package/{fesm5/breeze-client.js → fesm2020/breeze-client.mjs} +3403 -3615
  137. package/fesm2020/breeze-client.mjs.map +1 -0
  138. package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
  139. package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
  140. package/package.json +126 -12
  141. package/src/entity-metadata.d.ts +6 -4
  142. package/src/entity-query.d.ts +1 -1
  143. package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
  144. package/adapter-ajax-angularjs/package.json +0 -13
  145. package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
  146. package/adapter-ajax-fetch/package.json +0 -13
  147. package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
  148. package/adapter-ajax-httpclient/package.json +0 -17
  149. package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
  150. package/adapter-ajax-jquery/package.json +0 -13
  151. package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
  152. package/adapter-ajax-post/package.json +0 -13
  153. package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
  154. package/adapter-data-service-odata/package.json +0 -13
  155. package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
  156. package/adapter-data-service-webapi/package.json +0 -13
  157. package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
  158. package/adapter-model-library-backing-store/package.json +0 -13
  159. package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
  160. package/adapter-model-library-ko/package.json +0 -13
  161. package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
  162. package/adapter-uri-builder-json/package.json +0 -13
  163. package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
  164. package/adapter-uri-builder-odata/package.json +0 -13
  165. package/breeze-client.d.ts +0 -8
  166. package/breeze-client.metadata.json +0 -1
  167. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
  168. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
  169. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
  170. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
  171. package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
  172. package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
  173. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
  174. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
  175. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
  176. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
  177. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
  178. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
  179. package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
  180. package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
  181. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
  182. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
  183. package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
  184. package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
  185. package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
  186. package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
  187. package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -743
  188. package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
  189. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
  190. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
  191. package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -326
  192. package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
  193. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
  194. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
  195. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
  196. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
  197. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
  198. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
  199. package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
  200. package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
  201. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
  202. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
  203. package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
  204. package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
  205. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
  206. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
  207. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
  208. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
  209. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
  210. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
  211. package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
  212. package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
  213. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
  214. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
  215. package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
  216. package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
  217. package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
  218. package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
  219. package/bundles/breeze-client.umd.js +0 -14094
  220. package/bundles/breeze-client.umd.js.map +0 -1
  221. package/bundles/breeze-client.umd.min.js +0 -16
  222. package/bundles/breeze-client.umd.min.js.map +0 -1
  223. package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
  224. package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
  225. package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  226. package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
  227. package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
  228. package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  229. package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
  230. package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
  231. package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  232. package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
  233. package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  234. package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
  235. package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  236. package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
  237. package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -459
  238. package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  239. package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -93
  240. package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  241. package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
  242. package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  243. package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
  244. package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  245. package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
  246. package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
  247. package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  248. package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
  249. package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
  250. package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  251. package/esm2015/breeze-client.js +0 -9
  252. package/esm2015/index.js +0 -2
  253. package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  254. package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  255. package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  256. package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
  257. package/esm2015/public_api.js +0 -2
  258. package/esm2015/src/abstract-data-service-adapter.js +0 -296
  259. package/esm2015/src/array.js +0 -4
  260. package/esm2015/src/assert-param.js +0 -312
  261. package/esm2015/src/breeze.js +0 -85
  262. package/esm2015/src/complex-array.js +0 -119
  263. package/esm2015/src/config.js +0 -223
  264. package/esm2015/src/core.js +0 -706
  265. package/esm2015/src/csdl-metadata-parser.js +0 -385
  266. package/esm2015/src/data-service.js +0 -203
  267. package/esm2015/src/data-type.js +0 -444
  268. package/esm2015/src/default-property-interceptor.js +0 -459
  269. package/esm2015/src/entity-action.js +0 -45
  270. package/esm2015/src/entity-aspect.js +0 -806
  271. package/esm2015/src/entity-group.js +0 -187
  272. package/esm2015/src/entity-key.js +0 -116
  273. package/esm2015/src/entity-manager.js +0 -2094
  274. package/esm2015/src/entity-metadata.js +0 -2109
  275. package/esm2015/src/entity-query.js +0 -996
  276. package/esm2015/src/entity-state.js +0 -99
  277. package/esm2015/src/enum.js +0 -141
  278. package/esm2015/src/event.js +0 -256
  279. package/esm2015/src/interface-registry.js +0 -41
  280. package/esm2015/src/key-generator.js +0 -108
  281. package/esm2015/src/local-query-comparison-options.js +0 -65
  282. package/esm2015/src/mapping-context.js +0 -405
  283. package/esm2015/src/naming-convention.js +0 -88
  284. package/esm2015/src/observable-array.js +0 -185
  285. package/esm2015/src/predicate.js +0 -1235
  286. package/esm2015/src/primitive-array.js +0 -87
  287. package/esm2015/src/query-options.js +0 -152
  288. package/esm2015/src/relation-array.js +0 -175
  289. package/esm2015/src/save-options.js +0 -41
  290. package/esm2015/src/unattached-children-map.js +0 -58
  291. package/esm2015/src/validate.js +0 -991
  292. package/esm2015/src/validation-options.js +0 -64
  293. package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
  294. package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
  295. package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  296. package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
  297. package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
  298. package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  299. package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
  300. package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
  301. package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  302. package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
  303. package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  304. package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
  305. package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  306. package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
  307. package/esm5/adapter-data-service-odata/adapter-data-service-odata.js +0 -466
  308. package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  309. package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -98
  310. package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  311. package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
  312. package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  313. package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
  314. package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  315. package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
  316. package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
  317. package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  318. package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
  319. package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
  320. package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  321. package/esm5/breeze-client.js +0 -9
  322. package/esm5/index.js +0 -2
  323. package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  324. package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  325. package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  326. package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
  327. package/esm5/public_api.js +0 -2
  328. package/esm5/src/abstract-data-service-adapter.js +0 -302
  329. package/esm5/src/array.js +0 -4
  330. package/esm5/src/assert-param.js +0 -317
  331. package/esm5/src/breeze.js +0 -85
  332. package/esm5/src/complex-array.js +0 -119
  333. package/esm5/src/config.js +0 -228
  334. package/esm5/src/core.js +0 -714
  335. package/esm5/src/csdl-metadata-parser.js +0 -385
  336. package/esm5/src/data-service.js +0 -207
  337. package/esm5/src/data-type.js +0 -451
  338. package/esm5/src/default-property-interceptor.js +0 -459
  339. package/esm5/src/entity-action.js +0 -52
  340. package/esm5/src/entity-aspect.js +0 -812
  341. package/esm5/src/entity-group.js +0 -189
  342. package/esm5/src/entity-key.js +0 -118
  343. package/esm5/src/entity-manager.js +0 -2112
  344. package/esm5/src/entity-metadata.js +0 -2144
  345. package/esm5/src/entity-query.js +0 -1023
  346. package/esm5/src/entity-state.js +0 -106
  347. package/esm5/src/enum.js +0 -144
  348. package/esm5/src/event.js +0 -259
  349. package/esm5/src/interface-registry.js +0 -43
  350. package/esm5/src/key-generator.js +0 -111
  351. package/esm5/src/local-query-comparison-options.js +0 -67
  352. package/esm5/src/mapping-context.js +0 -407
  353. package/esm5/src/naming-convention.js +0 -90
  354. package/esm5/src/observable-array.js +0 -201
  355. package/esm5/src/predicate.js +0 -1300
  356. package/esm5/src/primitive-array.js +0 -87
  357. package/esm5/src/query-options.js +0 -167
  358. package/esm5/src/relation-array.js +0 -175
  359. package/esm5/src/save-options.js +0 -43
  360. package/esm5/src/unattached-children-map.js +0 -60
  361. package/esm5/src/validate.js +0 -996
  362. package/esm5/src/validation-options.js +0 -66
  363. package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  364. package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
  365. package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  366. package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
  367. package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
  368. package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
  369. package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
  370. package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  371. package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
  372. package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
  373. package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  374. package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
  375. package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
  376. package/fesm2015/breeze-client.js.map +0 -1
  377. package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  378. package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
  379. package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  380. package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
  381. package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
  382. package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
  383. package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
  384. package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  385. package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
  386. package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
  387. package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
  388. package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
  389. package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  390. package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
  391. package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
  392. package/fesm5/breeze-client.js.map +0 -1
  393. package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
  394. package/mixin-get-entity-graph/package.json +0 -13
  395. package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
  396. package/mixin-save-queuing/package.json +0 -13
  397. package/public_api.d.ts +0 -1
package/esm5/src/core.js DELETED
@@ -1,714 +0,0 @@
1
- /** See if this comment will make it into .d.ts */
2
- import { BreezeEnum } from './enum';
3
- var hasOwnProperty = uncurry(Object.prototype.hasOwnProperty);
4
- var arraySlice = uncurry(Array.prototype.slice);
5
- var ɵ0 = function () {
6
- try {
7
- return !!(Object.getPrototypeOf && Object.defineProperty({}, 'x', {}));
8
- }
9
- catch (e) {
10
- return false;
11
- }
12
- };
13
- var isES5Supported = ɵ0();
14
- // iterate over object
15
- function objectForEach(obj, kvFn) {
16
- for (var key in obj) {
17
- if (hasOwnProperty(obj, key)) {
18
- kvFn(key, obj[key]);
19
- }
20
- }
21
- }
22
- function objectMap(obj, kvFn) {
23
- var results = [];
24
- for (var key in obj) {
25
- if (hasOwnProperty(obj, key)) {
26
- var result = kvFn ? kvFn(key, obj[key]) : obj[key];
27
- if (result !== undefined) {
28
- results.push(result);
29
- }
30
- }
31
- }
32
- return results;
33
- }
34
- function objectFirst(obj, kvPredicate) {
35
- for (var key in obj) {
36
- if (hasOwnProperty(obj, key)) {
37
- var value = obj[key];
38
- if (kvPredicate(key, value)) {
39
- return { key: key, value: value };
40
- }
41
- }
42
- }
43
- return null;
44
- }
45
- function arrayFlatMap(arr, mapFn) {
46
- return Array.prototype.concat.apply([], arr.map(mapFn));
47
- }
48
- function isSettable(obj, propertyName) {
49
- var pd = getPropDescriptor(obj, propertyName);
50
- if (pd == null)
51
- return true;
52
- return !!(pd.writable || pd.set);
53
- }
54
- function getPropDescriptor(obj, propertyName) {
55
- if (!isES5Supported)
56
- return undefined;
57
- if (obj.hasOwnProperty(propertyName)) {
58
- return Object.getOwnPropertyDescriptor(obj, propertyName);
59
- }
60
- else {
61
- var nextObj = Object.getPrototypeOf(obj);
62
- if (nextObj == null)
63
- return undefined;
64
- return getPropDescriptor(nextObj, propertyName);
65
- }
66
- }
67
- // Functional extensions
68
- /** can be used like: persons.filter(propEq("firstName", "John")) */
69
- function propEq(propertyName, value) {
70
- return function (obj) {
71
- return obj[propertyName] === value;
72
- };
73
- }
74
- /** can be used like: persons.filter(propEq("firstName", "FirstName", "John")) */
75
- function propsEq(property1Name, property2Name, value) {
76
- return function (obj) {
77
- return obj[property1Name] === value || obj[property2Name] === value;
78
- };
79
- }
80
- /** can be used like persons.map(pluck("firstName")) */
81
- function pluck(propertyName) {
82
- return function (obj) {
83
- return obj[propertyName];
84
- };
85
- }
86
- // end functional extensions
87
- /** Return an array of property values from source */
88
- function getOwnPropertyValues(source) {
89
- var result = [];
90
- for (var name_1 in source) {
91
- if (hasOwnProperty(source, name_1)) {
92
- result.push(source[name_1]);
93
- }
94
- }
95
- return result;
96
- }
97
- /** Copy properties from source to target. Returns target. */
98
- function extend(target, source, propNames) {
99
- if (!source)
100
- return target;
101
- if (propNames) {
102
- propNames.forEach(function (propName) {
103
- target[propName] = source[propName];
104
- });
105
- }
106
- else {
107
- for (var propName in source) {
108
- if (hasOwnProperty(source, propName)) {
109
- target[propName] = source[propName];
110
- }
111
- }
112
- }
113
- return target;
114
- }
115
- /** Copy properties from defaults iff undefined on target. Returns target. */
116
- function updateWithDefaults(target, defaults) {
117
- for (var name_2 in defaults) {
118
- if (target[name_2] === undefined) {
119
- target[name_2] = defaults[name_2];
120
- }
121
- }
122
- return target;
123
- }
124
- /** Set ctor.defaultInstance to an instance of ctor with properties from target.
125
- We want to insure that the object returned by ctor.defaultInstance is always immutable
126
- Use 'target' as the primary template for the ctor.defaultInstance;
127
- Use current 'ctor.defaultInstance' as the template for any missing properties
128
- creates a new instance for ctor.defaultInstance
129
- returns target unchanged */
130
- function setAsDefault(target, ctor) {
131
- ctor.defaultInstance = updateWithDefaults(new ctor(target), ctor.defaultInstance);
132
- return target;
133
- }
134
- /**
135
- 'source' is an object that will be transformed into another
136
- 'template' is a map where the
137
- keys: are the keys to return
138
- if a key contains ','s then the key is treated as a delimited string with first of the
139
- keys being the key to return and the others all valid aliases for this key
140
- 'values' are either
141
- 1) the 'default' value of the key
142
- 2) a function that takes in the source value and should return the value to set
143
- The value from the source is then set on the target,
144
- after first passing thru the fn, if provided, UNLESS:
145
- 1) it is the default value
146
- 2) it is undefined ( nulls WILL be set)
147
- 'target' is optional
148
- - if it exists then properties of the target will be set ( overwritten if the exist)
149
- - if it does not exist then a new object will be created as filled.
150
- 'target is returned.
151
- */
152
- function toJson(source, template, target) {
153
- if (target === void 0) { target = {}; }
154
- var _loop_1 = function (key) {
155
- var aliases = key.split(",");
156
- var defaultValue = template[key];
157
- // using some as a forEach with a 'break'
158
- aliases.some(function (propName) {
159
- if (!(propName in source))
160
- return false;
161
- var value = source[propName];
162
- // there is a functional property defined with this alias ( not what we want to replace).
163
- if (typeof value === 'function')
164
- return false;
165
- // '==' is deliberate here - idea is that null or undefined values will never get serialized
166
- // if default value is set to null.
167
- // tslint:disable-next-line
168
- if (value == defaultValue)
169
- return true;
170
- if (Array.isArray(value) && value.length === 0)
171
- return true;
172
- if (typeof (defaultValue) === "function") {
173
- value = defaultValue(value);
174
- }
175
- else if (typeof (value) === "object") {
176
- if (value && value instanceof BreezeEnum) {
177
- value = value.name;
178
- }
179
- }
180
- if (value === undefined)
181
- return true;
182
- target[aliases[0]] = value;
183
- return true;
184
- });
185
- };
186
- for (var key in template) {
187
- _loop_1(key);
188
- }
189
- return target;
190
- }
191
- /** Replacer function for toJSONSafe, when serializing entities. Excludes entityAspect and other internal properties. */
192
- function toJSONSafeReplacer(prop, val) {
193
- if (prop === "entityAspect" || prop === "complexAspect" || prop === "entityType" || prop === "complexType"
194
- || prop === "getProperty" || prop === "setProperty"
195
- || prop === "constructor" || prop.charAt(0) === '_' || prop.charAt(0) === '$')
196
- return;
197
- return val;
198
- }
199
- /** Safely perform toJSON logic on objects with cycles. */
200
- function toJSONSafe(obj, replacer) {
201
- if (obj !== Object(obj))
202
- return obj; // primitive value
203
- if (obj._$visited)
204
- return undefined;
205
- if (obj.toJSON) {
206
- var newObj = obj.toJSON();
207
- if (newObj !== Object(newObj))
208
- return newObj; // primitive value
209
- if (newObj !== obj)
210
- return toJSONSafe(newObj, replacer);
211
- // toJSON returned the object unchanged.
212
- obj = newObj;
213
- }
214
- obj._$visited = true;
215
- var result;
216
- if (obj instanceof Array) {
217
- result = obj.map(function (o) {
218
- return toJSONSafe(o, replacer);
219
- });
220
- }
221
- else if (typeof (obj) === "function") {
222
- result = undefined;
223
- }
224
- else {
225
- result = {};
226
- for (var prop in obj) {
227
- if (prop === "_$visited")
228
- continue;
229
- var val = obj[prop];
230
- if (replacer) {
231
- val = replacer(prop, val);
232
- if (val === undefined)
233
- continue;
234
- }
235
- val = toJSONSafe(val, replacer);
236
- if (val === undefined)
237
- continue;
238
- result[prop] = val;
239
- }
240
- }
241
- delete obj._$visited;
242
- return result;
243
- }
244
- /** Resolves the values of a list of properties by checking each property in multiple sources until a value is found. */
245
- function resolveProperties(sources, propertyNames) {
246
- var r = {};
247
- var length = sources.length;
248
- propertyNames.forEach(function (pn) {
249
- for (var i = 0; i < length; i++) {
250
- var src = sources[i];
251
- if (src) {
252
- var val = src[pn];
253
- if (val !== undefined) {
254
- r[pn] = val;
255
- break;
256
- }
257
- }
258
- }
259
- });
260
- return r;
261
- }
262
- // array functions
263
- function toArray(item) {
264
- if (item == null) {
265
- return [];
266
- }
267
- else if (Array.isArray(item)) {
268
- return item;
269
- }
270
- else {
271
- return [item];
272
- }
273
- }
274
- /** a version of Array.map that doesn't require an array, i.e. works on arrays and scalars. */
275
- // function map<T, U>(items: T | T[], fn: (v: T, ix?: number) => U, includeNull?: boolean): U | U[] {
276
- function map(items, fn, includeNull) {
277
- // whether to return nulls in array of results; default = true;
278
- includeNull = includeNull == null ? true : includeNull;
279
- if (items == null)
280
- return items;
281
- // let result: U[];
282
- if (Array.isArray(items)) {
283
- var result_1 = [];
284
- items.forEach(function (v, ix) {
285
- var r = fn(v, ix);
286
- if (r != null || includeNull) {
287
- result_1[ix] = r;
288
- }
289
- });
290
- return result_1;
291
- }
292
- else {
293
- var result = fn(items);
294
- return result;
295
- }
296
- }
297
- function arrayFirst(array, predicate) {
298
- for (var i = 0, j = array.length; i < j; i++) {
299
- if (predicate(array[i])) {
300
- return array[i];
301
- }
302
- }
303
- return null;
304
- }
305
- function arrayIndexOf(array, predicate) {
306
- for (var i = 0, j = array.length; i < j; i++) {
307
- if (predicate(array[i]))
308
- return i;
309
- }
310
- return -1;
311
- }
312
- /** Add item if not already in array */
313
- function arrayAddItemUnique(array, item) {
314
- var ix = array.indexOf(item);
315
- if (ix === -1)
316
- array.push(item);
317
- }
318
- /** Remove items from the array
319
- * @param array
320
- * @param predicateOrItem - item to remove, or function to determine matching item
321
- * @param shouldRemoveMultiple - true to keep removing after first match, false otherwise
322
- */
323
- function arrayRemoveItem(array, predicateOrItem, shouldRemoveMultiple) {
324
- var predicate = (isFunction(predicateOrItem) ? predicateOrItem : undefined);
325
- var lastIx = array.length - 1;
326
- var removed = false;
327
- for (var i = lastIx; i >= 0; i--) {
328
- if (predicate ? predicate(array[i]) : (array[i] === predicateOrItem)) {
329
- array.splice(i, 1);
330
- removed = true;
331
- if (!shouldRemoveMultiple) {
332
- return true;
333
- }
334
- }
335
- }
336
- return removed;
337
- }
338
- /** Combine array elements using the callback. Returns array with length == min(a1.length, a2.length) */
339
- function arrayZip(a1, a2, callback) {
340
- var result = [];
341
- var n = Math.min(a1.length, a2.length);
342
- for (var i = 0; i < n; ++i) {
343
- result.push(callback(a1[i], a2[i]));
344
- }
345
- return result;
346
- }
347
- //function arrayDistinct(array) {
348
- // array = array || [];
349
- // let result = [];
350
- // for (let i = 0, j = array.length; i < j; i++) {
351
- // if (result.indexOf(array[i]) < 0)
352
- // result.push(array[i]);
353
- // }
354
- // return result;
355
- //}
356
- // Not yet needed
357
- //// much faster but only works on array items with a toString method that
358
- //// returns distinct string for distinct objects. So this is safe for arrays with primitive
359
- //// types but not for arrays with object types, unless toString() has been implemented.
360
- //function arrayDistinctUnsafe(array) {
361
- // let o = {}, i, l = array.length, r = [];
362
- // for (i = 0; i < l; i += 1) {
363
- // let v = array[i];
364
- // o[v] = v;
365
- // }
366
- // for (i in o) r.push(o[i]);
367
- // return r;
368
- //}
369
- function arrayEquals(a1, a2, equalsFn) {
370
- //Check if the arrays are undefined/null
371
- if (!a1 || !a2)
372
- return false;
373
- if (a1.length !== a2.length)
374
- return false;
375
- //go thru all the vars
376
- for (var i = 0; i < a1.length; i++) {
377
- //if the let is an array, we need to make a recursive check
378
- //otherwise we'll just compare the values
379
- if (Array.isArray(a1[i])) {
380
- if (!arrayEquals(a1[i], a2[i]))
381
- return false;
382
- }
383
- else {
384
- if (equalsFn) {
385
- if (!equalsFn(a1[i], a2[i]))
386
- return false;
387
- }
388
- else {
389
- if (a1[i] !== a2[i])
390
- return false;
391
- }
392
- }
393
- }
394
- return true;
395
- }
396
- // end of array functions
397
- /** Returns an array for a source and a prop, and creates the prop if needed. */
398
- function getArray(source, propName) {
399
- var arr = source[propName];
400
- if (!arr) {
401
- arr = [];
402
- source[propName] = arr;
403
- }
404
- return arr;
405
- }
406
- /** Calls requireLibCore on semicolon-separated libNames */
407
- function requireLib(libNames, errMessage) {
408
- var arrNames = libNames.split(";");
409
- for (var i = 0, j = arrNames.length; i < j; i++) {
410
- var lib = requireLibCore(arrNames[i]);
411
- if (lib)
412
- return lib;
413
- }
414
- if (errMessage) {
415
- throw new Error("Unable to initialize " + libNames + ". " + errMessage);
416
- }
417
- }
418
- /** Returns the 'libName' module if loaded or else returns undefined */
419
- function requireLibCore(libName) {
420
- var win = window || (global ? global.window : undefined);
421
- if (!win)
422
- return; // Must run in a browser. Todo: add commonjs support
423
- // get library from browser globals if we can
424
- var lib = win[libName];
425
- if (lib)
426
- return lib;
427
- // if require exists, maybe require can get it.
428
- // This method is synchronous so it can't load modules with AMD.
429
- // It can only obtain modules from require that have already been loaded.
430
- // Developer should bootstrap such that the breeze module
431
- // loads after all other libraries that breeze should find with this method
432
- // See documentation
433
- var r = win.require;
434
- if (r) { // if require exists
435
- if (r.defined) { // require.defined is not standard and may not exist
436
- // require.defined returns true if module has been loaded
437
- return r.defined(libName) ? r(libName) : undefined;
438
- }
439
- else {
440
- // require.defined does not exist so we have to call require('libName') directly.
441
- // The require('libName') overload is synchronous and does not load modules.
442
- // It throws an exception if the module isn't already loaded.
443
- try {
444
- return r(libName);
445
- }
446
- catch (e) {
447
- // require('libName') threw because module not loaded
448
- return;
449
- }
450
- }
451
- }
452
- }
453
- /** Execute fn while obj has tempValue for property */
454
- function using(obj, property, tempValue, fn) {
455
- var originalValue = obj[property];
456
- if (tempValue === originalValue) {
457
- return fn();
458
- }
459
- obj[property] = tempValue;
460
- try {
461
- return fn();
462
- }
463
- finally {
464
- if (originalValue === undefined) {
465
- delete obj[property];
466
- }
467
- else {
468
- obj[property] = originalValue;
469
- }
470
- }
471
- }
472
- /** Call state = startFn(), call fn(), call endFn(state) */
473
- function wrapExecution(startFn, endFn, fn) {
474
- var state;
475
- try {
476
- state = startFn();
477
- return fn();
478
- }
479
- catch (e) {
480
- if (typeof (state) === 'object') {
481
- state.error = e;
482
- }
483
- throw e;
484
- }
485
- finally {
486
- endFn(state);
487
- }
488
- }
489
- /** Remember & return the value of fn() when it was called with its current args */
490
- function memoize(fn) {
491
- return function () {
492
- var args = arraySlice(arguments), hash = "", i = args.length, currentArg = null;
493
- while (i--) {
494
- currentArg = args[i];
495
- hash += (currentArg === Object(currentArg)) ? JSON.stringify(currentArg) : currentArg;
496
- fn.memoize || (fn.memoize = {});
497
- }
498
- return (hash in fn.memoize) ?
499
- fn.memoize[hash] :
500
- fn.memoize[hash] = fn.apply(this, args);
501
- };
502
- }
503
- function getUuid() {
504
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
505
- // tslint:disable-next-line
506
- var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
507
- return v.toString(16);
508
- });
509
- }
510
- function durationToSeconds(duration) {
511
- // basic algorithm from https://github.com/nezasa/iso8601-js-period
512
- if (typeof duration !== "string")
513
- throw new Error("Invalid ISO8601 duration '" + duration + "'");
514
- // regex splits as follows - grp0, grp1, y, m, d, grp2, h, m, s
515
- // 0 1 2 3 4 5 6 7 8
516
- var struct = /^P((\d+Y)?(\d+M)?(\d+D)?)?(T(\d+H)?(\d+M)?(\d+S)?)?$/.exec(duration);
517
- if (!struct)
518
- throw new Error("Invalid ISO8601 duration '" + duration + "'");
519
- var ymdhmsIndexes = [2, 3, 4, 6, 7, 8]; // -> grp1,y,m,d,grp2,h,m,s
520
- var factors = [31104000,
521
- 2592000,
522
- 86400,
523
- 3600,
524
- 60,
525
- 1]; // second (1)
526
- var seconds = 0;
527
- for (var i = 0; i < 6; i++) {
528
- var digit = struct[ymdhmsIndexes[i]];
529
- // remove letters, replace by 0 if not defined
530
- digit = (digit ? +digit.replace(/[A-Za-z]+/g, '') : 0);
531
- seconds += digit * factors[i];
532
- }
533
- return seconds;
534
- }
535
- // is functions
536
- function noop() {
537
- // does nothing
538
- }
539
- function identity(x) {
540
- return x;
541
- }
542
- function classof(o) {
543
- if (o === null) {
544
- return "null";
545
- }
546
- if (o === undefined) {
547
- return "undefined";
548
- }
549
- return Object.prototype.toString.call(o).slice(8, -1).toLowerCase();
550
- }
551
- function isDate(o) {
552
- return classof(o) === "date" && !isNaN(o.getTime());
553
- }
554
- function isDateString(s) {
555
- // let rx = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/;
556
- var rx = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/;
557
- return (typeof s === "string") && rx.test(s);
558
- }
559
- function isFunction(o) {
560
- return classof(o) === "function";
561
- }
562
- // function isString(o: any) {
563
- // return (typeof o === "string");
564
- // }
565
- // function isObject(o: any) {
566
- // return (typeof o === "object");
567
- // }
568
- function isGuid(value) {
569
- return (typeof value === "string") && /[a-fA-F\d]{8}-(?:[a-fA-F\d]{4}-){3}[a-fA-F\d]{12}/.test(value);
570
- }
571
- function isDuration(value) {
572
- return (typeof value === "string") && /^(-|)?P[T]?[\d\.,\-]+[YMDTHS]/.test(value);
573
- }
574
- function isEmpty(obj) {
575
- if (obj === null || obj === undefined) {
576
- return true;
577
- }
578
- for (var key in obj) {
579
- if (hasOwnProperty(obj, key)) {
580
- return false;
581
- }
582
- }
583
- return true;
584
- }
585
- function isNumeric(n) {
586
- return !isNaN(parseFloat(n)) && isFinite(n);
587
- }
588
- // end of is Functions
589
- // string functions
590
- function stringStartsWith(str, prefix) {
591
- // returns true for empty string or null prefix
592
- if ((!str))
593
- return false;
594
- if (prefix === "" || prefix == null)
595
- return true;
596
- return str.indexOf(prefix, 0) === 0;
597
- }
598
- function stringEndsWith(str, suffix) {
599
- // returns true for empty string or null suffix
600
- if ((!str))
601
- return false;
602
- if (suffix === "" || suffix == null)
603
- return true;
604
- return str.indexOf(suffix, str.length - suffix.length) !== -1;
605
- }
606
- // Based on fragment from Dean Edwards' Base 2 library
607
- /** format("a %1 and a %2", "cat", "dog") -> "a cat and a dog" */
608
- function formatString(str) {
609
- var params = [];
610
- for (var _i = 1; _i < arguments.length; _i++) {
611
- params[_i - 1] = arguments[_i];
612
- }
613
- var args = arguments;
614
- var pattern = RegExp("%([1-" + (arguments.length - 1) + "])", "g");
615
- return str.replace(pattern, function (match, index) {
616
- return args[index];
617
- });
618
- }
619
- // See http://stackoverflow.com/questions/7225407/convert-camelcasetext-to-camel-case-text
620
- /** Change text to title case with spaces, e.g. 'myPropertyName12' to 'My Property Name 12' */
621
- var camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
622
- function titleCaseSpace(text) {
623
- text = text.replace(camelEdges, '$1 ');
624
- text = text.charAt(0).toUpperCase() + text.slice(1);
625
- return text;
626
- }
627
- // end of string functions
628
- // See Mark Miller’s explanation of what this does.
629
- // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
630
- function uncurry(f) {
631
- var call = Function.call;
632
- return function () {
633
- return call.apply(f, arguments);
634
- };
635
- }
636
- // shims
637
- if (!Object.create) {
638
- Object.create = function (parent) {
639
- var F = function () {
640
- };
641
- F.prototype = parent;
642
- return new F();
643
- };
644
- }
645
- // strings for error messages
646
- var strings = {
647
- "TO_TYPE": "Add 'EntityQuery.toType()' to your query, or call 'MetadataStore.setEntityTypeForResourceName()' to register an EntityType for this resourceName."
648
- };
649
- // // not all methods above are exported
650
- export var core = {
651
- isES5Supported: isES5Supported,
652
- hasOwnProperty: hasOwnProperty,
653
- getOwnPropertyValues: getOwnPropertyValues,
654
- getPropertyDescriptor: getPropDescriptor,
655
- objectForEach: objectForEach,
656
- objectFirst: objectFirst,
657
- objectMap: objectMap,
658
- extend: extend,
659
- propEq: propEq,
660
- propsEq: propsEq,
661
- pluck: pluck,
662
- map: map,
663
- resolveProperties: resolveProperties,
664
- setAsDefault: setAsDefault,
665
- updateWithDefaults: updateWithDefaults,
666
- getArray: getArray,
667
- toArray: toArray,
668
- arrayEquals: arrayEquals,
669
- arraySlice: arraySlice,
670
- arrayFirst: arrayFirst,
671
- arrayIndexOf: arrayIndexOf,
672
- arrayRemoveItem: arrayRemoveItem,
673
- arrayZip: arrayZip,
674
- arrayAddItemUnique: arrayAddItemUnique,
675
- arrayFlatMap: arrayFlatMap,
676
- requireLib: requireLib,
677
- using: using,
678
- wrapExecution: wrapExecution,
679
- memoize: memoize,
680
- getUuid: getUuid,
681
- durationToSeconds: durationToSeconds,
682
- isSettable: isSettable,
683
- isDate: isDate,
684
- isDateString: isDateString,
685
- isGuid: isGuid,
686
- isDuration: isDuration,
687
- isFunction: isFunction,
688
- isEmpty: isEmpty,
689
- isNumeric: isNumeric,
690
- identity: identity,
691
- noop: noop,
692
- stringStartsWith: stringStartsWith,
693
- stringEndsWith: stringEndsWith,
694
- formatString: formatString,
695
- titleCase: titleCaseSpace,
696
- toJson: toJson,
697
- toJSONSafe: toJSONSafe,
698
- toJSONSafeReplacer: toJSONSafeReplacer,
699
- strings: strings
700
- };
701
- export { ɵ0 };
702
- // Unused
703
- /*
704
- // returns true for booleans, numbers, strings and dates
705
- // false for null, and non-date objects, functions, and arrays
706
- function isPrimitive(obj: any) {
707
- if (obj == null) return false;
708
- // true for numbers, strings, booleans and null, false for objects
709
- if (obj != Object(obj)) return true;
710
- return isDate(obj);
711
- }
712
-
713
- */
714
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2JyZWV6ZS1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrREFBa0Q7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQWVwQyxJQUFJLGNBQWMsR0FBMEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDckcsSUFBSSxVQUFVLEdBQXVELE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RFO0lBQzFCLElBQUk7UUFDQSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDMUU7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNSLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0FBQ0wsQ0FBQztBQU5ELElBQUksY0FBYyxHQUFZLElBTTFCLENBQUM7QUFFTCxzQkFBc0I7QUFDdEIsU0FBUyxhQUFhLENBQUMsR0FBVyxFQUFFLElBQW9DO0lBQ3BFLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ2pCLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO0tBQ0o7QUFDTCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBVyxFQUFFLElBQXFDO0lBQ2pFLElBQUksT0FBTyxHQUFVLEVBQUUsQ0FBQztJQUN4QixLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNqQixJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxD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VSxFQUFFLFVBQVU7SUFDdEIsS0FBSyxFQUFFLEtBQUs7SUFDWixhQUFhLEVBQUUsYUFBYTtJQUU1QixPQUFPLEVBQUUsT0FBTztJQUNoQixPQUFPLEVBQUUsT0FBTztJQUNoQixpQkFBaUIsRUFBRSxpQkFBaUI7SUFFcEMsVUFBVSxFQUFFLFVBQVU7SUFFdEIsTUFBTSxFQUFFLE1BQU07SUFDZCxZQUFZLEVBQUUsWUFBWTtJQUMxQixNQUFNLEVBQUUsTUFBTTtJQUNkLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFNBQVMsRUFBRSxTQUFTO0lBRXBCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLElBQUksRUFBRSxJQUFJO0lBRVYsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLGNBQWMsRUFBRSxjQUFjO0lBQzlCLFlBQVksRUFBRSxZQUFZO0lBQzFCLFNBQVMsRUFBRSxjQUFjO0lBRXpCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsVUFBVSxFQUFFLFVBQVU7SUFDdEIsa0JBQWtCLEVBQUUsa0JBQWtCO0lBRXRDLE9BQU8sRUFBRSxPQUFPO0NBQ25CLENBQUM7O0FBT0YsU0FBUztBQUNUOzs7Ozs7Ozs7O0VBVUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU2VlIGlmIHRoaXMgY29tbWVudCB3aWxsIG1ha2UgaXQgaW50byAuZC50cyAqL1xyXG5pbXBvcnQgeyBCcmVlemVFbnVtIH0gZnJvbSAnLi9lbnVtJztcclxuZGVjbGFyZSB2YXIgZ2xvYmFsOiBhbnk7XHJcbmRlY2xhcmUgdmFyIHdpbmRvdzogYW55O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNhbGxiYWNrIHtcclxuICAgIChlcnJvcjogRXJyb3IpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENhbGxiYWNrIHtcclxuICAgIChkYXRhOiBhbnkpOiB2b2lkO1xyXG59XHJcblxyXG4vLyB0eXBlIFByZWRpY2F0ZSA9IChpOiBhbnkpID0+IGJvb2xlYW47XHJcbnR5cGUgUHJlZGljYXRlPFQ+ID0gKGk6IFQpID0+IGJvb2xlYW47XHJcblxyXG5sZXQgaGFzT3duUHJvcGVydHk6IChvYmo6IE9iamVjdCwga2V5OiBzdHJpbmcpID0+IGJvb2xlYW4gPSB1bmN1cnJ5KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xyXG5sZXQgYXJyYXlTbGljZTogKGFyOiBhbnlbXSwgc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcikgPT4gYW55W10gPSB1bmN1cnJ5KEFycmF5LnByb3RvdHlwZS5zbGljZSk7XHJcbmxldCBpc0VTNVN1cHBvcnRlZDogYm9vbGVhbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuICEhKE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICd4Jywge30pKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn0gKCk7XHJcblxyXG4vLyBpdGVyYXRlIG92ZXIgb2JqZWN0XHJcbmZ1bmN0aW9uIG9iamVjdEZvckVhY2gob2JqOiBPYmplY3QsIGt2Rm46IChrZXk6IHN0cmluZywgdmFsOiBhbnkpID0+IGFueSkge1xyXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShvYmosIGtleSkpIHtcclxuICAgICAgICAgICAga3ZGbihrZXksIG9ialtrZXldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9iamVjdE1hcChvYmo6IE9iamVjdCwga3ZGbj86IChrZXk6IHN0cmluZywgdmFsOiBhbnkpID0+IGFueSk6IGFueVtdIHtcclxuICAgIGxldCByZXN1bHRzOiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGt2Rm4gPyBrdkZuKGtleSwgb2JqW2tleV0pIDogb2JqW2tleV07XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxufVxyXG5cclxuZnVuY3Rpb24gb2JqZWN0Rmlyc3Qob2JqOiBPYmplY3QsIGt2UHJlZGljYXRlOiAoa2V5OiBzdHJpbmcsIHZhbDogYW55KSA9PiBib29sZWFuKTogeyBrZXk6IHN0cmluZywgdmFsdWU6IGFueSB9IHwgbnVsbCB7XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwga2V5KSkge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBvYmpba2V5XTtcclxuICAgICAgICAgICAgaWYgKGt2UHJlZGljYXRlKGtleSwgdmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlGbGF0TWFwPFQsIFU+KGFycjogVFtdLCBtYXBGbjogKGFyZzogVCkgPT4gVVtdKSB7XHJcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgYXJyLm1hcChtYXBGbikpIGFzIFVbXTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNTZXR0YWJsZShvYmo6IE9iamVjdCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBwZCA9IGdldFByb3BEZXNjcmlwdG9yKG9iaiwgcHJvcGVydHlOYW1lKTtcclxuICAgIGlmIChwZCA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiAhIShwZC53cml0YWJsZSB8fCBwZC5zZXQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRQcm9wRGVzY3JpcHRvcihvYmo6IE9iamVjdCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFpc0VTNVN1cHBvcnRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3BlcnR5TmFtZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBuZXh0T2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XHJcbiAgICAgICAgaWYgKG5leHRPYmogPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICByZXR1cm4gZ2V0UHJvcERlc2NyaXB0b3IobmV4dE9iaiwgcHJvcGVydHlOYW1lKTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gRnVuY3Rpb25hbCBleHRlbnNpb25zXHJcblxyXG4vKiogY2FuIGJlIHVzZWQgbGlrZTogcGVyc29ucy5maWx0ZXIocHJvcEVxKFwiZmlyc3ROYW1lXCIsIFwiSm9oblwiKSkgKi9cclxuZnVuY3Rpb24gcHJvcEVxKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogKG9iajogT2JqZWN0KSA9PiBib29sZWFuIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gb2JqW3Byb3BlcnR5TmFtZV0gPT09IHZhbHVlO1xyXG4gICAgfTtcclxufVxyXG5cclxuLyoqIGNhbiBiZSB1c2VkIGxpa2U6IHBlcnNvbnMuZmlsdGVyKHByb3BFcShcImZpcnN0TmFtZVwiLCBcIkZpcnN0TmFtZVwiLCBcIkpvaG5cIikpICovXHJcbmZ1bmN0aW9uIHByb3BzRXEocHJvcGVydHkxTmFtZTogc3RyaW5nLCBwcm9wZXJ0eTJOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiAob2JqOiBPYmplY3QpID0+IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmo6IGFueSkge1xyXG4gICAgICAgIHJldHVybiBvYmpbcHJvcGVydHkxTmFtZV0gPT09IHZhbHVlIHx8IG9ialtwcm9wZXJ0eTJOYW1lXSA9PT0gdmFsdWU7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogY2FuIGJlIHVzZWQgbGlrZSBwZXJzb25zLm1hcChwbHVjayhcImZpcnN0TmFtZVwiKSkgKi9cclxuZnVuY3Rpb24gcGx1Y2socHJvcGVydHlOYW1lOiBhbnkpOiAob2JqOiBPYmplY3QpID0+IGFueSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIG9ialtwcm9wZXJ0eU5hbWVdO1xyXG4gICAgfTtcclxufVxyXG5cclxuLy8gZW5kIGZ1bmN0aW9uYWwgZXh0ZW5zaW9uc1xyXG5cclxuLyoqIFJldHVybiBhbiBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBzb3VyY2UgKi9cclxuZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlWYWx1ZXMoc291cmNlOiBPYmplY3QpOiBhbnlbXSB7XHJcbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgbmFtZSBpbiBzb3VyY2UpIHtcclxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkoc291cmNlLCBuYW1lKSkge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaChzb3VyY2VbbmFtZV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKiBDb3B5IHByb3BlcnRpZXMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0LiBSZXR1cm5zIHRhcmdldC4gKi9cclxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldDogT2JqZWN0LCBzb3VyY2U6IE9iamVjdCwgcHJvcE5hbWVzPzogc3RyaW5nW10pOiBPYmplY3Qge1xyXG4gICAgaWYgKCFzb3VyY2UpIHJldHVybiB0YXJnZXQ7XHJcbiAgICBpZiAocHJvcE5hbWVzKSB7XHJcbiAgICAgICAgcHJvcE5hbWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5KHNvdXJjZSwgcHJvcE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKiBDb3B5IHByb3BlcnRpZXMgZnJvbSBkZWZhdWx0cyBpZmYgdW5kZWZpbmVkIG9uIHRhcmdldC4gIFJldHVybnMgdGFyZ2V0LiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVXaXRoRGVmYXVsdHModGFyZ2V0OiBPYmplY3QsIGRlZmF1bHRzOiBPYmplY3QpOiBhbnkge1xyXG4gICAgZm9yIChsZXQgbmFtZSBpbiBkZWZhdWx0cykge1xyXG4gICAgICAgIGlmICh0YXJnZXRbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKiogU2V0IGN0b3IuZGVmYXVsdEluc3RhbmNlIHRvIGFuIGluc3RhbmNlIG9mIGN0b3Igd2l0aCBwcm9wZXJ0aWVzIGZyb20gdGFyZ2V0LlxyXG4gICAgV2Ugd2FudCB0byBpbnN1cmUgdGhhdCB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGN0b3IuZGVmYXVsdEluc3RhbmNlIGlzIGFsd2F5cyBpbW11dGFibGVcclxuICAgIFVzZSAndGFyZ2V0JyBhcyB0aGUgcHJpbWFyeSB0ZW1wbGF0ZSBmb3IgdGhlIGN0b3IuZGVmYXVsdEluc3RhbmNlO1xyXG4gICAgVXNlIGN1cnJlbnQgJ2N0b3IuZGVmYXVsdEluc3RhbmNlJyBhcyB0aGUgdGVtcGxhdGUgZm9yIGFueSBtaXNzaW5nIHByb3BlcnRpZXNcclxuICAgIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZm9yIGN0b3IuZGVmYXVsdEluc3RhbmNlXHJcbiAgICByZXR1cm5zIHRhcmdldCB1bmNoYW5nZWQgKi9cclxuZnVuY3Rpb24gc2V0QXNEZWZhdWx0KHRhcmdldDogT2JqZWN0LCBjdG9yOiB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnksIGRlZmF1bHRJbnN0YW5jZT86IGFueSB9KTogYW55IHtcclxuICAgIGN0b3IuZGVmYXVsdEluc3RhbmNlID0gdXBkYXRlV2l0aERlZmF1bHRzKG5ldyBjdG9yKHRhcmdldCksIGN0b3IuZGVmYXVsdEluc3RhbmNlKTtcclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gICAgJ3NvdXJjZScgaXMgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSB0cmFuc2Zvcm1lZCBpbnRvIGFub3RoZXJcclxuICAgICd0ZW1wbGF0ZScgaXMgYSBtYXAgd2hlcmUgdGhlXHJcbiAgICAgICBrZXlzOiBhcmUgdGhlIGtleXMgdG8gcmV0dXJuXHJcbiAgICAgICAgIGlmIGEga2V5IGNvbnRhaW5zICcsJ3MgdGhlbiB0aGUga2V5IGlzIHRyZWF0ZWQgYXMgYSBkZWxpbWl0ZWQgc3RyaW5nIHdpdGggZmlyc3Qgb2YgdGhlXHJcbiAgICAgICAgIGtleXMgYmVpbmcgdGhlIGtleSB0byByZXR1cm4gYW5kIHRoZSBvdGhlcnMgYWxsIHZhbGlkIGFsaWFzZXMgZm9yIHRoaXMga2V5XHJcbiAgICAgICAndmFsdWVzJyBhcmUgZWl0aGVyXHJcbiAgICAgICAgICAgMSkgdGhlICdkZWZhdWx0JyB2YWx1ZSBvZiB0aGUga2V5XHJcbiAgICAgICAgICAgMikgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGluIHRoZSBzb3VyY2UgdmFsdWUgYW5kIHNob3VsZCByZXR1cm4gdGhlIHZhbHVlIHRvIHNldFxyXG4gICAgICAgICBUaGUgdmFsdWUgZnJvbSB0aGUgc291cmNlIGlzIHRoZW4gc2V0IG9uIHRoZSB0YXJnZXQsXHJcbiAgICAgICAgIGFmdGVyIGZpcnN0IHBhc3NpbmcgdGhydSB0aGUgZm4sIGlmIHByb3ZpZGVkLCBVTkxFU1M6XHJcbiAgICAgICAgICAgMSkgaXQgaXMgdGhlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICAgICAyKSBpdCBpcyB1bmRlZmluZWQgKCBudWxscyBXSUxMIGJlIHNldClcclxuICAgICd0YXJnZXQnIGlzIG9wdGlvbmFsXHJcbiAgICAgICAtIGlmIGl0IGV4aXN0cyB0aGVuIHByb3BlcnRpZXMgb2YgdGhlIHRhcmdldCB3aWxsIGJlIHNldCAoIG92ZXJ3cml0dGVuIGlmIHRoZSBleGlzdClcclxuICAgICAgIC0gaWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiBhIG5ldyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIGFzIGZpbGxlZC5cclxuICAgICd0YXJnZXQgaXMgcmV0dXJuZWQuXHJcbiovXHJcbmZ1bmN0aW9uIHRvSnNvbihzb3VyY2U6IE9iamVjdCwgdGVtcGxhdGU6IE9iamVjdCwgdGFyZ2V0OiBPYmplY3QgPSB7fSk6IE9iamVjdCB7XHJcblxyXG4gICAgZm9yIChsZXQga2V5IGluIHRlbXBsYXRlKSB7XHJcbiAgICAgICAgbGV0IGFsaWFzZXMgPSBrZXkuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSB0ZW1wbGF0ZVtrZXldO1xyXG4gICAgICAgIC8vIHVzaW5nIHNvbWUgYXMgYSBmb3JFYWNoIHdpdGggYSAnYnJlYWsnXHJcbiAgICAgICAgYWxpYXNlcy5zb21lKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xyXG4gICAgICAgICAgICBpZiAoIShwcm9wTmFtZSBpbiBzb3VyY2UpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgZnVuY3Rpb25hbCBwcm9wZXJ0eSBkZWZpbmVkIHdpdGggdGhpcyBhbGlhcyAoIG5vdCB3aGF0IHdlIHdhbnQgdG8gcmVwbGFjZSkuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgLy8gJz09JyBpcyBkZWxpYmVyYXRlIGhlcmUgLSBpZGVhIGlzIHRoYXQgbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzIHdpbGwgbmV2ZXIgZ2V0IHNlcmlhbGl6ZWRcclxuICAgICAgICAgICAgLy8gaWYgZGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gbnVsbC5cclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBkZWZhdWx0VmFsdWUpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZGVmYXVsdFZhbHVlKSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJyZWV6ZUVudW0pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB0YXJnZXRbYWxpYXNlc1swXV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKiogUmVwbGFjZXIgZnVuY3Rpb24gZm9yIHRvSlNPTlNhZmUsIHdoZW4gc2VyaWFsaXppbmcgZW50aXRpZXMuICBFeGNsdWRlcyBlbnRpdHlBc3BlY3QgYW5kIG90aGVyIGludGVybmFsIHByb3BlcnRpZXMuICovXHJcbmZ1bmN0aW9uIHRvSlNPTlNhZmVSZXBsYWNlcihwcm9wOiBzdHJpbmcsIHZhbDogYW55KSB7XHJcbiAgICBpZiAocHJvcCA9PT0gXCJlbnRpdHlBc3BlY3RcIiB8fCBwcm9wID09PSBcImNvbXBsZXhBc3BlY3RcIiB8fCBwcm9wID09PSBcImVudGl0eVR5cGVcIiB8fCBwcm9wID09PSBcImNvbXBsZXhUeXBlXCJcclxuICAgICAgICB8fCBwcm9wID09PSBcImdldFByb3BlcnR5XCIgfHwgcHJvcCA9PT0gXCJzZXRQcm9wZXJ0eVwiXHJcbiAgICAgICAgfHwgcHJvcCA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IHByb3AuY2hhckF0KDApID09PSAnXycgfHwgcHJvcC5jaGFyQXQoMCkgPT09ICckJykgcmV0dXJuO1xyXG4gICAgcmV0dXJuIHZhbDtcclxufVxyXG5cclxuLyoqIFNhZmVseSBwZXJmb3JtIHRvSlNPTiBsb2dpYyBvbiBvYmplY3RzIHdpdGggY3ljbGVzLiAqL1xyXG5mdW5jdGlvbiB0b0pTT05TYWZlKG9iajogYW55LCByZXBsYWNlcj86IChwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSk6IGFueSB7XHJcbiAgICBpZiAob2JqICE9PSBPYmplY3Qob2JqKSkgcmV0dXJuIG9iajsgLy8gcHJpbWl0aXZlIHZhbHVlXHJcbiAgICBpZiAob2JqLl8kdmlzaXRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIGlmIChvYmoudG9KU09OKSB7XHJcbiAgICAgICAgbGV0IG5ld09iaiA9IG9iai50b0pTT04oKTtcclxuICAgICAgICBpZiAobmV3T2JqICE9PSBPYmplY3QobmV3T2JqKSkgcmV0dXJuIG5ld09iajsgLy8gcHJpbWl0aXZlIHZhbHVlXHJcbiAgICAgICAgaWYgKG5ld09iaiAhPT0gb2JqKSByZXR1cm4gdG9KU09OU2FmZShuZXdPYmosIHJlcGxhY2VyKTtcclxuICAgICAgICAvLyB0b0pTT04gcmV0dXJuZWQgdGhlIG9iamVjdCB1bmNoYW5nZWQuXHJcbiAgICAgICAgb2JqID0gbmV3T2JqO1xyXG4gICAgfVxyXG4gICAgb2JqLl8kdmlzaXRlZCA9IHRydWU7XHJcbiAgICBsZXQgcmVzdWx0OiBhbnk7XHJcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICByZXN1bHQgPSBvYmoubWFwKGZ1bmN0aW9uIChvOiBhbnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRvSlNPTlNhZmUobywgcmVwbGFjZXIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgKG9iaikgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBvYmopIHtcclxuICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiXyR2aXNpdGVkXCIpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBsZXQgdmFsID0gb2JqW3Byb3BdO1xyXG4gICAgICAgICAgICBpZiAocmVwbGFjZXIpIHtcclxuICAgICAgICAgICAgICAgIHZhbCA9IHJlcGxhY2VyKHByb3AsIHZhbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhbCA9IHRvSlNPTlNhZmUodmFsLCByZXBsYWNlcik7XHJcbiAgICAgICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgY29udGludWU7XHJcbiAgICAgICAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWxldGUgb2JqLl8kdmlzaXRlZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKiBSZXNvbHZlcyB0aGUgdmFsdWVzIG9mIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGJ5IGNoZWNraW5nIGVhY2ggcHJvcGVydHkgaW4gbXVsdGlwbGUgc291cmNlcyB1bnRpbCBhIHZhbHVlIGlzIGZvdW5kLiAqL1xyXG5mdW5jdGlvbiByZXNvbHZlUHJvcGVydGllcyhzb3VyY2VzOiBPYmplY3RbXSwgcHJvcGVydHlOYW1lczogc3RyaW5nW10pOiBhbnkge1xyXG4gICAgbGV0IHIgPSB7fTtcclxuICAgIGxldCBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcclxuICAgIHByb3BlcnR5TmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocG4pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBzcmMgPSBzb3VyY2VzW2ldO1xyXG4gICAgICAgICAgICBpZiAoc3JjKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gc3JjW3BuXTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJbcG5dID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuXHJcbi8vIGFycmF5IGZ1bmN0aW9uc1xyXG5cclxuZnVuY3Rpb24gdG9BcnJheShpdGVtOiBhbnkpOiBhbnlbXSB7XHJcbiAgICBpZiAoaXRlbSA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBbaXRlbV07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBhIHZlcnNpb24gb2YgQXJyYXkubWFwIHRoYXQgZG9lc24ndCByZXF1aXJlIGFuIGFycmF5LCBpLmUuIHdvcmtzIG9uIGFycmF5cyBhbmQgc2NhbGFycy4gKi9cclxuLy8gZnVuY3Rpb24gbWFwPFQsIFU+KGl0ZW1zOiBUIHwgVFtdLCBmbjogKHY6IFQsIGl4PzogbnVtYmVyKSA9PiBVLCBpbmNsdWRlTnVsbD86IGJvb2xlYW4pOiBVIHwgVVtdIHtcclxuIGZ1bmN0aW9uIG1hcDxUPihpdGVtczogVCB8IFRbXSwgZm46ICh2OiBULCBpeD86IG51bWJlcikgPT4gYW55LCBpbmNsdWRlTnVsbD86IGJvb2xlYW4pOiBhbnkgfCBhbnlbXSB7XHJcbiAgICAvLyB3aGV0aGVyIHRvIHJldHVybiBudWxscyBpbiBhcnJheSBvZiByZXN1bHRzOyBkZWZhdWx0ID0gdHJ1ZTtcclxuICAgIGluY2x1ZGVOdWxsID0gaW5jbHVkZU51bGwgPT0gbnVsbCA/IHRydWUgOiBpbmNsdWRlTnVsbDtcclxuICAgIGlmIChpdGVtcyA9PSBudWxsKSByZXR1cm4gaXRlbXM7XHJcbiAgICAvLyBsZXQgcmVzdWx0OiBVW107XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHY6IGFueSwgaXg6IG51bWJlcikge1xyXG4gICAgICAgICAgICBsZXQgciA9IGZuKHYsIGl4KTtcclxuICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCB8fCBpbmNsdWRlTnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2l4XSA9IHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZm4oaXRlbXMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4vKiogUmV0dXJuIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgcHJlZGljYXRlICovXHJcbmZ1bmN0aW9uIGFycmF5Rmlyc3Q8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiBQcmVkaWNhdGU8YW55Pik6IFQ7XHJcbmZ1bmN0aW9uIGFycmF5Rmlyc3Q8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiBQcmVkaWNhdGU8VD4pIHtcclxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5W2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcblxyXG4vKiogUmV0dXJuIGluZGV4IG9mIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgcHJlZGljYXRlICovXHJcbmZ1bmN0aW9uIGFycmF5SW5kZXhPZjxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxhbnk+KTogbnVtYmVyO1xyXG5mdW5jdGlvbiBhcnJheUluZGV4T2Y8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiBQcmVkaWNhdGU8VD4pOiBudW1iZXIge1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2ldKSkgcmV0dXJuIGk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbn1cclxuXHJcbi8qKiBBZGQgaXRlbSBpZiBub3QgYWxyZWFkeSBpbiBhcnJheSAqL1xyXG5mdW5jdGlvbiBhcnJheUFkZEl0ZW1VbmlxdWU8VD4oYXJyYXk6IFRbXSwgaXRlbTogVCkge1xyXG4gICAgbGV0IGl4ID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcclxuICAgIGlmIChpeCA9PT0gLTEpIGFycmF5LnB1c2goaXRlbSk7XHJcbn1cclxuXHJcbi8qKiBSZW1vdmUgaXRlbXMgZnJvbSB0aGUgYXJyYXlcclxuICogQHBhcmFtIGFycmF5XHJcbiAqIEBwYXJhbSBwcmVkaWNhdGVPckl0ZW0gLSBpdGVtIHRvIHJlbW92ZSwgb3IgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIG1hdGNoaW5nIGl0ZW1cclxuICogQHBhcmFtIHNob3VsZFJlbW92ZU11bHRpcGxlIC0gdHJ1ZSB0byBrZWVwIHJlbW92aW5nIGFmdGVyIGZpcnN0IG1hdGNoLCBmYWxzZSBvdGhlcndpc2VcclxuICovXHJcbmZ1bmN0aW9uIGFycmF5UmVtb3ZlSXRlbTxUPihhcnJheTogVFtdLCBwcmVkaWNhdGVPckl0ZW06IFQgfCBQcmVkaWNhdGU8VD4gLCBzaG91bGRSZW1vdmVNdWx0aXBsZT86IGJvb2xlYW4pIHtcclxuICAgIGxldCBwcmVkaWNhdGUgPSAoaXNGdW5jdGlvbihwcmVkaWNhdGVPckl0ZW0pID8gcHJlZGljYXRlT3JJdGVtIDogdW5kZWZpbmVkKSBhcyBQcmVkaWNhdGU8VD47XHJcbiAgICBsZXQgbGFzdEl4ID0gYXJyYXkubGVuZ3RoIC0gMTtcclxuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gbGFzdEl4OyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIGlmIChwcmVkaWNhdGUgPyBwcmVkaWNhdGUoYXJyYXlbaV0pIDogKGFycmF5W2ldID09PSBwcmVkaWNhdGVPckl0ZW0pKSB7XHJcbiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkUmVtb3ZlTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlbW92ZWQ7XHJcbn1cclxuXHJcbi8qKiBDb21iaW5lIGFycmF5IGVsZW1lbnRzIHVzaW5nIHRoZSBjYWxsYmFjay4gIFJldHVybnMgYXJyYXkgd2l0aCBsZW5ndGggPT0gbWluKGExLmxlbmd0aCwgYTIubGVuZ3RoKSAqL1xyXG5mdW5jdGlvbiBhcnJheVppcChhMTogYW55W10sIGEyOiBhbnlbXSwgY2FsbGJhY2s6ICh4MTogYW55LCB4MjogYW55KSA9PiBhbnkpOiBhbnlbXSB7XHJcbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gICAgbGV0IG4gPSBNYXRoLm1pbihhMS5sZW5ndGgsIGEyLmxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrKGExW2ldLCBhMltpXSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLy9mdW5jdGlvbiBhcnJheURpc3RpbmN0KGFycmF5KSB7XHJcbi8vICAgIGFycmF5ID0gYXJyYXkgfHwgW107XHJcbi8vICAgIGxldCByZXN1bHQgPSBbXTtcclxuLy8gICAgZm9yIChsZXQgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuLy8gICAgICAgIGlmIChyZXN1bHQuaW5kZXhPZihhcnJheVtpXSkgPCAwKVxyXG4vLyAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFycmF5W2ldKTtcclxuLy8gICAgfVxyXG4vLyAgICByZXR1cm4gcmVzdWx0O1xyXG4vL31cclxuXHJcbi8vIE5vdCB5ZXQgbmVlZGVkXHJcbi8vLy8gbXVjaCBmYXN0ZXIgYnV0IG9ubHkgd29ya3Mgb24gYXJyYXkgaXRlbXMgd2l0aCBhIHRvU3RyaW5nIG1ldGhvZCB0aGF0XHJcbi8vLy8gcmV0dXJucyBkaXN0aW5jdCBzdHJpbmcgZm9yIGRpc3RpbmN0IG9iamVjdHMuICBTbyB0aGlzIGlzIHNhZmUgZm9yIGFycmF5cyB3aXRoIHByaW1pdGl2ZVxyXG4vLy8vIHR5cGVzIGJ1dCBub3QgZm9yIGFycmF5cyB3aXRoIG9iamVjdCB0eXBlcywgdW5sZXNzIHRvU3RyaW5nKCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQuXHJcbi8vZnVuY3Rpb24gYXJyYXlEaXN0aW5jdFVuc2FmZShhcnJheSkge1xyXG4vLyAgICBsZXQgbyA9IHt9LCBpLCBsID0gYXJyYXkubGVuZ3RoLCByID0gW107XHJcbi8vICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpICs9IDEpIHtcclxuLy8gICAgICAgIGxldCB2ID0gYXJyYXlbaV07XHJcbi8vICAgICAgICBvW3ZdID0gdjtcclxuLy8gICAgfVxyXG4vLyAgICBmb3IgKGkgaW4gbykgci5wdXNoKG9baV0pO1xyXG4vLyAgICByZXR1cm4gcjtcclxuLy99XHJcblxyXG5mdW5jdGlvbiBhcnJheUVxdWFscyhhMTogYW55W10sIGEyOiBhbnlbXSwgZXF1YWxzRm4/OiAoeDE6IGFueSwgeDI6IGFueSkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgLy9DaGVjayBpZiB0aGUgYXJyYXlzIGFyZSB1bmRlZmluZWQvbnVsbFxyXG4gICAgaWYgKCFhMSB8fCAhYTIpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoYTEubGVuZ3RoICE9PSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvL2dvIHRocnUgYWxsIHRoZSB2YXJzXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy9pZiB0aGUgbGV0IGlzIGFuIGFycmF5LCB3ZSBuZWVkIHRvIG1ha2UgYSByZWN1cnNpdmUgY2hlY2tcclxuICAgICAgICAvL290aGVyd2lzZSB3ZSdsbCBqdXN0IGNvbXBhcmUgdGhlIHZhbHVlc1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFycmF5RXF1YWxzKGExW2ldLCBhMltpXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZXF1YWxzRm4pIHtcclxuICAgICAgICAgICAgICAgIGlmICghZXF1YWxzRm4oYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGExW2ldICE9PSBhMltpXSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbi8vIGVuZCBvZiBhcnJheSBmdW5jdGlvbnNcclxuXHJcbi8qKiBSZXR1cm5zIGFuIGFycmF5IGZvciBhIHNvdXJjZSBhbmQgYSBwcm9wLCBhbmQgY3JlYXRlcyB0aGUgcHJvcCBpZiBuZWVkZWQuICovXHJcbmZ1bmN0aW9uIGdldEFycmF5KHNvdXJjZTogT2JqZWN0LCBwcm9wTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG4gICAgbGV0IGFyciA9IHNvdXJjZVtwcm9wTmFtZV07XHJcbiAgICBpZiAoIWFycikge1xyXG4gICAgICAgIGFyciA9IFtdO1xyXG4gICAgICAgIHNvdXJjZVtwcm9wTmFtZV0gPSBhcnI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXJyO1xyXG59XHJcblxyXG4vKiogQ2FsbHMgcmVxdWlyZUxpYkNvcmUgb24gc2VtaWNvbG9uLXNlcGFyYXRlZCBsaWJOYW1lcyAqL1xyXG5mdW5jdGlvbiByZXF1aXJlTGliKGxpYk5hbWVzOiBzdHJpbmcsIGVyck1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgIGxldCBhcnJOYW1lcyA9IGxpYk5hbWVzLnNwbGl0KFwiO1wiKTtcclxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gYXJyTmFtZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGxpYiA9IHJlcXVpcmVMaWJDb3JlKGFyck5hbWVzW2ldKTtcclxuICAgICAgICBpZiAobGliKSByZXR1cm4gbGliO1xyXG4gICAgfVxyXG4gICAgaWYgKGVyck1lc3NhZ2UpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBcIiArIGxpYk5hbWVzICsgXCIuICBcIiArIGVyck1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcbi8qKiBSZXR1cm5zIHRoZSAnbGliTmFtZScgbW9kdWxlIGlmIGxvYWRlZCBvciBlbHNlIHJldHVybnMgdW5kZWZpbmVkICovXHJcbmZ1bmN0aW9uIHJlcXVpcmVMaWJDb3JlKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgbGV0IHdpbiA9IHdpbmRvdyB8fCAoZ2xvYmFsID8gZ2xvYmFsLndpbmRvdyA6IHVuZGVmaW5lZCk7XHJcbiAgICBpZiAoIXdpbikgcmV0dXJuOyAvLyBNdXN0IHJ1biBpbiBhIGJyb3dzZXIuIFRvZG86IGFkZCBjb21tb25qcyBzdXBwb3J0XHJcblxyXG4gICAgLy8gZ2V0IGxpYnJhcnkgZnJvbSBicm93c2VyIGdsb2JhbHMgaWYgd2UgY2FuXHJcbiAgICBsZXQgbGliID0gd2luW2xpYk5hbWVdO1xyXG4gICAgaWYgKGxpYikgcmV0dXJuIGxpYjtcclxuXHJcbiAgICAvLyBpZiByZXF1aXJlIGV4aXN0cywgbWF5YmUgcmVxdWlyZSBjYW4gZ2V0IGl0LlxyXG4gICAgLy8gVGhpcyBtZXRob2QgaXMgc3luY2hyb25vdXMgc28gaXQgY2FuJ3QgbG9hZCBtb2R1bGVzIHdpdGggQU1ELlxyXG4gICAgLy8gSXQgY2FuIG9ubHkgb2J0YWluIG1vZHVsZXMgZnJvbSByZXF1aXJlIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkLlxyXG4gICAgLy8gRGV2ZWxvcGVyIHNob3VsZCBib290c3RyYXAgc3VjaCB0aGF0IHRoZSBicmVlemUgbW9kdWxlXHJcbiAgICAvLyBsb2FkcyBhZnRlciBhbGwgb3RoZXIgbGlicmFyaWVzIHRoYXQgYnJlZXplIHNob3VsZCBmaW5kIHdpdGggdGhpcyBtZXRob2RcclxuICAgIC8vIFNlZSBkb2N1bWVudGF0aW9uXHJcbiAgICBsZXQgciA9IHdpbi5yZXF1aXJlO1xyXG4gICAgaWYgKHIpIHsgLy8gaWYgcmVxdWlyZSBleGlzdHNcclxuICAgICAgICBpZiAoci5kZWZpbmVkKSB7IC8vIHJlcXVpcmUuZGVmaW5lZCBpcyBub3Qgc3RhbmRhcmQgYW5kIG1heSBub3QgZXhpc3RcclxuICAgICAgICAgICAgLy8gcmVxdWlyZS5kZWZpbmVkIHJldHVybnMgdHJ1ZSBpZiBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkXHJcbiAgICAgICAgICAgIHJldHVybiByLmRlZmluZWQobGliTmFtZSkgPyByKGxpYk5hbWUpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHJlcXVpcmUuZGVmaW5lZCBkb2VzIG5vdCBleGlzdCBzbyB3ZSBoYXZlIHRvIGNhbGwgcmVxdWlyZSgnbGliTmFtZScpIGRpcmVjdGx5LlxyXG4gICAgICAgICAgICAvLyBUaGUgcmVxdWlyZSgnbGliTmFtZScpIG92ZXJsb2FkIGlzIHN5bmNocm9ub3VzIGFuZCBkb2VzIG5vdCBsb2FkIG1vZHVsZXMuXHJcbiAgICAgICAgICAgIC8vIEl0IHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIG1vZHVsZSBpc24ndCBhbHJlYWR5IGxvYWRlZC5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByKGxpYk5hbWUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZXF1aXJlKCdsaWJOYW1lJykgdGhyZXcgYmVjYXVzZSBtb2R1bGUgbm90IGxvYWRlZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogRXhlY3V0ZSBmbiB3aGlsZSBvYmogaGFzIHRlbXBWYWx1ZSBmb3IgcHJvcGVydHkgKi9cclxuZnVuY3Rpb24gdXNpbmcob2JqOiBPYmplY3QsIHByb3BlcnR5OiBzdHJpbmcsIHRlbXBWYWx1ZTogYW55LCBmbjogKCkgPT4gYW55KSB7XHJcbiAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9ialtwcm9wZXJ0eV07XHJcbiAgICBpZiAodGVtcFZhbHVlID09PSBvcmlnaW5hbFZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZuKCk7XHJcbiAgICB9XHJcbiAgICBvYmpbcHJvcGVydHldID0gdGVtcFZhbHVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZm4oKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWxldGUgb2JqW3Byb3BlcnR5XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvYmpbcHJvcGVydHldID0gb3JpZ2luYWxWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBDYWxsIHN0YXRlID0gc3RhcnRGbigpLCBjYWxsIGZuKCksIGNhbGwgZW5kRm4oc3RhdGUpICovXHJcbmZ1bmN0aW9uIHdyYXBFeGVjdXRpb24oc3RhcnRGbjogKCkgPT4gYW55LCBlbmRGbjogKHN0YXRlOiBhbnkpID0+IGFueSwgZm46ICgpID0+IGFueSkge1xyXG4gICAgbGV0IHN0YXRlOiBhbnk7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHN0YXRlID0gc3RhcnRGbigpO1xyXG4gICAgICAgIHJldHVybiBmbigpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHN0YXRlKSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBlbmRGbihzdGF0ZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBSZW1lbWJlciAmIHJldHVybiB0aGUgdmFsdWUgb2YgZm4oKSB3aGVuIGl0IHdhcyBjYWxsZWQgd2l0aCBpdHMgY3VycmVudCBhcmdzICovXHJcbmZ1bmN0aW9uIG1lbW9pemUoZm46IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBhcmdzID0gYXJyYXlTbGljZSg8YW55PmFyZ3VtZW50cyksXHJcbiAgICAgICAgICAgIGhhc2ggPSBcIlwiLFxyXG4gICAgICAgICAgICBpID0gYXJncy5sZW5ndGgsXHJcbiAgICAgICAgICAgIGN1cnJlbnRBcmc6IGFueSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgICBjdXJyZW50QXJnID0gYXJnc1tpXTtcclxuICAgICAgICAgICAgaGFzaCArPSAoY3VycmVudEFyZyA9PT0gT2JqZWN0KGN1cnJlbnRBcmcpKSA/IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRBcmcpIDogY3VycmVudEFyZztcclxuICAgICAgICAgICAgZm4ubWVtb2l6ZSB8fCAoZm4ubWVtb2l6ZSA9IHt9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChoYXNoIGluIGZuLm1lbW9pemUpID9cclxuICAgICAgICAgICAgZm4ubWVtb2l6ZVtoYXNoXSA6XHJcbiAgICAgICAgICAgIGZuLm1lbW9pemVbaGFzaF0gPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFV1aWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbiAgICAgICAgbGV0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkdXJhdGlvblRvU2Vjb25kcyhkdXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICAvLyBiYXNpYyBhbGdvcml0aG0gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbmV6YXNhL2lzbzg2MDEtanMtcGVyaW9kXHJcbiAgICBpZiAodHlwZW9mIGR1cmF0aW9uICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIElTTzg2MDEgZHVyYXRpb24gJ1wiICsgZHVyYXRpb24gKyBcIidcIik7XHJcblxyXG4gICAgLy8gcmVnZXggc3BsaXRzIGFzIGZvbGxvd3MgLSBncnAwLCBncnAxLCB5LCBtLCBkLCBncnAyLCBoLCBtLCBzXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgIDEgICAgIDIgIDMgIDQgIDUgICAgIDYgIDcgIDhcclxuICAgIGxldCBzdHJ1Y3QgPSAvXlAoKFxcZCtZKT8oXFxkK00pPyhcXGQrRCk/KT8oVChcXGQrSCk/KFxcZCtNKT8oXFxkK1MpPyk/JC8uZXhlYyhkdXJhdGlvbik7XHJcbiAgICBpZiAoIXN0cnVjdCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBJU084NjAxIGR1cmF0aW9uICdcIiArIGR1cmF0aW9uICsgXCInXCIpO1xyXG5cclxuICAgIGxldCB5bWRobXNJbmRleGVzID0gWzIsIDMsIDQsIDYsIDcsIDhdOyAvLyAtPiBncnAxLHksbSxkLGdycDIsaCxtLHNcclxuICAgIGxldCBmYWN0b3JzID0gWzMxMTA0MDAwLCAvLyB5ZWFyICgzNjAqMjQqNjAqNjApXHJcbiAgICAgICAgMjU5MjAwMCwgICAgICAgICAgICAgLy8gbW9udGggKDMwKjI0KjYwKjYwKVxyXG4gICAgICAgIDg2NDAwLCAgICAgICAgICAgICAgIC8vIGRheSAoMjQqNjAqNjApXHJcbiAgICAgICAgMzYwMCwgICAgICAgICAgICAgICAgLy8gaG91ciAoNjAqNjApXHJcbiAgICAgICAgNjAsICAgICAgICAgICAgICAgICAgLy8gbWludXRlICg2MClcclxuICAgICAgICAxXTsgICAgICAgICAgICAgICAgICAvLyBzZWNvbmQgKDEpXHJcblxyXG4gICAgbGV0IHNlY29uZHMgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcclxuICAgICAgICBsZXQgZGlnaXQgPSBzdHJ1Y3RbeW1kaG1zSW5kZXhlc1tpXV07XHJcbiAgICAgICAgLy8gcmVtb3ZlIGxldHRlcnMsIHJlcGxhY2UgYnkgMCBpZiBub3QgZGVmaW5lZFxyXG4gICAgICAgIGRpZ2l0ID0gPGFueT4oZGlnaXQgPyArZGlnaXQucmVwbGFjZSgvW0EtWmEtel0rL2csICcnKSA6IDApO1xyXG4gICAgICAgIHNlY29uZHMgKz0gPGFueT5kaWdpdCAqIGZhY3RvcnNbaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2Vjb25kcztcclxuXHJcbn1cclxuXHJcbi8vIGlzIGZ1bmN0aW9uc1xyXG5cclxuZnVuY3Rpb24gbm9vcCgpIHtcclxuICAgIC8vIGRvZXMgbm90aGluZ1xyXG59XHJcblxyXG5mdW5jdGlvbiBpZGVudGl0eSh4OiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIHg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsYXNzb2YobzogYW55KSB7XHJcbiAgICBpZiAobyA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcclxuICAgIH1cclxuICAgIGlmIChvID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcclxuICAgIH1cclxuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRGF0ZShvOiBhbnkpIHtcclxuICAgIHJldHVybiBjbGFzc29mKG8pID09PSBcImRhdGVcIiAmJiAhaXNOYU4oby5nZXRUaW1lKCkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0RhdGVTdHJpbmcoczogc3RyaW5nKSB7XHJcbiAgICAvLyBsZXQgcnggPSAvXihcXGR7NH18WytcXC1dXFxkezZ9KSg/Oi0oXFxkezJ9KSg/Oi0oXFxkezJ9KSk/KT8oPzpUKFxcZHsyfSk6KFxcZHsyfSkoPzo6KFxcZHsyfSkoPzpcXC4oXFxkezN9KSk/KT8oPzooWil8KFsrXFwtXSkoXFxkezJ9KSg/OjooXFxkezJ9KSk/KT8pPyQvO1xyXG4gICAgbGV0IHJ4ID0gL14oKFxcZHs0fS1bMDFdXFxkLVswLTNdXFxkVFswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkXFwuXFxkKyhbKy1dWzAtMl1cXGQ6WzAtNV1cXGR8WikpfChcXGR7NH0tWzAxXVxcZC1bMC0zXVxcZFRbMC0yXVxcZDpbMC01XVxcZDpbMC01XVxcZChbKy1dWzAtMl1cXGQ6WzAtNV1cXGR8WikpfChcXGR7NH0tWzAxXVxcZC1bMC0zXVxcZFRbMC0yXVxcZDpbMC01XVxcZChbKy1dWzAtMl1cXGQ6WzAtNV1cXGR8WikpKSQvO1xyXG4gICAgcmV0dXJuICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIikgJiYgcngudGVzdChzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNGdW5jdGlvbihvOiBhbnkpIHtcclxuICAgIHJldHVybiBjbGFzc29mKG8pID09PSBcImZ1bmN0aW9uXCI7XHJcbn1cclxuXHJcbi8vIGZ1bmN0aW9uIGlzU3RyaW5nKG86IGFueSkge1xyXG4vLyAgICAgcmV0dXJuICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIik7XHJcbi8vIH1cclxuXHJcbi8vIGZ1bmN0aW9uIGlzT2JqZWN0KG86IGFueSkge1xyXG4vLyAgICAgcmV0dXJuICh0eXBlb2YgbyA9PT0gXCJvYmplY3RcIik7XHJcbi8vIH1cclxuXHJcbmZ1bmN0aW9uIGlzR3VpZCh2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgJiYgL1thLWZBLUZcXGRdezh9LSg/OlthLWZBLUZcXGRdezR9LSl7M31bYS1mQS1GXFxkXXsxMn0vLnRlc3QodmFsdWUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0R1cmF0aW9uKHZhbHVlOiBhbnkpIHtcclxuICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSAmJiAvXigtfCk/UFtUXT9bXFxkXFwuLFxcLV0rW1lNRFRIU10vLnRlc3QodmFsdWUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0VtcHR5KG9iajogYW55KSB7XHJcbiAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwga2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzTnVtZXJpYyhuOiBhbnkpIHtcclxuICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChuKSkgJiYgaXNGaW5pdGUobik7XHJcbn1cclxuXHJcblxyXG5cclxuLy8gZW5kIG9mIGlzIEZ1bmN0aW9uc1xyXG5cclxuLy8gc3RyaW5nIGZ1bmN0aW9uc1xyXG5cclxuZnVuY3Rpb24gc3RyaW5nU3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcclxuICAgIC8vIHJldHVybnMgdHJ1ZSBmb3IgZW1wdHkgc3RyaW5nIG9yIG51bGwgcHJlZml4XHJcbiAgICBpZiAoKCFzdHIpKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAocHJlZml4ID09PSBcIlwiIHx8IHByZWZpeCA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBzdHIuaW5kZXhPZihwcmVmaXgsIDApID09PSAwO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdHJpbmdFbmRzV2l0aChzdHI6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpIHtcclxuICAgIC8vIHJldHVybnMgdHJ1ZSBmb3IgZW1wdHkgc3RyaW5nIG9yIG51bGwgc3VmZml4XHJcbiAgICBpZiAoKCFzdHIpKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAoc3VmZml4ID09PSBcIlwiIHx8IHN1ZmZpeCA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBzdHIuaW5kZXhPZihzdWZmaXgsIHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSAhPT0gLTE7XHJcbn1cclxuXHJcbi8vIEJhc2VkIG9uIGZyYWdtZW50IGZyb20gRGVhbiBFZHdhcmRzJyBCYXNlIDIgbGlicmFyeVxyXG4vKiogZm9ybWF0KFwiYSAlMSBhbmQgYSAlMlwiLCBcImNhdFwiLCBcImRvZ1wiKSAtPiBcImEgY2F0IGFuZCBhIGRvZ1wiICovXHJcbmZ1bmN0aW9uIGZvcm1hdFN0cmluZyhzdHI6IHN0cmluZywgLi4ucGFyYW1zOiBhbnlbXSkge1xyXG4gICAgbGV0IGFyZ3MgPSBhcmd1bWVudHM7XHJcbiAgICBsZXQgcGF0dGVybiA9IFJlZ0V4cChcIiUoWzEtXCIgKyAoYXJndW1lbnRzLmxlbmd0aCAtIDEpICsgXCJdKVwiLCBcImdcIik7XHJcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocGF0dGVybiwgZnVuY3Rpb24gKG1hdGNoLCBpbmRleCkge1xyXG4gICAgICAgIHJldHVybiBhcmdzW2luZGV4XTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vLyBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83MjI1NDA3L2NvbnZlcnQtY2FtZWxjYXNldGV4dC10by1jYW1lbC1jYXNlLXRleHRcclxuLyoqIENoYW5nZSB0ZXh0IHRvIHRpdGxlIGNhc2Ugd2l0aCBzcGFjZXMsIGUuZy4gJ215UHJvcGVydHlOYW1lMTInIHRvICdNeSBQcm9wZXJ0eSBOYW1lIDEyJyAqL1xyXG5sZXQgY2FtZWxFZGdlcyA9IC8oW0EtWl0oPz1bQS1aXVthLXpdKXxbXkEtWl0oPz1bQS1aXSl8W2EtekEtWl0oPz1bXmEtekEtWl0pKS9nO1xyXG5mdW5jdGlvbiB0aXRsZUNhc2VTcGFjZSh0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoY2FtZWxFZGdlcywgJyQxICcpO1xyXG4gICAgdGV4dCA9IHRleHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXh0LnNsaWNlKDEpO1xyXG4gICAgcmV0dXJuIHRleHQ7XHJcbn1cclxuXHJcbi8vIGVuZCBvZiBzdHJpbmcgZnVuY3Rpb25zXHJcblxyXG4vLyBTZWUgTWFyayBNaWxsZXLigJlzIGV4cGxhbmF0aW9uIG9mIHdoYXQgdGhpcyBkb2VzLlxyXG4vLyBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1jb252ZW50aW9uczpzYWZlX21ldGFfcHJvZ3JhbW1pbmdcclxuZnVuY3Rpb24gdW5jdXJyeShmOiBhbnkpIHtcclxuICAgIGxldCBjYWxsID0gRnVuY3Rpb24uY2FsbDtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGNhbGwuYXBwbHkoZiwgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIHNoaW1zXHJcblxyXG5pZiAoIU9iamVjdC5jcmVhdGUpIHtcclxuICAgIE9iamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAocGFyZW50OiBhbnkpIHtcclxuICAgICAgICBsZXQgRiA9IDxhbnk+ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgRi5wcm90b3R5cGUgPSBwYXJlbnQ7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGKCk7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vLyBzdHJpbmdzIGZvciBlcnJvciBtZXNzYWdlc1xyXG5cclxuY29uc3Qgc3RyaW5ncyA9IHtcclxuICAgIFwiVE9fVFlQRVwiOiBcIkFkZCAnRW50aXR5UXVlcnkudG9UeXBlKCknIHRvIHlvdXIgcXVlcnksIG9yIGNhbGwgJ01ldGFkYXRhU3RvcmUuc2V0RW50aXR5VHlwZUZvclJlc291cmNlTmFtZSgpJyB0byByZWdpc3RlciBhbiBFbnRpdHlUeXBlIGZvciB0aGlzIHJlc291cmNlTmFtZS5cIlxyXG59XHJcblxyXG4vLyAvLyBub3QgYWxsIG1ldGhvZHMgYWJvdmUgYXJlIGV4cG9ydGVkXHJcbmV4cG9ydCBjb25zdCBjb3JlID0ge1xyXG4gICAgaXNFUzVTdXBwb3J0ZWQ6IGlzRVM1U3VwcG9ydGVkLFxyXG4gICAgaGFzT3duUHJvcGVydHk6IGhhc093blByb3BlcnR5LFxyXG4gICAgZ2V0T3duUHJvcGVydHlWYWx1ZXM6IGdldE93blByb3BlcnR5VmFsdWVzLFxyXG4gICAgZ2V0UHJvcGVydHlEZXNjcmlwdG9yOiBnZXRQcm9wRGVzY3JpcHRvcixcclxuICAgIG9iamVjdEZvckVhY2g6IG9iamVjdEZvckVhY2gsXHJcbiAgICBvYmplY3RGaXJzdDogb2JqZWN0Rmlyc3QsXHJcbiAgICBvYmplY3RNYXA6IG9iamVjdE1hcCwgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIHN0cm9uZ2x5IHR5cGVkLlxyXG4gICAgZXh0ZW5kOiBleHRlbmQsXHJcbiAgICBwcm9wRXE6IHByb3BFcSxcclxuICAgIHByb3BzRXE6IHByb3BzRXEsXHJcbiAgICBwbHVjazogcGx1Y2ssXHJcbiAgICBtYXA6IG1hcCxcclxuICAgIHJlc29sdmVQcm9wZXJ0aWVzOiByZXNvbHZlUHJvcGVydGllcyxcclxuICAgIHNldEFzRGVmYXVsdDogc2V0QXNEZWZhdWx0LFxyXG4gICAgdXBkYXRlV2l0aERlZmF1bHRzOiB1cGRhdGVXaXRoRGVmYXVsdHMsXHJcbiAgICBnZXRBcnJheTogZ2V0QXJyYXksXHJcbiAgICB0b0FycmF5OiB0b0FycmF5LFxyXG4gICAgYXJyYXlFcXVhbHM6IGFycmF5RXF1YWxzLFxyXG4gICAgYXJyYXlTbGljZTogYXJyYXlTbGljZSxcclxuICAgIGFycmF5Rmlyc3Q6IGFycmF5Rmlyc3QsXHJcbiAgICBhcnJheUluZGV4T2Y6IGFycmF5SW5kZXhPZixcclxuICAgIGFycmF5UmVtb3ZlSXRlbTogYXJyYXlSZW1vdmVJdGVtLFxyXG4gICAgYXJyYXlaaXA6IGFycmF5WmlwLFxyXG4gICAgYXJyYXlBZGRJdGVtVW5pcXVlOiBhcnJheUFkZEl0ZW1VbmlxdWUsXHJcbiAgICBhcnJheUZsYXRNYXA6IGFycmF5RmxhdE1hcCxcclxuXHJcbiAgICByZXF1aXJlTGliOiByZXF1aXJlTGliLFxyXG4gICAgdXNpbmc6IHVzaW5nLFxyXG4gICAgd3JhcEV4ZWN1dGlvbjogd3JhcEV4ZWN1dGlvbixcclxuXHJcbiAgICBtZW1vaXplOiBtZW1vaXplLFxyXG4gICAgZ2V0VXVpZDogZ2V0VXVpZCxcclxuICAgIGR1cmF0aW9uVG9TZWNvbmRzOiBkdXJhdGlvblRvU2Vjb25kcyxcclxuXHJcbiAgICBpc1NldHRhYmxlOiBpc1NldHRhYmxlLFxyXG5cclxuICAgIGlzRGF0ZTogaXNEYXRlLFxyXG4gICAgaXNEYXRlU3RyaW5nOiBpc0RhdGVTdHJpbmcsXHJcbiAgICBpc0d1aWQ6IGlzR3VpZCxcclxuICAgIGlzRHVyYXRpb246IGlzRHVyYXRpb24sXHJcbiAgICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxyXG4gICAgaXNFbXB0eTogaXNFbXB0eSxcclxuICAgIGlzTnVtZXJpYzogaXNOdW1lcmljLFxyXG5cclxuICAgIGlkZW50aXR5OiBpZGVudGl0eSxcclxuICAgIG5vb3A6IG5vb3AsXHJcblxyXG4gICAgc3RyaW5nU3RhcnRzV2l0aDogc3RyaW5nU3RhcnRzV2l0aCxcclxuICAgIHN0cmluZ0VuZHNXaXRoOiBzdHJpbmdFbmRzV2l0aCxcclxuICAgIGZvcm1hdFN0cmluZzogZm9ybWF0U3RyaW5nLFxyXG4gICAgdGl0bGVDYXNlOiB0aXRsZUNhc2VTcGFjZSxcclxuXHJcbiAgICB0b0pzb246IHRvSnNvbixcclxuICAgIHRvSlNPTlNhZmU6IHRvSlNPTlNhZmUsXHJcbiAgICB0b0pTT05TYWZlUmVwbGFjZXI6IHRvSlNPTlNhZmVSZXBsYWNlcixcclxuXHJcbiAgICBzdHJpbmdzOiBzdHJpbmdzXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yQ2FsbGJhY2sge1xyXG4gICAgKGVycm9yOiBhbnkpOiB2b2lkO1xyXG59XHJcblxyXG5cclxuLy8gVW51c2VkXHJcbi8qXHJcbi8vIHJldHVybnMgdHJ1ZSBmb3IgYm9vbGVhbnMsIG51bWJlcnMsIHN0cmluZ3MgYW5kIGRhdGVzXHJcbi8vIGZhbHNlIGZvciBudWxsLCBhbmQgbm9uLWRhdGUgb2JqZWN0cywgZnVuY3Rpb25zLCBhbmQgYXJyYXlzXHJcbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKG9iajogYW55KSB7XHJcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIHRydWUgZm9yIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW5zIGFuZCBudWxsLCBmYWxzZSBmb3Igb2JqZWN0c1xyXG4gICAgaWYgKG9iaiAhPSBPYmplY3Qob2JqKSkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gaXNEYXRlKG9iaik7XHJcbn1cclxuXHJcbiovIl19