@carto/kepler.gl 0.0.74 → 0.0.75-alpha.deckv9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/dist/actions/action-wrapper.js +20 -48
  2. package/dist/actions/actions.js +10 -19
  3. package/dist/actions/identity-actions.js +8 -17
  4. package/dist/actions/index.js +7 -24
  5. package/dist/actions/map-state-actions.js +10 -19
  6. package/dist/actions/map-style-actions.js +20 -35
  7. package/dist/actions/provider-actions.js +26 -42
  8. package/dist/actions/ui-state-actions.js +42 -70
  9. package/dist/actions/vis-state-actions.js +102 -162
  10. package/dist/cloud-providers/index.js +8 -8
  11. package/dist/cloud-providers/provider.js +55 -94
  12. package/dist/components/bottom-widget.js +47 -48
  13. package/dist/components/common/action-panel.js +39 -38
  14. package/dist/components/common/animation-control/animation-control.js +40 -38
  15. package/dist/components/common/animation-control/animation-controller.js +47 -70
  16. package/dist/components/common/animation-control/animation-speed-slider.js +28 -38
  17. package/dist/components/common/animation-control/floating-time-display.js +56 -67
  18. package/dist/components/common/animation-control/playback-controls.js +64 -80
  19. package/dist/components/common/animation-control/speed-control.js +26 -24
  20. package/dist/components/common/checkbox.js +31 -52
  21. package/dist/components/common/color-legend.js +40 -72
  22. package/dist/components/common/data-table/button.js +29 -22
  23. package/dist/components/common/data-table/canvas.js +21 -10
  24. package/dist/components/common/data-table/cell-size.js +54 -58
  25. package/dist/components/common/data-table/grid.js +30 -31
  26. package/dist/components/common/data-table/index.js +91 -133
  27. package/dist/components/common/data-table/option-dropdown.js +29 -33
  28. package/dist/components/common/dataset-label.js +21 -13
  29. package/dist/components/common/error-boundary.js +25 -30
  30. package/dist/components/common/field-selector.js +35 -69
  31. package/dist/components/common/field-token.js +21 -16
  32. package/dist/components/common/file-uploader/file-drop.js +40 -55
  33. package/dist/components/common/file-uploader/file-upload-progress.js +32 -30
  34. package/dist/components/common/file-uploader/file-upload.js +52 -91
  35. package/dist/components/common/file-uploader/upload-button.js +31 -42
  36. package/dist/components/common/histogram-plot.js +32 -27
  37. package/dist/components/common/icons/add.js +27 -27
  38. package/dist/components/common/icons/anchor_window.js +3 -9
  39. package/dist/components/common/icons/arrow-down-alt.js +27 -27
  40. package/dist/components/common/icons/arrow-down-solid .js +27 -27
  41. package/dist/components/common/icons/arrow-down.js +27 -27
  42. package/dist/components/common/icons/arrow-left.js +27 -27
  43. package/dist/components/common/icons/arrow-right.js +27 -27
  44. package/dist/components/common/icons/arrow-up-alt.js +27 -27
  45. package/dist/components/common/icons/arrow-up-solid.js +27 -27
  46. package/dist/components/common/icons/arrow-up.js +27 -27
  47. package/dist/components/common/icons/base.js +38 -42
  48. package/dist/components/common/icons/bug.js +27 -27
  49. package/dist/components/common/icons/cancel.js +27 -27
  50. package/dist/components/common/icons/checkmark.js +27 -28
  51. package/dist/components/common/icons/chevron-right.js +27 -27
  52. package/dist/components/common/icons/clipboard.js +27 -27
  53. package/dist/components/common/icons/clock.js +27 -27
  54. package/dist/components/common/icons/close.js +27 -27
  55. package/dist/components/common/icons/code-alt.js +27 -28
  56. package/dist/components/common/icons/copy.js +27 -28
  57. package/dist/components/common/icons/crosshairs.js +27 -28
  58. package/dist/components/common/icons/cube-3d.js +27 -27
  59. package/dist/components/common/icons/cursor-click.js +27 -27
  60. package/dist/components/common/icons/data-table.js +27 -27
  61. package/dist/components/common/icons/db.js +27 -27
  62. package/dist/components/common/icons/delete.js +27 -27
  63. package/dist/components/common/icons/docs.js +27 -27
  64. package/dist/components/common/icons/drag-n-drop.js +27 -27
  65. package/dist/components/common/icons/draw-polygon.js +27 -27
  66. package/dist/components/common/icons/email.js +27 -27
  67. package/dist/components/common/icons/expand.js +27 -27
  68. package/dist/components/common/icons/eye-seen.js +27 -27
  69. package/dist/components/common/icons/eye-unseen.js +27 -27
  70. package/dist/components/common/icons/file-type.js +23 -16
  71. package/dist/components/common/icons/file.js +27 -27
  72. package/dist/components/common/icons/files.js +24 -26
  73. package/dist/components/common/icons/filter-funnel.js +27 -27
  74. package/dist/components/common/icons/free-window.js +3 -9
  75. package/dist/components/common/icons/gear.js +27 -27
  76. package/dist/components/common/icons/hash.js +27 -27
  77. package/dist/components/common/icons/histogram.js +24 -25
  78. package/dist/components/common/icons/index.js +63 -138
  79. package/dist/components/common/icons/info.js +27 -28
  80. package/dist/components/common/icons/layers.js +27 -27
  81. package/dist/components/common/icons/left-arrow.js +27 -28
  82. package/dist/components/common/icons/legend.js +27 -27
  83. package/dist/components/common/icons/line-chart.js +27 -27
  84. package/dist/components/common/icons/login.js +27 -27
  85. package/dist/components/common/icons/logout.js +27 -27
  86. package/dist/components/common/icons/map-icon.js +27 -28
  87. package/dist/components/common/icons/map.js +27 -28
  88. package/dist/components/common/icons/messages.js +27 -27
  89. package/dist/components/common/icons/minus.js +27 -27
  90. package/dist/components/common/icons/pause.js +27 -27
  91. package/dist/components/common/icons/picture.js +24 -26
  92. package/dist/components/common/icons/pin.js +27 -27
  93. package/dist/components/common/icons/play.js +27 -27
  94. package/dist/components/common/icons/polygon.js +27 -27
  95. package/dist/components/common/icons/rectangle.js +27 -27
  96. package/dist/components/common/icons/reduce.js +27 -27
  97. package/dist/components/common/icons/reset.js +27 -27
  98. package/dist/components/common/icons/rocket.js +27 -27
  99. package/dist/components/common/icons/save.js +27 -27
  100. package/dist/components/common/icons/save2.js +27 -27
  101. package/dist/components/common/icons/search.js +27 -27
  102. package/dist/components/common/icons/settings.js +27 -27
  103. package/dist/components/common/icons/share.js +27 -27
  104. package/dist/components/common/icons/split.js +27 -27
  105. package/dist/components/common/icons/square-select.js +27 -27
  106. package/dist/components/common/icons/swap-horizontal.js +27 -28
  107. package/dist/components/common/icons/table.js +27 -27
  108. package/dist/components/common/icons/trash.js +27 -27
  109. package/dist/components/common/icons/upload.js +27 -27
  110. package/dist/components/common/icons/vert-dots.js +27 -27
  111. package/dist/components/common/icons/vert-three-dots.js +27 -27
  112. package/dist/components/common/icons/warning.js +27 -28
  113. package/dist/components/common/image-preview.js +36 -29
  114. package/dist/components/common/info-helper.js +26 -25
  115. package/dist/components/common/item-selector/accessor.js +3 -5
  116. package/dist/components/common/item-selector/chickleted-input.js +41 -43
  117. package/dist/components/common/item-selector/dropdown-list.js +44 -74
  118. package/dist/components/common/item-selector/item-selector-submenu.js +29 -38
  119. package/dist/components/common/item-selector/item-selector.js +36 -84
  120. package/dist/components/common/item-selector/typeahead.js +37 -83
  121. package/dist/components/common/line-chart.js +39 -36
  122. package/dist/components/common/loading-spinner.js +33 -25
  123. package/dist/components/common/logo.js +24 -22
  124. package/dist/components/common/map-layer-selector.js +23 -16
  125. package/dist/components/common/modal.js +36 -61
  126. package/dist/components/common/portaled.js +56 -97
  127. package/dist/components/common/progress-bar.js +29 -20
  128. package/dist/components/common/range-brush.js +63 -104
  129. package/dist/components/common/range-plot.js +47 -52
  130. package/dist/components/common/range-slider.js +52 -78
  131. package/dist/components/common/slider/mouse-event.js +11 -37
  132. package/dist/components/common/slider/slider-bar-handle.js +31 -39
  133. package/dist/components/common/slider/slider-handle.js +35 -44
  134. package/dist/components/common/slider/slider.js +55 -82
  135. package/dist/components/common/styled-components.js +64 -169
  136. package/dist/components/common/switch.js +22 -16
  137. package/dist/components/common/time-range-slider-time-title.js +24 -19
  138. package/dist/components/common/time-range-slider.js +41 -38
  139. package/dist/components/common/time-slider-marker.js +36 -41
  140. package/dist/components/common/toolbar-item.js +22 -16
  141. package/dist/components/common/toolbar.js +21 -10
  142. package/dist/components/common/vertical-toolbar.js +21 -10
  143. package/dist/components/container.js +49 -70
  144. package/dist/components/context.js +6 -10
  145. package/dist/components/editor/constants.js +6 -8
  146. package/dist/components/editor/editor.js +40 -72
  147. package/dist/components/editor/feature-action-panel.js +35 -43
  148. package/dist/components/editor/feature-styles.js +35 -40
  149. package/dist/components/editor/handle-style.js +35 -37
  150. package/dist/components/filters/components.js +21 -10
  151. package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +14 -25
  152. package/dist/components/filters/filter-panels/multi-select-filter-panel.js +14 -21
  153. package/dist/components/filters/filter-panels/new-filter-panel.js +13 -23
  154. package/dist/components/filters/filter-panels/polygon-filter-panel.js +13 -25
  155. package/dist/components/filters/filter-panels/range-filter-panel.js +14 -21
  156. package/dist/components/filters/filter-panels/single-select-filter-panel.js +14 -21
  157. package/dist/components/filters/filter-panels/time-range-filter-panel.js +14 -23
  158. package/dist/components/filters/index.js +11 -17
  159. package/dist/components/filters/multi-select-filter.js +3 -9
  160. package/dist/components/filters/polygon-filter.js +8 -18
  161. package/dist/components/filters/range-filter.js +3 -8
  162. package/dist/components/filters/single-select-filter.js +3 -9
  163. package/dist/components/filters/time-range-filter.js +7 -18
  164. package/dist/components/filters/time-widget.js +41 -51
  165. package/dist/components/geocoder/geocoder.js +95 -128
  166. package/dist/components/geocoder-panel.js +37 -62
  167. package/dist/components/index.js +356 -498
  168. package/dist/components/injector.js +42 -58
  169. package/dist/components/kepler-gl.js +65 -158
  170. package/dist/components/map/coordinate-info.js +4 -13
  171. package/dist/components/map/layer-hover-info.js +40 -48
  172. package/dist/components/map/layer-selector-panel.js +17 -30
  173. package/dist/components/map/locale-panel.js +13 -27
  174. package/dist/components/map/map-control-panel.js +27 -24
  175. package/dist/components/map/map-control-toolbar.js +21 -11
  176. package/dist/components/map/map-control-tooltip.js +4 -11
  177. package/dist/components/map/map-control.js +26 -27
  178. package/dist/components/map/map-draw-panel.js +12 -29
  179. package/dist/components/map/map-legend-panel.js +17 -34
  180. package/dist/components/map/map-legend.js +52 -70
  181. package/dist/components/map/map-popover.js +41 -57
  182. package/dist/components/map/split-map-button.js +13 -25
  183. package/dist/components/map/toggle-3d-button.js +10 -21
  184. package/dist/components/map-container.js +98 -145
  185. package/dist/components/maps-layout.js +24 -26
  186. package/dist/components/modal-container.js +60 -112
  187. package/dist/components/modals/add-map-style-modal.js +37 -67
  188. package/dist/components/modals/cloud-tile.js +36 -36
  189. package/dist/components/modals/data-table-modal.js +51 -81
  190. package/dist/components/modals/delete-data-modal.js +24 -20
  191. package/dist/components/modals/error-display.js +3 -10
  192. package/dist/components/modals/export-data-modal.js +37 -54
  193. package/dist/components/modals/export-image-modal.js +31 -28
  194. package/dist/components/modals/export-map-modal/components.js +27 -27
  195. package/dist/components/modals/export-map-modal/export-html-map.js +27 -27
  196. package/dist/components/modals/export-map-modal/export-json-map.js +22 -22
  197. package/dist/components/modals/export-map-modal/export-map-modal.js +20 -40
  198. package/dist/components/modals/image-modal-container.js +9 -16
  199. package/dist/components/modals/load-data-modal.js +29 -33
  200. package/dist/components/modals/load-storage-map.js +42 -77
  201. package/dist/components/modals/loading-dialog.js +24 -18
  202. package/dist/components/modals/modal-dialog.js +3 -7
  203. package/dist/components/modals/modal-tabs.js +29 -29
  204. package/dist/components/modals/overwrite-map-modal.js +29 -28
  205. package/dist/components/modals/provider-modal-container.js +27 -27
  206. package/dist/components/modals/save-map-modal.js +43 -48
  207. package/dist/components/modals/share-map-modal.js +42 -53
  208. package/dist/components/modals/status-panel.js +24 -25
  209. package/dist/components/modals/storage-map-viewer.js +30 -43
  210. package/dist/components/notification-panel/notification-item.js +33 -47
  211. package/dist/components/notification-panel.js +30 -36
  212. package/dist/components/performance.js +11 -36
  213. package/dist/components/plot-container.js +42 -72
  214. package/dist/components/side-panel/cloud-storage-dropdown.js +4 -10
  215. package/dist/components/side-panel/common/dataset-info.js +20 -13
  216. package/dist/components/side-panel/common/dataset-tag.js +21 -12
  217. package/dist/components/side-panel/common/dataset-title.js +37 -52
  218. package/dist/components/side-panel/common/source-data-catalog.js +26 -22
  219. package/dist/components/side-panel/common/source-data-selector.js +34 -40
  220. package/dist/components/side-panel/custom-panel.js +5 -9
  221. package/dist/components/side-panel/filter-manager.js +18 -29
  222. package/dist/components/side-panel/filter-panel/filter-panel-header.js +30 -30
  223. package/dist/components/side-panel/filter-panel/filter-panel.js +36 -55
  224. package/dist/components/side-panel/interaction-manager.js +5 -12
  225. package/dist/components/side-panel/interaction-panel/brush-config.js +23 -19
  226. package/dist/components/side-panel/interaction-panel/interaction-panel.js +36 -59
  227. package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +34 -74
  228. package/dist/components/side-panel/interaction-panel/tooltip-config.js +28 -40
  229. package/dist/components/side-panel/layer-manager.js +51 -82
  230. package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +3 -10
  231. package/dist/components/side-panel/layer-panel/color-palette.js +27 -23
  232. package/dist/components/side-panel/layer-panel/color-range-selector.js +52 -98
  233. package/dist/components/side-panel/layer-panel/color-selector.js +36 -67
  234. package/dist/components/side-panel/layer-panel/column-selector.js +26 -25
  235. package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +2 -6
  236. package/dist/components/side-panel/layer-panel/custom-palette.js +37 -71
  237. package/dist/components/side-panel/layer-panel/custom-picker.js +32 -45
  238. package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +8 -16
  239. package/dist/components/side-panel/layer-panel/hex-column-config.js +12 -34
  240. package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +2 -10
  241. package/dist/components/side-panel/layer-panel/layer-column-config.js +31 -27
  242. package/dist/components/side-panel/layer-panel/layer-config-group.js +46 -80
  243. package/dist/components/side-panel/layer-panel/layer-configurator.js +158 -249
  244. package/dist/components/side-panel/layer-panel/layer-panel-header.js +52 -66
  245. package/dist/components/side-panel/layer-panel/layer-panel.js +33 -54
  246. package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +28 -22
  247. package/dist/components/side-panel/layer-panel/layer-type-list-item.js +22 -18
  248. package/dist/components/side-panel/layer-panel/layer-type-selector.js +29 -32
  249. package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +35 -40
  250. package/dist/components/side-panel/layer-panel/single-color-palette.js +32 -42
  251. package/dist/components/side-panel/layer-panel/text-label-panel.js +31 -42
  252. package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +39 -52
  253. package/dist/components/side-panel/layer-panel/vis-config-slider.js +10 -19
  254. package/dist/components/side-panel/layer-panel/vis-config-switch.js +28 -29
  255. package/dist/components/side-panel/map-manager.js +32 -46
  256. package/dist/components/side-panel/map-style-panel/map-layer-selector.js +28 -31
  257. package/dist/components/side-panel/map-style-panel/map-style-selector.js +26 -24
  258. package/dist/components/side-panel/panel-dropdown.js +28 -35
  259. package/dist/components/side-panel/panel-header-action.js +38 -43
  260. package/dist/components/side-panel/panel-header.js +54 -92
  261. package/dist/components/side-panel/panel-tab.js +24 -20
  262. package/dist/components/side-panel/panel-title.js +21 -10
  263. package/dist/components/side-panel/panel-toggle.js +26 -23
  264. package/dist/components/side-panel/side-bar.js +37 -53
  265. package/dist/components/side-panel.js +56 -65
  266. package/dist/connect/keplergl-connect.js +5 -14
  267. package/dist/connect/with-local-selector.js +33 -38
  268. package/dist/constants/action-types.js +5 -6
  269. package/dist/constants/color-palette.js +12 -23
  270. package/dist/constants/color-ranges.js +32 -31
  271. package/dist/constants/custom-color-ranges.js +9 -14
  272. package/dist/constants/default-settings.js +154 -239
  273. package/dist/constants/index.js +95 -103
  274. package/dist/constants/keyevent.js +3 -7
  275. package/dist/constants/tooltip.js +7 -10
  276. package/dist/constants/user-feedbacks.js +5 -6
  277. package/dist/constants/user-guides.js +12 -20
  278. package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +29 -32
  279. package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +10 -43
  280. package/dist/deckgl-layers/cluster-layer/cluster-layer.js +54 -75
  281. package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +29 -32
  282. package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +29 -30
  283. package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +29 -30
  284. package/dist/deckgl-layers/layer-utils/cluster-utils.js +10 -21
  285. package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +75 -132
  286. package/dist/deckgl-layers/layer-utils/shader-utils.js +1 -5
  287. package/dist/deckgl-layers/line-layer/line-layer.js +27 -34
  288. package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +26 -30
  289. package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +33 -39
  290. package/dist/index.js +4 -23
  291. package/dist/layers/aggregation-layer.js +63 -97
  292. package/dist/layers/arc-layer/arc-layer-icon.js +27 -27
  293. package/dist/layers/arc-layer/arc-layer.js +48 -73
  294. package/dist/layers/base-layer.js +255 -406
  295. package/dist/layers/cluster-layer/cluster-layer-icon.js +27 -27
  296. package/dist/layers/cluster-layer/cluster-layer.js +33 -44
  297. package/dist/layers/default-layer-icon.js +27 -27
  298. package/dist/layers/geojson-layer/geojson-layer-icon.js +27 -27
  299. package/dist/layers/geojson-layer/geojson-layer.js +54 -87
  300. package/dist/layers/geojson-layer/geojson-utils.js +35 -47
  301. package/dist/layers/grid-layer/grid-layer-icon.js +27 -27
  302. package/dist/layers/grid-layer/grid-layer.js +30 -41
  303. package/dist/layers/grid-layer/grid-utils.js +6 -9
  304. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +27 -27
  305. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +48 -80
  306. package/dist/layers/h3-hexagon-layer/h3-utils.js +10 -21
  307. package/dist/layers/heatmap-layer/heatmap-layer-icon.js +27 -27
  308. package/dist/layers/heatmap-layer/heatmap-layer.js +45 -72
  309. package/dist/layers/hexagon-layer/hexagon-layer-icon.js +27 -27
  310. package/dist/layers/hexagon-layer/hexagon-layer.js +30 -42
  311. package/dist/layers/hexagon-layer/hexagon-utils.js +3 -15
  312. package/dist/layers/icon-layer/icon-info-modal.js +23 -26
  313. package/dist/layers/icon-layer/icon-layer-icon.js +27 -27
  314. package/dist/layers/icon-layer/icon-layer.js +59 -97
  315. package/dist/layers/index.js +38 -39
  316. package/dist/layers/layer-factory.js +38 -42
  317. package/dist/layers/layer-text-label.js +7 -17
  318. package/dist/layers/layer-update.js +3 -14
  319. package/dist/layers/line-layer/line-layer-icon.js +27 -27
  320. package/dist/layers/line-layer/line-layer.js +46 -66
  321. package/dist/layers/mapbox-utils.js +38 -51
  322. package/dist/layers/mapboxgl-layer.js +43 -58
  323. package/dist/layers/point-layer/point-layer-icon.js +27 -27
  324. package/dist/layers/point-layer/point-layer.js +57 -90
  325. package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +41 -73
  326. package/dist/layers/s2-geometry-layer/s2-layer-icon.js +27 -27
  327. package/dist/layers/s2-geometry-layer/s2-utils.js +5 -11
  328. package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +21 -15
  329. package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +27 -27
  330. package/dist/layers/scenegraph-layer/scenegraph-layer.js +52 -75
  331. package/dist/layers/trip-layer/trip-info-modal.js +21 -16
  332. package/dist/layers/trip-layer/trip-layer-icon.js +27 -27
  333. package/dist/layers/trip-layer/trip-layer.js +51 -93
  334. package/dist/layers/trip-layer/trip-utils.js +16 -39
  335. package/dist/layers/types.js +3 -6
  336. package/dist/localization/en.js +22 -11
  337. package/dist/localization/formatted-message.js +5 -10
  338. package/dist/localization/index.js +7 -13
  339. package/dist/localization/locales.js +7 -12
  340. package/dist/middleware/index.js +2 -5
  341. package/dist/processors/data-processor.js +113 -177
  342. package/dist/processors/file-handler.js +200 -276
  343. package/dist/processors/index.js +33 -35
  344. package/dist/reducers/combined-updaters.js +35 -46
  345. package/dist/reducers/composer-helpers.js +28 -27
  346. package/dist/reducers/composers.js +25 -12
  347. package/dist/reducers/core.js +13 -46
  348. package/dist/reducers/index.js +24 -38
  349. package/dist/reducers/map-state-updaters.js +53 -65
  350. package/dist/reducers/map-state.js +31 -26
  351. package/dist/reducers/map-style-updaters.js +92 -136
  352. package/dist/reducers/map-style.js +31 -26
  353. package/dist/reducers/provider-state-updaters.js +92 -167
  354. package/dist/reducers/provider-state.js +32 -25
  355. package/dist/reducers/root.js +44 -50
  356. package/dist/reducers/ui-state-updaters.js +102 -202
  357. package/dist/reducers/ui-state.js +32 -26
  358. package/dist/reducers/vis-state-merger.js +102 -166
  359. package/dist/reducers/vis-state-selectors.js +5 -10
  360. package/dist/reducers/vis-state-updaters.js +386 -663
  361. package/dist/reducers/vis-state.js +32 -25
  362. package/dist/schemas/dataset-schema.js +36 -56
  363. package/dist/schemas/index.js +38 -45
  364. package/dist/schemas/map-state-schema.js +28 -24
  365. package/dist/schemas/map-style-schema.js +34 -48
  366. package/dist/schemas/schema-manager.js +44 -62
  367. package/dist/schemas/schema-utils.js +11 -15
  368. package/dist/schemas/schema.js +32 -27
  369. package/dist/schemas/versions.js +5 -9
  370. package/dist/schemas/vis-state-schema.js +109 -309
  371. package/dist/styles/base.js +367 -640
  372. package/dist/styles/index.js +1 -5
  373. package/dist/styles/media-breakpoints.js +21 -9
  374. package/dist/tasks/tasks.js +22 -50
  375. package/dist/templates/export-map-html.js +3 -6
  376. package/dist/utils/aggregate-utils.js +23 -27
  377. package/dist/utils/color-utils.js +36 -38
  378. package/dist/utils/custom-scales.js +1 -7
  379. package/dist/utils/data-scale-utils.js +11 -20
  380. package/dist/utils/data-utils.js +78 -137
  381. package/dist/utils/dataset-utils.js +71 -88
  382. package/dist/utils/dom-to-image.js +15 -93
  383. package/dist/utils/dom-utils.js +34 -116
  384. package/dist/utils/export-utils.js +65 -102
  385. package/dist/utils/filter-utils.js +170 -320
  386. package/dist/utils/gl-utils.js +39 -23
  387. package/dist/utils/gpu-filter-utils.js +46 -59
  388. package/dist/utils/index.js +68 -80
  389. package/dist/utils/interaction-utils.js +26 -50
  390. package/dist/utils/layer-utils.js +58 -63
  391. package/dist/utils/locale-utils.js +23 -21
  392. package/dist/utils/map-info-utils.js +2 -3
  393. package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +72 -71
  394. package/dist/utils/map-style-utils/mapbox-utils.js +3 -5
  395. package/dist/utils/mapbox-utils.js +2 -5
  396. package/dist/utils/notifications-utils.js +36 -35
  397. package/dist/utils/observe-dimensions.js +36 -41
  398. package/dist/utils/projection-utils.js +9 -20
  399. package/dist/utils/searcher-utils.js +1 -4
  400. package/dist/utils/split-map-utils.js +36 -32
  401. package/dist/utils/table-utils/data-container-utils.js +27 -23
  402. package/dist/utils/table-utils/data-row.js +2 -13
  403. package/dist/utils/table-utils/index.js +1 -2
  404. package/dist/utils/table-utils/indexed-data-container.js +65 -84
  405. package/dist/utils/table-utils/kepler-table.js +83 -126
  406. package/dist/utils/table-utils/row-data-container.js +62 -87
  407. package/dist/utils/utils.js +51 -69
  408. package/package.json +4 -3
  409. package/src/components/kepler-gl.d.ts +0 -1
  410. package/src/components/kepler-gl.js +0 -7
  411. package/src/components/map-container.js +0 -3
  412. package/src/components/modal-container.d.ts +0 -1
  413. package/src/components/modal-container.js +0 -2
  414. package/src/components/modals/add-map-style-modal.js +0 -3
  415. package/src/utils/gl-utils.js +16 -15
  416. package/CHANGELOG.md +0 -954
@@ -1,83 +1,67 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = exports.colorMaker = exports.layerColors = exports.OVERLAY_TYPE = exports.LAYER_ID_LENGTH = void 0;
9
-
10
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
-
7
+ exports.layerColors = exports["default"] = exports.colorMaker = exports.OVERLAY_TYPE = exports.LAYER_ID_LENGTH = void 0;
12
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
-
14
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
-
16
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
-
18
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
19
-
20
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
21
-
22
13
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
23
-
24
14
  var _window = require("global/window");
25
-
26
15
  var _keymirror = _interopRequireDefault(require("keymirror"));
27
-
28
16
  var _extensions = require("@deck.gl/extensions");
29
-
30
17
  var _core = require("@deck.gl/core");
31
-
32
18
  var _carto = require("@deck.gl/carto");
33
-
34
19
  var _defaultLayerIcon = _interopRequireDefault(require("./default-layer-icon"));
35
-
36
20
  var _layerUpdate = require("./layer-update");
37
-
38
21
  var _d3Color = require("d3-color");
39
-
40
22
  var _defaultSettings = require("../constants/default-settings");
41
-
42
23
  var _colorRanges = require("../constants/color-ranges");
43
-
44
24
  var _customColorRanges = require("../constants/custom-color-ranges");
45
-
46
25
  var _layerFactory = require("./layer-factory");
47
-
48
26
  var _utils = require("../utils/utils");
49
-
50
27
  var _dataUtils = require("../utils/data-utils");
51
-
52
28
  var _dataContainerUtils = require("../utils/table-utils/data-container-utils");
53
-
54
29
  var _colorUtils = require("../utils/color-utils");
55
-
56
30
  var _layerUtils = require("../utils/layer-utils");
57
-
58
31
  var _d3Scale = require("d3-scale");
59
-
60
- function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
61
-
32
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
62
33
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
63
-
64
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
65
-
66
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
67
-
68
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
69
-
70
- var _marked = /*#__PURE__*/_regenerator["default"].mark(generateColor);
71
-
34
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
35
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
36
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
37
+ var _marked = /*#__PURE__*/_regenerator["default"].mark(generateColor); // Copyright (c) 2022 Uber Technologies, Inc.
38
+ //
39
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
40
+ // of this software and associated documentation files (the "Software"), to deal
41
+ // in the Software without restriction, including without limitation the rights
42
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
43
+ // copies of the Software, and to permit persons to whom the Software is
44
+ // furnished to do so, subject to the following conditions:
45
+ //
46
+ // The above copyright notice and this permission notice shall be included in
47
+ // all copies or substantial portions of the Software.
48
+ //
49
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
50
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
51
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
52
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
53
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
54
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
55
+ // THE SOFTWARE.
72
56
  /** @typedef {import('./index').Layer} LayerClass} */
73
57
 
74
58
  /**
75
59
  * Approx. number of points to sample in a large data set
76
60
  * @type {number}
77
61
  */
78
- var LAYER_ID_LENGTH = 6; // Note, this is is SVG of solid circle encoded as data-uri
62
+ var LAYER_ID_LENGTH = exports.LAYER_ID_LENGTH = 6;
79
63
 
80
- exports.LAYER_ID_LENGTH = LAYER_ID_LENGTH;
64
+ // Note, this is is SVG of solid circle encoded as data-uri
81
65
  var FALLBACK_ICON = 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNTAiLz4NCjwvc3ZnPg==';
82
66
  var MAX_SAMPLE_SIZE = 5000;
83
67
  var defaultDomain = [0, 1];
@@ -85,86 +69,72 @@ var dataFilterExtension = new _extensions.DataFilterExtension({
85
69
  filterSize: _defaultSettings.MAX_GPU_FILTERS
86
70
  });
87
71
  var collisionFilterExtension = new _extensions.CollisionFilterExtension();
88
-
89
72
  var defaultDataAccessor = function defaultDataAccessor(dc) {
90
73
  return function (d) {
91
74
  return d;
92
75
  };
93
76
  };
94
-
95
77
  var defaultGetFieldValue = function defaultGetFieldValue(field, d) {
96
78
  return field.valueAccessor(d);
97
79
  };
98
-
99
80
  var scaleIdentity = function scaleIdentity(v) {
100
81
  return v;
101
82
  };
102
-
103
- var OVERLAY_TYPE = (0, _keymirror["default"])({
83
+ var OVERLAY_TYPE = exports.OVERLAY_TYPE = (0, _keymirror["default"])({
104
84
  deckgl: null,
105
85
  mapboxgl: null
106
86
  });
107
- exports.OVERLAY_TYPE = OVERLAY_TYPE;
108
- var layerColors = Object.values(_customColorRanges.DataVizColors).map(_colorUtils.hexToRgb);
109
- exports.layerColors = layerColors;
110
-
87
+ var layerColors = exports.layerColors = Object.values(_customColorRanges.DataVizColors).map(_colorUtils.hexToRgb);
111
88
  function generateColor() {
112
89
  var index;
113
90
  return _regenerator["default"].wrap(function generateColor$(_context) {
114
- while (1) {
115
- switch (_context.prev = _context.next) {
116
- case 0:
117
- index = 0;
118
-
119
- case 1:
120
- if (!(index < layerColors.length + 1)) {
121
- _context.next = 7;
122
- break;
123
- }
124
-
125
- if (index === layerColors.length) {
126
- index = 0;
127
- }
128
-
129
- _context.next = 5;
130
- return layerColors[index++];
131
-
132
- case 5:
133
- _context.next = 1;
91
+ while (1) switch (_context.prev = _context.next) {
92
+ case 0:
93
+ index = 0;
94
+ case 1:
95
+ if (!(index < layerColors.length + 1)) {
96
+ _context.next = 7;
134
97
  break;
135
-
136
- case 7:
137
- case "end":
138
- return _context.stop();
139
- }
98
+ }
99
+ if (index === layerColors.length) {
100
+ index = 0;
101
+ }
102
+ _context.next = 5;
103
+ return layerColors[index++];
104
+ case 5:
105
+ _context.next = 1;
106
+ break;
107
+ case 7:
108
+ case "end":
109
+ return _context.stop();
140
110
  }
141
111
  }, _marked);
142
112
  }
113
+ var colorMaker = exports.colorMaker = generateColor();
143
114
 
144
- var colorMaker = generateColor();
145
115
  /** @type {LayerClass} */
146
-
147
- exports.colorMaker = colorMaker;
148
-
149
116
  var Layer = /*#__PURE__*/function () {
150
117
  function Layer() {
151
118
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
152
119
  (0, _classCallCheck2["default"])(this, Layer);
153
- this.id = props.id || (0, _utils.generateHashId)(LAYER_ID_LENGTH); // meta
154
-
155
- this.meta = {}; // legendSettings
120
+ this.id = props.id || (0, _utils.generateHashId)(LAYER_ID_LENGTH);
121
+ // meta
122
+ this.meta = {};
156
123
 
157
- this.legendSettings = {}; // visConfigSettings
124
+ // legendSettings
125
+ this.legendSettings = {};
158
126
 
159
- this.visConfigSettings = {}; // interactivitySettings
127
+ // visConfigSettings
128
+ this.visConfigSettings = {};
160
129
 
161
- this._interactivitySettings = {}; // @ts-ignore
130
+ // interactivitySettings
131
+ this._interactivitySettings = {};
162
132
 
133
+ // @ts-ignore
163
134
  this.config = this.getDefaultLayerConfig(_objectSpread({
164
135
  columns: this.getLayerColumns()
165
136
  }, props));
166
137
  }
167
-
168
138
  (0, _createClass2["default"])(Layer, [{
169
139
  key: "layerIcon",
170
140
  get: function get() {
@@ -235,20 +205,20 @@ var Layer = /*#__PURE__*/function () {
235
205
  }
236
206
  };
237
207
  }
208
+
238
209
  /*
239
210
  * Column pairs maps layer column to a specific field pairs,
240
211
  * By default, it is set to null
241
212
  */
242
-
243
213
  }, {
244
214
  key: "columnPairs",
245
215
  get: function get() {
246
216
  return null;
247
217
  }
218
+
248
219
  /*
249
220
  * Default point column pairs, can be used for point based layers: point, icon etc.
250
221
  */
251
-
252
222
  }, {
253
223
  key: "defaultPointColumnPairs",
254
224
  get: function get() {
@@ -263,10 +233,10 @@ var Layer = /*#__PURE__*/function () {
263
233
  }
264
234
  };
265
235
  }
236
+
266
237
  /*
267
238
  * Default link column pairs, can be used for link based layers: arc, line etc
268
239
  */
269
-
270
240
  }, {
271
241
  key: "defaultLinkColumnPairs",
272
242
  get: function get() {
@@ -289,6 +259,7 @@ var Layer = /*#__PURE__*/function () {
289
259
  }
290
260
  };
291
261
  }
262
+
292
263
  /**
293
264
  * Return a React component for to render layer instructions in a modal
294
265
  * @returns {object} - an object
@@ -301,7 +272,6 @@ var Layer = /*#__PURE__*/function () {
301
272
  * };
302
273
  * }
303
274
  */
304
-
305
275
  }, {
306
276
  key: "layerInfoModal",
307
277
  get: function get() {
@@ -319,27 +289,24 @@ var Layer = /*#__PURE__*/function () {
319
289
  key: "hasTooltip",
320
290
  get: function get() {
321
291
  var _this$interactivitySe, _this$interactivitySe2, _this$interactivitySe3, _this$interactivitySe4;
322
-
323
292
  return Boolean(((_this$interactivitySe = this.interactivitySettings) === null || _this$interactivitySe === void 0 ? void 0 : (_this$interactivitySe2 = _this$interactivitySe.hover) === null || _this$interactivitySe2 === void 0 ? void 0 : _this$interactivitySe2.fields.length) || ((_this$interactivitySe3 = this.interactivitySettings) === null || _this$interactivitySe3 === void 0 ? void 0 : (_this$interactivitySe4 = _this$interactivitySe3.click) === null || _this$interactivitySe4 === void 0 ? void 0 : _this$interactivitySe4.fields.length));
324
293
  }
325
294
  }, {
326
295
  key: "hasInteractivity",
327
296
  get: function get() {
328
297
  var _this$interactivitySe5;
329
-
330
298
  return Boolean(this.hasTooltip && ((_this$interactivitySe5 = this.interactivitySettings) === null || _this$interactivitySe5 === void 0 ? void 0 : _this$interactivitySe5.enabled));
331
299
  }
300
+
332
301
  /*
333
302
  * Given a dataset, automatically find props to create layer based on it
334
303
  * and return the props and previous found layers.
335
304
  * By default, no layers will be found
336
305
  */
337
-
338
306
  }, {
339
307
  key: "getDefaultLayerConfig",
340
308
  value: function getDefaultLayerConfig() {
341
309
  var _props$visibilityByZo, _props$visibilityByZo2;
342
-
343
310
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
344
311
  return {
345
312
  dataId: props.dataId || null,
@@ -375,12 +342,12 @@ var Layer = /*#__PURE__*/function () {
375
342
  }
376
343
  };
377
344
  }
345
+
378
346
  /**
379
347
  * Get the description of a visualChannel config
380
348
  * @param key
381
349
  * @returns {{label: string, measure: (string|string)}}
382
350
  */
383
-
384
351
  }, {
385
352
  key: "getVisualChannelDescription",
386
353
  value: function getVisualChannelDescription(key) {
@@ -390,13 +357,13 @@ var Layer = /*#__PURE__*/function () {
390
357
  measure: this.config[this.visualChannels[key].field] ? this.config[this.visualChannels[key].field].displayName || this.config[this.visualChannels[key].field].name : this.visualChannels[key].defaultMeasure
391
358
  };
392
359
  }
360
+
393
361
  /**
394
362
  * Assign a field to layer column, return column config
395
363
  * @param key - Column Key
396
364
  * @param field - Selected field
397
365
  * @returns {{}} - Column config
398
366
  */
399
-
400
367
  }, {
401
368
  key: "assignColumn",
402
369
  value: function assignColumn(key, field) {
@@ -410,32 +377,29 @@ var Layer = /*#__PURE__*/function () {
410
377
  };
411
378
  return _objectSpread(_objectSpread({}, this.config.columns), {}, (0, _defineProperty2["default"])({}, key, _objectSpread(_objectSpread({}, this.config.columns[key]), update)));
412
379
  }
380
+
413
381
  /**
414
382
  * Assign a field pair to column config, return column config
415
383
  * @param key - Column Key
416
384
  * @param pair - field Pair
417
385
  * @returns {object} - Column config
418
386
  */
419
-
420
387
  }, {
421
388
  key: "assignColumnPairs",
422
389
  value: function assignColumnPairs(key, pair) {
423
- var _this$columnPairs, _this$columnPairs2, _this$columnPairs3, _objectSpread3;
424
-
390
+ var _this$columnPairs, _this$columnPairs2, _this$columnPairs3;
425
391
  if (!this.columnPairs || !((_this$columnPairs = this.columnPairs) !== null && _this$columnPairs !== void 0 && _this$columnPairs[key])) {
426
392
  // should not end in this state
427
393
  return this.config.columns;
428
394
  }
429
-
430
395
  var _this$columnPairs$key = (_this$columnPairs2 = this.columnPairs) === null || _this$columnPairs2 === void 0 ? void 0 : _this$columnPairs2[key],
431
- partnerKey = _this$columnPairs$key.pair,
432
- fieldPairKey = _this$columnPairs$key.fieldPairKey;
433
-
396
+ partnerKey = _this$columnPairs$key.pair,
397
+ fieldPairKey = _this$columnPairs$key.fieldPairKey;
434
398
  var _this$columnPairs$par = (_this$columnPairs3 = this.columnPairs) === null || _this$columnPairs3 === void 0 ? void 0 : _this$columnPairs3[partnerKey],
435
- partnerFieldPairKey = _this$columnPairs$par.fieldPairKey;
436
-
437
- return _objectSpread(_objectSpread({}, this.config.columns), {}, (_objectSpread3 = {}, (0, _defineProperty2["default"])(_objectSpread3, key, pair[fieldPairKey]), (0, _defineProperty2["default"])(_objectSpread3, partnerKey, pair[partnerFieldPairKey]), _objectSpread3));
399
+ partnerFieldPairKey = _this$columnPairs$par.fieldPairKey;
400
+ return _objectSpread(_objectSpread({}, this.config.columns), {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, key, pair[fieldPairKey]), partnerKey, pair[partnerFieldPairKey]));
438
401
  }
402
+
439
403
  /**
440
404
  * Calculate a radius zoom multiplier to render points, so they are visible in all zoom level
441
405
  * @param {object} mapState
@@ -443,15 +407,15 @@ var Layer = /*#__PURE__*/function () {
443
407
  * @param {number | void} mapState.zoomOffset - zoomOffset when render in the plot container for export image
444
408
  * @returns {number}
445
409
  */
446
-
447
410
  }, {
448
411
  key: "getZoomFactor",
449
412
  value: function getZoomFactor(_ref) {
450
413
  var zoom = _ref.zoom,
451
- _ref$zoomOffset = _ref.zoomOffset,
452
- zoomOffset = _ref$zoomOffset === void 0 ? 0 : _ref$zoomOffset;
414
+ _ref$zoomOffset = _ref.zoomOffset,
415
+ zoomOffset = _ref$zoomOffset === void 0 ? 0 : _ref$zoomOffset;
453
416
  return Math.pow(2, Math.max(14 - zoom + zoomOffset, 0));
454
417
  }
418
+
455
419
  /**
456
420
  * Calculate a elevation zoom multiplier to render points, so they are visible in all zoom level
457
421
  * @param {object} mapState
@@ -459,13 +423,12 @@ var Layer = /*#__PURE__*/function () {
459
423
  * @param {number | void} mapState.zoomOffset - zoomOffset when render in the plot container for export image
460
424
  * @returns {number}
461
425
  */
462
-
463
426
  }, {
464
427
  key: "getElevationZoomFactor",
465
428
  value: function getElevationZoomFactor(_ref2) {
466
429
  var zoom = _ref2.zoom,
467
- _ref2$zoomOffset = _ref2.zoomOffset,
468
- zoomOffset = _ref2$zoomOffset === void 0 ? 0 : _ref2$zoomOffset;
430
+ _ref2$zoomOffset = _ref2.zoomOffset,
431
+ zoomOffset = _ref2$zoomOffset === void 0 ? 0 : _ref2$zoomOffset;
469
432
  return this.config.visConfig.enableElevationZoomFactor ? Math.pow(2, Math.max(8 - zoom + zoomOffset, 0)) : 1;
470
433
  }
471
434
  }, {
@@ -483,50 +446,52 @@ var Layer = /*#__PURE__*/function () {
483
446
  value: function getHoverData(object, dataContainer) {
484
447
  if (!object) {
485
448
  return null;
486
- } // By default, each entry of layerData should have an index of a row in the original data container.
487
- // Each layer can implement its own getHoverData method
488
-
449
+ }
489
450
 
451
+ // By default, each entry of layerData should have an index of a row in the original data container.
452
+ // Each layer can implement its own getHoverData method
490
453
  return dataContainer.row(object.index);
491
454
  }
455
+
492
456
  /**
493
457
  * When change layer type, try to copy over layer configs as much as possible
494
458
  * @param configToCopy - config to copy over
495
459
  * @param visConfigSettings - visConfig settings of config to copy
496
460
  */
497
-
498
461
  }, {
499
462
  key: "assignConfigToLayer",
500
463
  value: function assignConfigToLayer(configToCopy, visConfigSettings) {
501
464
  var _this = this;
502
-
503
465
  // don't deep merge visualChannel field
504
466
  // don't deep merge color range, reversed: is not a key by default
505
467
  var shallowCopy = ['colorRange', 'strokeColorRange'].concat(Object.values(this.visualChannels).map(function (v) {
506
468
  return v.field;
507
- })); // don't copy over domain and animation
469
+ }));
508
470
 
471
+ // don't copy over domain and animation
509
472
  var notToCopy = ['animation'].concat(Object.values(this.visualChannels).map(function (v) {
510
473
  return v.domain;
511
- })); // if range is for the same property group copy it, otherwise, not to copy
512
-
474
+ }));
475
+ // if range is for the same property group copy it, otherwise, not to copy
513
476
  Object.values(this.visualChannels).forEach(function (v) {
514
477
  if (configToCopy.visConfig[v.range] && _this.visConfigSettings[v.range] && visConfigSettings[v.range].group !== _this.visConfigSettings[v.range].group) {
515
478
  notToCopy.push(v.range);
516
479
  }
517
- }); // don't copy over visualChannel range
480
+ });
518
481
 
482
+ // don't copy over visualChannel range
519
483
  var currentConfig = this.config;
520
484
  var copied = this.copyLayerConfig(currentConfig, configToCopy, {
521
485
  shallowCopy: shallowCopy,
522
486
  notToCopy: notToCopy
523
487
  });
524
- this.updateLayerConfig(copied); // validate visualChannel field type and scale types
525
-
488
+ this.updateLayerConfig(copied);
489
+ // validate visualChannel field type and scale types
526
490
  Object.keys(this.visualChannels).forEach(function (channel) {
527
491
  _this.validateVisualChannel(channel);
528
492
  });
529
493
  }
494
+
530
495
  /*
531
496
  * Recursively copy config over to an empty layer
532
497
  * when received saved config, or copy config over from a different layer type
@@ -537,18 +502,15 @@ var Layer = /*#__PURE__*/function () {
537
502
  * @param {string[]} notToCopy - array of properties not to copy
538
503
  * @returns {object} - copied config
539
504
  */
540
-
541
505
  }, {
542
506
  key: "copyLayerConfig",
543
507
  value: function copyLayerConfig(currentConfig, configToCopy) {
544
508
  var _this2 = this;
545
-
546
509
  var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
547
- _ref3$shallowCopy = _ref3.shallowCopy,
548
- shallowCopy = _ref3$shallowCopy === void 0 ? [] : _ref3$shallowCopy,
549
- _ref3$notToCopy = _ref3.notToCopy,
550
- notToCopy = _ref3$notToCopy === void 0 ? [] : _ref3$notToCopy;
551
-
510
+ _ref3$shallowCopy = _ref3.shallowCopy,
511
+ shallowCopy = _ref3$shallowCopy === void 0 ? [] : _ref3$shallowCopy,
512
+ _ref3$notToCopy = _ref3.notToCopy,
513
+ notToCopy = _ref3$notToCopy === void 0 ? [] : _ref3$notToCopy;
552
514
  var copied = {};
553
515
  Object.keys(currentConfig).forEach(function (key) {
554
516
  if ((0, _utils.isPlainObject)(currentConfig[key]) && (0, _utils.isPlainObject)(configToCopy[key]) && !shallowCopy.includes(key) && !notToCopy.includes(key)) {
@@ -571,7 +533,6 @@ var Layer = /*#__PURE__*/function () {
571
533
  key: "registerVisConfig",
572
534
  value: function registerVisConfig(layerVisConfigs) {
573
535
  var _this3 = this;
574
-
575
536
  Object.keys(layerVisConfigs).forEach(function (item) {
576
537
  if (typeof item === 'string' && _layerFactory.LAYER_VIS_CONFIGS[layerVisConfigs[item]]) {
577
538
  // if assigned one of default LAYER_CONFIGS
@@ -626,35 +587,28 @@ var Layer = /*#__PURE__*/function () {
626
587
  key: "updateLayerColorUI",
627
588
  value: function updateLayerColorUI(prop, newConfig) {
628
589
  var _this$config = this.config,
629
- previous = _this$config.colorUI,
630
- visConfig = _this$config.visConfig;
631
-
590
+ previous = _this$config.colorUI,
591
+ visConfig = _this$config.visConfig;
632
592
  if (!(0, _utils.isPlainObject)(newConfig) || typeof prop !== 'string') {
633
593
  return this;
634
594
  }
635
-
636
595
  var colorUIProp = Object.entries(newConfig).reduce(function (accu, _ref4) {
637
596
  var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
638
- key = _ref5[0],
639
- value = _ref5[1];
640
-
597
+ key = _ref5[0],
598
+ value = _ref5[1];
641
599
  return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, (0, _utils.isPlainObject)(accu[key]) && (0, _utils.isPlainObject)(value) ? _objectSpread(_objectSpread({}, accu[key]), value) : value));
642
600
  }, previous[prop] || _layerFactory.DEFAULT_COLOR_UI);
643
-
644
601
  var colorUI = _objectSpread(_objectSpread({}, previous), {}, (0, _defineProperty2["default"])({}, prop, colorUIProp));
645
-
646
602
  this.updateLayerConfig({
647
603
  colorUI: colorUI
648
- }); // if colorUI[prop] is colorRange. If type is hexColor then it's also a range
649
-
604
+ });
605
+ // if colorUI[prop] is colorRange. If type is hexColor then it's also a range
650
606
  var isColorRange = visConfig[prop] && (visConfig[prop].colors || visConfig[prop].type === _colorRanges.hexColor);
651
-
652
607
  if (isColorRange) {
653
608
  this.updateColorUIByColorRange(newConfig, prop);
654
609
  this.updateColorRangeByColorUI(newConfig, previous, prop);
655
610
  this.updateCustomPalette(newConfig, previous, prop);
656
611
  }
657
-
658
612
  return this;
659
613
  }
660
614
  }, {
@@ -663,18 +617,15 @@ var Layer = /*#__PURE__*/function () {
663
617
  if (!newConfig.colorRangeConfig || !newConfig.colorRangeConfig.custom) {
664
618
  return;
665
619
  }
666
-
667
620
  var _this$config2 = this.config,
668
- colorUI = _this$config2.colorUI,
669
- visConfig = _this$config2.visConfig;
621
+ colorUI = _this$config2.colorUI,
622
+ visConfig = _this$config2.visConfig;
670
623
  if (!visConfig[prop]) return;
671
624
  var colors = visConfig[prop].colors;
672
-
673
625
  var customPalette = _objectSpread(_objectSpread({}, colorUI[prop].customPalette), {}, {
674
626
  name: 'Custom Palette',
675
627
  colors: (0, _toConsumableArray2["default"])(colors)
676
628
  });
677
-
678
629
  this.updateLayerConfig({
679
630
  colorUI: _objectSpread(_objectSpread({}, colorUI), {}, (0, _defineProperty2["default"])({}, prop, _objectSpread(_objectSpread({}, colorUI[prop]), {}, {
680
631
  customPalette: customPalette
@@ -687,16 +638,14 @@ var Layer = /*#__PURE__*/function () {
687
638
  * @param {*} newConfig
688
639
  * @param {*} prop
689
640
  */
690
-
691
641
  }, {
692
642
  key: "updateColorUIByColorRange",
693
643
  value: function updateColorUIByColorRange(newConfig, prop) {
694
644
  var _visConfig$prop$color;
695
-
696
645
  if (typeof newConfig.showDropdown !== 'number') return;
697
646
  var _this$config3 = this.config,
698
- colorUI = _this$config3.colorUI,
699
- visConfig = _this$config3.visConfig;
647
+ colorUI = _this$config3.colorUI,
648
+ visConfig = _this$config3.visConfig;
700
649
  this.updateLayerConfig({
701
650
  colorUI: _objectSpread(_objectSpread({}, colorUI), {}, (0, _defineProperty2["default"])({}, prop, _objectSpread(_objectSpread({}, colorUI[prop]), {}, {
702
651
  colorRangeConfig: _objectSpread(_objectSpread({}, colorUI[prop].colorRangeConfig), {}, {
@@ -708,8 +657,9 @@ var Layer = /*#__PURE__*/function () {
708
657
  })
709
658
  })))
710
659
  });
711
- } // eslint-disable-next-line complexity
660
+ }
712
661
 
662
+ // eslint-disable-next-line complexity
713
663
  }, {
714
664
  key: "updateColorRangeByColorUI",
715
665
  value: function updateColorRangeByColorUI(newConfig, previous, prop) {
@@ -719,41 +669,34 @@ var Layer = /*#__PURE__*/function () {
719
669
  });
720
670
  if (!shouldUpdate) return;
721
671
  var _this$config4 = this.config,
722
- colorUI = _this$config4.colorUI,
723
- visConfig = _this$config4.visConfig;
672
+ colorUI = _this$config4.colorUI,
673
+ visConfig = _this$config4.visConfig;
724
674
  var _colorUI$prop$colorRa = colorUI[prop].colorRangeConfig,
725
- steps = _colorUI$prop$colorRa.steps,
726
- reversed = _colorUI$prop$colorRa.reversed;
727
- var colorRange = visConfig[prop]; // find based on step or reversed
728
-
675
+ steps = _colorUI$prop$colorRa.steps,
676
+ reversed = _colorUI$prop$colorRa.reversed;
677
+ var colorRange = visConfig[prop];
678
+ // find based on step or reversed
729
679
  var update;
730
-
731
680
  if (newConfig.colorRangeConfig.hasOwnProperty('steps')) {
732
681
  var group = (0, _colorUtils.getColorGroupByName)(colorRange);
733
-
734
682
  if (group) {
735
683
  var sameGroup = _colorRanges.COLOR_RANGES.filter(function (cr) {
736
684
  return (0, _colorUtils.getColorGroupByName)(cr) === group;
737
685
  });
738
-
739
686
  update = sameGroup.find(function (cr) {
740
687
  return cr.colors.length === steps;
741
688
  });
742
-
743
689
  if (update && colorRange.reversed) {
744
690
  update = (0, _colorUtils.reverseColorRange)(true, update);
745
691
  }
746
-
747
692
  if (update && colorRange.colorMap) {
748
693
  update = this.updateColorMap(prop, colorRange.colorMap, update);
749
694
  }
750
695
  }
751
696
  }
752
-
753
697
  if (newConfig.colorRangeConfig.hasOwnProperty('reversed')) {
754
698
  update = (0, _colorUtils.reverseColorRange)(reversed, update || colorRange);
755
699
  }
756
-
757
700
  if (update) {
758
701
  this.updateLayerVisConfig((0, _defineProperty2["default"])({}, prop, update));
759
702
  }
@@ -762,21 +705,18 @@ var Layer = /*#__PURE__*/function () {
762
705
  key: "updateColorMap",
763
706
  value: function updateColorMap(prop, colorMap, colorRange) {
764
707
  var _this$config$field;
765
-
766
708
  // @ts-ignore
767
709
  var _Object$values$find = Object.values(this.visualChannels).find(function (value) {
768
- return value.range === prop;
769
- }),
770
- field = _Object$values$find.field,
771
- domain = _Object$values$find.domain;
772
-
710
+ return value.range === prop;
711
+ }),
712
+ field = _Object$values$find.field,
713
+ domain = _Object$values$find.domain;
773
714
  var type = (_this$config$field = this.config[field]) === null || _this$config$field === void 0 ? void 0 : _this$config$field.type;
774
-
775
715
  if (type === 'string' || type === 'boolean' || type === 'date') {
776
716
  return this.updateCategoryColorMap(colorMap, this.config[domain], colorRange);
777
- } // If no type or type is not string, boolean or date
778
-
717
+ }
779
718
 
719
+ // If no type or type is not string, boolean or date
780
720
  return this.updateNumericColorMap(colorMap, this.config[domain], colorRange);
781
721
  }
782
722
  }, {
@@ -784,33 +724,27 @@ var Layer = /*#__PURE__*/function () {
784
724
  value: function updateCategoryColorMap(colorMap, domain, colorRange) {
785
725
  var colors = colorRange.colors;
786
726
  var assignedCategories = [];
787
-
788
727
  if (colorRange.type === _colorRanges.hexColor) {
789
728
  return _objectSpread(_objectSpread({}, colorRange), {}, {
790
729
  colorMap: []
791
730
  });
792
731
  }
793
-
794
732
  var newColorMap = colorMap.slice(0, colors.length).map(function (cMap, index) {
795
733
  assignedCategories.push(cMap[0]);
796
734
  return [cMap[0], colors[index]];
797
735
  });
798
736
  var unassignedColors = colors.slice(newColorMap.length, colors.length);
799
-
800
737
  var _iterator = _createForOfIteratorHelper(unassignedColors),
801
- _step;
802
-
738
+ _step;
803
739
  try {
804
740
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
805
741
  var color = _step.value;
806
742
  var category = domain.find(function (d) {
807
743
  return !assignedCategories.includes(d);
808
744
  });
809
-
810
745
  if (!category) {
811
746
  break;
812
747
  }
813
-
814
748
  assignedCategories.push(category);
815
749
  newColorMap.push([category, color]);
816
750
  }
@@ -819,7 +753,6 @@ var Layer = /*#__PURE__*/function () {
819
753
  } finally {
820
754
  _iterator.f();
821
755
  }
822
-
823
756
  return _objectSpread(_objectSpread({}, colorRange), {}, {
824
757
  colorMap: newColorMap
825
758
  });
@@ -834,7 +767,6 @@ var Layer = /*#__PURE__*/function () {
834
767
  return [value, colors[index]];
835
768
  });
836
769
  var unassignedColors = colors.slice(newColorMap.length, colors.length);
837
-
838
770
  if (unassignedColors.length > 0) {
839
771
  var colorMapValues = colorMap.map(function (c) {
840
772
  return c[0];
@@ -845,16 +777,13 @@ var Layer = /*#__PURE__*/function () {
845
777
  var prevValue = newColorMap[newColorMap.length - 2][0];
846
778
  var step = (maxValue - prevValue) / (unassignedColors.length + 1);
847
779
  newColorMap[newColorMap.length - 1][0] = prevValue + step;
848
-
849
780
  var _iterator2 = _createForOfIteratorHelper(unassignedColors.entries()),
850
- _step2;
851
-
781
+ _step2;
852
782
  try {
853
783
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
854
784
  var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
855
- i = _step2$value[0],
856
- color = _step2$value[1];
857
-
785
+ i = _step2$value[0],
786
+ color = _step2$value[1];
858
787
  var value = i === unassignedColors.length - 1 ? null : prevValue + step * (i + 2);
859
788
  newColorMap.push([value, color]);
860
789
  }
@@ -864,16 +793,15 @@ var Layer = /*#__PURE__*/function () {
864
793
  _iterator2.f();
865
794
  }
866
795
  }
867
-
868
796
  return _objectSpread(_objectSpread({}, update), {}, {
869
797
  colorMap: newColorMap
870
798
  });
871
799
  }
800
+
872
801
  /**
873
802
  * Check whether layer has all columns
874
803
  * @returns {boolean} yes or no
875
804
  */
876
-
877
805
  }, {
878
806
  key: "hasAllColumns",
879
807
  value: function hasAllColumns() {
@@ -882,20 +810,19 @@ var Layer = /*#__PURE__*/function () {
882
810
  return Boolean(v.optional || v.value && v.fieldIdx > -1);
883
811
  });
884
812
  }
813
+
885
814
  /**
886
815
  * Check whether layer has data
887
816
  *
888
817
  * @param {Array | Object} layerData
889
818
  * @returns {boolean} yes or no
890
819
  */
891
-
892
820
  }, {
893
821
  key: "hasLayerData",
894
822
  value: function hasLayerData(layerData) {
895
823
  if (!layerData) {
896
824
  return false;
897
825
  }
898
-
899
826
  return Boolean(layerData.data && layerData.data.length);
900
827
  }
901
828
  }, {
@@ -914,69 +841,61 @@ var Layer = /*#__PURE__*/function () {
914
841
  if (colorRange.type === _colorRanges.hexColor) {
915
842
  return function (_, color) {
916
843
  var _rgb = (0, _d3Color.rgb)(color),
917
- r = _rgb.r,
918
- g = _rgb.g,
919
- b = _rgb.b;
920
-
844
+ r = _rgb.r,
845
+ g = _rgb.g,
846
+ b = _rgb.b;
921
847
  return [r, g, b].some(isNaN) ? _defaultSettings.UNKNOWN_COLOR : [r, g, b];
922
848
  };
923
849
  } else if (Array.isArray(colorRange.colorMap)) {
924
850
  var cMap = new Map();
925
851
  colorRange.colorMap.forEach(function (_ref6) {
926
852
  var _ref7 = (0, _slicedToArray2["default"])(_ref6, 2),
927
- k = _ref7[0],
928
- v = _ref7[1];
929
-
853
+ k = _ref7[0],
854
+ v = _ref7[1];
930
855
  cMap.set(k, typeof v === 'string' ? (0, _colorUtils.hexToRgb)(v) : v);
931
- }); // @ts-ignore d3 scale
856
+ });
932
857
 
858
+ // @ts-ignore d3 scale
933
859
  var scale = _defaultSettings.SCALE_FUNC[colorScale]().domain(Array.from(cMap.keys())).range(Array.from(cMap.values())).unknown(_defaultSettings.UNKNOWN_COLOR);
934
-
935
860
  return scale;
936
861
  }
937
-
938
862
  return this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb));
939
863
  }
940
864
  }, {
941
865
  key: "getCustomMarkersScale",
942
866
  value: function getCustomMarkersScale(range, fallbackIcon) {
943
867
  var unknownValue = fallbackIcon || FALLBACK_ICON;
944
-
945
868
  if (!range) {
946
869
  return function () {
947
870
  return unknownValue;
948
871
  };
949
872
  }
950
-
951
873
  var mapping = new Map();
952
-
953
874
  if (range.othersMarker) {
954
875
  unknownValue = range.othersMarker;
955
876
  }
956
-
957
877
  var _iterator3 = _createForOfIteratorHelper(range.markerMap),
958
- _step3;
959
-
878
+ _step3;
960
879
  try {
961
880
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
962
881
  var _step3$value = _step3.value,
963
- value = _step3$value.value,
964
- markerUrl = _step3$value.markerUrl;
965
-
882
+ value = _step3$value.value,
883
+ markerUrl = _step3$value.markerUrl;
966
884
  if (markerUrl) {
967
885
  mapping.set(value, markerUrl);
968
886
  }
969
- } // @ts-ignore d3 scale
887
+ }
970
888
 
889
+ // @ts-ignore d3 scale
971
890
  } catch (err) {
972
891
  _iterator3.e(err);
973
892
  } finally {
974
893
  _iterator3.f();
975
894
  }
976
-
977
895
  var scale = (0, _d3Scale.scaleOrdinal)().domain(Array.from(mapping.keys())).range(Array.from(mapping.values())).unknown(unknownValue);
978
896
  return scale;
979
897
  }
898
+
980
899
  /**
981
900
  * Mapping from visual channels to deck.gl accesors
982
901
  * @param {Object} param Parameters
@@ -984,41 +903,38 @@ var Layer = /*#__PURE__*/function () {
984
903
  * @param {import('utils/table-utils/data-container-interface').DataContainerInterface} param.dataContainer DataContainer to use use with dataAccessor
985
904
  * @return {Object} attributeAccessors - deck.gl layer attribute accessors
986
905
  */
987
-
988
906
  }, {
989
907
  key: "getAttributeAccessors",
990
908
  value: function getAttributeAccessors(_ref8) {
991
909
  var _this4 = this;
992
-
993
910
  var _ref8$dataAccessor = _ref8.dataAccessor,
994
- dataAccessor = _ref8$dataAccessor === void 0 ? defaultDataAccessor : _ref8$dataAccessor,
995
- dataContainer = _ref8.dataContainer;
996
- var attributeAccessors = {}; // eslint-disable-next-line complexity
911
+ dataAccessor = _ref8$dataAccessor === void 0 ? defaultDataAccessor : _ref8$dataAccessor,
912
+ dataContainer = _ref8.dataContainer;
913
+ var attributeAccessors = {};
997
914
 
915
+ // eslint-disable-next-line complexity
998
916
  Object.keys(this.visualChannels).forEach(function (channel) {
999
917
  var _this4$visualChannels = _this4.visualChannels[channel],
1000
- field = _this4$visualChannels.field,
1001
- fixed = _this4$visualChannels.fixed,
1002
- scale = _this4$visualChannels.scale,
1003
- domain = _this4$visualChannels.domain,
1004
- range = _this4$visualChannels.range,
1005
- accessor = _this4$visualChannels.accessor,
1006
- defaultValue = _this4$visualChannels.defaultValue,
1007
- getAttributeValue = _this4$visualChannels.getAttributeValue,
1008
- nullValue = _this4$visualChannels.nullValue,
1009
- channelScaleType = _this4$visualChannels.channelScaleType,
1010
- aggregation = _this4$visualChannels.aggregation;
918
+ field = _this4$visualChannels.field,
919
+ fixed = _this4$visualChannels.fixed,
920
+ scale = _this4$visualChannels.scale,
921
+ domain = _this4$visualChannels.domain,
922
+ range = _this4$visualChannels.range,
923
+ accessor = _this4$visualChannels.accessor,
924
+ defaultValue = _this4$visualChannels.defaultValue,
925
+ getAttributeValue = _this4$visualChannels.getAttributeValue,
926
+ nullValue = _this4$visualChannels.nullValue,
927
+ channelScaleType = _this4$visualChannels.channelScaleType,
928
+ aggregation = _this4$visualChannels.aggregation;
1011
929
  var shouldGetScale = Boolean((scale || channelScaleType === _defaultSettings.CHANNEL_SCALES.identity) && _this4.config[field]);
1012
-
1013
930
  if (shouldGetScale) {
1014
931
  var args = [_this4.config[scale], _this4.config[domain], _this4.config.visConfig[range]];
1015
- var isFixed = fixed && _this4.config.visConfig[fixed]; // It's important to declare as const all the parameters that we are going to be use in the getEncodedChannelValue call
932
+ var isFixed = fixed && _this4.config.visConfig[fixed];
933
+ // It's important to declare as const all the parameters that we are going to be use in the getEncodedChannelValue call
1016
934
  // otherwise, the oldLayerData parameter in formatLayerData method will be wrong (you can check the formatLayerData TileLayer method in Builder as example)
1017
-
1018
935
  var fieldConfig = _this4.config[field];
1019
936
  var aggregationValue = _this4.config.visConfig[aggregation];
1020
937
  var scaleFunction = channelScaleType === _defaultSettings.CHANNEL_SCALES.identity ? scaleIdentity : channelScaleType === _defaultSettings.CHANNEL_SCALES.color ? _this4.getColorScale.apply(_this4, args) : channelScaleType === _defaultSettings.CHANNEL_SCALES.customMarker ? _this4.getCustomMarkersScale(_this4.config.visConfig[range], _this4.config.visConfig.customMarkersUrl) : _this4.getVisChannelScale.apply(_this4, args.concat([isFixed]));
1021
-
1022
938
  attributeAccessors[accessor] = function (d) {
1023
939
  return _this4.getEncodedChannelValue({
1024
940
  channel: channel,
@@ -1035,7 +951,6 @@ var Layer = /*#__PURE__*/function () {
1035
951
  } else {
1036
952
  attributeAccessors[accessor] = typeof defaultValue === 'function' ? defaultValue(_this4.config) : defaultValue;
1037
953
  }
1038
-
1039
954
  if (!(accessor in attributeAccessors)) {
1040
955
  _window.console.warn("Failed to provide accessor function for ".concat(accessor || channel));
1041
956
  }
@@ -1048,28 +963,26 @@ var Layer = /*#__PURE__*/function () {
1048
963
  if (scale === _defaultSettings.SCALE_TYPES.ordinal) {
1049
964
  // @ts-ignore d3-scale type
1050
965
  return _defaultSettings.SCALE_FUNC[scale]().domain(domain.slice(0, range.length)).range(range).unknown(_defaultSettings.UNKNOWN_COLOR);
1051
- } // for `count` aggregation, we domain is actually `[0, Infinity]` so it doesn't make sense
1052
- // to use it, so skip specyfying this domains
1053
-
966
+ }
1054
967
 
968
+ // for `count` aggregation, we domain is actually `[0, Infinity]` so it doesn't make sense
969
+ // to use it, so skip specyfying this domains
1055
970
  var domainIsInfinite = domain && domain[0] === 0 && domain[1] === Infinity;
1056
- var scaleFactory = _defaultSettings.SCALE_FUNC[fixed ? 'linear' : scale]; // @ts-ignore d3-scale type
1057
-
971
+ var scaleFactory = _defaultSettings.SCALE_FUNC[fixed ? 'linear' : scale];
972
+ // @ts-ignore d3-scale type
1058
973
  var result = scaleFactory();
1059
-
1060
974
  if (domain && !domainIsInfinite) {
1061
975
  result = result.domain(domain);
1062
976
  }
1063
-
1064
977
  return result.range(fixed ? domain : range);
1065
978
  }
979
+
1066
980
  /**
1067
981
  * Get longitude and latitude bounds of the data.
1068
982
  * @param {import('utils/table-utils/data-container-interface').DataContainerInterface} dataContainer DataContainer to calculate bounds for.
1069
983
  * @param {(d: {index: number}, dc: import('utils/table-utils/data-container-interface').DataContainerInterface) => number[]} getPosition Access kepler.gl layer data from deck.gl layer
1070
984
  * @return {number[]|null} bounds of the data.
1071
985
  */
1072
-
1073
986
  }, {
1074
987
  key: "getPointsBounds",
1075
988
  value: function getPointsBounds(dataContainer, getPosition) {
@@ -1079,11 +992,9 @@ var Layer = /*#__PURE__*/function () {
1079
992
  var points = sampleData.mapIndex(getPosition);
1080
993
  var latBounds = (0, _dataUtils.getLatLngBounds)(points, 1, [-90, 90]);
1081
994
  var lngBounds = (0, _dataUtils.getLatLngBounds)(points, 0, [-180, 180]);
1082
-
1083
995
  if (!latBounds || !lngBounds) {
1084
996
  return null;
1085
997
  }
1086
-
1087
998
  return [lngBounds[0], latBounds[0], lngBounds[1], latBounds[1]];
1088
999
  }
1089
1000
  }, {
@@ -1097,21 +1008,20 @@ var Layer = /*#__PURE__*/function () {
1097
1008
  key: "getEncodedChannelValue",
1098
1009
  value: function getEncodedChannelValue(_ref9) {
1099
1010
  var channel = _ref9.channel,
1100
- scale = _ref9.scale,
1101
- data = _ref9.data,
1102
- field = _ref9.field,
1103
- dataContainer = _ref9.dataContainer,
1104
- _aggregation = _ref9._aggregation,
1105
- _ref9$nullValue = _ref9.nullValue,
1106
- nullValue = _ref9$nullValue === void 0 ? _defaultSettings.NO_VALUE_COLOR : _ref9$nullValue,
1107
- _ref9$getValue = _ref9.getValue,
1108
- getValue = _ref9$getValue === void 0 ? defaultGetFieldValue : _ref9$getValue;
1011
+ scale = _ref9.scale,
1012
+ data = _ref9.data,
1013
+ field = _ref9.field,
1014
+ dataContainer = _ref9.dataContainer,
1015
+ _aggregation = _ref9._aggregation,
1016
+ _ref9$nullValue = _ref9.nullValue,
1017
+ nullValue = _ref9$nullValue === void 0 ? _defaultSettings.NO_VALUE_COLOR : _ref9$nullValue,
1018
+ _ref9$getValue = _ref9.getValue,
1019
+ getValue = _ref9$getValue === void 0 ? defaultGetFieldValue : _ref9$getValue;
1109
1020
  var colorColumnValue;
1110
1021
  var type = field.type;
1111
1022
  var value = getValue(field, data);
1112
1023
  var channelConfig = this.config.visConfig[this.visualChannels[channel].range];
1113
1024
  var channelField = this.config[this.visualChannels[channel].field];
1114
-
1115
1025
  if (channelConfig.type === _colorRanges.hexColor) {
1116
1026
  var columnField = {
1117
1027
  id: channelField.colorColumn,
@@ -1125,9 +1035,7 @@ var Layer = /*#__PURE__*/function () {
1125
1035
  } else if (!(0, _dataUtils.notNullorUndefined)(value)) {
1126
1036
  return nullValue;
1127
1037
  }
1128
-
1129
1038
  var attributeValue;
1130
-
1131
1039
  if (type === _defaultSettings.ALL_FIELD_TYPES.timestamp) {
1132
1040
  // shouldn't need to convert here
1133
1041
  // scale Function should take care of it
@@ -1135,11 +1043,9 @@ var Layer = /*#__PURE__*/function () {
1135
1043
  } else {
1136
1044
  attributeValue = scale(value, colorColumnValue);
1137
1045
  }
1138
-
1139
1046
  if (!(0, _dataUtils.notNullorUndefined)(attributeValue)) {
1140
1047
  attributeValue = nullValue;
1141
1048
  }
1142
-
1143
1049
  return attributeValue;
1144
1050
  }
1145
1051
  }, {
@@ -1156,8 +1062,8 @@ var Layer = /*#__PURE__*/function () {
1156
1062
  key: "getDataUpdateTriggers",
1157
1063
  value: function getDataUpdateTriggers(_ref10) {
1158
1064
  var filteredIndex = _ref10.filteredIndex,
1159
- id = _ref10.id,
1160
- allData = _ref10.allData;
1065
+ id = _ref10.id,
1066
+ allData = _ref10.allData;
1161
1067
  var columns = this.config.columns;
1162
1068
  return _objectSpread({
1163
1069
  getData: {
@@ -1181,7 +1087,6 @@ var Layer = /*#__PURE__*/function () {
1181
1087
  if (!this.config.dataId) {
1182
1088
  return {};
1183
1089
  }
1184
-
1185
1090
  var dataset = this.getDataset(datasets);
1186
1091
  var dataContainer = dataset.dataContainer;
1187
1092
  this.updateVisualChannelFields(dataset);
@@ -1189,71 +1094,61 @@ var Layer = /*#__PURE__*/function () {
1189
1094
  var getPosition = this.getPositionAccessor(dataContainer);
1190
1095
  var dataUpdateTriggers = this.getDataUpdateTriggers(dataset);
1191
1096
  var triggerChanged = this.getChangedTriggers(dataUpdateTriggers);
1192
-
1193
1097
  if (triggerChanged.getMeta) {
1194
1098
  this.updateLayerMeta(dataContainer, getPosition);
1195
1099
  }
1196
-
1197
1100
  var data = [];
1198
-
1199
1101
  if (!triggerChanged.getData && oldLayerData && oldLayerData.data) {
1200
1102
  // same data
1201
1103
  data = oldLayerData.data;
1202
1104
  } else {
1203
1105
  data = this.calculateDataAttribute(dataset, getPosition);
1204
1106
  }
1205
-
1206
1107
  return {
1207
1108
  data: data,
1208
1109
  triggerChanged: triggerChanged
1209
1110
  };
1210
1111
  }
1112
+
1211
1113
  /**
1212
1114
  * Update styled fields to match ones from new dataset.
1213
1115
  *
1214
1116
  * @param {Object} dataset
1215
1117
  */
1216
-
1217
1118
  }, {
1218
1119
  key: "updateVisualChannelFields",
1219
1120
  value: function updateVisualChannelFields(dataset) {
1220
1121
  var _this5 = this;
1221
-
1222
1122
  var _loop = function _loop() {
1223
- var _this5$config$visConf;
1224
-
1225
- var _Object$values$_i = _Object$values[_i],
1123
+ var _this5$config$visConf;
1124
+ var _Object$values$_i = _Object$values[_i],
1226
1125
  field = _Object$values$_i.field,
1227
1126
  range = _Object$values$_i.range;
1228
- var oldField = _this5.config[field];
1229
- var isUsingHexColorCode = (_this5$config$visConf = _this5.config.visConfig[range]) === null || _this5$config$visConf === void 0 ? void 0 : _this5$config$visConf.hexColor;
1230
-
1231
- if (!oldField) {
1232
- return {
1233
- v: void 0
1234
- };
1235
- }
1236
-
1237
- var newDataSetField = dataset.fields.find(function (fd) {
1238
- return fd.name === oldField.name;
1239
- }) || null;
1240
-
1241
- if (isUsingHexColorCode) {
1242
- newDataSetField = _objectSpread(_objectSpread({}, newDataSetField), {}, {
1243
- colorColumn: newDataSetField.colorColumn || oldField.colorColumn,
1244
- colorColumnIdx: newDataSetField.colorColumnIdx || oldField.colorColumnIdx
1245
- });
1246
- }
1247
-
1248
- _this5.updateLayerConfig((0, _defineProperty2["default"])({}, field, newDataSetField));
1249
- };
1250
-
1127
+ var oldField = _this5.config[field];
1128
+ var isUsingHexColorCode = (_this5$config$visConf = _this5.config.visConfig[range]) === null || _this5$config$visConf === void 0 ? void 0 : _this5$config$visConf.hexColor;
1129
+ if (!oldField) {
1130
+ return {
1131
+ v: void 0
1132
+ };
1133
+ }
1134
+ var newDataSetField = dataset.fields.find(function (fd) {
1135
+ return fd.name === oldField.name;
1136
+ }) || null;
1137
+ if (isUsingHexColorCode) {
1138
+ newDataSetField = _objectSpread(_objectSpread({}, newDataSetField), {}, {
1139
+ colorColumn: newDataSetField.colorColumn || oldField.colorColumn,
1140
+ colorColumnIdx: newDataSetField.colorColumnIdx || oldField.colorColumnIdx
1141
+ });
1142
+ }
1143
+ _this5.updateLayerConfig((0, _defineProperty2["default"])({}, field, newDataSetField));
1144
+ },
1145
+ _ret;
1251
1146
  for (var _i = 0, _Object$values = Object.values(this.visualChannels); _i < _Object$values.length; _i++) {
1252
- var _ret = _loop();
1253
-
1254
- if ((0, _typeof2["default"])(_ret) === "object") return _ret.v;
1147
+ _ret = _loop();
1148
+ if (_ret) return _ret.v;
1255
1149
  }
1256
1150
  }
1151
+
1257
1152
  /**
1258
1153
  * helper function to update one layer domain when state.data changed
1259
1154
  * if state.data change is due ot update filter, newFiler will be passed
@@ -1262,28 +1157,23 @@ var Layer = /*#__PURE__*/function () {
1262
1157
  * @param {Object} newFilter
1263
1158
  * @returns {object} layer
1264
1159
  */
1265
-
1266
1160
  }, {
1267
1161
  key: "updateLayerDomain",
1268
1162
  value: function updateLayerDomain(datasets, newFilter) {
1269
1163
  var _this6 = this;
1270
-
1271
1164
  var table = this.getDataset(datasets);
1272
-
1273
1165
  if (!table) {
1274
1166
  return this;
1275
1167
  }
1276
-
1277
1168
  Object.values(this.visualChannels).forEach(function (channel) {
1278
1169
  var scale = channel.scale;
1279
- var scaleType = _this6.config[scale]; // ordinal domain is based on dataContainer, if only filter changed
1280
- // no need to update ordinal domain
1170
+ var scaleType = _this6.config[scale];
1281
1171
 
1172
+ // ordinal domain is based on dataContainer, if only filter changed
1173
+ // no need to update ordinal domain
1282
1174
  if (!newFilter || scaleType !== _defaultSettings.SCALE_TYPES.ordinal) {
1283
1175
  var domain = channel.domain;
1284
-
1285
1176
  var updatedDomain = _this6.calculateLayerDomain(table, channel);
1286
-
1287
1177
  _this6.updateLayerConfig((0, _defineProperty2["default"])({}, domain, updatedDomain));
1288
1178
  }
1289
1179
  });
@@ -1294,33 +1184,31 @@ var Layer = /*#__PURE__*/function () {
1294
1184
  value: function getDataset(datasets) {
1295
1185
  return this.config.dataId ? datasets[this.config.dataId] : null;
1296
1186
  }
1187
+
1297
1188
  /**
1298
1189
  * Validate visual channel field and scales based on supported field & scale type
1299
1190
  * @param channel
1300
1191
  */
1301
-
1302
1192
  }, {
1303
1193
  key: "validateVisualChannel",
1304
1194
  value: function validateVisualChannel(channel) {
1305
1195
  this.validateFieldType(channel);
1306
1196
  this.validateScale(channel);
1307
1197
  }
1198
+
1308
1199
  /**
1309
1200
  * Validate field type based on channelScaleType
1310
1201
  */
1311
-
1312
1202
  }, {
1313
1203
  key: "validateFieldType",
1314
1204
  value: function validateFieldType(channel) {
1315
1205
  var visualChannel = this.visualChannels[channel];
1316
1206
  var field = visualChannel.field,
1317
- channelScaleType = visualChannel.channelScaleType,
1318
- supportedFieldTypes = visualChannel.supportedFieldTypes;
1319
-
1207
+ channelScaleType = visualChannel.channelScaleType,
1208
+ supportedFieldTypes = visualChannel.supportedFieldTypes;
1320
1209
  if (this.config[field]) {
1321
1210
  // if field is selected, check if field type is supported
1322
1211
  var channelSupportedFieldTypes = supportedFieldTypes || _defaultSettings.CHANNEL_SCALE_SUPPORTED_FIELDS[channelScaleType];
1323
-
1324
1212
  if (!channelSupportedFieldTypes.includes(this.config[field].type)) {
1325
1213
  // field type is not supported, set it back to null
1326
1214
  // set scale back to default
@@ -1328,50 +1216,48 @@ var Layer = /*#__PURE__*/function () {
1328
1216
  }
1329
1217
  }
1330
1218
  }
1219
+
1331
1220
  /**
1332
1221
  * Validate scale type based on aggregation
1333
1222
  */
1334
-
1335
1223
  }, {
1336
1224
  key: "validateScale",
1337
1225
  value: function validateScale(channel) {
1338
1226
  var visualChannel = this.visualChannels[channel];
1339
1227
  var scale = visualChannel.scale,
1340
- range = visualChannel.range;
1341
-
1228
+ range = visualChannel.range;
1342
1229
  if (!scale || this.isColoredByColorColumn(range) && this.config[scale] === _defaultSettings.SCALE_TYPES.identity) {
1343
1230
  // visualChannel doesn't have scale
1344
1231
  return;
1345
1232
  }
1346
-
1347
- var scaleOptions = this.getScaleOptions(channel); // check if current selected scale is
1233
+ var scaleOptions = this.getScaleOptions(channel);
1234
+ // check if current selected scale is
1348
1235
  // supported, if not, change to default
1349
-
1350
1236
  if (!scaleOptions.includes(this.config[scale])) {
1351
1237
  this.updateLayerConfig((0, _defineProperty2["default"])({}, scale, scaleOptions[0]));
1352
1238
  }
1353
1239
  }
1240
+
1354
1241
  /**
1355
1242
  * Get scale options based on current field
1356
1243
  * @param {string} channel
1357
1244
  * @returns {string[]}
1358
1245
  */
1359
-
1360
1246
  }, {
1361
1247
  key: "getScaleOptions",
1362
1248
  value: function getScaleOptions(channel) {
1363
1249
  var visualChannel = this.visualChannels[channel];
1364
1250
  var field = visualChannel.field,
1365
- scale = visualChannel.scale,
1366
- channelScaleType = visualChannel.channelScaleType;
1251
+ scale = visualChannel.scale,
1252
+ channelScaleType = visualChannel.channelScaleType;
1367
1253
  return this.config[field] ? _defaultSettings.FIELD_OPTS[this.config[field].type].scale[channelScaleType] : [this.getDefaultLayerConfig()[scale]];
1368
1254
  }
1369
1255
  }, {
1370
1256
  key: "updateLayerVisualChannel",
1371
1257
  value: function updateLayerVisualChannel(dataset, channel) {
1372
1258
  var visualChannel = this.visualChannels[channel];
1373
- this.validateVisualChannel(channel); // calculate layer channel domain
1374
-
1259
+ this.validateVisualChannel(channel);
1260
+ // calculate layer channel domain
1375
1261
  var updatedDomain = this.calculateLayerDomain(dataset, visualChannel);
1376
1262
  this.updateLayerConfig((0, _defineProperty2["default"])({}, visualChannel.domain, updatedDomain));
1377
1263
  }
@@ -1379,20 +1265,17 @@ var Layer = /*#__PURE__*/function () {
1379
1265
  key: "getVisualChannelUpdateTriggers",
1380
1266
  value: function getVisualChannelUpdateTriggers() {
1381
1267
  var _this7 = this;
1382
-
1383
1268
  var updateTriggers = {};
1384
1269
  Object.values(this.visualChannels).forEach(function (visualChannel) {
1385
- var _objectSpread11;
1386
-
1387
1270
  // field range scale domain
1388
1271
  var accessor = visualChannel.accessor,
1389
- field = visualChannel.field,
1390
- scale = visualChannel.scale,
1391
- domain = visualChannel.domain,
1392
- range = visualChannel.range,
1393
- defaultValue = visualChannel.defaultValue,
1394
- fixed = visualChannel.fixed;
1395
- updateTriggers[accessor] = _objectSpread((_objectSpread11 = {}, (0, _defineProperty2["default"])(_objectSpread11, field, _this7.config[field]), (0, _defineProperty2["default"])(_objectSpread11, scale, _this7.config[scale]), (0, _defineProperty2["default"])(_objectSpread11, domain, _this7.config[domain]), (0, _defineProperty2["default"])(_objectSpread11, range, _this7.config.visConfig[range]), (0, _defineProperty2["default"])(_objectSpread11, "defaultValue", typeof defaultValue === 'function' ? defaultValue(_this7.config) : defaultValue), _objectSpread11), fixed ? (0, _defineProperty2["default"])({}, fixed, _this7.config.visConfig[fixed]) : {});
1272
+ field = visualChannel.field,
1273
+ scale = visualChannel.scale,
1274
+ domain = visualChannel.domain,
1275
+ range = visualChannel.range,
1276
+ defaultValue = visualChannel.defaultValue,
1277
+ fixed = visualChannel.fixed;
1278
+ updateTriggers[accessor] = _objectSpread((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, field, _this7.config[field]), scale, _this7.config[scale]), domain, _this7.config[domain]), range, _this7.config.visConfig[range]), "defaultValue", typeof defaultValue === 'function' ? defaultValue(_this7.config) : defaultValue), fixed ? (0, _defineProperty2["default"])({}, fixed, _this7.config.visConfig[fixed]) : {});
1396
1279
  });
1397
1280
  return updateTriggers;
1398
1281
  }
@@ -1401,37 +1284,30 @@ var Layer = /*#__PURE__*/function () {
1401
1284
  value: function calculateLayerDomain(dataset, visualChannel) {
1402
1285
  var scale = visualChannel.scale;
1403
1286
  var field = this.config[visualChannel.field];
1404
-
1405
1287
  if (!field || !scale) {
1406
1288
  // if colorField or sizeField were set back to null
1407
1289
  return defaultDomain;
1408
1290
  }
1409
-
1410
1291
  var scaleType = this.config[scale];
1411
1292
  var dataSetField = dataset.fields.find(function (f) {
1412
1293
  return f.name === field.name;
1413
1294
  });
1414
-
1415
1295
  if (!scaleType || !dataSetField) {
1416
1296
  // if new dataset doesn't contain previously set field
1417
1297
  return defaultDomain;
1418
1298
  }
1419
-
1420
1299
  return dataset.getColumnLayerDomain(dataSetField, scaleType) || defaultDomain;
1421
1300
  }
1422
1301
  }, {
1423
1302
  key: "updateHexColorDomain",
1424
1303
  value: function updateHexColorDomain(dataset) {
1425
1304
  var _this8 = this;
1426
-
1427
1305
  if (!dataset) {
1428
1306
  return this;
1429
1307
  }
1430
-
1431
1308
  Object.values(this.visualChannels).forEach(function (channel) {
1432
1309
  var channelConfig = _this8.config.visConfig[channel.range];
1433
1310
  var field = _this8.config[channel.field];
1434
-
1435
1311
  if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.type) === _colorRanges.hexColor && field !== null && field !== void 0 && field.colorColumn) {
1436
1312
  var dataSetField = dataset.fields.find(function (f) {
1437
1313
  return f.name === field.colorColumn;
@@ -1439,7 +1315,6 @@ var Layer = /*#__PURE__*/function () {
1439
1315
  var colors = dataset.getColumnLayerDomain(dataSetField, _defaultSettings.SCALE_TYPES.ordinal).map(function (c) {
1440
1316
  return (0, _colorUtils.checkColorOrFallback)(c);
1441
1317
  });
1442
-
1443
1318
  _this8.updateLayerVisConfig((0, _defineProperty2["default"])({}, channel.range, _objectSpread(_objectSpread({}, channelConfig), {}, {
1444
1319
  colors: colors
1445
1320
  })));
@@ -1451,20 +1326,16 @@ var Layer = /*#__PURE__*/function () {
1451
1326
  key: "calculateHexColumnLegend",
1452
1327
  value: function calculateHexColumnLegend(datasets) {
1453
1328
  var _this9 = this;
1454
-
1455
1329
  var dataset = this.getDataset(datasets);
1456
-
1457
1330
  if (!datasets) {
1458
1331
  return;
1459
1332
  }
1460
-
1461
1333
  var legendSettings = Object.keys(this.visualChannels).reduce(function (legends, channel) {
1462
1334
  var _this9$visualChannels = _this9.visualChannels[channel],
1463
- range = _this9$visualChannels.range,
1464
- channelField = _this9$visualChannels.field;
1335
+ range = _this9$visualChannels.range,
1336
+ channelField = _this9$visualChannels.field;
1465
1337
  var channelConfig = _this9.config.visConfig[range];
1466
1338
  var field = _this9.config[channelField];
1467
-
1468
1339
  if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.type) === _colorRanges.hexColor && field !== null && field !== void 0 && field.colorColumn) {
1469
1340
  var dataSetField = dataset.fields.find(function (f) {
1470
1341
  return f.name === field.colorColumn;
@@ -1472,7 +1343,6 @@ var Layer = /*#__PURE__*/function () {
1472
1343
  var legend = dataset.calculateLegend(field, dataSetField);
1473
1344
  legends[channel] = legend;
1474
1345
  }
1475
-
1476
1346
  return legends;
1477
1347
  }, {});
1478
1348
  this.updateLayerLegend(legendSettings);
@@ -1486,7 +1356,6 @@ var Layer = /*#__PURE__*/function () {
1486
1356
  key: "isLayerHovered",
1487
1357
  value: function isLayerHovered(objectInfo) {
1488
1358
  var _objectInfo$layer, _objectInfo$layer$pro;
1489
-
1490
1359
  return (objectInfo === null || objectInfo === void 0 ? void 0 : objectInfo.picked) && (objectInfo === null || objectInfo === void 0 ? void 0 : (_objectInfo$layer = objectInfo.layer) === null || _objectInfo$layer === void 0 ? void 0 : (_objectInfo$layer$pro = _objectInfo$layer.props) === null || _objectInfo$layer$pro === void 0 ? void 0 : _objectInfo$layer$pro.id) === this.id;
1491
1360
  }
1492
1361
  }, {
@@ -1495,14 +1364,13 @@ var Layer = /*#__PURE__*/function () {
1495
1364
  var radiusChannel = Object.values(this.visualChannels).find(function (vc) {
1496
1365
  return vc.property === 'radius';
1497
1366
  });
1498
-
1499
1367
  if (!radiusChannel) {
1500
1368
  return 1;
1501
1369
  }
1502
-
1503
1370
  var field = radiusChannel.field;
1504
- var radius = this.config.visConfig.radius; // @ts-ignore
1371
+ var radius = this.config.visConfig.radius;
1505
1372
 
1373
+ // @ts-ignore
1506
1374
  return (this.config[field] ? 1 : radius) * this.getZoomFactor(mapState);
1507
1375
  }
1508
1376
  }, {
@@ -1511,22 +1379,20 @@ var Layer = /*#__PURE__*/function () {
1511
1379
  var radiusChannel = Object.values(this.visualChannels).find(function (vc) {
1512
1380
  return vc.property === 'radius';
1513
1381
  });
1514
-
1515
1382
  if (!radiusChannel || this.config[radiusChannel.field]) {
1516
1383
  return 1;
1517
1384
  }
1518
-
1519
1385
  return this.config.visConfig.radius;
1520
1386
  }
1521
1387
  }, {
1522
1388
  key: "getMaxMarkerSize",
1523
1389
  value: function getMaxMarkerSize() {
1524
1390
  var _this$config5 = this.config,
1525
- radiusField = _this$config5.radiusField,
1526
- sizeField = _this$config5.sizeField,
1527
- visConfig = _this$config5.visConfig;
1391
+ radiusField = _this$config5.radiusField,
1392
+ sizeField = _this$config5.sizeField,
1393
+ visConfig = _this$config5.visConfig;
1528
1394
  var radiusRange = visConfig.radiusRange,
1529
- radius = visConfig.radius;
1395
+ radius = visConfig.radius;
1530
1396
  var field = radiusField || sizeField;
1531
1397
  return Math.ceil(field && radiusRange ? radiusRange[1] : radius);
1532
1398
  }
@@ -1534,7 +1400,6 @@ var Layer = /*#__PURE__*/function () {
1534
1400
  key: "shouldCalculateLayerData",
1535
1401
  value: function shouldCalculateLayerData(props) {
1536
1402
  var _this10 = this;
1537
-
1538
1403
  return props.some(function (p) {
1539
1404
  return !_this10.noneLayerDataAffectingProps.includes(p);
1540
1405
  });
@@ -1555,10 +1420,10 @@ var Layer = /*#__PURE__*/function () {
1555
1420
  key: "getDefaultDeckLayerProps",
1556
1421
  value: function getDefaultDeckLayerProps(_ref12) {
1557
1422
  var idx = _ref12.idx,
1558
- gpuFilter = _ref12.gpuFilter,
1559
- mapState = _ref12.mapState,
1560
- visible = _ref12.visible,
1561
- maskPolygon = _ref12.maskPolygon;
1423
+ gpuFilter = _ref12.gpuFilter,
1424
+ mapState = _ref12.mapState,
1425
+ visible = _ref12.visible,
1426
+ maskPolygon = _ref12.maskPolygon;
1562
1427
  var maskExtensionProps = (0, _layerUtils.getMaskExtensionProps)(maskPolygon);
1563
1428
  return _objectSpread(_objectSpread({}, maskExtensionProps), {}, {
1564
1429
  id: this.id,
@@ -1595,37 +1460,32 @@ var Layer = /*#__PURE__*/function () {
1595
1460
  key: "renderTextLabelLayer",
1596
1461
  value: function renderTextLabelLayer(_ref13, renderOpts) {
1597
1462
  var getPosition = _ref13.getPosition,
1598
- getRadius = _ref13.getRadius,
1599
- radiusScale = _ref13.radiusScale,
1600
- updateTriggers = _ref13.updateTriggers,
1601
- sharedProps = _ref13.sharedProps;
1463
+ getRadius = _ref13.getRadius,
1464
+ radiusScale = _ref13.radiusScale,
1465
+ updateTriggers = _ref13.updateTriggers,
1466
+ sharedProps = _ref13.sharedProps;
1602
1467
  var data = renderOpts.data;
1603
1468
  var _this$config6 = this.config,
1604
- textLabel = _this$config6.textLabel,
1605
- visibilityByZoom = _this$config6.visibilityByZoom;
1469
+ textLabel = _this$config6.textLabel,
1470
+ visibilityByZoom = _this$config6.visibilityByZoom;
1606
1471
  var extensions = [].concat((0, _toConsumableArray2["default"])(sharedProps.extensions), [collisionFilterExtension]);
1607
-
1608
1472
  if (!data || !data.textLabels || !data.textLabels[0] || !data.textLabels[0].getText) {
1609
1473
  return [];
1610
1474
  }
1611
-
1612
1475
  var _textLabel = (0, _slicedToArray2["default"])(textLabel, 2),
1613
- mainLabel = _textLabel[0],
1614
- secondaryLabel = _textLabel[1];
1615
-
1476
+ mainLabel = _textLabel[0],
1477
+ secondaryLabel = _textLabel[1];
1616
1478
  var alignment = mainLabel.alignment,
1617
- anchor = mainLabel.anchor,
1618
- getColor = mainLabel.color,
1619
- mainField = mainLabel.field,
1620
- outlineColor = mainLabel.outlineColor,
1621
- sizeScale = mainLabel.size;
1622
-
1479
+ anchor = mainLabel.anchor,
1480
+ getColor = mainLabel.color,
1481
+ mainField = mainLabel.field,
1482
+ outlineColor = mainLabel.outlineColor,
1483
+ sizeScale = mainLabel.size;
1623
1484
  var _ref14 = secondaryLabel || {},
1624
- getSecondaryColor = _ref14.color,
1625
- secondaryField = _ref14.field,
1626
- secondaryOutlineColor = _ref14.outlineColor,
1627
- secondarySizeScale = _ref14.size;
1628
-
1485
+ getSecondaryColor = _ref14.color,
1486
+ secondaryField = _ref14.field,
1487
+ secondaryOutlineColor = _ref14.outlineColor,
1488
+ secondarySizeScale = _ref14.size;
1629
1489
  return [new _carto._PointLabelLayer(_objectSpread(_objectSpread(_objectSpread({}, sharedProps), {}, {
1630
1490
  // Recreate layer when labels change otherwise rendering breaks
1631
1491
  // TODO could be more efficient with updateTriggers?
@@ -1673,13 +1533,13 @@ var Layer = /*#__PURE__*/function () {
1673
1533
  })
1674
1534
  }))];
1675
1535
  }
1536
+
1676
1537
  /**
1677
1538
  * Create deck.gl `IconLayer` "autoPack" mode accessor for custom markers.
1678
1539
  *
1679
1540
  * @param {*} iconUrlAccessor deck.gl accessor (or value) that resolves to URL of icon for given row
1680
1541
  * @returns deck.gl accessor that returns UnpackedIcon ready to consume by IconLayer
1681
1542
  */
1682
-
1683
1543
  }, {
1684
1544
  key: "getCustomMarkerIconAccessor",
1685
1545
  value: function getCustomMarkerIconAccessor(iconUrlAccessor) {
@@ -1707,7 +1567,8 @@ var Layer = /*#__PURE__*/function () {
1707
1567
  }
1708
1568
  }, {
1709
1569
  key: "updateLayerMeta",
1710
- value: function updateLayerMeta(dataContainer, getPosition) {// implemented in subclasses
1570
+ value: function updateLayerMeta(dataContainer, getPosition) {
1571
+ // implemented in subclasses
1711
1572
  }
1712
1573
  }, {
1713
1574
  key: "getPositionAccessor",
@@ -1721,14 +1582,11 @@ var Layer = /*#__PURE__*/function () {
1721
1582
  key: "getHexColumn",
1722
1583
  value: function getHexColumn(range) {
1723
1584
  var _Object$values2, _Object$values2$find;
1724
-
1725
1585
  var field = (_Object$values2 = Object.values(this.visualChannels)) === null || _Object$values2 === void 0 ? void 0 : (_Object$values2$find = _Object$values2.find(function (value) {
1726
1586
  return value.range === range;
1727
1587
  })) === null || _Object$values2$find === void 0 ? void 0 : _Object$values2$find.field;
1728
-
1729
1588
  if (field) {
1730
1589
  var _this$config$field2;
1731
-
1732
1590
  return (_this$config$field2 = this.config[field]) === null || _this$config$field2 === void 0 ? void 0 : _this$config$field2.colorColumn;
1733
1591
  }
1734
1592
  }
@@ -1736,7 +1594,6 @@ var Layer = /*#__PURE__*/function () {
1736
1594
  key: "isColoredByColorColumn",
1737
1595
  value: function isColoredByColorColumn(range) {
1738
1596
  var _this$config$visConfi;
1739
-
1740
1597
  return (_this$config$visConfi = this.config.visConfig[range]) === null || _this$config$visConfi === void 0 ? void 0 : _this$config$visConfi.hexColor;
1741
1598
  }
1742
1599
  }], [{
@@ -1747,6 +1604,7 @@ var Layer = /*#__PURE__*/function () {
1747
1604
  foundLayers: foundLayers
1748
1605
  };
1749
1606
  }
1607
+
1750
1608
  /**
1751
1609
  * Given a array of preset required column names
1752
1610
  * found field that has the same name to set as layer column
@@ -1755,7 +1613,6 @@ var Layer = /*#__PURE__*/function () {
1755
1613
  * @param {object[]} allFields
1756
1614
  * @returns {object[] | null} all possible required layer column pairs
1757
1615
  */
1758
-
1759
1616
  }, {
1760
1617
  key: "findDefaultColumnField",
1761
1618
  value: function findDefaultColumnField(defaultFields, allFields) {
@@ -1772,12 +1629,10 @@ var Layer = /*#__PURE__*/function () {
1772
1629
  }) : null;
1773
1630
  return prev;
1774
1631
  }, {});
1775
-
1776
1632
  if (!Object.values(requiredColumns).every(Boolean)) {
1777
1633
  // if any field missing, return null
1778
1634
  return null;
1779
1635
  }
1780
-
1781
1636
  return this.getAllPossibleColumnParis(requiredColumns);
1782
1637
  }
1783
1638
  }, {
@@ -1794,8 +1649,8 @@ var Layer = /*#__PURE__*/function () {
1794
1649
  return requiredColumns[k].length;
1795
1650
  });
1796
1651
  var pairs = [];
1797
- /* eslint-disable no-loop-func */
1798
1652
 
1653
+ /* eslint-disable no-loop-func */
1799
1654
  while (incrementPointers(pointers, countPerKey, pointers.length - 1)) {
1800
1655
  var newPair = pointers.reduce(function (prev, cuur, i) {
1801
1656
  prev[allKeys[i]] = requiredColumns[allKeys[i]][cuur];
@@ -1804,24 +1659,20 @@ var Layer = /*#__PURE__*/function () {
1804
1659
  pairs.push(newPair);
1805
1660
  }
1806
1661
  /* eslint-enable no-loop-func */
1807
- // recursively increment pointers
1808
-
1809
1662
 
1663
+ // recursively increment pointers
1810
1664
  function incrementPointers(pts, counts, index) {
1811
1665
  if (index === 0 && pts[0] === counts[0] - 1) {
1812
1666
  // nothing to increment
1813
1667
  return false;
1814
1668
  }
1815
-
1816
1669
  if (pts[index] + 1 < counts[index]) {
1817
1670
  pts[index] = pts[index] + 1;
1818
1671
  return true;
1819
1672
  }
1820
-
1821
1673
  pts[index] = 0;
1822
1674
  return incrementPointers(pts, counts, index - 1);
1823
1675
  }
1824
-
1825
1676
  return pairs;
1826
1677
  }
1827
1678
  }, {
@@ -1832,7 +1683,5 @@ var Layer = /*#__PURE__*/function () {
1832
1683
  }]);
1833
1684
  return Layer;
1834
1685
  }();
1835
-
1836
- var _default = Layer;
1837
- exports["default"] = _default;
1838
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvYmFzZS1sYXllci5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUNvbG9yIiwiTEFZRVJfSURfTEVOR1RIIiwiRkFMTEJBQ0tfSUNPTiIsIk1BWF9TQU1QTEVfU0laRSIsImRlZmF1bHREb21haW4iLCJkYXRhRmlsdGVyRXh0ZW5zaW9uIiwiRGF0YUZpbHRlckV4dGVuc2lvbiIsImZpbHRlclNpemUiLCJNQVhfR1BVX0ZJTFRFUlMiLCJjb2xsaXNpb25GaWx0ZXJFeHRlbnNpb24iLCJDb2xsaXNpb25GaWx0ZXJFeHRlbnNpb24iLCJkZWZhdWx0RGF0YUFjY2Vzc29yIiwiZGMiLCJkIiwiZGVmYXVsdEdldEZpZWxkVmFsdWUiLCJmaWVsZCIsInZhbHVlQWNjZXNzb3IiLCJzY2FsZUlkZW50aXR5IiwidiIsIk9WRVJMQVlfVFlQRSIsImRlY2tnbCIsIm1hcGJveGdsIiwibGF5ZXJDb2xvcnMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJEYXRhVml6Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJpbmRleCIsImxlbmd0aCIsImNvbG9yTWFrZXIiLCJMYXllciIsInByb3BzIiwiaWQiLCJtZXRhIiwibGVnZW5kU2V0dGluZ3MiLCJ2aXNDb25maWdTZXR0aW5ncyIsIl9pbnRlcmFjdGl2aXR5U2V0dGluZ3MiLCJjb25maWciLCJnZXREZWZhdWx0TGF5ZXJDb25maWciLCJjb2x1bW5zIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiRGVmYXVsdExheWVySWNvbiIsInR5cGUiLCJjb2xvciIsInByb3BlcnR5Iiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImtleSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsIm51bGxWYWx1ZSIsIk5PX1ZBTFVFX0NPTE9SIiwiZGVmYXVsdFZhbHVlIiwic2l6ZSIsImxhdCIsInBhaXIiLCJmaWVsZFBhaXJLZXkiLCJsbmciLCJsYXQwIiwibG5nMCIsImxhdDEiLCJsbmcxIiwiaW50ZXJhY3Rpdml0eVNldHRpbmdzIiwiQm9vbGVhbiIsImhvdmVyIiwiZmllbGRzIiwiY2xpY2siLCJoYXNUb29sdGlwIiwiZW5hYmxlZCIsImRhdGFJZCIsInZpc2liaWxpdHlCeVpvb20iLCJtaW4iLCJaT09NX0xFVkVMX0xJTUlUUyIsIm1heCIsImxhYmVsIiwiREVGQVVMVF9MQVlFUl9MQUJFTCIsIm5leHQiLCJ2YWx1ZSIsImlzVmlzaWJsZSIsImlzQ29uZmlnQWN0aXZlIiwiaGlnaGxpZ2h0Q29sb3IiLCJERUZBVUxUX0hJR0hMSUdIVF9DT0xPUiIsImhpZGRlbiIsImNvbG9yRmllbGQiLCJjb2xvckRvbWFpbiIsImNvbG9yU2NhbGUiLCJTQ0FMRV9UWVBFUyIsInF1YW50aWxlIiwic2l6ZURvbWFpbiIsInNpemVTY2FsZSIsImxpbmVhciIsInNpemVGaWVsZCIsInJhZGl1c0ZpZWxkIiwidmlzQ29uZmlnIiwidGV4dExhYmVsIiwiREVGQVVMVF9URVhUX0xBQkVMIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJjb2xvclJhbmdlIiwiYW5pbWF0aW9uIiwidmlzdWFsQ2hhbm5lbHMiLCJtZWFzdXJlIiwiZGlzcGxheU5hbWUiLCJuYW1lIiwiZGVmYXVsdE1lYXN1cmUiLCJ1cGRhdGUiLCJmaWVsZElkeCIsImNvbHVtblBhaXJzIiwicGFydG5lcktleSIsInBhcnRuZXJGaWVsZFBhaXJLZXkiLCJ6b29tIiwiem9vbU9mZnNldCIsIk1hdGgiLCJwb3ciLCJlbmFibGVFbGV2YXRpb25ab29tRmFjdG9yIiwiZGF0YXNldHMiLCJmaWx0ZXJlZEluZGV4Iiwib2JqZWN0IiwiZGF0YUNvbnRhaW5lciIsInJvdyIsImNvbmZpZ1RvQ29weSIsInNoYWxsb3dDb3B5IiwiY29uY2F0Iiwibm90VG9Db3B5IiwiZm9yRWFjaCIsImdyb3VwIiwicHVzaCIsImN1cnJlbnRDb25maWciLCJjb3BpZWQiLCJjb3B5TGF5ZXJDb25maWciLCJ1cGRhdGVMYXllckNvbmZpZyIsImtleXMiLCJjaGFubmVsIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwiaW5jbHVkZXMiLCJsYXllclZpc0NvbmZpZ3MiLCJpdGVtIiwiTEFZRVJfVklTX0NPTkZJR1MiLCJldmVyeSIsInAiLCJoYXNPd25Qcm9wZXJ0eSIsImNvbHVtblZhbGlkYXRvcnMiLCJyZXF1aXJlZCIsInJlcXVpcmVkTGF5ZXJDb2x1bW5zIiwicmVkdWNlIiwiYWNjdSIsInZhbGlkYXRvciIsIm9wdGlvbmFsIiwib3B0aW9uYWxDb2x1bW5zIiwibmV3Q29uZmlnIiwibmV3VmlzQ29uZmlnIiwicHJvcCIsInByZXZpb3VzIiwiY29sb3JVSVByb3AiLCJlbnRyaWVzIiwiaXNDb2xvclJhbmdlIiwiY29sb3JzIiwiaGV4Q29sb3IiLCJ1cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlIiwidXBkYXRlQ29sb3JSYW5nZUJ5Q29sb3JVSSIsInVwZGF0ZUN1c3RvbVBhbGV0dGUiLCJjb2xvclJhbmdlQ29uZmlnIiwiY3VzdG9tIiwiY3VzdG9tUGFsZXR0ZSIsInNob3dEcm9wZG93biIsInN0ZXBzIiwicmV2ZXJzZWQiLCJoZXhDb2x1bW4iLCJnZXRIZXhDb2x1bW4iLCJpc0hleENvbHVtbiIsImlzQ29sb3JlZEJ5Q29sb3JDb2x1bW4iLCJzaG91bGRVcGRhdGUiLCJzb21lIiwic2FtZUdyb3VwIiwiQ09MT1JfUkFOR0VTIiwiZmlsdGVyIiwiY3IiLCJmaW5kIiwiY29sb3JNYXAiLCJ1cGRhdGVDb2xvck1hcCIsInVwZGF0ZUxheWVyVmlzQ29uZmlnIiwidXBkYXRlQ2F0ZWdvcnlDb2xvck1hcCIsInVwZGF0ZU51bWVyaWNDb2xvck1hcCIsImFzc2lnbmVkQ2F0ZWdvcmllcyIsIm5ld0NvbG9yTWFwIiwic2xpY2UiLCJjTWFwIiwidW5hc3NpZ25lZENvbG9ycyIsImNhdGVnb3J5IiwiY29sb3JNYXBWYWx1ZXMiLCJjIiwibWF4VmFsdWUiLCJwcmV2VmFsdWUiLCJzdGVwIiwiaSIsImxheWVyRGF0YSIsImRhdGEiLCJoYXNBbGxDb2x1bW5zIiwiaGFzTGF5ZXJEYXRhIiwicmVuZGVyTGF5ZXIiLCJfIiwiciIsImciLCJiIiwiaXNOYU4iLCJVTktOT1dOX0NPTE9SIiwiQXJyYXkiLCJpc0FycmF5IiwiTWFwIiwiayIsInNldCIsIlNDQUxFX0ZVTkMiLCJmcm9tIiwidW5rbm93biIsImdldFZpc0NoYW5uZWxTY2FsZSIsImZhbGxiYWNrSWNvbiIsInVua25vd25WYWx1ZSIsIm1hcHBpbmciLCJvdGhlcnNNYXJrZXIiLCJtYXJrZXJNYXAiLCJtYXJrZXJVcmwiLCJkYXRhQWNjZXNzb3IiLCJhdHRyaWJ1dGVBY2Nlc3NvcnMiLCJmaXhlZCIsImFjY2Vzc29yIiwiZ2V0QXR0cmlidXRlVmFsdWUiLCJhZ2dyZWdhdGlvbiIsInNob3VsZEdldFNjYWxlIiwiaWRlbnRpdHkiLCJhcmdzIiwiaXNGaXhlZCIsImZpZWxkQ29uZmlnIiwiYWdncmVnYXRpb25WYWx1ZSIsInNjYWxlRnVuY3Rpb24iLCJnZXRDb2xvclNjYWxlIiwiY3VzdG9tTWFya2VyIiwiZ2V0Q3VzdG9tTWFya2Vyc1NjYWxlIiwiY3VzdG9tTWFya2Vyc1VybCIsImdldEVuY29kZWRDaGFubmVsVmFsdWUiLCJfYWdncmVnYXRpb24iLCJDb25zb2xlIiwid2FybiIsIm9yZGluYWwiLCJkb21haW5Jc0luZmluaXRlIiwiSW5maW5pdHkiLCJzY2FsZUZhY3RvcnkiLCJyZXN1bHQiLCJnZXRQb3NpdGlvbiIsInNhbXBsZURhdGEiLCJudW1Sb3dzIiwicG9pbnRzIiwibWFwSW5kZXgiLCJsYXRCb3VuZHMiLCJsbmdCb3VuZHMiLCJkYXRhVXBkYXRlVHJpZ2dlcnMiLCJ0cmlnZ2VyQ2hhbmdlZCIsIl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMiLCJnZXRWYWx1ZSIsImNvbG9yQ29sdW1uVmFsdWUiLCJjaGFubmVsQ29uZmlnIiwiY2hhbm5lbEZpZWxkIiwiY29sdW1uRmllbGQiLCJjb2xvckNvbHVtbiIsImNvbG9yQ29sdW1uSWR4IiwidmFsdWVBdCIsImF0dHJpYnV0ZVZhbHVlIiwiQUxMX0ZJRUxEX1RZUEVTIiwidGltZXN0YW1wIiwiRGF0ZSIsInNldHRpbmdzIiwiYWxsRGF0YSIsImdldERhdGEiLCJkYXRhc2V0SWQiLCJnZXRNZXRhIiwidGwiLCJvbGRMYXllckRhdGEiLCJkYXRhc2V0IiwiZ2V0RGF0YXNldCIsInVwZGF0ZVZpc3VhbENoYW5uZWxGaWVsZHMiLCJ1cGRhdGVIZXhDb2xvckRvbWFpbiIsImdldFBvc2l0aW9uQWNjZXNzb3IiLCJnZXREYXRhVXBkYXRlVHJpZ2dlcnMiLCJnZXRDaGFuZ2VkVHJpZ2dlcnMiLCJ1cGRhdGVMYXllck1ldGEiLCJjYWxjdWxhdGVEYXRhQXR0cmlidXRlIiwib2xkRmllbGQiLCJpc1VzaW5nSGV4Q29sb3JDb2RlIiwibmV3RGF0YVNldEZpZWxkIiwiZmQiLCJuZXdGaWx0ZXIiLCJ0YWJsZSIsInNjYWxlVHlwZSIsInVwZGF0ZWREb21haW4iLCJjYWxjdWxhdGVMYXllckRvbWFpbiIsInZhbGlkYXRlRmllbGRUeXBlIiwidmFsaWRhdGVTY2FsZSIsInZpc3VhbENoYW5uZWwiLCJzdXBwb3J0ZWRGaWVsZFR5cGVzIiwiY2hhbm5lbFN1cHBvcnRlZEZpZWxkVHlwZXMiLCJDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMiLCJzY2FsZU9wdGlvbnMiLCJnZXRTY2FsZU9wdGlvbnMiLCJGSUVMRF9PUFRTIiwidXBkYXRlVHJpZ2dlcnMiLCJkYXRhU2V0RmllbGQiLCJmIiwiZ2V0Q29sdW1uTGF5ZXJEb21haW4iLCJsZWdlbmRzIiwibGVnZW5kIiwiY2FsY3VsYXRlTGVnZW5kIiwidXBkYXRlTGF5ZXJMZWdlbmQiLCJvYmplY3RJbmZvIiwiaXNMYXllckhvdmVyZWQiLCJwaWNrZWQiLCJsYXllciIsIm1hcFN0YXRlIiwicmFkaXVzQ2hhbm5lbCIsInZjIiwicmFkaXVzIiwiZ2V0Wm9vbUZhY3RvciIsInJhZGl1c1JhbmdlIiwiY2VpbCIsIm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcyIsImludGVyYWN0aW9uQ29uZmlnIiwiYnJ1c2hpbmdUYXJnZXQiLCJicnVzaCIsImF1dG9IaWdobGlnaHQiLCJicnVzaGluZ1JhZGl1cyIsImJydXNoaW5nRW5hYmxlZCIsImlkeCIsImdwdUZpbHRlciIsInZpc2libGUiLCJtYXNrUG9seWdvbiIsIm1hc2tFeHRlbnNpb25Qcm9wcyIsImNvb3JkaW5hdGVTeXN0ZW0iLCJDT09SRElOQVRFX1NZU1RFTSIsIkxOR0xBVCIsInBpY2thYmxlIiwiaGFzSW50ZXJhY3Rpdml0eSIsIndyYXBMb25naXR1ZGUiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiZHJhZ1JvdGF0ZSIsImVuYWJsZTNkIiwib3BhY2l0eSIsImV4dGVuc2lvbnMiLCJmaWx0ZXJSYW5nZSIsInVuZGVmaW5lZCIsInJlbmRlck9wdHMiLCJnZXRSYWRpdXMiLCJyYWRpdXNTY2FsZSIsInNoYXJlZFByb3BzIiwidGV4dExhYmVscyIsImdldFRleHQiLCJtYWluTGFiZWwiLCJzZWNvbmRhcnlMYWJlbCIsImFsaWdubWVudCIsImFuY2hvciIsImdldENvbG9yIiwibWFpbkZpZWxkIiwib3V0bGluZUNvbG9yIiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJzZWNvbmRhcnlGaWVsZCIsInNlY29uZGFyeU91dGxpbmVDb2xvciIsInNlY29uZGFyeVNpemVTY2FsZSIsIlBvaW50TGFiZWxMYXllciIsImNoYXJhY3RlclNldCIsImNvbGxpc2lvbkVuYWJsZWQiLCJjb2xsaXNpb25Hcm91cCIsImdldFNlY29uZGFyeVRleHQiLCJnZXRUZXh0QW5jaG9yIiwiZ2V0QWxpZ25tZW50QmFzZWxpbmUiLCJmb250RmFtaWx5IiwiZm9udFNldHRpbmdzIiwic2RmIiwiZm9udFdlaWdodCIsIm91dGxpbmVXaWR0aCIsImdldEZpbHRlclZhbHVlIiwiaWNvblVybEFjY2Vzc29yIiwibWFzayIsIm1heEljb25TaXplIiwiZ2V0TWF4TWFya2VyU2l6ZSIsIndhbnRlZFVybCIsImljb25PayIsInVybCIsIndpZHRoIiwiaGVpZ2h0Iiwia2VwbGVyVGFibGUiLCJmb3VuZExheWVycyIsImRlZmF1bHRGaWVsZHMiLCJhbGxGaWVsZHMiLCJyZXF1aXJlZENvbHVtbnMiLCJwcmV2IiwicmVxdWlyZWRGaWVsZHMiLCJnZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzIiwiYWxsS2V5cyIsInBvaW50ZXJzIiwiY291bnRQZXJLZXkiLCJwYWlycyIsImluY3JlbWVudFBvaW50ZXJzIiwibmV3UGFpciIsImN1dXIiLCJwdHMiLCJjb3VudHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQVlBOztBQUNBOztBQUNBOztBQVFBOztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7d0RBNkJVQSxhOztBQTNCVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQU1DLGVBQWUsR0FBRyxDQUF4QixDLENBRVA7OztBQUNBLElBQU1DLGFBQWEsR0FDakIsMExBREY7QUFHQSxJQUFNQyxlQUFlLEdBQUcsSUFBeEI7QUFDQSxJQUFNQyxhQUFhLEdBQUcsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUF0QjtBQUNBLElBQU1DLG1CQUFtQixHQUFHLElBQUlDLCtCQUFKLENBQXdCO0FBQUNDLEVBQUFBLFVBQVUsRUFBRUM7QUFBYixDQUF4QixDQUE1QjtBQUNBLElBQU1DLHdCQUF3QixHQUFHLElBQUlDLG9DQUFKLEVBQWpDOztBQUVBLElBQU1DLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBc0IsQ0FBQUMsRUFBRTtBQUFBLFNBQUksVUFBQUMsQ0FBQztBQUFBLFdBQUlBLENBQUo7QUFBQSxHQUFMO0FBQUEsQ0FBOUI7O0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUF1QixDQUFDQyxLQUFELEVBQVFGLENBQVI7QUFBQSxTQUFjRSxLQUFLLENBQUNDLGFBQU4sQ0FBb0JILENBQXBCLENBQWQ7QUFBQSxDQUE3Qjs7QUFDQSxJQUFNSSxhQUFhLEdBQUcsU0FBaEJBLGFBQWdCLENBQUFDLENBQUM7QUFBQSxTQUFJQSxDQUFKO0FBQUEs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LElBQWV3WCxHQUFHLENBQUMsQ0FBRCxDQUFILEtBQVdDLE1BQU0sQ0FBQyxDQUFELENBQU4sR0FBWSxDQUExQyxFQUE2QztBQUMzQztBQUNBLGlCQUFPLEtBQVA7QUFDRDs7QUFFRCxZQUFJRCxHQUFHLENBQUN4WCxLQUFELENBQUgsR0FBYSxDQUFiLEdBQWlCeVgsTUFBTSxDQUFDelgsS0FBRCxDQUEzQixFQUFvQztBQUNsQ3dYLFVBQUFBLEdBQUcsQ0FBQ3hYLEtBQUQsQ0FBSCxHQUFhd1gsR0FBRyxDQUFDeFgsS0FBRCxDQUFILEdBQWEsQ0FBMUI7QUFDQSxpQkFBTyxJQUFQO0FBQ0Q7O0FBRUR3WCxRQUFBQSxHQUFHLENBQUN4WCxLQUFELENBQUgsR0FBYSxDQUFiO0FBQ0EsZUFBT3FYLGlCQUFpQixDQUFDRyxHQUFELEVBQU1DLE1BQU4sRUFBY3pYLEtBQUssR0FBRyxDQUF0QixDQUF4QjtBQUNEOztBQUVELGFBQU9vWCxLQUFQO0FBQ0Q7OztXQUVELGtCQUFnQmhOLENBQWhCLEVBQW1CO0FBQ2pCLGFBQU8sMEJBQVNBLENBQVQsQ0FBUDtBQUNEOzs7OztlQWdzQ1lqSyxLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IGtleW1pcnJvciBmcm9tICdrZXltaXJyb3InO1xuaW1wb3J0IHtDb2xsaXNpb25GaWx0ZXJFeHRlbnNpb24sIERhdGFGaWx0ZXJFeHRlbnNpb259IGZyb20gJ0BkZWNrLmdsL2V4dGVuc2lvbnMnO1xuaW1wb3J0IHtDT09SRElOQVRFX1NZU1RFTSwgTGF5ZXIgYXMgRGVja0xheWVyfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7X1BvaW50TGFiZWxMYXllciBhcyBQb2ludExhYmVsTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2NhcnRvJztcbmltcG9ydCBEZWZhdWx0TGF5ZXJJY29uIGZyb20gJy4vZGVmYXVsdC1sYXllci1pY29uJztcbmltcG9ydCB7ZGlmZlVwZGF0ZVRyaWdnZXJzfSBmcm9tICcuL2xheWVyLXVwZGF0ZSc7XG5pbXBvcnQge3JnYn0gZnJvbSAnZDMtY29sb3InO1xuXG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIE5PX1ZBTFVFX0NPTE9SLFxuICBTQ0FMRV9UWVBFUyxcbiAgQ0hBTk5FTF9TQ0FMRVMsXG4gIEZJRUxEX09QVFMsXG4gIFNDQUxFX0ZVTkMsXG4gIENIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEUyxcbiAgTUFYX0dQVV9GSUxURVJTLFxuICBVTktOT1dOX0NPTE9SLFxuICBaT09NX0xFVkVMX0xJTUlUU1xufSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge0NPTE9SX1JBTkdFUywgaGV4Q29sb3J9IGZyb20gJ2NvbnN0YW50cy9jb2xvci1yYW5nZXMnO1xuaW1wb3J0IHtEYXRhVml6Q29sb3JzfSBmcm9tICdjb25zdGFudHMvY3VzdG9tLWNvbG9yLXJhbmdlcyc7XG5pbXBvcnQge1xuICBMQVlFUl9WSVNfQ09ORklHUyxcbiAgREVGQVVMVF9URVhUX0xBQkVMLFxuICBERUZBVUxUX0NPTE9SX1VJLFxuICBERUZBVUxUX0hJR0hMSUdIVF9DT0xPUixcbiAgREVGQVVMVF9MQVlFUl9MQUJFTFxufSBmcm9tICcuL2xheWVyLWZhY3RvcnknO1xuXG5pbXBvcnQge2dlbmVyYXRlSGFzaElkLCBpc1BsYWluT2JqZWN0fSBmcm9tICd1dGlscy91dGlscyc7XG5cbmltcG9ydCB7Z2V0TGF0TG5nQm91bmRzLCBub3ROdWxsb3JVbmRlZmluZWR9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuaW1wb3J0IHtnZXRTYW1wbGVEYXRhfSBmcm9tICd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci11dGlscyc7XG5cbmltcG9ydCB7aGV4VG9SZ2IsIGdldENvbG9yR3JvdXBCeU5hbWUsIHJldmVyc2VDb2xvclJhbmdlLCBjaGVja0NvbG9yT3JGYWxsYmFja30gZnJvbSAndXRpbHMvY29sb3ItdXRpbHMnO1xuaW1wb3J0IHtnZXRNYXNrRXh0ZW5zaW9uUHJvcHN9IGZyb20gJ3V0aWxzL2xheWVyLXV0aWxzJztcbmltcG9ydCB7c2NhbGVPcmRpbmFsfSBmcm9tICdkMy1zY2FsZSc7XG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2luZGV4JykuTGF5ZXJ9IExheWVyQ2xhc3N9ICovXG5cbi8qKlxuICogQXBwcm94LiBudW1iZXIgb2YgcG9pbnRzIHRvIHNhbXBsZSBpbiBhIGxhcmdlIGRhdGEgc2V0XG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgTEFZRVJfSURfTEVOR1RIID0gNjtcblxuLy8gTm90ZSwgdGhpcyBpcyBpcyBTVkcgb2Ygc29saWQgY2lyY2xlIGVuY29kZWQgYXMgZGF0YS11cmlcbmNvbnN0IEZBTExCQUNLX0lDT04gPVxuICAnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFBITjJaeUIyYVdWM1FtOTRQU0l3SURBZ01UQXdJREV3TUNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWo0TkNpQWdQR05wY21Oc1pTQmplRDBpTlRBaUlHTjVQU0kxTUNJZ2NqMGlOVEFpTHo0TkNqd3ZjM1puUGc9PSc7XG5cbmNvbnN0IE1BWF9TQU1QTEVfU0laRSA9IDUwMDA7XG5jb25zdCBkZWZhdWx0RG9tYWluID0gWzAsIDFdO1xuY29uc3QgZGF0YUZpbHRlckV4dGVuc2lvbiA9IG5ldyBEYXRhRmlsdGVyRXh0ZW5zaW9uKHtmaWx0ZXJTaXplOiBNQVhfR1BVX0ZJTFRFUlN9KTtcbmNvbnN0IGNvbGxpc2lvbkZpbHRlckV4dGVuc2lvbiA9IG5ldyBDb2xsaXNpb25GaWx0ZXJFeHRlbnNpb24oKTtcblxuY29uc3QgZGVmYXVsdERhdGFBY2Nlc3NvciA9IGRjID0+IGQgPT4gZDtcbmNvbnN0IGRlZmF1bHRHZXRGaWVsZFZhbHVlID0gKGZpZWxkLCBkKSA9PiBmaWVsZC52YWx1ZUFjY2Vzc29yKGQpO1xuY29uc3Qgc2NhbGVJZGVudGl0eSA9IHYgPT4gdjtcblxuZXhwb3J0IGNvbnN0IE9WRVJMQVlfVFlQRSA9IGtleW1pcnJvcih7XG4gIGRlY2tnbDogbnVsbCxcbiAgbWFwYm94Z2w6IG51bGxcbn0pO1xuXG5leHBvcnQgY29uc3QgbGF5ZXJDb2xvcnMgPSBPYmplY3QudmFsdWVzKERhdGFWaXpDb2xvcnMpLm1hcChoZXhUb1JnYik7XG5mdW5jdGlvbiogZ2VuZXJhdGVDb2xvcigpIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgbGF5ZXJDb2xvcnMubGVuZ3RoICsgMSkge1xuICAgIGlmIChpbmRleCA9PT0gbGF5ZXJDb2xvcnMubGVuZ3RoKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIHlpZWxkIGxheWVyQ29sb3JzW2luZGV4KytdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjb2xvck1ha2VyID0gZ2VuZXJhdGVDb2xvcigpO1xuXG4vKiogQHR5cGUge0xheWVyQ2xhc3N9ICovXG5jbGFzcyBMYXllciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICB0aGlzLmlkID0gcHJvcHMuaWQgfHwgZ2VuZXJhdGVIYXNoSWQoTEFZRVJfSURfTEVOR1RIKTtcbiAgICAvLyBtZXRhXG4gICAgdGhpcy5tZXRhID0ge307XG5cbiAgICAvLyBsZWdlbmRTZXR0aW5nc1xuICAgIHRoaXMubGVnZW5kU2V0dGluZ3MgPSB7fTtcblxuICAgIC8vIHZpc0NvbmZpZ1NldHRpbmdzXG4gICAgdGhpcy52aXNDb25maWdTZXR0aW5ncyA9IHt9O1xuXG4gICAgLy8gaW50ZXJhY3Rpdml0eVNldHRpbmdzXG4gICAgdGhpcy5faW50ZXJhY3Rpdml0eVNldHRpbmdzID0ge307XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLmdldERlZmF1bHRMYXllckNvbmZpZyh7XG4gICAgICBjb2x1bW5zOiB0aGlzLmdldExheWVyQ29sdW1ucygpLFxuICAgICAgLi4ucHJvcHNcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBsYXllckljb24oKSB7XG4gICAgcmV0dXJuIERlZmF1bHRMYXllckljb247XG4gIH1cblxuICBnZXQgb3ZlcmxheVR5cGUoKSB7XG4gICAgcmV0dXJuIE9WRVJMQVlfVFlQRS5kZWNrZ2w7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICBnZXQgaXNBZ2dyZWdhdGVkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCByZXF1aXJlZExheWVyQ29sdW1ucygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgb3B0aW9uYWxDb2x1bW5zKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBub25lTGF5ZXJEYXRhQWZmZWN0aW5nUHJvcHMoKSB7XG4gICAgcmV0dXJuIFsnbGFiZWwnLCAnb3BhY2l0eScsICd0aGlja25lc3MnLCAnaXNWaXNpYmxlJywgJ2hpZGRlbiddO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICBwcm9wZXJ0eTogJ2NvbG9yJyxcbiAgICAgICAgZmllbGQ6ICdjb2xvckZpZWxkJyxcbiAgICAgICAgc2NhbGU6ICdjb2xvclNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnY29sb3JEb21haW4nLFxuICAgICAgICByYW5nZTogJ2NvbG9yUmFuZ2UnLFxuICAgICAgICBrZXk6ICdjb2xvcicsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLmNvbG9yLFxuICAgICAgICBudWxsVmFsdWU6IE5PX1ZBTFVFX0NPTE9SLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGNvbmZpZyA9PiBjb25maWcuY29sb3JcbiAgICAgIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIHByb3BlcnR5OiAnc2l6ZScsXG4gICAgICAgIGZpZWxkOiAnc2l6ZUZpZWxkJyxcbiAgICAgICAgc2NhbGU6ICdzaXplU2NhbGUnLFxuICAgICAgICBkb21haW46ICdzaXplRG9tYWluJyxcbiAgICAgICAgcmFuZ2U6ICdzaXplUmFuZ2UnLFxuICAgICAgICBrZXk6ICdzaXplJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuc2l6ZSxcbiAgICAgICAgbnVsbFZhbHVlOiAwLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IDFcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLypcbiAgICogQ29sdW1uIHBhaXJzIG1hcHMgbGF5ZXIgY29sdW1uIHRvIGEgc3BlY2lmaWMgZmllbGQgcGFpcnMsXG4gICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byBudWxsXG4gICAqL1xuICBnZXQgY29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKlxuICAgKiBEZWZhdWx0IHBvaW50IGNvbHVtbiBwYWlycywgY2FuIGJlIHVzZWQgZm9yIHBvaW50IGJhc2VkIGxheWVyczogcG9pbnQsIGljb24gZXRjLlxuICAgKi9cbiAgZ2V0IGRlZmF1bHRQb2ludENvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXQ6IHtwYWlyOiAnbG5nJywgZmllbGRQYWlyS2V5OiAnbGF0J30sXG4gICAgICBsbmc6IHtwYWlyOiAnbGF0JywgZmllbGRQYWlyS2V5OiAnbG5nJ31cbiAgICB9O1xuICB9XG5cbiAgLypcbiAgICogRGVmYXVsdCBsaW5rIGNvbHVtbiBwYWlycywgY2FuIGJlIHVzZWQgZm9yIGxpbmsgYmFzZWQgbGF5ZXJzOiBhcmMsIGxpbmUgZXRjXG4gICAqL1xuICBnZXQgZGVmYXVsdExpbmtDb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0MDoge3BhaXI6ICdsbmcwJywgZmllbGRQYWlyS2V5OiAnbGF0J30sXG4gICAgICBsbmcwOiB7cGFpcjogJ2xhdDAnLCBmaWVsZFBhaXJLZXk6ICdsbmcnfSxcbiAgICAgIGxhdDE6IHtwYWlyOiAnbG5nMScsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nMToge3BhaXI6ICdsYXQxJywgZmllbGRQYWlyS2V5OiAnbG5nJ31cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIFJlYWN0IGNvbXBvbmVudCBmb3IgdG8gcmVuZGVyIGxheWVyIGluc3RydWN0aW9ucyBpbiBhIG1vZGFsXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gYW4gb2JqZWN0XG4gICAqIEBleGFtcGxlXG4gICAqICByZXR1cm4ge1xuICAgKiAgICBpZDogJ2ljb25JbmZvJyxcbiAgICogICAgdGVtcGxhdGU6IEljb25JbmZvTW9kYWwsXG4gICAqICAgIG1vZGFsUHJvcHM6IHtcbiAgICogICAgICB0aXRsZTogJ0hvdyB0byBkcmF3IGljb25zJ1xuICAgKiAgIH07XG4gICAqIH1cbiAgICovXG4gIGdldCBsYXllckluZm9Nb2RhbCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldCBpbnRlcmFjdGl2aXR5U2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncztcbiAgfVxuXG4gIHNldCBpbnRlcmFjdGl2aXR5U2V0dGluZ3MoaW50ZXJhY3Rpdml0eVNldHRpbmdzKSB7XG4gICAgdGhpcy5faW50ZXJhY3Rpdml0eVNldHRpbmdzID0gaW50ZXJhY3Rpdml0eVNldHRpbmdzO1xuICB9XG5cbiAgZ2V0IGhhc1Rvb2x0aXAoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICB0aGlzLmludGVyYWN0aXZpdHlTZXR0aW5ncz8uaG92ZXI/LmZpZWxkcy5sZW5ndGggfHxcbiAgICAgICAgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmNsaWNrPy5maWVsZHMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIGdldCBoYXNJbnRlcmFjdGl2aXR5KCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuaGFzVG9vbHRpcCAmJiB0aGlzLmludGVyYWN0aXZpdHlTZXR0aW5ncz8uZW5hYmxlZCk7XG4gIH1cblxuICAvKlxuICAgKiBHaXZlbiBhIGRhdGFzZXQsIGF1dG9tYXRpY2FsbHkgZmluZCBwcm9wcyB0byBjcmVhdGUgbGF5ZXIgYmFzZWQgb24gaXRcbiAgICogYW5kIHJldHVybiB0aGUgcHJvcHMgYW5kIHByZXZpb3VzIGZvdW5kIGxheWVycy5cbiAgICogQnkgZGVmYXVsdCwgbm8gbGF5ZXJzIHdpbGwgYmUgZm91bmRcbiAgICovXG4gIHN0YXRpYyBmaW5kRGVmYXVsdExheWVyUHJvcHMoZGF0YXNldCwgZm91bmRMYXllcnMpIHtcbiAgICByZXR1cm4ge3Byb3BzOiBbXSwgZm91bmRMYXllcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgYXJyYXkgb2YgcHJlc2V0IHJlcXVpcmVkIGNvbHVtbiBuYW1lc1xuICAgKiBmb3VuZCBmaWVsZCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRvIHNldCBhcyBsYXllciBjb2x1bW5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGRlZmF1bHRGaWVsZHNcbiAgICogQHBhcmFtIHtvYmplY3RbXX0gYWxsRmllbGRzXG4gICAqIEByZXR1cm5zIHtvYmplY3RbXSB8IG51bGx9IGFsbCBwb3NzaWJsZSByZXF1aXJlZCBsYXllciBjb2x1bW4gcGFpcnNcbiAgICovXG4gIHN0YXRpYyBmaW5kRGVmYXVsdENvbHVtbkZpZWxkKGRlZmF1bHRGaWVsZHMsIGFsbEZpZWxkcykge1xuICAgIC8vIGZpbmQgYWxsIG1hdGNoZWQgZmllbGRzIGZvciBlYWNoIHJlcXVpcmVkIGNvbFxuICAgIGNvbnN0IHJlcXVpcmVkQ29sdW1ucyA9IE9iamVjdC5rZXlzKGRlZmF1bHRGaWVsZHMpLnJlZHVjZSgocHJldiwga2V5KSA9PiB7XG4gICAgICBjb25zdCByZXF1aXJlZEZpZWxkcyA9IGFsbEZpZWxkcy5maWx0ZXIoXG4gICAgICAgIGYgPT4gZi5uYW1lID09PSBkZWZhdWx0RmllbGRzW2tleV0gfHwgZGVmYXVsdEZpZWxkc1trZXldLmluY2x1ZGVzKGYubmFtZSlcbiAgICAgICk7XG5cbiAgICAgIHByZXZba2V5XSA9IHJlcXVpcmVkRmllbGRzLmxlbmd0aFxuICAgICAgICA/IHJlcXVpcmVkRmllbGRzLm1hcChmID0+ICh7XG4gICAgICAgICAgICB2YWx1ZTogZi5uYW1lLFxuICAgICAgICAgICAgZmllbGRJZHg6IGYuZmllbGRJZHhcbiAgICAgICAgICB9KSlcbiAgICAgICAgOiBudWxsO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwge30pO1xuXG4gICAgaWYgKCFPYmplY3QudmFsdWVzKHJlcXVpcmVkQ29sdW1ucykuZXZlcnkoQm9vbGVhbikpIHtcbiAgICAgIC8vIGlmIGFueSBmaWVsZCBtaXNzaW5nLCByZXR1cm4gbnVsbFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsUG9zc2libGVDb2x1bW5QYXJpcyhyZXF1aXJlZENvbHVtbnMpO1xuICB9XG5cbiAgc3RhdGljIGdldEFsbFBvc3NpYmxlQ29sdW1uUGFyaXMocmVxdWlyZWRDb2x1bW5zKSB7XG4gICAgLy8gZm9yIG11bHRpcGxlIG1hdGNoZWQgZmllbGQgZm9yIG9uZSByZXF1aXJlZCBjb2x1bW4sIHJldHVybiBtdWx0aXBsZVxuICAgIC8vIGNvbWJpbmF0aW9ucywgZS4gZy4gaWYgY29sdW1uIGEgaGFzIDIgbWF0Y2hlZCwgY29sdW1uIGIgaGFzIDMgbWF0Y2hlZFxuICAgIC8vIDYgcG9zc2libGUgY29sdW1uIHBhaXJzIHdpbGwgYmUgcmV0dXJuZWRcbiAgICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXMocmVxdWlyZWRDb2x1bW5zKTtcbiAgICBjb25zdCBwb2ludGVycyA9IGFsbEtleXMubWFwKChrLCBpKSA9PiAoKGkgPT09IGFsbEtleXMubGVuZ3RoIC0gMSA/IC0xIDogMCkpKTtcbiAgICBjb25zdCBjb3VudFBlcktleSA9IGFsbEtleXMubWFwKGsgPT4gcmVxdWlyZWRDb2x1bW5zW2tdLmxlbmd0aCk7XG4gICAgY29uc3QgcGFpcnMgPSBbXTtcblxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqL1xuICAgIHdoaWxlIChpbmNyZW1lbnRQb2ludGVycyhwb2ludGVycywgY291bnRQZXJLZXksIHBvaW50ZXJzLmxlbmd0aCAtIDEpKSB7XG4gICAgICBjb25zdCBuZXdQYWlyID0gcG9pbnRlcnMucmVkdWNlKChwcmV2LCBjdXVyLCBpKSA9PiB7XG4gICAgICAgIHByZXZbYWxsS2V5c1tpXV0gPSByZXF1aXJlZENvbHVtbnNbYWxsS2V5c1tpXV1bY3V1cl07XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwge30pO1xuXG4gICAgICBwYWlycy5wdXNoKG5ld1BhaXIpO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqL1xuXG4gICAgLy8gcmVjdXJzaXZlbHkgaW5jcmVtZW50IHBvaW50ZXJzXG4gICAgZnVuY3Rpb24gaW5jcmVtZW50UG9pbnRlcnMocHRzLCBjb3VudHMsIGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPT09IDAgJiYgcHRzWzBdID09PSBjb3VudHNbMF0gLSAxKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gaW5jcmVtZW50XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHB0c1tpbmRleF0gKyAxIDwgY291bnRzW2luZGV4XSkge1xuICAgICAgICBwdHNbaW5kZXhdID0gcHRzW2luZGV4XSArIDE7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBwdHNbaW5kZXhdID0gMDtcbiAgICAgIHJldHVybiBpbmNyZW1lbnRQb2ludGVycyhwdHMsIGNvdW50cywgaW5kZXggLSAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFpcnM7XG4gIH1cblxuICBzdGF0aWMgaGV4VG9SZ2IoYykge1xuICAgIHJldHVybiBoZXhUb1JnYihjKTtcbiAgfVxuXG4gIGdldERlZmF1bHRMYXllckNvbmZpZyhwcm9wcyA9IHt9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGFJZDogcHJvcHMuZGF0YUlkIHx8IG51bGwsXG4gICAgICB2aXNpYmlsaXR5Qnlab29tOiB7XG4gICAgICAgIG1pbjogcHJvcHMudmlzaWJpbGl0eUJ5Wm9vbT8ubWluIHx8IFpPT01fTEVWRUxfTElNSVRTLm1pbixcbiAgICAgICAgbWF4OiBwcm9wcy52aXNpYmlsaXR5Qnlab29tPy5tYXggfHwgWk9PTV9MRVZFTF9MSU1JVFMubWF4XG4gICAgICB9LFxuICAgICAgbGFiZWw6IHByb3BzLmxhYmVsIHx8IERFRkFVTFRfTEFZRVJfTEFCRUwsXG4gICAgICBjb2xvcjogcHJvcHMuY29sb3IgfHwgY29sb3JNYWtlci5uZXh0KCkudmFsdWUsXG4gICAgICBjb2x1bW5zOiBwcm9wcy5jb2x1bW5zIHx8IG51bGwsXG4gICAgICBpc1Zpc2libGU6IHByb3BzLmlzVmlzaWJsZSB8fCBmYWxzZSxcbiAgICAgIGlzQ29uZmlnQWN0aXZlOiBwcm9wcy5pc0NvbmZpZ0FjdGl2ZSB8fCBmYWxzZSxcbiAgICAgIGhpZ2hsaWdodENvbG9yOiBwcm9wcy5oaWdobGlnaHRDb2xvciB8fCBERUZBVUxUX0hJR0hMSUdIVF9DT0xPUixcbiAgICAgIGhpZGRlbjogcHJvcHMuaGlkZGVuIHx8IGZhbHNlLFxuXG4gICAgICAvLyBUT0RPOiByZWZhY3RvciB0aGlzIGludG8gc2VwYXJhdGUgdmlzdWFsIENoYW5uZWwgY29uZmlnXG4gICAgICAvLyBjb2xvciBieSBmaWVsZCwgZG9tYWluIGlzIHNldCBieSBmaWx0ZXJzLCBmaWVsZCwgc2NhbGUgdHlwZVxuICAgICAgY29sb3JGaWVsZDogbnVsbCxcbiAgICAgIGNvbG9yRG9tYWluOiBbMCwgMV0sXG4gICAgICBjb2xvclNjYWxlOiBTQ0FMRV9UWVBFUy5xdWFudGlsZSxcblxuICAgICAgLy8gY29sb3IgYnkgc2l6ZSwgZG9tYWluIGlzIHNldCBieSBmaWx0ZXJzLCBmaWVsZCwgc2NhbGUgdHlwZVxuICAgICAgc2l6ZURvbWFpbjogWzAsIDFdLFxuICAgICAgc2l6ZVNjYWxlOiBTQ0FMRV9UWVBFUy5saW5lYXIsXG4gICAgICBzaXplRmllbGQ6IG51bGwsXG4gICAgICByYWRpdXNGaWVsZDogbnVsbCxcblxuICAgICAgdmlzQ29uZmlnOiB7fSxcblxuICAgICAgdGV4dExhYmVsOiBbREVGQVVMVF9URVhUX0xBQkVMXSxcblxuICAgICAgY29sb3JVSToge1xuICAgICAgICBjb2xvcjogREVGQVVMVF9DT0xPUl9VSSxcbiAgICAgICAgY29sb3JSYW5nZTogREVGQVVMVF9DT0xPUl9VSVxuICAgICAgfSxcbiAgICAgIGFuaW1hdGlvbjoge2VuYWJsZWQ6IGZhbHNlfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiBhIHZpc3VhbENoYW5uZWwgY29uZmlnXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybnMge3tsYWJlbDogc3RyaW5nLCBtZWFzdXJlOiAoc3RyaW5nfHN0cmluZyl9fVxuICAgKi9cbiAgZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uKGtleSkge1xuICAgIC8vIGUuZy4gbGFiZWw6IENvbG9yLCBtZWFzdXJlOiBWZWhpY2xlIFR5cGVcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IHRoaXMudmlzQ29uZmlnU2V0dGluZ3NbdGhpcy52aXN1YWxDaGFubmVsc1trZXldLnJhbmdlXS5sYWJlbCxcbiAgICAgIG1lYXN1cmU6IHRoaXMuY29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5maWVsZF1cbiAgICAgICAgPyAodGhpcy5jb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmZpZWxkXS5kaXNwbGF5TmFtZSB8fFxuICAgICAgICAgIHRoaXMuY29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5maWVsZF0ubmFtZSlcbiAgICAgICAgOiB0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZGVmYXVsdE1lYXN1cmVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbiBhIGZpZWxkIHRvIGxheWVyIGNvbHVtbiwgcmV0dXJuIGNvbHVtbiBjb25maWdcbiAgICogQHBhcmFtIGtleSAtIENvbHVtbiBLZXlcbiAgICogQHBhcmFtIGZpZWxkIC0gU2VsZWN0ZWQgZmllbGRcbiAgICogQHJldHVybnMge3t9fSAtIENvbHVtbiBjb25maWdcbiAgICovXG4gIGFzc2lnbkNvbHVtbihrZXksIGZpZWxkKSB7XG4gICAgLy8gZmllbGQgdmFsdWUgY291bGQgYmUgbnVsbCBmb3Igb3B0aW9uYWwgY29sdW1uc1xuICAgIGNvbnN0IHVwZGF0ZSA9IGZpZWxkXG4gICAgICA/IHtcbiAgICAgICAgICB2YWx1ZTogZmllbGQubmFtZSxcbiAgICAgICAgICBmaWVsZElkeDogZmllbGQuZmllbGRJZHhcbiAgICAgICAgfVxuICAgICAgOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMX07XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWcuY29sdW1ucyxcbiAgICAgIFtrZXldOiB7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnNba2V5XSxcbiAgICAgICAgLi4udXBkYXRlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gYSBmaWVsZCBwYWlyIHRvIGNvbHVtbiBjb25maWcsIHJldHVybiBjb2x1bW4gY29uZmlnXG4gICAqIEBwYXJhbSBrZXkgLSBDb2x1bW4gS2V5XG4gICAqIEBwYXJhbSBwYWlyIC0gZmllbGQgUGFpclxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIENvbHVtbiBjb25maWdcbiAgICovXG4gIGFzc2lnbkNvbHVtblBhaXJzKGtleSwgcGFpcikge1xuICAgIGlmICghdGhpcy5jb2x1bW5QYWlycyB8fCAhdGhpcy5jb2x1bW5QYWlycz8uW2tleV0pIHtcbiAgICAgIC8vIHNob3VsZCBub3QgZW5kIGluIHRoaXMgc3RhdGVcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5jb2x1bW5zO1xuICAgIH1cblxuICAgIGNvbnN0IHtwYWlyOiBwYXJ0bmVyS2V5LCBmaWVsZFBhaXJLZXl9ID0gdGhpcy5jb2x1bW5QYWlycz8uW2tleV07XG4gICAgY29uc3Qge2ZpZWxkUGFpcktleTogcGFydG5lckZpZWxkUGFpcktleX0gPSB0aGlzLmNvbHVtblBhaXJzPy5bcGFydG5lcktleV07XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWcuY29sdW1ucyxcbiAgICAgIFtrZXldOiBwYWlyW2ZpZWxkUGFpcktleV0sXG4gICAgICBbcGFydG5lcktleV06IHBhaXJbcGFydG5lckZpZWxkUGFpcktleV1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhIHJhZGl1cyB6b29tIG11bHRpcGxpZXIgdG8gcmVuZGVyIHBvaW50cywgc28gdGhleSBhcmUgdmlzaWJsZSBpbiBhbGwgem9vbSBsZXZlbFxuICAgKiBAcGFyYW0ge29iamVjdH0gbWFwU3RhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1hcFN0YXRlLnpvb20gLSBhY3R1YWwgem9vbVxuICAgKiBAcGFyYW0ge251bWJlciB8IHZvaWR9IG1hcFN0YXRlLnpvb21PZmZzZXQgLSB6b29tT2Zmc2V0IHdoZW4gcmVuZGVyIGluIHRoZSBwbG90IGNvbnRhaW5lciBmb3IgZXhwb3J0IGltYWdlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRab29tRmFjdG9yKHt6b29tLCB6b29tT2Zmc2V0ID0gMH0pIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMiwgTWF0aC5tYXgoMTQgLSB6b29tICsgem9vbU9mZnNldCwgMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhIGVsZXZhdGlvbiB6b29tIG11bHRpcGxpZXIgdG8gcmVuZGVyIHBvaW50cywgc28gdGhleSBhcmUgdmlzaWJsZSBpbiBhbGwgem9vbSBsZXZlbFxuICAgKiBAcGFyYW0ge29iamVjdH0gbWFwU3RhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1hcFN0YXRlLnpvb20gLSBhY3R1YWwgem9vbVxuICAgKiBAcGFyYW0ge251bWJlciB8IHZvaWR9IG1hcFN0YXRlLnpvb21PZmZzZXQgLSB6b29tT2Zmc2V0IHdoZW4gcmVuZGVyIGluIHRoZSBwbG90IGNvbnRhaW5lciBmb3IgZXhwb3J0IGltYWdlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRFbGV2YXRpb25ab29tRmFjdG9yKHt6b29tLCB6b29tT2Zmc2V0ID0gMH0pIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudmlzQ29uZmlnLmVuYWJsZUVsZXZhdGlvblpvb21GYWN0b3JcbiAgICAgID8gTWF0aC5wb3coMiwgTWF0aC5tYXgoOCAtIHpvb20gKyB6b29tT2Zmc2V0LCAwKSlcbiAgICAgIDogMTtcbiAgfVxuXG4gIGZvcm1hdExheWVyRGF0YShkYXRhc2V0cywgZmlsdGVyZWRJbmRleCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJlbmRlckxheWVyKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldEhvdmVyRGF0YShvYmplY3QsIGRhdGFDb250YWluZXIpIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgZWFjaCBlbnRyeSBvZiBsYXllckRhdGEgc2hvdWxkIGhhdmUgYW4gaW5kZXggb2YgYSByb3cgaW4gdGhlIG9yaWdpbmFsIGRhdGEgY29udGFpbmVyLlxuICAgIC8vIEVhY2ggbGF5ZXIgY2FuIGltcGxlbWVudCBpdHMgb3duIGdldEhvdmVyRGF0YSBtZXRob2RcbiAgICByZXR1cm4gZGF0YUNvbnRhaW5lci5yb3cob2JqZWN0LmluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGNoYW5nZSBsYXllciB0eXBlLCB0cnkgdG8gY29weSBvdmVyIGxheWVyIGNvbmZpZ3MgYXMgbXVjaCBhcyBwb3NzaWJsZVxuICAgKiBAcGFyYW0gY29uZmlnVG9Db3B5IC0gY29uZmlnIHRvIGNvcHkgb3ZlclxuICAgKiBAcGFyYW0gdmlzQ29uZmlnU2V0dGluZ3MgLSB2aXNDb25maWcgc2V0dGluZ3Mgb2YgY29uZmlnIHRvIGNvcHlcbiAgICovXG4gIGFzc2lnbkNvbmZpZ1RvTGF5ZXIoY29uZmlnVG9Db3B5LCB2aXNDb25maWdTZXR0aW5ncykge1xuICAgIC8vIGRvbid0IGRlZXAgbWVyZ2UgdmlzdWFsQ2hhbm5lbCBmaWVsZFxuICAgIC8vIGRvbid0IGRlZXAgbWVyZ2UgY29sb3IgcmFuZ2UsIHJldmVyc2VkOiBpcyBub3QgYSBrZXkgYnkgZGVmYXVsdFxuICAgIGNvbnN0IHNoYWxsb3dDb3B5ID0gWydjb2xvclJhbmdlJywgJ3N0cm9rZUNvbG9yUmFuZ2UnXS5jb25jYXQoXG4gICAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLm1hcCh2ID0+IHYuZmllbGQpXG4gICAgKTtcblxuICAgIC8vIGRvbid0IGNvcHkgb3ZlciBkb21haW4gYW5kIGFuaW1hdGlvblxuICAgIGNvbnN0IG5vdFRvQ29weSA9IFsnYW5pbWF0aW9uJ10uY29uY2F0KE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykubWFwKHYgPT4gdi5kb21haW4pKTtcbiAgICAvLyBpZiByYW5nZSBpcyBmb3IgdGhlIHNhbWUgcHJvcGVydHkgZ3JvdXAgY29weSBpdCwgb3RoZXJ3aXNlLCBub3QgdG8gY29weVxuICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaCh2ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnVG9Db3B5LnZpc0NvbmZpZ1t2LnJhbmdlXSAmJlxuICAgICAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW3YucmFuZ2VdICYmXG4gICAgICAgIHZpc0NvbmZpZ1NldHRpbmdzW3YucmFuZ2VdLmdyb3VwICE9PSB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW3YucmFuZ2VdLmdyb3VwXG4gICAgICApIHtcbiAgICAgICAgbm90VG9Db3B5LnB1c2godi5yYW5nZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBkb24ndCBjb3B5IG92ZXIgdmlzdWFsQ2hhbm5lbCByYW5nZVxuICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBjb3BpZWQgPSB0aGlzLmNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnLCBjb25maWdUb0NvcHksIHtcbiAgICAgIHNoYWxsb3dDb3B5LFxuICAgICAgbm90VG9Db3B5XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyhjb3BpZWQpO1xuICAgIC8vIHZhbGlkYXRlIHZpc3VhbENoYW5uZWwgZmllbGQgdHlwZSBhbmQgc2NhbGUgdHlwZXNcbiAgICBPYmplY3Qua2V5cyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbCk7XG4gICAgfSk7XG4gIH1cblxuICAvKlxuICAgKiBSZWN1cnNpdmVseSBjb3B5IGNvbmZpZyBvdmVyIHRvIGFuIGVtcHR5IGxheWVyXG4gICAqIHdoZW4gcmVjZWl2ZWQgc2F2ZWQgY29uZmlnLCBvciBjb3B5IGNvbmZpZyBvdmVyIGZyb20gYSBkaWZmZXJlbnQgbGF5ZXIgdHlwZVxuICAgKiBtYWtlIHN1cmUgdG8gb25seSBjb3B5IG92ZXIgdmFsdWUgdG8gZXhpc3Rpbmcga2V5c1xuICAgKiBAcGFyYW0ge29iamVjdH0gY3VycmVudENvbmZpZyAtIGV4aXN0aW5nIGNvbmZpZyB0byBiZSBvdmVycmlkZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnVG9Db3B5IC0gbmV3IENvbmZpZyB0byBjb3B5IG92ZXJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2hhbGxvd0NvcHkgLSBhcnJheSBvZiBwcm9wZXJ0aWVzIHRvIG5vdCB0byBiZSBkZWVwIGNvcGllZFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBub3RUb0NvcHkgLSBhcnJheSBvZiBwcm9wZXJ0aWVzIG5vdCB0byBjb3B5XG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gY29waWVkIGNvbmZpZ1xuICAgKi9cbiAgY29weUxheWVyQ29uZmlnKGN1cnJlbnRDb25maWcsIGNvbmZpZ1RvQ29weSwge3NoYWxsb3dDb3B5ID0gW10sIG5vdFRvQ29weSA9IFtdfSA9IHt9KSB7XG4gICAgY29uc3QgY29waWVkID0ge307XG4gICAgT2JqZWN0LmtleXMoY3VycmVudENvbmZpZykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpc1BsYWluT2JqZWN0KGN1cnJlbnRDb25maWdba2V5XSkgJiZcbiAgICAgICAgaXNQbGFpbk9iamVjdChjb25maWdUb0NvcHlba2V5XSkgJiZcbiAgICAgICAgIXNoYWxsb3dDb3B5LmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgIW5vdFRvQ29weS5pbmNsdWRlcyhrZXkpXG4gICAgICApIHtcbiAgICAgICAgLy8gcmVjdXJzaXZlbHkgYXNzaWduIG9iamVjdCB2YWx1ZVxuICAgICAgICBjb3BpZWRba2V5XSA9IHRoaXMuY29weUxheWVyQ29uZmlnKGN1cnJlbnRDb25maWdba2V5XSwgY29uZmlnVG9Db3B5W2tleV0sIHtcbiAgICAgICAgICBzaGFsbG93Q29weSxcbiAgICAgICAgICBub3RUb0NvcHlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKG5vdE51bGxvclVuZGVmaW5lZChjb25maWdUb0NvcHlba2V5XSkgJiYgIW5vdFRvQ29weS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIC8vIGNvcHlcbiAgICAgICAgY29waWVkW2tleV0gPSBjb25maWdUb0NvcHlba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGtlZXAgZXhpc3RpbmdcbiAgICAgICAgY29waWVkW2tleV0gPSBjdXJyZW50Q29uZmlnW2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29waWVkO1xuICB9XG5cbiAgcmVnaXN0ZXJWaXNDb25maWcobGF5ZXJWaXNDb25maWdzKSB7XG4gICAgT2JqZWN0LmtleXMobGF5ZXJWaXNDb25maWdzKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBMQVlFUl9WSVNfQ09ORklHU1tsYXllclZpc0NvbmZpZ3NbaXRlbV1dKSB7XG4gICAgICAgIC8vIGlmIGFzc2lnbmVkIG9uZSBvZiBkZWZhdWx0IExBWUVSX0NPTkZJR1NcbiAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnW2l0ZW1dID0gTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3NbaXRlbV0gPSBMQVlFUl9WSVNfQ09ORklHU1tsYXllclZpc0NvbmZpZ3NbaXRlbV1dO1xuICAgICAgfSBlbHNlIGlmIChbJ3R5cGUnLCAnZGVmYXVsdFZhbHVlJ10uZXZlcnkocCA9PiBsYXllclZpc0NvbmZpZ3NbaXRlbV0uaGFzT3duUHJvcGVydHkocCkpKSB7XG4gICAgICAgIC8vIGlmIHByb3ZpZGVkIGN1c3RvbWl6ZWQgdmlzQ29uZmlnLCBhbmQgaGFzIHR5cGUgJiYgZGVmYXVsdFZhbHVlXG4gICAgICAgIC8vIFRPRE86IGZ1cnRoZXIgY2hlY2sgaWYgY3VzdG9taXplZCB2aXNDb25maWcgaXMgdmFsaWRcbiAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnW2l0ZW1dID0gbGF5ZXJWaXNDb25maWdzW2l0ZW1dLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1tpdGVtXSA9IGxheWVyVmlzQ29uZmlnc1tpdGVtXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldExheWVyQ29sdW1ucygpIHtcbiAgICBjb25zdCBjb2x1bW5WYWxpZGF0b3JzID0gdGhpcy5jb2x1bW5WYWxpZGF0b3JzIHx8IHt9O1xuICAgIGNvbnN0IHJlcXVpcmVkID0gdGhpcy5yZXF1aXJlZExheWVyQ29sdW1ucy5yZWR1Y2UoXG4gICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XTogY29sdW1uVmFsaWRhdG9yc1trZXldXG4gICAgICAgICAgPyB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgdmFsaWRhdG9yOiBjb2x1bW5WYWxpZGF0b3JzW2tleV19XG4gICAgICAgICAgOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMX1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICAgIGNvbnN0IG9wdGlvbmFsID0gdGhpcy5vcHRpb25hbENvbHVtbnMucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IHt2YWx1ZTogbnVsbCwgZmllbGRJZHg6IC0xLCBvcHRpb25hbDogdHJ1ZX1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHsuLi5yZXF1aXJlZCwgLi4ub3B0aW9uYWx9O1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJDb25maWcobmV3Q29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7Li4udGhpcy5jb25maWcsIC4uLm5ld0NvbmZpZ307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVMYXllclZpc0NvbmZpZyhuZXdWaXNDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZy52aXNDb25maWcgPSB7Li4udGhpcy5jb25maWcudmlzQ29uZmlnLCAuLi5uZXdWaXNDb25maWd9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJDb2xvclVJKHByb3AsIG5ld0NvbmZpZykge1xuICAgIGNvbnN0IHtjb2xvclVJOiBwcmV2aW91cywgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KG5ld0NvbmZpZykgfHwgdHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvclVJUHJvcCA9IE9iamVjdC5lbnRyaWVzKG5ld0NvbmZpZykucmVkdWNlKChhY2N1LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBpc1BsYWluT2JqZWN0KGFjY3Vba2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB7Li4uYWNjdVtrZXldLCAuLi52YWx1ZX0gOiB2YWx1ZVxuICAgICAgfTtcbiAgICB9LCBwcmV2aW91c1twcm9wXSB8fCBERUZBVUxUX0NPTE9SX1VJKTtcblxuICAgIGNvbnN0IGNvbG9yVUkgPSB7XG4gICAgICAuLi5wcmV2aW91cyxcbiAgICAgIFtwcm9wXTogY29sb3JVSVByb3BcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7Y29sb3JVSX0pO1xuICAgIC8vIGlmIGNvbG9yVUlbcHJvcF0gaXMgY29sb3JSYW5nZS4gSWYgdHlwZSBpcyBoZXhDb2xvciB0aGVuIGl0J3MgYWxzbyBhIHJhbmdlXG4gICAgY29uc3QgaXNDb2xvclJhbmdlID1cbiAgICAgIHZpc0NvbmZpZ1twcm9wXSAmJiAodmlzQ29uZmlnW3Byb3BdLmNvbG9ycyB8fCB2aXNDb25maWdbcHJvcF0udHlwZSA9PT0gaGV4Q29sb3IpO1xuXG4gICAgaWYgKGlzQ29sb3JSYW5nZSkge1xuICAgICAgdGhpcy51cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlKG5ld0NvbmZpZywgcHJvcCk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbG9yUmFuZ2VCeUNvbG9yVUkobmV3Q29uZmlnLCBwcmV2aW91cywgcHJvcCk7XG4gICAgICB0aGlzLnVwZGF0ZUN1c3RvbVBhbGV0dGUobmV3Q29uZmlnLCBwcmV2aW91cywgcHJvcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVDdXN0b21QYWxldHRlKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApIHtcbiAgICBpZiAoIW5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnIHx8ICFuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZy5jdXN0b20pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7Y29sb3JVSSwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgaWYgKCF2aXNDb25maWdbcHJvcF0pIHJldHVybjtcbiAgICBjb25zdCB7Y29sb3JzfSA9IHZpc0NvbmZpZ1twcm9wXTtcbiAgICBjb25zdCBjdXN0b21QYWxldHRlID0ge1xuICAgICAgLi4uY29sb3JVSVtwcm9wXS5jdXN0b21QYWxldHRlLFxuICAgICAgbmFtZTogJ0N1c3RvbSBQYWxldHRlJyxcbiAgICAgIGNvbG9yczogWy4uLmNvbG9yc11cbiAgICB9O1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgY29sb3JVSToge1xuICAgICAgICAuLi5jb2xvclVJLFxuICAgICAgICBbcHJvcF06IHtcbiAgICAgICAgICAuLi5jb2xvclVJW3Byb3BdLFxuICAgICAgICAgIGN1c3RvbVBhbGV0dGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBpZiBvcGVuIGRyb3Bkb3duIGFuZCBwcm9wIGlzIGNvbG9yIHJhbmdlXG4gICAqIEF1dG9tYXRpY2FsbHkgc2V0IGNvbG9yUmFuZ2VDb25maWcncyBzdGVwLCByZXZlcnNlZCBhbmQgdHlwZVxuICAgKiBAcGFyYW0geyp9IG5ld0NvbmZpZ1xuICAgKiBAcGFyYW0geyp9IHByb3BcbiAgICovXG4gIHVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UobmV3Q29uZmlnLCBwcm9wKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDb25maWcuc2hvd0Ryb3Bkb3duICE9PSAnbnVtYmVyJykgcmV0dXJuO1xuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgLi4uY29sb3JVSSxcbiAgICAgICAgW3Byb3BdOiB7XG4gICAgICAgICAgLi4uY29sb3JVSVtwcm9wXSxcbiAgICAgICAgICBjb2xvclJhbmdlQ29uZmlnOiB7XG4gICAgICAgICAgICAuLi5jb2xvclVJW3Byb3BdLmNvbG9yUmFuZ2VDb25maWcsXG4gICAgICAgICAgICB0eXBlOiB2aXNDb25maWdbcHJvcF0udHlwZSxcbiAgICAgICAgICAgIHN0ZXBzOiB2aXNDb25maWdbcHJvcF0uY29sb3JzPy5sZW5ndGgsXG4gICAgICAgICAgICByZXZlcnNlZDogQm9vbGVhbih2aXNDb25maWdbcHJvcF0ucmV2ZXJzZWQpLFxuICAgICAgICAgICAgaGV4Q29sdW1uOiB0aGlzLmdldEhleENvbHVtbihwcm9wKSxcbiAgICAgICAgICAgIGlzSGV4Q29sdW1uOiB0aGlzLmlzQ29sb3JlZEJ5Q29sb3JDb2x1bW4ocHJvcClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHVwZGF0ZUNvbG9yUmFuZ2VCeUNvbG9yVUkobmV3Q29uZmlnLCBwcmV2aW91cywgcHJvcCkge1xuICAgIC8vIG9ubHkgdXBkYXRlIGNvbG9yUmFuZ2UgaWYgY2hhbmdlcyBpbiBVSSBpcyBtYWRlIHRvICdyZXZlcnNlZCcsICdzdGVwcycgb3Igc3RlcHNcbiAgICBjb25zdCBzaG91bGRVcGRhdGUgPVxuICAgICAgbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcgJiZcbiAgICAgIFsncmV2ZXJzZWQnLCAnc3RlcHMnXS5zb21lKFxuICAgICAgICBrZXkgPT5cbiAgICAgICAgICBuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmXG4gICAgICAgICAgbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWdba2V5XSAhPT1cbiAgICAgICAgICAgIChwcmV2aW91c1twcm9wXSB8fCBERUZBVUxUX0NPTE9SX1VJKS5jb2xvclJhbmdlQ29uZmlnW2tleV1cbiAgICAgICk7XG4gICAgaWYgKCFzaG91bGRVcGRhdGUpIHJldHVybjtcblxuICAgIGNvbnN0IHtjb2xvclVJLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3Qge3N0ZXBzLCByZXZlcnNlZH0gPSBjb2xvclVJW3Byb3BdLmNvbG9yUmFuZ2VDb25maWc7XG4gICAgY29uc3QgY29sb3JSYW5nZSA9IHZpc0NvbmZpZ1twcm9wXTtcbiAgICAvLyBmaW5kIGJhc2VkIG9uIHN0ZXAgb3IgcmV2ZXJzZWRcbiAgICBsZXQgdXBkYXRlO1xuICAgIGlmIChuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnc3RlcHMnKSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSBnZXRDb2xvckdyb3VwQnlOYW1lKGNvbG9yUmFuZ2UpO1xuXG4gICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgY29uc3Qgc2FtZUdyb3VwID0gQ09MT1JfUkFOR0VTLmZpbHRlcihjciA9PiBnZXRDb2xvckdyb3VwQnlOYW1lKGNyKSA9PT0gZ3JvdXApO1xuXG4gICAgICAgIHVwZGF0ZSA9IHNhbWVHcm91cC5maW5kKGNyID0+IGNyLmNvbG9ycy5sZW5ndGggPT09IHN0ZXBzKTtcblxuICAgICAgICBpZiAodXBkYXRlICYmIGNvbG9yUmFuZ2UucmV2ZXJzZWQpIHtcbiAgICAgICAgICB1cGRhdGUgPSByZXZlcnNlQ29sb3JSYW5nZSh0cnVlLCB1cGRhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZSAmJiBjb2xvclJhbmdlLmNvbG9yTWFwKSB7XG4gICAgICAgICAgdXBkYXRlID0gdGhpcy51cGRhdGVDb2xvck1hcChwcm9wLCBjb2xvclJhbmdlLmNvbG9yTWFwLCB1cGRhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnLmhhc093blByb3BlcnR5KCdyZXZlcnNlZCcpKSB7XG4gICAgICB1cGRhdGUgPSByZXZlcnNlQ29sb3JSYW5nZShyZXZlcnNlZCwgdXBkYXRlIHx8IGNvbG9yUmFuZ2UpO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGUpIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJWaXNDb25maWcoe1twcm9wXTogdXBkYXRlfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ29sb3JNYXAocHJvcCwgY29sb3JNYXAsIGNvbG9yUmFuZ2UpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3Qge2ZpZWxkLCBkb21haW59ID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5maW5kKHZhbHVlID0+IHZhbHVlLnJhbmdlID09PSBwcm9wKTtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5jb25maWdbZmllbGRdPy50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlID09PSAnZGF0ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNhdGVnb3J5Q29sb3JNYXAoY29sb3JNYXAsIHRoaXMuY29uZmlnW2RvbWFpbl0sIGNvbG9yUmFuZ2UpO1xuICAgIH1cblxuICAgIC8vIElmIG5vIHR5cGUgb3IgdHlwZSBpcyBub3Qgc3RyaW5nLCBib29sZWFuIG9yIGRhdGVcbiAgICByZXR1cm4gdGhpcy51cGRhdGVOdW1lcmljQ29sb3JNYXAoY29sb3JNYXAsIHRoaXMuY29uZmlnW2RvbWFpbl0sIGNvbG9yUmFuZ2UpO1xuICB9XG5cbiAgdXBkYXRlQ2F0ZWdvcnlDb2xvck1hcChjb2xvck1hcCwgZG9tYWluLCBjb2xvclJhbmdlKSB7XG4gICAgY29uc3QgY29sb3JzID0gY29sb3JSYW5nZS5jb2xvcnM7XG4gICAgY29uc3QgYXNzaWduZWRDYXRlZ29yaWVzID0gW107XG4gICAgaWYgKGNvbG9yUmFuZ2UudHlwZSA9PT0gaGV4Q29sb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbG9yUmFuZ2UsXG4gICAgICAgIGNvbG9yTWFwOiBbXVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29sb3JNYXAgPSBjb2xvck1hcC5zbGljZSgwLCBjb2xvcnMubGVuZ3RoKS5tYXAoKGNNYXAsIGluZGV4KSA9PiB7XG4gICAgICBhc3NpZ25lZENhdGVnb3JpZXMucHVzaChjTWFwWzBdKTtcbiAgICAgIHJldHVybiBbY01hcFswXSwgY29sb3JzW2luZGV4XV07XG4gICAgfSk7XG4gICAgY29uc3QgdW5hc3NpZ25lZENvbG9ycyA9IGNvbG9ycy5zbGljZShuZXdDb2xvck1hcC5sZW5ndGgsIGNvbG9ycy5sZW5ndGgpO1xuXG4gICAgZm9yIChjb25zdCBjb2xvciBvZiB1bmFzc2lnbmVkQ29sb3JzKSB7XG4gICAgICBjb25zdCBjYXRlZ29yeSA9IGRvbWFpbi5maW5kKGQgPT4gIWFzc2lnbmVkQ2F0ZWdvcmllcy5pbmNsdWRlcyhkKSk7XG4gICAgICBpZiAoIWNhdGVnb3J5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYXNzaWduZWRDYXRlZ29yaWVzLnB1c2goY2F0ZWdvcnkpO1xuICAgICAgbmV3Q29sb3JNYXAucHVzaChbY2F0ZWdvcnksIGNvbG9yXSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2xvclJhbmdlLFxuICAgICAgY29sb3JNYXA6IG5ld0NvbG9yTWFwXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZU51bWVyaWNDb2xvck1hcChjb2xvck1hcCwgZG9tYWluLCB1cGRhdGUpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB1cGRhdGUuY29sb3JzO1xuICAgIGxldCBuZXdDb2xvck1hcCA9IGNvbG9yTWFwLnNsaWNlKDAsIGNvbG9ycy5sZW5ndGgpO1xuXG4gICAgbmV3Q29sb3JNYXAgPSBuZXdDb2xvck1hcC5tYXAoKGNNYXAsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGluZGV4ID09PSBuZXdDb2xvck1hcC5sZW5ndGggLSAxID8gbnVsbCA6IGNNYXBbMF07XG4gICAgICByZXR1cm4gW3ZhbHVlLCBjb2xvcnNbaW5kZXhdXTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmFzc2lnbmVkQ29sb3JzID0gY29sb3JzLnNsaWNlKG5ld0NvbG9yTWFwLmxlbmd0aCwgY29sb3JzLmxlbmd0aCk7XG5cbiAgICBpZiAodW5hc3NpZ25lZENvbG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjb2xvck1hcFZhbHVlcyA9IGNvbG9yTWFwLm1hcChjID0+IGNbMF0pLmZpbHRlcihjID0+IHR5cGVvZiBjID09PSAnbnVtYmVyJyk7XG4gICAgICBjb25zdCBtYXhWYWx1ZSA9IE1hdGgubWF4KC4uLmNvbG9yTWFwVmFsdWVzLCBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdKTtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IG5ld0NvbG9yTWFwW25ld0NvbG9yTWFwLmxlbmd0aCAtIDJdWzBdO1xuICAgICAgY29uc3Qgc3RlcCA9IChtYXhWYWx1ZSAtIHByZXZWYWx1ZSkgLyAodW5hc3NpZ25lZENvbG9ycy5sZW5ndGggKyAxKTtcbiAgICAgIG5ld0NvbG9yTWFwW25ld0NvbG9yTWFwLmxlbmd0aCAtIDFdWzBdID0gcHJldlZhbHVlICsgc3RlcDtcblxuICAgICAgZm9yIChjb25zdCBbaSwgY29sb3JdIG9mIHVuYXNzaWduZWRDb2xvcnMuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaSA9PT0gdW5hc3NpZ25lZENvbG9ycy5sZW5ndGggLSAxID8gbnVsbCA6IHByZXZWYWx1ZSArIChzdGVwICogKGkgKyAyKSk7XG4gICAgICAgIG5ld0NvbG9yTWFwLnB1c2goW3ZhbHVlLCBjb2xvcl0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4udXBkYXRlLFxuICAgICAgY29sb3JNYXA6IG5ld0NvbG9yTWFwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIGxheWVyIGhhcyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0geWVzIG9yIG5vXG4gICAqL1xuICBoYXNBbGxDb2x1bW5zKCkge1xuICAgIGNvbnN0IHtjb2x1bW5zfSA9IHRoaXMuY29uZmlnO1xuICAgIHJldHVybiAoXG4gICAgICAoY29sdW1ucyAmJlxuICAgICAgT2JqZWN0LnZhbHVlcyhjb2x1bW5zKS5ldmVyeSh2ID0+IHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odi5vcHRpb25hbCB8fCAodi52YWx1ZSAmJiB2LmZpZWxkSWR4ID4gLTEpKTtcbiAgICAgIH0pKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciBsYXllciBoYXMgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5IHwgT2JqZWN0fSBsYXllckRhdGFcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHllcyBvciBub1xuICAgKi9cbiAgaGFzTGF5ZXJEYXRhKGxheWVyRGF0YSkge1xuICAgIGlmICghbGF5ZXJEYXRhKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBCb29sZWFuKGxheWVyRGF0YS5kYXRhICYmIGxheWVyRGF0YS5kYXRhLmxlbmd0aCk7XG4gIH1cblxuICBpc1ZhbGlkVG9TYXZlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgJiYgdGhpcy5oYXNBbGxDb2x1bW5zKCk7XG4gIH1cblxuICBzaG91bGRSZW5kZXJMYXllcihkYXRhKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLnR5cGUgJiZcbiAgICAgIHRoaXMuaGFzQWxsQ29sdW1ucygpICYmXG4gICAgICB0aGlzLmhhc0xheWVyRGF0YShkYXRhKSAmJlxuICAgICAgdHlwZW9mIHRoaXMucmVuZGVyTGF5ZXIgPT09ICdmdW5jdGlvbicpXG4gICAgKTtcbiAgfVxuXG4gIGdldENvbG9yU2NhbGUoY29sb3JTY2FsZSwgY29sb3JEb21haW4sIGNvbG9yUmFuZ2UpIHtcbiAgICBpZiAoY29sb3JSYW5nZS50eXBlID09PSBoZXhDb2xvcikge1xuICAgICAgcmV0dXJuIChfLCBjb2xvcikgPT4ge1xuICAgICAgICBjb25zdCB7ciwgZywgYn0gPSByZ2IoY29sb3IpO1xuICAgICAgICByZXR1cm4gW3IsIGcsIGJdLnNvbWUoaXNOYU4pID8gVU5LTk9XTl9DT0xPUiA6IFtyLCBnLCBiXTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbG9yUmFuZ2UuY29sb3JNYXApKSB7XG4gICAgICBjb25zdCBjTWFwID0gbmV3IE1hcCgpO1xuICAgICAgY29sb3JSYW5nZS5jb2xvck1hcC5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgY01hcC5zZXQoaywgdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gaGV4VG9SZ2IodikgOiB2KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBAdHMtaWdub3JlIGQzIHNjYWxlXG4gICAgICBjb25zdCBzY2FsZSA9IFNDQUxFX0ZVTkNbY29sb3JTY2FsZV0oKVxuICAgICAgICAuZG9tYWluKEFycmF5LmZyb20oY01hcC5rZXlzKCkpKVxuICAgICAgICAucmFuZ2UoQXJyYXkuZnJvbShjTWFwLnZhbHVlcygpKSlcbiAgICAgICAgLnVua25vd24oVU5LTk9XTl9DT0xPUik7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKGNvbG9yU2NhbGUsIGNvbG9yRG9tYWluLCBjb2xvclJhbmdlLmNvbG9ycy5tYXAoaGV4VG9SZ2IpKTtcbiAgfVxuXG4gIGdldEN1c3RvbU1hcmtlcnNTY2FsZShyYW5nZSwgZmFsbGJhY2tJY29uKSB7XG4gICAgbGV0IHVua25vd25WYWx1ZSA9IGZhbGxiYWNrSWNvbiB8fCBGQUxMQkFDS19JQ09OO1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgIHJldHVybiAoKSA9PiB1bmtub3duVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWFwcGluZyA9IG5ldyBNYXAoKTtcblxuICAgIGlmIChyYW5nZS5vdGhlcnNNYXJrZXIpIHtcbiAgICAgIHVua25vd25WYWx1ZSA9IHJhbmdlLm90aGVyc01hcmtlcjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7dmFsdWUsIG1hcmtlclVybH0gb2YgcmFuZ2UubWFya2VyTWFwKSB7XG4gICAgICBpZiAobWFya2VyVXJsKSB7XG4gICAgICAgIG1hcHBpbmcuc2V0KHZhbHVlLCBtYXJrZXJVcmwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmUgZDMgc2NhbGVcbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlT3JkaW5hbCgpXG4gICAgICAuZG9tYWluKEFycmF5LmZyb20obWFwcGluZy5rZXlzKCkpKVxuICAgICAgLnJhbmdlKEFycmF5LmZyb20obWFwcGluZy52YWx1ZXMoKSkpXG4gICAgICAudW5rbm93bih1bmtub3duVmFsdWUpO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gdmlzdWFsIGNoYW5uZWxzIHRvIGRlY2suZ2wgYWNjZXNvcnNcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtIFBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW0uZGF0YUFjY2Vzc29yIEFjY2VzcyBrZXBsZXIuZ2wgbGF5ZXIgZGF0YSBmcm9tIGRlY2suZ2wgbGF5ZXJcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2V9IHBhcmFtLmRhdGFDb250YWluZXIgRGF0YUNvbnRhaW5lciB0byB1c2UgdXNlIHdpdGggZGF0YUFjY2Vzc29yXG4gICAqIEByZXR1cm4ge09iamVjdH0gYXR0cmlidXRlQWNjZXNzb3JzIC0gZGVjay5nbCBsYXllciBhdHRyaWJ1dGUgYWNjZXNzb3JzXG4gICAqL1xuICBnZXRBdHRyaWJ1dGVBY2Nlc3NvcnMoe2RhdGFBY2Nlc3NvciA9IGRlZmF1bHREYXRhQWNjZXNzb3IsIGRhdGFDb250YWluZXJ9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlQWNjZXNzb3JzID0ge307XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIE9iamVjdC5rZXlzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBmaXhlZCxcbiAgICAgICAgc2NhbGUsXG4gICAgICAgIGRvbWFpbixcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgICAgICBudWxsVmFsdWUsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGUsXG4gICAgICAgIGFnZ3JlZ2F0aW9uXG4gICAgICB9ID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcblxuICAgICAgY29uc3Qgc2hvdWxkR2V0U2NhbGUgPSBCb29sZWFuKFxuICAgICAgICAoc2NhbGUgfHwgY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuaWRlbnRpdHkpICYmIHRoaXMuY29uZmlnW2ZpZWxkXVxuICAgICAgKTtcblxuICAgICAgaWYgKHNob3VsZEdldFNjYWxlKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbdGhpcy5jb25maWdbc2NhbGVdLCB0aGlzLmNvbmZpZ1tkb21haW5dLCB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdXTtcbiAgICAgICAgY29uc3QgaXNGaXhlZCA9IGZpeGVkICYmIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tmaXhlZF07XG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGRlY2xhcmUgYXMgY29uc3QgYWxsIHRoZSBwYXJhbWV0ZXJzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGJlIHVzZSBpbiB0aGUgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSBjYWxsXG4gICAgICAgIC8vIG90aGVyd2lzZSwgdGhlIG9sZExheWVyRGF0YSBwYXJhbWV0ZXIgaW4gZm9ybWF0TGF5ZXJEYXRhIG1ldGhvZCB3aWxsIGJlIHdyb25nICh5b3UgY2FuIGNoZWNrIHRoZSBmb3JtYXRMYXllckRhdGEgVGlsZUxheWVyIG1ldGhvZCBpbiBCdWlsZGVyIGFzIGV4YW1wbGUpXG4gICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdGhpcy5jb25maWdbZmllbGRdO1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGlvblZhbHVlID0gdGhpcy5jb25maWcudmlzQ29uZmlnW2FnZ3JlZ2F0aW9uXTtcblxuICAgICAgICBjb25zdCBzY2FsZUZ1bmN0aW9uID1cbiAgICAgICAgICBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5pZGVudGl0eVxuICAgICAgICAgICAgPyBzY2FsZUlkZW50aXR5XG4gICAgICAgICAgICA6IGNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmNvbG9yXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q29sb3JTY2FsZSguLi5hcmdzKVxuICAgICAgICAgICAgOiBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5jdXN0b21NYXJrZXJcbiAgICAgICAgICAgID8gdGhpcy5nZXRDdXN0b21NYXJrZXJzU2NhbGUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy52aXNDb25maWcuY3VzdG9tTWFya2Vyc1VybFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKC4uLmFyZ3MsIGlzRml4ZWQpO1xuXG4gICAgICAgIGF0dHJpYnV0ZUFjY2Vzc29yc1thY2Nlc3Nvcl0gPSBkID0+XG4gICAgICAgICAgdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKHtcbiAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICBkYXRhQ29udGFpbmVyLFxuICAgICAgICAgICAgc2NhbGU6IHNjYWxlRnVuY3Rpb24sXG4gICAgICAgICAgICBkYXRhOiBkYXRhQWNjZXNzb3IoZGF0YUNvbnRhaW5lcikoZCksXG4gICAgICAgICAgICBmaWVsZDogZmllbGRDb25maWcsXG4gICAgICAgICAgICBfYWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVmFsdWUsXG4gICAgICAgICAgICBudWxsVmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGdldEF0dHJpYnV0ZVZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGF0dHJpYnV0ZUFjY2Vzc29yc1thY2Nlc3Nvcl0gPSBnZXRBdHRyaWJ1dGVWYWx1ZSh0aGlzLmNvbmZpZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID1cbiAgICAgICAgICB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFZhbHVlKHRoaXMuY29uZmlnKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoYWNjZXNzb3IgaW4gYXR0cmlidXRlQWNjZXNzb3JzKSkge1xuICAgICAgICBDb25zb2xlLndhcm4oYEZhaWxlZCB0byBwcm92aWRlIGFjY2Vzc29yIGZ1bmN0aW9uIGZvciAke2FjY2Vzc29yIHx8IGNoYW5uZWx9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXR0cmlidXRlQWNjZXNzb3JzO1xuICB9XG5cbiAgZ2V0VmlzQ2hhbm5lbFNjYWxlKHNjYWxlLCBkb21haW4sIHJhbmdlLCBmaXhlZCkge1xuICAgIGlmIChzY2FsZSA9PT0gU0NBTEVfVFlQRVMub3JkaW5hbCkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBkMy1zY2FsZSB0eXBlXG4gICAgICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZV0oKVxuICAgICAgICAuZG9tYWluKGRvbWFpbi5zbGljZSgwLCByYW5nZS5sZW5ndGgpKVxuICAgICAgICAucmFuZ2UocmFuZ2UpXG4gICAgICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuICAgIH1cblxuICAgIC8vIGZvciBgY291bnRgIGFnZ3JlZ2F0aW9uLCB3ZSBkb21haW4gaXMgYWN0dWFsbHkgYFswLCBJbmZpbml0eV1gIHNvIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZVxuICAgIC8vIHRvIHVzZSBpdCwgc28gc2tpcCBzcGVjeWZ5aW5nIHRoaXMgZG9tYWluc1xuICAgIGNvbnN0IGRvbWFpbklzSW5maW5pdGUgPSBkb21haW4gJiYgKGRvbWFpblswXSA9PT0gMCAmJiBkb21haW5bMV0gPT09IEluZmluaXR5KTtcbiAgICBjb25zdCBzY2FsZUZhY3RvcnkgPSBTQ0FMRV9GVU5DW2ZpeGVkID8gJ2xpbmVhcicgOiBzY2FsZV07XG4gICAgLy8gQHRzLWlnbm9yZSBkMy1zY2FsZSB0eXBlXG4gICAgbGV0IHJlc3VsdCA9IHNjYWxlRmFjdG9yeSgpO1xuICAgIGlmIChkb21haW4gJiYgIWRvbWFpbklzSW5maW5pdGUpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5kb21haW4oZG9tYWluKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5yYW5nZShmaXhlZCA/IGRvbWFpbiA6IHJhbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBib3VuZHMgb2YgdGhlIGRhdGEuXG4gICAqIEBwYXJhbSB7aW1wb3J0KCd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnKS5EYXRhQ29udGFpbmVySW50ZXJmYWNlfSBkYXRhQ29udGFpbmVyIERhdGFDb250YWluZXIgdG8gY2FsY3VsYXRlIGJvdW5kcyBmb3IuXG4gICAqIEBwYXJhbSB7KGQ6IHtpbmRleDogbnVtYmVyfSwgZGM6IGltcG9ydCgndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJykuRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT4gbnVtYmVyW119IGdldFBvc2l0aW9uIEFjY2VzcyBrZXBsZXIuZ2wgbGF5ZXIgZGF0YSBmcm9tIGRlY2suZ2wgbGF5ZXJcbiAgICogQHJldHVybiB7bnVtYmVyW118bnVsbH0gYm91bmRzIG9mIHRoZSBkYXRhLlxuICAgKi9cbiAgZ2V0UG9pbnRzQm91bmRzKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKSB7XG4gICAgLy8gbm8gbmVlZCB0byBsb29wIHRocm91Z2ggdGhlIGVudGlyZSBkYXRhc2V0XG4gICAgLy8gZ2V0IGEgc2FtcGxlIG9mIGRhdGEgdG8gY2FsY3VsYXRlIGJvdW5kc1xuICAgIGNvbnN0IHNhbXBsZURhdGEgPVxuICAgICAgZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkgPiBNQVhfU0FNUExFX1NJWkVcbiAgICAgICAgPyBnZXRTYW1wbGVEYXRhKGRhdGFDb250YWluZXIsIE1BWF9TQU1QTEVfU0laRSlcbiAgICAgICAgOiBkYXRhQ29udGFpbmVyO1xuXG4gICAgY29uc3QgcG9pbnRzID0gc2FtcGxlRGF0YS5tYXBJbmRleChnZXRQb3NpdGlvbik7XG5cbiAgICBjb25zdCBsYXRCb3VuZHMgPSBnZXRMYXRMbmdCb3VuZHMocG9pbnRzLCAxLCBbLTkwLCA5MF0pO1xuICAgIGNvbnN0IGxuZ0JvdW5kcyA9IGdldExhdExuZ0JvdW5kcyhwb2ludHMsIDAsIFstMTgwLCAxODBdKTtcblxuICAgIGlmICghbGF0Qm91bmRzIHx8ICFsbmdCb3VuZHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBbbG5nQm91bmRzWzBdLCBsYXRCb3VuZHNbMF0sIGxuZ0JvdW5kc1sxXSwgbGF0Qm91bmRzWzFdXTtcbiAgfVxuXG4gIGdldENoYW5nZWRUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMpIHtcbiAgICBjb25zdCB0cmlnZ2VyQ2hhbmdlZCA9IGRpZmZVcGRhdGVUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMsIHRoaXMuX29sZERhdGFVcGRhdGVUcmlnZ2Vycyk7XG4gICAgdGhpcy5fb2xkRGF0YVVwZGF0ZVRyaWdnZXJzID0gZGF0YVVwZGF0ZVRyaWdnZXJzO1xuXG4gICAgcmV0dXJuIHRyaWdnZXJDaGFuZ2VkO1xuICB9XG5cbiAgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSh7XG4gICAgY2hhbm5lbCxcbiAgICBzY2FsZSxcbiAgICBkYXRhLFxuICAgIGZpZWxkLFxuICAgIGRhdGFDb250YWluZXIsXG4gICAgLy8gSW4gYnVpbGRlciB3ZSBvdmVyd3JpdGUgdGhlIGdldFZhbHVlIGZ1bmN0aW9uIGFuZCB3ZSB1c2UgdGhlIF9hZ2dyZWdhdGlvbiBwYXJhbWV0ZXIgaW4gc3BhdGlhbCBpbmRleCBsYXllcnMgYXMgdGhlIFF1YWRrZXlMYXllci5cbiAgICBfYWdncmVnYXRpb24sXG4gICAgbnVsbFZhbHVlID0gTk9fVkFMVUVfQ09MT1IsXG4gICAgZ2V0VmFsdWUgPSBkZWZhdWx0R2V0RmllbGRWYWx1ZVxuICB9KSB7XG4gICAgbGV0IGNvbG9yQ29sdW1uVmFsdWU7XG4gICAgY29uc3Qge3R5cGV9ID0gZmllbGQ7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRWYWx1ZShmaWVsZCwgZGF0YSk7XG4gICAgY29uc3QgY2hhbm5lbENvbmZpZyA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdLnJhbmdlXTtcbiAgICBjb25zdCBjaGFubmVsRmllbGQgPSB0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdLmZpZWxkXTtcblxuICAgIGlmIChjaGFubmVsQ29uZmlnLnR5cGUgPT09IGhleENvbG9yKSB7XG4gICAgICBjb25zdCBjb2x1bW5GaWVsZCA9IHtcbiAgICAgICAgaWQ6IGNoYW5uZWxGaWVsZC5jb2xvckNvbHVtbixcbiAgICAgICAgbmFtZTogY2hhbm5lbEZpZWxkLmNvbG9yQ29sdW1uLFxuICAgICAgICBmaWVsZElkeDogY2hhbm5lbEZpZWxkLmNvbG9yQ29sdW1uSWR4LFxuICAgICAgICB2YWx1ZUFjY2Vzc29yOiBkID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0YUNvbnRhaW5lci52YWx1ZUF0KGQuaW5kZXgsIGNoYW5uZWxGaWVsZC5jb2xvckNvbHVtbklkeCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbG9yQ29sdW1uVmFsdWUgPSBnZXRWYWx1ZShjb2x1bW5GaWVsZCwgZGF0YSk7XG4gICAgfSBlbHNlIGlmICghbm90TnVsbG9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGxWYWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXR0cmlidXRlVmFsdWU7XG4gICAgaWYgKHR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXApIHtcbiAgICAgIC8vIHNob3VsZG4ndCBuZWVkIHRvIGNvbnZlcnQgaGVyZVxuICAgICAgLy8gc2NhbGUgRnVuY3Rpb24gc2hvdWxkIHRha2UgY2FyZSBvZiBpdFxuICAgICAgYXR0cmlidXRlVmFsdWUgPSBzY2FsZShuZXcgRGF0ZSh2YWx1ZSksIGNvbG9yQ29sdW1uVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHNjYWxlKHZhbHVlLCBjb2xvckNvbHVtblZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vdE51bGxvclVuZGVmaW5lZChhdHRyaWJ1dGVWYWx1ZSkpIHtcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gbnVsbFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTtcbiAgfVxuXG4gIHVwZGF0ZU1ldGEobWV0YSkge1xuICAgIHRoaXMubWV0YSA9IHsuLi50aGlzLm1ldGEsIC4uLm1ldGF9O1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJMZWdlbmQoc2V0dGluZ3MpIHtcbiAgICB0aGlzLmxlZ2VuZFNldHRpbmdzID0gc2V0dGluZ3M7XG4gIH1cblxuICBnZXREYXRhVXBkYXRlVHJpZ2dlcnMoe2ZpbHRlcmVkSW5kZXgsIGlkLCBhbGxEYXRhfSkge1xuICAgIGNvbnN0IHtjb2x1bW5zfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldERhdGE6IHtkYXRhc2V0SWQ6IGlkLCBhbGxEYXRhLCBjb2x1bW5zLCBmaWx0ZXJlZEluZGV4fSxcbiAgICAgIGdldE1ldGE6IHtkYXRhc2V0SWQ6IGlkLCBhbGxEYXRhLCBjb2x1bW5zfSxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy50ZXh0TGFiZWwgfHwgW10pLnJlZHVjZShcbiAgICAgICAgKGFjY3UsIHRsLCBpKSA9PiAoe1xuICAgICAgICAgIC4uLmFjY3UsXG4gICAgICAgICAgW2BnZXRMYWJlbENoYXJhY3RlclNldC0ke2l9YF06IHRsLmZpZWxkID8gdGwuZmllbGQubmFtZSA6IG51bGxcbiAgICAgICAgfSksXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZURhdGEoZGF0YXNldHMsIG9sZExheWVyRGF0YSkge1xuICAgIGlmICghdGhpcy5jb25maWcuZGF0YUlkKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoZGF0YXNldHMpO1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyfSA9IGRhdGFzZXQ7XG5cbiAgICB0aGlzLnVwZGF0ZVZpc3VhbENoYW5uZWxGaWVsZHMoZGF0YXNldCk7XG4gICAgdGhpcy51cGRhdGVIZXhDb2xvckRvbWFpbihkYXRhc2V0KTtcblxuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuICAgIGNvbnN0IGRhdGFVcGRhdGVUcmlnZ2VycyA9IHRoaXMuZ2V0RGF0YVVwZGF0ZVRyaWdnZXJzKGRhdGFzZXQpO1xuICAgIGNvbnN0IHRyaWdnZXJDaGFuZ2VkID0gdGhpcy5nZXRDaGFuZ2VkVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzKTtcblxuICAgIGlmICh0cmlnZ2VyQ2hhbmdlZC5nZXRNZXRhKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyTWV0YShkYXRhQ29udGFpbmVyLCBnZXRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgbGV0IGRhdGEgPSBbXTtcblxuICAgIGlmICghdHJpZ2dlckNoYW5nZWQuZ2V0RGF0YSAmJiBvbGRMYXllckRhdGEgJiYgb2xkTGF5ZXJEYXRhLmRhdGEpIHtcbiAgICAgIC8vIHNhbWUgZGF0YVxuICAgICAgZGF0YSA9IG9sZExheWVyRGF0YS5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdGhpcy5jYWxjdWxhdGVEYXRhQXR0cmlidXRlKGRhdGFzZXQsIGdldFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2RhdGEsIHRyaWdnZXJDaGFuZ2VkfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgc3R5bGVkIGZpZWxkcyB0byBtYXRjaCBvbmVzIGZyb20gbmV3IGRhdGFzZXQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0XG4gICAqL1xuICB1cGRhdGVWaXN1YWxDaGFubmVsRmllbGRzKGRhdGFzZXQpIHtcbiAgICBmb3IgKGNvbnN0IHtmaWVsZCwgcmFuZ2V9IG9mIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykpIHtcbiAgICAgIGNvbnN0IG9sZEZpZWxkID0gdGhpcy5jb25maWdbZmllbGRdO1xuICAgICAgY29uc3QgaXNVc2luZ0hleENvbG9yQ29kZSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0/LmhleENvbG9yO1xuICAgICAgaWYgKCFvbGRGaWVsZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgbmV3RGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmZCA9PiBmZC5uYW1lID09PSBvbGRGaWVsZC5uYW1lKSB8fCBudWxsO1xuICAgICAgaWYgKGlzVXNpbmdIZXhDb2xvckNvZGUpIHtcbiAgICAgICAgbmV3RGF0YVNldEZpZWxkID0ge1xuICAgICAgICAgIC4uLm5ld0RhdGFTZXRGaWVsZCxcbiAgICAgICAgICBjb2xvckNvbHVtbjogbmV3RGF0YVNldEZpZWxkLmNvbG9yQ29sdW1uIHx8IG9sZEZpZWxkLmNvbG9yQ29sdW1uLFxuICAgICAgICAgIGNvbG9yQ29sdW1uSWR4OiBuZXdEYXRhU2V0RmllbGQuY29sb3JDb2x1bW5JZHggfHwgb2xkRmllbGQuY29sb3JDb2x1bW5JZHhcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tmaWVsZF06IG5ld0RhdGFTZXRGaWVsZH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBoZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIG9uZSBsYXllciBkb21haW4gd2hlbiBzdGF0ZS5kYXRhIGNoYW5nZWRcbiAgICogaWYgc3RhdGUuZGF0YSBjaGFuZ2UgaXMgZHVlIG90IHVwZGF0ZSBmaWx0ZXIsIG5ld0ZpbGVyIHdpbGwgYmUgcGFzc2VkXG4gICAqIGNhbGxlZCBieSB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGFcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdGaWx0ZXJcbiAgICogQHJldHVybnMge29iamVjdH0gbGF5ZXJcbiAgICovXG4gIHVwZGF0ZUxheWVyRG9tYWluKGRhdGFzZXRzLCBuZXdGaWx0ZXIpIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZ2V0RGF0YXNldChkYXRhc2V0cyk7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIGNvbnN0IHtzY2FsZX0gPSBjaGFubmVsO1xuICAgICAgY29uc3Qgc2NhbGVUeXBlID0gdGhpcy5jb25maWdbc2NhbGVdO1xuXG4gICAgICAvLyBvcmRpbmFsIGRvbWFpbiBpcyBiYXNlZCBvbiBkYXRhQ29udGFpbmVyLCBpZiBvbmx5IGZpbHRlciBjaGFuZ2VkXG4gICAgICAvLyBubyBuZWVkIHRvIHVwZGF0ZSBvcmRpbmFsIGRvbWFpblxuICAgICAgaWYgKCFuZXdGaWx0ZXIgfHwgc2NhbGVUeXBlICE9PSBTQ0FMRV9UWVBFUy5vcmRpbmFsKSB7XG4gICAgICAgIGNvbnN0IHtkb21haW59ID0gY2hhbm5lbDtcbiAgICAgICAgY29uc3QgdXBkYXRlZERvbWFpbiA9IHRoaXMuY2FsY3VsYXRlTGF5ZXJEb21haW4odGFibGUsIGNoYW5uZWwpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbZG9tYWluXTogdXBkYXRlZERvbWFpbn0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXREYXRhc2V0KGRhdGFzZXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFJZCA/IGRhdGFzZXRzW3RoaXMuY29uZmlnLmRhdGFJZF0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHZpc3VhbCBjaGFubmVsIGZpZWxkIGFuZCBzY2FsZXMgYmFzZWQgb24gc3VwcG9ydGVkIGZpZWxkICYgc2NhbGUgdHlwZVxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgdmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpIHtcbiAgICB0aGlzLnZhbGlkYXRlRmllbGRUeXBlKGNoYW5uZWwpO1xuICAgIHRoaXMudmFsaWRhdGVTY2FsZShjaGFubmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBmaWVsZCB0eXBlIGJhc2VkIG9uIGNoYW5uZWxTY2FsZVR5cGVcbiAgICovXG4gIHZhbGlkYXRlRmllbGRUeXBlKGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICBjb25zdCB7ZmllbGQsIGNoYW5uZWxTY2FsZVR5cGUsIHN1cHBvcnRlZEZpZWxkVHlwZXN9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgIGlmICh0aGlzLmNvbmZpZ1tmaWVsZF0pIHtcbiAgICAgIC8vIGlmIGZpZWxkIGlzIHNlbGVjdGVkLCBjaGVjayBpZiBmaWVsZCB0eXBlIGlzIHN1cHBvcnRlZFxuICAgICAgY29uc3QgY2hhbm5lbFN1cHBvcnRlZEZpZWxkVHlwZXMgPVxuICAgICAgICBzdXBwb3J0ZWRGaWVsZFR5cGVzIHx8IENIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEU1tjaGFubmVsU2NhbGVUeXBlXTtcblxuICAgICAgaWYgKCFjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcy5pbmNsdWRlcyh0aGlzLmNvbmZpZ1tmaWVsZF0udHlwZSkpIHtcbiAgICAgICAgLy8gZmllbGQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBzZXQgaXQgYmFjayB0byBudWxsXG4gICAgICAgIC8vIHNldCBzY2FsZSBiYWNrIHRvIGRlZmF1bHRcbiAgICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W2ZpZWxkXTogbnVsbH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBzY2FsZSB0eXBlIGJhc2VkIG9uIGFnZ3JlZ2F0aW9uXG4gICAqL1xuICB2YWxpZGF0ZVNjYWxlKGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICBjb25zdCB7c2NhbGUsIHJhbmdlfSA9IHZpc3VhbENoYW5uZWw7XG4gICAgaWYgKFxuICAgICAgIXNjYWxlIHx8XG4gICAgICAodGhpcy5pc0NvbG9yZWRCeUNvbG9yQ29sdW1uKHJhbmdlKSAmJiB0aGlzLmNvbmZpZ1tzY2FsZV0gPT09IFNDQUxFX1RZUEVTLmlkZW50aXR5KVxuICAgICkge1xuICAgICAgLy8gdmlzdWFsQ2hhbm5lbCBkb2Vzbid0IGhhdmUgc2NhbGVcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGVPcHRpb25zID0gdGhpcy5nZXRTY2FsZU9wdGlvbnMoY2hhbm5lbCk7XG4gICAgLy8gY2hlY2sgaWYgY3VycmVudCBzZWxlY3RlZCBzY2FsZSBpc1xuICAgIC8vIHN1cHBvcnRlZCwgaWYgbm90LCBjaGFuZ2UgdG8gZGVmYXVsdFxuICAgIGlmICghc2NhbGVPcHRpb25zLmluY2x1ZGVzKHRoaXMuY29uZmlnW3NjYWxlXSkpIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tzY2FsZV06IHNjYWxlT3B0aW9uc1swXX0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2NhbGUgb3B0aW9ucyBiYXNlZCBvbiBjdXJyZW50IGZpZWxkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGdldFNjYWxlT3B0aW9ucyhjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgY29uc3Qge2ZpZWxkLCBzY2FsZSwgY2hhbm5lbFNjYWxlVHlwZX0gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnW2ZpZWxkXVxuICAgICAgPyBGSUVMRF9PUFRTW3RoaXMuY29uZmlnW2ZpZWxkXS50eXBlXS5zY2FsZVtjaGFubmVsU2NhbGVUeXBlXVxuICAgICAgOiBbdGhpcy5nZXREZWZhdWx0TGF5ZXJDb25maWcoKVtzY2FsZV1dO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsKGRhdGFzZXQsIGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICB0aGlzLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChjaGFubmVsKTtcbiAgICAvLyBjYWxjdWxhdGUgbGF5ZXIgY2hhbm5lbCBkb21haW5cbiAgICBjb25zdCB1cGRhdGVkRG9tYWluID0gdGhpcy5jYWxjdWxhdGVMYXllckRvbWFpbihkYXRhc2V0LCB2aXN1YWxDaGFubmVsKTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbdmlzdWFsQ2hhbm5lbC5kb21haW5dOiB1cGRhdGVkRG9tYWlufSk7XG4gIH1cblxuICBnZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMoKSB7XG4gICAgY29uc3QgdXBkYXRlVHJpZ2dlcnMgPSB7fTtcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2godmlzdWFsQ2hhbm5lbCA9PiB7XG4gICAgICAvLyBmaWVsZCByYW5nZSBzY2FsZSBkb21haW5cbiAgICAgIGNvbnN0IHthY2Nlc3NvciwgZmllbGQsIHNjYWxlLCBkb21haW4sIHJhbmdlLCBkZWZhdWx0VmFsdWUsIGZpeGVkfSA9IHZpc3VhbENoYW5uZWw7XG5cbiAgICAgIHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXSA9IHtcbiAgICAgICAgW2ZpZWxkXTogdGhpcy5jb25maWdbZmllbGRdLFxuICAgICAgICBbc2NhbGVdOiB0aGlzLmNvbmZpZ1tzY2FsZV0sXG4gICAgICAgIFtkb21haW5dOiB0aGlzLmNvbmZpZ1tkb21haW5dLFxuICAgICAgICBbcmFuZ2VdOiB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0VmFsdWUodGhpcy5jb25maWcpIDogZGVmYXVsdFZhbHVlLFxuICAgICAgICAuLi4oZml4ZWQgPyB7W2ZpeGVkXTogdGhpcy5jb25maWcudmlzQ29uZmlnW2ZpeGVkXX0gOiB7fSlcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHVwZGF0ZVRyaWdnZXJzO1xuICB9XG5cbiAgY2FsY3VsYXRlTGF5ZXJEb21haW4oZGF0YXNldCwgdmlzdWFsQ2hhbm5lbCkge1xuICAgIGNvbnN0IHtzY2FsZX0gPSB2aXN1YWxDaGFubmVsO1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdbdmlzdWFsQ2hhbm5lbC5maWVsZF07XG4gICAgaWYgKCFmaWVsZCB8fCAhc2NhbGUpIHtcbiAgICAgIC8vIGlmIGNvbG9yRmllbGQgb3Igc2l6ZUZpZWxkIHdlcmUgc2V0IGJhY2sgdG8gbnVsbFxuICAgICAgcmV0dXJuIGRlZmF1bHREb21haW47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NhbGVUeXBlID0gdGhpcy5jb25maWdbc2NhbGVdO1xuICAgIGNvbnN0IGRhdGFTZXRGaWVsZCA9IGRhdGFzZXQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgIGlmICghc2NhbGVUeXBlIHx8ICFkYXRhU2V0RmllbGQpIHtcbiAgICAgIC8vIGlmIG5ldyBkYXRhc2V0IGRvZXNuJ3QgY29udGFpbiBwcmV2aW91c2x5IHNldCBmaWVsZFxuICAgICAgcmV0dXJuIGRlZmF1bHREb21haW47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFzZXQuZ2V0Q29sdW1uTGF5ZXJEb21haW4oZGF0YVNldEZpZWxkLCBzY2FsZVR5cGUpIHx8IGRlZmF1bHREb21haW47XG4gIH1cblxuICB1cGRhdGVIZXhDb2xvckRvbWFpbihkYXRhc2V0KSB7XG4gICAgaWYgKCFkYXRhc2V0KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3QgY2hhbm5lbENvbmZpZyA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tjaGFubmVsLnJhbmdlXTtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdbY2hhbm5lbC5maWVsZF07XG5cbiAgICAgIGlmIChjaGFubmVsQ29uZmlnPy50eXBlID09PSBoZXhDb2xvciAmJiBmaWVsZD8uY29sb3JDb2x1bW4pIHtcbiAgICAgICAgY29uc3QgZGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQuY29sb3JDb2x1bW4pO1xuICAgICAgICBjb25zdCBjb2xvcnMgPSBkYXRhc2V0XG4gICAgICAgICAgLmdldENvbHVtbkxheWVyRG9tYWluKGRhdGFTZXRGaWVsZCwgU0NBTEVfVFlQRVMub3JkaW5hbClcbiAgICAgICAgICAubWFwKGMgPT4gY2hlY2tDb2xvck9yRmFsbGJhY2soYykpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzQ29uZmlnKHtcbiAgICAgICAgICBbY2hhbm5lbC5yYW5nZV06IHsuLi5jaGFubmVsQ29uZmlnLCBjb2xvcnN9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjYWxjdWxhdGVIZXhDb2x1bW5MZWdlbmQoZGF0YXNldHMpIHtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KGRhdGFzZXRzKTtcbiAgICBpZiAoIWRhdGFzZXRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGVnZW5kU2V0dGluZ3MgPSBPYmplY3Qua2V5cyh0aGlzLnZpc3VhbENoYW5uZWxzKS5yZWR1Y2UoKGxlZ2VuZHMsIGNoYW5uZWwpID0+IHtcbiAgICAgIGNvbnN0IHtyYW5nZSwgZmllbGQ6IGNoYW5uZWxGaWVsZH0gPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgICAgY29uc3QgY2hhbm5lbENvbmZpZyA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV07XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnW2NoYW5uZWxGaWVsZF07XG5cbiAgICAgIGlmIChjaGFubmVsQ29uZmlnPy50eXBlID09PSBoZXhDb2xvciAmJiBmaWVsZD8uY29sb3JDb2x1bW4pIHtcbiAgICAgICAgY29uc3QgZGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQuY29sb3JDb2x1bW4pO1xuICAgICAgICBjb25zdCBsZWdlbmQgPSBkYXRhc2V0LmNhbGN1bGF0ZUxlZ2VuZChmaWVsZCwgZGF0YVNldEZpZWxkKTtcbiAgICAgICAgbGVnZW5kc1tjaGFubmVsXSA9IGxlZ2VuZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZWdlbmRzO1xuICAgIH0sIHt9KTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyTGVnZW5kKGxlZ2VuZFNldHRpbmdzKTtcbiAgfVxuXG4gIGhhc0hvdmVyZWRPYmplY3Qob2JqZWN0SW5mbykge1xuICAgIHJldHVybiB0aGlzLmlzTGF5ZXJIb3ZlcmVkKG9iamVjdEluZm8pICYmIG9iamVjdEluZm8ub2JqZWN0ID8gb2JqZWN0SW5mby5vYmplY3QgOiBudWxsO1xuICB9XG5cbiAgaXNMYXllckhvdmVyZWQob2JqZWN0SW5mbykge1xuICAgIHJldHVybiBvYmplY3RJbmZvPy5waWNrZWQgJiYgb2JqZWN0SW5mbz8ubGF5ZXI/LnByb3BzPy5pZCA9PT0gdGhpcy5pZDtcbiAgfVxuXG4gIGdldFJhZGl1c1NjYWxlQnlab29tKG1hcFN0YXRlKSB7XG4gICAgY29uc3QgcmFkaXVzQ2hhbm5lbCA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YyA9PiB2Yy5wcm9wZXJ0eSA9PT0gJ3JhZGl1cycpO1xuXG4gICAgaWYgKCFyYWRpdXNDaGFubmVsKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHJhZGl1c0NoYW5uZWwuZmllbGQ7XG4gICAgY29uc3Qge3JhZGl1c30gPSB0aGlzLmNvbmZpZy52aXNDb25maWc7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZ1tmaWVsZF0gPyAxIDogcmFkaXVzKSAqIHRoaXMuZ2V0Wm9vbUZhY3RvcihtYXBTdGF0ZSk7XG4gIH1cblxuICBnZXRSYWRpdXNTY2FsZSgpIHtcbiAgICBjb25zdCByYWRpdXNDaGFubmVsID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5maW5kKHZjID0+IHZjLnByb3BlcnR5ID09PSAncmFkaXVzJyk7XG5cbiAgICBpZiAoIXJhZGl1c0NoYW5uZWwgfHwgdGhpcy5jb25maWdbcmFkaXVzQ2hhbm5lbC5maWVsZF0pIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbmZpZy52aXNDb25maWcucmFkaXVzO1xuICB9XG5cbiAgZ2V0TWF4TWFya2VyU2l6ZSgpIHtcbiAgICBjb25zdCB7cmFkaXVzRmllbGQsIHNpemVGaWVsZCwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHtyYWRpdXNSYW5nZSwgcmFkaXVzfSA9IHZpc0NvbmZpZztcbiAgICBjb25zdCBmaWVsZCA9IHJhZGl1c0ZpZWxkIHx8IHNpemVGaWVsZDtcbiAgICByZXR1cm4gTWF0aC5jZWlsKChmaWVsZCAmJiByYWRpdXNSYW5nZSA/IHJhZGl1c1JhbmdlWzFdIDogcmFkaXVzKSk7XG4gIH1cblxuICBzaG91bGRDYWxjdWxhdGVMYXllckRhdGEocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMuc29tZShwID0+ICF0aGlzLm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcy5pbmNsdWRlcyhwKSk7XG4gIH1cblxuICBnZXRCcnVzaGluZ0V4dGVuc2lvblByb3BzKGludGVyYWN0aW9uQ29uZmlnLCBicnVzaGluZ1RhcmdldCkge1xuICAgIGNvbnN0IHticnVzaH0gPSBpbnRlcmFjdGlvbkNvbmZpZztcblxuICAgIHJldHVybiB7XG4gICAgICAvLyBicnVzaGluZ1xuICAgICAgYXV0b0hpZ2hsaWdodDogIWJydXNoLmVuYWJsZWQsXG4gICAgICBicnVzaGluZ1JhZGl1czogYnJ1c2guY29uZmlnLnNpemUgKiAxMDAwLFxuICAgICAgYnJ1c2hpbmdUYXJnZXQ6IGJydXNoaW5nVGFyZ2V0IHx8ICdzb3VyY2UnLFxuICAgICAgYnJ1c2hpbmdFbmFibGVkOiBicnVzaC5lbmFibGVkXG4gICAgfTtcbiAgfVxuXG4gIGdldERlZmF1bHREZWNrTGF5ZXJQcm9wcyh7aWR4LCBncHVGaWx0ZXIsIG1hcFN0YXRlLCB2aXNpYmxlLCBtYXNrUG9seWdvbn0pIHtcbiAgICBjb25zdCBtYXNrRXh0ZW5zaW9uUHJvcHMgPSBnZXRNYXNrRXh0ZW5zaW9uUHJvcHMobWFza1BvbHlnb24pO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5tYXNrRXh0ZW5zaW9uUHJvcHMsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGlkeCxcbiAgICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkxOR0xBVCxcbiAgICAgIHBpY2thYmxlOiB0aGlzLmhhc0ludGVyYWN0aXZpdHksXG4gICAgICB3cmFwTG9uZ2l0dWRlOiB0cnVlLFxuICAgICAgcGFyYW1ldGVyczoge2RlcHRoVGVzdDogQm9vbGVhbihtYXBTdGF0ZS5kcmFnUm90YXRlIHx8IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5lbmFibGUzZCl9LFxuICAgICAgaGlkZGVuOiB0aGlzLmNvbmZpZy5oaWRkZW4sXG4gICAgICB2aXNpYmlsaXR5Qnlab29tOiB0aGlzLmNvbmZpZy52aXNpYmlsaXR5Qnlab29tLFxuICAgICAgLy8gdmlzY29uZmlnXG4gICAgICBvcGFjaXR5OiB0aGlzLmNvbmZpZy52aXNDb25maWcub3BhY2l0eSxcbiAgICAgIGhpZ2hsaWdodENvbG9yOiB0aGlzLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICAgIC8vIGRhdGEgZmlsdGVyaW5nXG4gICAgICBleHRlbnNpb25zOiBbZGF0YUZpbHRlckV4dGVuc2lvbiwgLi4ubWFza0V4dGVuc2lvblByb3BzLmV4dGVuc2lvbnNdLFxuICAgICAgZmlsdGVyUmFuZ2U6IGdwdUZpbHRlciA/IGdwdUZpbHRlci5maWx0ZXJSYW5nZSA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIGxheWVyIHNob3VsZCBiZSB2aXNpYmxlIGFuZCBpZiBzcGxpdE1hcCwgc2hvd24gaW4gdG8gb25lIG9mIHBhbmVsXG4gICAgICB2aXNpYmxlOiB0aGlzLmNvbmZpZy5pc1Zpc2libGUgJiYgdmlzaWJsZVxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0SG92ZXJMYXllclByb3BzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogYCR7dGhpcy5pZH0taG92ZXJlZGAsXG4gICAgICBwaWNrYWJsZTogZmFsc2UsXG4gICAgICB3cmFwTG9uZ2l0dWRlOiB0cnVlLFxuICAgICAgY29vcmRpbmF0ZVN5c3RlbTogQ09PUkRJTkFURV9TWVNURU0uTE5HTEFUXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlclRleHRMYWJlbExheWVyKFxuICAgIHtnZXRQb3NpdGlvbiwgZ2V0UmFkaXVzLCByYWRpdXNTY2FsZSwgdXBkYXRlVHJpZ2dlcnMsIHNoYXJlZFByb3BzfSxcbiAgICByZW5kZXJPcHRzXG4gICkge1xuICAgIGNvbnN0IHtkYXRhfSA9IHJlbmRlck9wdHM7XG4gICAgY29uc3Qge3RleHRMYWJlbCwgdmlzaWJpbGl0eUJ5Wm9vbX0gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBleHRlbnNpb25zID0gWy4uLnNoYXJlZFByb3BzLmV4dGVuc2lvbnMsIGNvbGxpc2lvbkZpbHRlckV4dGVuc2lvbl07XG5cbiAgICBpZiAoIWRhdGEgfHwgIWRhdGEudGV4dExhYmVscyB8fCAhZGF0YS50ZXh0TGFiZWxzWzBdIHx8ICFkYXRhLnRleHRMYWJlbHNbMF0uZ2V0VGV4dCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IFttYWluTGFiZWwsIHNlY29uZGFyeUxhYmVsXSA9IHRleHRMYWJlbDtcbiAgICBjb25zdCB7XG4gICAgICBhbGlnbm1lbnQsXG4gICAgICBhbmNob3IsXG4gICAgICBjb2xvcjogZ2V0Q29sb3IsXG4gICAgICBmaWVsZDogbWFpbkZpZWxkLFxuICAgICAgb3V0bGluZUNvbG9yLFxuICAgICAgc2l6ZTogc2l6ZVNjYWxlXG4gICAgfSA9IG1haW5MYWJlbDtcbiAgICBjb25zdCB7XG4gICAgICBjb2xvcjogZ2V0U2Vjb25kYXJ5Q29sb3IsXG4gICAgICBmaWVsZDogc2Vjb25kYXJ5RmllbGQsXG4gICAgICBvdXRsaW5lQ29sb3I6IHNlY29uZGFyeU91dGxpbmVDb2xvcixcbiAgICAgIHNpemU6IHNlY29uZGFyeVNpemVTY2FsZVxuICAgIH0gPSBzZWNvbmRhcnlMYWJlbCB8fCB7fTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgUG9pbnRMYWJlbExheWVyKHtcbiAgICAgICAgLi4uc2hhcmVkUHJvcHMsXG5cbiAgICAgICAgLy8gUmVjcmVhdGUgbGF5ZXIgd2hlbiBsYWJlbHMgY2hhbmdlIG90aGVyd2lzZSByZW5kZXJpbmcgYnJlYWtzXG4gICAgICAgIC8vIFRPRE8gY291bGQgYmUgbW9yZSBlZmZpY2llbnQgd2l0aCB1cGRhdGVUcmlnZ2Vycz9cbiAgICAgICAgaWQ6IGAke3RoaXMuaWR9LSR7bWFpbkZpZWxkPy5uYW1lfS0ke3NlY29uZGFyeUZpZWxkPy5uYW1lfS1sYWJlbGAsXG4gICAgICAgIGRhdGE6IGRhdGEuZGF0YSxcbiAgICAgICAgdmlzaWJpbGl0eUJ5Wm9vbSxcbiAgICAgICAgZXh0ZW5zaW9ucyxcblxuICAgICAgICBjaGFyYWN0ZXJTZXQ6ICdhdXRvJyxcbiAgICAgICAgY29sbGlzaW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY29sbGlzaW9uR3JvdXA6IGAke3RoaXMuaWR9LWxhYmVsc2AsXG5cbiAgICAgICAgZ2V0VGV4dDogZGF0YS50ZXh0TGFiZWxzWzBdLmdldFRleHQsXG4gICAgICAgIGdldENvbG9yLFxuICAgICAgICBzaXplU2NhbGUsXG4gICAgICAgIG91dGxpbmVDb2xvcixcblxuICAgICAgICAuLi4oc2Vjb25kYXJ5RmllbGQgJiYge1xuICAgICAgICAgIGdldFNlY29uZGFyeVRleHQ6IGRhdGEudGV4dExhYmVsc1sxXS5nZXRUZXh0LFxuICAgICAgICAgIGdldFNlY29uZGFyeUNvbG9yLFxuICAgICAgICAgIHNlY29uZGFyeVNpemVTY2FsZSxcbiAgICAgICAgICBzZWNvbmRhcnlPdXRsaW5lQ29sb3JcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gUG9zaXRpb25cbiAgICAgICAgZ2V0UG9zaXRpb24sXG4gICAgICAgIGdldFJhZGl1cyxcbiAgICAgICAgcmFkaXVzU2NhbGUsXG4gICAgICAgIGdldFRleHRBbmNob3I6IGFuY2hvcixcbiAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6IGFsaWdubWVudCxcblxuICAgICAgICAvLyBTdHlsZVxuICAgICAgICBmb250RmFtaWx5OiAnSW50ZXIsIHNhbnMnLFxuICAgICAgICBmb250U2V0dGluZ3M6IHtzZGY6IHRydWV9LFxuICAgICAgICBmb250V2VpZ2h0OiA1MDAsXG4gICAgICAgIG91dGxpbmVXaWR0aDogNCxcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIC8vIHRleHQgd2lsbCBhbHdheXMgc2hvdyBvbiB0b3Agb2YgYWxsIGxheWVyc1xuICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogZGF0YS5nZXRGaWx0ZXJWYWx1ZSxcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICAuLi51cGRhdGVUcmlnZ2VycyxcbiAgICAgICAgICBnZXRUZXh0OiBtYWluRmllbGQ/Lm5hbWUsXG4gICAgICAgICAgZ2V0Q29sb3I6IG1haW5GaWVsZD8uY29sb3IsXG4gICAgICAgICAgZ2V0VGV4dEFuY2hvcjogbWFpbkxhYmVsLmFuY2hvcixcbiAgICAgICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogbWFpbkxhYmVsLmFsaWdubWVudCxcbiAgICAgICAgICBnZXRTZWNvbmRhcnlUZXh0OiBzZWNvbmRhcnlGaWVsZD8ubmFtZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGRlY2suZ2wgYEljb25MYXllcmAgXCJhdXRvUGFja1wiIG1vZGUgYWNjZXNzb3IgZm9yIGN1c3RvbSBtYXJrZXJzLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGljb25VcmxBY2Nlc3NvciBkZWNrLmdsIGFjY2Vzc29yIChvciB2YWx1ZSkgdGhhdCByZXNvbHZlcyB0byBVUkwgb2YgaWNvbiBmb3IgZ2l2ZW4gcm93XG4gICAqIEByZXR1cm5zIGRlY2suZ2wgYWNjZXNzb3IgdGhhdCByZXR1cm5zIFVucGFja2VkSWNvbiByZWFkeSB0byBjb25zdW1lIGJ5IEljb25MYXllclxuICAgKi9cbiAgZ2V0Q3VzdG9tTWFya2VySWNvbkFjY2Vzc29yKGljb25VcmxBY2Nlc3NvciwgbWFzayA9IHRydWUpIHtcbiAgICBjb25zdCBtYXhJY29uU2l6ZSA9IHRoaXMuZ2V0TWF4TWFya2VyU2l6ZSgpO1xuXG4gICAgcmV0dXJuIGQgPT4ge1xuICAgICAgY29uc3Qgd2FudGVkVXJsID1cbiAgICAgICAgKHR5cGVvZiBpY29uVXJsQWNjZXNzb3IgPT09ICdmdW5jdGlvbicpID8gaWNvblVybEFjY2Vzc29yKGQpIDogaWNvblVybEFjY2Vzc29yO1xuICAgICAgY29uc3QgaWNvbk9rID0gQm9vbGVhbih3YW50ZWRVcmwpO1xuICAgICAgbWFzayA9IGljb25PayA/IG1hc2sgOiB0cnVlO1xuICAgICAgY29uc3QgdXJsID0gaWNvbk9rID8gd2FudGVkVXJsIDogRkFMTEJBQ0tfSUNPTjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBgJHt1cmx9QEAke21heEljb25TaXplfUAke21hc2sgPyAnbScgOiAnYyd9YCxcbiAgICAgICAgdXJsLFxuICAgICAgICB3aWR0aDogbWF4SWNvblNpemUsXG4gICAgICAgIGhlaWdodDogbWF4SWNvblNpemUsXG4gICAgICAgIG1hc2tcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUoa2VwbGVyVGFibGUsIGdldFBvc2l0aW9uKSB7XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyTWV0YShkYXRhQ29udGFpbmVyLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcbiAgfVxuXG4gIGdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcikge1xuICAgIC8vIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcbiAgICByZXR1cm4gKCkgPT4gbnVsbDtcbiAgfVxuXG4gIGdldEhleENvbHVtbihyYW5nZSkge1xuICAgIGNvbnN0IGZpZWxkID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKT8uZmluZCh2YWx1ZSA9PiB2YWx1ZS5yYW5nZSA9PT0gcmFuZ2UpPy5maWVsZDtcbiAgICBpZiAoZmllbGQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1tmaWVsZF0/LmNvbG9yQ29sdW1uO1xuICAgIH1cbiAgfVxuXG4gIGlzQ29sb3JlZEJ5Q29sb3JDb2x1bW4ocmFuZ2UpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXT8uaGV4Q29sb3I7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXI7XG4iXX0=
1686
+ var _default = exports["default"] = Layer;
1687
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwicmVxdWlyZSIsIl9rZXltaXJyb3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2V4dGVuc2lvbnMiLCJfY29yZSIsIl9jYXJ0byIsIl9kZWZhdWx0TGF5ZXJJY29uIiwiX2xheWVyVXBkYXRlIiwiX2QzQ29sb3IiLCJfZGVmYXVsdFNldHRpbmdzIiwiX2NvbG9yUmFuZ2VzIiwiX2N1c3RvbUNvbG9yUmFuZ2VzIiwiX2xheWVyRmFjdG9yeSIsIl91dGlscyIsIl9kYXRhVXRpbHMiLCJfZGF0YUNvbnRhaW5lclV0aWxzIiwiX2NvbG9yVXRpbHMiLCJfbGF5ZXJVdGlscyIsIl9kM1NjYWxlIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJvIiwiYWxsb3dBcnJheUxpa2UiLCJpdCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiaSIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImUiLCJfZSIsImYiLCJUeXBlRXJyb3IiLCJub3JtYWxDb21wbGV0aW9uIiwiZGlkRXJyIiwiZXJyIiwiY2FsbCIsInN0ZXAiLCJuZXh0IiwiX2UyIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJhcnIiLCJsZW4iLCJhcnIyIiwib3duS2V5cyIsInIiLCJ0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX21hcmtlZCIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJnZW5lcmF0ZUNvbG9yIiwiTEFZRVJfSURfTEVOR1RIIiwiZXhwb3J0cyIsIkZBTExCQUNLX0lDT04iLCJNQVhfU0FNUExFX1NJWkUiLCJkZWZhdWx0RG9tYWluIiwiZGF0YUZpbHRlckV4dGVuc2lvbiIsIkRhdGFGaWx0ZXJFeHRlbnNpb24iLCJmaWx0ZXJTaXplIiwiTUFYX0dQVV9GSUxURVJTIiwiY29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uIiwiQ29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uIiwiZGVmYXVsdERhdGFBY2Nlc3NvciIsImRjIiwiZCIsImRlZmF1bHRHZXRGaWVsZFZhbHVlIiwiZmllbGQiLCJ2YWx1ZUFjY2Vzc29yIiwic2NhbGVJZGVudGl0eSIsInYiLCJPVkVSTEFZX1RZUEUiLCJrZXltaXJyb3IiLCJkZWNrZ2wiLCJtYXBib3hnbCIsImxheWVyQ29sb3JzIiwidmFsdWVzIiwiRGF0YVZpekNvbG9ycyIsIm1hcCIsImhleFRvUmdiIiwiaW5kZXgiLCJ3cmFwIiwiZ2VuZXJhdGVDb2xvciQiLCJfY29udGV4dCIsInByZXYiLCJzdG9wIiwiY29sb3JNYWtlciIsIkxheWVyIiwicHJvcHMiLCJ1bmRlZmluZWQiLCJfY2xhc3NDYWxsQ2hlY2syIiwiaWQiLCJnZW5lcmF0ZUhhc2hJZCIsIm1ldGEiLCJsZWdlbmRTZXR0aW5ncyIsInZpc0NvbmZpZ1NldHRpbmdzIiwiX2ludGVyYWN0aXZpdHlTZXR0aW5ncyIsImNvbmZpZyIsImdldERlZmF1bHRMYXllckNvbmZpZyIsImNvbHVtbnMiLCJnZXRMYXllckNvbHVtbnMiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiZ2V0IiwiRGVmYXVsdExheWVySWNvbiIsInR5cGUiLCJjb2xvciIsInByb3BlcnR5Iiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsIm51bGxWYWx1ZSIsIk5PX1ZBTFVFX0NPTE9SIiwiZGVmYXVsdFZhbHVlIiwic2l6ZSIsImxhdCIsInBhaXIiLCJmaWVsZFBhaXJLZXkiLCJsbmciLCJsYXQwIiwibG5nMCIsImxhdDEiLCJsbmcxIiwic2V0IiwiaW50ZXJhY3Rpdml0eVNldHRpbmdzIiwiX3RoaXMkaW50ZXJhY3Rpdml0eVNlIiwiX3RoaXMkaW50ZXJhY3Rpdml0eVNlMiIsIl90aGlzJGludGVyYWN0aXZpdHlTZTMiLCJfdGhpcyRpbnRlcmFjdGl2aXR5U2U0IiwiQm9vbGVhbiIsImhvdmVyIiwiZmllbGRzIiwiY2xpY2siLCJfdGhpcyRpbnRlcmFjdGl2aXR5U2U1IiwiaGFzVG9vbHRpcCIsImVuYWJsZWQiLCJfcHJvcHMkdmlzaWJpbGl0eUJ5Wm8iLCJfcHJvcHMkdmlzaWJpbGl0eUJ5Wm8yIiwiZGF0YUlkIiwidmlzaWJpbGl0eUJ5Wm9vbSIsIm1pbiIsIlpPT01fTEVWRUxfTElNSVRTIiwibWF4IiwibGFiZWwiLCJERUZBVUxUX0xBWUVSX0xBQkVMIiwiaXNWaXNpYmxlIiwiaXNDb25maWdBY3RpdmUiLCJoaWdobGlnaHRDb2xvciIsIkRFRkFVTFRfSElHSExJR0hUX0NPTE9SIiwiaGlkZGVuIiwiY29sb3JGaWVsZCIsImNvbG9yRG9tYWluIiwiY29sb3JTY2FsZSIsIlNDQUxFX1RZUEVTIiwicXVhbnRpbGUiLCJzaXplRG9tYWluIiwic2l6ZVNjYWxlIiwibGluZWFyIiwic2l6ZUZpZWxkIiwicmFkaXVzRmllbGQiLCJ2aXNDb25maWciLCJ0ZXh0TGFiZWwiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJjb2xvclVJIiwiREVGQVVMVF9DT0xPUl9VSSIsImNvbG9yUmFuZ2UiLCJhbmltYXRpb24iLCJnZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24iLCJ2aXN1YWxDaGFubmVscyIsIm1lYXN1cmUiLCJkaXNwbGF5TmFtZSIsImRlZmF1bHRNZWFzdXJlIiwiYXNzaWduQ29sdW1uIiwidXBkYXRlIiwiZmllbGRJZHgiLCJhc3NpZ25Db2x1bW5QYWlycyIsIl90aGlzJGNvbHVtblBhaXJzIiwiX3RoaXMkY29sdW1uUGFpcnMyIiwiX3RoaXMkY29sdW1uUGFpcnMzIiwiY29sdW1uUGFpcnMiLCJfdGhpcyRjb2x1bW5QYWlycyRrZXkiLCJwYXJ0bmVyS2V5IiwiX3RoaXMkY29sdW1uUGFpcnMkcGFyIiwicGFydG5lckZpZWxkUGFpcktleSIsImdldFpvb21GYWN0b3IiLCJfcmVmIiwiem9vbSIsIl9yZWYkem9vbU9mZnNldCIsInpvb21PZmZzZXQiLCJNYXRoIiwicG93IiwiZ2V0RWxldmF0aW9uWm9vbUZhY3RvciIsIl9yZWYyIiwiX3JlZjIkem9vbU9mZnNldCIsImVuYWJsZUVsZXZhdGlvblpvb21GYWN0b3IiLCJmb3JtYXRMYXllckRhdGEiLCJkYXRhc2V0cyIsImZpbHRlcmVkSW5kZXgiLCJyZW5kZXJMYXllciIsImdldEhvdmVyRGF0YSIsIm9iamVjdCIsImRhdGFDb250YWluZXIiLCJyb3ciLCJhc3NpZ25Db25maWdUb0xheWVyIiwiY29uZmlnVG9Db3B5IiwiX3RoaXMiLCJzaGFsbG93Q29weSIsImNvbmNhdCIsIm5vdFRvQ29weSIsImdyb3VwIiwiY3VycmVudENvbmZpZyIsImNvcGllZCIsImNvcHlMYXllckNvbmZpZyIsInVwZGF0ZUxheWVyQ29uZmlnIiwiY2hhbm5lbCIsInZhbGlkYXRlVmlzdWFsQ2hhbm5lbCIsIl90aGlzMiIsIl9yZWYzIiwiX3JlZjMkc2hhbGxvd0NvcHkiLCJfcmVmMyRub3RUb0NvcHkiLCJpc1BsYWluT2JqZWN0IiwiaW5jbHVkZXMiLCJub3ROdWxsb3JVbmRlZmluZWQiLCJyZWdpc3RlclZpc0NvbmZpZyIsImxheWVyVmlzQ29uZmlncyIsIl90aGlzMyIsIml0ZW0iLCJMQVlFUl9WSVNfQ09ORklHUyIsImV2ZXJ5IiwicCIsImhhc093blByb3BlcnR5IiwiY29sdW1uVmFsaWRhdG9ycyIsInJlcXVpcmVkIiwicmVxdWlyZWRMYXllckNvbHVtbnMiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdG9yIiwib3B0aW9uYWwiLCJvcHRpb25hbENvbHVtbnMiLCJuZXdDb25maWciLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsIm5ld1Zpc0NvbmZpZyIsInVwZGF0ZUxheWVyQ29sb3JVSSIsInByb3AiLCJfdGhpcyRjb25maWciLCJwcmV2aW91cyIsImNvbG9yVUlQcm9wIiwiZW50cmllcyIsIl9yZWY0IiwiX3JlZjUiLCJfc2xpY2VkVG9BcnJheTIiLCJpc0NvbG9yUmFuZ2UiLCJjb2xvcnMiLCJoZXhDb2xvciIsInVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UiLCJ1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJIiwidXBkYXRlQ3VzdG9tUGFsZXR0ZSIsImNvbG9yUmFuZ2VDb25maWciLCJjdXN0b20iLCJfdGhpcyRjb25maWcyIiwiY3VzdG9tUGFsZXR0ZSIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJfdmlzQ29uZmlnJHByb3AkY29sb3IiLCJzaG93RHJvcGRvd24iLCJfdGhpcyRjb25maWczIiwic3RlcHMiLCJyZXZlcnNlZCIsImhleENvbHVtbiIsImdldEhleENvbHVtbiIsImlzSGV4Q29sdW1uIiwiaXNDb2xvcmVkQnlDb2xvckNvbHVtbiIsInNob3VsZFVwZGF0ZSIsInNvbWUiLCJfdGhpcyRjb25maWc0IiwiX2NvbG9yVUkkcHJvcCRjb2xvclJhIiwiZ2V0Q29sb3JHcm91cEJ5TmFtZSIsInNhbWVHcm91cCIsIkNPTE9SX1JBTkdFUyIsImNyIiwiZmluZCIsInJldmVyc2VDb2xvclJhbmdlIiwiY29sb3JNYXAiLCJ1cGRhdGVDb2xvck1hcCIsIl90aGlzJGNvbmZpZyRmaWVsZCIsIl9PYmplY3QkdmFsdWVzJGZpbmQiLCJ1cGRhdGVDYXRlZ29yeUNvbG9yTWFwIiwidXBkYXRlTnVtZXJpY0NvbG9yTWFwIiwiYXNzaWduZWRDYXRlZ29yaWVzIiwibmV3Q29sb3JNYXAiLCJjTWFwIiwidW5hc3NpZ25lZENvbG9ycyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiY2F0ZWdvcnkiLCJjb2xvck1hcFZhbHVlcyIsImMiLCJtYXhWYWx1ZSIsInByZXZWYWx1ZSIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfc3RlcDIkdmFsdWUiLCJoYXNBbGxDb2x1bW5zIiwiaGFzTGF5ZXJEYXRhIiwibGF5ZXJEYXRhIiwiZGF0YSIsImlzVmFsaWRUb1NhdmUiLCJzaG91bGRSZW5kZXJMYXllciIsImdldENvbG9yU2NhbGUiLCJfIiwiX3JnYiIsInJnYiIsImciLCJiIiwiaXNOYU4iLCJVTktOT1dOX0NPTE9SIiwiTWFwIiwiX3JlZjYiLCJfcmVmNyIsImsiLCJTQ0FMRV9GVU5DIiwidW5rbm93biIsImdldFZpc0NoYW5uZWxTY2FsZSIsImdldEN1c3RvbU1hcmtlcnNTY2FsZSIsImZhbGxiYWNrSWNvbiIsInVua25vd25WYWx1ZSIsIm1hcHBpbmciLCJvdGhlcnNNYXJrZXIiLCJfaXRlcmF0b3IzIiwibWFya2VyTWFwIiwiX3N0ZXAzIiwiX3N0ZXAzJHZhbHVlIiwibWFya2VyVXJsIiwic2NhbGVPcmRpbmFsIiwiZ2V0QXR0cmlidXRlQWNjZXNzb3JzIiwiX3JlZjgiLCJfdGhpczQiLCJfcmVmOCRkYXRhQWNjZXNzb3IiLCJkYXRhQWNjZXNzb3IiLCJhdHRyaWJ1dGVBY2Nlc3NvcnMiLCJfdGhpczQkdmlzdWFsQ2hhbm5lbHMiLCJmaXhlZCIsImFjY2Vzc29yIiwiZ2V0QXR0cmlidXRlVmFsdWUiLCJhZ2dyZWdhdGlvbiIsInNob3VsZEdldFNjYWxlIiwiaWRlbnRpdHkiLCJhcmdzIiwiaXNGaXhlZCIsImZpZWxkQ29uZmlnIiwiYWdncmVnYXRpb25WYWx1ZSIsInNjYWxlRnVuY3Rpb24iLCJjdXN0b21NYXJrZXIiLCJjdXN0b21NYXJrZXJzVXJsIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsIl9hZ2dyZWdhdGlvbiIsIkNvbnNvbGUiLCJ3YXJuIiwib3JkaW5hbCIsImRvbWFpbklzSW5maW5pdGUiLCJJbmZpbml0eSIsInNjYWxlRmFjdG9yeSIsInJlc3VsdCIsImdldFBvaW50c0JvdW5kcyIsImdldFBvc2l0aW9uIiwic2FtcGxlRGF0YSIsIm51bVJvd3MiLCJnZXRTYW1wbGVEYXRhIiwicG9pbnRzIiwibWFwSW5kZXgiLCJsYXRCb3VuZHMiLCJnZXRMYXRMbmdCb3VuZHMiLCJsbmdCb3VuZHMiLCJnZXRDaGFuZ2VkVHJpZ2dlcnMiLCJkYXRhVXBkYXRlVHJpZ2dlcnMiLCJ0cmlnZ2VyQ2hhbmdlZCIsImRpZmZVcGRhdGVUcmlnZ2VycyIsIl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMiLCJfcmVmOSIsIl9yZWY5JG51bGxWYWx1ZSIsIl9yZWY5JGdldFZhbHVlIiwiZ2V0VmFsdWUiLCJjb2xvckNvbHVtblZhbHVlIiwiY2hhbm5lbENvbmZpZyIsImNoYW5uZWxGaWVsZCIsImNvbHVtbkZpZWxkIiwiY29sb3JDb2x1bW4iLCJjb2xvckNvbHVtbklkeCIsInZhbHVlQXQiLCJhdHRyaWJ1dGVWYWx1ZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsIkRhdGUiLCJ1cGRhdGVNZXRhIiwidXBkYXRlTGF5ZXJMZWdlbmQiLCJzZXR0aW5ncyIsImdldERhdGFVcGRhdGVUcmlnZ2VycyIsIl9yZWYxMCIsImFsbERhdGEiLCJnZXREYXRhIiwiZGF0YXNldElkIiwiZ2V0TWV0YSIsInRsIiwidXBkYXRlRGF0YSIsIm9sZExheWVyRGF0YSIsImRhdGFzZXQiLCJnZXREYXRhc2V0IiwidXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyIsInVwZGF0ZUhleENvbG9yRG9tYWluIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsInVwZGF0ZUxheWVyTWV0YSIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJfdGhpczUiLCJfbG9vcCIsIl90aGlzNSRjb25maWckdmlzQ29uZiIsIl9PYmplY3QkdmFsdWVzJF9pIiwiX09iamVjdCR2YWx1ZXMiLCJfaSIsIm9sZEZpZWxkIiwiaXNVc2luZ0hleENvbG9yQ29kZSIsIm5ld0RhdGFTZXRGaWVsZCIsImZkIiwiX3JldCIsInVwZGF0ZUxheWVyRG9tYWluIiwibmV3RmlsdGVyIiwiX3RoaXM2IiwidGFibGUiLCJzY2FsZVR5cGUiLCJ1cGRhdGVkRG9tYWluIiwiY2FsY3VsYXRlTGF5ZXJEb21haW4iLCJ2YWxpZGF0ZUZpZWxkVHlwZSIsInZhbGlkYXRlU2NhbGUiLCJ2aXN1YWxDaGFubmVsIiwic3VwcG9ydGVkRmllbGRUeXBlcyIsImNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzIiwiQ0hBTk5FTF9TQ0FMRV9TVVBQT1JURURfRklFTERTIiwic2NhbGVPcHRpb25zIiwiZ2V0U2NhbGVPcHRpb25zIiwiRklFTERfT1BUUyIsInVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbCIsImdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycyIsIl90aGlzNyIsInVwZGF0ZVRyaWdnZXJzIiwiZGF0YVNldEZpZWxkIiwiZ2V0Q29sdW1uTGF5ZXJEb21haW4iLCJfdGhpczgiLCJjaGVja0NvbG9yT3JGYWxsYmFjayIsImNhbGN1bGF0ZUhleENvbHVtbkxlZ2VuZCIsIl90aGlzOSIsImxlZ2VuZHMiLCJfdGhpczkkdmlzdWFsQ2hhbm5lbHMiLCJsZWdlbmQiLCJjYWxjdWxhdGVMZWdlbmQiLCJoYXNIb3ZlcmVkT2JqZWN0Iiwib2JqZWN0SW5mbyIsImlzTGF5ZXJIb3ZlcmVkIiwiX29iamVjdEluZm8kbGF5ZXIiLCJfb2JqZWN0SW5mbyRsYXllciRwcm8iLCJwaWNrZWQiLCJsYXllciIsImdldFJhZGl1c1NjYWxlQnlab29tIiwibWFwU3RhdGUiLCJyYWRpdXNDaGFubmVsIiwidmMiLCJyYWRpdXMiLCJnZXRSYWRpdXNTY2FsZSIsImdldE1heE1hcmtlclNpemUiLCJfdGhpcyRjb25maWc1IiwicmFkaXVzUmFuZ2UiLCJjZWlsIiwic2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhIiwiX3RoaXMxMCIsIm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcyIsImdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImJydXNoaW5nVGFyZ2V0IiwiYnJ1c2giLCJhdXRvSGlnaGxpZ2h0IiwiYnJ1c2hpbmdSYWRpdXMiLCJicnVzaGluZ0VuYWJsZWQiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJfcmVmMTIiLCJpZHgiLCJncHVGaWx0ZXIiLCJ2aXNpYmxlIiwibWFza1BvbHlnb24iLCJtYXNrRXh0ZW5zaW9uUHJvcHMiLCJnZXRNYXNrRXh0ZW5zaW9uUHJvcHMiLCJjb29yZGluYXRlU3lzdGVtIiwiQ09PUkRJTkFURV9TWVNURU0iLCJMTkdMQVQiLCJwaWNrYWJsZSIsImhhc0ludGVyYWN0aXZpdHkiLCJ3cmFwTG9uZ2l0dWRlIiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImRyYWdSb3RhdGUiLCJlbmFibGUzZCIsIm9wYWNpdHkiLCJleHRlbnNpb25zIiwiZmlsdGVyUmFuZ2UiLCJnZXREZWZhdWx0SG92ZXJMYXllclByb3BzIiwicmVuZGVyVGV4dExhYmVsTGF5ZXIiLCJfcmVmMTMiLCJyZW5kZXJPcHRzIiwiZ2V0UmFkaXVzIiwicmFkaXVzU2NhbGUiLCJzaGFyZWRQcm9wcyIsIl90aGlzJGNvbmZpZzYiLCJ0ZXh0TGFiZWxzIiwiZ2V0VGV4dCIsIl90ZXh0TGFiZWwiLCJtYWluTGFiZWwiLCJzZWNvbmRhcnlMYWJlbCIsImFsaWdubWVudCIsImFuY2hvciIsImdldENvbG9yIiwibWFpbkZpZWxkIiwib3V0bGluZUNvbG9yIiwiX3JlZjE0IiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJzZWNvbmRhcnlGaWVsZCIsInNlY29uZGFyeU91dGxpbmVDb2xvciIsInNlY29uZGFyeVNpemVTY2FsZSIsIlBvaW50TGFiZWxMYXllciIsImNoYXJhY3RlclNldCIsImNvbGxpc2lvbkVuYWJsZWQiLCJjb2xsaXNpb25Hcm91cCIsImdldFNlY29uZGFyeVRleHQiLCJnZXRUZXh0QW5jaG9yIiwiZ2V0QWxpZ25tZW50QmFzZWxpbmUiLCJmb250RmFtaWx5IiwiZm9udFNldHRpbmdzIiwic2RmIiwiZm9udFdlaWdodCIsIm91dGxpbmVXaWR0aCIsImdldEZpbHRlclZhbHVlIiwiZ2V0Q3VzdG9tTWFya2VySWNvbkFjY2Vzc29yIiwiaWNvblVybEFjY2Vzc29yIiwibWFzayIsIm1heEljb25TaXplIiwid2FudGVkVXJsIiwiaWNvbk9rIiwidXJsIiwid2lkdGgiLCJoZWlnaHQiLCJrZXBsZXJUYWJsZSIsIl9PYmplY3QkdmFsdWVzMiIsIl9PYmplY3QkdmFsdWVzMiRmaW5kIiwiX3RoaXMkY29uZmlnJGZpZWxkMiIsIl90aGlzJGNvbmZpZyR2aXNDb25maSIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsImZvdW5kTGF5ZXJzIiwiZmluZERlZmF1bHRDb2x1bW5GaWVsZCIsImRlZmF1bHRGaWVsZHMiLCJhbGxGaWVsZHMiLCJyZXF1aXJlZENvbHVtbnMiLCJyZXF1aXJlZEZpZWxkcyIsImdldEFsbFBvc3NpYmxlQ29sdW1uUGFyaXMiLCJhbGxLZXlzIiwicG9pbnRlcnMiLCJjb3VudFBlcktleSIsInBhaXJzIiwiaW5jcmVtZW50UG9pbnRlcnMiLCJuZXdQYWlyIiwiY3V1ciIsInB0cyIsImNvdW50cyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xheWVycy9iYXNlLWxheWVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBrZXltaXJyb3IgZnJvbSAna2V5bWlycm9yJztcbmltcG9ydCB7Q29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uLCBEYXRhRmlsdGVyRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCB7Q09PUkRJTkFURV9TWVNURU0sIExheWVyIGFzIERlY2tMYXllcn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge19Qb2ludExhYmVsTGF5ZXIgYXMgUG9pbnRMYWJlbExheWVyfSBmcm9tICdAZGVjay5nbC9jYXJ0byc7XG5pbXBvcnQgRGVmYXVsdExheWVySWNvbiBmcm9tICcuL2RlZmF1bHQtbGF5ZXItaWNvbic7XG5pbXBvcnQge2RpZmZVcGRhdGVUcmlnZ2Vyc30gZnJvbSAnLi9sYXllci11cGRhdGUnO1xuaW1wb3J0IHtyZ2J9IGZyb20gJ2QzLWNvbG9yJztcblxuaW1wb3J0IHtcbiAgQUxMX0ZJRUxEX1RZUEVTLFxuICBOT19WQUxVRV9DT0xPUixcbiAgU0NBTEVfVFlQRVMsXG4gIENIQU5ORUxfU0NBTEVTLFxuICBGSUVMRF9PUFRTLFxuICBTQ0FMRV9GVU5DLFxuICBDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMsXG4gIE1BWF9HUFVfRklMVEVSUyxcbiAgVU5LTk9XTl9DT0xPUixcbiAgWk9PTV9MRVZFTF9MSU1JVFNcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtDT0xPUl9SQU5HRVMsIGhleENvbG9yfSBmcm9tICdjb25zdGFudHMvY29sb3ItcmFuZ2VzJztcbmltcG9ydCB7RGF0YVZpekNvbG9yc30gZnJvbSAnY29uc3RhbnRzL2N1c3RvbS1jb2xvci1yYW5nZXMnO1xuaW1wb3J0IHtcbiAgTEFZRVJfVklTX0NPTkZJR1MsXG4gIERFRkFVTFRfVEVYVF9MQUJFTCxcbiAgREVGQVVMVF9DT0xPUl9VSSxcbiAgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gIERFRkFVTFRfTEFZRVJfTEFCRUxcbn0gZnJvbSAnLi9sYXllci1mYWN0b3J5JztcblxuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZCwgaXNQbGFpbk9iamVjdH0gZnJvbSAndXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQge2dldExhdExuZ0JvdW5kcywgbm90TnVsbG9yVW5kZWZpbmVkfSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcbmltcG9ydCB7Z2V0U2FtcGxlRGF0YX0gZnJvbSAndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItdXRpbHMnO1xuXG5pbXBvcnQge2hleFRvUmdiLCBnZXRDb2xvckdyb3VwQnlOYW1lLCByZXZlcnNlQ29sb3JSYW5nZSwgY2hlY2tDb2xvck9yRmFsbGJhY2t9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7Z2V0TWFza0V4dGVuc2lvblByb3BzfSBmcm9tICd1dGlscy9sYXllci11dGlscyc7XG5pbXBvcnQge3NjYWxlT3JkaW5hbH0gZnJvbSAnZDMtc2NhbGUnO1xuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi9pbmRleCcpLkxheWVyfSBMYXllckNsYXNzfSAqL1xuXG4vKipcbiAqIEFwcHJveC4gbnVtYmVyIG9mIHBvaW50cyB0byBzYW1wbGUgaW4gYSBsYXJnZSBkYXRhIHNldFxuICogQHR5cGUge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IExBWUVSX0lEX0xFTkdUSCA9IDY7XG5cbi8vIE5vdGUsIHRoaXMgaXMgaXMgU1ZHIG9mIHNvbGlkIGNpcmNsZSBlbmNvZGVkIGFzIGRhdGEtdXJpXG5jb25zdCBGQUxMQkFDS19JQ09OID1cbiAgJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxQSE4yWnlCMmFXVjNRbTk0UFNJd0lEQWdNVEF3SURFd01DSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklqNE5DaUFnUEdOcGNtTnNaU0JqZUQwaU5UQWlJR041UFNJMU1DSWdjajBpTlRBaUx6NE5Dand2YzNablBnPT0nO1xuXG5jb25zdCBNQVhfU0FNUExFX1NJWkUgPSA1MDAwO1xuY29uc3QgZGVmYXVsdERvbWFpbiA9IFswLCAxXTtcbmNvbnN0IGRhdGFGaWx0ZXJFeHRlbnNpb24gPSBuZXcgRGF0YUZpbHRlckV4dGVuc2lvbih7ZmlsdGVyU2l6ZTogTUFYX0dQVV9GSUxURVJTfSk7XG5jb25zdCBjb2xsaXNpb25GaWx0ZXJFeHRlbnNpb24gPSBuZXcgQ29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uKCk7XG5cbmNvbnN0IGRlZmF1bHREYXRhQWNjZXNzb3IgPSBkYyA9PiBkID0+IGQ7XG5jb25zdCBkZWZhdWx0R2V0RmllbGRWYWx1ZSA9IChmaWVsZCwgZCkgPT4gZmllbGQudmFsdWVBY2Nlc3NvcihkKTtcbmNvbnN0IHNjYWxlSWRlbnRpdHkgPSB2ID0+IHY7XG5cbmV4cG9ydCBjb25zdCBPVkVSTEFZX1RZUEUgPSBrZXltaXJyb3Ioe1xuICBkZWNrZ2w6IG51bGwsXG4gIG1hcGJveGdsOiBudWxsXG59KTtcblxuZXhwb3J0IGNvbnN0IGxheWVyQ29sb3JzID0gT2JqZWN0LnZhbHVlcyhEYXRhVml6Q29sb3JzKS5tYXAoaGV4VG9SZ2IpO1xuZnVuY3Rpb24qIGdlbmVyYXRlQ29sb3IoKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGxheWVyQ29sb3JzLmxlbmd0aCArIDEpIHtcbiAgICBpZiAoaW5kZXggPT09IGxheWVyQ29sb3JzLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICB5aWVsZCBsYXllckNvbG9yc1tpbmRleCsrXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29sb3JNYWtlciA9IGdlbmVyYXRlQ29sb3IoKTtcblxuLyoqIEB0eXBlIHtMYXllckNsYXNzfSAqL1xuY2xhc3MgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IHByb3BzLmlkIHx8IGdlbmVyYXRlSGFzaElkKExBWUVSX0lEX0xFTkdUSCk7XG4gICAgLy8gbWV0YVxuICAgIHRoaXMubWV0YSA9IHt9O1xuXG4gICAgLy8gbGVnZW5kU2V0dGluZ3NcbiAgICB0aGlzLmxlZ2VuZFNldHRpbmdzID0ge307XG5cbiAgICAvLyB2aXNDb25maWdTZXR0aW5nc1xuICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3MgPSB7fTtcblxuICAgIC8vIGludGVyYWN0aXZpdHlTZXR0aW5nc1xuICAgIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncyA9IHt9O1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0TGF5ZXJDb25maWcoe1xuICAgICAgY29sdW1uczogdGhpcy5nZXRMYXllckNvbHVtbnMoKSxcbiAgICAgIC4uLnByb3BzXG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBEZWZhdWx0TGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IG92ZXJsYXlUeXBlKCkge1xuICAgIHJldHVybiBPVkVSTEFZX1RZUEUuZGVja2dsO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlO1xuICB9XG5cbiAgZ2V0IGlzQWdncmVnYXRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgcmVxdWlyZWRMYXllckNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IG9wdGlvbmFsQ29sdW1ucygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgbm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzKCkge1xuICAgIHJldHVybiBbJ2xhYmVsJywgJ29wYWNpdHknLCAndGhpY2tuZXNzJywgJ2lzVmlzaWJsZScsICdoaWRkZW4nXTtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjb2xvcicsXG4gICAgICAgIGZpZWxkOiAnY29sb3JGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnY29sb3JTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ2NvbG9yRG9tYWluJyxcbiAgICAgICAgcmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgICAgICAga2V5OiAnY29sb3InLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5jb2xvcixcbiAgICAgICAgbnVsbFZhbHVlOiBOT19WQUxVRV9DT0xPUixcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICBwcm9wZXJ0eTogJ3NpemUnLFxuICAgICAgICBmaWVsZDogJ3NpemVGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnc2l6ZVNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnc2l6ZURvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnc2l6ZVJhbmdlJyxcbiAgICAgICAga2V5OiAnc2l6ZScsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLnNpemUsXG4gICAgICAgIG51bGxWYWx1ZTogMCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAxXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIENvbHVtbiBwYWlycyBtYXBzIGxheWVyIGNvbHVtbiB0byBhIHNwZWNpZmljIGZpZWxkIHBhaXJzLFxuICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gbnVsbFxuICAgKi9cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLypcbiAgICogRGVmYXVsdCBwb2ludCBjb2x1bW4gcGFpcnMsIGNhbiBiZSB1c2VkIGZvciBwb2ludCBiYXNlZCBsYXllcnM6IHBvaW50LCBpY29uIGV0Yy5cbiAgICovXG4gIGdldCBkZWZhdWx0UG9pbnRDb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0OiB7cGFpcjogJ2xuZycsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nOiB7cGFpcjogJ2xhdCcsIGZpZWxkUGFpcktleTogJ2xuZyd9XG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIERlZmF1bHQgbGluayBjb2x1bW4gcGFpcnMsIGNhbiBiZSB1c2VkIGZvciBsaW5rIGJhc2VkIGxheWVyczogYXJjLCBsaW5lIGV0Y1xuICAgKi9cbiAgZ2V0IGRlZmF1bHRMaW5rQ29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdDA6IHtwYWlyOiAnbG5nMCcsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nMDoge3BhaXI6ICdsYXQwJywgZmllbGRQYWlyS2V5OiAnbG5nJ30sXG4gICAgICBsYXQxOiB7cGFpcjogJ2xuZzEnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzE6IHtwYWlyOiAnbGF0MScsIGZpZWxkUGFpcktleTogJ2xuZyd9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBSZWFjdCBjb21wb25lbnQgZm9yIHRvIHJlbmRlciBsYXllciBpbnN0cnVjdGlvbnMgaW4gYSBtb2RhbFxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGFuIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiAgcmV0dXJuIHtcbiAgICogICAgaWQ6ICdpY29uSW5mbycsXG4gICAqICAgIHRlbXBsYXRlOiBJY29uSW5mb01vZGFsLFxuICAgKiAgICBtb2RhbFByb3BzOiB7XG4gICAqICAgICAgdGl0bGU6ICdIb3cgdG8gZHJhdyBpY29ucydcbiAgICogICB9O1xuICAgKiB9XG4gICAqL1xuICBnZXQgbGF5ZXJJbmZvTW9kYWwoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGl2aXR5U2V0dGluZ3M7XG4gIH1cblxuICBzZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKGludGVyYWN0aXZpdHlTZXR0aW5ncykge1xuICAgIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncyA9IGludGVyYWN0aXZpdHlTZXR0aW5ncztcbiAgfVxuXG4gIGdldCBoYXNUb29sdGlwKCkge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmhvdmVyPy5maWVsZHMubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpdml0eVNldHRpbmdzPy5jbGljaz8uZmllbGRzLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICBnZXQgaGFzSW50ZXJhY3Rpdml0eSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmhhc1Rvb2x0aXAgJiYgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmVuYWJsZWQpO1xuICB9XG5cbiAgLypcbiAgICogR2l2ZW4gYSBkYXRhc2V0LCBhdXRvbWF0aWNhbGx5IGZpbmQgcHJvcHMgdG8gY3JlYXRlIGxheWVyIGJhc2VkIG9uIGl0XG4gICAqIGFuZCByZXR1cm4gdGhlIHByb3BzIGFuZCBwcmV2aW91cyBmb3VuZCBsYXllcnMuXG4gICAqIEJ5IGRlZmF1bHQsIG5vIGxheWVycyB3aWxsIGJlIGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIGZvdW5kTGF5ZXJzKSB7XG4gICAgcmV0dXJuIHtwcm9wczogW10sIGZvdW5kTGF5ZXJzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGFycmF5IG9mIHByZXNldCByZXF1aXJlZCBjb2x1bW4gbmFtZXNcbiAgICogZm91bmQgZmllbGQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0byBzZXQgYXMgbGF5ZXIgY29sdW1uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkZWZhdWx0RmllbGRzXG4gICAqIEBwYXJhbSB7b2JqZWN0W119IGFsbEZpZWxkc1xuICAgKiBAcmV0dXJucyB7b2JqZWN0W10gfCBudWxsfSBhbGwgcG9zc2libGUgcmVxdWlyZWQgbGF5ZXIgY29sdW1uIHBhaXJzXG4gICAqL1xuICBzdGF0aWMgZmluZERlZmF1bHRDb2x1bW5GaWVsZChkZWZhdWx0RmllbGRzLCBhbGxGaWVsZHMpIHtcbiAgICAvLyBmaW5kIGFsbCBtYXRjaGVkIGZpZWxkcyBmb3IgZWFjaCByZXF1aXJlZCBjb2xcbiAgICBjb25zdCByZXF1aXJlZENvbHVtbnMgPSBPYmplY3Qua2V5cyhkZWZhdWx0RmllbGRzKS5yZWR1Y2UoKHByZXYsIGtleSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWlyZWRGaWVsZHMgPSBhbGxGaWVsZHMuZmlsdGVyKFxuICAgICAgICBmID0+IGYubmFtZSA9PT0gZGVmYXVsdEZpZWxkc1trZXldIHx8IGRlZmF1bHRGaWVsZHNba2V5XS5pbmNsdWRlcyhmLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBwcmV2W2tleV0gPSByZXF1aXJlZEZpZWxkcy5sZW5ndGhcbiAgICAgICAgPyByZXF1aXJlZEZpZWxkcy5tYXAoZiA9PiAoe1xuICAgICAgICAgICAgdmFsdWU6IGYubmFtZSxcbiAgICAgICAgICAgIGZpZWxkSWR4OiBmLmZpZWxkSWR4XG4gICAgICAgICAgfSkpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcblxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhyZXF1aXJlZENvbHVtbnMpLmV2ZXJ5KEJvb2xlYW4pKSB7XG4gICAgICAvLyBpZiBhbnkgZmllbGQgbWlzc2luZywgcmV0dXJuIG51bGxcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEFsbFBvc3NpYmxlQ29sdW1uUGFyaXMocmVxdWlyZWRDb2x1bW5zKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzKHJlcXVpcmVkQ29sdW1ucykge1xuICAgIC8vIGZvciBtdWx0aXBsZSBtYXRjaGVkIGZpZWxkIGZvciBvbmUgcmVxdWlyZWQgY29sdW1uLCByZXR1cm4gbXVsdGlwbGVcbiAgICAvLyBjb21iaW5hdGlvbnMsIGUuIGcuIGlmIGNvbHVtbiBhIGhhcyAyIG1hdGNoZWQsIGNvbHVtbiBiIGhhcyAzIG1hdGNoZWRcbiAgICAvLyA2IHBvc3NpYmxlIGNvbHVtbiBwYWlycyB3aWxsIGJlIHJldHVybmVkXG4gICAgY29uc3QgYWxsS2V5cyA9IE9iamVjdC5rZXlzKHJlcXVpcmVkQ29sdW1ucyk7XG4gICAgY29uc3QgcG9pbnRlcnMgPSBhbGxLZXlzLm1hcCgoaywgaSkgPT4gKChpID09PSBhbGxLZXlzLmxlbmd0aCAtIDEgPyAtMSA6IDApKSk7XG4gICAgY29uc3QgY291bnRQZXJLZXkgPSBhbGxLZXlzLm1hcChrID0+IHJlcXVpcmVkQ29sdW1uc1trXS5sZW5ndGgpO1xuICAgIGNvbnN0IHBhaXJzID0gW107XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb29wLWZ1bmMgKi9cbiAgICB3aGlsZSAoaW5jcmVtZW50UG9pbnRlcnMocG9pbnRlcnMsIGNvdW50UGVyS2V5LCBwb2ludGVycy5sZW5ndGggLSAxKSkge1xuICAgICAgY29uc3QgbmV3UGFpciA9IHBvaW50ZXJzLnJlZHVjZSgocHJldiwgY3V1ciwgaSkgPT4ge1xuICAgICAgICBwcmV2W2FsbEtleXNbaV1dID0gcmVxdWlyZWRDb2x1bW5zW2FsbEtleXNbaV1dW2N1dXJdO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgcGFpcnMucHVzaChuZXdQYWlyKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuICAgIC8vIHJlY3Vyc2l2ZWx5IGluY3JlbWVudCBwb2ludGVyc1xuICAgIGZ1bmN0aW9uIGluY3JlbWVudFBvaW50ZXJzKHB0cywgY291bnRzLCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4ID09PSAwICYmIHB0c1swXSA9PT0gY291bnRzWzBdIC0gMSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGluY3JlbWVudFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdHNbaW5kZXhdICsgMSA8IGNvdW50c1tpbmRleF0pIHtcbiAgICAgICAgcHRzW2luZGV4XSA9IHB0c1tpbmRleF0gKyAxO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcHRzW2luZGV4XSA9IDA7XG4gICAgICByZXR1cm4gaW5jcmVtZW50UG9pbnRlcnMocHRzLCBjb3VudHMsIGluZGV4IC0gMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhaXJzO1xuICB9XG5cbiAgc3RhdGljIGhleFRvUmdiKGMpIHtcbiAgICByZXR1cm4gaGV4VG9SZ2IoYyk7XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhSWQ6IHByb3BzLmRhdGFJZCB8fCBudWxsLFxuICAgICAgdmlzaWJpbGl0eUJ5Wm9vbToge1xuICAgICAgICBtaW46IHByb3BzLnZpc2liaWxpdHlCeVpvb20/Lm1pbiB8fCBaT09NX0xFVkVMX0xJTUlUUy5taW4sXG4gICAgICAgIG1heDogcHJvcHMudmlzaWJpbGl0eUJ5Wm9vbT8ubWF4IHx8IFpPT01fTEVWRUxfTElNSVRTLm1heFxuICAgICAgfSxcbiAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCB8fCBERUZBVUxUX0xBWUVSX0xBQkVMLFxuICAgICAgY29sb3I6IHByb3BzLmNvbG9yIHx8IGNvbG9yTWFrZXIubmV4dCgpLnZhbHVlLFxuICAgICAgY29sdW1uczogcHJvcHMuY29sdW1ucyB8fCBudWxsLFxuICAgICAgaXNWaXNpYmxlOiBwcm9wcy5pc1Zpc2libGUgfHwgZmFsc2UsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogcHJvcHMuaXNDb25maWdBY3RpdmUgfHwgZmFsc2UsXG4gICAgICBoaWdobGlnaHRDb2xvcjogcHJvcHMuaGlnaGxpZ2h0Q29sb3IgfHwgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gICAgICBoaWRkZW46IHByb3BzLmhpZGRlbiB8fCBmYWxzZSxcblxuICAgICAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBpbnRvIHNlcGFyYXRlIHZpc3VhbCBDaGFubmVsIGNvbmZpZ1xuICAgICAgLy8gY29sb3IgYnkgZmllbGQsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIGNvbG9yRmllbGQ6IG51bGwsXG4gICAgICBjb2xvckRvbWFpbjogWzAsIDFdLFxuICAgICAgY29sb3JTY2FsZTogU0NBTEVfVFlQRVMucXVhbnRpbGUsXG5cbiAgICAgIC8vIGNvbG9yIGJ5IHNpemUsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIHNpemVEb21haW46IFswLCAxXSxcbiAgICAgIHNpemVTY2FsZTogU0NBTEVfVFlQRVMubGluZWFyLFxuICAgICAgc2l6ZUZpZWxkOiBudWxsLFxuICAgICAgcmFkaXVzRmllbGQ6IG51bGwsXG5cbiAgICAgIHZpc0NvbmZpZzoge30sXG5cbiAgICAgIHRleHRMYWJlbDogW0RFRkFVTFRfVEVYVF9MQUJFTF0sXG5cbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgY29sb3I6IERFRkFVTFRfQ09MT1JfVUksXG4gICAgICAgIGNvbG9yUmFuZ2U6IERFRkFVTFRfQ09MT1JfVUlcbiAgICAgIH0sXG4gICAgICBhbmltYXRpb246IHtlbmFibGVkOiBmYWxzZX1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgYSB2aXN1YWxDaGFubmVsIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zIHt7bGFiZWw6IHN0cmluZywgbWVhc3VyZTogKHN0cmluZ3xzdHJpbmcpfX1cbiAgICovXG4gIGdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbihrZXkpIHtcbiAgICAvLyBlLmcuIGxhYmVsOiBDb2xvciwgbWVhc3VyZTogVmVoaWNsZSBUeXBlXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5yYW5nZV0ubGFiZWwsXG4gICAgICBtZWFzdXJlOiB0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdXG4gICAgICAgID8gKHRoaXMuY29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5maWVsZF0uZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICB0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdLm5hbWUpXG4gICAgICAgIDogdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmRlZmF1bHRNZWFzdXJlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gYSBmaWVsZCB0byBsYXllciBjb2x1bW4sIHJldHVybiBjb2x1bW4gY29uZmlnXG4gICAqIEBwYXJhbSBrZXkgLSBDb2x1bW4gS2V5XG4gICAqIEBwYXJhbSBmaWVsZCAtIFNlbGVjdGVkIGZpZWxkXG4gICAqIEByZXR1cm5zIHt7fX0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW4oa2V5LCBmaWVsZCkge1xuICAgIC8vIGZpZWxkIHZhbHVlIGNvdWxkIGJlIG51bGwgZm9yIG9wdGlvbmFsIGNvbHVtbnNcbiAgICBjb25zdCB1cGRhdGUgPSBmaWVsZFxuICAgICAgPyB7XG4gICAgICAgICAgdmFsdWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgZmllbGRJZHg6IGZpZWxkLmZpZWxkSWR4XG4gICAgICAgIH1cbiAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XToge1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5jb2x1bW5zW2tleV0sXG4gICAgICAgIC4uLnVwZGF0ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgZmllbGQgcGFpciB0byBjb2x1bW4gY29uZmlnLCByZXR1cm4gY29sdW1uIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5IC0gQ29sdW1uIEtleVxuICAgKiBAcGFyYW0gcGFpciAtIGZpZWxkIFBhaXJcbiAgICogQHJldHVybnMge29iamVjdH0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW5QYWlycyhrZXksIHBhaXIpIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uUGFpcnMgfHwgIXRoaXMuY29sdW1uUGFpcnM/LltrZXldKSB7XG4gICAgICAvLyBzaG91bGQgbm90IGVuZCBpbiB0aGlzIHN0YXRlXG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuY29sdW1ucztcbiAgICB9XG5cbiAgICBjb25zdCB7cGFpcjogcGFydG5lcktleSwgZmllbGRQYWlyS2V5fSA9IHRoaXMuY29sdW1uUGFpcnM/LltrZXldO1xuICAgIGNvbnN0IHtmaWVsZFBhaXJLZXk6IHBhcnRuZXJGaWVsZFBhaXJLZXl9ID0gdGhpcy5jb2x1bW5QYWlycz8uW3BhcnRuZXJLZXldO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XTogcGFpcltmaWVsZFBhaXJLZXldLFxuICAgICAgW3BhcnRuZXJLZXldOiBwYWlyW3BhcnRuZXJGaWVsZFBhaXJLZXldXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSByYWRpdXMgem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0Wm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGgubWF4KDE0IC0gem9vbSArIHpvb21PZmZzZXQsIDApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSBlbGV2YXRpb24gem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0RWxldmF0aW9uWm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9KSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnZpc0NvbmZpZy5lbmFibGVFbGV2YXRpb25ab29tRmFjdG9yXG4gICAgICA/IE1hdGgucG93KDIsIE1hdGgubWF4KDggLSB6b29tICsgem9vbU9mZnNldCwgMCkpXG4gICAgICA6IDE7XG4gIH1cblxuICBmb3JtYXRMYXllckRhdGEoZGF0YXNldHMsIGZpbHRlcmVkSW5kZXgpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZW5kZXJMYXllcigpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXRIb3ZlckRhdGEob2JqZWN0LCBkYXRhQ29udGFpbmVyKSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggZW50cnkgb2YgbGF5ZXJEYXRhIHNob3VsZCBoYXZlIGFuIGluZGV4IG9mIGEgcm93IGluIHRoZSBvcmlnaW5hbCBkYXRhIGNvbnRhaW5lci5cbiAgICAvLyBFYWNoIGxheWVyIGNhbiBpbXBsZW1lbnQgaXRzIG93biBnZXRIb3ZlckRhdGEgbWV0aG9kXG4gICAgcmV0dXJuIGRhdGFDb250YWluZXIucm93KG9iamVjdC5pbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBjaGFuZ2UgbGF5ZXIgdHlwZSwgdHJ5IHRvIGNvcHkgb3ZlciBsYXllciBjb25maWdzIGFzIG11Y2ggYXMgcG9zc2libGVcbiAgICogQHBhcmFtIGNvbmZpZ1RvQ29weSAtIGNvbmZpZyB0byBjb3B5IG92ZXJcbiAgICogQHBhcmFtIHZpc0NvbmZpZ1NldHRpbmdzIC0gdmlzQ29uZmlnIHNldHRpbmdzIG9mIGNvbmZpZyB0byBjb3B5XG4gICAqL1xuICBhc3NpZ25Db25maWdUb0xheWVyKGNvbmZpZ1RvQ29weSwgdmlzQ29uZmlnU2V0dGluZ3MpIHtcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIHZpc3VhbENoYW5uZWwgZmllbGRcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIGNvbG9yIHJhbmdlLCByZXZlcnNlZDogaXMgbm90IGEga2V5IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBzaGFsbG93Q29weSA9IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ10uY29uY2F0KFxuICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5tYXAodiA9PiB2LmZpZWxkKVxuICAgICk7XG5cbiAgICAvLyBkb24ndCBjb3B5IG92ZXIgZG9tYWluIGFuZCBhbmltYXRpb25cbiAgICBjb25zdCBub3RUb0NvcHkgPSBbJ2FuaW1hdGlvbiddLmNvbmNhdChPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLm1hcCh2ID0+IHYuZG9tYWluKSk7XG4gICAgLy8gaWYgcmFuZ2UgaXMgZm9yIHRoZSBzYW1lIHByb3BlcnR5IGdyb3VwIGNvcHkgaXQsIG90aGVyd2lzZSwgbm90IHRvIGNvcHlcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2godiA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZ1RvQ29weS52aXNDb25maWdbdi5yYW5nZV0gJiZcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXSAmJlxuICAgICAgICB2aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cCAhPT0gdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cFxuICAgICAgKSB7XG4gICAgICAgIG5vdFRvQ29weS5wdXNoKHYucmFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZG9uJ3QgY29weSBvdmVyIHZpc3VhbENoYW5uZWwgcmFuZ2VcbiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgY29waWVkID0gdGhpcy5jb3B5TGF5ZXJDb25maWcoY3VycmVudENvbmZpZywgY29uZmlnVG9Db3B5LCB7XG4gICAgICBzaGFsbG93Q29weSxcbiAgICAgIG5vdFRvQ29weVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoY29waWVkKTtcbiAgICAvLyB2YWxpZGF0ZSB2aXN1YWxDaGFubmVsIGZpZWxkIHR5cGUgYW5kIHNjYWxlIHR5cGVzXG4gICAgT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgICogUmVjdXJzaXZlbHkgY29weSBjb25maWcgb3ZlciB0byBhbiBlbXB0eSBsYXllclxuICAgKiB3aGVuIHJlY2VpdmVkIHNhdmVkIGNvbmZpZywgb3IgY29weSBjb25maWcgb3ZlciBmcm9tIGEgZGlmZmVyZW50IGxheWVyIHR5cGVcbiAgICogbWFrZSBzdXJlIHRvIG9ubHkgY29weSBvdmVyIHZhbHVlIHRvIGV4aXN0aW5nIGtleXNcbiAgICogQHBhcmFtIHtvYmplY3R9IGN1cnJlbnRDb25maWcgLSBleGlzdGluZyBjb25maWcgdG8gYmUgb3ZlcnJpZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1RvQ29weSAtIG5ldyBDb25maWcgdG8gY29weSBvdmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNoYWxsb3dDb3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyB0byBub3QgdG8gYmUgZGVlcCBjb3BpZWRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbm90VG9Db3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyBub3QgdG8gY29weVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGNvcGllZCBjb25maWdcbiAgICovXG4gIGNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnLCBjb25maWdUb0NvcHksIHtzaGFsbG93Q29weSA9IFtdLCBub3RUb0NvcHkgPSBbXX0gPSB7fSkge1xuICAgIGNvbnN0IGNvcGllZCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50Q29uZmlnW2tleV0pICYmXG4gICAgICAgIGlzUGxhaW5PYmplY3QoY29uZmlnVG9Db3B5W2tleV0pICYmXG4gICAgICAgICFzaGFsbG93Q29weS5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KVxuICAgICAgKSB7XG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGFzc2lnbiBvYmplY3QgdmFsdWVcbiAgICAgICAgY29waWVkW2tleV0gPSB0aGlzLmNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnW2tleV0sIGNvbmZpZ1RvQ29weVtrZXldLCB7XG4gICAgICAgICAgc2hhbGxvd0NvcHksXG4gICAgICAgICAgbm90VG9Db3B5XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChub3ROdWxsb3JVbmRlZmluZWQoY29uZmlnVG9Db3B5W2tleV0pICYmICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAvLyBjb3B5XG4gICAgICAgIGNvcGllZFtrZXldID0gY29uZmlnVG9Db3B5W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBrZWVwIGV4aXN0aW5nXG4gICAgICAgIGNvcGllZFtrZXldID0gY3VycmVudENvbmZpZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuXG4gIHJlZ2lzdGVyVmlzQ29uZmlnKGxheWVyVmlzQ29uZmlncykge1xuICAgIE9iamVjdC5rZXlzKGxheWVyVmlzQ29uZmlncykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgJiYgTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXSkge1xuICAgICAgICAvLyBpZiBhc3NpZ25lZCBvbmUgb2YgZGVmYXVsdCBMQVlFUl9DT05GSUdTXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IExBWUVSX1ZJU19DT05GSUdTW2xheWVyVmlzQ29uZmlnc1tpdGVtXV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW2l0ZW1dID0gTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXTtcbiAgICAgIH0gZWxzZSBpZiAoWyd0eXBlJywgJ2RlZmF1bHRWYWx1ZSddLmV2ZXJ5KHAgPT4gbGF5ZXJWaXNDb25maWdzW2l0ZW1dLmhhc093blByb3BlcnR5KHApKSkge1xuICAgICAgICAvLyBpZiBwcm92aWRlZCBjdXN0b21pemVkIHZpc0NvbmZpZywgYW5kIGhhcyB0eXBlICYmIGRlZmF1bHRWYWx1ZVxuICAgICAgICAvLyBUT0RPOiBmdXJ0aGVyIGNoZWNrIGlmIGN1c3RvbWl6ZWQgdmlzQ29uZmlnIGlzIHZhbGlkXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IGxheWVyVmlzQ29uZmlnc1tpdGVtXS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3NbaXRlbV0gPSBsYXllclZpc0NvbmZpZ3NbaXRlbV07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXllckNvbHVtbnMoKSB7XG4gICAgY29uc3QgY29sdW1uVmFsaWRhdG9ycyA9IHRoaXMuY29sdW1uVmFsaWRhdG9ycyB8fCB7fTtcbiAgICBjb25zdCByZXF1aXJlZCA9IHRoaXMucmVxdWlyZWRMYXllckNvbHVtbnMucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGNvbHVtblZhbGlkYXRvcnNba2V5XVxuICAgICAgICAgID8ge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTEsIHZhbGlkYXRvcjogY29sdW1uVmFsaWRhdG9yc1trZXldfVxuICAgICAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25hbCA9IHRoaXMub3B0aW9uYWxDb2x1bW5zLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7Li4ucmVxdWlyZWQsIC4uLm9wdGlvbmFsfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29uZmlnKG5ld0NvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gey4uLnRoaXMuY29uZmlnLCAuLi5uZXdDb25maWd9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJWaXNDb25maWcobmV3VmlzQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcudmlzQ29uZmlnID0gey4uLnRoaXMuY29uZmlnLnZpc0NvbmZpZywgLi4ubmV3VmlzQ29uZmlnfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29sb3JVSShwcm9wLCBuZXdDb25maWcpIHtcbiAgICBjb25zdCB7Y29sb3JVSTogcHJldmlvdXMsIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChuZXdDb25maWcpIHx8IHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JVSVByb3AgPSBPYmplY3QuZW50cmllcyhuZXdDb25maWcpLnJlZHVjZSgoYWNjdSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XTogaXNQbGFpbk9iamVjdChhY2N1W2tleV0pICYmIGlzUGxhaW5PYmplY3QodmFsdWUpID8gey4uLmFjY3Vba2V5XSwgLi4udmFsdWV9IDogdmFsdWVcbiAgICAgIH07XG4gICAgfSwgcHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSk7XG5cbiAgICBjb25zdCBjb2xvclVJID0ge1xuICAgICAgLi4ucHJldmlvdXMsXG4gICAgICBbcHJvcF06IGNvbG9yVUlQcm9wXG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe2NvbG9yVUl9KTtcbiAgICAvLyBpZiBjb2xvclVJW3Byb3BdIGlzIGNvbG9yUmFuZ2UuIElmIHR5cGUgaXMgaGV4Q29sb3IgdGhlbiBpdCdzIGFsc28gYSByYW5nZVxuICAgIGNvbnN0IGlzQ29sb3JSYW5nZSA9XG4gICAgICB2aXNDb25maWdbcHJvcF0gJiYgKHZpc0NvbmZpZ1twcm9wXS5jb2xvcnMgfHwgdmlzQ29uZmlnW3Byb3BdLnR5cGUgPT09IGhleENvbG9yKTtcblxuICAgIGlmIChpc0NvbG9yUmFuZ2UpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29sb3JVSUJ5Q29sb3JSYW5nZShuZXdDb25maWcsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDdXN0b21QYWxldHRlKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlQ3VzdG9tUGFsZXR0ZShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKSB7XG4gICAgaWYgKCFuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZyB8fCAhbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuY3VzdG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghdmlzQ29uZmlnW3Byb3BdKSByZXR1cm47XG4gICAgY29uc3Qge2NvbG9yc30gPSB2aXNDb25maWdbcHJvcF07XG4gICAgY29uc3QgY3VzdG9tUGFsZXR0ZSA9IHtcbiAgICAgIC4uLmNvbG9yVUlbcHJvcF0uY3VzdG9tUGFsZXR0ZSxcbiAgICAgIG5hbWU6ICdDdXN0b20gUGFsZXR0ZScsXG4gICAgICBjb2xvcnM6IFsuLi5jb2xvcnNdXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgLi4uY29sb3JVSSxcbiAgICAgICAgW3Byb3BdOiB7XG4gICAgICAgICAgLi4uY29sb3JVSVtwcm9wXSxcbiAgICAgICAgICBjdXN0b21QYWxldHRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogaWYgb3BlbiBkcm9wZG93biBhbmQgcHJvcCBpcyBjb2xvciByYW5nZVxuICAgKiBBdXRvbWF0aWNhbGx5IHNldCBjb2xvclJhbmdlQ29uZmlnJ3Mgc3RlcCwgcmV2ZXJzZWQgYW5kIHR5cGVcbiAgICogQHBhcmFtIHsqfSBuZXdDb25maWdcbiAgICogQHBhcmFtIHsqfSBwcm9wXG4gICAqL1xuICB1cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlKG5ld0NvbmZpZywgcHJvcCkge1xuICAgIGlmICh0eXBlb2YgbmV3Q29uZmlnLnNob3dEcm9wZG93biAhPT0gJ251bWJlcicpIHJldHVybjtcblxuICAgIGNvbnN0IHtjb2xvclVJLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICBjb2xvclVJOiB7XG4gICAgICAgIC4uLmNvbG9yVUksXG4gICAgICAgIFtwcm9wXToge1xuICAgICAgICAgIC4uLmNvbG9yVUlbcHJvcF0sXG4gICAgICAgICAgY29sb3JSYW5nZUNvbmZpZzoge1xuICAgICAgICAgICAgLi4uY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnLFxuICAgICAgICAgICAgdHlwZTogdmlzQ29uZmlnW3Byb3BdLnR5cGUsXG4gICAgICAgICAgICBzdGVwczogdmlzQ29uZmlnW3Byb3BdLmNvbG9ycz8ubGVuZ3RoLFxuICAgICAgICAgICAgcmV2ZXJzZWQ6IEJvb2xlYW4odmlzQ29uZmlnW3Byb3BdLnJldmVyc2VkKSxcbiAgICAgICAgICAgIGhleENvbHVtbjogdGhpcy5nZXRIZXhDb2x1bW4ocHJvcCksXG4gICAgICAgICAgICBpc0hleENvbHVtbjogdGhpcy5pc0NvbG9yZWRCeUNvbG9yQ29sdW1uKHByb3ApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICB1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApIHtcbiAgICAvLyBvbmx5IHVwZGF0ZSBjb2xvclJhbmdlIGlmIGNoYW5nZXMgaW4gVUkgaXMgbWFkZSB0byAncmV2ZXJzZWQnLCAnc3RlcHMnIG9yIHN0ZXBzXG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlID1cbiAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnICYmXG4gICAgICBbJ3JldmVyc2VkJywgJ3N0ZXBzJ10uc29tZShcbiAgICAgICAga2V5ID0+XG4gICAgICAgICAgbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSAmJlxuICAgICAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnW2tleV0gIT09XG4gICAgICAgICAgICAocHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSkuY29sb3JSYW5nZUNvbmZpZ1trZXldXG4gICAgICApO1xuICAgIGlmICghc2hvdWxkVXBkYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCB7Y29sb3JVSSwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHtzdGVwcywgcmV2ZXJzZWR9ID0gY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnO1xuICAgIGNvbnN0IGNvbG9yUmFuZ2UgPSB2aXNDb25maWdbcHJvcF07XG4gICAgLy8gZmluZCBiYXNlZCBvbiBzdGVwIG9yIHJldmVyc2VkXG4gICAgbGV0IHVwZGF0ZTtcbiAgICBpZiAobmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoJ3N0ZXBzJykpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ2V0Q29sb3JHcm91cEJ5TmFtZShjb2xvclJhbmdlKTtcblxuICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHNhbWVHcm91cCA9IENPTE9SX1JBTkdFUy5maWx0ZXIoY3IgPT4gZ2V0Q29sb3JHcm91cEJ5TmFtZShjcikgPT09IGdyb3VwKTtcblxuICAgICAgICB1cGRhdGUgPSBzYW1lR3JvdXAuZmluZChjciA9PiBjci5jb2xvcnMubGVuZ3RoID09PSBzdGVwcyk7XG5cbiAgICAgICAgaWYgKHVwZGF0ZSAmJiBjb2xvclJhbmdlLnJldmVyc2VkKSB7XG4gICAgICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UodHJ1ZSwgdXBkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGUgJiYgY29sb3JSYW5nZS5jb2xvck1hcCkge1xuICAgICAgICAgIHVwZGF0ZSA9IHRoaXMudXBkYXRlQ29sb3JNYXAocHJvcCwgY29sb3JSYW5nZS5jb2xvck1hcCwgdXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncmV2ZXJzZWQnKSkge1xuICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UocmV2ZXJzZWQsIHVwZGF0ZSB8fCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzQ29uZmlnKHtbcHJvcF06IHVwZGF0ZX0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbG9yTWFwKHByb3AsIGNvbG9yTWFwLCBjb2xvclJhbmdlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHtmaWVsZCwgZG9tYWlufSA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YWx1ZSA9PiB2YWx1ZS5yYW5nZSA9PT0gcHJvcCk7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuY29uZmlnW2ZpZWxkXT8udHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYXRlZ29yeUNvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB0eXBlIG9yIHR5cGUgaXMgbm90IHN0cmluZywgYm9vbGVhbiBvciBkYXRlXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlTnVtZXJpY0NvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgfVxuXG4gIHVwZGF0ZUNhdGVnb3J5Q29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgY29sb3JSYW5nZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IGNvbG9yUmFuZ2UuY29sb3JzO1xuICAgIGNvbnN0IGFzc2lnbmVkQ2F0ZWdvcmllcyA9IFtdO1xuICAgIGlmIChjb2xvclJhbmdlLnR5cGUgPT09IGhleENvbG9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb2xvclJhbmdlLFxuICAgICAgICBjb2xvck1hcDogW11cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAuc2xpY2UoMCwgY29sb3JzLmxlbmd0aCkubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgYXNzaWduZWRDYXRlZ29yaWVzLnB1c2goY01hcFswXSk7XG4gICAgICByZXR1cm4gW2NNYXBbMF0sIGNvbG9yc1tpbmRleF1dO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuYXNzaWduZWRDb2xvcnMgPSBjb2xvcnMuc2xpY2UobmV3Q29sb3JNYXAubGVuZ3RoLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIGZvciAoY29uc3QgY29sb3Igb2YgdW5hc3NpZ25lZENvbG9ycykge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBkb21haW4uZmluZChkID0+ICFhc3NpZ25lZENhdGVnb3JpZXMuaW5jbHVkZXMoZCkpO1xuICAgICAgaWYgKCFjYXRlZ29yeSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGFzc2lnbmVkQ2F0ZWdvcmllcy5wdXNoKGNhdGVnb3J5KTtcbiAgICAgIG5ld0NvbG9yTWFwLnB1c2goW2NhdGVnb3J5LCBjb2xvcl0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29sb3JSYW5nZSxcbiAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcFxuICAgIH07XG4gIH1cblxuICB1cGRhdGVOdW1lcmljQ29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgdXBkYXRlKSB7XG4gICAgY29uc3QgY29sb3JzID0gdXBkYXRlLmNvbG9ycztcbiAgICBsZXQgbmV3Q29sb3JNYXAgPSBjb2xvck1hcC5zbGljZSgwLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIG5ld0NvbG9yTWFwID0gbmV3Q29sb3JNYXAubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbmRleCA9PT0gbmV3Q29sb3JNYXAubGVuZ3RoIC0gMSA/IG51bGwgOiBjTWFwWzBdO1xuICAgICAgcmV0dXJuIFt2YWx1ZSwgY29sb3JzW2luZGV4XV07XG4gICAgfSk7XG4gICAgY29uc3QgdW5hc3NpZ25lZENvbG9ycyA9IGNvbG9ycy5zbGljZShuZXdDb2xvck1hcC5sZW5ndGgsIGNvbG9ycy5sZW5ndGgpO1xuXG4gICAgaWYgKHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29sb3JNYXBWYWx1ZXMgPSBjb2xvck1hcC5tYXAoYyA9PiBjWzBdKS5maWx0ZXIoYyA9PiB0eXBlb2YgYyA9PT0gJ251bWJlcicpO1xuICAgICAgY29uc3QgbWF4VmFsdWUgPSBNYXRoLm1heCguLi5jb2xvck1hcFZhbHVlcywgZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSk7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBuZXdDb2xvck1hcFtuZXdDb2xvck1hcC5sZW5ndGggLSAyXVswXTtcbiAgICAgIGNvbnN0IHN0ZXAgPSAobWF4VmFsdWUgLSBwcmV2VmFsdWUpIC8gKHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoICsgMSk7XG4gICAgICBuZXdDb2xvck1hcFtuZXdDb2xvck1hcC5sZW5ndGggLSAxXVswXSA9IHByZXZWYWx1ZSArIHN0ZXA7XG5cbiAgICAgIGZvciAoY29uc3QgW2ksIGNvbG9yXSBvZiB1bmFzc2lnbmVkQ29sb3JzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGkgPT09IHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoIC0gMSA/IG51bGwgOiBwcmV2VmFsdWUgKyAoc3RlcCAqIChpICsgMikpO1xuICAgICAgICBuZXdDb2xvck1hcC5wdXNoKFt2YWx1ZSwgY29sb3JdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciBsYXllciBoYXMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHllcyBvciBub1xuICAgKi9cbiAgaGFzQWxsQ29sdW1ucygpIHtcbiAgICBjb25zdCB7Y29sdW1uc30gPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4gKFxuICAgICAgKGNvbHVtbnMgJiZcbiAgICAgIE9iamVjdC52YWx1ZXMoY29sdW1ucykuZXZlcnkodiA9PiB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHYub3B0aW9uYWwgfHwgKHYudmFsdWUgJiYgdi5maWVsZElkeCA+IC0xKSk7XG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgbGF5ZXIgaGFzIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheSB8IE9iamVjdH0gbGF5ZXJEYXRhXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB5ZXMgb3Igbm9cbiAgICovXG4gIGhhc0xheWVyRGF0YShsYXllckRhdGEpIHtcbiAgICBpZiAoIWxheWVyRGF0YSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gQm9vbGVhbihsYXllckRhdGEuZGF0YSAmJiBsYXllckRhdGEuZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgaXNWYWxpZFRvU2F2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlICYmIHRoaXMuaGFzQWxsQ29sdW1ucygpO1xuICB9XG5cbiAgc2hvdWxkUmVuZGVyTGF5ZXIoZGF0YSkge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy50eXBlICYmXG4gICAgICB0aGlzLmhhc0FsbENvbHVtbnMoKSAmJlxuICAgICAgdGhpcy5oYXNMYXllckRhdGEoZGF0YSkgJiZcbiAgICAgIHR5cGVvZiB0aGlzLnJlbmRlckxheWVyID09PSAnZnVuY3Rpb24nKVxuICAgICk7XG4gIH1cblxuICBnZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUsIGNvbG9yRG9tYWluLCBjb2xvclJhbmdlKSB7XG4gICAgaWYgKGNvbG9yUmFuZ2UudHlwZSA9PT0gaGV4Q29sb3IpIHtcbiAgICAgIHJldHVybiAoXywgY29sb3IpID0+IHtcbiAgICAgICAgY29uc3Qge3IsIGcsIGJ9ID0gcmdiKGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIFtyLCBnLCBiXS5zb21lKGlzTmFOKSA/IFVOS05PV05fQ09MT1IgOiBbciwgZywgYl07XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb2xvclJhbmdlLmNvbG9yTWFwKSkge1xuICAgICAgY29uc3QgY01hcCA9IG5ldyBNYXAoKTtcbiAgICAgIGNvbG9yUmFuZ2UuY29sb3JNYXAuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgIGNNYXAuc2V0KGssIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IGhleFRvUmdiKHYpIDogdik7XG4gICAgICB9KTtcblxuICAgICAgLy8gQHRzLWlnbm9yZSBkMyBzY2FsZVxuICAgICAgY29uc3Qgc2NhbGUgPSBTQ0FMRV9GVU5DW2NvbG9yU2NhbGVdKClcbiAgICAgICAgLmRvbWFpbihBcnJheS5mcm9tKGNNYXAua2V5cygpKSlcbiAgICAgICAgLnJhbmdlKEFycmF5LmZyb20oY01hcC52YWx1ZXMoKSkpXG4gICAgICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShjb2xvclNjYWxlLCBjb2xvckRvbWFpbiwgY29sb3JSYW5nZS5jb2xvcnMubWFwKGhleFRvUmdiKSk7XG4gIH1cblxuICBnZXRDdXN0b21NYXJrZXJzU2NhbGUocmFuZ2UsIGZhbGxiYWNrSWNvbikge1xuICAgIGxldCB1bmtub3duVmFsdWUgPSBmYWxsYmFja0ljb24gfHwgRkFMTEJBQ0tfSUNPTjtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICByZXR1cm4gKCkgPT4gdW5rbm93blZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcHBpbmcgPSBuZXcgTWFwKCk7XG5cbiAgICBpZiAocmFuZ2Uub3RoZXJzTWFya2VyKSB7XG4gICAgICB1bmtub3duVmFsdWUgPSByYW5nZS5vdGhlcnNNYXJrZXI7XG4gICAgfVxuICAgIGZvciAoY29uc3Qge3ZhbHVlLCBtYXJrZXJVcmx9IG9mIHJhbmdlLm1hcmtlck1hcCkge1xuICAgICAgaWYgKG1hcmtlclVybCkge1xuICAgICAgICBtYXBwaW5nLnNldCh2YWx1ZSwgbWFya2VyVXJsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlIGQzIHNjYWxlXG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZU9yZGluYWwoKVxuICAgICAgLmRvbWFpbihBcnJheS5mcm9tKG1hcHBpbmcua2V5cygpKSlcbiAgICAgIC5yYW5nZShBcnJheS5mcm9tKG1hcHBpbmcudmFsdWVzKCkpKVxuICAgICAgLnVua25vd24odW5rbm93blZhbHVlKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIHZpc3VhbCBjaGFubmVscyB0byBkZWNrLmdsIGFjY2Vzb3JzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbSBQYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtLmRhdGFBY2Nlc3NvciBBY2Nlc3Mga2VwbGVyLmdsIGxheWVyIGRhdGEgZnJvbSBkZWNrLmdsIGxheWVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KCd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnKS5EYXRhQ29udGFpbmVySW50ZXJmYWNlfSBwYXJhbS5kYXRhQ29udGFpbmVyIERhdGFDb250YWluZXIgdG8gdXNlIHVzZSB3aXRoIGRhdGFBY2Nlc3NvclxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGF0dHJpYnV0ZUFjY2Vzc29ycyAtIGRlY2suZ2wgbGF5ZXIgYXR0cmlidXRlIGFjY2Vzc29yc1xuICAgKi9cbiAgZ2V0QXR0cmlidXRlQWNjZXNzb3JzKHtkYXRhQWNjZXNzb3IgPSBkZWZhdWx0RGF0YUFjY2Vzc29yLCBkYXRhQ29udGFpbmVyfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZUFjY2Vzc29ycyA9IHt9O1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICBPYmplY3Qua2V5cyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmaWVsZCxcbiAgICAgICAgZml4ZWQsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICBkb21haW4sXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBhY2Nlc3NvcixcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICAgICAgbnVsbFZhbHVlLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlLFxuICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgfSA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG5cbiAgICAgIGNvbnN0IHNob3VsZEdldFNjYWxlID0gQm9vbGVhbihcbiAgICAgICAgKHNjYWxlIHx8IGNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmlkZW50aXR5KSAmJiB0aGlzLmNvbmZpZ1tmaWVsZF1cbiAgICAgICk7XG5cbiAgICAgIGlmIChzaG91bGRHZXRTY2FsZSkge1xuICAgICAgICBjb25zdCBhcmdzID0gW3RoaXMuY29uZmlnW3NjYWxlXSwgdGhpcy5jb25maWdbZG9tYWluXSwgdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXV07XG4gICAgICAgIGNvbnN0IGlzRml4ZWQgPSBmaXhlZCAmJiB0aGlzLmNvbmZpZy52aXNDb25maWdbZml4ZWRdO1xuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBkZWNsYXJlIGFzIGNvbnN0IGFsbCB0aGUgcGFyYW1ldGVycyB0aGF0IHdlIGFyZSBnb2luZyB0byBiZSB1c2UgaW4gdGhlIGdldEVuY29kZWRDaGFubmVsVmFsdWUgY2FsbFxuICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBvbGRMYXllckRhdGEgcGFyYW1ldGVyIGluIGZvcm1hdExheWVyRGF0YSBtZXRob2Qgd2lsbCBiZSB3cm9uZyAoeW91IGNhbiBjaGVjayB0aGUgZm9ybWF0TGF5ZXJEYXRhIFRpbGVMYXllciBtZXRob2QgaW4gQnVpbGRlciBhcyBleGFtcGxlKVxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IHRoaXMuY29uZmlnW2ZpZWxkXTtcbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25WYWx1ZSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1thZ2dyZWdhdGlvbl07XG5cbiAgICAgICAgY29uc3Qgc2NhbGVGdW5jdGlvbiA9XG4gICAgICAgICAgY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuaWRlbnRpdHlcbiAgICAgICAgICAgID8gc2NhbGVJZGVudGl0eVxuICAgICAgICAgICAgOiBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5jb2xvclxuICAgICAgICAgICAgPyB0aGlzLmdldENvbG9yU2NhbGUoLi4uYXJncylcbiAgICAgICAgICAgIDogY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuY3VzdG9tTWFya2VyXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q3VzdG9tTWFya2Vyc1NjYWxlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0sXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnLmN1c3RvbU1hcmtlcnNVcmxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZSguLi5hcmdzLCBpc0ZpeGVkKTtcblxuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZCA9PlxuICAgICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSh7XG4gICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgZGF0YUNvbnRhaW5lcixcbiAgICAgICAgICAgIHNjYWxlOiBzY2FsZUZ1bmN0aW9uLFxuICAgICAgICAgICAgZGF0YTogZGF0YUFjY2Vzc29yKGRhdGFDb250YWluZXIpKGQpLFxuICAgICAgICAgICAgZmllbGQ6IGZpZWxkQ29uZmlnLFxuICAgICAgICAgICAgX2FnZ3JlZ2F0aW9uOiBhZ2dyZWdhdGlvblZhbHVlLFxuICAgICAgICAgICAgbnVsbFZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBnZXRBdHRyaWJ1dGVWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZ2V0QXR0cmlidXRlVmFsdWUodGhpcy5jb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlQWNjZXNzb3JzW2FjY2Vzc29yXSA9XG4gICAgICAgICAgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRWYWx1ZSh0aGlzLmNvbmZpZykgOiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghKGFjY2Vzc29yIGluIGF0dHJpYnV0ZUFjY2Vzc29ycykpIHtcbiAgICAgICAgQ29uc29sZS53YXJuKGBGYWlsZWQgdG8gcHJvdmlkZSBhY2Nlc3NvciBmdW5jdGlvbiBmb3IgJHthY2Nlc3NvciB8fCBjaGFubmVsfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZUFjY2Vzc29ycztcbiAgfVxuXG4gIGdldFZpc0NoYW5uZWxTY2FsZShzY2FsZSwgZG9tYWluLCByYW5nZSwgZml4ZWQpIHtcbiAgICBpZiAoc2NhbGUgPT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgZDMtc2NhbGUgdHlwZVxuICAgICAgcmV0dXJuIFNDQUxFX0ZVTkNbc2NhbGVdKClcbiAgICAgICAgLmRvbWFpbihkb21haW4uc2xpY2UoMCwgcmFuZ2UubGVuZ3RoKSlcbiAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAudW5rbm93bihVTktOT1dOX0NPTE9SKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgYGNvdW50YCBhZ2dyZWdhdGlvbiwgd2UgZG9tYWluIGlzIGFjdHVhbGx5IGBbMCwgSW5maW5pdHldYCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2VcbiAgICAvLyB0byB1c2UgaXQsIHNvIHNraXAgc3BlY3lmeWluZyB0aGlzIGRvbWFpbnNcbiAgICBjb25zdCBkb21haW5Jc0luZmluaXRlID0gZG9tYWluICYmIChkb21haW5bMF0gPT09IDAgJiYgZG9tYWluWzFdID09PSBJbmZpbml0eSk7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3J5ID0gU0NBTEVfRlVOQ1tmaXhlZCA/ICdsaW5lYXInIDogc2NhbGVdO1xuICAgIC8vIEB0cy1pZ25vcmUgZDMtc2NhbGUgdHlwZVxuICAgIGxldCByZXN1bHQgPSBzY2FsZUZhY3RvcnkoKTtcbiAgICBpZiAoZG9tYWluICYmICFkb21haW5Jc0luZmluaXRlKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZG9tYWluKGRvbWFpbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQucmFuZ2UoZml4ZWQgPyBkb21haW4gOiByYW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgYm91bmRzIG9mIHRoZSBkYXRhLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJykuRGF0YUNvbnRhaW5lckludGVyZmFjZX0gZGF0YUNvbnRhaW5lciBEYXRhQ29udGFpbmVyIHRvIGNhbGN1bGF0ZSBib3VuZHMgZm9yLlxuICAgKiBAcGFyYW0geyhkOiB7aW5kZXg6IG51bWJlcn0sIGRjOiBpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2UpID0+IG51bWJlcltdfSBnZXRQb3NpdGlvbiBBY2Nlc3Mga2VwbGVyLmdsIGxheWVyIGRhdGEgZnJvbSBkZWNrLmdsIGxheWVyXG4gICAqIEByZXR1cm4ge251bWJlcltdfG51bGx9IGJvdW5kcyBvZiB0aGUgZGF0YS5cbiAgICovXG4gIGdldFBvaW50c0JvdW5kcyhkYXRhQ29udGFpbmVyLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIG5vIG5lZWQgdG8gbG9vcCB0aHJvdWdoIHRoZSBlbnRpcmUgZGF0YXNldFxuICAgIC8vIGdldCBhIHNhbXBsZSBvZiBkYXRhIHRvIGNhbGN1bGF0ZSBib3VuZHNcbiAgICBjb25zdCBzYW1wbGVEYXRhID1cbiAgICAgIGRhdGFDb250YWluZXIubnVtUm93cygpID4gTUFYX1NBTVBMRV9TSVpFXG4gICAgICAgID8gZ2V0U2FtcGxlRGF0YShkYXRhQ29udGFpbmVyLCBNQVhfU0FNUExFX1NJWkUpXG4gICAgICAgIDogZGF0YUNvbnRhaW5lcjtcblxuICAgIGNvbnN0IHBvaW50cyA9IHNhbXBsZURhdGEubWFwSW5kZXgoZ2V0UG9zaXRpb24pO1xuXG4gICAgY29uc3QgbGF0Qm91bmRzID0gZ2V0TGF0TG5nQm91bmRzKHBvaW50cywgMSwgWy05MCwgOTBdKTtcbiAgICBjb25zdCBsbmdCb3VuZHMgPSBnZXRMYXRMbmdCb3VuZHMocG9pbnRzLCAwLCBbLTE4MCwgMTgwXSk7XG5cbiAgICBpZiAoIWxhdEJvdW5kcyB8fCAhbG5nQm91bmRzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gW2xuZ0JvdW5kc1swXSwgbGF0Qm91bmRzWzBdLCBsbmdCb3VuZHNbMV0sIGxhdEJvdW5kc1sxXV07XG4gIH1cblxuICBnZXRDaGFuZ2VkVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzKSB7XG4gICAgY29uc3QgdHJpZ2dlckNoYW5nZWQgPSBkaWZmVXBkYXRlVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzLCB0aGlzLl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMpO1xuICAgIHRoaXMuX29sZERhdGFVcGRhdGVUcmlnZ2VycyA9IGRhdGFVcGRhdGVUcmlnZ2VycztcblxuICAgIHJldHVybiB0cmlnZ2VyQ2hhbmdlZDtcbiAgfVxuXG4gIGdldEVuY29kZWRDaGFubmVsVmFsdWUoe1xuICAgIGNoYW5uZWwsXG4gICAgc2NhbGUsXG4gICAgZGF0YSxcbiAgICBmaWVsZCxcbiAgICBkYXRhQ29udGFpbmVyLFxuICAgIC8vIEluIGJ1aWxkZXIgd2Ugb3ZlcndyaXRlIHRoZSBnZXRWYWx1ZSBmdW5jdGlvbiBhbmQgd2UgdXNlIHRoZSBfYWdncmVnYXRpb24gcGFyYW1ldGVyIGluIHNwYXRpYWwgaW5kZXggbGF5ZXJzIGFzIHRoZSBRdWFka2V5TGF5ZXIuXG4gICAgX2FnZ3JlZ2F0aW9uLFxuICAgIG51bGxWYWx1ZSA9IE5PX1ZBTFVFX0NPTE9SLFxuICAgIGdldFZhbHVlID0gZGVmYXVsdEdldEZpZWxkVmFsdWVcbiAgfSkge1xuICAgIGxldCBjb2xvckNvbHVtblZhbHVlO1xuICAgIGNvbnN0IHt0eXBlfSA9IGZpZWxkO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0VmFsdWUoZmllbGQsIGRhdGEpO1xuICAgIGNvbnN0IGNoYW5uZWxDb25maWcgPSB0aGlzLmNvbmZpZy52aXNDb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXS5yYW5nZV07XG4gICAgY29uc3QgY2hhbm5lbEZpZWxkID0gdGhpcy5jb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXS5maWVsZF07XG5cbiAgICBpZiAoY2hhbm5lbENvbmZpZy50eXBlID09PSBoZXhDb2xvcikge1xuICAgICAgY29uc3QgY29sdW1uRmllbGQgPSB7XG4gICAgICAgIGlkOiBjaGFubmVsRmllbGQuY29sb3JDb2x1bW4sXG4gICAgICAgIG5hbWU6IGNoYW5uZWxGaWVsZC5jb2xvckNvbHVtbixcbiAgICAgICAgZmllbGRJZHg6IGNoYW5uZWxGaWVsZC5jb2xvckNvbHVtbklkeCxcbiAgICAgICAgdmFsdWVBY2Nlc3NvcjogZCA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRhdGFDb250YWluZXIudmFsdWVBdChkLmluZGV4LCBjaGFubmVsRmllbGQuY29sb3JDb2x1bW5JZHgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb2xvckNvbHVtblZhbHVlID0gZ2V0VmFsdWUoY29sdW1uRmllbGQsIGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoIW5vdE51bGxvclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsVmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGF0dHJpYnV0ZVZhbHVlO1xuICAgIGlmICh0eXBlID09PSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wKSB7XG4gICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBjb252ZXJ0IGhlcmVcbiAgICAgIC8vIHNjYWxlIEZ1bmN0aW9uIHNob3VsZCB0YWtlIGNhcmUgb2YgaXRcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gc2NhbGUobmV3IERhdGUodmFsdWUpLCBjb2xvckNvbHVtblZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cmlidXRlVmFsdWUgPSBzY2FsZSh2YWx1ZSwgY29sb3JDb2x1bW5WYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCFub3ROdWxsb3JVbmRlZmluZWQoYXR0cmlidXRlVmFsdWUpKSB7XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IG51bGxWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWU7XG4gIH1cblxuICB1cGRhdGVNZXRhKG1ldGEpIHtcbiAgICB0aGlzLm1ldGEgPSB7Li4udGhpcy5tZXRhLCAuLi5tZXRhfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyTGVnZW5kKHNldHRpbmdzKSB7XG4gICAgdGhpcy5sZWdlbmRTZXR0aW5ncyA9IHNldHRpbmdzO1xuICB9XG5cbiAgZ2V0RGF0YVVwZGF0ZVRyaWdnZXJzKHtmaWx0ZXJlZEluZGV4LCBpZCwgYWxsRGF0YX0pIHtcbiAgICBjb25zdCB7Y29sdW1uc30gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiB7XG4gICAgICBnZXREYXRhOiB7ZGF0YXNldElkOiBpZCwgYWxsRGF0YSwgY29sdW1ucywgZmlsdGVyZWRJbmRleH0sXG4gICAgICBnZXRNZXRhOiB7ZGF0YXNldElkOiBpZCwgYWxsRGF0YSwgY29sdW1uc30sXG4gICAgICAuLi4odGhpcy5jb25maWcudGV4dExhYmVsIHx8IFtdKS5yZWR1Y2UoXG4gICAgICAgIChhY2N1LCB0bCwgaSkgPT4gKHtcbiAgICAgICAgICAuLi5hY2N1LFxuICAgICAgICAgIFtgZ2V0TGFiZWxDaGFyYWN0ZXJTZXQtJHtpfWBdOiB0bC5maWVsZCA/IHRsLmZpZWxkLm5hbWUgOiBudWxsXG4gICAgICAgIH0pLFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmRhdGFJZCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KGRhdGFzZXRzKTtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0O1xuXG4gICAgdGhpcy51cGRhdGVWaXN1YWxDaGFubmVsRmllbGRzKGRhdGFzZXQpO1xuICAgIHRoaXMudXBkYXRlSGV4Q29sb3JEb21haW4oZGF0YXNldCk7XG5cbiAgICBjb25zdCBnZXRQb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvcihkYXRhQ29udGFpbmVyKTtcbiAgICBjb25zdCBkYXRhVXBkYXRlVHJpZ2dlcnMgPSB0aGlzLmdldERhdGFVcGRhdGVUcmlnZ2VycyhkYXRhc2V0KTtcbiAgICBjb25zdCB0cmlnZ2VyQ2hhbmdlZCA9IHRoaXMuZ2V0Q2hhbmdlZFRyaWdnZXJzKGRhdGFVcGRhdGVUcmlnZ2Vycyk7XG5cbiAgICBpZiAodHJpZ2dlckNoYW5nZWQuZ2V0TWV0YSkge1xuICAgICAgdGhpcy51cGRhdGVMYXllck1ldGEoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIGxldCBkYXRhID0gW107XG5cbiAgICBpZiAoIXRyaWdnZXJDaGFuZ2VkLmdldERhdGEgJiYgb2xkTGF5ZXJEYXRhICYmIG9sZExheWVyRGF0YS5kYXRhKSB7XG4gICAgICAvLyBzYW1lIGRhdGFcbiAgICAgIGRhdGEgPSBvbGRMYXllckRhdGEuZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSA9IHRoaXMuY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZShkYXRhc2V0LCBnZXRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtkYXRhLCB0cmlnZ2VyQ2hhbmdlZH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHN0eWxlZCBmaWVsZHMgdG8gbWF0Y2ggb25lcyBmcm9tIG5ldyBkYXRhc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YXNldFxuICAgKi9cbiAgdXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyhkYXRhc2V0KSB7XG4gICAgZm9yIChjb25zdCB7ZmllbGQsIHJhbmdlfSBvZiBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpKSB7XG4gICAgICBjb25zdCBvbGRGaWVsZCA9IHRoaXMuY29uZmlnW2ZpZWxkXTtcbiAgICAgIGNvbnN0IGlzVXNpbmdIZXhDb2xvckNvZGUgPSB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdPy5oZXhDb2xvcjtcbiAgICAgIGlmICghb2xkRmllbGQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IG5ld0RhdGFTZXRGaWVsZCA9IGRhdGFzZXQuZmllbGRzLmZpbmQoZmQgPT4gZmQubmFtZSA9PT0gb2xkRmllbGQubmFtZSkgfHwgbnVsbDtcbiAgICAgIGlmIChpc1VzaW5nSGV4Q29sb3JDb2RlKSB7XG4gICAgICAgIG5ld0RhdGFTZXRGaWVsZCA9IHtcbiAgICAgICAgICAuLi5uZXdEYXRhU2V0RmllbGQsXG4gICAgICAgICAgY29sb3JDb2x1bW46IG5ld0RhdGFTZXRGaWVsZC5jb2xvckNvbHVtbiB8fCBvbGRGaWVsZC5jb2xvckNvbHVtbixcbiAgICAgICAgICBjb2xvckNvbHVtbklkeDogbmV3RGF0YVNldEZpZWxkLmNvbG9yQ29sdW1uSWR4IHx8IG9sZEZpZWxkLmNvbG9yQ29sdW1uSWR4XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbZmllbGRdOiBuZXdEYXRhU2V0RmllbGR9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSBvbmUgbGF5ZXIgZG9tYWluIHdoZW4gc3RhdGUuZGF0YSBjaGFuZ2VkXG4gICAqIGlmIHN0YXRlLmRhdGEgY2hhbmdlIGlzIGR1ZSBvdCB1cGRhdGUgZmlsdGVyLCBuZXdGaWxlciB3aWxsIGJlIHBhc3NlZFxuICAgKiBjYWxsZWQgYnkgdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0c1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmV3RmlsdGVyXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IGxheWVyXG4gICAqL1xuICB1cGRhdGVMYXllckRvbWFpbihkYXRhc2V0cywgbmV3RmlsdGVyKSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLmdldERhdGFzZXQoZGF0YXNldHMpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICBjb25zdCB7c2NhbGV9ID0gY2hhbm5lbDtcbiAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IHRoaXMuY29uZmlnW3NjYWxlXTtcblxuICAgICAgLy8gb3JkaW5hbCBkb21haW4gaXMgYmFzZWQgb24gZGF0YUNvbnRhaW5lciwgaWYgb25seSBmaWx0ZXIgY2hhbmdlZFxuICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUgb3JkaW5hbCBkb21haW5cbiAgICAgIGlmICghbmV3RmlsdGVyIHx8IHNjYWxlVHlwZSAhPT0gU0NBTEVfVFlQRVMub3JkaW5hbCkge1xuICAgICAgICBjb25zdCB7ZG9tYWlufSA9IGNoYW5uZWw7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREb21haW4gPSB0aGlzLmNhbGN1bGF0ZUxheWVyRG9tYWluKHRhYmxlLCBjaGFubmVsKTtcbiAgICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W2RvbWFpbl06IHVwZGF0ZWREb21haW59KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0RGF0YXNldChkYXRhc2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhSWQgPyBkYXRhc2V0c1t0aGlzLmNvbmZpZy5kYXRhSWRdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB2aXN1YWwgY2hhbm5lbCBmaWVsZCBhbmQgc2NhbGVzIGJhc2VkIG9uIHN1cHBvcnRlZCBmaWVsZCAmIHNjYWxlIHR5cGVcbiAgICogQHBhcmFtIGNoYW5uZWxcbiAgICovXG4gIHZhbGlkYXRlVmlzdWFsQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgdGhpcy52YWxpZGF0ZUZpZWxkVHlwZShjaGFubmVsKTtcbiAgICB0aGlzLnZhbGlkYXRlU2NhbGUoY2hhbm5lbCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmllbGQgdHlwZSBiYXNlZCBvbiBjaGFubmVsU2NhbGVUeXBlXG4gICAqL1xuICB2YWxpZGF0ZUZpZWxkVHlwZShjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgY29uc3Qge2ZpZWxkLCBjaGFubmVsU2NhbGVUeXBlLCBzdXBwb3J0ZWRGaWVsZFR5cGVzfSA9IHZpc3VhbENoYW5uZWw7XG5cbiAgICBpZiAodGhpcy5jb25maWdbZmllbGRdKSB7XG4gICAgICAvLyBpZiBmaWVsZCBpcyBzZWxlY3RlZCwgY2hlY2sgaWYgZmllbGQgdHlwZSBpcyBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IGNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzID1cbiAgICAgICAgc3VwcG9ydGVkRmllbGRUeXBlcyB8fCBDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFNbY2hhbm5lbFNjYWxlVHlwZV07XG5cbiAgICAgIGlmICghY2hhbm5lbFN1cHBvcnRlZEZpZWxkVHlwZXMuaW5jbHVkZXModGhpcy5jb25maWdbZmllbGRdLnR5cGUpKSB7XG4gICAgICAgIC8vIGZpZWxkIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgc2V0IGl0IGJhY2sgdG8gbnVsbFxuICAgICAgICAvLyBzZXQgc2NhbGUgYmFjayB0byBkZWZhdWx0XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tmaWVsZF06IG51bGx9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc2NhbGUgdHlwZSBiYXNlZCBvbiBhZ2dyZWdhdGlvblxuICAgKi9cbiAgdmFsaWRhdGVTY2FsZShjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgY29uc3Qge3NjYWxlLCByYW5nZX0gPSB2aXN1YWxDaGFubmVsO1xuICAgIGlmIChcbiAgICAgICFzY2FsZSB8fFxuICAgICAgKHRoaXMuaXNDb2xvcmVkQnlDb2xvckNvbHVtbihyYW5nZSkgJiYgdGhpcy5jb25maWdbc2NhbGVdID09PSBTQ0FMRV9UWVBFUy5pZGVudGl0eSlcbiAgICApIHtcbiAgICAgIC8vIHZpc3VhbENoYW5uZWwgZG9lc24ndCBoYXZlIHNjYWxlXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjYWxlT3B0aW9ucyA9IHRoaXMuZ2V0U2NhbGVPcHRpb25zKGNoYW5uZWwpO1xuICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgc2VsZWN0ZWQgc2NhbGUgaXNcbiAgICAvLyBzdXBwb3J0ZWQsIGlmIG5vdCwgY2hhbmdlIHRvIGRlZmF1bHRcbiAgICBpZiAoIXNjYWxlT3B0aW9ucy5pbmNsdWRlcyh0aGlzLmNvbmZpZ1tzY2FsZV0pKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbc2NhbGVdOiBzY2FsZU9wdGlvbnNbMF19KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNjYWxlIG9wdGlvbnMgYmFzZWQgb24gY3VycmVudCBmaWVsZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBnZXRTY2FsZU9wdGlvbnMoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtmaWVsZCwgc2NhbGUsIGNoYW5uZWxTY2FsZVR5cGV9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZ1tmaWVsZF1cbiAgICAgID8gRklFTERfT1BUU1t0aGlzLmNvbmZpZ1tmaWVsZF0udHlwZV0uc2NhbGVbY2hhbm5lbFNjYWxlVHlwZV1cbiAgICAgIDogW3RoaXMuZ2V0RGVmYXVsdExheWVyQ29uZmlnKClbc2NhbGVdXTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbChkYXRhc2V0LCBjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgdGhpcy52YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbCk7XG4gICAgLy8gY2FsY3VsYXRlIGxheWVyIGNoYW5uZWwgZG9tYWluXG4gICAgY29uc3QgdXBkYXRlZERvbWFpbiA9IHRoaXMuY2FsY3VsYXRlTGF5ZXJEb21haW4oZGF0YXNldCwgdmlzdWFsQ2hhbm5lbCk7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W3Zpc3VhbENoYW5uZWwuZG9tYWluXTogdXBkYXRlZERvbWFpbn0pO1xuICB9XG5cbiAgZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzKCkge1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKHZpc3VhbENoYW5uZWwgPT4ge1xuICAgICAgLy8gZmllbGQgcmFuZ2Ugc2NhbGUgZG9tYWluXG4gICAgICBjb25zdCB7YWNjZXNzb3IsIGZpZWxkLCBzY2FsZSwgZG9tYWluLCByYW5nZSwgZGVmYXVsdFZhbHVlLCBmaXhlZH0gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7XG4gICAgICAgIFtmaWVsZF06IHRoaXMuY29uZmlnW2ZpZWxkXSxcbiAgICAgICAgW3NjYWxlXTogdGhpcy5jb25maWdbc2NhbGVdLFxuICAgICAgICBbZG9tYWluXTogdGhpcy5jb25maWdbZG9tYWluXSxcbiAgICAgICAgW3JhbmdlXTogdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFZhbHVlKHRoaXMuY29uZmlnKSA6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgLi4uKGZpeGVkID8ge1tmaXhlZF06IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tmaXhlZF19IDoge30pXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGNhbGN1bGF0ZUxheWVyRG9tYWluKGRhdGFzZXQsIHZpc3VhbENoYW5uZWwpIHtcbiAgICBjb25zdCB7c2NhbGV9ID0gdmlzdWFsQ2hhbm5lbDtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnW3Zpc3VhbENoYW5uZWwuZmllbGRdO1xuICAgIGlmICghZmllbGQgfHwgIXNjYWxlKSB7XG4gICAgICAvLyBpZiBjb2xvckZpZWxkIG9yIHNpemVGaWVsZCB3ZXJlIHNldCBiYWNrIHRvIG51bGxcbiAgICAgIHJldHVybiBkZWZhdWx0RG9tYWluO1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlVHlwZSA9IHRoaXMuY29uZmlnW3NjYWxlXTtcbiAgICBjb25zdCBkYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICBpZiAoIXNjYWxlVHlwZSB8fCAhZGF0YVNldEZpZWxkKSB7XG4gICAgICAvLyBpZiBuZXcgZGF0YXNldCBkb2Vzbid0IGNvbnRhaW4gcHJldmlvdXNseSBzZXQgZmllbGRcbiAgICAgIHJldHVybiBkZWZhdWx0RG9tYWluO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhc2V0LmdldENvbHVtbkxheWVyRG9tYWluKGRhdGFTZXRGaWVsZCwgc2NhbGVUeXBlKSB8fCBkZWZhdWx0RG9tYWluO1xuICB9XG5cbiAgdXBkYXRlSGV4Q29sb3JEb21haW4oZGF0YXNldCkge1xuICAgIGlmICghZGF0YXNldCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIGNvbnN0IGNoYW5uZWxDb25maWcgPSB0aGlzLmNvbmZpZy52aXNDb25maWdbY2hhbm5lbC5yYW5nZV07XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnW2NoYW5uZWwuZmllbGRdO1xuXG4gICAgICBpZiAoY2hhbm5lbENvbmZpZz8udHlwZSA9PT0gaGV4Q29sb3IgJiYgZmllbGQ/LmNvbG9yQ29sdW1uKSB7XG4gICAgICAgIGNvbnN0IGRhdGFTZXRGaWVsZCA9IGRhdGFzZXQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZpZWxkLmNvbG9yQ29sdW1uKTtcbiAgICAgICAgY29uc3QgY29sb3JzID0gZGF0YXNldFxuICAgICAgICAgIC5nZXRDb2x1bW5MYXllckRvbWFpbihkYXRhU2V0RmllbGQsIFNDQUxFX1RZUEVTLm9yZGluYWwpXG4gICAgICAgICAgLm1hcChjID0+IGNoZWNrQ29sb3JPckZhbGxiYWNrKGMpKTtcbiAgICAgICAgdGhpcy51cGRhdGVMYXllclZpc0NvbmZpZyh7XG4gICAgICAgICAgW2NoYW5uZWwucmFuZ2VdOiB7Li4uY2hhbm5lbENvbmZpZywgY29sb3JzfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2FsY3VsYXRlSGV4Q29sdW1uTGVnZW5kKGRhdGFzZXRzKSB7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldChkYXRhc2V0cyk7XG4gICAgaWYgKCFkYXRhc2V0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlZ2VuZFNldHRpbmdzID0gT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykucmVkdWNlKChsZWdlbmRzLCBjaGFubmVsKSA9PiB7XG4gICAgICBjb25zdCB7cmFuZ2UsIGZpZWxkOiBjaGFubmVsRmllbGR9ID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICAgIGNvbnN0IGNoYW5uZWxDb25maWcgPSB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZ1tjaGFubmVsRmllbGRdO1xuXG4gICAgICBpZiAoY2hhbm5lbENvbmZpZz8udHlwZSA9PT0gaGV4Q29sb3IgJiYgZmllbGQ/LmNvbG9yQ29sdW1uKSB7XG4gICAgICAgIGNvbnN0IGRhdGFTZXRGaWVsZCA9IGRhdGFzZXQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZpZWxkLmNvbG9yQ29sdW1uKTtcbiAgICAgICAgY29uc3QgbGVnZW5kID0gZGF0YXNldC5jYWxjdWxhdGVMZWdlbmQoZmllbGQsIGRhdGFTZXRGaWVsZCk7XG4gICAgICAgIGxlZ2VuZHNbY2hhbm5lbF0gPSBsZWdlbmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVnZW5kcztcbiAgICB9LCB7fSk7XG4gICAgdGhpcy51cGRhdGVMYXllckxlZ2VuZChsZWdlbmRTZXR0aW5ncyk7XG4gIH1cblxuICBoYXNIb3ZlcmVkT2JqZWN0KG9iamVjdEluZm8pIHtcbiAgICByZXR1cm4gdGhpcy5pc0xheWVySG92ZXJlZChvYmplY3RJbmZvKSAmJiBvYmplY3RJbmZvLm9iamVjdCA/IG9iamVjdEluZm8ub2JqZWN0IDogbnVsbDtcbiAgfVxuXG4gIGlzTGF5ZXJIb3ZlcmVkKG9iamVjdEluZm8pIHtcbiAgICByZXR1cm4gb2JqZWN0SW5mbz8ucGlja2VkICYmIG9iamVjdEluZm8/LmxheWVyPy5wcm9wcz8uaWQgPT09IHRoaXMuaWQ7XG4gIH1cblxuICBnZXRSYWRpdXNTY2FsZUJ5Wm9vbShtYXBTdGF0ZSkge1xuICAgIGNvbnN0IHJhZGl1c0NoYW5uZWwgPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZpbmQodmMgPT4gdmMucHJvcGVydHkgPT09ICdyYWRpdXMnKTtcblxuICAgIGlmICghcmFkaXVzQ2hhbm5lbCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGQgPSByYWRpdXNDaGFubmVsLmZpZWxkO1xuICAgIGNvbnN0IHtyYWRpdXN9ID0gdGhpcy5jb25maWcudmlzQ29uZmlnO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiAodGhpcy5jb25maWdbZmllbGRdID8gMSA6IHJhZGl1cykgKiB0aGlzLmdldFpvb21GYWN0b3IobWFwU3RhdGUpO1xuICB9XG5cbiAgZ2V0UmFkaXVzU2NhbGUoKSB7XG4gICAgY29uc3QgcmFkaXVzQ2hhbm5lbCA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YyA9PiB2Yy5wcm9wZXJ0eSA9PT0gJ3JhZGl1cycpO1xuXG4gICAgaWYgKCFyYWRpdXNDaGFubmVsIHx8IHRoaXMuY29uZmlnW3JhZGl1c0NoYW5uZWwuZmllbGRdKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcudmlzQ29uZmlnLnJhZGl1cztcbiAgfVxuXG4gIGdldE1heE1hcmtlclNpemUoKSB7XG4gICAgY29uc3Qge3JhZGl1c0ZpZWxkLCBzaXplRmllbGQsIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB7cmFkaXVzUmFuZ2UsIHJhZGl1c30gPSB2aXNDb25maWc7XG4gICAgY29uc3QgZmllbGQgPSByYWRpdXNGaWVsZCB8fCBzaXplRmllbGQ7XG4gICAgcmV0dXJuIE1hdGguY2VpbCgoZmllbGQgJiYgcmFkaXVzUmFuZ2UgPyByYWRpdXNSYW5nZVsxXSA6IHJhZGl1cykpO1xuICB9XG5cbiAgc2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnNvbWUocCA9PiAhdGhpcy5ub25lTGF5ZXJEYXRhQWZmZWN0aW5nUHJvcHMuaW5jbHVkZXMocCkpO1xuICB9XG5cbiAgZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyhpbnRlcmFjdGlvbkNvbmZpZywgYnJ1c2hpbmdUYXJnZXQpIHtcbiAgICBjb25zdCB7YnJ1c2h9ID0gaW50ZXJhY3Rpb25Db25maWc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gYnJ1c2hpbmdcbiAgICAgIGF1dG9IaWdobGlnaHQ6ICFicnVzaC5lbmFibGVkLFxuICAgICAgYnJ1c2hpbmdSYWRpdXM6IGJydXNoLmNvbmZpZy5zaXplICogMTAwMCxcbiAgICAgIGJydXNoaW5nVGFyZ2V0OiBicnVzaGluZ1RhcmdldCB8fCAnc291cmNlJyxcbiAgICAgIGJydXNoaW5nRW5hYmxlZDogYnJ1c2guZW5hYmxlZFxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0RGVja0xheWVyUHJvcHMoe2lkeCwgZ3B1RmlsdGVyLCBtYXBTdGF0ZSwgdmlzaWJsZSwgbWFza1BvbHlnb259KSB7XG4gICAgY29uc3QgbWFza0V4dGVuc2lvblByb3BzID0gZ2V0TWFza0V4dGVuc2lvblByb3BzKG1hc2tQb2x5Z29uKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWFza0V4dGVuc2lvblByb3BzLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpZHgsXG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5MTkdMQVQsXG4gICAgICBwaWNrYWJsZTogdGhpcy5oYXNJbnRlcmFjdGl2aXR5LFxuICAgICAgd3JhcExvbmdpdHVkZTogdHJ1ZSxcbiAgICAgIHBhcmFtZXRlcnM6IHtkZXB0aFRlc3Q6IEJvb2xlYW4obWFwU3RhdGUuZHJhZ1JvdGF0ZSB8fCB0aGlzLmNvbmZpZy52aXNDb25maWcuZW5hYmxlM2QpfSxcbiAgICAgIGhpZGRlbjogdGhpcy5jb25maWcuaGlkZGVuLFxuICAgICAgdmlzaWJpbGl0eUJ5Wm9vbTogdGhpcy5jb25maWcudmlzaWJpbGl0eUJ5Wm9vbSxcbiAgICAgIC8vIHZpc2NvbmZpZ1xuICAgICAgb3BhY2l0eTogdGhpcy5jb25maWcudmlzQ29uZmlnLm9wYWNpdHksXG4gICAgICBoaWdobGlnaHRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAvLyBkYXRhIGZpbHRlcmluZ1xuICAgICAgZXh0ZW5zaW9uczogW2RhdGFGaWx0ZXJFeHRlbnNpb24sIC4uLm1hc2tFeHRlbnNpb25Qcm9wcy5leHRlbnNpb25zXSxcbiAgICAgIGZpbHRlclJhbmdlOiBncHVGaWx0ZXIgPyBncHVGaWx0ZXIuZmlsdGVyUmFuZ2UgOiB1bmRlZmluZWQsXG4gICAgICAvLyBsYXllciBzaG91bGQgYmUgdmlzaWJsZSBhbmQgaWYgc3BsaXRNYXAsIHNob3duIGluIHRvIG9uZSBvZiBwYW5lbFxuICAgICAgdmlzaWJsZTogdGhpcy5jb25maWcuaXNWaXNpYmxlICYmIHZpc2libGVcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGAke3RoaXMuaWR9LWhvdmVyZWRgLFxuICAgICAgcGlja2FibGU6IGZhbHNlLFxuICAgICAgd3JhcExvbmdpdHVkZTogdHJ1ZSxcbiAgICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkxOR0xBVFxuICAgIH07XG4gIH1cblxuICByZW5kZXJUZXh0TGFiZWxMYXllcihcbiAgICB7Z2V0UG9zaXRpb24sIGdldFJhZGl1cywgcmFkaXVzU2NhbGUsIHVwZGF0ZVRyaWdnZXJzLCBzaGFyZWRQcm9wc30sXG4gICAgcmVuZGVyT3B0c1xuICApIHtcbiAgICBjb25zdCB7ZGF0YX0gPSByZW5kZXJPcHRzO1xuICAgIGNvbnN0IHt0ZXh0TGFiZWwsIHZpc2liaWxpdHlCeVpvb219ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsuLi5zaGFyZWRQcm9wcy5leHRlbnNpb25zLCBjb2xsaXNpb25GaWx0ZXJFeHRlbnNpb25dO1xuXG4gICAgaWYgKCFkYXRhIHx8ICFkYXRhLnRleHRMYWJlbHMgfHwgIWRhdGEudGV4dExhYmVsc1swXSB8fCAhZGF0YS50ZXh0TGFiZWxzWzBdLmdldFRleHQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBbbWFpbkxhYmVsLCBzZWNvbmRhcnlMYWJlbF0gPSB0ZXh0TGFiZWw7XG4gICAgY29uc3Qge1xuICAgICAgYWxpZ25tZW50LFxuICAgICAgYW5jaG9yLFxuICAgICAgY29sb3I6IGdldENvbG9yLFxuICAgICAgZmllbGQ6IG1haW5GaWVsZCxcbiAgICAgIG91dGxpbmVDb2xvcixcbiAgICAgIHNpemU6IHNpemVTY2FsZVxuICAgIH0gPSBtYWluTGFiZWw7XG4gICAgY29uc3Qge1xuICAgICAgY29sb3I6IGdldFNlY29uZGFyeUNvbG9yLFxuICAgICAgZmllbGQ6IHNlY29uZGFyeUZpZWxkLFxuICAgICAgb3V0bGluZUNvbG9yOiBzZWNvbmRhcnlPdXRsaW5lQ29sb3IsXG4gICAgICBzaXplOiBzZWNvbmRhcnlTaXplU2NhbGVcbiAgICB9ID0gc2Vjb25kYXJ5TGFiZWwgfHwge307XG5cbiAgICByZXR1cm4gW1xuICAgICAgbmV3IFBvaW50TGFiZWxMYXllcih7XG4gICAgICAgIC4uLnNoYXJlZFByb3BzLFxuXG4gICAgICAgIC8vIFJlY3JlYXRlIGxheWVyIHdoZW4gbGFiZWxzIGNoYW5nZSBvdGhlcndpc2UgcmVuZGVyaW5nIGJyZWFrc1xuICAgICAgICAvLyBUT0RPIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHdpdGggdXBkYXRlVHJpZ2dlcnM/XG4gICAgICAgIGlkOiBgJHt0aGlzLmlkfS0ke21haW5GaWVsZD8ubmFtZX0tJHtzZWNvbmRhcnlGaWVsZD8ubmFtZX0tbGFiZWxgLFxuICAgICAgICBkYXRhOiBkYXRhLmRhdGEsXG4gICAgICAgIHZpc2liaWxpdHlCeVpvb20sXG4gICAgICAgIGV4dGVuc2lvbnMsXG5cbiAgICAgICAgY2hhcmFjdGVyU2V0OiAnYXV0bycsXG4gICAgICAgIGNvbGxpc2lvbkVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNvbGxpc2lvbkdyb3VwOiBgJHt0aGlzLmlkfS1sYWJlbHNgLFxuXG4gICAgICAgIGdldFRleHQ6IGRhdGEudGV4dExhYmVsc1swXS5nZXRUZXh0LFxuICAgICAgICBnZXRDb2xvcixcbiAgICAgICAgc2l6ZVNjYWxlLFxuICAgICAgICBvdXRsaW5lQ29sb3IsXG5cbiAgICAgICAgLi4uKHNlY29uZGFyeUZpZWxkICYmIHtcbiAgICAgICAgICBnZXRTZWNvbmRhcnlUZXh0OiBkYXRhLnRleHRMYWJlbHNbMV0uZ2V0VGV4dCxcbiAgICAgICAgICBnZXRTZWNvbmRhcnlDb2xvcixcbiAgICAgICAgICBzZWNvbmRhcnlTaXplU2NhbGUsXG4gICAgICAgICAgc2Vjb25kYXJ5T3V0bGluZUNvbG9yXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIFBvc2l0aW9uXG4gICAgICAgIGdldFBvc2l0aW9uLFxuICAgICAgICBnZXRSYWRpdXMsXG4gICAgICAgIHJhZGl1c1NjYWxlLFxuICAgICAgICBnZXRUZXh0QW5jaG9yOiBhbmNob3IsXG4gICAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lOiBhbGlnbm1lbnQsXG5cbiAgICAgICAgLy8gU3R5bGVcbiAgICAgICAgZm9udEZhbWlseTogJ0ludGVyLCBzYW5zJyxcbiAgICAgICAgZm9udFNldHRpbmdzOiB7c2RmOiB0cnVlfSxcbiAgICAgICAgZm9udFdlaWdodDogNTAwLFxuICAgICAgICBvdXRsaW5lV2lkdGg6IDQsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAvLyB0ZXh0IHdpbGwgYWx3YXlzIHNob3cgb24gdG9wIG9mIGFsbCBsYXllcnNcbiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0RmlsdGVyVmFsdWU6IGRhdGEuZ2V0RmlsdGVyVmFsdWUsXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgLi4udXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgICAgZ2V0VGV4dDogbWFpbkZpZWxkPy5uYW1lLFxuICAgICAgICAgIGdldENvbG9yOiBtYWluRmllbGQ/LmNvbG9yLFxuICAgICAgICAgIGdldFRleHRBbmNob3I6IG1haW5MYWJlbC5hbmNob3IsXG4gICAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6IG1haW5MYWJlbC5hbGlnbm1lbnQsXG4gICAgICAgICAgZ2V0U2Vjb25kYXJ5VGV4dDogc2Vjb25kYXJ5RmllbGQ/Lm5hbWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBkZWNrLmdsIGBJY29uTGF5ZXJgIFwiYXV0b1BhY2tcIiBtb2RlIGFjY2Vzc29yIGZvciBjdXN0b20gbWFya2Vycy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBpY29uVXJsQWNjZXNzb3IgZGVjay5nbCBhY2Nlc3NvciAob3IgdmFsdWUpIHRoYXQgcmVzb2x2ZXMgdG8gVVJMIG9mIGljb24gZm9yIGdpdmVuIHJvd1xuICAgKiBAcmV0dXJucyBkZWNrLmdsIGFjY2Vzc29yIHRoYXQgcmV0dXJucyBVbnBhY2tlZEljb24gcmVhZHkgdG8gY29uc3VtZSBieSBJY29uTGF5ZXJcbiAgICovXG4gIGdldEN1c3RvbU1hcmtlckljb25BY2Nlc3NvcihpY29uVXJsQWNjZXNzb3IsIG1hc2sgPSB0cnVlKSB7XG4gICAgY29uc3QgbWF4SWNvblNpemUgPSB0aGlzLmdldE1heE1hcmtlclNpemUoKTtcblxuICAgIHJldHVybiBkID0+IHtcbiAgICAgIGNvbnN0IHdhbnRlZFVybCA9XG4gICAgICAgICh0eXBlb2YgaWNvblVybEFjY2Vzc29yID09PSAnZnVuY3Rpb24nKSA/IGljb25VcmxBY2Nlc3NvcihkKSA6IGljb25VcmxBY2Nlc3NvcjtcbiAgICAgIGNvbnN0IGljb25PayA9IEJvb2xlYW4od2FudGVkVXJsKTtcbiAgICAgIG1hc2sgPSBpY29uT2sgPyBtYXNrIDogdHJ1ZTtcbiAgICAgIGNvbnN0IHVybCA9IGljb25PayA/IHdhbnRlZFVybCA6IEZBTExCQUNLX0lDT047XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogYCR7dXJsfUBAJHttYXhJY29uU2l6ZX1AJHttYXNrID8gJ20nIDogJ2MnfWAsXG4gICAgICAgIHVybCxcbiAgICAgICAgd2lkdGg6IG1heEljb25TaXplLFxuICAgICAgICBoZWlnaHQ6IG1heEljb25TaXplLFxuICAgICAgICBtYXNrXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEYXRhQXR0cmlidXRlKGtlcGxlclRhYmxlLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB1cGRhdGVMYXllck1ldGEoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gIH1cblxuICBnZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gICAgcmV0dXJuICgpID0+IG51bGw7XG4gIH1cblxuICBnZXRIZXhDb2x1bW4ocmFuZ2UpIHtcbiAgICBjb25zdCBmaWVsZCA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscyk/LmZpbmQodmFsdWUgPT4gdmFsdWUucmFuZ2UgPT09IHJhbmdlKT8uZmllbGQ7XG4gICAgaWYgKGZpZWxkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWdbZmllbGRdPy5jb2xvckNvbHVtbjtcbiAgICB9XG4gIH1cblxuICBpc0NvbG9yZWRCeUNvbG9yQ29sdW1uKHJhbmdlKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0/LmhleENvbG9yO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExheWVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBb0JBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGlCQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxRQUFBLEdBQUFSLE9BQUE7QUFFQSxJQUFBUyxnQkFBQSxHQUFBVCxPQUFBO0FBWUEsSUFBQVUsWUFBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsa0JBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLGFBQUEsR0FBQVosT0FBQTtBQVFBLElBQUFhLE1BQUEsR0FBQWIsT0FBQTtBQUVBLElBQUFjLFVBQUEsR0FBQWQsT0FBQTtBQUNBLElBQUFlLG1CQUFBLEdBQUFmLE9BQUE7QUFFQSxJQUFBZ0IsV0FBQSxHQUFBaEIsT0FBQTtBQUNBLElBQUFpQixXQUFBLEdBQUFqQixPQUFBO0FBQ0EsSUFBQWtCLFFBQUEsR0FBQWxCLE9BQUE7QUFBc0MsU0FBQW1CLDJCQUFBQyxDQUFBLEVBQUFDLGNBQUEsUUFBQUMsRUFBQSxVQUFBQyxNQUFBLG9CQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxFQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLEVBQUEsR0FBQUssMkJBQUEsQ0FBQVAsQ0FBQSxNQUFBQyxjQUFBLElBQUFELENBQUEsV0FBQUEsQ0FBQSxDQUFBUSxNQUFBLHFCQUFBTixFQUFBLEVBQUFGLENBQUEsR0FBQUUsRUFBQSxNQUFBTyxDQUFBLFVBQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFFBQUFILENBQUEsSUFBQVQsQ0FBQSxDQUFBUSxNQUFBLFdBQUFLLElBQUEsbUJBQUFBLElBQUEsU0FBQUMsS0FBQSxFQUFBZCxDQUFBLENBQUFTLENBQUEsVUFBQU0sQ0FBQSxXQUFBQSxFQUFBQyxFQUFBLFVBQUFBLEVBQUEsS0FBQUMsQ0FBQSxFQUFBUCxDQUFBLGdCQUFBUSxTQUFBLGlKQUFBQyxnQkFBQSxTQUFBQyxNQUFBLFVBQUFDLEdBQUEsV0FBQVYsQ0FBQSxXQUFBQSxFQUFBLElBQUFULEVBQUEsR0FBQUEsRUFBQSxDQUFBb0IsSUFBQSxDQUFBdEIsQ0FBQSxNQUFBWSxDQUFBLFdBQUFBLEVBQUEsUUFBQVcsSUFBQSxHQUFBckIsRUFBQSxDQUFBc0IsSUFBQSxJQUFBTCxnQkFBQSxHQUFBSSxJQUFBLENBQUFWLElBQUEsU0FBQVUsSUFBQSxLQUFBUixDQUFBLFdBQUFBLEVBQUFVLEdBQUEsSUFBQUwsTUFBQSxTQUFBQyxHQUFBLEdBQUFJLEdBQUEsS0FBQVIsQ0FBQSxXQUFBQSxFQUFBLGVBQUFFLGdCQUFBLElBQUFqQixFQUFBLG9CQUFBQSxFQUFBLDhCQUFBa0IsTUFBQSxRQUFBQyxHQUFBO0FBQUEsU0FBQWQsNEJBQUFQLENBQUEsRUFBQTBCLE1BQUEsU0FBQTFCLENBQUEscUJBQUFBLENBQUEsc0JBQUEyQixpQkFBQSxDQUFBM0IsQ0FBQSxFQUFBMEIsTUFBQSxPQUFBZCxDQUFBLEdBQUFnQixNQUFBLENBQUFDLFNBQUEsQ0FBQUMsUUFBQSxDQUFBUixJQUFBLENBQUF0QixDQUFBLEVBQUErQixLQUFBLGFBQUFuQixDQUFBLGlCQUFBWixDQUFBLENBQUFnQyxXQUFBLEVBQUFwQixDQUFBLEdBQUFaLENBQUEsQ0FBQWdDLFdBQUEsQ0FBQUMsSUFBQSxNQUFBckIsQ0FBQSxjQUFBQSxDQUFBLG1CQUFBUCxLQUFBLENBQUE2QixJQUFBLENBQUFsQyxDQUFBLE9BQUFZLENBQUEsK0RBQUF1QixJQUFBLENBQUF2QixDQUFBLFVBQUFlLGlCQUFBLENBQUEzQixDQUFBLEVBQUEwQixNQUFBO0FBQUEsU0FBQUMsa0JBQUFTLEdBQUEsRUFBQUMsR0FBQSxRQUFBQSxHQUFBLFlBQUFBLEdBQUEsR0FBQUQsR0FBQSxDQUFBNUIsTUFBQSxFQUFBNkIsR0FBQSxHQUFBRCxHQUFBLENBQUE1QixNQUFBLFdBQUFDLENBQUEsTUFBQTZCLElBQUEsT0FBQWpDLEtBQUEsQ0FBQWdDLEdBQUEsR0FBQTVCLENBQUEsR0FBQTRCLEdBQUEsRUFBQTVCLENBQUEsSUFBQTZCLElBQUEsQ0FBQTdCLENBQUEsSUFBQTJCLEdBQUEsQ0FBQTNCLENBQUEsVUFBQTZCLElBQUE7QUFBQSxTQUFBQyxRQUFBeEIsQ0FBQSxFQUFBeUIsQ0FBQSxRQUFBQyxDQUFBLEdBQUFiLE1BQUEsQ0FBQWMsSUFBQSxDQUFBM0IsQ0FBQSxPQUFBYSxNQUFBLENBQUFlLHFCQUFBLFFBQUEzQyxDQUFBLEdBQUE0QixNQUFBLENBQUFlLHFCQUFBLENBQUE1QixDQUFBLEdBQUF5QixDQUFBLEtBQUF4QyxDQUFBLEdBQUFBLENBQUEsQ0FBQTRDLE1BQUEsV0FBQUosQ0FBQSxXQUFBWixNQUFBLENBQUFpQix3QkFBQSxDQUFBOUIsQ0FBQSxFQUFBeUIsQ0FBQSxFQUFBTSxVQUFBLE9BQUFMLENBQUEsQ0FBQU0sSUFBQSxDQUFBQyxLQUFBLENBQUFQLENBQUEsRUFBQXpDLENBQUEsWUFBQXlDLENBQUE7QUFBQSxTQUFBUSxjQUFBbEMsQ0FBQSxhQUFBeUIsQ0FBQSxNQUFBQSxDQUFBLEdBQUFVLFNBQUEsQ0FBQTFDLE1BQUEsRUFBQWdDLENBQUEsVUFBQUMsQ0FBQSxXQUFBUyxTQUFBLENBQUFWLENBQUEsSUFBQVUsU0FBQSxDQUFBVixDQUFBLFFBQUFBLENBQUEsT0FBQUQsT0FBQSxDQUFBWCxNQUFBLENBQUFhLENBQUEsT0FBQVUsT0FBQSxXQUFBWCxDQUFBLFFBQUFZLGdCQUFBLGFBQUFyQyxDQUFBLEVBQUF5QixDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBWixNQUFBLENBQUF5Qix5QkFBQSxHQUFBekIsTUFBQSxDQUFBMEIsZ0JBQUEsQ0FBQXZDLENBQUEsRUFBQWEsTUFBQSxDQUFBeUIseUJBQUEsQ0FBQVosQ0FBQSxLQUFBRixPQUFBLENBQUFYLE1BQUEsQ0FBQWEsQ0FBQSxHQUFBVSxPQUFBLFdBQUFYLENBQUEsSUFBQVosTUFBQSxDQUFBMkIsY0FBQSxDQUFBeEMsQ0FBQSxFQUFBeUIsQ0FBQSxFQUFBWixNQUFBLENBQUFpQix3QkFBQSxDQUFBSixDQUFBLEVBQUFELENBQUEsaUJBQUF6QixDQUFBO0FBQUEsSUFBQXlDLE9BQUEsZ0JBQUFDLFlBQUEsWUFBQUMsSUFBQSxDQTZCNUJDLGFBQWEsR0F2RnZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBMENBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBTUMsZUFBZSxHQUFBQyxPQUFBLENBQUFELGVBQUEsR0FBRyxDQUFDOztBQUVoQztBQUNBLElBQU1FLGFBQWEsR0FDakIsMExBQTBMO0FBRTVMLElBQU1DLGVBQWUsR0FBRyxJQUFJO0FBQzVCLElBQU1DLGFBQWEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUIsSUFBTUMsbUJBQW1CLEdBQUcsSUFBSUMsK0JBQW1CLENBQUM7RUFBQ0MsVUFBVSxFQUFFQztBQUFlLENBQUMsQ0FBQztBQUNsRixJQUFNQyx3QkFBd0IsR0FBRyxJQUFJQyxvQ0FBd0IsQ0FBQyxDQUFDO0FBRS9ELElBQU1DLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBbUJBLENBQUdDLEVBQUU7RUFBQSxPQUFJLFVBQUFDLENBQUM7SUFBQSxPQUFJQSxDQUFDO0VBQUE7QUFBQTtBQUN4QyxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFJQyxLQUFLLEVBQUVGLENBQUM7RUFBQSxPQUFLRSxLQUFLLENBQUNDLGFBQWEsQ0FBQ0gsQ0FBQyxDQUFDO0FBQUE7QUFDakUsSUFBTUksYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFHQyxDQUFDO0VBQUEsT0FBSUEsQ0FBQztBQUFBO0FBRXJCLElBQU1DLFlBQVksR0FBQWxCLE9BQUEsQ0FBQWtCLFlBQUEsR0FBRyxJQUFBQyxxQkFBUyxFQUFDO0VBQ3BDQyxNQUFNLEVBQUUsSUFBSTtFQUNaQyxRQUFRLEVBQUU7QUFDWixDQUFDLENBQUM7QUFFSyxJQUFNQyxXQUFXLEdBQUF0QixPQUFBLENBQUFzQixXQUFBLEdBQUd2RCxNQUFNLENBQUN3RCxNQUFNLENBQUNDLGdDQUFhLENBQUMsQ0FBQ0MsR0FBRyxDQUFDQyxvQkFBUSxDQUFDO0FBQ3JFLFNBQVU1QixhQUFhQSxDQUFBO0VBQUEsSUFBQTZCLEtBQUE7RUFBQSxPQUFBL0IsWUFBQSxZQUFBZ0MsSUFBQSxVQUFBQyxlQUFBQyxRQUFBO0lBQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFuRSxJQUFBO01BQUE7UUFDakJnRSxLQUFLLEdBQUcsQ0FBQztNQUFBO1FBQUEsTUFDTkEsS0FBSyxHQUFHTCxXQUFXLENBQUMzRSxNQUFNLEdBQUcsQ0FBQztVQUFBbUYsUUFBQSxDQUFBbkUsSUFBQTtVQUFBO1FBQUE7UUFDbkMsSUFBSWdFLEtBQUssS0FBS0wsV0FBVyxDQUFDM0UsTUFBTSxFQUFFO1VBQ2hDZ0YsS0FBSyxHQUFHLENBQUM7UUFDWDtRQUFDRyxRQUFBLENBQUFuRSxJQUFBO1FBQ0QsT0FBTTJELFdBQVcsQ0FBQ0ssS0FBSyxFQUFFLENBQUM7TUFBQTtRQUFBRyxRQUFBLENBQUFuRSxJQUFBO1FBQUE7TUFBQTtNQUFBO1FBQUEsT0FBQW1FLFFBQUEsQ0FBQUUsSUFBQTtJQUFBO0VBQUEsR0FBQXJDLE9BQUE7QUFBQTtBQUl2QixJQUFNc0MsVUFBVSxHQUFBakMsT0FBQSxDQUFBaUMsVUFBQSxHQUFHbkMsYUFBYSxDQUFDLENBQUM7O0FBRXpDO0FBQUEsSUFDTW9DLEtBQUs7RUFDVCxTQUFBQSxNQUFBLEVBQXdCO0lBQUEsSUFBWkMsS0FBSyxHQUFBOUMsU0FBQSxDQUFBMUMsTUFBQSxRQUFBMEMsU0FBQSxRQUFBK0MsU0FBQSxHQUFBL0MsU0FBQSxNQUFHLENBQUMsQ0FBQztJQUFBLElBQUFnRCxnQkFBQSxtQkFBQUgsS0FBQTtJQUNwQixJQUFJLENBQUNJLEVBQUUsR0FBR0gsS0FBSyxDQUFDRyxFQUFFLElBQUksSUFBQUMscUJBQWMsRUFBQ3hDLGVBQWUsQ0FBQztJQUNyRDtJQUNBLElBQUksQ0FBQ3lDLElBQUksR0FBRyxDQUFDLENBQUM7O0lBRWQ7SUFDQSxJQUFJLENBQUNDLGNBQWMsR0FBRyxDQUFDLENBQUM7O0lBRXhCO0lBQ0EsSUFBSSxDQUFDQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7O0lBRTNCO0lBQ0EsSUFBSSxDQUFDQyxzQkFBc0IsR0FBRyxDQUFDLENBQUM7O0lBRWhDO0lBQ0EsSUFBSSxDQUFDQyxNQUFNLEdBQUcsSUFBSSxDQUFDQyxxQkFBcUIsQ0FBQXpELGFBQUE7TUFDdEMwRCxPQUFPLEVBQUUsSUFBSSxDQUFDQyxlQUFlLENBQUM7SUFBQyxHQUM1QlosS0FBSyxDQUNULENBQUM7RUFDSjtFQUFDLElBQUFhLGFBQUEsYUFBQWQsS0FBQTtJQUFBZSxHQUFBO0lBQUFDLEdBQUEsRUFFRCxTQUFBQSxJQUFBLEVBQWdCO01BQ2QsT0FBT0MsNEJBQWdCO0lBQ3pCO0VBQUM7SUFBQUYsR0FBQTtJQUFBQyxHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFrQjtNQUNoQixPQUFPaEMsWUFBWSxDQUFDRSxNQUFNO0lBQzVCO0VBQUM7SUFBQTZCLEdBQUE7SUFBQUMsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBVztNQUNULE9BQU8sSUFBSTtJQUNiO0VBQUM7SUFBQUQsR0FBQTtJQUFBQyxHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFXO01BQ1QsT0FBTyxJQUFJLENBQUNFLElBQUk7SUFDbEI7RUFBQztJQUFBSCxHQUFBO0lBQUFDLEdBQUEsRUFFRCxTQUFBQSxJQUFBLEVBQW1CO01BQ2pCLE9BQU8sS0FBSztJQUNkO0VBQUM7SUFBQUQsR0FBQTtJQUFBQyxHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUEyQjtNQUN6QixPQUFPLEVBQUU7SUFDWDtFQUFDO0lBQUFELEdBQUE7SUFBQUMsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBc0I7TUFDcEIsT0FBTyxFQUFFO0lBQ1g7RUFBQztJQUFBRCxHQUFBO0lBQUFDLEdBQUEsRUFFRCxTQUFBQSxJQUFBLEVBQWtDO01BQ2hDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDO0lBQ2pFO0VBQUM7SUFBQUQsR0FBQTtJQUFBQyxHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFxQjtNQUNuQixPQUFPO1FBQ0xHLEtBQUssRUFBRTtVQUNMQyxRQUFRLEVBQUUsT0FBTztVQUNqQnhDLEtBQUssRUFBRSxZQUFZO1VBQ25CeUMsS0FBSyxFQUFFLFlBQVk7VUFDbkJDLE1BQU0sRUFBRSxhQUFhO1VBQ3JCQyxLQUFLLEVBQUUsWUFBWTtVQUNuQlIsR0FBRyxFQUFFLE9BQU87VUFDWlMsZ0JBQWdCLEVBQUVDLCtCQUFjLENBQUNOLEtBQUs7VUFDdENPLFNBQVMsRUFBRUMsK0JBQWM7VUFDekJDLFlBQVksRUFBRSxTQUFBQSxhQUFBbEIsTUFBTTtZQUFBLE9BQUlBLE1BQU0sQ0FBQ1MsS0FBSztVQUFBO1FBQ3RDLENBQUM7UUFDRFUsSUFBSSxFQUFFO1VBQ0pULFFBQVEsRUFBRSxNQUFNO1VBQ2hCeEMsS0FBSyxFQUFFLFdBQVc7VUFDbEJ5QyxLQUFLLEVBQUUsV0FBVztVQUNsQkMsTUFBTSxFQUFFLFlBQVk7VUFDcEJDLEtBQUssRUFBRSxXQUFXO1VBQ2xCUixHQUFHLEVBQUUsTUFBTTtVQUNYUyxnQkFBZ0IsRUFBRUMsK0JBQWMsQ0FBQ0ksSUFBSTtVQUNyQ0gsU0FBUyxFQUFFLENBQUM7VUFDWkUsWUFBWSxFQUFFO1FBQ2hCO01BQ0YsQ0FBQztJQUNIOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0VBSEU7SUFBQWIsR0FBQTtJQUFBQyxHQUFBLEVBSUEsU0FBQUEsSUFBQSxFQUFrQjtNQUNoQixPQUFPLElBQUk7SUFDYjs7SUFFQTtBQUNGO0FBQ0E7RUFGRTtJQUFBRCxHQUFBO0lBQUFDLEdBQUEsRUFHQSxTQUFBQSxJQUFBLEVBQThCO01BQzVCLE9BQU87UUFDTGMsR0FBRyxFQUFFO1VBQUNDLElBQUksRUFBRSxLQUFLO1VBQUVDLFlBQVksRUFBRTtRQUFLLENBQUM7UUFDdkNDLEdBQUcsRUFBRTtVQUFDRixJQUFJLEVBQUUsS0FBSztVQUFFQyxZQUFZLEVBQUU7UUFBSztNQUN4QyxDQUFDO0lBQ0g7O0lBRUE7QUFDRjtBQUNBO0VBRkU7SUFBQWpCLEdBQUE7SUFBQUMsR0FBQSxFQUdBLFNBQUFBLElBQUEsRUFBNkI7TUFDM0IsT0FBTztRQUNMa0IsSUFBSSxFQUFFO1VBQUNILElBQUksRUFBRSxNQUFNO1VBQUVDLFlBQVksRUFBRTtRQUFLLENBQUM7UUFDekNHLElBQUksRUFBRTtVQUFDSixJQUFJLEVBQUUsTUFBTTtVQUFFQyxZQUFZLEVBQUU7UUFBSyxDQUFDO1FBQ3pDSSxJQUFJLEVBQUU7VUFBQ0wsSUFBSSxFQUFFLE1BQU07VUFBRUMsWUFBWSxFQUFFO1FBQUssQ0FBQztRQUN6Q0ssSUFBSSxFQUFFO1VBQUNOLElBQUksRUFBRSxNQUFNO1VBQUVDLFlBQVksRUFBRTtRQUFLO01BQzFDLENBQUM7SUFDSDs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFYRTtJQUFBakIsR0FBQTtJQUFBQyxHQUFBLEVBWUEsU0FBQUEsSUFBQSxFQUFxQjtNQUNuQixPQUFPLElBQUk7SUFDYjtFQUFDO0lBQUFELEdBQUE7SUFBQUMsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBNEI7TUFDMUIsT0FBTyxJQUFJLENBQUNQLHNCQUFzQjtJQUNwQyxDQUFDO0lBQUE2QixHQUFBLEVBRUQsU0FBQUEsSUFBMEJDLHFCQUFxQixFQUFFO01BQy9DLElBQUksQ0FBQzlCLHNCQUFzQixHQUFHOEIscUJBQXFCO0lBQ3JEO0VBQUM7SUFBQXhCLEdBQUE7SUFBQUMsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBaUI7TUFBQSxJQUFBd0IscUJBQUEsRUFBQUMsc0JBQUEsRUFBQUMsc0JBQUEsRUFBQUMsc0JBQUE7TUFDZixPQUFPQyxPQUFPLENBQ1osRUFBQUoscUJBQUEsT0FBSSxDQUFDRCxxQkFBcUIsY0FBQUMscUJBQUEsd0JBQUFDLHNCQUFBLEdBQTFCRCxxQkFBQSxDQUE0QkssS0FBSyxjQUFBSixzQkFBQSx1QkFBakNBLHNCQUFBLENBQW1DSyxNQUFNLENBQUNySSxNQUFNLE9BQUFpSSxzQkFBQSxHQUM5QyxJQUFJLENBQUNILHFCQUFxQixjQUFBRyxzQkFBQSx3QkFBQUMsc0JBQUEsR0FBMUJELHNCQUFBLENBQTRCSyxLQUFLLGNBQUFKLHNCQUFBLHVCQUFqQ0Esc0JBQUEsQ0FBbUNHLE1BQU0sQ0FBQ3JJLE1BQU0sQ0FDcEQsQ0FBQztJQUNIO0VBQUM7SUFBQXNHLEdBQUE7SUFBQUMsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBdUI7TUFBQSxJQUFBZ0Msc0JBQUE7TUFDckIsT0FBT0osT0FBTyxDQUFDLElBQUksQ0FBQ0ssVUFBVSxNQUFBRCxzQkFBQSxHQUFJLElBQUksQ0FBQ1QscUJBQXFCLGNBQUFTLHNCQUFBLHVCQUExQkEsc0JBQUEsQ0FBNEJFLE9BQU8sRUFBQztJQUN4RTs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBSkU7SUFBQW5DLEdBQUE7SUFBQWhHLEtBQUEsRUFvRkEsU0FBQTRGLHNCQUFBLEVBQWtDO01BQUEsSUFBQXdDLHFCQUFBLEVBQUFDLHNCQUFBO01BQUEsSUFBWm5ELEtBQUssR0FBQTlDLFNBQUEsQ0FBQTFDLE1BQUEsUUFBQTBDLFNBQUEsUUFBQStDLFNBQUEsR0FBQS9DLFNBQUEsTUFBRyxDQUFDLENBQUM7TUFDOUIsT0FBTztRQUNMa0csTUFBTSxFQUFFcEQsS0FBSyxDQUFDb0QsTUFBTSxJQUFJLElBQUk7UUFDNUJDLGdCQUFnQixFQUFFO1VBQ2hCQyxHQUFHLEVBQUUsRUFBQUoscUJBQUEsR0FBQWxELEtBQUssQ0FBQ3FELGdCQUFnQixjQUFBSCxxQkFBQSx1QkFBdEJBLHFCQUFBLENBQXdCSSxHQUFHLEtBQUlDLGtDQUFpQixDQUFDRCxHQUFHO1VBQ3pERSxHQUFHLEVBQUUsRUFBQUwsc0JBQUEsR0FBQW5ELEtBQUssQ0FBQ3FELGdCQUFnQixjQUFBRixzQkFBQSx1QkFBdEJBLHNCQUFBLENBQXdCSyxHQUFHLEtBQUlELGtDQUFpQixDQUFDQztRQUN4RCxDQUFDO1FBQ0RDLEtBQUssRUFBRXpELEtBQUssQ0FBQ3lELEtBQUssSUFBSUMsaUNBQW1CO1FBQ3pDeEMsS0FBSyxFQUFFbEIsS0FBSyxDQUFDa0IsS0FBSyxJQUFJcEIsVUFBVSxDQUFDdEUsSUFBSSxDQUFDLENBQUMsQ0FBQ1YsS0FBSztRQUM3QzZGLE9BQU8sRUFBRVgsS0FBSyxDQUFDVyxPQUFPLElBQUksSUFBSTtRQUM5QmdELFNBQVMsRUFBRTNELEtBQUssQ0FBQzJELFNBQVMsSUFBSSxLQUFLO1FBQ25DQyxjQUFjLEVBQUU1RCxLQUFLLENBQUM0RCxjQUFjLElBQUksS0FBSztRQUM3Q0MsY0FBYyxFQUFFN0QsS0FBSyxDQUFDNkQsY0FBYyxJQUFJQyxxQ0FBdUI7UUFDL0RDLE1BQU0sRUFBRS9ELEtBQUssQ0FBQytELE1BQU0sSUFBSSxLQUFLO1FBRTdCO1FBQ0E7UUFDQUMsVUFBVSxFQUFFLElBQUk7UUFDaEJDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkJDLFVBQVUsRUFBRUMsNEJBQVcsQ0FBQ0MsUUFBUTtRQUVoQztRQUNBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCQyxTQUFTLEVBQUVILDRCQUFXLENBQUNJLE1BQU07UUFDN0JDLFNBQVMsRUFBRSxJQUFJO1FBQ2ZDLFdBQVcsRUFBRSxJQUFJO1FBRWpCQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRWJDLFNBQVMsRUFBRSxDQUFDQyxnQ0FBa0IsQ0FBQztRQUUvQkMsT0FBTyxFQUFFO1VBQ1AzRCxLQUFLLEVBQUU0RCw4QkFBZ0I7VUFDdkJDLFVBQVUsRUFBRUQ7UUFDZCxDQUFDO1FBQ0RFLFNBQVMsRUFBRTtVQUFDL0IsT0FBTyxFQUFFO1FBQUs7TUFDNUIsQ0FBQztJQUNIOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFKRTtJQUFBbkMsR0FBQTtJQUFBaEcsS0FBQSxFQUtBLFNBQUFtSyw0QkFBNEJuRSxHQUFHLEVBQUU7TUFDL0I7TUFDQSxPQUFPO1FBQ0wyQyxLQUFLLEVBQUUsSUFBSSxDQUFDbEQsaUJBQWlCLENBQUMsSUFBSSxDQUFDMkUsY0FBYyxDQUFDcEUsR0FBRyxDQUFDLENBQUNRLEtBQUssQ0FBQyxDQUFDbUMsS0FBSztRQUNuRTBCLE9BQU8sRUFBRSxJQUFJLENBQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDeUUsY0FBYyxDQUFDcEUsR0FBRyxDQUFDLENBQUNuQyxLQUFLLENBQUMsR0FDL0MsSUFBSSxDQUFDOEIsTUFBTSxDQUFDLElBQUksQ0FBQ3lFLGNBQWMsQ0FBQ3BFLEdBQUcsQ0FBQyxDQUFDbkMsS0FBSyxDQUFDLENBQUN5RyxXQUFXLElBQ3hELElBQUksQ0FBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUN5RSxjQUFjLENBQUNwRSxHQUFHLENBQUMsQ0FBQ25DLEtBQUssQ0FBQyxDQUFDMUMsSUFBSSxHQUNoRCxJQUFJLENBQUNpSixjQUFjLENBQUNwRSxHQUFHLENBQUMsQ0FBQ3VFO01BQy9CLENBQUM7SUFDSDs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMRTtJQUFBdkUsR0FBQTtJQUFBaEcsS0FBQSxFQU1BLFNBQUF3SyxhQUFheEUsR0FBRyxFQUFFbkMsS0FBSyxFQUFFO01BQ3ZCO01BQ0EsSUFBTTRHLE1BQU0sR0FBRzVHLEtBQUssR0FDaEI7UUFDRTdELEtBQUssRUFBRTZELEtBQUssQ0FBQzFDLElBQUk7UUFDakJ1SixRQUFRLEVBQUU3RyxLQUFLLENBQUM2RztNQUNsQixDQUFDLEdBQ0Q7UUFBQzFLLEtBQUssRUFBRSxJQUFJO1FBQUUwSyxRQUFRLEVBQUUsQ0FBQztNQUFDLENBQUM7TUFFL0IsT0FBQXZJLGFBQUEsQ0FBQUEsYUFBQSxLQUNLLElBQUksQ0FBQ3dELE1BQU0sQ0FBQ0UsT0FBTyxXQUFBdkQsZ0JBQUEsaUJBQ3JCMEQsR0FBRyxFQUFBN0QsYUFBQSxDQUFBQSxhQUFBLEtBQ0MsSUFBSSxDQUFDd0QsTUFBTSxDQUFDRSxPQUFPLENBQUNHLEdBQUcsQ0FBQyxHQUN4QnlFLE1BQU07SUFHZjs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMRTtJQUFBekUsR0FBQTtJQUFBaEcsS0FBQSxFQU1BLFNBQUEySyxrQkFBa0IzRSxHQUFHLEVBQUVnQixJQUFJLEVBQUU7TUFBQSxJQUFBNEQsaUJBQUEsRUFBQUMsa0JBQUEsRUFBQUMsa0JBQUE7TUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQ0MsV0FBVyxJQUFJLEdBQUFILGlCQUFBLEdBQUMsSUFBSSxDQUFDRyxXQUFXLGNBQUFILGlCQUFBLGVBQWhCQSxpQkFBQSxDQUFtQjVFLEdBQUcsQ0FBQyxHQUFFO1FBQ2pEO1FBQ0EsT0FBTyxJQUFJLENBQUNMLE1BQU0sQ0FBQ0UsT0FBTztNQUM1QjtNQUVBLElBQUFtRixxQkFBQSxJQUFBSCxrQkFBQSxHQUF5QyxJQUFJLENBQUNFLFdBQVcsY0FBQUYsa0JBQUEsdUJBQWhCQSxrQkFBQSxDQUFtQjdFLEdBQUcsQ0FBQztRQUFuRGlGLFVBQVUsR0FBQUQscUJBQUEsQ0FBaEJoRSxJQUFJO1FBQWNDLFlBQVksR0FBQStELHFCQUFBLENBQVovRCxZQUFZO01BQ3JDLElBQUFpRSxxQkFBQSxJQUFBSixrQkFBQSxHQUE0QyxJQUFJLENBQUNDLFdBQVcsY0FBQUQsa0JBQUEsdUJBQWhCQSxrQkFBQSxDQUFtQkcsVUFBVSxDQUFDO1FBQXJERSxtQkFBbUIsR0FBQUQscUJBQUEsQ0FBakNqRSxZQUFZO01BRW5CLE9BQUE5RSxhQUFBLENBQUFBLGFBQUEsS0FDSyxJQUFJLENBQUN3RCxNQUFNLENBQUNFLE9BQU8sV0FBQXZELGdCQUFBLGlCQUFBQSxnQkFBQSxpQkFDckIwRCxHQUFHLEVBQUdnQixJQUFJLENBQUNDLFlBQVksQ0FBQyxHQUN4QmdFLFVBQVUsRUFBR2pFLElBQUksQ0FBQ21FLG1CQUFtQixDQUFDO0lBRTNDOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkU7SUFBQW5GLEdBQUE7SUFBQWhHLEtBQUEsRUFPQSxTQUFBb0wsY0FBQUMsSUFBQSxFQUFzQztNQUFBLElBQXZCQyxJQUFJLEdBQUFELElBQUEsQ0FBSkMsSUFBSTtRQUFBQyxlQUFBLEdBQUFGLElBQUEsQ0FBRUcsVUFBVTtRQUFWQSxVQUFVLEdBQUFELGVBQUEsY0FBRyxDQUFDLEdBQUFBLGVBQUE7TUFDakMsT0FBT0UsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFRCxJQUFJLENBQUMvQyxHQUFHLENBQUMsRUFBRSxHQUFHNEMsSUFBSSxHQUFHRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQ7O0lBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFORTtJQUFBeEYsR0FBQTtJQUFBaEcsS0FBQSxFQU9BLFNBQUEyTCx1QkFBQUMsS0FBQSxFQUErQztNQUFBLElBQXZCTixJQUFJLEdBQUFNLEtBQUEsQ0FBSk4sSUFBSTtRQUFBTyxnQkFBQSxHQUFBRCxLQUFBLENBQUVKLFVBQVU7UUFBVkEsVUFBVSxHQUFBSyxnQkFBQSxjQUFHLENBQUMsR0FBQUEsZ0JBQUE7TUFDMUMsT0FBTyxJQUFJLENBQUNsRyxNQUFNLENBQUNpRSxTQUFTLENBQUNrQyx5QkFBeUIsR0FDbERMLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRUQsSUFBSSxDQUFDL0MsR0FBRyxDQUFDLENBQUMsR0FBRzRDLElBQUksR0FBR0UsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQy9DLENBQUM7SUFDUDtFQUFDO0lBQUF4RixHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQStMLGdCQUFnQkMsUUFBUSxFQUFFQyxhQUFhLEVBQUU7TUFDdkMsT0FBTyxDQUFDLENBQUM7SUFDWDtFQUFDO0lBQUFqRyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQWtNLFlBQUEsRUFBYztNQUNaLE9BQU8sRUFBRTtJQUNYO0VBQUM7SUFBQWxHLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBbU0sYUFBYUMsTUFBTSxFQUFFQyxhQUFhLEVBQUU7TUFDbEMsSUFBSSxDQUFDRCxNQUFNLEVBQUU7UUFDWCxPQUFPLElBQUk7TUFDYjs7TUFFQTtNQUNBO01BQ0EsT0FBT0MsYUFBYSxDQUFDQyxHQUFHLENBQUNGLE1BQU0sQ0FBQzFILEtBQUssQ0FBQztJQUN4Qzs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBSkU7SUFBQXNCLEdBQUE7SUFBQWhHLEtBQUEsRUFLQSxTQUFBdU0sb0JBQW9CQyxZQUFZLEVBQUUvRyxpQkFBaUIsRUFBRTtNQUFBLElBQUFnSCxLQUFBO01BQ25EO01BQ0E7TUFDQSxJQUFNQyxXQUFXLEdBQUcsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQ0MsTUFBTSxDQUMzRDdMLE1BQU0sQ0FBQ3dELE1BQU0sQ0FBQyxJQUFJLENBQUM4RixjQUFjLENBQUMsQ0FBQzVGLEdBQUcsQ0FBQyxVQUFBUixDQUFDO1FBQUEsT0FBSUEsQ0FBQyxDQUFDSCxLQUFLO01BQUEsRUFDckQsQ0FBQzs7TUFFRDtNQUNBLElBQU0rSSxTQUFTLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQ0QsTUFBTSxDQUFDN0wsTUFBTSxDQUFDd0QsTUFBTSxDQUFDLElBQUksQ0FBQzhGLGNBQWMsQ0FBQyxDQUFDNUYsR0FBRyxDQUFDLFVBQUFSLENBQUM7UUFBQSxPQUFJQSxDQUFDLENBQUN1QyxNQUFNO01BQUEsRUFBQyxDQUFDO01BQzdGO01BQ0F6RixNQUFNLENBQUN3RCxNQUFNLENBQUMsSUFBSSxDQUFDOEYsY0FBYyxDQUFDLENBQUMvSCxPQUFPLENBQUMsVUFBQTJCLENBQUMsRUFBSTtRQUM5QyxJQUNFd0ksWUFBWSxDQUFDNUMsU0FBUyxDQUFDNUYsQ0FBQyxDQUFDd0MsS0FBSyxDQUFDLElBQy9CaUcsS0FBSSxDQUFDaEgsaUJBQWlCLENBQUN6QixDQUFDLENBQUN3QyxLQUFLLENBQUMsSUFDL0JmLGlCQUFpQixDQUFDekIsQ0FBQyxDQUFDd0MsS0FBSyxDQUFDLENBQUNxRyxLQUFLLEtBQUtKLEtBQUksQ0FBQ2hILGlCQUFpQixDQUFDekIsQ0FBQyxDQUFDd0MsS0FBSyxDQUFDLENBQUNxRyxLQUFLLEVBQzFFO1VBQ0FELFNBQVMsQ0FBQzNLLElBQUksQ0FBQytCLENBQUMsQ0FBQ3dDLEtBQUssQ0FBQztRQUN6QjtNQUNGLENBQUMsQ0FBQzs7TUFFRjtNQUNBLElBQU1zRyxhQUFhLEdBQUcsSUFBSSxDQUFDbkgsTUFBTTtNQUNqQyxJQUFNb0gsTUFBTSxHQUFHLElBQUksQ0FBQ0MsZUFBZSxDQUFDRixhQUFhLEVBQUVOLFlBQVksRUFBRTtRQUMvREUsV0FBVyxFQUFYQSxXQUFXO1FBQ1hFLFNBQVMsRUFBVEE7TUFDRixDQUFDLENBQUM7TUFDRixJQUFJLENBQUNLLGlCQUFpQixDQUFDRixNQUFNLENBQUM7TUFDOUI7TUFDQWpNLE1BQU0sQ0FBQ2MsSUFBSSxDQUFDLElBQUksQ0FBQ3dJLGNBQWMsQ0FBQyxDQUFDL0gsT0FBTyxDQUFDLFVBQUE2SyxPQUFPLEVBQUk7UUFDbERULEtBQUksQ0FBQ1UscUJBQXFCLENBQUNELE9BQU8sQ0FBQztNQUNyQyxDQUFDLENBQUM7SUFDSjs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVRFO0lBQUFsSCxHQUFBO0lBQUFoRyxLQUFBLEVBVUEsU0FBQWdOLGdCQUFnQkYsYUFBYSxFQUFFTixZQUFZLEVBQTJDO01BQUEsSUFBQVksTUFBQTtNQUFBLElBQUFDLEtBQUEsR0FBQWpMLFNBQUEsQ0FBQTFDLE1BQUEsUUFBQTBDLFNBQUEsUUFBQStDLFNBQUEsR0FBQS9DLFNBQUEsTUFBSixDQUFDLENBQUM7UUFBQWtMLGlCQUFBLEdBQUFELEtBQUEsQ0FBdENYLFdBQVc7UUFBWEEsV0FBVyxHQUFBWSxpQkFBQSxjQUFHLEVBQUUsR0FBQUEsaUJBQUE7UUFBQUMsZUFBQSxHQUFBRixLQUFBLENBQUVULFNBQVM7UUFBVEEsU0FBUyxHQUFBVyxlQUFBLGNBQUcsRUFBRSxHQUFBQSxlQUFBO01BQzVFLElBQU1SLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDakJqTSxNQUFNLENBQUNjLElBQUksQ0FBQ2tMLGFBQWEsQ0FBQyxDQUFDekssT0FBTyxDQUFDLFVBQUEyRCxHQUFHLEVBQUk7UUFDeEMsSUFDRSxJQUFBd0gsb0JBQWEsRUFBQ1YsYUFBYSxDQUFDOUcsR0FBRyxDQUFDLENBQUMsSUFDakMsSUFBQXdILG9CQUFhLEVBQUNoQixZQUFZLENBQUN4RyxHQUFHLENBQUMsQ0FBQyxJQUNoQyxDQUFDMEcsV0FBVyxDQUFDZSxRQUFRLENBQUN6SCxHQUFHLENBQUMsSUFDMUIsQ0FBQzRHLFNBQVMsQ0FBQ2EsUUFBUSxDQUFDekgsR0FBRyxDQUFDLEVBQ3hCO1VBQ0E7VUFDQStHLE1BQU0sQ0FBQy9HLEdBQUcsQ0FBQyxHQUFHb0gsTUFBSSxDQUFDSixlQUFlLENBQUNGLGFBQWEsQ0FBQzlHLEdBQUcsQ0FBQyxFQUFFd0csWUFBWSxDQUFDeEcsR0FBRyxDQUFDLEVBQUU7WUFDeEUwRyxXQUFXLEVBQVhBLFdBQVc7WUFDWEUsU0FBUyxFQUFUQTtVQUNGLENBQUMsQ0FBQztRQUNKLENBQUMsTUFBTSxJQUFJLElBQUFjLDZCQUFrQixFQUFDbEIsWUFBWSxDQUFDeEcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDNEcsU0FBUyxDQUFDYSxRQUFRLENBQUN6SCxHQUFHLENBQUMsRUFBRTtVQUM1RTtVQUNBK0csTUFBTSxDQUFDL0csR0FBRyxDQUFDLEdBQUd3RyxZQUFZLENBQUN4RyxHQUFHLENBQUM7UUFDakMsQ0FBQyxNQUFNO1VBQ0w7VUFDQStHLE1BQU0sQ0FBQy9HLEdBQUcsQ0FBQyxHQUFHOEcsYUFBYSxDQUFDOUcsR0FBRyxDQUFDO1FBQ2xDO01BQ0YsQ0FBQyxDQUFDO01BRUYsT0FBTytHLE1BQU07SUFDZjtFQUFDO0lBQUEvRyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQTJOLGtCQUFrQkMsZUFBZSxFQUFFO01BQUEsSUFBQUMsTUFBQTtNQUNqQy9NLE1BQU0sQ0FBQ2MsSUFBSSxDQUFDZ00sZUFBZSxDQUFDLENBQUN2TCxPQUFPLENBQUMsVUFBQXlMLElBQUksRUFBSTtRQUMzQyxJQUFJLE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUlDLCtCQUFpQixDQUFDSCxlQUFlLENBQUNFLElBQUksQ0FBQyxDQUFDLEVBQUU7VUFDeEU7VUFDQUQsTUFBSSxDQUFDbEksTUFBTSxDQUFDaUUsU0FBUyxDQUFDa0UsSUFBSSxDQUFDLEdBQUdDLCtCQUFpQixDQUFDSCxlQUFlLENBQUNFLElBQUksQ0FBQyxDQUFDLENBQUNqSCxZQUFZO1VBQ25GZ0gsTUFBSSxDQUFDcEksaUJBQWlCLENBQUNxSSxJQUFJLENBQUMsR0FBR0MsK0JBQWlCLENBQUNILGVBQWUsQ0FBQ0UsSUFBSSxDQUFDLENBQUM7UUFDekUsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUNFLEtBQUssQ0FBQyxVQUFBQyxDQUFDO1VBQUEsT0FBSUwsZUFBZSxDQUFDRSxJQUFJLENBQUMsQ0FBQ0ksY0FBYyxDQUFDRCxDQUFDLENBQUM7UUFBQSxFQUFDLEVBQUU7VUFDdkY7VUFDQTtVQUNBSixNQUFJLENBQUNsSSxNQUFNLENBQUNpRSxTQUFTLENBQUNrRSxJQUFJLENBQUMsR0FBR0YsZUFBZSxDQUFDRSxJQUFJLENBQUMsQ0FBQ2pILFlBQVk7VUFDaEVnSCxNQUFJLENBQUNwSSxpQkFBaUIsQ0FBQ3FJLElBQUksQ0FBQyxHQUFHRixlQUFlLENBQUNFLElBQUksQ0FBQztRQUN0RDtNQUNGLENBQUMsQ0FBQztJQUNKO0VBQUM7SUFBQTlILEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBOEYsZ0JBQUEsRUFBa0I7TUFDaEIsSUFBTXFJLGdCQUFnQixHQUFHLElBQUksQ0FBQ0EsZ0JBQWdCLElBQUksQ0FBQyxDQUFDO01BQ3BELElBQU1DLFFBQVEsR0FBRyxJQUFJLENBQUNDLG9CQUFvQixDQUFDQyxNQUFNLENBQy9DLFVBQUNDLElBQUksRUFBRXZJLEdBQUc7UUFBQSxPQUFBN0QsYUFBQSxDQUFBQSxhQUFBLEtBQ0xvTSxJQUFJLFdBQUFqTSxnQkFBQSxpQkFDTjBELEdBQUcsRUFBR21JLGdCQUFnQixDQUFDbkksR0FBRyxDQUFDLEdBQ3hCO1VBQUNoRyxLQUFLLEVBQUUsSUFBSTtVQUFFMEssUUFBUSxFQUFFLENBQUMsQ0FBQztVQUFFOEQsU0FBUyxFQUFFTCxnQkFBZ0IsQ0FBQ25JLEdBQUc7UUFBQyxDQUFDLEdBQzdEO1VBQUNoRyxLQUFLLEVBQUUsSUFBSTtVQUFFMEssUUFBUSxFQUFFLENBQUM7UUFBQyxDQUFDO01BQUEsQ0FDL0IsRUFDRixDQUFDLENBQ0gsQ0FBQztNQUNELElBQU0rRCxRQUFRLEdBQUcsSUFBSSxDQUFDQyxlQUFlLENBQUNKLE1BQU0sQ0FDMUMsVUFBQ0MsSUFBSSxFQUFFdkksR0FBRztRQUFBLE9BQUE3RCxhQUFBLENBQUFBLGFBQUEsS0FDTG9NLElBQUksV0FBQWpNLGdCQUFBLGlCQUNOMEQsR0FBRyxFQUFHO1VBQUNoRyxLQUFLLEVBQUUsSUFBSTtVQUFFMEssUUFBUSxFQUFFLENBQUMsQ0FBQztVQUFFK0QsUUFBUSxFQUFFO1FBQUksQ0FBQztNQUFBLENBQ2xELEVBQ0YsQ0FBQyxDQUNILENBQUM7TUFFRCxPQUFBdE0sYUFBQSxDQUFBQSxhQUFBLEtBQVdpTSxRQUFRLEdBQUtLLFFBQVE7SUFDbEM7RUFBQztJQUFBekksR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUFpTixrQkFBa0IwQixTQUFTLEVBQUU7TUFDM0IsSUFBSSxDQUFDaEosTUFBTSxHQUFBeEQsYUFBQSxDQUFBQSxhQUFBLEtBQU8sSUFBSSxDQUFDd0QsTUFBTSxHQUFLZ0osU0FBUyxDQUFDO01BQzVDLE9BQU8sSUFBSTtJQUNiO0VBQUM7SUFBQTNJLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBNE8scUJBQXFCQyxZQUFZLEVBQUU7TUFDakMsSUFBSSxDQUFDbEosTUFBTSxDQUFDaUUsU0FBUyxHQUFBekgsYUFBQSxDQUFBQSxhQUFBLEtBQU8sSUFBSSxDQUFDd0QsTUFBTSxDQUFDaUUsU0FBUyxHQUFLaUYsWUFBWSxDQUFDO01BQ25FLE9BQU8sSUFBSTtJQUNiO0VBQUM7SUFBQTdJLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBOE8sbUJBQW1CQyxJQUFJLEVBQUVKLFNBQVMsRUFBRTtNQUNsQyxJQUFBSyxZQUFBLEdBQXVDLElBQUksQ0FBQ3JKLE1BQU07UUFBbENzSixRQUFRLEdBQUFELFlBQUEsQ0FBakJqRixPQUFPO1FBQVlILFNBQVMsR0FBQW9GLFlBQUEsQ0FBVHBGLFNBQVM7TUFFbkMsSUFBSSxDQUFDLElBQUE0RCxvQkFBYSxFQUFDbUIsU0FBUyxDQUFDLElBQUksT0FBT0ksSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUN6RCxPQUFPLElBQUk7TUFDYjtNQUVBLElBQU1HLFdBQVcsR0FBR3BPLE1BQU0sQ0FBQ3FPLE9BQU8sQ0FBQ1IsU0FBUyxDQUFDLENBQUNMLE1BQU0sQ0FBQyxVQUFDQyxJQUFJLEVBQUFhLEtBQUEsRUFBbUI7UUFBQSxJQUFBQyxLQUFBLE9BQUFDLGVBQUEsYUFBQUYsS0FBQTtVQUFoQnBKLEdBQUcsR0FBQXFKLEtBQUE7VUFBRXJQLEtBQUssR0FBQXFQLEtBQUE7UUFDckUsT0FBQWxOLGFBQUEsQ0FBQUEsYUFBQSxLQUNLb00sSUFBSSxXQUFBak0sZ0JBQUEsaUJBQ04wRCxHQUFHLEVBQUcsSUFBQXdILG9CQUFhLEVBQUNlLElBQUksQ0FBQ3ZJLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBQXdILG9CQUFhLEVBQUN4TixLQUFLLENBQUMsR0FBQW1DLGFBQUEsQ0FBQUEsYUFBQSxLQUFPb00sSUFBSSxDQUFDdkksR0FBRyxDQUFDLEdBQUtoRyxLQUFLLElBQUlBLEtBQUs7TUFFOUYsQ0FBQyxFQUFFaVAsUUFBUSxDQUFDRixJQUFJLENBQUMsSUFBSS9FLDhCQUFnQixDQUFDO01BRXRDLElBQU1ELE9BQU8sR0FBQTVILGFBQUEsQ0FBQUEsYUFBQSxLQUNSOE0sUUFBUSxXQUFBM00sZ0JBQUEsaUJBQ1Z5TSxJQUFJLEVBQUdHLFdBQVcsRUFDcEI7TUFFRCxJQUFJLENBQUNqQyxpQkFBaUIsQ0FBQztRQUFDbEQsT0FBTyxFQUFQQTtNQUFPLENBQUMsQ0FBQztNQUNqQztNQUNBLElBQU13RixZQUFZLEdBQ2hCM0YsU0FBUyxDQUFDbUYsSUFBSSxDQUFDLEtBQUtuRixTQUFTLENBQUNtRixJQUFJLENBQUMsQ0FBQ1MsTUFBTSxJQUFJNUYsU0FBUyxDQUFDbUYsSUFBSSxDQUFDLENBQUM1SSxJQUFJLEtBQUtzSixxQkFBUSxDQUFDO01BRWxGLElBQUlGLFlBQVksRUFBRTtRQUNoQixJQUFJLENBQUNHLHlCQUF5QixDQUFDZixTQUFTLEVBQUVJLElBQUksQ0FBQztRQUMvQyxJQUFJLENBQUNZLHlCQUF5QixDQUFDaEIsU0FBUyxFQUFFTSxRQUFRLEVBQUVGLElBQUksQ0FBQztRQUN6RCxJQUFJLENBQUNhLG1CQUFtQixDQUFDakIsU0FBUyxFQUFFTSxRQUFRLEVBQUVGLElBQUksQ0FBQztNQUNyRDtNQUVBLE9BQU8sSUFBSTtJQUNiO0VBQUM7SUFBQS9JLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBNFAsb0JBQW9CakIsU0FBUyxFQUFFTSxRQUFRLEVBQUVGLElBQUksRUFBRTtNQUM3QyxJQUFJLENBQUNKLFNBQVMsQ0FBQ2tCLGdCQUFnQixJQUFJLENBQUNsQixTQUFTLENBQUNrQixnQkFBZ0IsQ0FBQ0MsTUFBTSxFQUFFO1FBQ3JFO01BQ0Y7TUFFQSxJQUFBQyxhQUFBLEdBQTZCLElBQUksQ0FBQ3BLLE1BQU07UUFBakNvRSxPQUFPLEdBQUFnRyxhQUFBLENBQVBoRyxPQUFPO1FBQUVILFNBQVMsR0FBQW1HLGFBQUEsQ0FBVG5HLFNBQVM7TUFFekIsSUFBSSxDQUFDQSxTQUFTLENBQUNtRixJQUFJLENBQUMsRUFBRTtNQUN0QixJQUFPUyxNQUFNLEdBQUk1RixTQUFTLENBQUNtRixJQUFJLENBQUMsQ0FBekJTLE1BQU07TUFDYixJQUFNUSxhQUFhLEdBQUE3TixhQUFBLENBQUFBLGFBQUEsS0FDZDRILE9BQU8sQ0FBQ2dGLElBQUksQ0FBQyxDQUFDaUIsYUFBYTtRQUM5QjdPLElBQUksRUFBRSxnQkFBZ0I7UUFDdEJxTyxNQUFNLE1BQUFTLG1CQUFBLGFBQU1ULE1BQU07TUFBQyxFQUNwQjtNQUNELElBQUksQ0FBQ3ZDLGlCQUFpQixDQUFDO1FBQ3JCbEQsT0FBTyxFQUFBNUgsYUFBQSxDQUFBQSxhQUFBLEtBQ0Y0SCxPQUFPLFdBQUF6SCxnQkFBQSxpQkFDVHlNLElBQUksRUFBQTVNLGFBQUEsQ0FBQUEsYUFBQSxLQUNBNEgsT0FBTyxDQUFDZ0YsSUFBSSxDQUFDO1VBQ2hCaUIsYUFBYSxFQUFiQTtRQUFhO01BR25CLENBQUMsQ0FBQztJQUNKO0lBQ0E7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEU7SUFBQWhLLEdBQUE7SUFBQWhHLEtBQUEsRUFNQSxTQUFBMFAsMEJBQTBCZixTQUFTLEVBQUVJLElBQUksRUFBRTtNQUFBLElBQUFtQixxQkFBQTtNQUN6QyxJQUFJLE9BQU92QixTQUFTLENBQUN3QixZQUFZLEtBQUssUUFBUSxFQUFFO01BRWhELElBQUFDLGFBQUEsR0FBNkIsSUFBSSxDQUFDekssTUFBTTtRQUFqQ29FLE9BQU8sR0FBQXFHLGFBQUEsQ0FBUHJHLE9BQU87UUFBRUgsU0FBUyxHQUFBd0csYUFBQSxDQUFUeEcsU0FBUztNQUN6QixJQUFJLENBQUNxRCxpQkFBaUIsQ0FBQztRQUNyQmxELE9BQU8sRUFBQTVILGFBQUEsQ0FBQUEsYUFBQSxLQUNGNEgsT0FBTyxXQUFBekgsZ0JBQUEsaUJBQ1R5TSxJQUFJLEVBQUE1TSxhQUFBLENBQUFBLGFBQUEsS0FDQTRILE9BQU8sQ0FBQ2dGLElBQUksQ0FBQztVQUNoQmMsZ0JBQWdCLEVBQUExTixhQUFBLENBQUFBLGFBQUEsS0FDWDRILE9BQU8sQ0FBQ2dGLElBQUksQ0FBQyxDQUFDYyxnQkFBZ0I7WUFDakMxSixJQUFJLEVBQUV5RCxTQUFTLENBQUNtRixJQUFJLENBQUMsQ0FBQzVJLElBQUk7WUFDMUJrSyxLQUFLLEdBQUFILHFCQUFBLEdBQUV0RyxTQUFTLENBQUNtRixJQUFJLENBQUMsQ0FBQ1MsTUFBTSxjQUFBVSxxQkFBQSx1QkFBdEJBLHFCQUFBLENBQXdCeFEsTUFBTTtZQUNyQzRRLFFBQVEsRUFBRXpJLE9BQU8sQ0FBQytCLFNBQVMsQ0FBQ21GLElBQUksQ0FBQyxDQUFDdUIsUUFBUSxDQUFDO1lBQzNDQyxTQUFTLEVBQUUsSUFBSSxDQUFDQyxZQUFZLENBQUN6QixJQUFJLENBQUM7WUFDbEMwQixXQUFXLEVBQUUsSUFBSSxDQUFDQyxzQkFBc0IsQ0FBQzNCLElBQUk7VUFBQztRQUMvQztNQUdQLENBQUMsQ0FBQztJQUNKOztJQUVBO0VBQUE7SUFBQS9JLEdBQUE7SUFBQWhHLEtBQUEsRUFDQSxTQUFBMlAsMEJBQTBCaEIsU0FBUyxFQUFFTSxRQUFRLEVBQUVGLElBQUksRUFBRTtNQUNuRDtNQUNBLElBQU00QixZQUFZLEdBQ2hCaEMsU0FBUyxDQUFDa0IsZ0JBQWdCLElBQzFCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDZSxJQUFJLENBQ3hCLFVBQUE1SyxHQUFHO1FBQUEsT0FDRDJJLFNBQVMsQ0FBQ2tCLGdCQUFnQixDQUFDM0IsY0FBYyxDQUFDbEksR0FBRyxDQUFDLElBQzlDMkksU0FBUyxDQUFDa0IsZ0JBQWdCLENBQUM3SixHQUFHLENBQUMsS0FDN0IsQ0FBQ2lKLFFBQVEsQ0FBQ0YsSUFBSSxDQUFDLElBQUkvRSw4QkFBZ0IsRUFBRTZGLGdCQUFnQixDQUFDN0osR0FBRyxDQUFDO01BQUEsQ0FDaEUsQ0FBQztNQUNILElBQUksQ0FBQzJLLFlBQVksRUFBRTtNQUVuQixJQUFBRSxhQUFBLEdBQTZCLElBQUksQ0FBQ2xMLE1BQU07UUFBakNvRSxPQUFPLEdBQUE4RyxhQUFBLENBQVA5RyxPQUFPO1FBQUVILFNBQVMsR0FBQWlILGFBQUEsQ0FBVGpILFNBQVM7TUFDekIsSUFBQWtILHFCQUFBLEdBQTBCL0csT0FBTyxDQUFDZ0YsSUFBSSxDQUFDLENBQUNjLGdCQUFnQjtRQUFqRFEsS0FBSyxHQUFBUyxxQkFBQSxDQUFMVCxLQUFLO1FBQUVDLFFBQVEsR0FBQVEscUJBQUEsQ0FBUlIsUUFBUTtNQUN0QixJQUFNckcsVUFBVSxHQUFHTCxTQUFTLENBQUNtRixJQUFJLENBQUM7TUFDbEM7TUFDQSxJQUFJdEUsTUFBTTtNQUNWLElBQUlrRSxTQUFTLENBQUNrQixnQkFBZ0IsQ0FBQzNCLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN0RCxJQUFNckIsS0FBSyxHQUFHLElBQUFrRSwrQkFBbUIsRUFBQzlHLFVBQVUsQ0FBQztRQUU3QyxJQUFJNEMsS0FBSyxFQUFFO1VBQ1QsSUFBTW1FLFNBQVMsR0FBR0MseUJBQVksQ0FBQ25QLE1BQU0sQ0FBQyxVQUFBb1AsRUFBRTtZQUFBLE9BQUksSUFBQUgsK0JBQW1CLEVBQUNHLEVBQUUsQ0FBQyxLQUFLckUsS0FBSztVQUFBLEVBQUM7VUFFOUVwQyxNQUFNLEdBQUd1RyxTQUFTLENBQUNHLElBQUksQ0FBQyxVQUFBRCxFQUFFO1lBQUEsT0FBSUEsRUFBRSxDQUFDMUIsTUFBTSxDQUFDOVAsTUFBTSxLQUFLMlEsS0FBSztVQUFBLEVBQUM7VUFFekQsSUFBSTVGLE1BQU0sSUFBSVIsVUFBVSxDQUFDcUcsUUFBUSxFQUFFO1lBQ2pDN0YsTUFBTSxHQUFHLElBQUEyRyw2QkFBaUIsRUFBQyxJQUFJLEVBQUUzRyxNQUFNLENBQUM7VUFDMUM7VUFFQSxJQUFJQSxNQUFNLElBQUlSLFVBQVUsQ0FBQ29ILFFBQVEsRUFBRTtZQUNqQzVHLE1BQU0sR0FBRyxJQUFJLENBQUM2RyxjQUFjLENBQUN2QyxJQUFJLEVBQUU5RSxVQUFVLENBQUNvSCxRQUFRLEVBQUU1RyxNQUFNLENBQUM7VUFDakU7UUFDRjtNQUNGO01BRUEsSUFBSWtFLFNBQVMsQ0FBQ2tCLGdCQUFnQixDQUFDM0IsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ3pEekQsTUFBTSxHQUFHLElBQUEyRyw2QkFBaUIsRUFBQ2QsUUFBUSxFQUFFN0YsTUFBTSxJQUFJUixVQUFVLENBQUM7TUFDNUQ7TUFFQSxJQUFJUSxNQUFNLEVBQUU7UUFDVixJQUFJLENBQUNtRSxvQkFBb0IsS0FBQXRNLGdCQUFBLGlCQUFHeU0sSUFBSSxFQUFHdEUsTUFBTSxDQUFDLENBQUM7TUFDN0M7SUFDRjtFQUFDO0lBQUF6RSxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQXNSLGVBQWV2QyxJQUFJLEVBQUVzQyxRQUFRLEVBQUVwSCxVQUFVLEVBQUU7TUFBQSxJQUFBc0gsa0JBQUE7TUFDekM7TUFDQSxJQUFBQyxtQkFBQSxHQUF3QjFRLE1BQU0sQ0FBQ3dELE1BQU0sQ0FBQyxJQUFJLENBQUM4RixjQUFjLENBQUMsQ0FBQytHLElBQUksQ0FBQyxVQUFBblIsS0FBSztVQUFBLE9BQUlBLEtBQUssQ0FBQ3dHLEtBQUssS0FBS3VJLElBQUk7UUFBQSxFQUFDO1FBQXZGbEwsS0FBSyxHQUFBMk4sbUJBQUEsQ0FBTDNOLEtBQUs7UUFBRTBDLE1BQU0sR0FBQWlMLG1CQUFBLENBQU5qTCxNQUFNO01BQ3BCLElBQU1KLElBQUksSUFBQW9MLGtCQUFBLEdBQUcsSUFBSSxDQUFDNUwsTUFBTSxDQUFDOUIsS0FBSyxDQUFDLGNBQUEwTixrQkFBQSx1QkFBbEJBLGtCQUFBLENBQW9CcEwsSUFBSTtNQUVyQyxJQUFJQSxJQUFJLEtBQUssUUFBUSxJQUFJQSxJQUFJLEtBQUssU0FBUyxJQUFJQSxJQUFJLEtBQUssTUFBTSxFQUFFO1FBQzlELE9BQU8sSUFBSSxDQUFDc0wsc0JBQXNCLENBQUNKLFFBQVEsRUFBRSxJQUFJLENBQUMxTCxNQUFNLENBQUNZLE1BQU0sQ0FBQyxFQUFFMEQsVUFBVSxDQUFDO01BQy9FOztNQUVBO01BQ0EsT0FBTyxJQUFJLENBQUN5SCxxQkFBcUIsQ0FBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQzFMLE1BQU0sQ0FBQ1ksTUFBTSxDQUFDLEVBQUUwRCxVQUFVLENBQUM7SUFDOUU7RUFBQztJQUFBakUsR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUF5Uix1QkFBdUJKLFFBQVEsRUFBRTlLLE1BQU0sRUFBRTBELFVBQVUsRUFBRTtNQUNuRCxJQUFNdUYsTUFBTSxHQUFHdkYsVUFBVSxDQUFDdUYsTUFBTTtNQUNoQyxJQUFNbUMsa0JBQWtCLEdBQUcsRUFBRTtNQUM3QixJQUFJMUgsVUFBVSxDQUFDOUQsSUFBSSxLQUFLc0oscUJBQVEsRUFBRTtRQUNoQyxPQUFBdE4sYUFBQSxDQUFBQSxhQUFBLEtBQ0s4SCxVQUFVO1VBQ2JvSCxRQUFRLEVBQUU7UUFBRTtNQUVoQjtNQUNBLElBQU1PLFdBQVcsR0FBR1AsUUFBUSxDQUFDcFEsS0FBSyxDQUFDLENBQUMsRUFBRXVPLE1BQU0sQ0FBQzlQLE1BQU0sQ0FBQyxDQUFDOEUsR0FBRyxDQUFDLFVBQUNxTixJQUFJLEVBQUVuTixLQUFLLEVBQUs7UUFDeEVpTixrQkFBa0IsQ0FBQzFQLElBQUksQ0FBQzRQLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUNBLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRXJDLE1BQU0sQ0FBQzlLLEtBQUssQ0FBQyxDQUFDO01BQ2pDLENBQUMsQ0FBQztNQUNGLElBQU1vTixnQkFBZ0IsR0FBR3RDLE1BQU0sQ0FBQ3ZPLEtBQUssQ0FBQzJRLFdBQVcsQ0FBQ2xTLE1BQU0sRUFBRThQLE1BQU0sQ0FBQzlQLE1BQU0sQ0FBQztNQUFDLElBQUFxUyxTQUFBLEdBQUE5UywwQkFBQSxDQUVyRDZTLGdCQUFnQjtRQUFBRSxLQUFBO01BQUE7UUFBcEMsS0FBQUQsU0FBQSxDQUFBbFMsQ0FBQSxNQUFBbVMsS0FBQSxHQUFBRCxTQUFBLENBQUFqUyxDQUFBLElBQUFDLElBQUEsR0FBc0M7VUFBQSxJQUEzQnFHLEtBQUssR0FBQTRMLEtBQUEsQ0FBQWhTLEtBQUE7VUFDZCxJQUFNaVMsUUFBUSxHQUFHMUwsTUFBTSxDQUFDNEssSUFBSSxDQUFDLFVBQUF4TixDQUFDO1lBQUEsT0FBSSxDQUFDZ08sa0JBQWtCLENBQUNsRSxRQUFRLENBQUM5SixDQUFDLENBQUM7VUFBQSxFQUFDO1VBQ2xFLElBQUksQ0FBQ3NPLFFBQVEsRUFBRTtZQUNiO1VBQ0Y7VUFDQU4sa0JBQWtCLENBQUMxUCxJQUFJLENBQUNnUSxRQUFRLENBQUM7VUFDakNMLFdBQVcsQ0FBQzNQLElBQUksQ0FBQyxDQUFDZ1EsUUFBUSxFQUFFN0wsS0FBSyxDQUFDLENBQUM7UUFDckM7TUFBQyxTQUFBN0YsR0FBQTtRQUFBd1IsU0FBQSxDQUFBOVIsQ0FBQSxDQUFBTSxHQUFBO01BQUE7UUFBQXdSLFNBQUEsQ0FBQTVSLENBQUE7TUFBQTtNQUNELE9BQUFnQyxhQUFBLENBQUFBLGFBQUEsS0FDSzhILFVBQVU7UUFDYm9ILFFBQVEsRUFBRU87TUFBVztJQUV6QjtFQUFDO0lBQUE1TCxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQTBSLHNCQUFzQkwsUUFBUSxFQUFFOUssTUFBTSxFQUFFa0UsTUFBTSxFQUFFO01BQzlDLElBQU0rRSxNQUFNLEdBQUcvRSxNQUFNLENBQUMrRSxNQUFNO01BQzVCLElBQUlvQyxXQUFXLEdBQUdQLFFBQVEsQ0FBQ3BRLEtBQUssQ0FBQyxDQUFDLEVBQUV1TyxNQUFNLENBQUM5UCxNQUFNLENBQUM7TUFFbERrUyxXQUFXLEdBQUdBLFdBQVcsQ0FBQ3BOLEdBQUcsQ0FBQyxVQUFDcU4sSUFBSSxFQUFFbk4sS0FBSyxFQUFLO1FBQzdDLElBQU0xRSxLQUFLLEdBQUcwRSxLQUFLLEtBQUtrTixXQUFXLENBQUNsUyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBR21TLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0QsT0FBTyxDQUFDN1IsS0FBSyxFQUFFd1AsTUFBTSxDQUFDOUssS0FBSyxDQUFDLENBQUM7TUFDL0IsQ0FBQyxDQUFDO01BQ0YsSUFBTW9OLGdCQUFnQixHQUFHdEMsTUFBTSxDQUFDdk8sS0FBSyxDQUFDMlEsV0FBVyxDQUFDbFMsTUFBTSxFQUFFOFAsTUFBTSxDQUFDOVAsTUFBTSxDQUFDO01BRXhFLElBQUlvUyxnQkFBZ0IsQ0FBQ3BTLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDL0IsSUFBTXdTLGNBQWMsR0FBR2IsUUFBUSxDQUFDN00sR0FBRyxDQUFDLFVBQUEyTixDQUFDO1VBQUEsT0FBSUEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFBLEVBQUMsQ0FBQ3JRLE1BQU0sQ0FBQyxVQUFBcVEsQ0FBQztVQUFBLE9BQUksT0FBT0EsQ0FBQyxLQUFLLFFBQVE7UUFBQSxFQUFDO1FBQ2pGLElBQU1DLFFBQVEsR0FBRzNHLElBQUksQ0FBQy9DLEdBQUcsQ0FBQXhHLEtBQUEsQ0FBUnVKLElBQUksTUFBQXdFLG1CQUFBLGFBQVFpQyxjQUFjLEVBQUF2RixNQUFBLEVBQUVwRyxNQUFNLENBQUNBLE1BQU0sQ0FBQzdHLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBQztRQUN2RSxJQUFNMlMsU0FBUyxHQUFHVCxXQUFXLENBQUNBLFdBQVcsQ0FBQ2xTLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBTWUsSUFBSSxHQUFHLENBQUMyUixRQUFRLEdBQUdDLFNBQVMsS0FBS1AsZ0JBQWdCLENBQUNwUyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ25Fa1MsV0FBVyxDQUFDQSxXQUFXLENBQUNsUyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcyUyxTQUFTLEdBQUc1UixJQUFJO1FBQUMsSUFBQTZSLFVBQUEsR0FBQXJULDBCQUFBLENBRWpDNlMsZ0JBQWdCLENBQUMzQyxPQUFPLENBQUMsQ0FBQztVQUFBb0QsTUFBQTtRQUFBO1VBQW5ELEtBQUFELFVBQUEsQ0FBQXpTLENBQUEsTUFBQTBTLE1BQUEsR0FBQUQsVUFBQSxDQUFBeFMsQ0FBQSxJQUFBQyxJQUFBLEdBQXFEO1lBQUEsSUFBQXlTLFlBQUEsT0FBQWxELGVBQUEsYUFBQWlELE1BQUEsQ0FBQXZTLEtBQUE7Y0FBekNMLENBQUMsR0FBQTZTLFlBQUE7Y0FBRXBNLEtBQUssR0FBQW9NLFlBQUE7WUFDbEIsSUFBTXhTLEtBQUssR0FBR0wsQ0FBQyxLQUFLbVMsZ0JBQWdCLENBQUNwUyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRzJTLFNBQVMsR0FBSTVSLElBQUksSUFBSWQsQ0FBQyxHQUFHLENBQUMsQ0FBRTtZQUNyRmlTLFdBQVcsQ0FBQzNQLElBQUksQ0FBQyxDQUFDakMsS0FBSyxFQUFFb0csS0FBSyxDQUFDLENBQUM7VUFDbEM7UUFBQyxTQUFBN0YsR0FBQTtVQUFBK1IsVUFBQSxDQUFBclMsQ0FBQSxDQUFBTSxHQUFBO1FBQUE7VUFBQStSLFVBQUEsQ0FBQW5TLENBQUE7UUFBQTtNQUNIO01BQ0EsT0FBQWdDLGFBQUEsQ0FBQUEsYUFBQSxLQUNLc0ksTUFBTTtRQUNUNEcsUUFBUSxFQUFFTztNQUFXO0lBRXpCOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0VBSEU7SUFBQTVMLEdBQUE7SUFBQWhHLEtBQUEsRUFJQSxTQUFBeVMsY0FBQSxFQUFnQjtNQUNkLElBQU81TSxPQUFPLEdBQUksSUFBSSxDQUFDRixNQUFNLENBQXRCRSxPQUFPO01BQ2QsT0FDR0EsT0FBTyxJQUNSL0UsTUFBTSxDQUFDd0QsTUFBTSxDQUFDdUIsT0FBTyxDQUFDLENBQUNtSSxLQUFLLENBQUMsVUFBQWhLLENBQUMsRUFBSTtRQUNoQyxPQUFPNkQsT0FBTyxDQUFDN0QsQ0FBQyxDQUFDeUssUUFBUSxJQUFLekssQ0FBQyxDQUFDaEUsS0FBSyxJQUFJZ0UsQ0FBQyxDQUFDMEcsUUFBUSxHQUFHLENBQUMsQ0FBRSxDQUFDO01BQzVELENBQUMsQ0FBQztJQUVOOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxFO0lBQUExRSxHQUFBO0lBQUFoRyxLQUFBLEVBTUEsU0FBQTBTLGFBQWFDLFNBQVMsRUFBRTtNQUN0QixJQUFJLENBQUNBLFNBQVMsRUFBRTtRQUNkLE9BQU8sS0FBSztNQUNkO01BQ0EsT0FBTzlLLE9BQU8sQ0FBQzhLLFNBQVMsQ0FBQ0MsSUFBSSxJQUFJRCxTQUFTLENBQUNDLElBQUksQ0FBQ2xULE1BQU0sQ0FBQztJQUN6RDtFQUFDO0lBQUFzRyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQTZTLGNBQUEsRUFBZ0I7TUFDZCxPQUFPLElBQUksQ0FBQzFNLElBQUksSUFBSSxJQUFJLENBQUNzTSxhQUFhLENBQUMsQ0FBQztJQUMxQztFQUFDO0lBQUF6TSxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQThTLGtCQUFrQkYsSUFBSSxFQUFFO01BQ3RCLE9BQ0csSUFBSSxDQUFDek0sSUFBSSxJQUNWLElBQUksQ0FBQ3NNLGFBQWEsQ0FBQyxDQUFDLElBQ3BCLElBQUksQ0FBQ0MsWUFBWSxDQUFDRSxJQUFJLENBQUMsSUFDdkIsT0FBTyxJQUFJLENBQUMxRyxXQUFXLEtBQUssVUFBVTtJQUUxQztFQUFDO0lBQUFsRyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQStTLGNBQWMzSixVQUFVLEVBQUVELFdBQVcsRUFBRWMsVUFBVSxFQUFFO01BQ2pELElBQUlBLFVBQVUsQ0FBQzlELElBQUksS0FBS3NKLHFCQUFRLEVBQUU7UUFDaEMsT0FBTyxVQUFDdUQsQ0FBQyxFQUFFNU0sS0FBSyxFQUFLO1VBQ25CLElBQUE2TSxJQUFBLEdBQWtCLElBQUFDLFlBQUcsRUFBQzlNLEtBQUssQ0FBQztZQUFyQjFFLENBQUMsR0FBQXVSLElBQUEsQ0FBRHZSLENBQUM7WUFBRXlSLENBQUMsR0FBQUYsSUFBQSxDQUFERSxDQUFDO1lBQUVDLENBQUMsR0FBQUgsSUFBQSxDQUFERyxDQUFDO1VBQ2QsT0FBTyxDQUFDMVIsQ0FBQyxFQUFFeVIsQ0FBQyxFQUFFQyxDQUFDLENBQUMsQ0FBQ3hDLElBQUksQ0FBQ3lDLEtBQUssQ0FBQyxHQUFHQyw4QkFBYSxHQUFHLENBQUM1UixDQUFDLEVBQUV5UixDQUFDLEVBQUVDLENBQUMsQ0FBQztRQUMxRCxDQUFDO01BQ0gsQ0FBQyxNQUFNLElBQUk3VCxLQUFLLENBQUNDLE9BQU8sQ0FBQ3lLLFVBQVUsQ0FBQ29ILFFBQVEsQ0FBQyxFQUFFO1FBQzdDLElBQU1RLElBQUksR0FBRyxJQUFJMEIsR0FBRyxDQUFDLENBQUM7UUFDdEJ0SixVQUFVLENBQUNvSCxRQUFRLENBQUNoUCxPQUFPLENBQUMsVUFBQW1SLEtBQUEsRUFBWTtVQUFBLElBQUFDLEtBQUEsT0FBQW5FLGVBQUEsYUFBQWtFLEtBQUE7WUFBVkUsQ0FBQyxHQUFBRCxLQUFBO1lBQUV6UCxDQUFDLEdBQUF5UCxLQUFBO1VBQ2hDNUIsSUFBSSxDQUFDdEssR0FBRyxDQUFDbU0sQ0FBQyxFQUFFLE9BQU8xUCxDQUFDLEtBQUssUUFBUSxHQUFHLElBQUFTLG9CQUFRLEVBQUNULENBQUMsQ0FBQyxHQUFHQSxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDOztRQUVGO1FBQ0EsSUFBTXNDLEtBQUssR0FBR3FOLDJCQUFVLENBQUN2SyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQ25DN0MsTUFBTSxDQUFDaEgsS0FBSyxDQUFDNkIsSUFBSSxDQUFDeVEsSUFBSSxDQUFDalEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQy9CNEUsS0FBSyxDQUFDakgsS0FBSyxDQUFDNkIsSUFBSSxDQUFDeVEsSUFBSSxDQUFDdk4sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2hDc1AsT0FBTyxDQUFDTiw4QkFBYSxDQUFDO1FBQ3pCLE9BQU9oTixLQUFLO01BQ2Q7TUFFQSxPQUFPLElBQUksQ0FBQ3VOLGtCQUFrQixDQUFDekssVUFBVSxFQUFFRCxXQUFXLEVBQUVjLFVBQVUsQ0FBQ3VGLE1BQU0sQ0FBQ2hMLEdBQUcsQ0FBQ0Msb0JBQVEsQ0FBQyxDQUFDO0lBQzFGO0VBQUM7SUFBQXVCLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBOFQsc0JBQXNCdE4sS0FBSyxFQUFFdU4sWUFBWSxFQUFFO01BQ3pDLElBQUlDLFlBQVksR0FBR0QsWUFBWSxJQUFJL1EsYUFBYTtNQUNoRCxJQUFJLENBQUN3RCxLQUFLLEVBQUU7UUFDVixPQUFPO1VBQUEsT0FBTXdOLFlBQVk7UUFBQTtNQUMzQjtNQUVBLElBQU1DLE9BQU8sR0FBRyxJQUFJVixHQUFHLENBQUMsQ0FBQztNQUV6QixJQUFJL00sS0FBSyxDQUFDME4sWUFBWSxFQUFFO1FBQ3RCRixZQUFZLEdBQUd4TixLQUFLLENBQUMwTixZQUFZO01BQ25DO01BQUMsSUFBQUMsVUFBQSxHQUFBbFYsMEJBQUEsQ0FDZ0N1SCxLQUFLLENBQUM0TixTQUFTO1FBQUFDLE1BQUE7TUFBQTtRQUFoRCxLQUFBRixVQUFBLENBQUF0VSxDQUFBLE1BQUF3VSxNQUFBLEdBQUFGLFVBQUEsQ0FBQXJVLENBQUEsSUFBQUMsSUFBQSxHQUFrRDtVQUFBLElBQUF1VSxZQUFBLEdBQUFELE1BQUEsQ0FBQXJVLEtBQUE7WUFBdENBLEtBQUssR0FBQXNVLFlBQUEsQ0FBTHRVLEtBQUs7WUFBRXVVLFNBQVMsR0FBQUQsWUFBQSxDQUFUQyxTQUFTO1VBQzFCLElBQUlBLFNBQVMsRUFBRTtZQUNiTixPQUFPLENBQUMxTSxHQUFHLENBQUN2SCxLQUFLLEVBQUV1VSxTQUFTLENBQUM7VUFDL0I7UUFDRjs7UUFFQTtNQUFBLFNBQUFoVSxHQUFBO1FBQUE0VCxVQUFBLENBQUFsVSxDQUFBLENBQUFNLEdBQUE7TUFBQTtRQUFBNFQsVUFBQSxDQUFBaFUsQ0FBQTtNQUFBO01BQ0EsSUFBTW1HLEtBQUssR0FBRyxJQUFBa08scUJBQVksRUFBQyxDQUFDLENBQ3pCak8sTUFBTSxDQUFDaEgsS0FBSyxDQUFDNkIsSUFBSSxDQUFDNlMsT0FBTyxDQUFDclMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2xDNEUsS0FBSyxDQUFDakgsS0FBSyxDQUFDNkIsSUFBSSxDQUFDNlMsT0FBTyxDQUFDM1AsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ25Dc1AsT0FBTyxDQUFDSSxZQUFZLENBQUM7TUFDeEIsT0FBTzFOLEtBQUs7SUFDZDs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5FO0lBQUFOLEdBQUE7SUFBQWhHLEtBQUEsRUFPQSxTQUFBeVUsc0JBQUFDLEtBQUEsRUFBMkU7TUFBQSxJQUFBQyxNQUFBO01BQUEsSUFBQUMsa0JBQUEsR0FBQUYsS0FBQSxDQUFwREcsWUFBWTtRQUFaQSxZQUFZLEdBQUFELGtCQUFBLGNBQUduUixtQkFBbUIsR0FBQW1SLGtCQUFBO1FBQUV2SSxhQUFhLEdBQUFxSSxLQUFBLENBQWJySSxhQUFhO01BQ3RFLElBQU15SSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7O01BRTdCO01BQ0FoVSxNQUFNLENBQUNjLElBQUksQ0FBQyxJQUFJLENBQUN3SSxjQUFjLENBQUMsQ0FBQy9ILE9BQU8sQ0FBQyxVQUFBNkssT0FBTyxFQUFJO1FBQ2xELElBQUE2SCxxQkFBQSxHQVlJSixNQUFJLENBQUN2SyxjQUFjLENBQUM4QyxPQUFPLENBQUM7VUFYOUJySixLQUFLLEdBQUFrUixxQkFBQSxDQUFMbFIsS0FBSztVQUNMbVIsS0FBSyxHQUFBRCxxQkFBQSxDQUFMQyxLQUFLO1VBQ0wxTyxLQUFLLEdBQUF5TyxxQkFBQSxDQUFMek8sS0FBSztVQUNMQyxNQUFNLEdBQUF3TyxxQkFBQSxDQUFOeE8sTUFBTTtVQUNOQyxLQUFLLEdBQUF1TyxxQkFBQSxDQUFMdk8sS0FBSztVQUNMeU8sUUFBUSxHQUFBRixxQkFBQSxDQUFSRSxRQUFRO1VBQ1JwTyxZQUFZLEdBQUFrTyxxQkFBQSxDQUFabE8sWUFBWTtVQUNacU8saUJBQWlCLEdBQUFILHFCQUFBLENBQWpCRyxpQkFBaUI7VUFDakJ2TyxTQUFTLEdBQUFvTyxxQkFBQSxDQUFUcE8sU0FBUztVQUNURixnQkFBZ0IsR0FBQXNPLHFCQUFBLENBQWhCdE8sZ0JBQWdCO1VBQ2hCME8sV0FBVyxHQUFBSixxQkFBQSxDQUFYSSxXQUFXO1FBR2IsSUFBTUMsY0FBYyxHQUFHdk4sT0FBTyxDQUM1QixDQUFDdkIsS0FBSyxJQUFJRyxnQkFBZ0IsS0FBS0MsK0JBQWMsQ0FBQzJPLFFBQVEsS0FBS1YsTUFBSSxDQUFDaFAsTUFBTSxDQUFDOUIsS0FBSyxDQUM5RSxDQUFDO1FBRUQsSUFBSXVSLGNBQWMsRUFBRTtVQUNsQixJQUFNRSxJQUFJLEdBQUcsQ0FBQ1gsTUFBSSxDQUFDaFAsTUFBTSxDQUFDVyxLQUFLLENBQUMsRUFBRXFPLE1BQUksQ0FBQ2hQLE1BQU0sQ0FBQ1ksTUFBTSxDQUFDLEVBQUVvTyxNQUFJLENBQUNoUCxNQUFNLENBQUNpRSxTQUFTLENBQUNwRCxLQUFLLENBQUMsQ0FBQztVQUNwRixJQUFNK08sT0FBTyxHQUFHUCxLQUFLLElBQUlMLE1BQUksQ0FBQ2hQLE1BQU0sQ0FBQ2lFLFNBQVMsQ0FBQ29MLEtBQUssQ0FBQztVQUNyRDtVQUNBO1VBQ0EsSUFBTVEsV0FBVyxHQUFHYixNQUFJLENBQUNoUCxNQUFNLENBQUM5QixLQUFLLENBQUM7VUFDdEMsSUFBTTRSLGdCQUFnQixHQUFHZCxNQUFJLENBQUNoUCxNQUFNLENBQUNpRSxTQUFTLENBQUN1TCxXQUFXLENBQUM7VUFFM0QsSUFBTU8sYUFBYSxHQUNqQmpQLGdCQUFnQixLQUFLQywrQkFBYyxDQUFDMk8sUUFBUSxHQUN4Q3RSLGFBQWEsR0FDYjBDLGdCQUFnQixLQUFLQywrQkFBYyxDQUFDTixLQUFLLEdBQ3pDdU8sTUFBSSxDQUFDNUIsYUFBYSxDQUFBN1EsS0FBQSxDQUFsQnlTLE1BQUksRUFBa0JXLElBQUksQ0FBQyxHQUMzQjdPLGdCQUFnQixLQUFLQywrQkFBYyxDQUFDaVAsWUFBWSxHQUNoRGhCLE1BQUksQ0FBQ2IscUJBQXFCLENBQ3hCYSxNQUFJLENBQUNoUCxNQUFNLENBQUNpRSxTQUFTLENBQUNwRCxLQUFLLENBQUMsRUFDNUJtTyxNQUFJLENBQUNoUCxNQUFNLENBQUNpRSxTQUFTLENBQUNnTSxnQkFDeEIsQ0FBQyxHQUNEakIsTUFBSSxDQUFDZCxrQkFBa0IsQ0FBQTNSLEtBQUEsQ0FBdkJ5UyxNQUFJLEVBQXVCVyxJQUFJLENBQUEzSSxNQUFBLEVBQUU0SSxPQUFPLEdBQUM7VUFFL0NULGtCQUFrQixDQUFDRyxRQUFRLENBQUMsR0FBRyxVQUFBdFIsQ0FBQztZQUFBLE9BQzlCZ1IsTUFBSSxDQUFDa0Isc0JBQXNCLENBQUM7Y0FDMUIzSSxPQUFPLEVBQVBBLE9BQU87Y0FDUGIsYUFBYSxFQUFiQSxhQUFhO2NBQ2IvRixLQUFLLEVBQUVvUCxhQUFhO2NBQ3BCOUMsSUFBSSxFQUFFaUMsWUFBWSxDQUFDeEksYUFBYSxDQUFDLENBQUMxSSxDQUFDLENBQUM7Y0FDcENFLEtBQUssRUFBRTJSLFdBQVc7Y0FDbEJNLFlBQVksRUFBRUwsZ0JBQWdCO2NBQzlCOU8sU0FBUyxFQUFUQTtZQUNGLENBQUMsQ0FBQztVQUFBO1FBQ04sQ0FBQyxNQUFNLElBQUksT0FBT3VPLGlCQUFpQixLQUFLLFVBQVUsRUFBRTtVQUNsREosa0JBQWtCLENBQUNHLFFBQVEsQ0FBQyxHQUFHQyxpQkFBaUIsQ0FBQ1AsTUFBSSxDQUFDaFAsTUFBTSxDQUFDO1FBQy9ELENBQUMsTUFBTTtVQUNMbVAsa0JBQWtCLENBQUNHLFFBQVEsQ0FBQyxHQUMxQixPQUFPcE8sWUFBWSxLQUFLLFVBQVUsR0FBR0EsWUFBWSxDQUFDOE4sTUFBSSxDQUFDaFAsTUFBTSxDQUFDLEdBQUdrQixZQUFZO1FBQ2pGO1FBRUEsSUFBSSxFQUFFb08sUUFBUSxJQUFJSCxrQkFBa0IsQ0FBQyxFQUFFO1VBQ3JDaUIsZUFBTyxDQUFDQyxJQUFJLDRDQUFBckosTUFBQSxDQUE0Q3NJLFFBQVEsSUFBSS9ILE9BQU8sQ0FBRSxDQUFDO1FBQ2hGO01BQ0YsQ0FBQyxDQUFDO01BRUYsT0FBTzRILGtCQUFrQjtJQUMzQjtFQUFDO0lBQUE5TyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQTZULG1CQUFtQnZOLEtBQUssRUFBRUMsTUFBTSxFQUFFQyxLQUFLLEVBQUV3TyxLQUFLLEVBQUU7TUFDOUMsSUFBSTFPLEtBQUssS0FBSytDLDRCQUFXLENBQUM0TSxPQUFPLEVBQUU7UUFDakM7UUFDQSxPQUFPdEMsMkJBQVUsQ0FBQ3JOLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDdkJDLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDdEYsS0FBSyxDQUFDLENBQUMsRUFBRXVGLEtBQUssQ0FBQzlHLE1BQU0sQ0FBQyxDQUFDLENBQ3JDOEcsS0FBSyxDQUFDQSxLQUFLLENBQUMsQ0FDWm9OLE9BQU8sQ0FBQ04sOEJBQWEsQ0FBQztNQUMzQjs7TUFFQTtNQUNBO01BQ0EsSUFBTTRDLGdCQUFnQixHQUFHM1AsTUFBTSxJQUFLQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUs0UCxRQUFTO01BQzlFLElBQU1DLFlBQVksR0FBR3pDLDJCQUFVLENBQUNxQixLQUFLLEdBQUcsUUFBUSxHQUFHMU8sS0FBSyxDQUFDO01BQ3pEO01BQ0EsSUFBSStQLE1BQU0sR0FBR0QsWUFBWSxDQUFDLENBQUM7TUFDM0IsSUFBSTdQLE1BQU0sSUFBSSxDQUFDMlAsZ0JBQWdCLEVBQUU7UUFDL0JHLE1BQU0sR0FBR0EsTUFBTSxDQUFDOVAsTUFBTSxDQUFDQSxNQUFNLENBQUM7TUFDaEM7TUFDQSxPQUFPOFAsTUFBTSxDQUFDN1AsS0FBSyxDQUFDd08sS0FBSyxHQUFHek8sTUFBTSxHQUFHQyxLQUFLLENBQUM7SUFDN0M7O0lBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEU7SUFBQVIsR0FBQTtJQUFBaEcsS0FBQSxFQU1BLFNBQUFzVyxnQkFBZ0JqSyxhQUFhLEVBQUVrSyxXQUFXLEVBQUU7TUFDMUM7TUFDQTtNQUNBLElBQU1DLFVBQVUsR0FDZG5LLGFBQWEsQ0FBQ29LLE9BQU8sQ0FBQyxDQUFDLEdBQUd4VCxlQUFlLEdBQ3JDLElBQUF5VCxpQ0FBYSxFQUFDckssYUFBYSxFQUFFcEosZUFBZSxDQUFDLEdBQzdDb0osYUFBYTtNQUVuQixJQUFNc0ssTUFBTSxHQUFHSCxVQUFVLENBQUNJLFFBQVEsQ0FBQ0wsV0FBVyxDQUFDO01BRS9DLElBQU1NLFNBQVMsR0FBRyxJQUFBQywwQkFBZSxFQUFDSCxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7TUFDdkQsSUFBTUksU0FBUyxHQUFHLElBQUFELDBCQUFlLEVBQUNILE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztNQUV6RCxJQUFJLENBQUNFLFNBQVMsSUFBSSxDQUFDRSxTQUFTLEVBQUU7UUFDNUIsT0FBTyxJQUFJO01BQ2I7TUFFQSxPQUFPLENBQUNBLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRUYsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUVGLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRTtFQUFDO0lBQUE3USxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQWdYLG1CQUFtQkMsa0JBQWtCLEVBQUU7TUFDckMsSUFBTUMsY0FBYyxHQUFHLElBQUFDLCtCQUFrQixFQUFDRixrQkFBa0IsRUFBRSxJQUFJLENBQUNHLHNCQUFzQixDQUFDO01BQzFGLElBQUksQ0FBQ0Esc0JBQXNCLEdBQUdILGtCQUFrQjtNQUVoRCxPQUFPQyxjQUFjO0lBQ3ZCO0VBQUM7SUFBQWxSLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBNlYsdUJBQUF3QixLQUFBLEVBVUc7TUFBQSxJQVREbkssT0FBTyxHQUFBbUssS0FBQSxDQUFQbkssT0FBTztRQUNQNUcsS0FBSyxHQUFBK1EsS0FBQSxDQUFML1EsS0FBSztRQUNMc00sSUFBSSxHQUFBeUUsS0FBQSxDQUFKekUsSUFBSTtRQUNKL08sS0FBSyxHQUFBd1QsS0FBQSxDQUFMeFQsS0FBSztRQUNMd0ksYUFBYSxHQUFBZ0wsS0FBQSxDQUFiaEwsYUFBYTtRQUVieUosWUFBWSxHQUFBdUIsS0FBQSxDQUFadkIsWUFBWTtRQUFBd0IsZUFBQSxHQUFBRCxLQUFBLENBQ1oxUSxTQUFTO1FBQVRBLFNBQVMsR0FBQTJRLGVBQUEsY0FBRzFRLCtCQUFjLEdBQUEwUSxlQUFBO1FBQUFDLGNBQUEsR0FBQUYsS0FBQSxDQUMxQkcsUUFBUTtRQUFSQSxRQUFRLEdBQUFELGNBQUEsY0FBRzNULG9CQUFvQixHQUFBMlQsY0FBQTtNQUUvQixJQUFJRSxnQkFBZ0I7TUFDcEIsSUFBT3RSLElBQUksR0FBSXRDLEtBQUssQ0FBYnNDLElBQUk7TUFDWCxJQUFNbkcsS0FBSyxHQUFHd1gsUUFBUSxDQUFDM1QsS0FBSyxFQUFFK08sSUFBSSxDQUFDO01BQ25DLElBQU04RSxhQUFhLEdBQUcsSUFBSSxDQUFDL1IsTUFBTSxDQUFDaUUsU0FBUyxDQUFDLElBQUksQ0FBQ1EsY0FBYyxDQUFDOEMsT0FBTyxDQUFDLENBQUMxRyxLQUFLLENBQUM7TUFDL0UsSUFBTW1SLFlBQVksR0FBRyxJQUFJLENBQUNoUyxNQUFNLENBQUMsSUFBSSxDQUFDeUUsY0FBYyxDQUFDOEMsT0FBTyxDQUFDLENBQUNySixLQUFLLENBQUM7TUFFcEUsSUFBSTZULGFBQWEsQ0FBQ3ZSLElBQUksS0FBS3NKLHFCQUFRLEVBQUU7UUFDbkMsSUFBTW1JLFdBQVcsR0FBRztVQUNsQnZTLEVBQUUsRUFBRXNTLFlBQVksQ0FBQ0UsV0FBVztVQUM1QjFXLElBQUksRUFBRXdXLFlBQVksQ0FBQ0UsV0FBVztVQUM5Qm5OLFFBQVEsRUFBRWlOLFlBQVksQ0FBQ0csY0FBYztVQUNyQ2hVLGFBQWEsRUFBRSxTQUFBQSxjQUFBSCxDQUFDLEVBQUk7WUFDbEIsT0FBTzBJLGFBQWEsQ0FBQzBMLE9BQU8sQ0FBQ3BVLENBQUMsQ0FBQ2UsS0FBSyxFQUFFaVQsWUFBWSxDQUFDRyxjQUFjLENBQUM7VUFDcEU7UUFDRixDQUFDO1FBRURMLGdCQUFnQixHQUFHRCxRQUFRLENBQUNJLFdBQVcsRUFBRWhGLElBQUksQ0FBQztNQUNoRCxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUFsRiw2QkFBa0IsRUFBQzFOLEtBQUssQ0FBQyxFQUFFO1FBQ3JDLE9BQU8yRyxTQUFTO01BQ2xCO01BRUEsSUFBSXFSLGNBQWM7TUFDbEIsSUFBSTdSLElBQUksS0FBSzhSLGdDQUFlLENBQUNDLFNBQVMsRUFBRTtRQUN0QztRQUNBO1FBQ0FGLGNBQWMsR0FBRzFSLEtBQUssQ0FBQyxJQUFJNlIsSUFBSSxDQUFDblksS0FBSyxDQUFDLEVBQUV5WCxnQkFBZ0IsQ0FBQztNQUMzRCxDQUFDLE1BQU07UUFDTE8sY0FBYyxHQUFHMVIsS0FBSyxDQUFDdEcsS0FBSyxFQUFFeVgsZ0JBQWdCLENBQUM7TUFDakQ7TUFFQSxJQUFJLENBQUMsSUFBQS9KLDZCQUFrQixFQUFDc0ssY0FBYyxDQUFDLEVBQUU7UUFDdkNBLGNBQWMsR0FBR3JSLFNBQVM7TUFDNUI7TUFFQSxPQUFPcVIsY0FBYztJQUN2QjtFQUFDO0lBQUFoUyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQW9ZLFdBQVc3UyxJQUFJLEVBQUU7TUFDZixJQUFJLENBQUNBLElBQUksR0FBQXBELGFBQUEsQ0FBQUEsYUFBQSxLQUFPLElBQUksQ0FBQ29ELElBQUksR0FBS0EsSUFBSSxDQUFDO0lBQ3JDO0VBQUM7SUFBQVMsR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUFxWSxrQkFBa0JDLFFBQVEsRUFBRTtNQUMxQixJQUFJLENBQUM5UyxjQUFjLEdBQUc4UyxRQUFRO0lBQ2hDO0VBQUM7SUFBQXRTLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBdVksc0JBQUFDLE1BQUEsRUFBb0Q7TUFBQSxJQUE3QnZNLGFBQWEsR0FBQXVNLE1BQUEsQ0FBYnZNLGFBQWE7UUFBRTVHLEVBQUUsR0FBQW1ULE1BQUEsQ0FBRm5ULEVBQUU7UUFBRW9ULE9BQU8sR0FBQUQsTUFBQSxDQUFQQyxPQUFPO01BQy9DLElBQU81UyxPQUFPLEdBQUksSUFBSSxDQUFDRixNQUFNLENBQXRCRSxPQUFPO01BRWQsT0FBQTFELGFBQUE7UUFDRXVXLE9BQU8sRUFBRTtVQUFDQyxTQUFTLEVBQUV0VCxFQUFFO1VBQUVvVCxPQUFPLEVBQVBBLE9BQU87VUFBRTVTLE9BQU8sRUFBUEEsT0FBTztVQUFFb0csYUFBYSxFQUFiQTtRQUFhLENBQUM7UUFDekQyTSxPQUFPLEVBQUU7VUFBQ0QsU0FBUyxFQUFFdFQsRUFBRTtVQUFFb1QsT0FBTyxFQUFQQSxPQUFPO1VBQUU1UyxPQUFPLEVBQVBBO1FBQU87TUFBQyxHQUN2QyxDQUFDLElBQUksQ0FBQ0YsTUFBTSxDQUFDa0UsU0FBUyxJQUFJLEVBQUUsRUFBRXlFLE1BQU0sQ0FDckMsVUFBQ0MsSUFBSSxFQUFFc0ssRUFBRSxFQUFFbFosQ0FBQztRQUFBLE9BQUF3QyxhQUFBLENBQUFBLGFBQUEsS0FDUG9NLElBQUksV0FBQWpNLGdCQUFBLHlDQUFBcUssTUFBQSxDQUNrQmhOLENBQUMsR0FBS2taLEVBQUUsQ0FBQ2hWLEtBQUssR0FBR2dWLEVBQUUsQ0FBQ2hWLEtBQUssQ0FBQzFDLElBQUksR0FBRyxJQUFJO01BQUEsQ0FDOUQsRUFDRixDQUFDLENBQ0gsQ0FBQztJQUVMO0VBQUM7SUFBQTZFLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBOFksV0FBVzlNLFFBQVEsRUFBRStNLFlBQVksRUFBRTtNQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDcFQsTUFBTSxDQUFDMkMsTUFBTSxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDO01BQ1g7TUFDQSxJQUFNMFEsT0FBTyxHQUFHLElBQUksQ0FBQ0MsVUFBVSxDQUFDak4sUUFBUSxDQUFDO01BQ3pDLElBQU9LLGFBQWEsR0FBSTJNLE9BQU8sQ0FBeEIzTSxhQUFhO01BRXBCLElBQUksQ0FBQzZNLHlCQUF5QixDQUFDRixPQUFPLENBQUM7TUFDdkMsSUFBSSxDQUFDRyxvQkFBb0IsQ0FBQ0gsT0FBTyxDQUFDO01BRWxDLElBQU16QyxXQUFXLEdBQUcsSUFBSSxDQUFDNkMsbUJBQW1CLENBQUMvTSxhQUFhLENBQUM7TUFDM0QsSUFBTTRLLGtCQUFrQixHQUFHLElBQUksQ0FBQ3NCLHFCQUFxQixDQUFDUyxPQUFPLENBQUM7TUFDOUQsSUFBTTlCLGNBQWMsR0FBRyxJQUFJLENBQUNGLGtCQUFrQixDQUFDQyxrQkFBa0IsQ0FBQztNQUVsRSxJQUFJQyxjQUFjLENBQUMwQixPQUFPLEVBQUU7UUFDMUIsSUFBSSxDQUFDUyxlQUFlLENBQUNoTixhQUFhLEVBQUVrSyxXQUFXLENBQUM7TUFDbEQ7TUFFQSxJQUFJM0QsSUFBSSxHQUFHLEVBQUU7TUFFYixJQUFJLENBQUNzRSxjQUFjLENBQUN3QixPQUFPLElBQUlLLFlBQVksSUFBSUEsWUFBWSxDQUFDbkcsSUFBSSxFQUFFO1FBQ2hFO1FBQ0FBLElBQUksR0FBR21HLFlBQVksQ0FBQ25HLElBQUk7TUFDMUIsQ0FBQyxNQUFNO1FBQ0xBLElBQUksR0FBRyxJQUFJLENBQUMwRyxzQkFBc0IsQ0FBQ04sT0FBTyxFQUFFekMsV0FBVyxDQUFDO01BQzFEO01BRUEsT0FBTztRQUFDM0QsSUFBSSxFQUFKQSxJQUFJO1FBQUVzRSxjQUFjLEVBQWRBO01BQWMsQ0FBQztJQUMvQjs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBSkU7SUFBQWxSLEdBQUE7SUFBQWhHLEtBQUEsRUFLQSxTQUFBa1osMEJBQTBCRixPQUFPLEVBQUU7TUFBQSxJQUFBTyxNQUFBO01BQUEsSUFBQUMsS0FBQSxZQUFBQSxNQUFBLEVBQ2dDO1VBQUEsSUFBQUMscUJBQUE7VUFBNUQsSUFBQUMsaUJBQUEsR0FBQUMsY0FBQSxDQUFBQyxFQUFBO1lBQU8vVixLQUFLLEdBQUE2VixpQkFBQSxDQUFMN1YsS0FBSztZQUFFMkMsS0FBSyxHQUFBa1QsaUJBQUEsQ0FBTGxULEtBQUs7VUFDdEIsSUFBTXFULFFBQVEsR0FBR04sTUFBSSxDQUFDNVQsTUFBTSxDQUFDOUIsS0FBSyxDQUFDO1VBQ25DLElBQU1pVyxtQkFBbUIsSUFBQUwscUJBQUEsR0FBR0YsTUFBSSxDQUFDNVQsTUFBTSxDQUFDaUUsU0FBUyxDQUFDcEQsS0FBSyxDQUFDLGNBQUFpVCxxQkFBQSx1QkFBNUJBLHFCQUFBLENBQThCaEssUUFBUTtVQUNsRSxJQUFJLENBQUNvSyxRQUFRLEVBQUU7WUFBQTtjQUFBN1YsQ0FBQTtZQUFBO1VBRWY7VUFDQSxJQUFJK1YsZUFBZSxHQUFHZixPQUFPLENBQUNqUixNQUFNLENBQUNvSixJQUFJLENBQUMsVUFBQTZJLEVBQUU7WUFBQSxPQUFJQSxFQUFFLENBQUM3WSxJQUFJLEtBQUswWSxRQUFRLENBQUMxWSxJQUFJO1VBQUEsRUFBQyxJQUFJLElBQUk7VUFDbEYsSUFBSTJZLG1CQUFtQixFQUFFO1lBQ3ZCQyxlQUFlLEdBQUE1WCxhQUFBLENBQUFBLGFBQUEsS0FDVjRYLGVBQWU7Y0FDbEJsQyxXQUFXLEVBQUVrQyxlQUFlLENBQUNsQyxXQUFXLElBQUlnQyxRQUFRLENBQUNoQyxXQUFXO2NBQ2hFQyxjQUFjLEVBQUVpQyxlQUFlLENBQUNqQyxjQUFjLElBQUkrQixRQUFRLENBQUMvQjtZQUFjLEVBQzFFO1VBQ0g7VUFDQXlCLE1BQUksQ0FBQ3RNLGlCQUFpQixLQUFBM0ssZ0JBQUEsaUJBQUd1QixLQUFLLEVBQUdrVyxlQUFlLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQUFFLElBQUE7TUFmRCxTQUFBTCxFQUFBLE1BQUFELGNBQUEsR0FBNkI3WSxNQUFNLENBQUN3RCxNQUFNLENBQUMsSUFBSSxDQUFDOEYsY0FBYyxDQUFDLEVBQUF3UCxFQUFBLEdBQUFELGNBQUEsQ0FBQWphLE1BQUEsRUFBQWthLEVBQUE7UUFBQUssSUFBQSxHQUFBVCxLQUFBO1FBQUEsSUFBQVMsSUFBQSxTQUFBQSxJQUFBLENBQUFqVyxDQUFBO01BQUE7SUFnQmpFOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQRTtJQUFBZ0MsR0FBQTtJQUFBaEcsS0FBQSxFQVFBLFNBQUFrYSxrQkFBa0JsTyxRQUFRLEVBQUVtTyxTQUFTLEVBQUU7TUFBQSxJQUFBQyxNQUFBO01BQ3JDLElBQU1DLEtBQUssR0FBRyxJQUFJLENBQUNwQixVQUFVLENBQUNqTixRQUFRLENBQUM7TUFDdkMsSUFBSSxDQUFDcU8sS0FBSyxFQUFFO1FBQ1YsT0FBTyxJQUFJO01BQ2I7TUFDQXZaLE1BQU0sQ0FBQ3dELE1BQU0sQ0FBQyxJQUFJLENBQUM4RixjQUFjLENBQUMsQ0FBQy9ILE9BQU8sQ0FBQyxVQUFBNkssT0FBTyxFQUFJO1FBQ3BELElBQU81RyxLQUFLLEdBQUk0RyxPQUFPLENBQWhCNUcsS0FBSztRQUNaLElBQU1nVSxTQUFTLEdBQUdGLE1BQUksQ0FBQ3pVLE1BQU0sQ0FBQ1csS0FBSyxDQUFDOztRQUVwQztRQUNBO1FBQ0EsSUFBSSxDQUFDNlQsU0FBUyxJQUFJRyxTQUFTLEtBQUtqUiw0QkFBVyxDQUFDNE0sT0FBTyxFQUFFO1VBQ25ELElBQU8xUCxNQUFNLEdBQUkyRyxPQUFPLENBQWpCM0csTUFBTTtVQUNiLElBQU1nVSxhQUFhLEdBQUdILE1BQUksQ0FBQ0ksb0JBQW9CLENBQUNILEtBQUssRUFBRW5OLE9BQU8sQ0FBQztVQUMvRGtOLE1BQUksQ0FBQ25OLGlCQUFpQixLQUFBM0ssZ0JBQUEsaUJBQUdpRSxNQUFNLEVBQUdnVSxhQUFhLENBQUMsQ0FBQztRQUNuRDtNQUNGLENBQUMsQ0FBQztNQUVGLE9BQU8sSUFBSTtJQUNiO0VBQUM7SUFBQXZVLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBaVosV0FBV2pOLFFBQVEsRUFBRTtNQUNuQixPQUFPLElBQUksQ0FBQ3JHLE1BQU0sQ0FBQzJDLE1BQU0sR0FBRzBELFFBQVEsQ0FBQyxJQUFJLENBQUNyRyxNQUFNLENBQUMyQyxNQUFNLENBQUMsR0FBRyxJQUFJO0lBQ2pFOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0VBSEU7SUFBQXRDLEdBQUE7SUFBQWhHLEtBQUEsRUFJQSxTQUFBbU4sc0JBQXNCRCxPQUFPLEVBQUU7TUFDN0IsSUFBSSxDQUFDdU4saUJBQWlCLENBQUN2TixPQUFPLENBQUM7TUFDL0IsSUFBSSxDQUFDd04sYUFBYSxDQUFDeE4sT0FBTyxDQUFDO0lBQzdCOztJQUVBO0FBQ0Y7QUFDQTtFQUZFO0lBQUFsSCxHQUFBO0lBQUFoRyxLQUFBLEVBR0EsU0FBQXlhLGtCQUFrQnZOLE9BQU8sRUFBRTtNQUN6QixJQUFNeU4sYUFBYSxHQUFHLElBQUksQ0FBQ3ZRLGNBQWMsQ0FBQzhDLE9BQU8sQ0FBQztNQUNsRCxJQUFPckosS0FBSyxHQUEyQzhXLGFBQWEsQ0FBN0Q5VyxLQUFLO1FBQUU0QyxnQkFBZ0IsR0FBeUJrVSxhQUFhLENBQXREbFUsZ0JBQWdCO1FBQUVtVSxtQkFBbUIsR0FBSUQsYUFBYSxDQUFwQ0MsbUJBQW1CO01BRW5ELElBQUksSUFBSSxDQUFDalYsTUFBTSxDQUFDOUIsS0FBSyxDQUFDLEVBQUU7UUFDdEI7UUFDQSxJQUFNZ1gsMEJBQTBCLEdBQzlCRCxtQkFBbUIsSUFBSUUsK0NBQThCLENBQUNyVSxnQkFBZ0IsQ0FBQztRQUV6RSxJQUFJLENBQUNvVSwwQkFBMEIsQ0FBQ3BOLFFBQVEsQ0FBQyxJQUFJLENBQUM5SCxNQUFNLENBQUM5QixLQUFLLENBQUMsQ0FBQ3NDLElBQUksQ0FBQyxFQUFFO1VBQ2pFO1VBQ0E7VUFDQSxJQUFJLENBQUM4RyxpQkFBaUIsS0FBQTNLLGdCQUFBLGlCQUFHdUIsS0FBSyxFQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3pDO01BQ0Y7SUFDRjs7SUFFQTtBQUNGO0FBQ0E7RUFGRTtJQUFBbUMsR0FBQTtJQUFBaEcsS0FBQSxFQUdBLFNBQUEwYSxjQUFjeE4sT0FBTyxFQUFFO01BQ3JCLElBQU15TixhQUFhLEdBQUcsSUFBSSxDQUFDdlEsY0FBYyxDQUFDOEMsT0FBTyxDQUFDO01BQ2xELElBQU81RyxLQUFLLEdBQVdxVSxhQUFhLENBQTdCclUsS0FBSztRQUFFRSxLQUFLLEdBQUltVSxhQUFhLENBQXRCblUsS0FBSztNQUNuQixJQUNFLENBQUNGLEtBQUssSUFDTCxJQUFJLENBQUNvSyxzQkFBc0IsQ0FBQ2xLLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQ2IsTUFBTSxDQUFDVyxLQUFLLENBQUMsS0FBSytDLDRCQUFXLENBQUNnTSxRQUFTLEVBQ25GO1FBQ0E7UUFDQTtNQUNGO01BQ0EsSUFBTTBGLFlBQVksR0FBRyxJQUFJLENBQUNDLGVBQWUsQ0FBQzlOLE9BQU8sQ0FBQztNQUNsRDtNQUNBO01BQ0EsSUFBSSxDQUFDNk4sWUFBWSxDQUFDdE4sUUFBUSxDQUFDLElBQUksQ0FBQzlILE1BQU0sQ0FBQ1csS0FBSyxDQUFDLENBQUMsRUFBRTtRQUM5QyxJQUFJLENBQUMyRyxpQkFBaUIsS0FBQTNLLGdCQUFBLGlCQUFHZ0UsS0FBSyxFQUFHeVUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDcEQ7SUFDRjs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBSkU7SUFBQS9VLEdBQUE7SUFBQWhHLEtBQUEsRUFLQSxTQUFBZ2IsZ0JBQWdCOU4sT0FBTyxFQUFFO01BQ3ZCLElBQU15TixhQUFhLEdBQUcsSUFBSSxDQUFDdlEsY0FBYyxDQUFDOEMsT0FBTyxDQUFDO01BQ2xELElBQU9ySixLQUFLLEdBQTZCOFcsYUFBYSxDQUEvQzlXLEtBQUs7UUFBRXlDLEtBQUssR0FBc0JxVSxhQUFhLENBQXhDclUsS0FBSztRQUFFRyxnQkFBZ0IsR0FBSWtVLGFBQWEsQ0FBakNsVSxnQkFBZ0I7TUFFckMsT0FBTyxJQUFJLENBQUNkLE1BQU0sQ0FBQzlCLEtBQUssQ0FBQyxHQUNyQm9YLDJCQUFVLENBQUMsSUFBSSxDQUFDdFYsTUFBTSxDQUFDOUIsS0FBSyxDQUFDLENBQUNzQyxJQUFJLENBQUMsQ0FBQ0csS0FBSyxDQUFDRyxnQkFBZ0IsQ0FBQyxHQUMzRCxDQUFDLElBQUksQ0FBQ2IscUJBQXFCLENBQUMsQ0FBQyxDQUFDVSxLQUFLLENBQUMsQ0FBQztJQUMzQztFQUFDO0lBQUFOLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBa2IseUJBQXlCbEMsT0FBTyxFQUFFOUwsT0FBTyxFQUFFO01BQ3pDLElBQU15TixhQUFhLEdBQUcsSUFBSSxDQUFDdlEsY0FBYyxDQUFDOEMsT0FBTyxDQUFDO01BQ2xELElBQUksQ0FBQ0MscUJBQXFCLENBQUNELE9BQU8sQ0FBQztNQUNuQztNQUNBLElBQU1xTixhQUFhLEdBQUcsSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQ3hCLE9BQU8sRUFBRTJCLGFBQWEsQ0FBQztNQUN2RSxJQUFJLENBQUMxTixpQkFBaUIsS0FBQTNLLGdCQUFBLGlCQUFHcVksYUFBYSxDQUFDcFUsTUFBTSxFQUFHZ1UsYUFBYSxDQUFDLENBQUM7SUFDakU7RUFBQztJQUFBdlUsR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUFtYiwrQkFBQSxFQUFpQztNQUFBLElBQUFDLE1BQUE7TUFDL0IsSUFBTUMsY0FBYyxHQUFHLENBQUMsQ0FBQztNQUN6QnZhLE1BQU0sQ0FBQ3dELE1BQU0sQ0FBQyxJQUFJLENBQUM4RixjQUFjLENBQUMsQ0FBQy9ILE9BQU8sQ0FBQyxVQUFBc1ksYUFBYSxFQUFJO1FBQzFEO1FBQ0EsSUFBTzFGLFFBQVEsR0FBc0QwRixhQUFhLENBQTNFMUYsUUFBUTtVQUFFcFIsS0FBSyxHQUErQzhXLGFBQWEsQ0FBakU5VyxLQUFLO1VBQUV5QyxLQUFLLEdBQXdDcVUsYUFBYSxDQUExRHJVLEtBQUs7VUFBRUMsTUFBTSxHQUFnQ29VLGFBQWEsQ0FBbkRwVSxNQUFNO1VBQUVDLEtBQUssR0FBeUJtVSxhQUFhLENBQTNDblUsS0FBSztVQUFFSyxZQUFZLEdBQVc4VCxhQUFhLENBQXBDOVQsWUFBWTtVQUFFbU8sS0FBSyxHQUFJMkYsYUFBYSxDQUF0QjNGLEtBQUs7UUFFakVxRyxjQUFjLENBQUNwRyxRQUFRLENBQUMsR0FBQTlTLGFBQUEsS0FBQUcsZ0JBQUEsaUJBQUFBLGdCQUFBLGlCQUFBQSxnQkFBQSxpQkFBQUEsZ0JBQUEsaUJBQUFBLGdCQUFBLGlCQUNyQnVCLEtBQUssRUFBR3VYLE1BQUksQ0FBQ3pWLE1BQU0sQ0FBQzlCLEtBQUssQ0FBQyxHQUMxQnlDLEtBQUssRUFBRzhVLE1BQUksQ0FBQ3pWLE1BQU0sQ0FBQ1csS0FBSyxDQUFDLEdBQzFCQyxNQUFNLEVBQUc2VSxNQUFJLENBQUN6VixNQUFNLENBQUNZLE1BQU0sQ0FBQyxHQUM1QkMsS0FBSyxFQUFHNFUsTUFBSSxDQUFDelYsTUFBTSxDQUFDaUUsU0FBUyxDQUFDcEQsS0FBSyxDQUFDLG1CQUN2QixPQUFPSyxZQUFZLEtBQUssVUFBVSxHQUFHQSxZQUFZLENBQUN1VSxNQUFJLENBQUN6VixNQUFNLENBQUMsR0FBR2tCLFlBQVksR0FDdkZtTyxLQUFLLE9BQUExUyxnQkFBQSxpQkFBSzBTLEtBQUssRUFBR29HLE1BQUksQ0FBQ3pWLE1BQU0sQ0FBQ2lFLFNBQVMsQ0FBQ29MLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RDtNQUNILENBQUMsQ0FBQztNQUNGLE9BQU9xRyxjQUFjO0lBQ3ZCO0VBQUM7SUFBQXJWLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBd2EscUJBQXFCeEIsT0FBTyxFQUFFMkIsYUFBYSxFQUFFO01BQzNDLElBQU9yVSxLQUFLLEdBQUlxVSxhQUFhLENBQXRCclUsS0FBSztNQUNaLElBQU16QyxLQUFLLEdBQUcsSUFBSSxDQUFDOEIsTUFBTSxDQUFDZ1YsYUFBYSxDQUFDOVcsS0FBSyxDQUFDO01BQzlDLElBQUksQ0FBQ0EsS0FBSyxJQUFJLENBQUN5QyxLQUFLLEVBQUU7UUFDcEI7UUFDQSxPQUFPcEQsYUFBYTtNQUN0QjtNQUVBLElBQU1vWCxTQUFTLEdBQUcsSUFBSSxDQUFDM1UsTUFBTSxDQUFDVyxLQUFLLENBQUM7TUFDcEMsSUFBTWdWLFlBQVksR0FBR3RDLE9BQU8sQ0FBQ2pSLE1BQU0sQ0FBQ29KLElBQUksQ0FBQyxVQUFBaFIsQ0FBQztRQUFBLE9BQUlBLENBQUMsQ0FBQ2dCLElBQUksS0FBSzBDLEtBQUssQ0FBQzFDLElBQUk7TUFBQSxFQUFDO01BQ3BFLElBQUksQ0FBQ21aLFNBQVMsSUFBSSxDQUFDZ0IsWUFBWSxFQUFFO1FBQy9CO1FBQ0EsT0FBT3BZLGFBQWE7TUFDdEI7TUFFQSxPQUFPOFYsT0FBTyxDQUFDdUMsb0JBQW9CLENBQUNELFlBQVksRUFBRWhCLFNBQVMsQ0FBQyxJQUFJcFgsYUFBYTtJQUMvRTtFQUFDO0lBQUE4QyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQW1aLHFCQUFxQkgsT0FBTyxFQUFFO01BQUEsSUFBQXdDLE1BQUE7TUFDNUIsSUFBSSxDQUFDeEMsT0FBTyxFQUFFO1FBQ1osT0FBTyxJQUFJO01BQ2I7TUFDQWxZLE1BQU0sQ0FBQ3dELE1BQU0sQ0FBQyxJQUFJLENBQUM4RixjQUFjLENBQUMsQ0FBQy9ILE9BQU8sQ0FBQyxVQUFBNkssT0FBTyxFQUFJO1FBQ3BELElBQU13SyxhQUFhLEdBQUc4RCxNQUFJLENBQUM3VixNQUFNLENBQUNpRSxTQUFTLENBQUNzRCxPQUFPLENBQUMxRyxLQUFLLENBQUM7UUFDMUQsSUFBTTNDLEtBQUssR0FBRzJYLE1BQUksQ0FBQzdWLE1BQU0sQ0FBQ3VILE9BQU8sQ0FBQ3JKLEtBQUssQ0FBQztRQUV4QyxJQUFJLENBQUE2VCxhQUFhLGFBQWJBLGFBQWEsdUJBQWJBLGFBQWEsQ0FBRXZSLElBQUksTUFBS3NKLHFCQUFRLElBQUk1TCxLQUFLLGFBQUxBLEtBQUssZUFBTEEsS0FBSyxDQUFFZ1UsV0FBVyxFQUFFO1VBQzFELElBQU15RCxZQUFZLEdBQUd0QyxPQUFPLENBQUNqUixNQUFNLENBQUNvSixJQUFJLENBQUMsVUFBQWhSLENBQUM7WUFBQSxPQUFJQSxDQUFDLENBQUNnQixJQUFJLEtBQUswQyxLQUFLLENBQUNnVSxXQUFXO1VBQUEsRUFBQztVQUMzRSxJQUFNckksTUFBTSxHQUFHd0osT0FBTyxDQUNuQnVDLG9CQUFvQixDQUFDRCxZQUFZLEVBQUVqUyw0QkFBVyxDQUFDNE0sT0FBTyxDQUFDLENBQ3ZEelIsR0FBRyxDQUFDLFVBQUEyTixDQUFDO1lBQUEsT0FBSSxJQUFBc0osZ0NBQW9CLEVBQUN0SixDQUFDLENBQUM7VUFBQSxFQUFDO1VBQ3BDcUosTUFBSSxDQUFDNU0sb0JBQW9CLEtBQUF0TSxnQkFBQSxpQkFDdEI0SyxPQUFPLENBQUMxRyxLQUFLLEVBQUFyRSxhQUFBLENBQUFBLGFBQUEsS0FBT3VWLGFBQWE7WUFBRWxJLE1BQU0sRUFBTkE7VUFBTSxHQUMzQyxDQUFDO1FBQ0o7TUFDRixDQUFDLENBQUM7TUFFRixPQUFPLElBQUk7SUFDYjtFQUFDO0lBQUF4SixHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQTBiLHlCQUF5QjFQLFFBQVEsRUFBRTtNQUFBLElBQUEyUCxNQUFBO01BQ2pDLElBQU0zQyxPQUFPLEdBQUcsSUFBSSxDQUFDQyxVQUFVLENBQUNqTixRQUFRLENBQUM7TUFDekMsSUFBSSxDQUFDQSxRQUFRLEVBQUU7UUFDYjtNQUNGO01BRUEsSUFBTXhHLGNBQWMsR0FBRzFFLE1BQU0sQ0FBQ2MsSUFBSSxDQUFDLElBQUksQ0FBQ3dJLGNBQWMsQ0FBQyxDQUFDa0UsTUFBTSxDQUFDLFVBQUNzTixPQUFPLEVBQUUxTyxPQUFPLEVBQUs7UUFDbkYsSUFBQTJPLHFCQUFBLEdBQXFDRixNQUFJLENBQUN2UixjQUFjLENBQUM4QyxPQUFPLENBQUM7VUFBMUQxRyxLQUFLLEdBQUFxVixxQkFBQSxDQUFMclYsS0FBSztVQUFTbVIsWUFBWSxHQUFBa0UscUJBQUEsQ0FBbkJoWSxLQUFLO1FBQ25CLElBQU02VCxhQUFhLEdBQUdpRSxNQUFJLENBQUNoVyxNQUFNLENBQUNpRSxTQUFTLENBQUNwRCxLQUFLLENBQUM7UUFDbEQsSUFBTTNDLEtBQUssR0FBRzhYLE1BQUksQ0FBQ2hXLE1BQU0sQ0FBQ2dTLFlBQVksQ0FBQztRQUV2QyxJQUFJLENBQUFELGFBQWEsYUFBYkEsYUFBYSx1QkFBYkEsYUFBYSxDQUFFdlIsSUFBSSxNQUFLc0oscUJBQVEsSUFBSTVMLEtBQUssYUFBTEEsS0FBSyxlQUFMQSxLQUFLLENBQUVnVSxXQUFXLEVBQUU7VUFDMUQsSUFBTXlELFlBQVksR0FBR3RDLE9BQU8sQ0FBQ2pSLE1BQU0sQ0FBQ29KLElBQUksQ0FBQyxVQUFBaFIsQ0FBQztZQUFBLE9BQUlBLENBQUMsQ0FBQ2dCLElBQUksS0FBSzBDLEtBQUssQ0FBQ2dVLFdBQVc7VUFBQSxFQUFDO1VBQzNFLElBQU1pRSxNQUFNLEdBQUc5QyxPQUFPLENBQUMrQyxlQUFlLENBQUNsWSxLQUFLLEVBQUV5WCxZQUFZLENBQUM7VUFDM0RNLE9BQU8sQ0FBQzFPLE9BQU8sQ0FBQyxHQUFHNE8sTUFBTTtRQUMzQjtRQUNBLE9BQU9GLE9BQU87TUFDaEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ04sSUFBSSxDQUFDdkQsaUJBQWlCLENBQUM3UyxjQUFjLENBQUM7SUFDeEM7RUFBQztJQUFBUSxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQWdjLGlCQUFpQkMsVUFBVSxFQUFFO01BQzNCLE9BQU8sSUFBSSxDQUFDQyxjQUFjLENBQUNELFVBQVUsQ0FBQyxJQUFJQSxVQUFVLENBQUM3UCxNQUFNLEdBQUc2UCxVQUFVLENBQUM3UCxNQUFNLEdBQUcsSUFBSTtJQUN4RjtFQUFDO0lBQUFwRyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQWtjLGVBQWVELFVBQVUsRUFBRTtNQUFBLElBQUFFLGlCQUFBLEVBQUFDLHFCQUFBO01BQ3pCLE9BQU8sQ0FBQUgsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUVJLE1BQU0sS0FBSSxDQUFBSixVQUFVLGFBQVZBLFVBQVUsd0JBQUFFLGlCQUFBLEdBQVZGLFVBQVUsQ0FBRUssS0FBSyxjQUFBSCxpQkFBQSx3QkFBQUMscUJBQUEsR0FBakJELGlCQUFBLENBQW1CalgsS0FBSyxjQUFBa1gscUJBQUEsdUJBQXhCQSxxQkFBQSxDQUEwQi9XLEVBQUUsTUFBSyxJQUFJLENBQUNBLEVBQUU7SUFDdkU7RUFBQztJQUFBVyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQXVjLHFCQUFxQkMsUUFBUSxFQUFFO01BQzdCLElBQU1DLGFBQWEsR0FBRzNiLE1BQU0sQ0FBQ3dELE1BQU0sQ0FBQyxJQUFJLENBQUM4RixjQUFjLENBQUMsQ0FBQytHLElBQUksQ0FBQyxVQUFBdUwsRUFBRTtRQUFBLE9BQUlBLEVBQUUsQ0FBQ3JXLFFBQVEsS0FBSyxRQUFRO01BQUEsRUFBQztNQUU3RixJQUFJLENBQUNvVyxhQUFhLEVBQUU7UUFDbEIsT0FBTyxDQUFDO01BQ1Y7TUFFQSxJQUFNNVksS0FBSyxHQUFHNFksYUFBYSxDQUFDNVksS0FBSztNQUNqQyxJQUFPOFksTUFBTSxHQUFJLElBQUksQ0FBQ2hYLE1BQU0sQ0FBQ2lFLFNBQVMsQ0FBL0IrUyxNQUFNOztNQUViO01BQ0EsT0FBTyxDQUFDLElBQUksQ0FBQ2hYLE1BQU0sQ0FBQzlCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRzhZLE1BQU0sSUFBSSxJQUFJLENBQUN2UixhQUFhLENBQUNvUixRQUFRLENBQUM7SUFDekU7RUFBQztJQUFBeFcsR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUE0YyxlQUFBLEVBQWlCO01BQ2YsSUFBTUgsYUFBYSxHQUFHM2IsTUFBTSxDQUFDd0QsTUFBTSxDQUFDLElBQUksQ0FBQzhGLGNBQWMsQ0FBQyxDQUFDK0csSUFBSSxDQUFDLFVBQUF1TCxFQUFFO1FBQUEsT0FBSUEsRUFBRSxDQUFDclcsUUFBUSxLQUFLLFFBQVE7TUFBQSxFQUFDO01BRTdGLElBQUksQ0FBQ29XLGFBQWEsSUFBSSxJQUFJLENBQUM5VyxNQUFNLENBQUM4VyxhQUFhLENBQUM1WSxLQUFLLENBQUMsRUFBRTtRQUN0RCxPQUFPLENBQUM7TUFDVjtNQUVBLE9BQU8sSUFBSSxDQUFDOEIsTUFBTSxDQUFDaUUsU0FBUyxDQUFDK1MsTUFBTTtJQUNyQztFQUFDO0lBQUEzVyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQTZjLGlCQUFBLEVBQW1CO01BQ2pCLElBQUFDLGFBQUEsR0FBNEMsSUFBSSxDQUFDblgsTUFBTTtRQUFoRGdFLFdBQVcsR0FBQW1ULGFBQUEsQ0FBWG5ULFdBQVc7UUFBRUQsU0FBUyxHQUFBb1QsYUFBQSxDQUFUcFQsU0FBUztRQUFFRSxTQUFTLEdBQUFrVCxhQUFBLENBQVRsVCxTQUFTO01BQ3hDLElBQU9tVCxXQUFXLEdBQVluVCxTQUFTLENBQWhDbVQsV0FBVztRQUFFSixNQUFNLEdBQUkvUyxTQUFTLENBQW5CK1MsTUFBTTtNQUMxQixJQUFNOVksS0FBSyxHQUFHOEYsV0FBVyxJQUFJRCxTQUFTO01BQ3RDLE9BQU8rQixJQUFJLENBQUN1UixJQUFJLENBQUVuWixLQUFLLElBQUlrWixXQUFXLEdBQUdBLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBR0osTUFBTyxDQUFDO0lBQ3BFO0VBQUM7SUFBQTNXLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBaWQseUJBQXlCL1gsS0FBSyxFQUFFO01BQUEsSUFBQWdZLE9BQUE7TUFDOUIsT0FBT2hZLEtBQUssQ0FBQzBMLElBQUksQ0FBQyxVQUFBM0MsQ0FBQztRQUFBLE9BQUksQ0FBQ2lQLE9BQUksQ0FBQ0MsMkJBQTJCLENBQUMxUCxRQUFRLENBQUNRLENBQUMsQ0FBQztNQUFBLEVBQUM7SUFDdkU7RUFBQztJQUFBakksR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUFvZCwwQkFBMEJDLGlCQUFpQixFQUFFQyxjQUFjLEVBQUU7TUFDM0QsSUFBT0MsS0FBSyxHQUFJRixpQkFBaUIsQ0FBMUJFLEtBQUs7TUFFWixPQUFPO1FBQ0w7UUFDQUMsYUFBYSxFQUFFLENBQUNELEtBQUssQ0FBQ3BWLE9BQU87UUFDN0JzVixjQUFjLEVBQUVGLEtBQUssQ0FBQzVYLE1BQU0sQ0FBQ21CLElBQUksR0FBRyxJQUFJO1FBQ3hDd1csY0FBYyxFQUFFQSxjQUFjLElBQUksUUFBUTtRQUMxQ0ksZUFBZSxFQUFFSCxLQUFLLENBQUNwVjtNQUN6QixDQUFDO0lBQ0g7RUFBQztJQUFBbkMsR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUEyZCx5QkFBQUMsTUFBQSxFQUEyRTtNQUFBLElBQWpEQyxHQUFHLEdBQUFELE1BQUEsQ0FBSEMsR0FBRztRQUFFQyxTQUFTLEdBQUFGLE1BQUEsQ0FBVEUsU0FBUztRQUFFdEIsUUFBUSxHQUFBb0IsTUFBQSxDQUFScEIsUUFBUTtRQUFFdUIsT0FBTyxHQUFBSCxNQUFBLENBQVBHLE9BQU87UUFBRUMsV0FBVyxHQUFBSixNQUFBLENBQVhJLFdBQVc7TUFDdEUsSUFBTUMsa0JBQWtCLEdBQUcsSUFBQUMsaUNBQXFCLEVBQUNGLFdBQVcsQ0FBQztNQUM3RCxPQUFBN2IsYUFBQSxDQUFBQSxhQUFBLEtBQ0s4YixrQkFBa0I7UUFDckI1WSxFQUFFLEVBQUUsSUFBSSxDQUFDQSxFQUFFO1FBQ1h3WSxHQUFHLEVBQUhBLEdBQUc7UUFDSE0sZ0JBQWdCLEVBQUVDLHVCQUFpQixDQUFDQyxNQUFNO1FBQzFDQyxRQUFRLEVBQUUsSUFBSSxDQUFDQyxnQkFBZ0I7UUFDL0JDLGFBQWEsRUFBRSxJQUFJO1FBQ25CQyxVQUFVLEVBQUU7VUFBQ0MsU0FBUyxFQUFFN1csT0FBTyxDQUFDMlUsUUFBUSxDQUFDbUMsVUFBVSxJQUFJLElBQUksQ0FBQ2haLE1BQU0sQ0FBQ2lFLFNBQVMsQ0FBQ2dWLFFBQVE7UUFBQyxDQUFDO1FBQ3ZGM1YsTUFBTSxFQUFFLElBQUksQ0FBQ3RELE1BQU0sQ0FBQ3NELE1BQU07UUFDMUJWLGdCQUFnQixFQUFFLElBQUksQ0FBQzVDLE1BQU0sQ0FBQzRDLGdCQUFnQjtRQUM5QztRQUNBc1csT0FBTyxFQUFFLElBQUksQ0FBQ2xaLE1BQU0sQ0FBQ2lFLFNBQVMsQ0FBQ2lWLE9BQU87UUFDdEM5VixjQUFjLEVBQUUsSUFBSSxDQUFDcEQsTUFBTSxDQUFDb0QsY0FBYztRQUMxQztRQUNBK1YsVUFBVSxHQUFHM2IsbUJBQW1CLEVBQUF3SixNQUFBLEtBQUFzRCxtQkFBQSxhQUFLZ08sa0JBQWtCLENBQUNhLFVBQVUsRUFBQztRQUNuRUMsV0FBVyxFQUFFakIsU0FBUyxHQUFHQSxTQUFTLENBQUNpQixXQUFXLEdBQUc1WixTQUFTO1FBQzFEO1FBQ0E0WSxPQUFPLEVBQUUsSUFBSSxDQUFDcFksTUFBTSxDQUFDa0QsU0FBUyxJQUFJa1Y7TUFBTztJQUU3QztFQUFDO0lBQUEvWCxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQWdmLDBCQUFBLEVBQTRCO01BQzFCLE9BQU87UUFDTDNaLEVBQUUsS0FBQXNILE1BQUEsQ0FBSyxJQUFJLENBQUN0SCxFQUFFLGFBQVU7UUFDeEJpWixRQUFRLEVBQUUsS0FBSztRQUNmRSxhQUFhLEVBQUUsSUFBSTtRQUNuQkwsZ0JBQWdCLEVBQUVDLHVCQUFpQixDQUFDQztNQUN0QyxDQUFDO0lBQ0g7RUFBQztJQUFBclksR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUFpZixxQkFBQUMsTUFBQSxFQUVFQyxVQUFVLEVBQ1Y7TUFBQSxJQUZDNUksV0FBVyxHQUFBMkksTUFBQSxDQUFYM0ksV0FBVztRQUFFNkksU0FBUyxHQUFBRixNQUFBLENBQVRFLFNBQVM7UUFBRUMsV0FBVyxHQUFBSCxNQUFBLENBQVhHLFdBQVc7UUFBRWhFLGNBQWMsR0FBQTZELE1BQUEsQ0FBZDdELGNBQWM7UUFBRWlFLFdBQVcsR0FBQUosTUFBQSxDQUFYSSxXQUFXO01BR2pFLElBQU8xTSxJQUFJLEdBQUl1TSxVQUFVLENBQWxCdk0sSUFBSTtNQUNYLElBQUEyTSxhQUFBLEdBQXNDLElBQUksQ0FBQzVaLE1BQU07UUFBMUNrRSxTQUFTLEdBQUEwVixhQUFBLENBQVQxVixTQUFTO1FBQUV0QixnQkFBZ0IsR0FBQWdYLGFBQUEsQ0FBaEJoWCxnQkFBZ0I7TUFDbEMsSUFBTXVXLFVBQVUsTUFBQW5TLE1BQUEsS0FBQXNELG1CQUFBLGFBQU9xUCxXQUFXLENBQUNSLFVBQVUsSUFBRXZiLHdCQUF3QixFQUFDO01BRXhFLElBQUksQ0FBQ3FQLElBQUksSUFBSSxDQUFDQSxJQUFJLENBQUM0TSxVQUFVLElBQUksQ0FBQzVNLElBQUksQ0FBQzRNLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDNU0sSUFBSSxDQUFDNE0sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxPQUFPLEVBQUU7UUFDbkYsT0FBTyxFQUFFO01BQ1g7TUFFQSxJQUFBQyxVQUFBLE9BQUFwUSxlQUFBLGFBQW9DekYsU0FBUztRQUF0QzhWLFNBQVMsR0FBQUQsVUFBQTtRQUFFRSxjQUFjLEdBQUFGLFVBQUE7TUFDaEMsSUFDRUcsU0FBUyxHQU1QRixTQUFTLENBTlhFLFNBQVM7UUFDVEMsTUFBTSxHQUtKSCxTQUFTLENBTFhHLE1BQU07UUFDQ0MsUUFBUSxHQUliSixTQUFTLENBSlh2WixLQUFLO1FBQ0U0WixTQUFTLEdBR2RMLFNBQVMsQ0FIWDliLEtBQUs7UUFDTG9jLFlBQVksR0FFVk4sU0FBUyxDQUZYTSxZQUFZO1FBQ056VyxTQUFTLEdBQ2JtVyxTQUFTLENBRFg3WSxJQUFJO01BRU4sSUFBQW9aLE1BQUEsR0FLSU4sY0FBYyxJQUFJLENBQUMsQ0FBQztRQUpmTyxpQkFBaUIsR0FBQUQsTUFBQSxDQUF4QjlaLEtBQUs7UUFDRWdhLGNBQWMsR0FBQUYsTUFBQSxDQUFyQnJjLEtBQUs7UUFDU3djLHFCQUFxQixHQUFBSCxNQUFBLENBQW5DRCxZQUFZO1FBQ05LLGtCQUFrQixHQUFBSixNQUFBLENBQXhCcFosSUFBSTtNQUdOLE9BQU8sQ0FDTCxJQUFJeVosdUJBQWUsQ0FBQXBlLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLEtBQ2RtZCxXQUFXO1FBRWQ7UUFDQTtRQUNBamEsRUFBRSxLQUFBc0gsTUFBQSxDQUFLLElBQUksQ0FBQ3RILEVBQUUsT0FBQXNILE1BQUEsQ0FBSXFULFNBQVMsYUFBVEEsU0FBUyx1QkFBVEEsU0FBUyxDQUFFN2UsSUFBSSxPQUFBd0wsTUFBQSxDQUFJeVQsY0FBYyxhQUFkQSxjQUFjLHVCQUFkQSxjQUFjLENBQUVqZixJQUFJLFdBQVE7UUFDakV5UixJQUFJLEVBQUVBLElBQUksQ0FBQ0EsSUFBSTtRQUNmckssZ0JBQWdCLEVBQWhCQSxnQkFBZ0I7UUFDaEJ1VyxVQUFVLEVBQVZBLFVBQVU7UUFFVjBCLFlBQVksRUFBRSxNQUFNO1FBQ3BCQyxnQkFBZ0IsRUFBRSxJQUFJO1FBQ3RCQyxjQUFjLEtBQUEvVCxNQUFBLENBQUssSUFBSSxDQUFDdEgsRUFBRSxZQUFTO1FBRW5Db2EsT0FBTyxFQUFFN00sSUFBSSxDQUFDNE0sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxPQUFPO1FBQ25DTSxRQUFRLEVBQVJBLFFBQVE7UUFDUnZXLFNBQVMsRUFBVEEsU0FBUztRQUNUeVcsWUFBWSxFQUFaQTtNQUFZLEdBRVJHLGNBQWMsSUFBSTtRQUNwQk8sZ0JBQWdCLEVBQUUvTixJQUFJLENBQUM0TSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNDLE9BQU87UUFDNUNVLGlCQUFpQixFQUFqQkEsaUJBQWlCO1FBQ2pCRyxrQkFBa0IsRUFBbEJBLGtCQUFrQjtRQUNsQkQscUJBQXFCLEVBQXJCQTtNQUNGLENBQUM7UUFFRDtRQUNBOUosV0FBVyxFQUFYQSxXQUFXO1FBQ1g2SSxTQUFTLEVBQVRBLFNBQVM7UUFDVEMsV0FBVyxFQUFYQSxXQUFXO1FBQ1h1QixhQUFhLEVBQUVkLE1BQU07UUFDckJlLG9CQUFvQixFQUFFaEIsU0FBUztRQUUvQjtRQUNBaUIsVUFBVSxFQUFFLGFBQWE7UUFDekJDLFlBQVksRUFBRTtVQUFDQyxHQUFHLEVBQUU7UUFBSSxDQUFDO1FBQ3pCQyxVQUFVLEVBQUUsR0FBRztRQUNmQyxZQUFZLEVBQUUsQ0FBQztRQUNmekMsVUFBVSxFQUFFO1VBQ1Y7VUFDQUMsU0FBUyxFQUFFO1FBQ2IsQ0FBQztRQUVEeUMsY0FBYyxFQUFFdk8sSUFBSSxDQUFDdU8sY0FBYztRQUNuQzlGLGNBQWMsRUFBQWxaLGFBQUEsQ0FBQUEsYUFBQSxLQUNUa1osY0FBYztVQUNqQm9FLE9BQU8sRUFBRU8sU0FBUyxhQUFUQSxTQUFTLHVCQUFUQSxTQUFTLENBQUU3ZSxJQUFJO1VBQ3hCNGUsUUFBUSxFQUFFQyxTQUFTLGFBQVRBLFNBQVMsdUJBQVRBLFNBQVMsQ0FBRTVaLEtBQUs7VUFDMUJ3YSxhQUFhLEVBQUVqQixTQUFTLENBQUNHLE1BQU07VUFDL0JlLG9CQUFvQixFQUFFbEIsU0FBUyxDQUFDRSxTQUFTO1VBQ3pDYyxnQkFBZ0IsRUFBRVAsY0FBYyxhQUFkQSxjQUFjLHVCQUFkQSxjQUFjLENBQUVqZjtRQUFJO01BQ3ZDLEVBQ0YsQ0FBQyxDQUNIO0lBQ0g7O0lBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEU7SUFBQTZFLEdBQUE7SUFBQWhHLEtBQUEsRUFNQSxTQUFBb2hCLDRCQUE0QkMsZUFBZSxFQUFlO01BQUEsSUFBYkMsSUFBSSxHQUFBbGYsU0FBQSxDQUFBMUMsTUFBQSxRQUFBMEMsU0FBQSxRQUFBK0MsU0FBQSxHQUFBL0MsU0FBQSxNQUFHLElBQUk7TUFDdEQsSUFBTW1mLFdBQVcsR0FBRyxJQUFJLENBQUMxRSxnQkFBZ0IsQ0FBQyxDQUFDO01BRTNDLE9BQU8sVUFBQWxaLENBQUMsRUFBSTtRQUNWLElBQU02ZCxTQUFTLEdBQ1osT0FBT0gsZUFBZSxLQUFLLFVBQVUsR0FBSUEsZUFBZSxDQUFDMWQsQ0FBQyxDQUFDLEdBQUcwZCxlQUFlO1FBQ2hGLElBQU1JLE1BQU0sR0FBRzVaLE9BQU8sQ0FBQzJaLFNBQVMsQ0FBQztRQUNqQ0YsSUFBSSxHQUFHRyxNQUFNLEdBQUdILElBQUksR0FBRyxJQUFJO1FBQzNCLElBQU1JLEdBQUcsR0FBR0QsTUFBTSxHQUFHRCxTQUFTLEdBQUd4ZSxhQUFhO1FBQzlDLE9BQU87VUFDTHFDLEVBQUUsS0FBQXNILE1BQUEsQ0FBSytVLEdBQUcsUUFBQS9VLE1BQUEsQ0FBSzRVLFdBQVcsT0FBQTVVLE1BQUEsQ0FBSTJVLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFFO1VBQ2hESSxHQUFHLEVBQUhBLEdBQUc7VUFDSEMsS0FBSyxFQUFFSixXQUFXO1VBQ2xCSyxNQUFNLEVBQUVMLFdBQVc7VUFDbkJELElBQUksRUFBSkE7UUFDRixDQUFDO01BQ0gsQ0FBQztJQUNIO0VBQUM7SUFBQXRiLEdBQUE7SUFBQWhHLEtBQUEsRUFFRCxTQUFBc1osdUJBQXVCdUksV0FBVyxFQUFFdEwsV0FBVyxFQUFFO01BQy9DO01BQ0EsT0FBTyxFQUFFO0lBQ1g7RUFBQztJQUFBdlEsR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUFxWixnQkFBZ0JoTixhQUFhLEVBQUVrSyxXQUFXLEVBQUU7TUFDMUM7SUFBQTtFQUNEO0lBQUF2USxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQW9aLG9CQUFvQi9NLGFBQWEsRUFBRTtNQUNqQztNQUNBLE9BQU87UUFBQSxPQUFNLElBQUk7TUFBQTtJQUNuQjtFQUFDO0lBQUFyRyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQXdRLGFBQWFoSyxLQUFLLEVBQUU7TUFBQSxJQUFBc2IsZUFBQSxFQUFBQyxvQkFBQTtNQUNsQixJQUFNbGUsS0FBSyxJQUFBaWUsZUFBQSxHQUFHaGhCLE1BQU0sQ0FBQ3dELE1BQU0sQ0FBQyxJQUFJLENBQUM4RixjQUFjLENBQUMsY0FBQTBYLGVBQUEsd0JBQUFDLG9CQUFBLEdBQWxDRCxlQUFBLENBQW9DM1EsSUFBSSxDQUFDLFVBQUFuUixLQUFLO1FBQUEsT0FBSUEsS0FBSyxDQUFDd0csS0FBSyxLQUFLQSxLQUFLO01BQUEsRUFBQyxjQUFBdWIsb0JBQUEsdUJBQXhFQSxvQkFBQSxDQUEwRWxlLEtBQUs7TUFDN0YsSUFBSUEsS0FBSyxFQUFFO1FBQUEsSUFBQW1lLG1CQUFBO1FBQ1QsUUFBQUEsbUJBQUEsR0FBTyxJQUFJLENBQUNyYyxNQUFNLENBQUM5QixLQUFLLENBQUMsY0FBQW1lLG1CQUFBLHVCQUFsQkEsbUJBQUEsQ0FBb0JuSyxXQUFXO01BQ3hDO0lBQ0Y7RUFBQztJQUFBN1IsR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUEwUSx1QkFBdUJsSyxLQUFLLEVBQUU7TUFBQSxJQUFBeWIscUJBQUE7TUFDNUIsUUFBQUEscUJBQUEsR0FBTyxJQUFJLENBQUN0YyxNQUFNLENBQUNpRSxTQUFTLENBQUNwRCxLQUFLLENBQUMsY0FBQXliLHFCQUFBLHVCQUE1QkEscUJBQUEsQ0FBOEJ4UyxRQUFRO0lBQy9DO0VBQUM7SUFBQXpKLEdBQUE7SUFBQWhHLEtBQUEsRUExd0NELFNBQUFraUIsc0JBQTZCbEosT0FBTyxFQUFFbUosV0FBVyxFQUFFO01BQ2pELE9BQU87UUFBQ2pkLEtBQUssRUFBRSxFQUFFO1FBQUVpZCxXQUFXLEVBQVhBO01BQVcsQ0FBQztJQUNqQzs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEU7SUFBQW5jLEdBQUE7SUFBQWhHLEtBQUEsRUFRQSxTQUFBb2lCLHVCQUE4QkMsYUFBYSxFQUFFQyxTQUFTLEVBQUU7TUFDdEQ7TUFDQSxJQUFNQyxlQUFlLEdBQUd6aEIsTUFBTSxDQUFDYyxJQUFJLENBQUN5Z0IsYUFBYSxDQUFDLENBQUMvVCxNQUFNLENBQUMsVUFBQ3hKLElBQUksRUFBRWtCLEdBQUcsRUFBSztRQUN2RSxJQUFNd2MsY0FBYyxHQUFHRixTQUFTLENBQUN4Z0IsTUFBTSxDQUNyQyxVQUFBM0IsQ0FBQztVQUFBLE9BQUlBLENBQUMsQ0FBQ2dCLElBQUksS0FBS2toQixhQUFhLENBQUNyYyxHQUFHLENBQUMsSUFBSXFjLGFBQWEsQ0FBQ3JjLEdBQUcsQ0FBQyxDQUFDeUgsUUFBUSxDQUFDdE4sQ0FBQyxDQUFDZ0IsSUFBSSxDQUFDO1FBQUEsQ0FDM0UsQ0FBQztRQUVEMkQsSUFBSSxDQUFDa0IsR0FBRyxDQUFDLEdBQUd3YyxjQUFjLENBQUM5aUIsTUFBTSxHQUM3QjhpQixjQUFjLENBQUNoZSxHQUFHLENBQUMsVUFBQXJFLENBQUM7VUFBQSxPQUFLO1lBQ3ZCSCxLQUFLLEVBQUVHLENBQUMsQ0FBQ2dCLElBQUk7WUFDYnVKLFFBQVEsRUFBRXZLLENBQUMsQ0FBQ3VLO1VBQ2QsQ0FBQztRQUFBLENBQUMsQ0FBQyxHQUNILElBQUk7UUFDUixPQUFPNUYsSUFBSTtNQUNiLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUVOLElBQUksQ0FBQ2hFLE1BQU0sQ0FBQ3dELE1BQU0sQ0FBQ2llLGVBQWUsQ0FBQyxDQUFDdlUsS0FBSyxDQUFDbkcsT0FBTyxDQUFDLEVBQUU7UUFDbEQ7UUFDQSxPQUFPLElBQUk7TUFDYjtNQUVBLE9BQU8sSUFBSSxDQUFDNGEseUJBQXlCLENBQUNGLGVBQWUsQ0FBQztJQUN4RDtFQUFDO0lBQUF2YyxHQUFBO0lBQUFoRyxLQUFBLEVBRUQsU0FBQXlpQiwwQkFBaUNGLGVBQWUsRUFBRTtNQUNoRDtNQUNBO01BQ0E7TUFDQSxJQUFNRyxPQUFPLEdBQUc1aEIsTUFBTSxDQUFDYyxJQUFJLENBQUMyZ0IsZUFBZSxDQUFDO01BQzVDLElBQU1JLFFBQVEsR0FBR0QsT0FBTyxDQUFDbGUsR0FBRyxDQUFDLFVBQUNrUCxDQUFDLEVBQUUvVCxDQUFDO1FBQUEsT0FBT0EsQ0FBQyxLQUFLK2lCLE9BQU8sQ0FBQ2hqQixNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7TUFBQSxDQUFFLENBQUM7TUFDN0UsSUFBTWtqQixXQUFXLEdBQUdGLE9BQU8sQ0FBQ2xlLEdBQUcsQ0FBQyxVQUFBa1AsQ0FBQztRQUFBLE9BQUk2TyxlQUFlLENBQUM3TyxDQUFDLENBQUMsQ0FBQ2hVLE1BQU07TUFBQSxFQUFDO01BQy9ELElBQU1takIsS0FBSyxHQUFHLEVBQUU7O01BRWhCO01BQ0EsT0FBT0MsaUJBQWlCLENBQUNILFFBQVEsRUFBRUMsV0FBVyxFQUFFRCxRQUFRLENBQUNqakIsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQ3BFLElBQU1xakIsT0FBTyxHQUFHSixRQUFRLENBQUNyVSxNQUFNLENBQUMsVUFBQ3hKLElBQUksRUFBRWtlLElBQUksRUFBRXJqQixDQUFDLEVBQUs7VUFDakRtRixJQUFJLENBQUM0ZCxPQUFPLENBQUMvaUIsQ0FBQyxDQUFDLENBQUMsR0FBRzRpQixlQUFlLENBQUNHLE9BQU8sQ0FBQy9pQixDQUFDLENBQUMsQ0FBQyxDQUFDcWpCLElBQUksQ0FBQztVQUNwRCxPQUFPbGUsSUFBSTtRQUNiLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVOK2QsS0FBSyxDQUFDNWdCLElBQUksQ0FBQzhnQixPQUFPLENBQUM7TUFDckI7TUFDQTs7TUFFQTtNQUNBLFNBQVNELGlCQUFpQkEsQ0FBQ0csR0FBRyxFQUFFQyxNQUFNLEVBQUV4ZSxLQUFLLEVBQUU7UUFDN0MsSUFBSUEsS0FBSyxLQUFLLENBQUMsSUFBSXVlLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBS0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtVQUMzQztVQUNBLE9BQU8sS0FBSztRQUNkO1FBRUEsSUFBSUQsR0FBRyxDQUFDdmUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHd2UsTUFBTSxDQUFDeGUsS0FBSyxDQUFDLEVBQUU7VUFDbEN1ZSxHQUFHLENBQUN2ZSxLQUFLLENBQUMsR0FBR3VlLEdBQUcsQ0FBQ3ZlLEtBQUssQ0FBQyxHQUFHLENBQUM7VUFDM0IsT0FBTyxJQUFJO1FBQ2I7UUFFQXVlLEdBQUcsQ0FBQ3ZlLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDZCxPQUFPb2UsaUJBQWlCLENBQUNHLEdBQUcsRUFBRUMsTUFBTSxFQUFFeGUsS0FBSyxHQUFHLENBQUMsQ0FBQztNQUNsRDtNQUVBLE9BQU9tZSxLQUFLO0lBQ2Q7RUFBQztJQUFBN2MsR0FBQTtJQUFBaEcsS0FBQSxFQUVELFNBQUF5RSxTQUFnQjBOLENBQUMsRUFBRTtNQUNqQixPQUFPLElBQUExTixvQkFBUSxFQUFDME4sQ0FBQyxDQUFDO0lBQ3BCO0VBQUM7RUFBQSxPQUFBbE4sS0FBQTtBQUFBO0FBQUEsSUFBQWtlLFFBQUEsR0FBQXBnQixPQUFBLGNBZ3NDWWtDLEtBQUsifQ==