@sidekick-coder/zenith-kit 0.0.13 → 0.0.15

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 (429) hide show
  1. package/bin/zenith.js +2 -3
  2. package/cli/commands/generateLegacyFolder.js +38 -0
  3. package/cli/commands/generatePluginId.js +17 -0
  4. package/cli/utils/createWrapper.js +4 -7
  5. package/dist/client/index.d.mts +70 -5
  6. package/dist/client/index.mjs +2 -2
  7. package/dist/components/index.es.js +20025 -21787
  8. package/dist/components/styles.css +81 -4
  9. package/dist/server/index.d.mts +1425 -387
  10. package/dist/server/index.mjs +5 -5
  11. package/dist/shared/index.d.mts +217 -3
  12. package/dist/shared/index.mjs +2 -2
  13. package/legacy/client/components/Alert.vue +3 -0
  14. package/legacy/client/components/AlertButton.vue +3 -0
  15. package/legacy/client/components/Button.vue +3 -0
  16. package/legacy/client/components/ClientOnly.vue +3 -0
  17. package/legacy/client/components/ColorPicker.vue +3 -0
  18. package/legacy/client/components/ColorWheel.vue +3 -0
  19. package/legacy/client/components/Component.vue +3 -0
  20. package/legacy/client/components/DataTable.vue +4 -0
  21. package/legacy/client/components/DataTablePagination.vue +3 -0
  22. package/legacy/client/components/DatePicker.vue +3 -0
  23. package/legacy/client/components/DialogForm.vue +4 -0
  24. package/legacy/client/components/FileUploader.vue +3 -0
  25. package/legacy/client/components/FormAutoFieldList.vue +3 -0
  26. package/legacy/client/components/FormAutocomplete.vue +3 -0
  27. package/legacy/client/components/FormColorPicker.vue +3 -0
  28. package/legacy/client/components/FormDatePicker.vue +3 -0
  29. package/legacy/client/components/FormFilePicker.vue +3 -0
  30. package/legacy/client/components/FormFileUploader.vue +3 -0
  31. package/legacy/client/components/FormImageUploader.vue +3 -0
  32. package/legacy/client/components/FormJsonInput.vue +3 -0
  33. package/legacy/client/components/FormSelect.vue +3 -0
  34. package/legacy/client/components/FormStringListInput.vue +3 -0
  35. package/legacy/client/components/FormSwitch.vue +3 -0
  36. package/legacy/client/components/FormTextField.vue +3 -0
  37. package/legacy/client/components/FormTextarea.vue +3 -0
  38. package/legacy/client/components/Icon.vue +3 -0
  39. package/legacy/client/components/Image.vue +3 -0
  40. package/legacy/client/components/JsonInput.vue +3 -0
  41. package/legacy/client/components/Logo.vue +3 -0
  42. package/legacy/client/components/LogoIcon.vue +3 -0
  43. package/legacy/client/components/ObjectInspect.vue +3 -0
  44. package/legacy/client/components/PageCrud.vue +3 -0
  45. package/legacy/client/components/PageSubtitle.vue +3 -0
  46. package/legacy/client/components/PageTable.vue +3 -0
  47. package/legacy/client/components/PageTitle.vue +3 -0
  48. package/legacy/client/components/Pagination.vue +3 -0
  49. package/legacy/client/components/Select.vue +3 -0
  50. package/legacy/client/components/StringListInput.vue +3 -0
  51. package/legacy/client/components/Switch.vue +3 -0
  52. package/legacy/client/components/TextField.vue +3 -0
  53. package/legacy/client/components/Textarea.vue +3 -0
  54. package/legacy/client/components/UserMenu.vue +3 -0
  55. package/legacy/client/components/index.ts +349 -0
  56. package/legacy/client/components/ui/accordion/Accordion.vue +3 -0
  57. package/legacy/client/components/ui/accordion/AccordionContent.vue +3 -0
  58. package/legacy/client/components/ui/accordion/AccordionItem.vue +3 -0
  59. package/legacy/client/components/ui/accordion/AccordionTrigger.vue +3 -0
  60. package/legacy/client/components/ui/accordion/index.ts +1 -0
  61. package/legacy/client/components/ui/alert/Alert.vue +3 -0
  62. package/legacy/client/components/ui/alert/AlertDescription.vue +3 -0
  63. package/legacy/client/components/ui/alert/AlertTitle.vue +3 -0
  64. package/legacy/client/components/ui/alert/index.ts +1 -0
  65. package/legacy/client/components/ui/alert-dialog/AlertDialog.vue +3 -0
  66. package/legacy/client/components/ui/alert-dialog/AlertDialogAction.vue +3 -0
  67. package/legacy/client/components/ui/alert-dialog/AlertDialogCancel.vue +3 -0
  68. package/legacy/client/components/ui/alert-dialog/AlertDialogContent.vue +3 -0
  69. package/legacy/client/components/ui/alert-dialog/AlertDialogDescription.vue +3 -0
  70. package/legacy/client/components/ui/alert-dialog/AlertDialogFooter.vue +3 -0
  71. package/legacy/client/components/ui/alert-dialog/AlertDialogHeader.vue +3 -0
  72. package/legacy/client/components/ui/alert-dialog/AlertDialogTitle.vue +3 -0
  73. package/legacy/client/components/ui/alert-dialog/AlertDialogTrigger.vue +3 -0
  74. package/legacy/client/components/ui/alert-dialog/index.ts +1 -0
  75. package/legacy/client/components/ui/aspect-ratio/AspectRatio.vue +3 -0
  76. package/legacy/client/components/ui/aspect-ratio/index.ts +1 -0
  77. package/legacy/client/components/ui/avatar/Avatar.vue +3 -0
  78. package/legacy/client/components/ui/avatar/AvatarFallback.vue +3 -0
  79. package/legacy/client/components/ui/avatar/AvatarImage.vue +3 -0
  80. package/legacy/client/components/ui/avatar/index.ts +1 -0
  81. package/legacy/client/components/ui/badge/Badge.vue +3 -0
  82. package/legacy/client/components/ui/badge/index.ts +1 -0
  83. package/legacy/client/components/ui/breadcrumb/Breadcrumb.vue +3 -0
  84. package/legacy/client/components/ui/breadcrumb/BreadcrumbEllipsis.vue +3 -0
  85. package/legacy/client/components/ui/breadcrumb/BreadcrumbItem.vue +3 -0
  86. package/legacy/client/components/ui/breadcrumb/BreadcrumbLink.vue +3 -0
  87. package/legacy/client/components/ui/breadcrumb/BreadcrumbList.vue +3 -0
  88. package/legacy/client/components/ui/breadcrumb/BreadcrumbPage.vue +3 -0
  89. package/legacy/client/components/ui/breadcrumb/BreadcrumbSeparator.vue +3 -0
  90. package/legacy/client/components/ui/breadcrumb/index.ts +1 -0
  91. package/legacy/client/components/ui/button/Button.vue +3 -0
  92. package/legacy/client/components/ui/button/index.ts +1 -0
  93. package/legacy/client/components/ui/calendar/Calendar.vue +3 -0
  94. package/legacy/client/components/ui/calendar/CalendarCell.vue +3 -0
  95. package/legacy/client/components/ui/calendar/CalendarCellTrigger.vue +3 -0
  96. package/legacy/client/components/ui/calendar/CalendarGrid.vue +3 -0
  97. package/legacy/client/components/ui/calendar/CalendarGridBody.vue +3 -0
  98. package/legacy/client/components/ui/calendar/CalendarGridHead.vue +3 -0
  99. package/legacy/client/components/ui/calendar/CalendarGridRow.vue +3 -0
  100. package/legacy/client/components/ui/calendar/CalendarHeadCell.vue +3 -0
  101. package/legacy/client/components/ui/calendar/CalendarHeader.vue +3 -0
  102. package/legacy/client/components/ui/calendar/CalendarHeading.vue +3 -0
  103. package/legacy/client/components/ui/calendar/CalendarNextButton.vue +3 -0
  104. package/legacy/client/components/ui/calendar/CalendarPrevButton.vue +3 -0
  105. package/legacy/client/components/ui/calendar/index.ts +1 -0
  106. package/legacy/client/components/ui/card/Card.vue +3 -0
  107. package/legacy/client/components/ui/card/CardAction.vue +3 -0
  108. package/legacy/client/components/ui/card/CardContent.vue +3 -0
  109. package/legacy/client/components/ui/card/CardDescription.vue +3 -0
  110. package/legacy/client/components/ui/card/CardFooter.vue +3 -0
  111. package/legacy/client/components/ui/card/CardHeader.vue +3 -0
  112. package/legacy/client/components/ui/card/CardTitle.vue +3 -0
  113. package/legacy/client/components/ui/card/index.ts +1 -0
  114. package/legacy/client/components/ui/carousel/Carousel.vue +3 -0
  115. package/legacy/client/components/ui/carousel/CarouselContent.vue +3 -0
  116. package/legacy/client/components/ui/carousel/CarouselItem.vue +3 -0
  117. package/legacy/client/components/ui/carousel/CarouselNext.vue +3 -0
  118. package/legacy/client/components/ui/carousel/CarouselPrevious.vue +3 -0
  119. package/legacy/client/components/ui/carousel/index.ts +1 -0
  120. package/legacy/client/components/ui/checkbox/Checkbox.vue +3 -0
  121. package/legacy/client/components/ui/checkbox/index.ts +1 -0
  122. package/legacy/client/components/ui/collapsible/Collapsible.vue +3 -0
  123. package/legacy/client/components/ui/collapsible/CollapsibleContent.vue +3 -0
  124. package/legacy/client/components/ui/collapsible/CollapsibleTrigger.vue +3 -0
  125. package/legacy/client/components/ui/collapsible/index.ts +1 -0
  126. package/legacy/client/components/ui/combobox/Combobox.vue +3 -0
  127. package/legacy/client/components/ui/combobox/ComboboxAnchor.vue +3 -0
  128. package/legacy/client/components/ui/combobox/ComboboxEmpty.vue +3 -0
  129. package/legacy/client/components/ui/combobox/ComboboxGroup.vue +3 -0
  130. package/legacy/client/components/ui/combobox/ComboboxInput.vue +3 -0
  131. package/legacy/client/components/ui/combobox/ComboboxItem.vue +3 -0
  132. package/legacy/client/components/ui/combobox/ComboboxItemIndicator.vue +3 -0
  133. package/legacy/client/components/ui/combobox/ComboboxList.vue +3 -0
  134. package/legacy/client/components/ui/combobox/ComboboxSeparator.vue +3 -0
  135. package/legacy/client/components/ui/combobox/ComboboxTrigger.vue +3 -0
  136. package/legacy/client/components/ui/combobox/ComboboxViewport.vue +3 -0
  137. package/legacy/client/components/ui/combobox/index.ts +1 -0
  138. package/legacy/client/components/ui/command/Command.vue +3 -0
  139. package/legacy/client/components/ui/command/CommandDialog.vue +3 -0
  140. package/legacy/client/components/ui/command/CommandEmpty.vue +3 -0
  141. package/legacy/client/components/ui/command/CommandGroup.vue +3 -0
  142. package/legacy/client/components/ui/command/CommandInput.vue +3 -0
  143. package/legacy/client/components/ui/command/CommandItem.vue +3 -0
  144. package/legacy/client/components/ui/command/CommandList.vue +3 -0
  145. package/legacy/client/components/ui/command/CommandSeparator.vue +3 -0
  146. package/legacy/client/components/ui/command/CommandShortcut.vue +3 -0
  147. package/legacy/client/components/ui/command/index.ts +1 -0
  148. package/legacy/client/components/ui/context-menu/ContextMenu.vue +3 -0
  149. package/legacy/client/components/ui/context-menu/ContextMenuCheckboxItem.vue +3 -0
  150. package/legacy/client/components/ui/context-menu/ContextMenuContent.vue +3 -0
  151. package/legacy/client/components/ui/context-menu/ContextMenuGroup.vue +3 -0
  152. package/legacy/client/components/ui/context-menu/ContextMenuItem.vue +3 -0
  153. package/legacy/client/components/ui/context-menu/ContextMenuLabel.vue +3 -0
  154. package/legacy/client/components/ui/context-menu/ContextMenuPortal.vue +3 -0
  155. package/legacy/client/components/ui/context-menu/ContextMenuRadioGroup.vue +3 -0
  156. package/legacy/client/components/ui/context-menu/ContextMenuRadioItem.vue +3 -0
  157. package/legacy/client/components/ui/context-menu/ContextMenuSeparator.vue +3 -0
  158. package/legacy/client/components/ui/context-menu/ContextMenuShortcut.vue +3 -0
  159. package/legacy/client/components/ui/context-menu/ContextMenuSub.vue +3 -0
  160. package/legacy/client/components/ui/context-menu/ContextMenuSubContent.vue +3 -0
  161. package/legacy/client/components/ui/context-menu/ContextMenuSubTrigger.vue +3 -0
  162. package/legacy/client/components/ui/context-menu/ContextMenuTrigger.vue +3 -0
  163. package/legacy/client/components/ui/context-menu/index.ts +1 -0
  164. package/legacy/client/components/ui/dialog/Dialog.vue +3 -0
  165. package/legacy/client/components/ui/dialog/DialogClose.vue +3 -0
  166. package/legacy/client/components/ui/dialog/DialogContent.vue +3 -0
  167. package/legacy/client/components/ui/dialog/DialogDescription.vue +3 -0
  168. package/legacy/client/components/ui/dialog/DialogFooter.vue +3 -0
  169. package/legacy/client/components/ui/dialog/DialogHeader.vue +3 -0
  170. package/legacy/client/components/ui/dialog/DialogOverlay.vue +3 -0
  171. package/legacy/client/components/ui/dialog/DialogScrollContent.vue +3 -0
  172. package/legacy/client/components/ui/dialog/DialogTitle.vue +3 -0
  173. package/legacy/client/components/ui/dialog/DialogTrigger.vue +3 -0
  174. package/legacy/client/components/ui/dialog/index.ts +1 -0
  175. package/legacy/client/components/ui/drawer/Drawer.vue +3 -0
  176. package/legacy/client/components/ui/drawer/DrawerClose.vue +3 -0
  177. package/legacy/client/components/ui/drawer/DrawerContent.vue +3 -0
  178. package/legacy/client/components/ui/drawer/DrawerDescription.vue +3 -0
  179. package/legacy/client/components/ui/drawer/DrawerFooter.vue +3 -0
  180. package/legacy/client/components/ui/drawer/DrawerHeader.vue +3 -0
  181. package/legacy/client/components/ui/drawer/DrawerOverlay.vue +3 -0
  182. package/legacy/client/components/ui/drawer/DrawerTitle.vue +3 -0
  183. package/legacy/client/components/ui/drawer/DrawerTrigger.vue +3 -0
  184. package/legacy/client/components/ui/drawer/index.ts +1 -0
  185. package/legacy/client/components/ui/dropdown-menu/DropdownMenu.vue +3 -0
  186. package/legacy/client/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +3 -0
  187. package/legacy/client/components/ui/dropdown-menu/DropdownMenuContent.vue +3 -0
  188. package/legacy/client/components/ui/dropdown-menu/DropdownMenuGroup.vue +3 -0
  189. package/legacy/client/components/ui/dropdown-menu/DropdownMenuItem.vue +3 -0
  190. package/legacy/client/components/ui/dropdown-menu/DropdownMenuLabel.vue +3 -0
  191. package/legacy/client/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +3 -0
  192. package/legacy/client/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +3 -0
  193. package/legacy/client/components/ui/dropdown-menu/DropdownMenuSeparator.vue +3 -0
  194. package/legacy/client/components/ui/dropdown-menu/DropdownMenuShortcut.vue +3 -0
  195. package/legacy/client/components/ui/dropdown-menu/DropdownMenuSub.vue +3 -0
  196. package/legacy/client/components/ui/dropdown-menu/DropdownMenuSubContent.vue +3 -0
  197. package/legacy/client/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +3 -0
  198. package/legacy/client/components/ui/dropdown-menu/DropdownMenuTrigger.vue +3 -0
  199. package/legacy/client/components/ui/dropdown-menu/index.ts +1 -0
  200. package/legacy/client/components/ui/form/FormControl.vue +3 -0
  201. package/legacy/client/components/ui/form/FormDescription.vue +3 -0
  202. package/legacy/client/components/ui/form/FormItem.vue +3 -0
  203. package/legacy/client/components/ui/form/FormLabel.vue +3 -0
  204. package/legacy/client/components/ui/form/FormMessage.vue +3 -0
  205. package/legacy/client/components/ui/form/index.ts +1 -0
  206. package/legacy/client/components/ui/hover-card/HoverCard.vue +3 -0
  207. package/legacy/client/components/ui/hover-card/HoverCardContent.vue +3 -0
  208. package/legacy/client/components/ui/hover-card/HoverCardTrigger.vue +3 -0
  209. package/legacy/client/components/ui/hover-card/index.ts +1 -0
  210. package/legacy/client/components/ui/input/Input.vue +3 -0
  211. package/legacy/client/components/ui/input/index.ts +1 -0
  212. package/legacy/client/components/ui/label/Label.vue +3 -0
  213. package/legacy/client/components/ui/label/index.ts +1 -0
  214. package/legacy/client/components/ui/menubar/Menubar.vue +3 -0
  215. package/legacy/client/components/ui/menubar/MenubarCheckboxItem.vue +3 -0
  216. package/legacy/client/components/ui/menubar/MenubarContent.vue +3 -0
  217. package/legacy/client/components/ui/menubar/MenubarGroup.vue +3 -0
  218. package/legacy/client/components/ui/menubar/MenubarItem.vue +3 -0
  219. package/legacy/client/components/ui/menubar/MenubarLabel.vue +3 -0
  220. package/legacy/client/components/ui/menubar/MenubarMenu.vue +3 -0
  221. package/legacy/client/components/ui/menubar/MenubarRadioGroup.vue +3 -0
  222. package/legacy/client/components/ui/menubar/MenubarRadioItem.vue +3 -0
  223. package/legacy/client/components/ui/menubar/MenubarSeparator.vue +3 -0
  224. package/legacy/client/components/ui/menubar/MenubarShortcut.vue +3 -0
  225. package/legacy/client/components/ui/menubar/MenubarSub.vue +3 -0
  226. package/legacy/client/components/ui/menubar/MenubarSubContent.vue +3 -0
  227. package/legacy/client/components/ui/menubar/MenubarSubTrigger.vue +3 -0
  228. package/legacy/client/components/ui/menubar/MenubarTrigger.vue +3 -0
  229. package/legacy/client/components/ui/menubar/index.ts +1 -0
  230. package/legacy/client/components/ui/navigation-menu/NavigationMenu.vue +3 -0
  231. package/legacy/client/components/ui/navigation-menu/NavigationMenuContent.vue +3 -0
  232. package/legacy/client/components/ui/navigation-menu/NavigationMenuIndicator.vue +3 -0
  233. package/legacy/client/components/ui/navigation-menu/NavigationMenuItem.vue +3 -0
  234. package/legacy/client/components/ui/navigation-menu/NavigationMenuLink.vue +3 -0
  235. package/legacy/client/components/ui/navigation-menu/NavigationMenuList.vue +3 -0
  236. package/legacy/client/components/ui/navigation-menu/NavigationMenuTrigger.vue +3 -0
  237. package/legacy/client/components/ui/navigation-menu/NavigationMenuViewport.vue +3 -0
  238. package/legacy/client/components/ui/navigation-menu/index.ts +1 -0
  239. package/legacy/client/components/ui/number-field/NumberField.vue +3 -0
  240. package/legacy/client/components/ui/number-field/NumberFieldContent.vue +3 -0
  241. package/legacy/client/components/ui/number-field/NumberFieldDecrement.vue +3 -0
  242. package/legacy/client/components/ui/number-field/NumberFieldIncrement.vue +3 -0
  243. package/legacy/client/components/ui/number-field/NumberFieldInput.vue +3 -0
  244. package/legacy/client/components/ui/number-field/index.ts +1 -0
  245. package/legacy/client/components/ui/pagination/Pagination.vue +3 -0
  246. package/legacy/client/components/ui/pagination/PaginationContent.vue +3 -0
  247. package/legacy/client/components/ui/pagination/PaginationEllipsis.vue +3 -0
  248. package/legacy/client/components/ui/pagination/PaginationFirst.vue +3 -0
  249. package/legacy/client/components/ui/pagination/PaginationItem.vue +3 -0
  250. package/legacy/client/components/ui/pagination/PaginationLast.vue +3 -0
  251. package/legacy/client/components/ui/pagination/PaginationNext.vue +3 -0
  252. package/legacy/client/components/ui/pagination/PaginationPrevious.vue +3 -0
  253. package/legacy/client/components/ui/pagination/index.ts +1 -0
  254. package/legacy/client/components/ui/pin-input/PinInput.vue +3 -0
  255. package/legacy/client/components/ui/pin-input/PinInputGroup.vue +3 -0
  256. package/legacy/client/components/ui/pin-input/PinInputSeparator.vue +3 -0
  257. package/legacy/client/components/ui/pin-input/PinInputSlot.vue +3 -0
  258. package/legacy/client/components/ui/pin-input/index.ts +1 -0
  259. package/legacy/client/components/ui/popover/Popover.vue +3 -0
  260. package/legacy/client/components/ui/popover/PopoverAnchor.vue +3 -0
  261. package/legacy/client/components/ui/popover/PopoverContent.vue +3 -0
  262. package/legacy/client/components/ui/popover/PopoverTrigger.vue +3 -0
  263. package/legacy/client/components/ui/popover/index.ts +1 -0
  264. package/legacy/client/components/ui/progress/Progress.vue +3 -0
  265. package/legacy/client/components/ui/progress/index.ts +1 -0
  266. package/legacy/client/components/ui/radio-group/RadioGroup.vue +3 -0
  267. package/legacy/client/components/ui/radio-group/RadioGroupItem.vue +3 -0
  268. package/legacy/client/components/ui/radio-group/index.ts +1 -0
  269. package/legacy/client/components/ui/range-calendar/RangeCalendar.vue +3 -0
  270. package/legacy/client/components/ui/range-calendar/RangeCalendarCell.vue +3 -0
  271. package/legacy/client/components/ui/range-calendar/RangeCalendarCellTrigger.vue +3 -0
  272. package/legacy/client/components/ui/range-calendar/RangeCalendarGrid.vue +3 -0
  273. package/legacy/client/components/ui/range-calendar/RangeCalendarGridBody.vue +3 -0
  274. package/legacy/client/components/ui/range-calendar/RangeCalendarGridHead.vue +3 -0
  275. package/legacy/client/components/ui/range-calendar/RangeCalendarGridRow.vue +3 -0
  276. package/legacy/client/components/ui/range-calendar/RangeCalendarHeadCell.vue +3 -0
  277. package/legacy/client/components/ui/range-calendar/RangeCalendarHeader.vue +3 -0
  278. package/legacy/client/components/ui/range-calendar/RangeCalendarHeading.vue +3 -0
  279. package/legacy/client/components/ui/range-calendar/RangeCalendarNextButton.vue +3 -0
  280. package/legacy/client/components/ui/range-calendar/RangeCalendarPrevButton.vue +3 -0
  281. package/legacy/client/components/ui/range-calendar/index.ts +1 -0
  282. package/legacy/client/components/ui/resizable/ResizableHandle.vue +3 -0
  283. package/legacy/client/components/ui/resizable/ResizablePanel.vue +3 -0
  284. package/legacy/client/components/ui/resizable/ResizablePanelGroup.vue +3 -0
  285. package/legacy/client/components/ui/resizable/index.ts +1 -0
  286. package/legacy/client/components/ui/scroll-area/ScrollArea.vue +3 -0
  287. package/legacy/client/components/ui/scroll-area/ScrollBar.vue +3 -0
  288. package/legacy/client/components/ui/scroll-area/index.ts +1 -0
  289. package/legacy/client/components/ui/select/Select.vue +3 -0
  290. package/legacy/client/components/ui/select/SelectContent.vue +3 -0
  291. package/legacy/client/components/ui/select/SelectGroup.vue +3 -0
  292. package/legacy/client/components/ui/select/SelectItem.vue +3 -0
  293. package/legacy/client/components/ui/select/SelectItemText.vue +3 -0
  294. package/legacy/client/components/ui/select/SelectLabel.vue +3 -0
  295. package/legacy/client/components/ui/select/SelectScrollDownButton.vue +3 -0
  296. package/legacy/client/components/ui/select/SelectScrollUpButton.vue +3 -0
  297. package/legacy/client/components/ui/select/SelectSeparator.vue +3 -0
  298. package/legacy/client/components/ui/select/SelectTrigger.vue +3 -0
  299. package/legacy/client/components/ui/select/SelectValue.vue +3 -0
  300. package/legacy/client/components/ui/select/index.ts +1 -0
  301. package/legacy/client/components/ui/separator/Separator.vue +3 -0
  302. package/legacy/client/components/ui/separator/index.ts +1 -0
  303. package/legacy/client/components/ui/sheet/Sheet.vue +3 -0
  304. package/legacy/client/components/ui/sheet/SheetClose.vue +3 -0
  305. package/legacy/client/components/ui/sheet/SheetContent.vue +3 -0
  306. package/legacy/client/components/ui/sheet/SheetDescription.vue +3 -0
  307. package/legacy/client/components/ui/sheet/SheetFooter.vue +3 -0
  308. package/legacy/client/components/ui/sheet/SheetHeader.vue +3 -0
  309. package/legacy/client/components/ui/sheet/SheetOverlay.vue +3 -0
  310. package/legacy/client/components/ui/sheet/SheetTitle.vue +3 -0
  311. package/legacy/client/components/ui/sheet/SheetTrigger.vue +3 -0
  312. package/legacy/client/components/ui/sheet/index.ts +1 -0
  313. package/legacy/client/components/ui/sidebar/Sidebar.vue +3 -0
  314. package/legacy/client/components/ui/sidebar/SidebarContent.vue +3 -0
  315. package/legacy/client/components/ui/sidebar/SidebarFooter.vue +3 -0
  316. package/legacy/client/components/ui/sidebar/SidebarGroup.vue +3 -0
  317. package/legacy/client/components/ui/sidebar/SidebarGroupAction.vue +3 -0
  318. package/legacy/client/components/ui/sidebar/SidebarGroupContent.vue +3 -0
  319. package/legacy/client/components/ui/sidebar/SidebarGroupLabel.vue +3 -0
  320. package/legacy/client/components/ui/sidebar/SidebarHeader.vue +3 -0
  321. package/legacy/client/components/ui/sidebar/SidebarInput.vue +3 -0
  322. package/legacy/client/components/ui/sidebar/SidebarInset.vue +3 -0
  323. package/legacy/client/components/ui/sidebar/SidebarMenu.vue +3 -0
  324. package/legacy/client/components/ui/sidebar/SidebarMenuAction.vue +3 -0
  325. package/legacy/client/components/ui/sidebar/SidebarMenuBadge.vue +3 -0
  326. package/legacy/client/components/ui/sidebar/SidebarMenuButton.vue +3 -0
  327. package/legacy/client/components/ui/sidebar/SidebarMenuButtonChild.vue +3 -0
  328. package/legacy/client/components/ui/sidebar/SidebarMenuItem.vue +3 -0
  329. package/legacy/client/components/ui/sidebar/SidebarMenuSkeleton.vue +3 -0
  330. package/legacy/client/components/ui/sidebar/SidebarMenuSub.vue +3 -0
  331. package/legacy/client/components/ui/sidebar/SidebarMenuSubButton.vue +3 -0
  332. package/legacy/client/components/ui/sidebar/SidebarMenuSubItem.vue +3 -0
  333. package/legacy/client/components/ui/sidebar/SidebarProvider.vue +3 -0
  334. package/legacy/client/components/ui/sidebar/SidebarRail.vue +3 -0
  335. package/legacy/client/components/ui/sidebar/SidebarSeparator.vue +3 -0
  336. package/legacy/client/components/ui/sidebar/SidebarTrigger.vue +3 -0
  337. package/legacy/client/components/ui/sidebar/index.ts +1 -0
  338. package/legacy/client/components/ui/skeleton/Skeleton.vue +3 -0
  339. package/legacy/client/components/ui/skeleton/index.ts +1 -0
  340. package/legacy/client/components/ui/slider/Slider.vue +3 -0
  341. package/legacy/client/components/ui/slider/index.ts +1 -0
  342. package/legacy/client/components/ui/sonner/Sonner.vue +3 -0
  343. package/legacy/client/components/ui/sonner/index.ts +1 -0
  344. package/legacy/client/components/ui/stepper/Stepper.vue +3 -0
  345. package/legacy/client/components/ui/stepper/StepperDescription.vue +3 -0
  346. package/legacy/client/components/ui/stepper/StepperIndicator.vue +3 -0
  347. package/legacy/client/components/ui/stepper/StepperItem.vue +3 -0
  348. package/legacy/client/components/ui/stepper/StepperSeparator.vue +3 -0
  349. package/legacy/client/components/ui/stepper/StepperTitle.vue +3 -0
  350. package/legacy/client/components/ui/stepper/StepperTrigger.vue +3 -0
  351. package/legacy/client/components/ui/stepper/index.ts +1 -0
  352. package/legacy/client/components/ui/switch/Switch.vue +3 -0
  353. package/legacy/client/components/ui/switch/index.ts +1 -0
  354. package/legacy/client/components/ui/table/Table.vue +3 -0
  355. package/legacy/client/components/ui/table/TableBody.vue +3 -0
  356. package/legacy/client/components/ui/table/TableCaption.vue +3 -0
  357. package/legacy/client/components/ui/table/TableCell.vue +3 -0
  358. package/legacy/client/components/ui/table/TableEmpty.vue +3 -0
  359. package/legacy/client/components/ui/table/TableFooter.vue +3 -0
  360. package/legacy/client/components/ui/table/TableHead.vue +3 -0
  361. package/legacy/client/components/ui/table/TableHeader.vue +3 -0
  362. package/legacy/client/components/ui/table/TableRow.vue +3 -0
  363. package/legacy/client/components/ui/table/index.ts +1 -0
  364. package/legacy/client/components/ui/tabs/Tabs.vue +3 -0
  365. package/legacy/client/components/ui/tabs/TabsContent.vue +3 -0
  366. package/legacy/client/components/ui/tabs/TabsList.vue +3 -0
  367. package/legacy/client/components/ui/tabs/TabsTrigger.vue +3 -0
  368. package/legacy/client/components/ui/tabs/index.ts +1 -0
  369. package/legacy/client/components/ui/tags-input/TagsInput.vue +3 -0
  370. package/legacy/client/components/ui/tags-input/TagsInputInput.vue +3 -0
  371. package/legacy/client/components/ui/tags-input/TagsInputItem.vue +3 -0
  372. package/legacy/client/components/ui/tags-input/TagsInputItemDelete.vue +3 -0
  373. package/legacy/client/components/ui/tags-input/TagsInputItemText.vue +3 -0
  374. package/legacy/client/components/ui/tags-input/index.ts +1 -0
  375. package/legacy/client/components/ui/textarea/Textarea.vue +3 -0
  376. package/legacy/client/components/ui/textarea/index.ts +1 -0
  377. package/legacy/client/components/ui/toggle/Toggle.vue +3 -0
  378. package/legacy/client/components/ui/toggle/index.ts +1 -0
  379. package/legacy/client/components/ui/toggle-group/ToggleGroup.vue +3 -0
  380. package/legacy/client/components/ui/toggle-group/ToggleGroupItem.vue +3 -0
  381. package/legacy/client/components/ui/toggle-group/index.ts +1 -0
  382. package/legacy/client/components/ui/tooltip/Tooltip.vue +3 -0
  383. package/legacy/client/components/ui/tooltip/TooltipContent.vue +3 -0
  384. package/legacy/client/components/ui/tooltip/TooltipProvider.vue +3 -0
  385. package/legacy/client/components/ui/tooltip/TooltipTrigger.vue +3 -0
  386. package/legacy/client/components/ui/tooltip/index.ts +1 -0
  387. package/legacy/client/facades/acl.facade.ts +1 -0
  388. package/legacy/client/facades/app.facade.ts +6 -0
  389. package/legacy/client/facades/auth.facade.ts +1 -0
  390. package/legacy/client/facades/config.facade.ts +1 -0
  391. package/legacy/client/facades/fetch.facade.ts +1 -0
  392. package/legacy/client/facades/logger.facade.ts +1 -0
  393. package/legacy/client/facades/menu.facade.ts +1 -0
  394. package/legacy/client/facades/router.facade.ts +1 -0
  395. package/legacy/client/facades/translator.facade.ts +10 -0
  396. package/legacy/client/utils/autoPages.ts +1 -0
  397. package/legacy/client/utils/createId.ts +1 -0
  398. package/legacy/client/utils/di.ts +1 -0
  399. package/legacy/client/utils/fetcher.ts +1 -0
  400. package/legacy/client/utils/file.ts +1 -0
  401. package/legacy/client/utils/index.ts +7 -0
  402. package/legacy/client/utils/logger.ts +1 -0
  403. package/legacy/client/utils/toast.ts +1 -0
  404. package/legacy/server/entities/file.entity.ts +4 -0
  405. package/legacy/server/exceptions/base.ts +4 -0
  406. package/legacy/server/facades/arte.facade.ts +6 -0
  407. package/legacy/server/facades/config.facade.ts +4 -0
  408. package/legacy/server/facades/db.facade.ts +4 -0
  409. package/legacy/server/facades/download.facade.ts +4 -0
  410. package/legacy/server/facades/drive.facade.ts +4 -0
  411. package/legacy/server/facades/logger.facade.ts +4 -0
  412. package/legacy/server/facades/router.facade.ts +4 -0
  413. package/legacy/server/middlewares/auth.middleware.ts +6 -0
  414. package/legacy/server/middlewares/authorization.middleware.ts +8 -0
  415. package/legacy/server/mixins/hooks.mixin.ts +6 -0
  416. package/legacy/server/mixins/model.mixin.ts +6 -0
  417. package/legacy/server/mixins/modelConfig.mixin.ts +4 -0
  418. package/legacy/server/queries/index.ts +6 -0
  419. package/legacy/server/services/metadataQuery.service.ts +6 -0
  420. package/legacy/server/services/routerResourceConfig.service.ts +5 -0
  421. package/legacy/shared/services/validator.service.ts +4 -0
  422. package/legacy/shared/utils/compose.ts +8 -0
  423. package/legacy/shared/utils/tryCatch.ts +7 -0
  424. package/package.json +4 -2
  425. package/tsdown.config.ts +3 -0
  426. package/vite.config.ts +1 -0
  427. package/cli/commands/dev.js +0 -37
  428. package/cli/commands/start.js +0 -38
  429. package/dist/components/index-Dk5fhUBV.mjs +0 -4399
@@ -1,5 +1,5 @@
1
- import{Command as e}from"commander";import t from"chalk";import n from"cli-table3";import r,{spawn as i}from"child_process";import a,{dirname as o,join as s}from"path";import{debounce as c,get as l,has as u,join as ee,orderBy as te,set as d,unset as ne}from"lodash-es";import*as f from"valibot";import{format as p}from"date-fns";import m from"qs";import{defineAbility as re,subject as h}from"@casl/ability";import g from"fs";import{Readable as ie}from"stream";import _ from"ms";import{DeleteObjectCommand as ae,DeleteObjectsCommand as oe,GetObjectCommand as v,HeadObjectCommand as se,ListObjectsV2Command as y,PutObjectCommand as b,S3Client as ce}from"@aws-sdk/client-s3";import{getSignedUrl as le}from"@aws-sdk/s3-request-presigner";import{Upload as ue}from"@aws-sdk/lib-storage";import de from"mime";import fe from"js-yaml";import pe from"dotenv";import{pathToFileURL as me}from"url";import x from"fast-glob";import{exec as he}from"node:child_process";import{promisify as ge}from"node:util";import{unlink as _e,writeFile as ve}from"node:fs/promises";import{tmpdir as ye}from"node:os";import{join as be}from"node:path";import{randomUUID as xe}from"node:crypto";import{pathToFileURL as Se}from"node:url";import Ce from"node:fs";var S=Object.defineProperty,C=(e,t)=>{let n={};for(var r in e)S(n,r,{get:e[r],enumerable:!0});return t||S(n,Symbol.toStringTag,{value:`Module`}),n};function w(e={},t={}){let r=process.stdout.columns||80,i=new n({wordWrap:!0,wrapOnWordBoundary:!1,colWidths:[t.keyWidth||Math.floor(r*.2),Math.floor(r*.7)]});for(let t of Object.keys(e))i.push([t,String(e[t])]);console.log(i.toString())}function T(e,t){let r=(process.stdout.columns||80)-6,i=[],a=[];t&&a.push(...t),t||e.map(e=>Object.keys(e)).flat().filter((e,t,n)=>n.indexOf(e)===t).forEach(e=>{a.push({label:e,value:e})}),e.forEach(e=>{let t=[];a.forEach(n=>{let r=``;typeof n.value==`function`&&(r=n.value(e)),typeof n.value==`string`&&(r=e[n.value]),r??=``,(typeof r==`object`||Array.isArray(r))&&(r=JSON.stringify(r)),t.push(r)}),i.push(t)}),a.forEach(e=>{e.width&&=Number(e.width),e.label||=String(e.value)});let o=100-a.filter(e=>!!e.width).reduce((e,t)=>e+t.width,0),s=a.filter(e=>!e.width).length;a.forEach(e=>{e.width||=Math.floor(o/s)}),a.forEach(e=>{e.width&&(e.realWidth=Math.floor(r*(e.width/100)))});let c=new n({head:a.map(e=>e.label),style:{head:[],border:[]},wordWrap:!0,wrapOnWordBoundary:!1,colWidths:a.map(e=>e.realWidth)});c.push(...i),console.log(c.toString())}var E=class n extends e{needs=new Set;table=T;object=w;colors=t;need(...e){return e.forEach(e=>this.needs.add(e)),this}createCommand(e){return new n(e)}},D=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},O=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new D(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const k=globalThis.serverContainer||new O;globalThis.serverContainer=k;var we=class extends E{constructor(){super(),this.exitOverride(),this.configureOutput({writeOut:()=>{},writeErr:()=>{}}),k.set(E,this)}async add(e){await import(e)}async execute(e){await this.parseAsync([`node`,`arte`,...e])}},A=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let r=n.value;return typeof r!=`object`||Array.isArray(r)?!1:u(r,e.substring(t.length+1))}get(e,t){let n=this.entries.get(e);if(n)return n.value;if(!e.includes(`.`))return t;let r=e.split(`.`)[0],i=this.entries.get(r);if(!i){let n=this.entries.get(e);return n?n.value:t}let a=i.value;return typeof a!=`object`||Array.isArray(a)?t:l(a,e.substring(r.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),d(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(ne(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}};function j(...e){return e.reduce((e,t)=>t(e),class{})}function M(e,...t){return t.reduce((e,t)=>t(e),e)}function N(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function P(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=t?`${t}.${r}`:r;i&&typeof i==`object`&&!Array.isArray(i)?P(i,e,n):n[e]=i}return n}async function F(e){try{return[null,await e()]}catch(e){return[e,null]}}F.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};function Te(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function I(e=``){return e+Te()}var L=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},R=class{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;load(e){this.debug=e?.debug||!1,this.logger=e?.logger||new L,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}on(e,t,n){let r=n?.id||I();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=n=>{t(n),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,t,n){let r=c(t,n?.debounce||300),i=this.on(e,r,n);return i&&(i.originalListener=t),i}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let e of n)F.sync(()=>e.listener(t))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event`,{handlers:n.length,event:e,args:t});for await(let e of n)await e.listener(t)}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},Ee=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new L,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=te(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await F(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},De=C({array:()=>B,arrayNumber:()=>je,boolean:()=>Oe,date:()=>ke,datetime:()=>Ae,number:()=>z,object:()=>Me});const z=()=>f.pipe(f.union([f.string(),f.number()]),f.transform(Number),f.integer()),Oe=()=>f.pipe(f.union([f.string(),f.boolean()]),f.transform(e=>e===!0||e===`true`)),ke=()=>f.pipe(f.union([f.string(),f.date()]),f.transform(e=>e instanceof Date?e:new Date(e)),f.transform(e=>e&&p(e,`yyyy-MM-dd`))),Ae=()=>f.pipe(f.union([f.string(),f.date()]),f.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),p(e,`yyyy-MM-dd HH:mm`))))),B=(e=f.any())=>f.pipe(f.union([f.string(),f.array(f.string())]),f.transform(e=>Array.isArray(e)?e:e.split(`,`)),f.array(e)),je=()=>f.pipe(B(),f.transform(e=>e.map(Number))),Me=()=>f.pipe(f.union([f.string(),f.record(f.string(),f.any())]),f.transform(e=>typeof e==`string`?m.parse(e):e),f.transform(e=>{let t={};for(let n in e)d(t,n,l(e,n));return t}));var Ne=C({base:()=>Pe});const Pe=(e={})=>f.object({page:f.optional(z(),1),limit:f.optional(z(),e.maxLimit||100),orderBy:f.optional(e.orderFields?B(f.picklist(e.orderFields)):B(f.string()),[]),orderDirection:f.optional(B(f.union([f.literal(`asc`),f.literal(`desc`)])),[])}),Fe={url:De,pagination:Ne};var Ie=class{static __container_entry_key=`ValidatorService`;v={...f,extras:Fe};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=f.safeParse(n,e);if(!a){let e=f.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new D(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await f.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=f.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=f.safeParse(n,e);return r}};f.object({id:f.number(),permission_id:f.number(),assignable_type:f.string(),assignable_id:f.string(),created_at:f.string(),updated_at:f.string()}),f.object({id:f.number(),name:f.nullable(f.string()),description:f.nullable(f.string()),action:f.string(),subject:f.string(),conditions:f.nullable(f.string()),created_at:f.string(),updated_at:f.string(),expires_at:f.string()}),f.object({id:f.number(),name:f.nullable(f.string()),type:f.string(),user_id:f.number(),token:f.string(),created_at:f.string(),updated_at:f.string(),expires_at:f.string()});var V=class extends D{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};const Le=new Ie;function H(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}var Re=class extends j(H){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=F.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},ze=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>Re.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new L().child({label:`acl`}),this.ability=re(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=h(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=h(t,n);return this.ability.cannot(e,r)}subject(e,t){return h(e,t)}},Be=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}},Ve=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}};function U(e){return class extends e{deleted_at=null}}function W(e){return class extends e{created_at;updated_at}}j(H,W,U),j(H,W,U);var He=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},Ue=class extends j(H,N(He)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}};j(H);var We=class extends j(H){id;name;version;enabled};j(H,W,U),j(H,W,U);var Ge=class e{process=null;appBasePath;env=new Map;args=[];configArguments=new Map;configFiles=[];debug=!1;logger=new L;static create(){return new e}setBasePath(e){return this.appBasePath=e,this}setDebug(e){return this.debug=e,this}setLogger(e){return this.logger=e,this}addConfigArgument(e,t){return this.configArguments.set(e,t),this}addConfigFile(...e){return this.configFiles.push(...e),this}addEnv(e,t){return this.env.set(e,t),this}loadConfigArguments(){let e=process.argv.slice(2).filter(e=>e.startsWith(`@config:`));for(let t of e){let[e,n]=t.slice(8).split(`=`).map(e=>e.trim());this.configArguments.set(e,n)}}loadConfigFiles(){let e=process.argv.slice(2).filter(e=>e.startsWith(`@config-file:`)).map(e=>e.slice(13));if(this.addConfigFile(...e),process.env.CONFIG_FILES){let e=process.env.CONFIG_FILES.split(`,`).map(e=>e.trim()).filter(Boolean);this.addConfigFile(...e)}}loadEnvironment(){let e=Array.from(this.configArguments.entries()).map(([e,t])=>`${e}=${t}`).join(`;`);this.addEnv(`ZENITH_CONFIG_ARGUMENTS`,e),this.addEnv(`ZENITH_CONFIG_FILES`,this.configFiles.join(`,`))}loadArguments(e=[]){let t=[`@config:`,`@config-file:`],n=e.filter(e=>!t.some(t=>e.startsWith(t)));this.args=[`--no-warnings`,`--experimental-strip-types`,`--enable-source-maps`,a.join(this.appBasePath,`server`,`cli.ts`),...n]}kill(e=0){this.process&&!this.process.killed&&this.process.kill(`SIGTERM`),process.exit(e)}async run(e){if(!this.appBasePath)throw Error(`Base path not set. Please call setBasePath() before run().`);this.loadConfigArguments(),this.loadConfigFiles(),this.loadArguments(e||process.argv.slice(2)),this.loadEnvironment(),this.debug&&this.logger.debug(`run`,{args:this.args,env:this.env}),this.process=r.spawn(`node`,this.args,{stdio:`inherit`,env:{...process.env,...Object.fromEntries(this.env.entries())}}),process.on(`SIGINT`,()=>this.kill()),process.on(`SIGTERM`,()=>this.kill()),process.on(`exit`,()=>this.kill())}};const G=process.env.ZENITH_BASE_PATH;function K(...e){if(!G)throw Error(`ZENITH_BASE_PATH environment variable is not set`);return a.resolve(G,...e)}function Ke(...e){if(!G)throw Error(`ZENITH_BASE_PATH environment variable is not set`);return a.relative(process.cwd(),a.resolve(G,...e))}function qe(...e){return K(`tmp`,...e)}var Je=class extends A{directory;logger;debug=!1;constructor(e={}){super(),this.debug=e.debug??!1,this.directory=e.directory??K(`config`),this.logger=e.logger??new L,this.debug&&this.logger.debug(`service initialized in debug mode`)}async load(){this.clear(),g.existsSync(this.directory)||(this.debug&&this.logger.debug(`config directory does not exist, creating: ${this.directory}`),g.mkdirSync(this.directory,{recursive:!0}));let e=await g.promises.readdir(this.directory);for(let t of e){if(!t.endsWith(`.json`))continue;let e=a.join(this.directory,t),[n,r]=await F(async()=>{let t=await g.promises.readFile(e,`utf-8`);return JSON.parse(t)});if(n){this.logger.error(`failed to load config file ${t}`,n);continue}let i=a.basename(t,`.json`);super.set(i,r,`filesystem`),this.debug&&this.logger.debug(`loaded config file: ${t}`)}this.debug&&this.logger.debug(`config loaded in debug mode`)}parseKey(e){let[t,...n]=e.split(`.`);return{filename:t,key:n.join(`.`)}}set(e,t,n=`filesystem`){if(super.set(e,t,n),n!==`filesystem`)return;let{filename:r,key:i}=this.parseKey(e),o=this.get(r);i||(o=t),i&&o&&d(o,i,t);let s=a.join(this.directory,`${r}.json`);g.existsSync(a.dirname(s))||g.mkdirSync(a.dirname(s),{recursive:!0}),g.writeFileSync(s,JSON.stringify(o,null,4))}unset(e){let{filename:t,key:n}=this.parseKey(e),r=this.get(t);d(r,n,void 0);let i=a.join(this.directory,`${t}.json`);g.existsSync(a.dirname(i))||g.mkdirSync(a.dirname(i),{recursive:!0}),g.writeFileSync(i,JSON.stringify(r,null,4)),super.unset(e)}},Ye=class{id;name;description;config={};constructor(e){this.id=e.id,this.name=e.name,this.description=e.description,this.config=e.config}list(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{folder:e}),t}find(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}exists(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}read(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}readStream(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}write(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,data:t}),n}writeStream(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,stream:t}),n}delete(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}url(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,options:t}),n}uploadUrl(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,options:t}),n}};const Xe=Le.create(e=>e.object({bucket:e.pipe(e.string(),e.minLength(1)),region:e.optional(e.string()),accessKeyId:e.pipe(e.string(),e.minLength(1)),secretAccessKey:e.pipe(e.string(),e.minLength(1)),sessionToken:e.optional(e.string()),endpoint:e.optional(e.string()),prefix:e.optional(e.string())}));function Ze(e){return!e||typeof e!=`object`||typeof e.on!=`function`?Promise.resolve(new Uint8Array):new Promise((t,n)=>{let r=[];e.on(`data`,e=>r.push(Buffer.from(e))),e.on(`end`,()=>t(new Uint8Array(Buffer.concat(r)))),e.on(`error`,n)})}var Qe=class extends Ye{schema=Xe;_client;constructor(e){super(e)}get valid(){return Le.isValid(this.config,this.schema)}checkValid(){if(!this.valid)throw new D($t(`Invalid drive configuration`))}get bucket(){return this.config.bucket}get prefix(){return this.config?.prefix?this.config?.prefix.endsWith(`/`)?this.config.prefix:this.config.prefix+`/`:``}getKey(e){let t=e.startsWith(`/`)?e.slice(1):e;return this.prefix?`${this.prefix.endsWith(`/`)?this.prefix:`${this.prefix}/`}${t}`:t}get client(){if(this._client)return this._client;let e=this.config;return this._client=new ce({region:e.region,endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,sessionToken:e.sessionToken}}),this._client}exists=async e=>{this.checkValid();let t=this.getKey(e);return this.client.send(new se({Bucket:this.bucket,Key:t})).then(()=>!0).catch(()=>!1)};list=async e=>{this.checkValid();let t=e?this.getKey(e):this.prefix||void 0;t&&!t.endsWith(`/`)&&(t+=`/`);let n=new y({Bucket:this.bucket,Prefix:t,Delimiter:`/`}),r=await this.client.send(n),i=[],a=r.CommonPrefixes||[];for(let e of a){let t=e.Prefix||``;t=t.replace(this.prefix,``),t.endsWith(`/`)&&(t=t.slice(0,-1));let n=new Ve({name:t.split(`/`).pop()||t,path:`/`+t,type:`directory`,metas:{size:0,mimetype:`application/x-directory`}});i.push(n)}let o=r.Contents||[];for(let e of o){let t=e.Key||``;if(t=t.replace(this.prefix,``),t.endsWith(`/`))continue;let n=new Ve({name:t.split(`/`).pop()||t,path:`/`+t,type:`file`,metas:{size:e.Size,mimetype:de.getType(t)||`application/octet-stream`}});i.push(n)}return i};find=async e=>{this.checkValid();let t=e.startsWith(`/`)?e:`/`+e,n=o(t),r=(await this.list(n)).find(e=>e.path===t);if(!r)throw Error(`File "${t}" not found`);return r};async mkdir(e){return this.checkValid(),Promise.resolve()}read=async e=>{this.checkValid();let t=this.getKey(e),n=(await this.client.send(new v({Bucket:this.bucket,Key:t}))).Body;return Ze(n)};async readStream(e){this.checkValid();let t=this.getKey(e),n=new v({Bucket:this.bucket,Key:t}),r=(await this.client.send(n)).Body;return Promise.resolve(r)}write=async(e,t)=>{this.checkValid();let n=this.getKey(e);await this.client.send(new b({Bucket:this.bucket,Key:n,Body:Buffer.from(t)}))};async writeStream(e,t){this.checkValid();let n=this.getKey(e);await new ue({client:this.client,params:{Bucket:this.bucket,Key:n,Body:ie.from(t)}}).done()}delete=async e=>{this.checkValid();let t=this.getKey(e);if((await this.find(e)).type===`file`){let e=new ae({Bucket:this.bucket,Key:t});await this.client.send(e);return}let n=await this.client.send(new y({Bucket:this.bucket,Prefix:t})),r=(n.Contents||[]).map(e=>({Key:e.Key}));r.length!==0&&(await this.client.send(new oe({Bucket:this.bucket,Delete:{Objects:r}})),n.IsTruncated&&this.delete(e))};url=async(e,t)=>{this.checkValid();let n=this.getKey(e),r=_(t?.expires||`30m`)||1800*1e3,i=Math.max(1,Math.round(r/1e3));return le(this.client,new v({Bucket:this.bucket,Key:n}),{expiresIn:i})};uploadUrl=async(e,t)=>{this.checkValid();let n=this.getKey(e),r=_(t?.expires||`30m`)||1800*1e3,i=Math.max(1,Math.round(r/1e3)),a=new b({Bucket:this.bucket,Key:n});return le(this.client,a,{expiresIn:i})}},$e=class extends A{prefix=``;logger;debug=!1;drive;bucket;region;endpoint;constructor(e){super(),this.debug=e.debug??!1,this.prefix=e.prefix??``,this.bucket=e.bucket,this.region=e.region||``,this.endpoint=e.endpoint,this.logger=e.logger??new L,this.drive=new Qe({id:`config-s3`,name:`config-s3`,config:{bucket:e.bucket,region:e.region,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,sessionToken:e.sessionToken,endpoint:e.endpoint}}),this.debug&&this.logger.debug(`service initialized in debug mode`)}parseKey(e){let[t,...n]=e.split(`.`);return{filename:t,key:n.join(`.`)}}async load(){this.clear();let e=this.prefix.replace(/^\/|\/$/g,``),t=await this.drive.list(e||void 0);for(let n of t){if(!n.name.endsWith(`.json`))continue;let t=n.name,r=e?`${e}/${t}`:t,[i,a]=await F(async()=>{let e=await this.drive.read(r),t=Buffer.from(e).toString(`utf-8`);return JSON.parse(t)});if(i){this.logger.error(`failed to load config file ${t}`,i);continue}let o=t.replace(/\.json$/,``);super.set(o,a),this.debug&&this.logger.debug(`loaded config file: ${t}`)}this.debug&&this.logger.debug(`config loaded in debug mode`)}set(e,t,n=`s3`){if(super.set(e,t,n),n!==`s3`)return;let{filename:r,key:i}=this.parseKey(e),a=this.get(r);i||(a=t),i&&a&&d(a,i,t);let o=this.prefix.replace(/^\/|\/$/g,``),s=o?`${o}/${r}.json`:`${r}.json`,c=Buffer.from(JSON.stringify(a,null,4));this.drive.write(s,c).catch(e=>{this.logger.error(`failed to write config to s3`,e)})}unset(e){let t=this.prefix.replace(/^\/|\/$/g,``);if(!e.includes(`.`)){let n=t?`${t}/${e}.json`:`${e}.json`;this.drive.delete(n).catch(e=>{this.logger.error(`failed to delete config from s3`,e)});return}let{filename:n,key:r}=this.parseKey(e),i=this.get(n);d(i,r,void 0);let a=t?`${t}/${n}.json`:`${n}.json`;this.drive.write(a,Buffer.from(JSON.stringify(i,null,4))).catch(e=>{this.logger.error(`failed to write config to s3`,e)}),super.unset(e)}},et=class e{env;logger;silent;constructor(e){this.env=e.env,this.logger=e.logger,this.silent=e.silent??!1}static create(t){return new e(t)}async loadS3Config(){let e=new $e({bucket:this.env.get(`ZENITH_CONFIG_S3_BUCKET`),region:this.env.get(`ZENITH_CONFIG_S3_REGION`),accessKeyId:this.env.get(`ZENITH_CONFIG_S3_ACCESS_KEY_ID`),secretAccessKey:this.env.get(`ZENITH_CONFIG_S3_SECRET_ACCESS_KEY`),debug:this.env.get(`ZENITH_CONFIG_DEBUG`),endpoint:this.env.get(`ZENITH_CONFIG_S3_ENDPOINT`),prefix:this.env.get(`ZENITH_CONFIG_S3_PREFIX`),sessionToken:this.env.get(`ZENITH_CONFIG_S3_SESSION_TOKEN`),logger:this.logger});return await e.load(),this.silent||this.logger.info(`using S3 configuration service`,{bucket:e.bucket,region:e.region,prefix:e.prefix}),e}async loadFSConfig(){let e=new Je({directory:this.env.get(`ZENITH_CONFIG_FS_PATH`),debug:this.env.get(`ZENITH_CONFIG_DEBUG`),logger:this.logger});return await e.load(),this.silent||this.logger.info(`using filesystem configuration service`,{path:e.directory}),e}loadConfigFromEnv(e){for(let[t,n]of Object.entries(P(this.env.get(`ZENITH_CONFIG`)||{})))e.set(t,n,`env`);for(let[t,n]of Object.entries(P(this.env.get(`ZENITH_CONFIG_ARGUMENTS`)||{})))e.set(t,n,`argument`)}loadConfigFromFile(e,t){if(!g.existsSync(t)){this.logger.warn(`configuration file not found: ${t}`);return}let n=g.readFileSync(t,`utf-8`),r=null;if((t.endsWith(`.yml`)||t.endsWith(`.yaml`))&&(r=fe.load(n)),!r)throw new D(`unsupported configuration file format: ${t}`);for(let[n,i]of Object.entries(P(r)))e.set(n,i,t)}loadConfigFromFiles(e,t){for(let n of t)this.loadConfigFromFile(e,n)}async load(){let e=null;if(this.env.get(`ZENITH_CONFIG_DRIVER`)===`s3`&&(e=await this.loadS3Config()),(!e||this.env.get(`ZENITH_CONFIG_DRIVER`)===`fs`)&&(e=await this.loadFSConfig()),!e)throw new D(`Failed to initialize configuration service: No valid driver found`);if(!e)throw new D(`Failed to initialize configuration service`);return this.loadConfigFromFiles(e,this.env.get(`ZENITH_CONFIG_FILES`)),this.loadConfigFromEnv(e),e}},tt=class extends R{};const nt=f.pipe(f.union([f.literal(`true`),f.literal(`false`),f.literal(`1`),f.literal(`0`)]),f.transform(e=>e===`true`||e===`1`),f.boolean()),q=f.pipe(f.string(),f.transform(e=>{let t=e.split(/[;\n]/).filter(Boolean).filter(e=>e.includes(`=`)).map(e=>e.trim().split(`=`)),n=Object.fromEntries(t),r={};for(let[e,t]of Object.entries(n)){let n=t;t.startsWith(`bool:`)&&(n=t.replace(`bool:`,``).trim()===`true`),d(r,e,n)}return r})),rt=f.pipe(f.string(),f.transform(e=>e.split(`,`).map(e=>e.trim()).filter(Boolean))),it=f.object({directory:f.string()}),at=f.record(f.string(),it),ot=f.looseObject({NODE_ENV:f.optional(f.union([f.literal(`development`),f.literal(`production`),f.literal(`test`)]),`development`),ZENITH_BASE_PATH:f.string(),ZENITH_APP_URL:f.optional(f.string(),`http://localhost:3000`),ZENITH_PORT:f.optional(f.pipe(f.string(),f.transform(e=>parseInt(e))),`3000`),ZENITH_HOST:f.optional(f.string(),`0.0.0.0`),ZENITH_LOG_LEVEL:f.optional(f.picklist([`error`,`warn`,`info`,`debug`]),`info`),ZENITH_LIFECYCLE_DEBUG:f.optional(nt,`false`),ZENITH_CLIENT_CONFIG:f.optional(q,``),ZENITH_CONFIG:f.optional(q,``),ZENITH_CONFIG_ARGUMENTS:f.optional(q,``),ZENITH_CONFIG_FILES:f.optional(rt,``),ZENITH_CONFIG_DEBUG:f.optional(nt,`false`),ZENITH_CONFIG_DRIVER:f.optional(f.picklist([`fs`,`s3`]),`fs`),ZENITH_CONFIG_FS_PATH:f.optional(f.string()),ZENITH_CONFIG_S3_BUCKET:f.optional(f.string()),ZENITH_CONFIG_S3_REGION:f.optional(f.string()),ZENITH_CONFIG_S3_ACCESS_KEY_ID:f.optional(f.string()),ZENITH_CONFIG_S3_SECRET_ACCESS_KEY:f.optional(f.string()),ZENITH_CONFIG_S3_SESSION_TOKEN:f.optional(f.string()),ZENITH_CONFIG_S3_ENDPOINT:f.optional(f.string()),ZENITH_CONFIG_S3_PREFIX:f.optional(f.string(),``),ZENITH_MODULE_EXTRAS:f.optional(q),ZENITH_PLUGINS:f.optional(f.pipe(q,at))});var st=class e{env=null;files=[];static create(){return new e}static dotEnvConfig(e){return pe.config(e)}setFiles(e){return this.files=e,this}addFile(e){return this.files.push(e),this}load(){return e.dotEnvConfig({path:this.files,override:!0,quiet:!0}),this.env=f.parse(ot,process.env),this}get production(){return this.get(`NODE_ENV`)===`production`}get development(){return this.get(`NODE_ENV`)===`development`}get test(){return this.get(`NODE_ENV`)===`test`}has(e){if(!this.env)throw new D(`Environment variables not loaded. Call load() before accessing environment variables.`);return this.env[e]!==void 0}get(e,t){if(!this.env)throw new D(`Environment variables not loaded. Call load() before accessing environment variables.`);return this.env[e]===void 0?t:this.env[e]}set(e,t){if(!this.env)throw new D(`Environment variables not loaded. Call load() before accessing environment variables.`);this.env[e]=t}},ct=class{constructor(e){this.gateway=e}async list(){return(await this.gateway.run(`branch -a --format='%(HEAD)|%(refname:short)|%(refname)|%(upstream:remotename)'`)).split(`
2
- `).filter(Boolean).filter(e=>e.includes(`|`)).map(e=>{let[t,n,r,i]=e.split(`|`),a=r.startsWith(`refs/remotes/`),o=n;return{name:o,remote:a?o.split(`/`)[0]:i||null,isCurrent:t===`*`,isRemote:a}})}async fetch(e){let{remote:t,branch:n,localName:r}=e,i=r??n;await this.gateway.run(`fetch ${t} ${n}:${i}`)}};const lt=[`%H`,`%h`,`%an`,`%ae`,`%aI`,`%s`,`%D`].join(`%x09`);function ut(e){if(!e.trim())return[];let t=[];for(let n of e.split(`, `)){let e=n.trim();if(e)if(e.startsWith(`HEAD -> `)){let n=e.slice(8);t.push({name:`HEAD`,shortName:`HEAD`,type:`other`}),t.push({name:`refs/heads/${n}`,shortName:n,type:`branch`})}else if(e.startsWith(`tag: `)){let n=e.slice(5);t.push({name:`refs/tags/${n}`,shortName:n,type:`tag`})}else e===`HEAD`?t.push({name:`HEAD`,shortName:`HEAD`,type:`other`}):e.includes(`/`)?t.push({name:`refs/remotes/${e}`,shortName:e,type:`remote`}):t.push({name:`refs/heads/${e}`,shortName:e,type:`branch`})}return t}var dt=class{constructor(e){this.gateway=e}async list(e){let t=e?.page??1,n=e?.perPage??20,r=e?.branch??`HEAD`,i=(await this.gateway.run(`log ${r} --format='${lt}'`)).split(`
3
- `).filter(Boolean).map(e=>{let[t,n,r,i,a,o,s=``]=e.split(` `);return{hash:t,shortHash:n,authorName:r,authorEmail:i,date:a,message:o,refs:ut(s)}}),a=i.length,o=Math.ceil(a/n),s=(t-1)*n;return{items:i.slice(s,s+n),total:a,page:t,perPage:n,totalPages:o}}};const J=k.proxy(L);async function Y(e,t={}){let n={},r=e=>{Object.assign(e.error,{filename:e.filename}),J.error(`Failed to import ${e.filename}`,e.error)};t.onError&&(r=t.onError);for(let i of e){if(t.exclude&&t.exclude.some(e=>i.includes(e)))continue;let e={filename:i};t.onBeforeImport&&await t.onBeforeImport(e);let o=e.filename.split(`?`)[0];if(/\.(mts|ts|js)$/.test(o)){let o=me(a.resolve(e.filename));t.cache===!1&&o.searchParams.set(`t`,Date.now().toString());let[s,c]=await F(()=>import(o.toString()));if(s){Object.assign(s,{filename:e.filename,url:o}),r({filename:e.filename,error:s});continue}n[i]=c}if(/\.json$/.test(o)){let[t,a]=await F(async()=>{let t=await g.promises.readFile(e.filename,`utf8`);return JSON.parse(t)});if(t){r({filename:e.filename,error:t});continue}n[i]=a}t.onAfterImport&&await t.onAfterImport({...e,module:n[i]})}return n}async function ft(e,t={}){return Y(await x(e),t)}async function pt(e,t={}){return Y((await g.promises.readdir(e,{withFileTypes:!0})).filter(e=>e.isFile()).map(t=>a.join(e,t.name)),t)}var mt=class extends Ee{async addDirectory(e){let t=await pt(e),n=[];for(let[e,r]of Object.entries(t)){let t=new(r.default||r);t.hook_id=t.hook_id||e,n.push(t)}n.forEach(e=>this.add(e))}},ht=class{name;source;filename;executedAt;constructor(e){this.name=e.name,this.source=e.source,this.filename=e.filename,this.executedAt=e.executedAt}async up(e){let t=await import(this.filename);if(typeof t.up!=`function`)throw new D(`Migration ${this.name} does not export an up function`);await t.up(e)}async down(e){let t=await import(this.filename);if(typeof t.down!=`function`)throw new D(`Migration ${this.name} does not export a down function`);await t.down(e)}},gt=class{static __container_entry_key=`MigratorService`;debug=!1;emmitter;logger;db;sources;constructor(e){this.debug=e.debug??this.debug,this.emmitter=e.emmitter||new R,this.logger=e.logger||new L,this.db=e.db,this.sources=e.sources}addSource(e){this.sources.push(e)}async ensureMigrationsTable(){await this.db.schema.createTable(`migrations`).ifNotExists().addColumn(`name`,`varchar(255)`,e=>e.primaryKey()).addColumn(`module`,`varchar(255)`).addColumn(`executed_at`,`timestamp`,e=>e.notNull()).execute()}async listSource(e){let t=await g.promises.readdir(e.directory),n=[];for(let r of t){if(!r.endsWith(`.js`)&&!r.endsWith(`.ts`))continue;let t=a.join(e.directory,r),i=new ht({name:a.basename(r,a.extname(r)),source:e.id,filename:t,executedAt:null});n.push(i)}return n}async list(e){await this.ensureMigrationsTable();let t=[];for await(let e of this.sources){let n=await this.listSource(e);t.push(...n)}t.sort((e,t)=>e.name.localeCompare(t.name));let n=await this.db.selectFrom(`migrations`).selectAll().execute();for(let e of n){e.source||=`root`;let n=t.find(t=>t.name===e.name);n&&(n.executedAt=new Date(e.executed_at))}let r=t;return e?.source&&(r=t.filter(t=>t.source===e.source)),r}async migrateUp(e){await e.up(this.db),await this.db.insertInto(`migrations`).values({name:e.name,module:e.source,executed_at:p(new Date,`yyyy-MM-dd HH:mm:ss`)}).execute()}async migrateDown(e){await e.down(this.db),await this.db.deleteFrom(`migrations`).where(`name`,`=`,e.name).where(`module`,`=`,e.source).execute()}async migrateFile(e){await this.ensureMigrationsTable();let t=(await this.list()).find(t=>t.filename===e);if(!t)return{name:a.basename(e,a.extname(e)),filename:e,source:null,result:`failed`,error:Error(`Migration ${e} not found`)};if(t.executedAt)return{name:t.name,filename:t.filename,source:t.source,result:`success`};let[n]=await F(()=>this.migrateUp(t));return n?{name:t.name,filename:t.filename,source:t.source,result:`failed`,error:n}:{name:t.name,filename:t.filename,source:t.source,result:`success`}}async rollbackFile(e){await this.ensureMigrationsTable();let t=(await this.list()).find(t=>t.filename===e);if(!t)return{name:a.basename(e,a.extname(e)),filename:e,source:null,result:`failed`,error:`Migration ${e} not found`};if(!t.executedAt)return{name:t.name,filename:t.filename,source:t.source,result:`success`};let[n]=await F(()=>this.migrateDown(t));return n?{name:t.name,filename:t.filename,source:t.source,result:`failed`,error:n}:{name:t.name,filename:t.filename,source:t.source,result:`success`}}async migrate(e={}){await this.ensureMigrationsTable();let t=await this.list(e);if(t=t.filter(e=>!e.executedAt),t.sort((e,t)=>e.name.localeCompare(t.name)),e.steps!==void 0&&(t=t.slice(0,e.steps)),t.length===0)return[];await this.emmitter.emitAndWait(`migrator:before-migrate`,{migrations:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.migrateFile(e.filename);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`migrator:after-migrate`,{migrations:t,results:n}),n}async rollback(e={}){await this.ensureMigrationsTable();let t=await this.list(e);if(t=t.filter(e=>e.executedAt),t.sort((e,t)=>t.name.localeCompare(e.name)),e.steps!==void 0&&(t=t.slice(0,e.steps)),t.length===0)return[];await this.emmitter.emitAndWait(`migrator:before-rollback`,{migrations:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.rollbackFile(e.filename);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`migrator:after-rollback`,{migrations:t.map(e=>e.name)}),n}async up(e=1,t={}){return this.migrate({...t,steps:e})}async down(e=1,t={}){return this.rollback({...t,steps:e})}async latest(e={}){return this.migrate(e)}async latestOrFail(e={}){let t=await this.latest(e);if(t.some(e=>e.result===`failed`)){let e=Error(`Failed to run all migrations`);throw Object.assign(e,{results:t}),e}return t}async fresh(e={}){let t=await this.rollback(e);return t.some(e=>e.result===`failed`)?t:await this.migrate(e)}},_t=class{listeners=new Map;constructor(){process.on(`message`,e=>{let t=this.listeners.get(e.event);if(t)for(let n of t)n(e.data)})}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){if(!process.send)throw Error(`PluginIpcClient.emit: process.send is not available — process was not spawned with IPC channel`);let n=I(),r={id:n,event:e,data:t};return process.send(r),n}},vt=class{listeners=new Map;constructor(e){this.child=e,this.child.on(`message`,e=>{let t=this.listeners.get(e.event);if(t)for(let n of t)n(e.data)})}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){if(!this.child.send)throw Error(`PluginIpcHost.emit: child process was not spawned with an IPC channel`);let n=I(),r={id:n,event:e,data:t};return this.child.send(r),n}};function yt(e){let t=[],n=e.replace(/:[a-zA-Z_][a-zA-Z0-9_]*/g,e=>(t.push(e.slice(1)),`([^/]+)`)).replace(/\//g,`\\/`);return{pattern:RegExp(`^${n}$`),paramNames:t}}var bt=class{routes=[];constructor(e){this.client=e,this.client.on(`router:request`,e=>this.dispatch(e))}async dispatch(e){for(let t of this.routes){if(t.method!==e.method)continue;let n=t.pattern.exec(e.path);if(!n)continue;let r={};t.paramNames.forEach((e,t)=>{r[e]=n[t+1]});let i=200,a={},o={status(e){return i=e,this},send:t=>{let n={requestId:e.requestId,status:i,body:t,headers:a};this.client.emit(`router:response`,n)}};await t.handler({...e,params:r},o);return}this.client.emit(`router:response`,{requestId:e.requestId,status:404,body:{message:`Not Found`}})}register(e,t,n){let{pattern:r,paramNames:i}=yt(t);this.routes.push({method:e,path:t,handler:n,pattern:r,paramNames:i}),this.client.emit(`router:register`,{method:e,path:t})}get(e,t){this.register(`GET`,e,t)}post(e,t){this.register(`POST`,e,t)}put(e,t){this.register(`PUT`,e,t)}patch(e,t){this.register(`PATCH`,e,t)}delete(e,t){this.register(`DELETE`,e,t)}},xt=class e{directory;prefix;module;router;logger=new L;routes=[];debug=!1;setDirectory(e){return this.directory=e,this}setPrefix(e){return this.prefix=e,this}setRouter(e){return this.router=e,this}setModule(e){return this.module=e,this}setLogger(e){return this.logger=e,this}setDebug(e){return this.debug=e,this}static create(t){return new e().setDirectory(t)}async loadFiles(){let e=x.sync(`**/*.(ts|js|mjs)`,{cwd:this.directory});this.debug&&this.logger.debug(`Found ${e.length} route files in ${this.directory}`,{files:e});let t=[];for(let n of e){let e=n.replace(/\.(ts|js|mjs)$/,``),r=`get`;for(let t of[`.post`,`.patch`,`.delete`,`.put`])if(e.endsWith(t)){r=t.substring(1),e=e.replace(t,``);break}e=e.replace(/\/index$/,``),e=e.replace(/^index$/,``),e=e.replace(/\[\.\.\.([^\]]+)]/g,`*$1`),e=e.replace(/\[([^\]]+)]/g,`:$1`),e.startsWith(`/`)||(e=`/`+e),e===`/`&&(e=`/`),this.prefix&&(e=(this.prefix.startsWith(`/`)?this.prefix:`/`+this.prefix)+e);let i=0;e.includes(`*`)&&(i+=1e6);let a=(e.match(/:/g)||[]).length;i+=a*1e4;let o=e.split(`/`).filter(e=>e).length;i-=o*100,t.push({file:n,routePath:e,method:r,sortKey:i,module:this.module})}t.sort((e,t)=>e.sortKey-t.sortKey),this.routes=t}async registerRoutes(){if(!this.router)throw new D(`Router instance not set`);let e=this.module||`unknown`,t=function(t){t.metadata={...t.metadata,module:e}};this.router.on(`added`,t);for(let e of this.routes){let t=(await import(`${this.directory}/${e.file}`)).default;if(typeof t!=`function`){this.logger.warn(`Route file ${e.file} does not export a default function`);continue}this.router[e.method](e.routePath,t)}this.router.off(`added`,t)}async load(){await this.loadFiles(),await this.registerRoutes()}},St=class{path=``;method=`get`;handler=null;middlewares=[];metadata={};constructor(e={}){this.path=e.path||``,this.method=e.method||`get`,this.handler=e.handler||null,this.middlewares=e.middlewares||[],this.metadata=e.metadata||{}}static params(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}static query(e){let t={},n=e.split(`?`)[1];return n?m.parse(n):t}toJSON(){return{path:this.path,method:this.method,middlewares:this.middlewares.map(e=>e.constructor.name),metadata:this.metadata}}};async function Ct(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function wt(e,t,n){let r=e.listeners||[];r.find(e=>e.event===t&&e.listener===n)||(r.push({event:t,listener:n}),e.listeners=r)}function Tt(e){return class extends e{constructor(...e){super(...e),typeof this.constructor.boot==`function`&&this.constructor.boot.apply(this.constructor)}static listeners=[];static on(e,t){return wt(this,e,t)}static async emit(e,...t){return Ct(this,e,...t)}}}function Et(e){return class extends e{listeners;constructor(...e){super(...e),this.listeners=[]}on(e,t){this.listeners.push({event:e,listener:t})}off(e,t){let n=this.listeners.findIndex(n=>n.event===e&&n.listener===t);n!==-1&&this.listeners.splice(n,1)}emit(e,...t){let n=this.listeners.filter(t=>t.event===e);for(let e of n)e.listener(...t)}async emitAsync(e,...t){let n=this.listeners.filter(t=>t.event===e);for await(let e of n)await e.listener(...t)}}}Tt.emit=Ct,Tt.on=wt;var X=class e extends j(Et){static __container_entry_key=`RouterService`;routes=[];middlewares=[];prefixes=[];groups=[];groupPrefixes=[];debug=!1;logger=new L;metadata={};constructor(e={}){super(),this.routes=e.routes||[],this.middlewares=e.middlewares||[],this.prefixes=e.prefixes||[],this.groups=e.groups||[],this.groupPrefixes=e.groupPrefixes||[],this.debug=e.debug||!1,this.metadata=e.metadata||{},this.listeners=e.listeners||[]}use(e,t=`route`){return this.middlewares.push({middleware:e,context:t}),this}prefix(e){return this.prefixes.push(e),this}makePath(e){return ee([...this.groupPrefixes,...this.prefixes,e],`/`)}add(e){let t=new St({method:e.method,path:this.makePath(e.path),handler:e.handler,middlewares:this.middlewares.map(e=>e.middleware)});this.middlewares=this.middlewares.filter(e=>e.context!==`route`),this.prefixes=[],this.routes.push(t),this.debug&&this.logger.debug(`added route`,t),this.emit(`added`,t)}get(e,t){this.add({path:e,method:`GET`,handler:t})}post(e,t){this.add({path:e,method:`POST`,handler:t})}put(e,t){this.add({path:e,method:`PUT`,handler:t})}patch(e,t){this.add({path:e,method:`PATCH`,handler:t})}many(e,t,n){e.forEach(e=>{this.add({path:t,method:e,handler:n})})}delete(e,t){this.add({path:e,method:`DELETE`,handler:t})}group(){let t=new e({listeners:this.listeners,debug:this.debug});return t.groupPrefixes=this.prefixes,t.middlewares=this.middlewares.map(e=>({middleware:e.middleware,context:`group`})),this.groups.push(t),this.middlewares=this.middlewares.filter(e=>e.context!==`route`),this.prefixes=[],t}resolve(e,t){return this.list().find(n=>n.method.toUpperCase()===e.toUpperCase()?this.matchPath(n.path,t):!1)||null}async execute(e,t){if(!e.handler)throw Error(`Route handler not found for ${e.method} ${e.path}`);let n={...t};for await(let t of e.middlewares){let e=await t.handle(n);if(e&&`redirect`in e)return e;Object.assign(n,e)}return e.handler(n)}matchPath(e,t){let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean);for(let e=0;e<n.length;e++){let t=n[e],i=r[e];if(t===`*`)return!0;if(e>=r.length||!t.startsWith(`:`)&&t!==i)return!1}return!(r.length>n.length)}clear(){this.debug&&this.logger.debug(`clear`,{count:this.routes.length}),this.routes=[],this.groups=[]}list(){return this.routes.concat(...this.groups.map(e=>e.routes))}async load(e={}){this.debug=e.debug??this.debug,this.debug&&this.logger.debug(`service loaded in debug mode`)}loadSync(e={}){this.debug=e.debug??this.debug,this.debug&&this.logger.debug(`service loaded in debug mode`)}},Dt=class{static __container_entry_key=`ShellService`;debug;logger;init(e={}){this.debug=e.debug||!1,this.logger=e.logger||J.child({label:`shell`}),this.debug&&this.logger.debug(`initialized in debug mode`)}async command(e,t,n={}){return new Promise((r,a)=>{let o=i(e,t,{cwd:n.cwd||process.cwd(),stdio:`pipe`,shell:n.shell??!0,env:n.env||process.env}),s=``;o.stdout?.on(`data`,e=>{s+=e.toString()}),o.stderr?.on(`data`,e=>{s+=e.toString()}),o.on(`close`,n=>{if(this.debug&&this.logger.debug(`command executed`,{bin:e,args:t,output:s}),n===0)return r();let i=`Command failed with exit code ${n}`;this.logger.error(i,{bin:e,args:t,code:n,output:s}),a(new V(i,s,e,t))}),o.on(`error`,n=>{this.logger.error(`Command execution error`,{bin:e,args:t,error:n.message}),a(n)})})}async executeCommandWithOutput(e,t,n={}){return this.debug&&this.logger.debug(`executing command`,{bin:e,args:t}),new Promise((r,a)=>{let o=i(e,t,{cwd:n.cwd||process.cwd(),stdio:`pipe`,shell:!0,env:n.env||process.env}),s=``,c=``;o.stdout?.on(`data`,e=>{s+=e.toString()}),o.stderr?.on(`data`,e=>{c+=e.toString()}),o.on(`close`,n=>{if(n===0)r(s.trim());else{let r=`Command failed with exit code ${n}: ${c}`;this.logger.error(r,{bin:e,args:t,code:n,errorOutput:c}),a(new V(r,s,e,t))}}),o.on(`error`,n=>{this.logger.error(`Command execution error`,{bin:e,args:t,error:n.message}),a(n)})})}},Z=class{constructor(e,t,n){this.db=e,this.table=t,this.primaryKey=n}query(e){return e?.qb||this.db.selectFrom(this.table)}async count(e){let t=this.query(e);t=t.select(e=>e.fn.countAll().as(`count`));let n=await t.executeTakeFirstOrThrow();return Number(n.count)}async findMany(e){let t=this.query(e);if(t=t.selectAll(),e?.limit&&(t=t.limit(e.limit)),e?.offset&&(t=t.offset(e.offset)),e?.orderBy){let n=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy],r=Array.isArray(e.orderDirection)?e.orderDirection:[e.orderDirection??`asc`];n.forEach((e,n)=>{t=t.orderBy(e,r[n]||`asc`)})}return await t.execute()}async findOne(e){let t=this.query(e);return t=t.selectAll(),await t.executeTakeFirst()}async findById(e,t){let n=this.query(t);return n=n.selectAll(),n=n.where(this.primaryKey,`=`,e),await n.executeTakeFirst()}async findByIdOrFail(e,t){let n=await this.findById(e,t);if(!n)throw new D(`Item not found`,404);return n}async paginate(e){let t=e?.page??1,n=(t-1)*(e?.limit??10),r=e?.limit??10,i={...e,limit:r,offset:n},a={...e},[o,s]=await Promise.all([this.findMany(i),this.count(a)]);return{items:o,page:t,per_page:r,total:s,total_pages:Math.ceil(s/r)}}async create(e){let t=this.db.insertInto(this.table);return t=t.values(e).returningAll(),await t.executeTakeFirst()}async createMany(e){let t=this.db.insertInto(this.table);return t=t.values(e).returningAll(),await t.execute()}async updateById(e,t){let n=await this.findByIdOrFail(e),r=this.db.updateTable(this.table);r=r.set(t).where(this.primaryKey,`=`,n[this.primaryKey]).returningAll(),await r.executeTakeFirst()}async deleteById(e){let t=await this.findByIdOrFail(e),n=this.db.deleteFrom(this.table);n=n.where(this.primaryKey,`=`,t[this.primaryKey]),await n.executeTakeFirst()}async deleteMany(e){let t={...e,qb:this.db.deleteFrom(this.table)},n=this.query(t);e?.limit&&(n=n.limit(e.limit)),await n.execute()}},Ot=class extends Z{constructor(e){super(e,`permissions_assignments`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}if(e?.permissionId){let n=Array.isArray(e.permissionId)?e.permissionId:[e.permissionId];t=t.where(`permission_id`,`in`,n)}if(e?.assignableId){let n=Array.isArray(e.assignableId)?e.assignableId:[e.assignableId];t=t.where(`assignable_id`,`in`,n)}if(e?.assignableType){let n=Array.isArray(e.assignableType)?e.assignableType:[e.assignableType];t=t.where(`assignable_type`,`in`,n)}return t}},kt=class extends Z{constructor(e){super(e,`permissions`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}return e?.search&&(t=t.where(`name`,`like`,`%${e.search}%`)),t}};function At(){return function(e){class t extends e{}return t}}var jt=class extends j(N(Z),At()){constructor(e){super(e,`tokens`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}if(e?.search&&(t=t.where(`name`,`like`,`%${e.search}%`)),e?.type){let n=Array.isArray(e.type)?e.type:[e.type];t=t.where(`type`,`in`,n)}return t}async findByToken(e){let t=this.query();return t=t.selectAll(),t=t.where(`token`,`=`,e),await t.executeTakeFirst()||null}};const Mt=ge(he);function Nt(e){return`'${e.replace(/'/g,`'\\''`)}'`}var Pt=class{cwd;sshKey;sshKeyFile;sshKeyTmpFileName;logger=new L;debug;constructor(e){Object.assign(this,e)}async buildEnv(){let e={sshKeyFile:void 0,env:process.env,cleanup:async()=>{}};if(this.sshKeyFile&&(e.env.GIT_SSH_COMMAND=`ssh -i ${Nt(this.sshKeyFile)} -o StrictHostKeyChecking=no`,e.sshKeyFile=this.sshKeyFile),this.sshKey){let t=this.sshKeyTmpFileName??be(ye(),`git-ssh-key-${xe()}`);await ve(t,this.sshKey,{mode:384}),e.env.GIT_SSH_COMMAND=`ssh -i ${Nt(t)} -o StrictHostKeyChecking=no`,e.sshKeyFile=t,e.cleanup=async()=>{try{await _e(t)}catch(e){this.logger.warn(`Failed to delete temporary SSH key file: ${t}`,{error:e})}}}return e}async run(e){let{env:t,sshKeyFile:n,cleanup:r}=await this.buildEnv();this.debug&&this.logger.debug(`git `+e,{cwd:this.cwd,sshKeyFile:n});try{let{stdout:n}=await Mt(`git ${e}`,{cwd:this.cwd,env:t});return n.trim()}finally{await r()}}async tryRun(e){try{return await this.run(e)}catch{return null}}async checkout(e){await this.run(`checkout ${e}`)}async fetch(){await this.run(`fetch --all --prune`)}async pull(){await this.fetch(),await this.tryRun(`rev-parse --abbrev-ref --symbolic-full-name @{upstream}`)&&await this.run(`pull --ff-only`)}async getInfo(){let e=await this.run(`rev-parse --abbrev-ref HEAD`),t=e===`HEAD`,n=await this.run(`rev-parse --short HEAD`),r=await this.tryRun(`remote`),i=r?r.split(`
4
- `).filter(Boolean):[];return{directory:this.cwd,head:t?null:e,shortHash:n,isDetachedHead:t,remotes:i}}};const Q=k.proxy(A),Ft=`database`,It=k.proxy(Ft),Lt=k.proxy(gt),Rt=k.proxy(X),zt=new Dt;function Bt(e){return e}async function $(e,t){let n=Array.isArray(e)?e:[e],r=t.target,i=t.pivot;function a(e,t){return typeof t==`function`?t(e):l(e,t)}let o=n.map(e=>a(e,i.sourceKey)).filter(Boolean),s=await i.findEntities(o),c=s.map(e=>a(e,i.targetKey)).filter(Boolean),u=await r.findEntities(c);for(let e of n){let n=s.filter(t=>a(t,i.sourceKey)===a(e,i.sourceKey));if(!n.length){d(e,t.key,[]);continue}let o=u.filter(e=>n.some(t=>a(t,r.sourceKey)===a(e,r.targetKey)));d(e,t.key,o)}}function Vt(e){return Bt({load:async t=>$(t,e)})}var Ht=class extends ze{authorize(e,t,n){if(this.cannot(e,t,n)){let n=new D(`Unauthorized`,403),r=``;throw typeof t==`string`&&(r=t),t&&typeof t==`function`&&t.name&&(r=t.name),t&&typeof t==`object`&&t.constructor&&t.constructor.name&&(r=t.constructor.name),Object.assign(n,{action:e,subject:r}),n}}},Ut=class extends Be{request;response;constructor(e,t){super({cookies:new Map(Object.entries(e.cookies)),prefix:Q.get(`cookie.prefix`,``)}),this.request=e,this.response=t}set(e,t,n){let r=this.prefix+e,i={httpOnly:!0,...n};this.response.cookie(r,t,i),super.set(r,t,n)}},Wt=class extends M(Ue){get git(){return new Pt({cwd:this.directory,sshKey:Q.get(`modules.${this.id}.ssh_key`),sshKeyTmpFileName:qe(`ssh_key_${this.id}.pem`),logger:J.child({label:`git`}),debug:Q.get(`git.debug`,!1)})}makePath(...e){return s(this.directory,...e)}staticPath(...e){return s(`/static`,`modules`,this.id,...e)}command=(e,t,n)=>zt.command(e,t,{cwd:this.directory,...n});load(){let e=this.makePath(`module.json`);if(!g.existsSync(e))return;let t=g.readFileSync(e,`utf-8`),n=JSON.parse(t);this.dependencies=n.dependencies||{},this.build=n.build||{}}findClientEntrypointFilename(e=`dev`){let t=[];e===`dev`&&t.push(this.makePath(`client`,`module.client.ts`),this.makePath(`client`,`module.client.js`),this.makePath(`client`,`client.ts`),this.makePath(`client`,`client.js`)),e===`node`&&t.push(this.makePath(`client-dist/node`,`index.js`),this.makePath(`client-dist/node`,`index.mjs`),this.makePath(`client-dist/node`,`module.client.js`),this.makePath(`client-dist/node`,`module.client.mjs`)),e===`browser`&&t.push(this.makePath(`client-dist/browser`,`index.js`),this.makePath(`client-dist/browser`,`index.mjs`),this.makePath(`client-dist/browser`,`module.client.js`),this.makePath(`client-dist/browser`,`module.client.mjs`));for(let e of t)if(g.existsSync(e))return e;return null}},Gt=class{url;request;response;cookies;head;nodeContainer;nodeConfig;nodeState;browserContainer;browserConfig;browserState;constructor(e){this.url=e.url,this.request=e.request,this.response=e.response,this.cookies=new Ut(this.request,this.response),this.head=[],this.nodeContainer=e.nodeContainer||new O,this.nodeConfig=e.nodeConfig||new A,this.nodeState=e.nodeState||new Map,this.browserConfig=e.browserConfig||new A,this.browserContainer=e.browserContainer||new O,this.browserState=e.browserState||new Map}setBrowserState(e,t){this.browserState.set(e,t)}setNodeState(e,t){this.nodeState.set(e,t)}setState(e,t){this.setNodeState(e,t),this.setBrowserState(e,t)}setBrowserContainerValue(e,t){this.browserContainer.set(e,t)}setNodeContainerValue(e,t){this.nodeContainer.set(e,t)}setContainerValue(e,t){this.setNodeContainerValue(e,t),this.setBrowserContainerValue(e,t)}setBrowserConfigValue(e,t){this.browserConfig.set(e,t)}setNodeConfigValue(e,t){this.nodeConfig.set(e,t)}setConfigValue(e,t){this.setNodeConfigValue(e,t),this.setBrowserConfigValue(e,t)}},Kt=class extends M(We){directory;makePath(...e){return be(this.directory,...e)}},qt=class e extends Kt{staticPath(...e){return s(`/static`,`modules`,this.id,...e)}async load(){}async addApiFolder(e,t={}){if(!k.has(X))return;let n=t.prefix||`/api/${this.id}`;await xt.create(e).setPrefix(n).setRouter(Rt).setModule(this.id).load()}static fromPluginDiscoverEntity(t){let n=typeof this==`function`?this:e,r=new n,i={id:t.id,name:t.name,version:t.version,directory:t.directory};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}};function Jt(e){async function t(t,n){let r=Array.isArray(t)?t:[t],i=Array.isArray(n)?n:[n];for(let t of i){let n=e?.[t];if(!n)throw new D(`Loader ${String(t)} not declared`);await n.load(r)}}return{keys:Object.keys(e),loaders:e,load:t}}function Yt(e){return e}function Xt(e){let t=e.folders,n=e.filename,r=e.glob||`**/*.(ts|js)`,i=[`**/index.ts`,`**/*.spec.ts`,`**/*.spec-d.ts`,`**/*.test.ts`,`**/*.test-d.ts`],o=e.ignore||[],s=``;for(let e of t){let t=x.sync(`${e}/${r}`,{ignore:[...i,...o]});for(let e of t){let t=a.relative(a.dirname(n),e),r=a.extname(e),i=g.readFileSync(e,`utf-8`).includes(`export default`)&&!t.includes(`generateIndexFile.ts`);e.endsWith(`.vue`)&&(i=!0),s+=`export * from './${t}'\n`,i&&(s+=`export { default as ${a.basename(e,r)} } from './${t}'\n`)}}s=s.trim(),g.writeFileSync(n,s)}async function Zt(e){for(let t of e){let e=Se(t);if(Ce.existsSync(t))return await import(e.toString())}return null}export{Ht as AclEntity,E as ArtisanService,we as ArtisanTesterService,Ge as ArtisanWrapperService,Je as ConfigFSService,et as ConfigManagerService,$e as ConfigS3Service,Ut as CookieMapEntity,Z as DatabaseRepository,At as DatabaseRepositoryInferMixin,Ye as DriveBaseGateway,Qe as DriveS3Gateway,tt as EmmitterService,st as EnvService,ct as GitBranchRepository,dt as GitCommitRepository,Pt as GitGateway,mt as LifecycleService,ht as MigrationEntity,gt as MigratorService,Wt as ModuleEntity,Gt as PageRequestContextEntity,Ot as PermissionAssignmentRepository,kt as PermissionRepository,qt as PluginEntity,Kt as PluginEntryEntity,_t as PluginIpcClient,vt as PluginIpcHost,bt as PluginRouter,St as RouteEntity,xt as RouterFileBaseRoutingService,X as RouterService,Dt as ShellService,jt as TokenRepository,K as basePath,Q as config,k as container,Vt as createHasManyThroughLoader,Jt as createLoaderFactory,It as database,Yt as defineHandler,Bt as defineLoader,Xt as generateIndexFile,pt as importAll,Y as importFiles,ft as importGlob,Zt as importOne,Ft as key,$ as loadHasManyThrough,J as logger,Lt as migrator,w as printObject,T as printTable,Ke as relativeToBasePath,Rt as router,zt as shell,qe as tmpPath};
5
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiRW1taXR0ZXJTZXJ2aWNlIiwiTGlmZWN5Y2xlU2VydmljZSIsImJvb2xlYW4iLCJQZXJtaXNzaW9uIiwic3ViamVjdCIsImNyZWF0ZVN1YmplY3QiLCJDb29raWVNYXBFbnRpdHkiLCJCYXNlRW50aXR5TWl4aW4iLCJCYXNlRW50aXR5TWl4aW4iLCJNb2R1bGUiLCJQbHVnaW5FbnRpdHkiLCJCYXNlRHJpdmUiLCJEcml2ZUVudGl0eSIsIlMzRHJpdmUiLCJCYXNlRW1taXR0ZXJTZXJ2aWNlIiwiQmFzZUxpZmVjeWNsZVNlcnZpY2UiLCJFbW1pdHRlclNlcnZpY2UiLCJqb2luIiwiU2hlbGxFeGVjcHRpb24iLCJEYXRhYmFzZVJlcG9zaXRvcnlJbmZlciIsImpvaW4iLCJSb3V0ZXJTZXJ2aWNlIiwiQmFzZUFjbCIsIkJhc2UiLCJCYXNlIiwiQmFzZSIsImpvaW4iLCJSb3V0ZXJTZXJ2aWNlIiwicGF0aFRvRmlsZVVSTCIsImZzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci91dGlscy9wcmludFRhYmxlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9BcnRpc2FuU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2NvbnRhaW5lci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQXJ0aXNhblRlc3RlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2ZsYXR0ZW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jcmVhdGVJZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL3VybFZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy9wYWdpbmF0aW9uVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3Blcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3Blcm1pc3Npb25TY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvdG9rZW5TY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvU2hlbGxFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2ZhY2FkZXMvdmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QZXJtaXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0Nvb2tpZU1hcEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlVXBsb2FkU2Vzc2lvbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVNYW5pZmVzdEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Sb2xlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9BcnRpc2FuV3JhcHBlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2Jhc2VQYXRoLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Db25maWdGU1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2dhdGV3YXlzL0RyaXZlQmFzZUdhdGV3YXkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2dhdGV3YXlzL0RyaXZlUzNHYXRld2F5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Db25maWdTM1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0NvbmZpZ01hbmFnZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NjaGVtYXMvZW52U2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9FbnZTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9HaXRCcmFuY2hSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9HaXRDb21taXRSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2xvZ2dlci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvaW1wb3J0QWxsLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9NaWdyYXRpb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL01pZ3JhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUGx1Z2luSXBjQ2xpZW50LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5JcGNIb3N0LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5Sb3V0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1JvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUm91dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvU2hlbGxTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvUGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvUGVybWlzc2lvblJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL21peGlucy9EYXRhYmFzZVJlcG9zaXRvcnlJbmZlck1peGluLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvVG9rZW5SZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9nYXRld2F5cy9HaXRHYXRld2F5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2NvbmZpZy50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9taWdyYXRvci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9yb3V0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvc2hlbGwudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2RlZmluZUxvYWRlci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbG9hZGVycy9jcmVhdGVIYXNNYW55VGhyb3VnaExvYWRlci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvQWNsRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvUGFnZVJlcXVlc3RDb250ZXh0RW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9QbHVnaW5FbnRyeUVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9jcmVhdGVMb2FkZXJGYWN0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9kZWZpbmVIYW5kbGVyLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9nZW5lcmF0ZUluZGV4RmlsZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvaW1wb3J0T25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUYWJsZSBmcm9tICdjbGktdGFibGUzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQ29sdW1uIHtcbiAgICBsYWJlbDogc3RyaW5nXG4gICAgdmFsdWU6IHN0cmluZyB8ICgoaXRlbTogYW55KSA9PiBzdHJpbmcpXG4gICAgd2lkdGg/OiBudW1iZXJcbiAgICByZWFsV2lkdGg/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RPcHRpb25zIHtcbiAgICBrZXlXaWR0aD86IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRPYmplY3Qob3V0cHV0OiBhbnkgPSB7fSwgb3B0aW9uczogT2JqZWN0T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgc2NyZWVuV2lkdGggPSBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIHx8IDgwXG4gICAgY29uc3Qga2V5V2lkdGggPSBvcHRpb25zLmtleVdpZHRoIHx8IE1hdGguZmxvb3Ioc2NyZWVuV2lkdGggKiAwLjIpXG4gICAgY29uc3QgdmFsdWVXaWR0aCA9IE1hdGguZmxvb3Ioc2NyZWVuV2lkdGggKiAwLjcpXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSh7XG4gICAgICAgIHdvcmRXcmFwOiB0cnVlLFxuICAgICAgICB3cmFwT25Xb3JkQm91bmRhcnk6IGZhbHNlLFxuICAgICAgICBjb2xXaWR0aHM6IFtrZXlXaWR0aCwgdmFsdWVXaWR0aF0sXG4gICAgfSlcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG91dHB1dCkpIHtcbiAgICAgICAgdGFibGUucHVzaChba2V5LCBTdHJpbmcob3V0cHV0W2tleV0pXSlcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyh0YWJsZS50b1N0cmluZygpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRUYWJsZShpdGVtczogYW55W10sIGNvbHVtbnM/OiBUYWJsZUNvbHVtbltdKSB7XG4gICAgY29uc3Qgc2NyZWVuV2lkdGggPSAocHJvY2Vzcy5zdGRvdXQuY29sdW1ucyB8fCA4MCkgLSA2XG4gICAgY29uc3Qgcm93cyA9IFtdIGFzIHN0cmluZ1tdW11cbiAgICBjb25zdCBoZWFkOiBUYWJsZUNvbHVtbltdID0gW11cblxuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICAgIGhlYWQucHVzaCguLi5jb2x1bW5zKVxuICAgIH1cblxuICAgIGlmICghY29sdW1ucykge1xuICAgICAgICBpdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gT2JqZWN0LmtleXMoaXRlbSkpXG4gICAgICAgICAgICAuZmxhdCgpXG4gICAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KVxuICAgICAgICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGhlYWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgfVxuXG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvdyA9IFtdIGFzIHN0cmluZ1tdXG5cbiAgICAgICAgaGVhZC5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSAnJ1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGgudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGgudmFsdWUoaXRlbSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBoLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gaXRlbVtoLnZhbHVlXVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gJydcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByb3cucHVzaCh2YWx1ZSlcbiAgICAgICAgfSlcblxuICAgICAgICByb3dzLnB1c2gocm93KVxuICAgIH0pXG5cbiAgICBoZWFkLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgaWYgKGgud2lkdGgpIHtcbiAgICAgICAgICAgIGgud2lkdGggPSBOdW1iZXIoaC53aWR0aClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaC5sYWJlbCkge1xuICAgICAgICAgICAgaC5sYWJlbCA9IFN0cmluZyhoLnZhbHVlKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IHVzZWRXaWR0aCA9IGhlYWQuZmlsdGVyKChoKSA9PiAhIWgud2lkdGgpLnJlZHVjZSgoYWNjLCBoKSA9PiBhY2MgKyBoLndpZHRoISwgMClcbiAgICBjb25zdCByZW1haW5pbmdXaWR0aCA9IDEwMCAtIHVzZWRXaWR0aFxuICAgIGNvbnN0IHdpdGhOb1dpZHRoID0gaGVhZC5maWx0ZXIoKGgpID0+ICFoLndpZHRoKS5sZW5ndGhcblxuICAgIGhlYWQuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICBpZiAoIWgud2lkdGgpIHtcbiAgICAgICAgICAgIGgud2lkdGggPSBNYXRoLmZsb29yKHJlbWFpbmluZ1dpZHRoIC8gd2l0aE5vV2lkdGgpXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgaGVhZC5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgIGlmIChoLndpZHRoKSB7XG4gICAgICAgICAgICBoLnJlYWxXaWR0aCA9IE1hdGguZmxvb3Ioc2NyZWVuV2lkdGggKiAoaC53aWR0aCAvIDEwMCkpXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGUoe1xuICAgICAgICBoZWFkOiBoZWFkLm1hcCgoaCkgPT4gaC5sYWJlbCksXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBoZWFkOiBbXSwgLy9kaXNhYmxlIGNvbG9ycyBpbiBoZWFkZXIgY2VsbHNcbiAgICAgICAgICAgIGJvcmRlcjogW10sIC8vZGlzYWJsZSBjb2xvcnMgZm9yIHRoZSBib3JkZXJcbiAgICAgICAgfSxcbiAgICAgICAgd29yZFdyYXA6IHRydWUsXG4gICAgICAgIHdyYXBPbldvcmRCb3VuZGFyeTogZmFsc2UsXG4gICAgICAgIGNvbFdpZHRoczogaGVhZC5tYXAoKGgpID0+IGgucmVhbFdpZHRoKSBhcyBudW1iZXJbXSxcbiAgICB9KVxuXG4gICAgdGFibGUucHVzaCguLi5yb3dzKVxuXG4gICAgY29uc29sZS5sb2codGFibGUudG9TdHJpbmcoKSlcbn1cbiIsImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwcmludFRhYmxlLCBwcmludE9iamVjdCB9IGZyb20gJy4uL3V0aWxzL3ByaW50VGFibGUudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFydGlzYW5TZXJ2aWNlIGV4dGVuZHMgQ29tbWFuZCB7XG4gICAgcHVibGljIG5lZWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKVxuICAgIHB1YmxpYyB0YWJsZSA9IHByaW50VGFibGVcbiAgICBwdWJsaWMgb2JqZWN0ID0gcHJpbnRPYmplY3RcbiAgICBwdWJsaWMgY29sb3JzID0gY2hhbGtcblxuICAgIHB1YmxpYyBuZWVkKC4uLmFyZ3M6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgPT4gdGhpcy5uZWVkcy5hZGQoYXJnKSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGNyZWF0ZUNvbW1hbmQobmFtZT86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IEFydGlzYW5TZXJ2aWNlKG5hbWUpXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzQ29kZTogbnVtYmVyID0gNTAwXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXNDb2RlOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21FcnJvcihlcnJvcjogRXJyb3IpOiBCYXNlRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIDUwMClcbiAgICB9XG59IiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbnRhaW5lclNlcnZpY2UgZnJvbSBcIiNzaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50c1wiO1xuXG5jb25zdCBjb250YWluZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnNlcnZlckNvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG5cbmdsb2JhbFRoaXMuc2VydmVyQ29udGFpbmVyID0gY29udGFpbmVyXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRhaW5lciBhcyBDb250YWluZXJTZXJ2aWNlXG4iLCJpbXBvcnQgQXJ0aXNhblNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9BcnRpc2FuU2VydmljZS50cydcbmltcG9ydCBkaSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcnRlVGVzdGVyU2VydmljZSBleHRlbmRzIEFydGlzYW5TZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKSBcblxuICAgICAgICB0aGlzLmV4aXRPdmVycmlkZSgpXG5cbiAgICAgICAgdGhpcy5jb25maWd1cmVPdXRwdXQoe1xuICAgICAgICAgICAgd3JpdGVPdXQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTdXBwcmVzcyBjb21tYW5kIG91dHB1dCBkdXJpbmcgdGVzdHNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3cml0ZUVycjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN1cHByZXNzIGVycm9yIG91dHB1dCBkdXJpbmcgdGVzdHNcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGkuc2V0KEFydGlzYW5TZXJ2aWNlLCB0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGQocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGF3YWl0IGltcG9ydChwYXRoKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFyc2VBc3luYyhbJ25vZGUnLCAnYXJ0ZScsIC4uLmFyZ3NdKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGdldCwgc2V0LCBoYXMsIHVuc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NvbmZpZ1NlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRW50cnk+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJzpib29sZWFuJykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCc6Ym9vbGVhbicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRba2V5XSA9IGVudHJ5LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXModmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSBhcyBUXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyBlbnRyeS52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0KHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIGRlZmF1bHRWYWx1ZSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9uZTxUID0gYW55IHwgdW5kZWZpbmVkPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAncnVudGltZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGxldCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltYXJ5VmFsdWUgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCB2YWx1ZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICghcHJpbWFyeVZhbHVlKSByZXR1cm5cblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVW5pb25Ub0ludGVyc2VjdGlvbiB9IGZyb20gJy4vdHlwaW5nLnRzJ1xuXG5leHBvcnQgdHlwZSBBbnlDbGFzcyA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueVxuZXhwb3J0IHR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcbmV4cG9ydCB0eXBlIE1peGluPFQ+ID0gKGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3RvcjxUPlxuXG4vKipcbiAqIENvbXBvc2VzIG11bHRpcGxlIG1peGlucyBpbnRvIGEgc2luZ2xlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkLlxuICogQWxsb3dzIGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS1saWtlIGJlaGF2aW9yIGJ5IGFwcGx5aW5nIG1peGlucyBzZXF1ZW50aWFsbHkuXG4gKiBcbiAqIEBwYXJhbSBtaXhpbnMgLSBBcnJheSBvZiBtaXhpbiBmdW5jdGlvbnMgdG8gY29tcG9zZVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGluY2x1ZGVzIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZShUaW1lc3RhbXAsIFNvZnREZWxldGUpIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICogICAgIHN1cGVyKClcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlPFxuICAgIE0gZXh0ZW5kcyBBcnJheTwoYmFzZTogQ29uc3RydWN0b3I8YW55PikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oLi4ubWl4aW5zOiBNKTogVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBjbGFzcyB7fSBhcyBhbnkpIGFzIGFueVxufVxuXG4vKipcbiAqIEFsdGVybmF0aXZlIGNvbXBvc2UgZnVuY3Rpb24gdGhhdCBzdGFydHMgd2l0aCBhIGJhc2UgY2xhc3NcbiAqIFxuICogQHBhcmFtIGJhc2VDbGFzcyAtIFRoZSBiYXNlIGNsYXNzIHRvIHN0YXJ0IHdpdGhcbiAqIEBwYXJhbSBtaXhpbnMgLSBBcnJheSBvZiBtaXhpbiBmdW5jdGlvbnMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBleHRlbmRzIHRoZSBiYXNlIGNsYXNzIHdpdGggYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlRW50aXR5LCBUaW1lc3RhbXAsIFNvZnREZWxldGUpIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICogICAgIHN1cGVyKClcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlV2l0aDxcbiAgICBUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yLFxuICAgIE0gZXh0ZW5kcyBBcnJheTwoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KFxuICAgIGJhc2VDbGFzczogVEJhc2UsXG4gICAgLi4ubWl4aW5zOiBNXG4pOiBUQmFzZSAmIFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgYmFzZUNsYXNzIGFzIGFueSkgYXMgYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXhpbjxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihTb3VyY2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIDxUVGFyZ2V0IGV4dGVuZHMgQ29uc3RydWN0b3I+KFRhcmdldDogVFRhcmdldCkge1xuICAgICAgICBjbGFzcyBNaXhlZCBleHRlbmRzIFRhcmdldCB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZSguLi5hcmdzKVxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgc291cmNlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29weSBtZXRob2RzXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhTb3VyY2UucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgTWl4ZWQucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU291cmNlLnByb3RvdHlwZSwga2V5KSFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gTWl4ZWQgYXMgVFRhcmdldCAmIFRCYXNlXG4gICAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4ob2JqOiBhbnksIHByZWZpeCA9ICcnLCByZXM6IGFueSA9IHt9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBjb25zdCBuZXdLZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXlcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBuZXdLZXksIHJlcylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1tuZXdLZXldID0gdmFsdWVcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmZsYXR0ZW4ob2JqOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBrZXkuc3BsaXQoJy4nKVxuICAgICAgICBsZXQgY3VycmVudDogYW55ID0gcmVzdWx0XG4gICAgICAgIHBhcnRzLmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpID09PSBwYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHZhbHVlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudFtwYXJ0XSB8fCB0eXBlb2YgY3VycmVudFtwYXJ0XSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn0iLCJpbnRlcmZhY2UgVHJ5ZXIge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IGFueVxufVxuXG5pbnRlcmZhY2UgVHJ5ZXJBc3luYyB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxhbnk+IHwgYW55XG59XG5cbnR5cGUgVHJ5Q2F0Y2hSZXN1bHQ8VCBleHRlbmRzIFRyeWVyPiA9IFtudWxsLCBSZXR1cm5UeXBlPFQ+XSB8IFtFcnJvciwgbnVsbF1cblxudHlwZSBUcnlDYXRjaEFzeW5jUmVzdWx0PFQgZXh0ZW5kcyBUcnllckFzeW5jPiA9IFtudWxsLCBBd2FpdGVkPFJldHVyblR5cGU8VD4+XSB8IFtFcnJvciwgbnVsbF1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyeUNhdGNoPFQgZXh0ZW5kcyBUcnllckFzeW5jPih0cnllcjogVCk6IFByb21pc2U8VHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUPj4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuXG50cnlDYXRjaC5zeW5jID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBUcnllcj4odHJ5ZXI6IFQpOiBUcnlDYXRjaFJlc3VsdDxUPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG4iLCJmdW5jdGlvbiB1dWlkKCl7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gc2VsZi5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvICYmIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gd2luZG93LmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgY3J5cHRvLnJhbmRvbVVVSURcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwXG4gICAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4XG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJZChwcmVmaXggPSAnJykge1xuICAgIHJldHVybiBwcmVmaXggKyB1dWlkKClcbn0iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuLy8gQHRzLW5vY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTG9nZ2VyU2VydmljZScgXG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuXG4gICAgcHVibGljIGNoaWxkKG9wdGlvbnM6IGFueSk6IExvZ2dlclNlcnZpY2Uge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBjcmVhdGVJZCwgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy9pbmRleC50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuaW50ZXJmYWNlIEVtbWl0dGVySGFuZGxlciB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgICBvcmlnaW5hbExpc3RlbmVyPzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbn1cblxuaW50ZXJmYWNlIE9uT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICB1bmlxdWU/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBPbkRlYm91bmNlT3B0aW9ucyBleHRlbmRzIE9uT3B0aW9ucyB7XG4gICAgZGVib3VuY2U/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlclNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0VtbWl0dGVyU2VydmljZSdcblxuICAgIHByaXZhdGUgaGFuZGxlcnM6IEVtbWl0dGVySGFuZGxlcltdID0gW11cbiAgICBwcml2YXRlIGRlYnVnOiBib29sZWFuXG4gICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIHB1YmxpYyBsb2FkKG9wdGlvbnM/OiBFbW1pdHRlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zPy5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnM/LmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbW1pdHRlciBsb2FkZWQgd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlkID0gb3B0aW9ucz8uaWQgfHwgY3JlYXRlSWQoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy51bmlxdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuaGFuZGxlcnMuc29tZShoID0+IChoLmV2ZW50ID09PSBldmVudCAmJiBoLmxpc3RlbmVyID09PSBsaXN0ZW5lcikgfHwgaC5pZCA9PT0gaWQpXG5cbiAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXI6IEVtbWl0dGVySGFuZGxlciA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKGhhbmRsZXIpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIGFkZGVkJywgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoYXJnczogYW55KSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihhcmdzKVxuXG4gICAgICAgICAgICB0aGlzLm9mZihldmVudCwgd3JhcHBlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCB3cmFwcGVyLCBvcHRpb25zKVxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRGVib3VuY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IGRlYm91bmNlKGxpc3RlbmVyLCBvcHRpb25zPy5kZWJvdW5jZSB8fCAzMDApXG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGRlYm91bmNlZCwgb3B0aW9ucylcblxuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlci5vcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uQW55T2Y8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnRzOiBLW10sIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW11cbiAgICBwdWJsaWMgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IEZ1bmN0aW9uLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBsaXN0ZW5lciBhcyBhbnksIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4ge1xuICAgICAgICAgICAgaWYgKGguZXZlbnQgPT09IGV2ZW50ICYmIChoLmxpc3RlbmVyID09PSBsaXN0ZW5lciB8fCBoLm9yaWdpbmFsTGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciByZW1vdmVkJywgeyBldmVudCB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0cnlDYXRjaC5zeW5jKCgpID0+IGhhbmRsZXIubGlzdGVuZXIoYXJncykpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSkge1xuXG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1pdHRpbmcgZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MpXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0QnlFdmVudChldmVudDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUocGF5bG9hZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiAhaWRzLmluY2x1ZGVzKGguaWQpKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlcnMgcmVtb3ZlZCcsIHsgaWRzIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWxsIGhhbmRsZXJzIGNsZWFyZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0hhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggPiAwXG4gICAgfVxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbnR5cGUgTGlmZWN5Y2xlTWV0aG9kID0gJ3JlZ2lzdGVyJyB8ICdsb2FkJyB8ICdib290JyB8ICdzaHV0ZG93bidcblxuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBleGNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgaG9va3M/OiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMaWZlY3ljbGVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhvb2tzOiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuaG9va3MgPSBkYXRhLmhvb2tzID8/IG5ldyBNYXAoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IGRhdGEub25FcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRXJyb3IoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY29udGV4dCB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBob29rICR7Y29udGV4dC5tZXRob2R9ICgke2NvbnRleHQuaG9va0lkfSk6YCwgZXJyb3IpXG4gICAgfVxuXG4gICAgcHVibGljIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWxsKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLmhvb2tfYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRBbGlhcyA9IGhvb2suaG9va19hbGlhc2VzLmZpbmQoYWxpYXMgPT4gYXJncy5pbmNsdWRlcyhhbGlhcykpXG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Qob3B0aW9ucz86IExpc3RPcHRpb25zKSB7XG4gICAgICAgIGxldCBob29rcyA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhjbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5leGNsdWRlKSA/IG9wdGlvbnMuZXhjbHVkZSA6IFtvcHRpb25zLmV4Y2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gIWlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZSkgPyBvcHRpb25zLmluY2x1ZGUgOiBbb3B0aW9ucy5pbmNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+IGlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MgPSBvcmRlckJ5KGhvb2tzLCBbJ29yZGVyJ10sIFsnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGhvb2tzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCguLi5wYXlsb2FkOiAoTGlmZWN5Y2xlSG9vayB8IENvbnN0cnVjdG9yPExpZmVjeWNsZUhvb2s+KVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2gobmV3IGl0ZW0oKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZXMucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFob29rLmhvb2tfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdTa2lwcGluZyBob29rIHdpdGhvdXQgaG9va19pZDonLCBob29rKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9va3Muc2V0KGhvb2suaG9va19pZCwgaG9vaylcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkICcgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLnN1Ymhvb2tzKSB7XG4gICAgICAgICAgICAgICAgaG9vay5zdWJob29rcy5mb3JFYWNoKHN1Ymhvb2sgPT4gdGhpcy5hZGQoc3ViaG9vaykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5saXN0KG9wdGlvbnMpIFxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZW1pdHRpbmcgJHttZXRob2R9IGZvciBob29rczpgLCB7XG4gICAgICAgICAgICAgICAgaG9va3M6IGhvb2tzLm1hcChob29rID0+IGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5saXN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXI6ICgpID0+IFByb21pc2UuYWxsKFtob29rLnJlZ2lzdGVyKCksIGhvb2sub25SZWdpc3RlcigpXSksXG4gICAgICAgICAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2subG9hZCgpLCBob29rLm9uTG9hZCgpXSksXG4gICAgICAgICAgICAgICAgYm9vdDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suYm9vdCgpLCBob29rLm9uQm9vdCgpXSksXG4gICAgICAgICAgICAgICAgc2h1dGRvd246ICgpID0+IFByb21pc2UuYWxsKFtob29rLnNodXRkb3duKCksIGhvb2sub25TaHV0ZG93bigpXSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBtYXBbbWV0aG9kXSgpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IsIHsgaG9va0lkOiBob29rLmhvb2tfaWQsIG1ldGhvZCB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7bWV0aG9kfSBgICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQocGF5bG9hZDogTGlmZWN5Y2xlTWV0aG9kIHwgTGlmZWN5Y2xlTWV0aG9kW10sIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRNZXRob2QobWV0aG9kLCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdyZWdpc3RlcicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2xvYWQnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBxcyBmcm9tICdxcydcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2Lm51bWJlcigpXSksXG4gICAgdi50cmFuc2Zvcm0oTnVtYmVyKSxcbiAgICB2LmludGVnZXIoKSxcbilcblxuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5ib29sZWFuKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPT09IHRydWUgfHwgdiA9PT0gJ3RydWUnKSxcbilcblxuZXhwb3J0IGNvbnN0IGRhdGUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgaW5zdGFuY2VvZiBEYXRlID8gdiA6IG5ldyBEYXRlKHYpKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPyBmb3JtYXQodiwgJ3l5eXktTU0tZGQnKSA6IHYpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZXRpbWUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHtcbiAgICAgICAgaWYgKCF2KSByZXR1cm4gdlxuXG4gICAgICAgIGlmICh2ID09PSAnbnVsbCcpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdiA9IG5ldyBEYXRlKHYpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0KHYsICd5eXl5LU1NLWRkIEhIOm1tJylcbiAgICB9KSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5ID0gPFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+KHNjaGVtYTogVCA9IHYuYW55KCkgYXMgYW55IGFzIFQpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmFycmF5KHYuc3RyaW5nKCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnNwbGl0KCcsJykpLFxuICAgIHYuYXJyYXkoc2NoZW1hKSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5TnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIGFycmF5KCksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdmFsdWUubWFwKE51bWJlcikpLFxuKVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0ID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHFzLnBhcnNlKHZhbHVlKSA6IHZhbHVlKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHNldChyZXN1bHQsIGtleSwgZ2V0KHZhbHVlLCBrZXkpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0pLFxuKVxuXG4iLCJpbXBvcnQgeyBudW1iZXIsIGFycmF5IH0gZnJvbSAnLi91cmxWYWxpZGF0b3IudHMnXG5pbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblBhcmFtcyB7XG4gICAgbWF4TGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckZpZWxkcz86IHN0cmluZ1tdXG59XG5cblxuZXhwb3J0IGNvbnN0IGJhc2UgPSAob3B0aW9uczogUGFnaW5hdGlvblBhcmFtcyA9IHt9KSA9PiB2Lm9iamVjdCh7XG4gICAgcGFnZTogdi5vcHRpb25hbChudW1iZXIoKSwgMSksXG4gICAgbGltaXQ6IHYub3B0aW9uYWwobnVtYmVyKCksIG9wdGlvbnMubWF4TGltaXQgfHwgMTAwKSxcbiAgICBvcmRlckJ5OiB2Lm9wdGlvbmFsKG9wdGlvbnMub3JkZXJGaWVsZHMgPyBhcnJheSh2LnBpY2tsaXN0KG9wdGlvbnMub3JkZXJGaWVsZHMpKSA6IGFycmF5KHYuc3RyaW5nKCkpLCBbXSksXG4gICAgb3JkZXJEaXJlY3Rpb246IHYub3B0aW9uYWwoYXJyYXkodi51bmlvbihbdi5saXRlcmFsKCdhc2MnKSwgdi5saXRlcmFsKCdkZXNjJyldKSksIFtdKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAnI3NoYXJlZC92YWxpZGF0b3JzL3VybFZhbGlkYXRvci50cydcbmltcG9ydCAqIGFzIHBhZ2luYXRpb24gZnJvbSAnI3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmNvbnN0IGV4dHJhcyA9IHtcbiAgICB1cmwsXG4gICAgcGFnaW5hdGlvbixcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWJvdCA9IHR5cGVvZiB2ICYgeyBleHRyYXM6IHR5cGVvZiBleHRyYXMgfSBcblxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYSA9IHYuQmFzZVNjaGVtYTx1bmtub3duLCB1bmtub3duLCB2LkJhc2VJc3N1ZTx1bmtub3duPj5cbmV4cG9ydCB0eXBlIFZhbGlib3RTY2hlbWFBc3luYyA9IHYuQmFzZVNjaGVtYUFzeW5jPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckNhbGxiYWNrPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPiB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+ID0ge1xuICAgIChfdjogVmFsaWJvdCk6IFRcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yUmVzdWx0PFQgZXh0ZW5kcyB2Lk9iamVjdEVudHJpZXM+ID0gdi5JbmZlck91dHB1dDx2Lk9iamVjdFNjaGVtYTxULCB1bmRlZmluZWQ+PlxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVBheWxvYWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPSBWYWxpYm90U2NoZW1hPiA9IFZhbGlkYXRvckNhbGxiYWNrPFQ+IHwgVFxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVJlc3VsdDxUIGV4dGVuZHMgVmFsaWRhdGVQYXlsb2FkPiA9XG4gICAgVCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPyB2LkluZmVyT3V0cHV0PFQ+IDpcbiAgICBUIGV4dGVuZHMgVmFsaWRhdG9yQ2FsbGJhY2s8aW5mZXIgVT4gPyB2LkluZmVyT3V0cHV0PFU+IDpcbiAgICB1bmtub3duXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdG9yU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVmFsaWRhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyB2OiBWYWxpYm90ID0ge1xuICAgICAgICAuLi52LFxuICAgICAgICBleHRyYXMsXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZTxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4oY2I6IFZhbGlkYXRvckNhbGxiYWNrPFQ+KSB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLnYpXG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0ZVBheWxvYWQ8VD4pIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXQsIGlzc3Vlcywgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZmxhdHRlbiA9IHYuZmxhdHRlbihpc3N1ZXMpXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IFtdIGFzIHN0cmluZ1tdXG5cbiAgICAgICAgICAgIGlmIChmbGF0dGVuLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLmZsYXR0ZW4ucm9vdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ubmVzdGVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZmxhdHRlbi5uZXN0ZWQpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5IGFzIFtzdHJpbmcsIHN0cmluZ1tdXVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4udmFsdWUubWFwKCh2KSA9PiBgJHtrZXl9OiAke3Z9YCkpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzLmxlbmd0aCA/IG1lc3NhZ2VzLmpvaW4oJywgJykgOiAnVmFsaWRhdGlvbiBmYWlsZWQnXG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEJhc2VFeGNlcHRpb24obWVzc2FnZSwgNDIyKVxuXG4gICAgICAgICAgICBlcnJvci5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcidcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBtZXNzYWdlcywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBc3luYzxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYUFzeW5jPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQ+IHwgVCkge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSBhd2FpdCB2LnNhZmVQYXJzZUFzeW5jKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5yb290LFxuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW4ubmVzdGVkLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGRldGFpbHMsIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MgfSA9IHYuc2FmZVBhcnNlKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbn1cblxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uQXNzaWdubWVudCA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHBlcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hPlxuXG5leHBvcnQgY29uc3QgcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgcGVybWlzc2lvbl9pZDogdi5udW1iZXIoKSxcbiAgICBhc3NpZ25hYmxlX3R5cGU6IHYuc3RyaW5nKCksXG4gICAgYXNzaWduYWJsZV9pZDogdi5zdHJpbmcoKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvblNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHBlcm1pc3Npb25TY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgbmFtZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBkZXNjcmlwdGlvbjogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBhY3Rpb246IHYuc3RyaW5nKCksXG4gICAgc3ViamVjdDogdi5zdHJpbmcoKSxcbiAgICBjb25kaXRpb25zOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICBleHBpcmVzX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgVG9rZW4gPSB2LkluZmVyT3V0cHV0PHR5cGVvZiB0b2tlblNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHRva2VuU2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIG5hbWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgdHlwZTogdi5zdHJpbmcoKSxcbiAgICB1c2VyX2lkOiB2Lm51bWJlcigpLFxuICAgIHRva2VuOiB2LnN0cmluZygpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICBleHBpcmVzX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4vQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlbGxFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgICBwdWJsaWMgb3V0cHV0OiBzdHJpbmdcbiAgICBwdWJsaWMgYmluOiBzdHJpbmcgXG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG91dHB1dDogc3RyaW5nLCBiaW46IHN0cmluZywgYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgNTAxKVxuXG4gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0XG4gICAgICAgIHRoaXMuYmluID0gYmluIFxuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIFxuICAgIH1cbn1cbiIsImltcG9ydCBWYWxpZGF0b3JTZXJ2aWNlIGZyb20gXCIuLi9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlXCJcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3JTZXJ2aWNlKClcblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdG9yXG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5pbnRlcmZhY2UgQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMge1xuICAgIHBhcnNlPzogKGRhdGE6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNlRW50aXR5KG9wdGlvbnM6IENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gb3B0aW9ucy5wYXJzZShkYXRhKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG9yaWdpbjogc3RyaW5nXG4gICAgcHVibGljIHN1YmplY3Q6IHN0cmluZ1xuICAgIHB1YmxpYyBhY3Rpb246IHN0cmluZ1xuICAgIHB1YmxpYyBjb25kaXRpb25zOiBzdHJpbmcgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgYW55PiA9IG51bGxcblxuICAgIHB1YmxpYyBnZXQgZWRpdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbiA9PT0gJ2N1c3RvbSdcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhcnNlZENvbmRpdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwganNvbl0gPSB0cnlDYXRjaC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25kaXRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuY29uZGl0aW9ucyBhcyBzdHJpbmcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBlcnJvciA/IHt9IDoganNvblxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZUFiaWxpdHksIHN1YmplY3QgYXMgY3JlYXRlU3ViamVjdCB9IGZyb20gJ0BjYXNsL2FiaWxpdHknXG5pbXBvcnQgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQWNsRW50aXR5J1xuXG4gICAgcHVibGljIGFiaWxpdHk6IFJldHVyblR5cGU8dHlwZW9mIGRlZmluZUFiaWxpdHk+XG4gICAgcHVibGljIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8QWNsRW50aXR5PiA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gZGF0YS5wZXJtaXNzaW9ucyB8fCBbXVxuICAgICAgICBjb25zdCBwZXJtcyA9IHBlcm1pc3Npb25zLm1hcCgocGVybWlzc2lvbikgPT4gUGVybWlzc2lvbi5mcm9tKHBlcm1pc3Npb24pKVxuXG4gICAgICAgIFxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybXNcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpLmNoaWxkKHsgbGFiZWw6ICdhY2wnIH0pXG4gICAgICAgIFxuICAgICAgICB0aGlzLmFiaWxpdHkgPSBkZWZpbmVBYmlsaXR5KChjYW4pID0+IHtcbiAgICAgICAgICAgIHBlcm1zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICBjYW4ocGVybWlzc2lvbi5hY3Rpb24sIHBlcm1pc3Npb24uc3ViamVjdCwgcGVybWlzc2lvbi5wYXJzZWRDb25kaXRpb25zKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMucGVybWlzc2lvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNhbihhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgY2Fubm90KGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3ViamVjdChzdWJqZWN0OiBzdHJpbmcsIG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG4gICAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb29raWVNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBjb29raWVzPzogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0Nvb2tpZU1hcEVudGl0eSdcblxuICAgIHB1YmxpYyBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHByZWZpeDogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogQ29va2llTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvb2tpZXMgPSBkYXRhPy5jb29raWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5wcmVmaXggPSBkYXRhPy5wcmVmaXggfHwgJydcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgTWFwPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBpZiAoY29va2llcyBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQoZnVsbE5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZSB3YW50IHRvIGFsbG93IGFueSBvcHRpb25zIHRvIGJlIHBhc3NlZCBoZXJlLCBhcyB0aGV5IG1heSBiZSB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIGNvb2tpZVxuICAgIC8vICBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICB0aGlzLmNvb2tpZXMuc2V0KGZ1bGxOYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5jb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMucHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRLZXkgPSBrZXkuc2xpY2UodGhpcy5wcmVmaXgubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0W3VucHJlZml4ZWRLZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUVudHJ5IHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHBhdGg6IHN0cmluZ1xuICAgIHB1YmxpYyB0eXBlOiAnZmlsZScgfCAnZGlyZWN0b3J5J1xuICAgIHB1YmxpYyBtZXRhczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBEcml2ZUVudHJ5KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTb2Z0RGVsZXRlTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBkZWxldGVkX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBUaW1lc3RhbXBNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGNyZWF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICAgICAgcHVibGljIHVwZGF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICB9XG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZUVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBkcml2ZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWV0eXBlOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIGNsaWVudF9uYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZmlsZW5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwdWJsaWM6IGJvb2xlYW5cblxuICAgIC8vIGR5bmFtaWNcbiAgICBwdWJsaWMgdXJsPzogc3RyaW5nXG4gICAgcHVibGljIG1ldGFzPzogUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgcHVibGljIGlzSW1hZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWV0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpXG4gICAgfVxufVxuIiwiaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZFNlc3Npb24gZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIHB1cnBvc2U6IHN0cmluZ1xuICAgIHB1YmxpYyBtaW1lX3R5cGVzOiBzdHJpbmdcbiAgICBwdWJsaWMgbWF4X3NpemU6IG51bWJlclxuXG4gICAgLy8gZHluYW1pYyBcbiAgICBwdWJsaWMgdXBsb2FkX3VybD86IHN0cmluZ1xuICAgIHB1YmxpYyBjcmVhdGVfZmlsZV91cmw/OiBzdHJpbmdcblxuICAgIHB1YmxpYyBnZXRQYXJzZWRNaW1lVHlwZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW1lX3R5cGVzLnNwbGl0KCcsJykubWFwKHR5cGUgPT4gdHlwZS50cmltKCkpXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWxsb3dlZE1pbWVUeXBlKG1pbWVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gdGhpcy5nZXRQYXJzZWRNaW1lVHlwZXMoKVxuICAgICAgICByZXR1cm4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKG1pbWVUeXBlKSB8fCBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoJyovKicpXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWxsb3dlZFNpemUoc2l6ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzaXplIDw9IHRoaXMubWF4X3NpemVcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVIb29rIHtcbiAgICBwdWJsaWMgaG9va19pZDogc3RyaW5nXG4gICAgcHVibGljIGhvb2tfYWxpYXNlcz86IHN0cmluZ1tdXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIHN1Ymhvb2tzPzogTGlmZWN5Y2xlSG9va1tdXG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHJlZ2lzdGVyICovXG4gICAgcHVibGljIGFzeW5jIG9uUmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGxvYWQgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Mb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBib290ICovXG4gICAgcHVibGljIGFzeW5jIG9uQm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Ugc2h1dGRvd24gKi9cbiAgICBwdWJsaWMgYXN5bmMgb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG59XG4iLCJpbXBvcnQgdHlwZSBNb2R1bGVNYW5pZmVzdCBmcm9tICcuL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzJ1xuaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSwgbWl4aW4gfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmludGVyZmFjZSBNb2R1bGVVcGdyYWRlSW5mbyB7XG4gICAgc291cmNlOiAnZ2l0JyB8ICd6aXAnXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgbWl4aW4oTGlmZWN5Y2xlSG9vaykpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgcHVibGljIGJ1aWxkOiBNb2R1bGVNYW5pZmVzdFsnYnVpbGQnXSA9IHt9XG4gICAgcHVibGljIGRpcmVjdG9yeTogc3RyaW5nXG5cbiAgICBwdWJsaWMgdXBncmFkZV9pbmZvPzogTW9kdWxlVXBncmFkZUluZm9cblxuICAgIHB1YmxpYyBzZXREYXRhKGRhdGE6IFBhcnRpYWw8TW9kdWxlIHwgTW9kdWxlTWFuaWZlc3Q+KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICApXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBmaWx0ZXJlZClcblxuICAgICAgICB0aGlzLmhvb2tfaWQgPSBgbW9kdWxlOiR7dGhpcy5pZH1gXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0IHtcbiAgICBmcm9tOiBzdHJpbmdcbiAgICB0bz86IHN0cmluZ1xuICAgIHR5cGU6ICdnbG9iYWxfaW1wb3J0J1xufVxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdEJ1aWxkIHtcbiAgICBpbXBvcnRzPzogTW9kdWxlTWFuaWZlc3RCdWlsZEltcG9ydFtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZU1hbmlmZXN0IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG4gICAgcHVibGljIGF1dGhvcj86IHN0cmluZ1xuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIGJ1aWxkPzogTW9kdWxlTWFuaWZlc3RCdWlsZFxuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvbGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbn1cbiIsImltcG9ydCB0eXBlIFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGVtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHVzZXJuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbFxuXG4gICAgcHVibGljIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdXG4gICAgcHVibGljIHJvbGVzPzogUm9sZVtdXG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxzKCl7XG4gICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIHNlY29uZE5hbWVdID0gdGhpcy5uYW1lLnNwbGl0KCcgJylcblxuICAgICAgICBpZiAoIXNlY29uZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IGIgPSBzZWNvbmROYW1lWzBdLnRvVXBwZXJDYXNlKClcblxuICAgICAgICByZXR1cm4gYSArIGJcbiAgICB9XG59XG4iLCJpbXBvcnQgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJ0aXNhbldyYXBwZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgcHJvY2VzczogY3AuQ2hpbGRQcm9jZXNzIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGFwcEJhc2VQYXRoOiBzdHJpbmc7XG4gICAgcHVibGljIGVudiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdID0gW107XG4gICAgcHVibGljIGNvbmZpZ0FyZ3VtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgcHVibGljIGNvbmZpZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBsb2dnZXIgPSBuZXcgTG9nZ2VyU2VydmljZSgpO1xuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXJ0aXNhbldyYXBwZXJTZXJ2aWNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEJhc2VQYXRoKHBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmFwcEJhc2VQYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb25maWdBcmd1bWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbmZpZ0FyZ3VtZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb25maWdGaWxlKC4uLmZpbGVQYXRoczogc3RyaW5nW10pIHtcbiAgICAgICAgdGhpcy5jb25maWdGaWxlcy5wdXNoKC4uLmZpbGVQYXRocyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFbnYoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5lbnYuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENvbmZpZ0FyZ3VtZW50cygpIHtcbiAgICAgICAgY29uc3QgY29uZmlnQXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKS5maWx0ZXIoYXJnID0+IGFyZy5zdGFydHNXaXRoKCdAY29uZmlnOicpKVxuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29uZmlnQXJncykge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnkuc2xpY2UoJ0Bjb25maWc6Jy5sZW5ndGgpLnNwbGl0KCc9JykubWFwKHMgPT4gcy50cmltKCkpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ0FyZ3VtZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENvbmZpZ0ZpbGVzKCkge1xuICAgICAgICBjb25zdCBjb25maWdGaWxlQXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKVxuICAgICAgICAgICAgLmZpbHRlcihhcmcgPT4gYXJnLnN0YXJ0c1dpdGgoJ0Bjb25maWctZmlsZTonKSlcbiAgICAgICAgICAgIC5tYXAoYXJnID0+IGFyZy5zbGljZSgnQGNvbmZpZy1maWxlOicubGVuZ3RoKSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb25maWdGaWxlKC4uLmNvbmZpZ0ZpbGVBcmdzKTtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQ09ORklHX0ZJTEVTKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZGaWxlcyA9IHByb2Nlc3MuZW52LkNPTkZJR19GSUxFUy5zcGxpdCgnLCcpLm1hcChmID0+IGYudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkQ29uZmlnRmlsZSguLi5lbnZGaWxlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEVudmlyb25tZW50KCkge1xuICAgICAgICBjb25zdCBjb25maWdBcmd1bWVudHMgPSBBcnJheS5mcm9tKHRoaXMuY29uZmlnQXJndW1lbnRzLmVudHJpZXMoKSlcbiAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3ZhbHVlfWApLmpvaW4oJzsnKTtcblxuICAgICAgICB0aGlzLmFkZEVudignWkVOSVRIX0NPTkZJR19BUkdVTUVOVFMnLCBjb25maWdBcmd1bWVudHMpOyBcbiAgICAgICAgdGhpcy5hZGRFbnYoJ1pFTklUSF9DT05GSUdfRklMRVMnLCB0aGlzLmNvbmZpZ0ZpbGVzLmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRBcmd1bWVudHMoYXJnczogc3RyaW5nW10gPSBbXSkge1xuICAgICAgICBjb25zdCBuYW1lc3BhY2VzID0gWydAY29uZmlnOicsICdAY29uZmlnLWZpbGU6J107XG5cbiAgICAgICAgY29uc3QgZm9yd2FyZEFyZ3MgPSBhcmdzLmZpbHRlcihhcmcgPT4gIW5hbWVzcGFjZXMuc29tZShucyA9PiBhcmcuc3RhcnRzV2l0aChucykpKTtcblxuICAgICAgICB0aGlzLmFyZ3MgPSBbXG4gICAgICAgICAgICAnLS1uby13YXJuaW5ncycsXG4gICAgICAgICAgICAnLS1leHBlcmltZW50YWwtc3RyaXAtdHlwZXMnLFxuICAgICAgICAgICAgJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLmFwcEJhc2VQYXRoLCAnc2VydmVyJywgJ2NsaS50cycpLFxuICAgICAgICAgICAgLi4uZm9yd2FyZEFyZ3MsXG4gICAgICAgIF07XG5cbiAgICB9XG5cbiAgICBwdWJsaWMga2lsbChjb2RlOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3MgJiYgIXRoaXMucHJvY2Vzcy5raWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzcy5raWxsKCdTSUdURVJNJyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLmV4aXQoY29kZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJ1bihhcmdzPzogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKCF0aGlzLmFwcEJhc2VQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jhc2UgcGF0aCBub3Qgc2V0LiBQbGVhc2UgY2FsbCBzZXRCYXNlUGF0aCgpIGJlZm9yZSBydW4oKS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZENvbmZpZ0FyZ3VtZW50cygpO1xuICAgICAgICB0aGlzLmxvYWRDb25maWdGaWxlcygpO1xuICAgICAgICB0aGlzLmxvYWRBcmd1bWVudHMoYXJncyB8fCBwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpO1xuXG4gICAgICAgIHRoaXMubG9hZEVudmlyb25tZW50KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdydW4nLCB7XG4gICAgICAgICAgICAgICAgYXJnczogdGhpcy5hcmdzLFxuICAgICAgICAgICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzID0gY3Auc3Bhd24oJ25vZGUnLCB0aGlzLmFyZ3MsIHtcbiAgICAgICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICAgICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXModGhpcy5lbnYuZW50cmllcygpKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4gdGhpcy5raWxsKCkpO1xuICAgICAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4gdGhpcy5raWxsKCkpO1xuICAgICAgICBwcm9jZXNzLm9uKCdleGl0JywgKCkgPT4gdGhpcy5raWxsKCkpO1xuICAgIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5cbmNvbnN0IEJBU0VfUEFUSCA9IHByb2Nlc3MuZW52LlpFTklUSF9CQVNFX1BBVEhcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VQYXRoKC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBpZiAoIUJBU0VfUEFUSCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pFTklUSF9CQVNFX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShCQVNFX1BBVEgsIC4uLmFyZ3MpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZVRvQmFzZVBhdGgoLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGlmICghQkFTRV9QQVRIKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWkVOSVRIX0JBU0VfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0JylcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoLnJlc29sdmUoQkFTRV9QQVRILCAuLi5hcmdzKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRtcFBhdGgoLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBiYXNlUGF0aCgndG1wJywgLi4uYXJncylcbn1cbiIsIlxuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB7IGJhc2VQYXRoIH0gZnJvbSAnI3NlcnZlci91dGlscy9iYXNlUGF0aC50cydcbmltcG9ydCBDb25maWdTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuaW50ZXJmYWNlIEluaXRpT3B0aW9ucyB7XG4gICAgZGlyZWN0b3J5Pzogc3RyaW5nXG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdGU1NlcnZpY2UgZXh0ZW5kcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEluaXRpT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gZmFsc2VcbiAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBvcHRpb25zLmRpcmVjdG9yeSA/PyBiYXNlUGF0aCgnY29uZmlnJylcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBuZXcgTG9nZ2VyU2VydmljZSgpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdzZXJ2aWNlIGluaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKVxuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmRpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGNvbmZpZyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIGNyZWF0aW5nOiAke3RoaXMuZGlyZWN0b3J5fWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLmRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aGlzLmRpcmVjdG9yeSlcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIWZpbGVuYW1lLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGZpbGVuYW1lKVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIGpzb25dID0gYXdhaXQgdHJ5Q2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JylcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYGZhaWxlZCB0byBsb2FkIGNvbmZpZyBmaWxlICR7ZmlsZW5hbWV9YCwgZXJyb3IpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3Qga2V5ID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgJy5qc29uJylcblxuICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwganNvbiwgJ2ZpbGVzeXN0ZW0nKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBsb2FkZWQgY29uZmlnIGZpbGU6ICR7ZmlsZW5hbWV9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY29uZmlnIGxvYWRlZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VLZXkoZnVsbEtleTogc3RyaW5nKTogeyBmaWxlbmFtZTogc3RyaW5nOyBrZXk6IHN0cmluZyB9IHtcbiAgICAgICAgY29uc3QgW2ZpbGVuYW1lLCAuLi5yZXN0XSA9IGZ1bGxLZXkuc3BsaXQoJy4nKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIGtleTogcmVzdC5qb2luKCcuJykgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGZ1bGxLZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ2ZpbGVzeXN0ZW0nKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLnNldChmdWxsS2V5LCB2YWx1ZSwgc291cmNlKVxuXG4gICAgICAgIGlmIChzb3VyY2UgIT09ICdmaWxlc3lzdGVtJykge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGZpbGVuYW1lLCBrZXkgfSA9IHRoaXMucGFyc2VLZXkoZnVsbEtleSlcbiAgICAgICAgXG4gICAgICAgIGxldCB2YWx1ZXMgPSB0aGlzLmdldChmaWxlbmFtZSlcblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgJiYgdmFsdWVzKSB7XG4gICAgICAgICAgICBzZXQodmFsdWVzLCBrZXksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgYCR7ZmlsZW5hbWV9Lmpzb25gKVxuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeSh2YWx1ZXMsIG51bGwsIDQpKVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChmdWxsS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBmaWxlbmFtZSwga2V5IH0gPSB0aGlzLnBhcnNlS2V5KGZ1bGxLZXkpXG4gICAgICAgIFxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldChmaWxlbmFtZSlcblxuICAgICAgICBzZXQodmFsdWVzLCBrZXksIHVuZGVmaW5lZClcblxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgYCR7ZmlsZW5hbWV9Lmpzb25gKVxuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeSh2YWx1ZXMsIG51bGwsIDQpKVxuXG4gICAgICAgIHN1cGVyLnVuc2V0KGZ1bGxLZXkpXG5cbiAgICB9XG59XG4iLCJpbXBvcnQgbXMgZnJvbSAnbXMnXG5pbXBvcnQgdHlwZSBEcml2ZUVudHJ5IGZyb20gJyNzaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cydcblxuZXhwb3J0IGludGVyZmFjZSBVcmxPcHRpb25zIHtcbiAgICBleHBpcmVzPzogbXMuU3RyaW5nVmFsdWU7IC8vIG1zIGZvcm1hdCwgZS5nLiAnMWgnLCAnMzBtJywgJzE1cydcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRVcmxPcHRpb25zIHtcbiAgICBleHBpcmVzPzogbXMuU3RyaW5nVmFsdWU7IC8vIG1zIGZvcm1hdCwgZS5nLiAnMWgnLCAnMzBtJywgJzE1cydcbiAgICBtaW1lX3R5cGVzPzogc3RyaW5nW107XG4gICAgbWF4X3NpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlQmFzZUdhdGV3YXkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIHB1YmxpYyBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGljazxEcml2ZUJhc2VHYXRld2F5LCAnaWQnIHwgJ25hbWUnIHwgJ2Rlc2NyaXB0aW9uJyB8ICdjb25maWcnPikge1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5pZFxuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWVcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb25cbiAgICAgICAgdGhpcy5jb25maWcgPSBkYXRhLmNvbmZpZ1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KGZvbGRlcj86IHN0cmluZyk6IFByb21pc2U8RHJpdmVFbnRyeVtdPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmb2xkZXIgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgICBwdWJsaWMgZmluZChmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxEcml2ZUVudHJ5PiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIGV4aXN0cyhmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZmlsZW5hbWUgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE5vZGVKUy5SZWFkYWJsZVN0cmVhbT4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZmlsZW5hbWUgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZShmaWxlbmFtZTogc3RyaW5nLCBkYXRhOiBVaW50OEFycmF5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgZGF0YSBcbiAgICAgICAgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN0cmVhbShmaWxlbmFtZTogc3RyaW5nLCBzdHJlYW06IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgXG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIHN0cmVhbSBcbiAgICAgICAgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZmlsZW5hbWUgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB1cmwoZmlsZW5hbWU6IHN0cmluZywgb3B0aW9ucz86IFVybE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgXG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnMgXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBsb2FkVXJsKGZpbGVuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBVcGxvYWRVcmxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IFxuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICBvcHRpb25zIFxuICAgICAgICB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICAgIFxufVxuIiwiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAncGF0aCdcbmltcG9ydCBtcyBmcm9tICdtcydcbmltcG9ydCB7XG4gICAgUzNDbGllbnQsXG4gICAgTGlzdE9iamVjdHNWMkNvbW1hbmQsXG4gICAgR2V0T2JqZWN0Q29tbWFuZCxcbiAgICBQdXRPYmplY3RDb21tYW5kLFxuICAgIERlbGV0ZU9iamVjdENvbW1hbmQsXG4gICAgRGVsZXRlT2JqZWN0c0NvbW1hbmQsXG4gICAgSGVhZE9iamVjdENvbW1hbmQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMydcbmltcG9ydCB7IGdldFNpZ25lZFVybCB9IGZyb20gJ0Bhd3Mtc2RrL3MzLXJlcXVlc3QtcHJlc2lnbmVyJ1xuaW1wb3J0IHsgVXBsb2FkIH0gZnJvbSAnQGF3cy1zZGsvbGliLXN0b3JhZ2UnXG5pbXBvcnQgdHlwZSB7IEluZmVyT3V0cHV0IH0gZnJvbSAndmFsaWJvdCdcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUnXG5pbXBvcnQgRHJpdmVFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Ecml2ZUVudHJ5RW50aXR5LnRzJ1xuaW1wb3J0IEJhc2VEcml2ZSBmcm9tICcjc2VydmVyL2dhdGV3YXlzL0RyaXZlQmFzZUdhdGV3YXkudHMnXG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJyNzaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuY29uc3Qgc2NoZW1hID0gdmFsaWRhdG9yLmNyZWF0ZSgodikgPT4gdi5vYmplY3Qoe1xuICAgIGJ1Y2tldDogdi5waXBlKHYuc3RyaW5nKCksIHYubWluTGVuZ3RoKDEpKSxcbiAgICByZWdpb246IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgYWNjZXNzS2V5SWQ6IHYucGlwZSh2LnN0cmluZygpLCB2Lm1pbkxlbmd0aCgxKSksXG4gICAgc2VjcmV0QWNjZXNzS2V5OiB2LnBpcGUodi5zdHJpbmcoKSwgdi5taW5MZW5ndGgoMSkpLFxuICAgIHNlc3Npb25Ub2tlbjogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBlbmRwb2ludDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBwcmVmaXg6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG59KSlcblxuZXhwb3J0IHR5cGUgUzNEcml2ZUNvbmZpZyA9IEluZmVyT3V0cHV0PHR5cGVvZiBzY2hlbWE+XG5cbmZ1bmN0aW9uIHN0cmVhbVRvVWludDhBcnJheShzdHJlYW06IGFueSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGlmICghc3RyZWFtIHx8IHR5cGVvZiBzdHJlYW0gIT09ICdvYmplY3QnIHx8IHR5cGVvZiBzdHJlYW0ub24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgVWludDhBcnJheSgpKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXVxuICAgICAgICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bms6IEJ1ZmZlcikgPT4gY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKSlcbiAgICAgICAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiByZXNvbHZlKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5jb25jYXQoY2h1bmtzKSkpKVxuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KVxuICAgIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlUzMgZXh0ZW5kcyBCYXNlRHJpdmUge1xuICAgIHByaXZhdGUgc2NoZW1hID0gc2NoZW1hXG5cbiAgICBwcml2YXRlIF9jbGllbnQ/OiBTM0NsaWVudFxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGljazxCYXNlRHJpdmUsICdpZCcgfCAnbmFtZScgfCAnZGVzY3JpcHRpb24nIHwgJ2NvbmZpZyc+KSB7XG4gICAgICAgIHN1cGVyKGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKHRoaXMuY29uZmlnLCB0aGlzLnNjaGVtYSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrVmFsaWQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJHQoJ0ludmFsaWQgZHJpdmUgY29uZmlndXJhdGlvbicpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBidWNrZXQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbmZpZyBhcyBTM0RyaXZlQ29uZmlnKS5idWNrZXRcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IHByZWZpeCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnPy5wcmVmaXgpIHJldHVybiAnJ1xuXG4gICAgICAgIGlmICghdGhpcy5jb25maWc/LnByZWZpeC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcucHJlZml4ICsgJy8nXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcucHJlZml4XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGNsZWFuRmlsZW5hbWUgPSBmaWxlbmFtZS5zdGFydHNXaXRoKCcvJykgPyBmaWxlbmFtZS5zbGljZSgxKSA6IGZpbGVuYW1lXG4gICAgICAgIGlmICghdGhpcy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGVhbkZpbGVuYW1lXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xlYW5QcmVmaXggPSB0aGlzLnByZWZpeC5lbmRzV2l0aCgnLycpID8gdGhpcy5wcmVmaXggOiBgJHt0aGlzLnByZWZpeH0vYFxuICAgICAgICByZXR1cm4gYCR7Y2xlYW5QcmVmaXh9JHtjbGVhbkZpbGVuYW1lfWBcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGNsaWVudCgpOiBTM0NsaWVudCB7XG4gICAgICAgIGlmICh0aGlzLl9jbGllbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnIGFzIFMzRHJpdmVDb25maWdcblxuICAgICAgICB0aGlzLl9jbGllbnQgPSBuZXcgUzNDbGllbnQoe1xuICAgICAgICAgICAgcmVnaW9uOiBjb25maWcucmVnaW9uLFxuICAgICAgICAgICAgZW5kcG9pbnQ6IGNvbmZpZy5lbmRwb2ludCxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IGNvbmZpZy5hY2Nlc3NLZXlJZCxcbiAgICAgICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IGNvbmZpZy5zZWNyZXRBY2Nlc3NLZXksXG4gICAgICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBjb25maWcuc2Vzc2lvblRva2VuLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhpc3RzOiBCYXNlRHJpdmVbJ2V4aXN0cyddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmQobmV3IEhlYWRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBLZXlcbiAgICAgICAgfSkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0OiBCYXNlRHJpdmVbJ2xpc3QnXSA9IGFzeW5jIChmb2xkZXIpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBsZXQgUHJlZml4ID0gZm9sZGVyID8gdGhpcy5nZXRLZXkoZm9sZGVyKSA6IHRoaXMucHJlZml4IHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIGlmIChQcmVmaXggJiYgIVByZWZpeC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICBQcmVmaXggKz0gJy8nXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tYW5kID0gbmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBQcmVmaXgsXG4gICAgICAgICAgICBEZWxpbWl0ZXI6ICcvJyxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChjb21tYW5kKVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXM6IERyaXZlRW50aXR5W10gPSBbXVxuXG4gICAgICAgIGNvbnN0IGNvbW1vblByZWZpeGVzID0gcmVzcC5Db21tb25QcmVmaXhlcyB8fCBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgcHJlZml4IG9mIGNvbW1vblByZWZpeGVzKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gcHJlZml4LlByZWZpeCB8fCAnJ1xuXG4gICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSh0aGlzLnByZWZpeCwgJycpXG5cbiAgICAgICAgICAgIGlmIChrZXkuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIGtleSA9IGtleS5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgRHJpdmVFbnRpdHkoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGtleS5zcGxpdCgnLycpLnBvcCgpIHx8IGtleSxcbiAgICAgICAgICAgICAgICBwYXRoOiAnLycgKyBrZXksXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RpcmVjdG9yeScsXG4gICAgICAgICAgICAgICAgbWV0YXM6IHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogMCxcbiAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6ICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yeSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50cyA9IHJlc3AuQ29udGVudHMgfHwgW11cblxuICAgICAgICBmb3IgKGNvbnN0IG9iaiBvZiBjb250ZW50cykge1xuICAgICAgICAgICAgbGV0IGtleSA9IG9iai5LZXkgfHwgJydcblxuICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UodGhpcy5wcmVmaXgsICcnKVxuXG4gICAgICAgICAgICBpZiAoa2V5LmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBEcml2ZUVudGl0eSh7XG4gICAgICAgICAgICAgICAgbmFtZToga2V5LnNwbGl0KCcvJykucG9wKCkgfHwga2V5LFxuICAgICAgICAgICAgICAgIHBhdGg6ICcvJyArIGtleSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgICAgICAgICAgbWV0YXM6IHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogb2JqLlNpemUsXG4gICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBtaW1lLmdldFR5cGUoa2V5KSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgfVxuXG4gICAgcHVibGljIGZpbmQ6IEJhc2VEcml2ZVsnZmluZCddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSBmaWxlbmFtZS5zdGFydHNXaXRoKCcvJykgPyBmaWxlbmFtZSA6ICcvJyArIGZpbGVuYW1lXG4gICAgICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoZmlsZXBhdGgpXG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMubGlzdChmb2xkZXIpXG5cbiAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmZpbmQoZSA9PiBlLnBhdGggPT09IGZpbGVwYXRoKVxuXG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZmlsZXBhdGh9XCIgbm90IGZvdW5kYClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBta2RpcihfZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIC8vIFMzIGlzIG9iamVjdCBzdG9yYWdlOyBkaXJlY3RvcmllcyBhcmUgaW1wbGljaXQuIENyZWF0ZSBhIHplcm8tYnl0ZSBvYmplY3Qgd2l0aCB0cmFpbGluZyBzbGFzaCB0byBlbXVsYXRlIGRpcmVjdG9yeSBpZiBuZWVkZWQuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkOiBCYXNlRHJpdmVbJ3JlYWQnXSA9IGFzeW5jIChmaWxlbmFtZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGNvbnN0IEtleSA9IHRoaXMuZ2V0S2V5KGZpbGVuYW1lKVxuXG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBHZXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBLZXlcbiAgICAgICAgfSkpXG5cbiAgICAgICAgY29uc3QgYm9keSA9IHJlc3AuQm9keSBhcyBSZWFkYWJsZVxuXG4gICAgICAgIHJldHVybiBzdHJlYW1Ub1VpbnQ4QXJyYXkoYm9keSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVhZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IG5ldyBHZXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBLZXlcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChjb21tYW5kKVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZXNwLkJvZHkgYXMgYW55XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShib2R5KVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZTogQmFzZURyaXZlWyd3cml0ZSddID0gYXN5bmMgKGZpbGVuYW1lLCBkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgUHV0T2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgS2V5LFxuICAgICAgICAgICAgQm9keTogQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgICAgfSkpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdyaXRlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgY29uc3QgdXBsb2FkID0gbmV3IFVwbG9hZCh7XG4gICAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgICAgICBLZXksXG4gICAgICAgICAgICAgICAgQm9keTogUmVhZGFibGUuZnJvbShzdHJlYW0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCB1cGxvYWQuZG9uZSgpXG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZTogQmFzZURyaXZlWydkZWxldGUnXSA9IGFzeW5jIChmaWxlbmFtZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGNvbnN0IEtleSA9IHRoaXMuZ2V0S2V5KGZpbGVuYW1lKVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy5maW5kKGZpbGVuYW1lKVxuXG4gICAgICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgRGVsZXRlT2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgICAgICBLZXlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoY29tbWFuZClcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuXG4gICAgICAgIGNvbnN0IGxpc3RSZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBQcmVmaXg6IEtleVxuICAgICAgICB9KSlcblxuICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IChsaXN0UmVzcG9uc2UuQ29udGVudHMgfHwgW10pLm1hcChjID0+ICh7IEtleTogYy5LZXkgfSkpXG5cbiAgICAgICAgaWYgKHRvRGVsZXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBEZWxldGVPYmplY3RzQ29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgRGVsZXRlOiB7IE9iamVjdHM6IHRvRGVsZXRlIH1cbiAgICAgICAgfSkpXG5cbiAgICAgICAgaWYgKGxpc3RSZXNwb25zZS5Jc1RydW5jYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGUoZmlsZW5hbWUpIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBpZiB0aGVyZSBhcmUgbW9yZSBvYmplY3RzIHRvIGRlbGV0ZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVyblxuXG4gICAgfVxuXG4gICAgcHVibGljIHVybDogQmFzZURyaXZlWyd1cmwnXSA9IGFzeW5jIChmaWxlbmFtZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGNvbnN0IEtleSA9IHRoaXMuZ2V0S2V5KGZpbGVuYW1lKVxuXG4gICAgICAgIGNvbnN0IGV4cGlyZXNNcyA9IG1zKG9wdGlvbnM/LmV4cGlyZXMgfHwgJzMwbScpIHx8IDMwICogNjAgKiAxMDAwXG4gICAgICAgIGNvbnN0IGV4cGlyZXNTZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChleHBpcmVzTXMgLyAxMDAwKSlcblxuICAgICAgICByZXR1cm4gZ2V0U2lnbmVkVXJsKHRoaXMuY2xpZW50LCBuZXcgR2V0T2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgS2V5XG4gICAgICAgIH0pLCB7IGV4cGlyZXNJbjogZXhwaXJlc1NlY29uZHMgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBsb2FkVXJsOiBCYXNlRHJpdmVbJ3VwbG9hZFVybCddID0gYXN5bmMgKGZpbGVuYW1lLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgY29uc3QgZXhwaXJlc01zID0gbXMob3B0aW9ucz8uZXhwaXJlcyB8fCAnMzBtJykgfHwgMzAgKiA2MCAqIDEwMDBcbiAgICAgICAgY29uc3QgZXhwaXJlc1NlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGV4cGlyZXNNcyAvIDEwMDApKVxuXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgUHV0T2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgS2V5LFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBnZXRTaWduZWRVcmwodGhpcy5jbGllbnQsIGNvbW1hbmQsIHsgZXhwaXJlc0luOiBleHBpcmVzU2Vjb25kcyB9KVxuICAgIH1cbn1cbiIsImltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCBDb25maWdTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCBTM0RyaXZlIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVTM0dhdGV3YXkudHMnXG5pbXBvcnQgdHlwZSB7IFMzRHJpdmVDb25maWcgfSBmcm9tICcjc2VydmVyL2dhdGV3YXlzL0RyaXZlUzNHYXRld2F5LnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuXG5pbnRlcmZhY2UgSW5pdGlPcHRpb25zIGV4dGVuZHMgT21pdDxTM0RyaXZlQ29uZmlnLCAnbmFtZScgfCAnZGVzY3JpcHRpb24nPiB7XG4gICAgcHJlZml4Pzogc3RyaW5nXG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdTM1NlcnZpY2UgZXh0ZW5kcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgcHJlZml4ID0gJydcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcbiAgICBwdWJsaWMgZHJpdmU6IFMzRHJpdmVcbiAgICBwdWJsaWMgYnVja2V0OiBzdHJpbmdcbiAgICBwdWJsaWMgcmVnaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5kcG9pbnQ/OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEluaXRpT3B0aW9ucykge1xuICAgICAgICBzdXBlcigpXG5cbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gZmFsc2VcbiAgICAgICAgdGhpcy5wcmVmaXggPSBvcHRpb25zLnByZWZpeCA/PyAnJ1xuICAgICAgICB0aGlzLmJ1Y2tldCA9IG9wdGlvbnMuYnVja2V0XG4gICAgICAgIHRoaXMucmVnaW9uID0gb3B0aW9ucy5yZWdpb24gfHwgJydcbiAgICAgICAgdGhpcy5lbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnRcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBuZXcgTG9nZ2VyU2VydmljZSgpXG5cbiAgICAgICAgdGhpcy5kcml2ZSA9IG5ldyBTM0RyaXZlKHtcbiAgICAgICAgICAgIGlkOiAnY29uZmlnLXMzJyxcbiAgICAgICAgICAgIG5hbWU6ICdjb25maWctczMnLFxuICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgYnVja2V0OiBvcHRpb25zLmJ1Y2tldCxcbiAgICAgICAgICAgICAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgICAgICAgICAgICAgIGFjY2Vzc0tleUlkOiBvcHRpb25zLmFjY2Vzc0tleUlkLFxuICAgICAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleTogb3B0aW9ucy5zZWNyZXRBY2Nlc3NLZXksXG4gICAgICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBvcHRpb25zLnNlc3Npb25Ub2tlbixcbiAgICAgICAgICAgICAgICBlbmRwb2ludDogb3B0aW9ucy5lbmRwb2ludCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3NlcnZpY2UgaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlS2V5KGZ1bGxLZXk6IHN0cmluZyk6IHsgZmlsZW5hbWU6IHN0cmluZzsga2V5OiBzdHJpbmcgfSB7XG4gICAgICAgIGNvbnN0IFtmaWxlbmFtZSwgLi4ucmVzdF0gPSBmdWxsS2V5LnNwbGl0KCcuJylcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICBrZXk6IHJlc3Quam9pbignLicpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpXG5cbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5wcmVmaXgucmVwbGFjZSgvXlxcL3xcXC8kL2csICcnKVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmRyaXZlLmxpc3QocHJlZml4IHx8IHVuZGVmaW5lZClcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gZW50cnkubmFtZVxuXG4gICAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHByZWZpeCA/IGAke3ByZWZpeH0vJHtmaWxlbmFtZX1gIDogZmlsZW5hbWVcblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yLCBkYXRhXSA9IGF3YWl0IHRyeUNhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSBhd2FpdCB0aGlzLmRyaXZlLnJlYWQoZmlsZXBhdGgpXG5cbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gQnVmZmVyLmZyb20oYnVmKS50b1N0cmluZygndXRmLTgnKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBmYWlsZWQgdG8gbG9hZCBjb25maWcgZmlsZSAke2ZpbGVuYW1lfWAsIGVycm9yKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgJycpXG5cbiAgICAgICAgICAgIHN1cGVyLnNldChrZXksIGRhdGEpXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxvYWRlZCBjb25maWcgZmlsZTogJHtmaWxlbmFtZX1gKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdjb25maWcgbG9hZGVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldChmdWxsS2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHNvdXJjZSA9ICdzMycpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIuc2V0KGZ1bGxLZXksIHZhbHVlLCBzb3VyY2UpXG5cbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gJ3MzJykge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGZpbGVuYW1lLCBrZXkgfSA9IHRoaXMucGFyc2VLZXkoZnVsbEtleSlcblxuICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5nZXQoZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ICYmIHZhbHVlcykge1xuICAgICAgICAgICAgc2V0KHZhbHVlcywga2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsZWFuUHJlZml4ID0gdGhpcy5wcmVmaXgucmVwbGFjZSgvXlxcL3xcXC8kL2csICcnKVxuXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gY2xlYW5QcmVmaXggPyBgJHtjbGVhblByZWZpeH0vJHtmaWxlbmFtZX0uanNvbmAgOiBgJHtmaWxlbmFtZX0uanNvbmBcblxuICAgICAgICBjb25zdCBib2R5ID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWVzLCBudWxsLCA0KSlcblxuICAgICAgICB0aGlzLmRyaXZlLndyaXRlKGZpbGVQYXRoLCBib2R5IGFzIHVua25vd24gYXMgVWludDhBcnJheSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdmYWlsZWQgdG8gd3JpdGUgY29uZmlnIHRvIHMzJywgZXJyKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChmdWxsS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xlYW5QcmVmaXggPSB0aGlzLnByZWZpeC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpXG5cbiAgICAgICAgaWYgKCFmdWxsS2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gY2xlYW5QcmVmaXggPyBgJHtjbGVhblByZWZpeH0vJHtmdWxsS2V5fS5qc29uYCA6IGAke2Z1bGxLZXl9Lmpzb25gXG5cbiAgICAgICAgICAgIHRoaXMuZHJpdmUuZGVsZXRlKGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZmFpbGVkIHRvIGRlbGV0ZSBjb25maWcgZnJvbSBzMycsIGVycilcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGZpbGVuYW1lLCBrZXkgfSA9IHRoaXMucGFyc2VLZXkoZnVsbEtleSlcblxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldChmaWxlbmFtZSlcblxuICAgICAgICBzZXQodmFsdWVzLCBrZXksIHVuZGVmaW5lZClcblxuXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gY2xlYW5QcmVmaXggPyBgJHtjbGVhblByZWZpeH0vJHtmaWxlbmFtZX0uanNvbmAgOiBgJHtmaWxlbmFtZX0uanNvbmBcblxuICAgICAgICB0aGlzLmRyaXZlLndyaXRlKGZpbGVQYXRoLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZXMsIG51bGwsIDQpKSBhcyB1bmtub3duIGFzIFVpbnQ4QXJyYXkpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZmFpbGVkIHRvIHdyaXRlIGNvbmZpZyB0byBzMycsIGVycilcbiAgICAgICAgfSlcblxuICAgICAgICBzdXBlci51bnNldChmdWxsS2V5KVxuICAgIH1cbn1cbiIsImltcG9ydCBDb25maWdGU1NlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Db25maWdGU1NlcnZpY2UudHMnXG5pbXBvcnQgQ29uZmlnUzNTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvQ29uZmlnUzNTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiwgdHlwZSBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcbmltcG9ydCBDb25maWdTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cydcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcjc2hhcmVkL3V0aWxzL2ZsYXR0ZW4udHMnXG5pbXBvcnQgdHlwZSBFbnZTZXJ2aWNlIGZyb20gJy4vRW52U2VydmljZS50cydcbmltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnTWFuYWdlck9wdGlvbnMge1xuICAgIGVudjogRW52U2VydmljZVxuICAgIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHNpbGVudD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnTWFuYWdlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBlbnY6IEVudlNlcnZpY2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIHNpbGVudDogYm9vbGVhblxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQ29uZmlnTWFuYWdlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbnYgPSBvcHRpb25zLmVudlxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyXG4gICAgICAgIHRoaXMuc2lsZW50ID0gb3B0aW9ucy5zaWxlbnQgPz8gZmFsc2VcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBDb25maWdNYW5hZ2VyT3B0aW9ucykge1xuICAgICAgICBjb25zdCBzZXJ2aWNlID0gbmV3IENvbmZpZ01hbmFnZXJTZXJ2aWNlKG9wdGlvbnMpXG5cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRTM0NvbmZpZygpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IG5ldyBDb25maWdTM1NlcnZpY2Uoe1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfUzNfQlVDS0VUJykhLFxuICAgICAgICAgICAgcmVnaW9uOiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfUzNfUkVHSU9OJykhLFxuICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19BQ0NFU1NfS0VZX0lEJykhLFxuICAgICAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfUzNfU0VDUkVUX0FDQ0VTU19LRVknKSEsXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0RFQlVHJyksXG4gICAgICAgICAgICBlbmRwb2ludDogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX1MzX0VORFBPSU5UJyksXG4gICAgICAgICAgICBwcmVmaXg6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19QUkVGSVgnKSxcbiAgICAgICAgICAgIHNlc3Npb25Ub2tlbjogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX1MzX1NFU1NJT05fVE9LRU4nKSxcbiAgICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXdhaXQgc2VydmljZS5sb2FkKClcblxuICAgICAgICBpZiAoIXRoaXMuc2lsZW50KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCd1c2luZyBTMyBjb25maWd1cmF0aW9uIHNlcnZpY2UnLCB7XG4gICAgICAgICAgICAgICAgYnVja2V0OiBzZXJ2aWNlLmJ1Y2tldCxcbiAgICAgICAgICAgICAgICByZWdpb246IHNlcnZpY2UucmVnaW9uLFxuICAgICAgICAgICAgICAgIHByZWZpeDogc2VydmljZS5wcmVmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBzZXJ2aWNlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRlNDb25maWcoKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgQ29uZmlnRlNTZXJ2aWNlKHtcbiAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0ZTX1BBVEgnKSxcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfREVCVUcnKSxcbiAgICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXdhaXQgc2VydmljZS5sb2FkKClcblxuICAgICAgICBpZiAoIXRoaXMuc2lsZW50KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCd1c2luZyBmaWxlc3lzdGVtIGNvbmZpZ3VyYXRpb24gc2VydmljZScsIHsgcGF0aDogc2VydmljZS5kaXJlY3RvcnkgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZXJ2aWNlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRDb25maWdGcm9tRW52KHNlcnZpY2U6IENvbmZpZ1NlcnZpY2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmxhdHRlbih0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUcnKSB8fCB7fSkpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlLnNldChrZXksIHZhbHVlLCAnZW52JylcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZsYXR0ZW4odGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0FSR1VNRU5UUycpIHx8IHt9KSkpIHtcbiAgICAgICAgICAgIHNlcnZpY2Uuc2V0KGtleSwgdmFsdWUsICdhcmd1bWVudCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENvbmZpZ0Zyb21GaWxlKHNlcnZpY2U6IENvbmZpZ1NlcnZpY2UsIGZpbGU6IHN0cmluZykge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZSkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGNvbmZpZ3VyYXRpb24gZmlsZSBub3QgZm91bmQ6ICR7ZmlsZX1gKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpXG4gICAgICAgIGxldCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGxcblxuICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLnltbCcpIHx8IGZpbGUuZW5kc1dpdGgoJy55YW1sJykpIHtcbiAgICAgICAgICAgIGRhdGEgPSB5YW1sLmxvYWQodGV4dCkgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBmaWxlIGZvcm1hdDogJHtmaWxlfWApXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmbGF0dGVuKGRhdGEpKSkge1xuICAgICAgICAgICAgc2VydmljZS5zZXQoa2V5LCB2YWx1ZSwgZmlsZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkQ29uZmlnRnJvbUZpbGVzKHNlcnZpY2U6IENvbmZpZ1NlcnZpY2UsIGZpbGVzOiBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZENvbmZpZ0Zyb21GaWxlKHNlcnZpY2UsIGZpbGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpOiBQcm9taXNlPENvbmZpZ1NlcnZpY2U+IHtcbiAgICAgICAgbGV0IHNlcnZpY2U6IENvbmZpZ1NlcnZpY2UgfCBudWxsID0gbnVsbFxuXG4gICAgICAgIGlmICh0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRFJJVkVSJykgPT09ICdzMycpIHtcbiAgICAgICAgICAgIHNlcnZpY2UgPSBhd2FpdCB0aGlzLmxvYWRTM0NvbmZpZygpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlcnZpY2UgfHwgdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0RSSVZFUicpID09PSAnZnMnKSB7XG4gICAgICAgICAgICBzZXJ2aWNlID0gYXdhaXQgdGhpcy5sb2FkRlNDb25maWcoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBzZXJ2aWNlOiBObyB2YWxpZCBkcml2ZXIgZm91bmQnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBzZXJ2aWNlJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZENvbmZpZ0Zyb21GaWxlcyhzZXJ2aWNlLCB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRklMRVMnKSlcblxuICAgICAgICB0aGlzLmxvYWRDb25maWdGcm9tRW52KHNlcnZpY2UpXG5cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VcbiAgICB9XG59XG5cbiIsImltcG9ydCBCYXNlRW1taXR0ZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlXCI7XG5pbXBvcnQgdHlwZSB7IEV2ZW50Q29udHJhY3QgfSBmcm9tICcuLi9jb250cmFjdHMvRXZlbnRDb250cmFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZSBleHRlbmRzIEJhc2VFbW1pdHRlclNlcnZpY2U8RXZlbnRDb250cmFjdD4ge31cbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuZXhwb3J0IHR5cGUgRW52U2NoZW1hID0gdi5JbmZlck91dHB1dDx0eXBlb2YgZW52U2NoZW1hPlxuXG5jb25zdCBib29sZWFuID0gdi5waXBlKFxuICAgIHYudW5pb24oW3YubGl0ZXJhbCgndHJ1ZScpLCB2LmxpdGVyYWwoJ2ZhbHNlJyksIHYubGl0ZXJhbCgnMScpLCB2LmxpdGVyYWwoJzAnKV0pLFxuICAgIHYudHJhbnNmb3JtKCh2YWx1ZSkgPT4gdmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gJzEnKSxcbiAgICB2LmJvb2xlYW4oKVxuKVxuXG5jb25zdCBrZXlWYWx1ZSA9IHYucGlwZSh2LnN0cmluZygpLCB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gdmFsdWUuc3BsaXQoL1s7XFxuXS8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmZpbHRlcihsID0+IGwuaW5jbHVkZXMoJz0nKSlcbiAgICAgICAgLm1hcChsID0+IGwudHJpbSgpLnNwbGl0KCc9JykpXG5cbiAgICBjb25zdCBvYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcykgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgbGV0IHBhcnNlZFZhbHVlOiBhbnkgPSB2YWx1ZVxuXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdib29sOicpKSB7XG4gICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ2Jvb2w6JywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICBzZXQocmVzdWx0LCBrZXksIHBhcnNlZFZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn0pKVxuXG5jb25zdCBzdHJpbmdBcnJheSA9IHYucGlwZShcbiAgICB2LnN0cmluZygpLFxuICAgIHYudHJhbnNmb3JtKCh2YWx1ZSkgPT4gdmFsdWVcbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcChzID0+IHMudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgKVxuKVxuXG5jb25zdCBwbHVnaW4gPSB2Lm9iamVjdCh7XG4gICAgZGlyZWN0b3J5OiB2LnN0cmluZygpLFxufSlcblxuY29uc3QgcGx1Z2luUmVjb3JkID0gdi5yZWNvcmQodi5zdHJpbmcoKSwgcGx1Z2luKVxuXG5leHBvcnQgY29uc3QgZW52U2NoZW1hID0gdi5sb29zZU9iamVjdCh7XG4gICAgTk9ERV9FTlY6IHYub3B0aW9uYWwodi51bmlvbihbdi5saXRlcmFsKCdkZXZlbG9wbWVudCcpLCB2LmxpdGVyYWwoJ3Byb2R1Y3Rpb24nKSwgdi5saXRlcmFsKCd0ZXN0JyldKSwgJ2RldmVsb3BtZW50JyksXG5cbiAgICBaRU5JVEhfQkFTRV9QQVRIOiB2LnN0cmluZygpLFxuXG4gICAgWkVOSVRIX0FQUF9VUkw6IHYub3B0aW9uYWwodi5zdHJpbmcoKSwgJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcpLFxuICAgIFpFTklUSF9QT1JUOiB2Lm9wdGlvbmFsKHYucGlwZSh2LnN0cmluZygpLCB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHBhcnNlSW50KHZhbHVlKSkpLCAnMzAwMCcpLFxuICAgIFpFTklUSF9IT1NUOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCksICcwLjAuMC4wJyksXG5cbiAgICBaRU5JVEhfTE9HX0xFVkVMOiB2Lm9wdGlvbmFsKHYucGlja2xpc3QoWydlcnJvcicsICd3YXJuJywgJ2luZm8nLCAnZGVidWcnXSksICdpbmZvJyksXG4gICAgWkVOSVRIX0xJRkVDWUNMRV9ERUJVRzogdi5vcHRpb25hbChib29sZWFuLCAnZmFsc2UnKSxcbiAgICBaRU5JVEhfQ0xJRU5UX0NPTkZJRzogdi5vcHRpb25hbChrZXlWYWx1ZSwgJycpLFxuXG4gICAgWkVOSVRIX0NPTkZJRzogdi5vcHRpb25hbChrZXlWYWx1ZSwgJycpLFxuICAgIFpFTklUSF9DT05GSUdfQVJHVU1FTlRTOiB2Lm9wdGlvbmFsKGtleVZhbHVlLCAnJyksXG4gICAgWkVOSVRIX0NPTkZJR19GSUxFUzogdi5vcHRpb25hbChzdHJpbmdBcnJheSwgJycpLFxuXG4gICAgWkVOSVRIX0NPTkZJR19ERUJVRzogdi5vcHRpb25hbChib29sZWFuLCAnZmFsc2UnKSxcbiAgICBaRU5JVEhfQ09ORklHX0RSSVZFUjogdi5vcHRpb25hbCh2LnBpY2tsaXN0KFsnZnMnLCAnczMnXSksICdmcycpLFxuICAgIFpFTklUSF9DT05GSUdfRlNfUEFUSDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX1MzX0JVQ0tFVDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX1MzX1JFR0lPTjogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX1MzX0FDQ0VTU19LRVlfSUQ6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19TRUNSRVRfQUNDRVNTX0tFWTogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX1MzX1NFU1NJT05fVE9LRU46IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19FTkRQT0lOVDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX1MzX1BSRUZJWDogdi5vcHRpb25hbCh2LnN0cmluZygpLCAnJyksXG5cblxuICAgIFpFTklUSF9NT0RVTEVfRVhUUkFTOiB2Lm9wdGlvbmFsKGtleVZhbHVlKSxcblxuICAgIFpFTklUSF9QTFVHSU5TOiB2Lm9wdGlvbmFsKHYucGlwZShrZXlWYWx1ZSwgcGx1Z2luUmVjb3JkKSksXG59KVxuXG4iLCJpbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudidcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuaW1wb3J0IHsgZW52U2NoZW1hIH0gZnJvbSAnI3NlcnZlci9zY2hlbWFzL2VudlNjaGVtYS50cydcbmltcG9ydCB0eXBlIHsgRW52U2NoZW1hIH0gZnJvbSAnI3NlcnZlci9zY2hlbWFzL2VudlNjaGVtYS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW52U2VydmljZSB7XG4gICAgcHJpdmF0ZSBlbnY6IEVudlNjaGVtYSB8IG51bGwgPSBudWxsXG4gICAgcHJpdmF0ZSBmaWxlczogc3RyaW5nW10gPSBbXVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRW52U2VydmljZSgpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkb3RFbnZDb25maWcob3B0aW9ucz86IGRvdGVudi5Eb3RlbnZDb25maWdPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBkb3RlbnYuY29uZmlnKG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpbGVzKGZpbGVzOiBzdHJpbmdbXSkge1xuICAgICAgICB0aGlzLmZpbGVzID0gZmlsZXNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsZShmaWxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoKSB7XG4gICAgICAgIEVudlNlcnZpY2UuZG90RW52Q29uZmlnKHtcbiAgICAgICAgICAgIHBhdGg6IHRoaXMuZmlsZXMsXG4gICAgICAgICAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICAgICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuZW52ID0gdi5wYXJzZShlbnZTY2hlbWEsIHByb2Nlc3MuZW52KVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcm9kdWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ05PREVfRU5WJykgPT09ICdwcm9kdWN0aW9uJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGV2ZWxvcG1lbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgnTk9ERV9FTlYnKSA9PT0gJ2RldmVsb3BtZW50J1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGVzdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdOT0RFX0VOVicpID09PSAndGVzdCdcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzPEsgZXh0ZW5kcyBrZXlvZiBFbnZTY2hlbWE+KGtleTogSyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuZW52KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBsb2FkZWQuIENhbGwgbG9hZCgpIGJlZm9yZSBhY2Nlc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLicpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lbnYhW2tleV0gIT09IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8SyBleHRlbmRzIGtleW9mIEVudlNjaGVtYT4oa2V5OiBLLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBFbnZTY2hlbWFbS10ge1xuICAgICAgICBpZiAoIXRoaXMuZW52KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBsb2FkZWQuIENhbGwgbG9hZCgpIGJlZm9yZSBhY2Nlc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLicpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lbnYhW2tleV0gIT09IHVuZGVmaW5lZCA/IHRoaXMuZW52IVtrZXldIDogZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldDxLIGV4dGVuZHMga2V5b2YgRW52U2NoZW1hPihrZXk6IEssIHZhbHVlOiBFbnZTY2hlbWFbS10pIHtcbiAgICAgICAgaWYgKCF0aGlzLmVudikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0Vudmlyb25tZW50IHZhcmlhYmxlcyBub3QgbG9hZGVkLiBDYWxsIGxvYWQoKSBiZWZvcmUgYWNjZXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcy4nKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnYhW2tleV0gPSB2YWx1ZVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgR2l0R2F0ZXdheSB9IGZyb20gJy4uL2dhdGV3YXlzL0dpdEdhdGV3YXkudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0QnJhbmNoIHtcbiAgICBuYW1lOiBzdHJpbmdcbiAgICByZW1vdGU6IHN0cmluZyB8IG51bGxcbiAgICBpc0N1cnJlbnQ6IGJvb2xlYW5cbiAgICBpc1JlbW90ZTogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEJyYW5jaEZldGNoT3B0aW9ucyB7XG4gICAgcmVtb3RlOiBzdHJpbmdcbiAgICBicmFuY2g6IHN0cmluZ1xuICAgIGxvY2FsTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgR2l0QnJhbmNoUmVwb3NpdG9yeSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBnYXRld2F5OiBHaXRHYXRld2F5KSB7fVxuXG4gICAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEdpdEJyYW5jaFtdPiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuZ2F0ZXdheS5ydW4oXG4gICAgICAgICAgICBgYnJhbmNoIC1hIC0tZm9ybWF0PSclKEhFQUQpfCUocmVmbmFtZTpzaG9ydCl8JShyZWZuYW1lKXwlKHVwc3RyZWFtOnJlbW90ZW5hbWUpJ2AsXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS5pbmNsdWRlcygnfCcpKVxuICAgICAgICAgICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtoZWFkLCByZWZTaG9ydCwgcmVmRnVsbCwgcmVtb3RlTmFtZV0gPSBsaW5lLnNwbGl0KCd8JylcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVtb3RlID0gcmVmRnVsbC5zdGFydHNXaXRoKCdyZWZzL3JlbW90ZXMvJylcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gcmVmU2hvcnRcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZTogaXNSZW1vdGUgPyBuYW1lLnNwbGl0KCcvJylbMF0gOiAocmVtb3RlTmFtZSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgICAgICAgaXNDdXJyZW50OiBoZWFkID09PSAnKicsXG4gICAgICAgICAgICAgICAgICAgIGlzUmVtb3RlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2gob3B0aW9uczogR2l0QnJhbmNoRmV0Y2hPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcmVtb3RlLCBicmFuY2gsIGxvY2FsTmFtZSB9ID0gb3B0aW9uc1xuICAgICAgICBjb25zdCBsb2NhbCA9IGxvY2FsTmFtZSA/PyBicmFuY2hcblxuICAgICAgICBhd2FpdCB0aGlzLmdhdGV3YXkucnVuKGBmZXRjaCAke3JlbW90ZX0gJHticmFuY2h9OiR7bG9jYWx9YClcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdpdEdhdGV3YXkgfSBmcm9tICcuLi9nYXRld2F5cy9HaXRHYXRld2F5LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdENvbW1pdFJlZiB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgc2hvcnROYW1lOiBzdHJpbmdcbiAgICB0eXBlOiAnYnJhbmNoJyB8ICd0YWcnIHwgJ3JlbW90ZScgfCAnb3RoZXInXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0Q29tbWl0IHtcbiAgICBoYXNoOiBzdHJpbmdcbiAgICBzaG9ydEhhc2g6IHN0cmluZ1xuICAgIGF1dGhvck5hbWU6IHN0cmluZ1xuICAgIGF1dGhvckVtYWlsOiBzdHJpbmdcbiAgICBkYXRlOiBzdHJpbmdcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICByZWZzOiBHaXRDb21taXRSZWZbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdENvbW1pdExpc3RPcHRpb25zIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbiAgICBwYWdlPzogbnVtYmVyXG4gICAgcGVyUGFnZT86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZENvbW1pdHMge1xuICAgIGl0ZW1zOiBHaXRDb21taXRbXVxuICAgIHRvdGFsOiBudW1iZXJcbiAgICBwYWdlOiBudW1iZXJcbiAgICBwZXJQYWdlOiBudW1iZXJcbiAgICB0b3RhbFBhZ2VzOiBudW1iZXJcbn1cblxuLy8gJUQgZW1pdHMgdGhlIHJlZiBkZWNvcmF0aW9ucyBmb3IgdGhlIGNvbW1pdCAoZS5nLiBcIkhFQUQgLT4gbWFpbiwgdGFnOiB2MS4wLCBvcmlnaW4vbWFpblwiKVxuY29uc3QgTE9HX0ZPUk1BVCA9IFsnJUgnLCAnJWgnLCAnJWFuJywgJyVhZScsICclYUknLCAnJXMnLCAnJUQnXS5qb2luKCcleDA5JylcblxuZnVuY3Rpb24gcGFyc2VEZWNvcmF0aW9ucyhkZWNvclN0cjogc3RyaW5nKTogR2l0Q29tbWl0UmVmW10ge1xuICAgIGlmICghZGVjb3JTdHIudHJpbSgpKSByZXR1cm4gW11cblxuICAgIGNvbnN0IHJlZnM6IEdpdENvbW1pdFJlZltdID0gW11cblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBkZWNvclN0ci5zcGxpdCgnLCAnKSkge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gcGFydC50cmltKClcbiAgICAgICAgaWYgKCF0cmltbWVkKSBjb250aW51ZVxuXG4gICAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ0hFQUQgLT4gJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3J0TmFtZSA9IHRyaW1tZWQuc2xpY2UoOClcbiAgICAgICAgICAgIHJlZnMucHVzaCh7IG5hbWU6ICdIRUFEJywgc2hvcnROYW1lOiAnSEVBRCcsIHR5cGU6ICdvdGhlcicgfSlcbiAgICAgICAgICAgIHJlZnMucHVzaCh7IG5hbWU6IGByZWZzL2hlYWRzLyR7c2hvcnROYW1lfWAsIHNob3J0TmFtZSwgdHlwZTogJ2JyYW5jaCcgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ3RhZzogJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3J0TmFtZSA9IHRyaW1tZWQuc2xpY2UoNSlcbiAgICAgICAgICAgIHJlZnMucHVzaCh7IG5hbWU6IGByZWZzL3RhZ3MvJHtzaG9ydE5hbWV9YCwgc2hvcnROYW1lLCB0eXBlOiAndGFnJyB9KVxuICAgICAgICB9IGVsc2UgaWYgKHRyaW1tZWQgPT09ICdIRUFEJykge1xuICAgICAgICAgICAgcmVmcy5wdXNoKHsgbmFtZTogJ0hFQUQnLCBzaG9ydE5hbWU6ICdIRUFEJywgdHlwZTogJ290aGVyJyB9KVxuICAgICAgICB9IGVsc2UgaWYgKHRyaW1tZWQuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICAgICAgcmVmcy5wdXNoKHsgbmFtZTogYHJlZnMvcmVtb3Rlcy8ke3RyaW1tZWR9YCwgc2hvcnROYW1lOiB0cmltbWVkLCB0eXBlOiAncmVtb3RlJyB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVmcy5wdXNoKHsgbmFtZTogYHJlZnMvaGVhZHMvJHt0cmltbWVkfWAsIHNob3J0TmFtZTogdHJpbW1lZCwgdHlwZTogJ2JyYW5jaCcgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZWZzXG59XG5cbmV4cG9ydCBjbGFzcyBHaXRDb21taXRSZXBvc2l0b3J5IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGdhdGV3YXk6IEdpdEdhdGV3YXkpIHt9XG5cbiAgICBhc3luYyBsaXN0KG9wdGlvbnM/OiBHaXRDb21taXRMaXN0T3B0aW9ucyk6IFByb21pc2U8UGFnaW5hdGVkQ29tbWl0cz4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSA/PyAxXG4gICAgICAgIGNvbnN0IHBlclBhZ2UgPSBvcHRpb25zPy5wZXJQYWdlID8/IDIwXG4gICAgICAgIGNvbnN0IHJlZiA9IG9wdGlvbnM/LmJyYW5jaCA/PyAnSEVBRCdcblxuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLmdhdGV3YXkucnVuKGBsb2cgJHtyZWZ9IC0tZm9ybWF0PScke0xPR19GT1JNQVR9J2ApXG5cbiAgICAgICAgY29uc3QgYWxsOiBHaXRDb21taXRbXSA9IG91dHB1dFxuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtoYXNoLCBzaG9ydEhhc2gsIGF1dGhvck5hbWUsIGF1dGhvckVtYWlsLCBkYXRlLCBtZXNzYWdlLCBkZWNvclN0ciA9ICcnXSA9IGxpbmUuc3BsaXQoJ1xcdCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzaCxcbiAgICAgICAgICAgICAgICAgICAgc2hvcnRIYXNoLFxuICAgICAgICAgICAgICAgICAgICBhdXRob3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICBhdXRob3JFbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgcmVmczogcGFyc2VEZWNvcmF0aW9ucyhkZWNvclN0ciksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjb25zdCB0b3RhbCA9IGFsbC5sZW5ndGhcbiAgICAgICAgY29uc3QgdG90YWxQYWdlcyA9IE1hdGguY2VpbCh0b3RhbCAvIHBlclBhZ2UpXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gKHBhZ2UgLSAxKSAqIHBlclBhZ2VcbiAgICAgICAgY29uc3QgaXRlbXMgPSBhbGwuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgcGVyUGFnZSlcblxuICAgICAgICByZXR1cm4geyBpdGVtcywgdG90YWwsIHBhZ2UsIHBlclBhZ2UsIHRvdGFsUGFnZXMgfVxuICAgIH1cbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGxvZ2dlciA9IGNvbnRhaW5lci5wcm94eTxMb2dnZXJTZXJ2aWNlPihMb2dnZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBsb2dnZXJcbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAndXJsJ1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYidcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCBsb2dnZXIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2xvZ2dlci50cydcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICAgIGNhY2hlPzogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUltcG9ydD86IChjdHg6IHsgZmlsZW5hbWU6IHN0cmluZyB9KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBvbkFmdGVySW1wb3J0PzogKGN0eDogeyBmaWxlbmFtZTogc3RyaW5nLCBtb2R1bGU6IGFueSB9KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBvbkVycm9yPzogKGN0eDogeyBmaWxlbmFtZTogc3RyaW5nLCBlcnJvcjogRXJyb3IgfSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgZXhjbHVkZT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RmlsZXMoZmlsZXM6IHN0cmluZ1tdLCBvcHRpb25zOiBPcHRpb25zID0ge30pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBsZXQgb25FcnJvcjogUmVxdWlyZWQ8T3B0aW9ucz5bJ29uRXJyb3InXSA9IGN0eCA9PiB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oY3R4LmVycm9yLCB7IGZpbGVuYW1lOiBjdHguZmlsZW5hbWUgfSkgXG5cbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW1wb3J0ICR7Y3R4LmZpbGVuYW1lfWAsIGN0eC5lcnJvcilcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vbkVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3JcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGUgJiYgb3B0aW9ucy5leGNsdWRlLnNvbWUocGF0dGVybiA9PiBmaWxlbmFtZS5pbmNsdWRlcyhwYXR0ZXJuKSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdHggPSB7IGZpbGVuYW1lIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5vbkJlZm9yZUltcG9ydCkge1xuICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5vbkJlZm9yZUltcG9ydChjdHgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGVhbkZpbGVuYW1lID0gY3R4LmZpbGVuYW1lLnNwbGl0KCc/JylbMF1cblxuICAgICAgICBpZiAoL1xcLihtdHN8dHN8anMpJC8udGVzdChjbGVhbkZpbGVuYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgYWJzID0gcGF0aC5yZXNvbHZlKGN0eC5maWxlbmFtZSlcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmwgPSBwYXRoVG9GaWxlVVJMKGFicylcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2FjaGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgZmlsZVVybC5zZWFyY2hQYXJhbXMuc2V0KCd0JywgRGF0ZS5ub3coKS50b1N0cmluZygpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIG1vZF0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBpbXBvcnQoZmlsZVVybC50b1N0cmluZygpKSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwge1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogY3R4LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGZpbGVVcmwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGN0eC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2R1bGVzW2ZpbGVuYW1lXSA9IG1vZFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoL1xcLmpzb24kLy50ZXN0KGNsZWFuRmlsZW5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIGpzb25dID0gYXdhaXQgdHJ5Q2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjdHguZmlsZW5hbWUsICd1dGY4JylcblxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGN0eC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2R1bGVzW2ZpbGVuYW1lXSA9IGpzb25cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm9uQWZ0ZXJJbXBvcnQpIHtcbiAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMub25BZnRlckltcG9ydCh7XG4gICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlc1tmaWxlbmFtZV1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9kdWxlc1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0R2xvYihwYXR0ZXJuOiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcocGF0dGVybilcblxuICAgIHJldHVybiBpbXBvcnRGaWxlcyhmaWxlcyBhcyBzdHJpbmdbXSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEFsbChkaXJlY3Rvcnk6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcblxuICAgIGNvbnN0IGZpbGVzID0gZGlyZW50c1xuICAgICAgICAuZmlsdGVyKGRpcmVudCA9PiBkaXJlbnQuaXNGaWxlKCkpXG4gICAgICAgIC5tYXAoZGlyZW50ID0+IHBhdGguam9pbihkaXJlY3RvcnksIGRpcmVudC5uYW1lKSlcblxuICAgIHJldHVybiBpbXBvcnRGaWxlcyhmaWxlcywgb3B0aW9ucylcbn1cblxuXG5cbiIsImltcG9ydCB7IGltcG9ydEFsbCB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvaW1wb3J0QWxsLnRzJztcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyc7XG5pbXBvcnQgQmFzZUxpZmVjeWNsZVNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlU2VydmljZSBleHRlbmRzIEJhc2VMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgYXN5bmMgYWRkRGlyZWN0b3J5KGRpcm5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtb2RzID0gYXdhaXQgaW1wb3J0QWxsKGRpcm5hbWUpXG4gICAgICAgIGNvbnN0IGhvb2tzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1vZF0gb2YgT2JqZWN0LmVudHJpZXMobW9kcykpIHtcbiAgICAgICAgICAgIGNvbnN0IEhvb2tDbGFzcyA9IG1vZC5kZWZhdWx0IHx8IG1vZFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgSG9va0NsYXNzKCkgYXMgTGlmZWN5Y2xlSG9va1xuXG4gICAgICAgICAgICBpbnN0YW5jZS5ob29rX2lkID0gaW5zdGFuY2UuaG9va19pZCB8fCBuYW1lXG5cbiAgICAgICAgICAgIGhvb2tzLnB1c2goaW5zdGFuY2UpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcy5mb3JFYWNoKGhvb2sgPT4gdGhpcy5hZGQoaG9vaykpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gXCIjc2hhcmVkL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gXCJreXNlbHlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRpb25FbnRpeURhdGEge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZyB8IG51bGw7XG4gICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICBleGVjdXRlZEF0OiBEYXRlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWlncmF0aW9uRW50aXR5IHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHNvdXJjZTogc3RyaW5nIHwgbnVsbFxuICAgIHB1YmxpYyBmaWxlbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGV4ZWN1dGVkQXQ6IERhdGUgfCBudWxsXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBNaWdyYXRpb25FbnRpeURhdGEpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2VcbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGRhdGEuZmlsZW5hbWVcbiAgICAgICAgdGhpcy5leGVjdXRlZEF0ID0gZGF0YS5leGVjdXRlZEF0XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwKGRiOiBLeXNlbHk8YW55Pik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQodGhpcy5maWxlbmFtZSlcblxuICAgICAgICBpZiAodHlwZW9mIG1vZC51cCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYE1pZ3JhdGlvbiAke3RoaXMubmFtZX0gZG9lcyBub3QgZXhwb3J0IGFuIHVwIGZ1bmN0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG1vZC51cChkYilcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bihkYjogS3lzZWx5PGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KHRoaXMuZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBtb2QuZG93biAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYE1pZ3JhdGlvbiAke3RoaXMubmFtZX0gZG9lcyBub3QgZXhwb3J0IGEgZG93biBmdW5jdGlvbmApXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBtb2QuZG93bihkYilcbiAgICB9XG59XG5cbiIsImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCBFbW1pdHRlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2UudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCBNaWdyYXRpb25FbnRpdHkgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9NaWdyYXRpb25FbnRpdHkudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0aW9uU291cmNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGRpcmVjdG9yeTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIGV4ZWN1dGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGaWx0ZXJzIHtcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBNaWdyYXRpb25SZXN1bHQge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICByZXN1bHQ6ICdzdWNjZXNzJyB8ICdmYWlsZWQnO1xuICAgIGVycm9yPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdG9yU2VydmljZU9wdGlvbnMge1xuICAgIHNvdXJjZXM6IE1pZ3JhdGlvblNvdXJjZVtdO1xuICAgIGRiOiBLeXNlbHk8YW55PjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgZW1taXR0ZXI/OiBFbW1pdHRlclNlcnZpY2U7XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNaWdyYXRvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ01pZ3JhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGVtbWl0dGVyOiBFbW1pdHRlclNlcnZpY2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRiOiBLeXNlbHk8YW55PlxuICAgIHB1YmxpYyBzb3VyY2VzOiBNaWdyYXRpb25Tb3VyY2VbXVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogTWlncmF0b3JTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBvcHRpb25zLmVtbWl0dGVyIHx8IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5kYiA9IG9wdGlvbnMuZGJcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gb3B0aW9ucy5zb3VyY2VzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZFNvdXJjZShzb3VyY2U6IE1pZ3JhdGlvblNvdXJjZSkge1xuICAgICAgICB0aGlzLnNvdXJjZXMucHVzaChzb3VyY2UpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBlbnN1cmVNaWdyYXRpb25zVGFibGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGIuc2NoZW1hXG4gICAgICAgICAgICAuY3JlYXRlVGFibGUoJ21pZ3JhdGlvbnMnKVxuICAgICAgICAgICAgLmlmTm90RXhpc3RzKClcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ25hbWUnLCAndmFyY2hhcigyNTUpJywgKGNvbCkgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ21vZHVsZScsICd2YXJjaGFyKDI1NSknKSAvLyBtb2R1bGUgd2lsbCBiZSByZW5hbWVkIHRvIHNvdXJjZSBpbiBmdXR1cmUgdmVyc2lvbnNcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2V4ZWN1dGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxpc3RTb3VyY2Uoc291cmNlOiBNaWdyYXRpb25Tb3VyY2UpIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoc291cmNlLmRpcmVjdG9yeSlcblxuICAgICAgICBjb25zdCBtaWdyYXRpb25zOiBNaWdyYXRpb25FbnRpdHlbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoIWVudHJ5LmVuZHNXaXRoKCcuanMnKSAmJiAhZW50cnkuZW5kc1dpdGgoJy50cycpKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihzb3VyY2UuZGlyZWN0b3J5LCBlbnRyeSlcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBwYXRoLmJhc2VuYW1lKGVudHJ5LCBwYXRoLmV4dG5hbWUoZW50cnkpKVxuXG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBuZXcgTWlncmF0aW9uRW50aXR5KHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLmlkLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmdWxsUGF0aCxcbiAgICAgICAgICAgICAgICBleGVjdXRlZEF0OiBudWxsLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbWlncmF0aW9ucy5wdXNoKGVudGl0eSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtaWdyYXRpb25zXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxpc3QoZmlsdGVycz86IExpc3RGaWx0ZXJzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTWlncmF0aW9uc1RhYmxlKClcblxuICAgICAgICBjb25zdCBtaWdyYXRpb25zID0gW10gYXMgTWlncmF0aW9uRW50aXR5W11cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZU1pZ3JhdGlvbnMgPSBhd2FpdCB0aGlzLmxpc3RTb3VyY2Uoc291cmNlKVxuXG4gICAgICAgICAgICBtaWdyYXRpb25zLnB1c2goLi4uc291cmNlTWlncmF0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgYWxsIG1pZ3JhdGlvbnMgYnkgbmFtZVxuICAgICAgICBtaWdyYXRpb25zLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpXG5cbiAgICAgICAgLy8gR2V0IGV4ZWN1dGVkIG1pZ3JhdGlvbnMgZnJvbSBkYXRhYmFzZVxuICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IHRoaXMuZGJcbiAgICAgICAgICAgIC5zZWxlY3RGcm9tKCdtaWdyYXRpb25zJylcbiAgICAgICAgICAgIC5zZWxlY3RBbGwoKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuXG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBleGVjdXRlZCkge1xuICAgICAgICAgICAgaWYgKCFlLnNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGUuc291cmNlID0gJ3Jvb3QnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG0gPSBtaWdyYXRpb25zLmZpbmQobSA9PiBtLm5hbWUgPT09IGUubmFtZSlcblxuICAgICAgICAgICAgaWYgKCFtKSBjb250aW51ZVxuXG4gICAgICAgICAgICBtLmV4ZWN1dGVkQXQgPSBuZXcgRGF0ZShlLmV4ZWN1dGVkX2F0KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IG1pZ3JhdGlvbnNcblxuICAgICAgICBpZiAoZmlsdGVycz8uc291cmNlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBtaWdyYXRpb25zLmZpbHRlcihtID0+IG0uc291cmNlID09PSBmaWx0ZXJzLnNvdXJjZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1pZ3JhdGVVcChtaWdyYXRpb246IE1pZ3JhdGlvbkVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBtaWdyYXRpb24udXAodGhpcy5kYilcblxuICAgICAgICBhd2FpdCB0aGlzLmRiXG4gICAgICAgICAgICAuaW5zZXJ0SW50bygnbWlncmF0aW9ucycpXG4gICAgICAgICAgICAudmFsdWVzKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICBtb2R1bGU6IG1pZ3JhdGlvbi5zb3VyY2UsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZWRfYXQ6IGZvcm1hdChuZXcgRGF0ZSgpLCAneXl5eS1NTS1kZCBISDptbTpzcycpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5leGVjdXRlKClcblxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbWlncmF0ZURvd24obWlncmF0aW9uOiBNaWdyYXRpb25FbnRpdHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbWlncmF0aW9uLmRvd24odGhpcy5kYilcblxuICAgICAgICBhd2FpdCB0aGlzLmRiXG4gICAgICAgICAgICAuZGVsZXRlRnJvbSgnbWlncmF0aW9ucycpXG4gICAgICAgICAgICAud2hlcmUoJ25hbWUnLCAnPScsIG1pZ3JhdGlvbi5uYW1lKVxuICAgICAgICAgICAgLndoZXJlKCdtb2R1bGUnLCAnPScsIG1pZ3JhdGlvbi5zb3VyY2UpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbWlncmF0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTWlncmF0aW9uc1RhYmxlKClcblxuICAgICAgICBjb25zdCBtaWdyYXRpb25zID0gYXdhaXQgdGhpcy5saXN0KClcbiAgICAgICAgY29uc3QgbWlncmF0aW9uID0gbWlncmF0aW9ucy5maW5kKG0gPT4gbS5maWxlbmFtZSA9PT0gZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKCFtaWdyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSksXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYE1pZ3JhdGlvbiAke2ZpbGVuYW1lfSBub3QgZm91bmRgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbi5leGVjdXRlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IHRoaXMubWlncmF0ZVVwKG1pZ3JhdGlvbikpXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IG1pZ3JhdGlvbi5zb3VyY2UsXG4gICAgICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJvbGxiYWNrRmlsZShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVNaWdyYXRpb25zVGFibGUoKVxuXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbnMgPSBhd2FpdCB0aGlzLmxpc3QoKVxuICAgICAgICBjb25zdCBtaWdyYXRpb24gPSBtaWdyYXRpb25zLmZpbmQobSA9PiBtLmZpbGVuYW1lID09PSBmaWxlbmFtZSlcblxuICAgICAgICBpZiAoIW1pZ3JhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lLCBwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKSxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGBNaWdyYXRpb24gJHtmaWxlbmFtZX0gbm90IGZvdW5kYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtaWdyYXRpb24uZXhlY3V0ZWRBdCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogbWlncmF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbWlncmF0aW9uLnNvdXJjZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiB0aGlzLm1pZ3JhdGVEb3duKG1pZ3JhdGlvbikpXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IG1pZ3JhdGlvbi5zb3VyY2UsXG4gICAgICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1pZ3JhdGUoZmlsdGVyczogTGlzdEZpbHRlcnMgJiB7IHN0ZXBzPzogbnVtYmVyIH0gPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVNaWdyYXRpb25zVGFibGUoKVxuXG4gICAgICAgIGxldCBtaWdyYXRpb25zID0gYXdhaXQgdGhpcy5saXN0KGZpbHRlcnMpXG5cbiAgICAgICAgbWlncmF0aW9ucyA9IG1pZ3JhdGlvbnMuZmlsdGVyKG0gPT4gIW0uZXhlY3V0ZWRBdClcblxuICAgICAgICBtaWdyYXRpb25zLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpXG5cbiAgICAgICAgaWYgKGZpbHRlcnMuc3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWlncmF0aW9ucyA9IG1pZ3JhdGlvbnMuc2xpY2UoMCwgZmlsdGVycy5zdGVwcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaWdyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtbWl0dGVyLmVtaXRBbmRXYWl0KCdtaWdyYXRvcjpiZWZvcmUtbWlncmF0ZScsIHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnM6IG1pZ3JhdGlvbnMubWFwKG0gPT4gbS5uYW1lKVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IE1pZ3JhdGlvblJlc3VsdFtdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBtaWdyYXRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGVGaWxlKG1pZ3JhdGlvbi5maWxlbmFtZSlcblxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdClcblxuICAgICAgICAgICAgLy8gU3RvcCBvbiBmaXJzdCBmYWlsdXJlXG4gICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnbWlncmF0b3I6YWZ0ZXItbWlncmF0ZScsIHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnM6IG1pZ3JhdGlvbnMsXG4gICAgICAgICAgICByZXN1bHRzXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcm9sbGJhY2soZmlsdGVyczogTGlzdEZpbHRlcnMgJiB7IHN0ZXBzPzogbnVtYmVyIH0gPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVNaWdyYXRpb25zVGFibGUoKVxuXG4gICAgICAgIGxldCBtaWdyYXRpb25zID0gYXdhaXQgdGhpcy5saXN0KGZpbHRlcnMpXG5cbiAgICAgICAgbWlncmF0aW9ucyA9IG1pZ3JhdGlvbnMuZmlsdGVyKG0gPT4gbS5leGVjdXRlZEF0KVxuXG4gICAgICAgIG1pZ3JhdGlvbnMuc29ydCgoYSwgYikgPT4gYi5uYW1lLmxvY2FsZUNvbXBhcmUoYS5uYW1lKSlcblxuXG4gICAgICAgIGlmIChmaWx0ZXJzLnN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnMgPSBtaWdyYXRpb25zLnNsaWNlKDAsIGZpbHRlcnMuc3RlcHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnbWlncmF0b3I6YmVmb3JlLXJvbGxiYWNrJywge1xuICAgICAgICAgICAgbWlncmF0aW9uczogbWlncmF0aW9ucy5tYXAobSA9PiBtLm5hbWUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVzdWx0czogTWlncmF0aW9uUmVzdWx0W10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucm9sbGJhY2tGaWxlKG1pZ3JhdGlvbi5maWxlbmFtZSlcblxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdClcblxuICAgICAgICAgICAgLy8gU3RvcCBvbiBmaXJzdCBmYWlsdXJlXG4gICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnbWlncmF0b3I6YWZ0ZXItcm9sbGJhY2snLCB7XG4gICAgICAgICAgICBtaWdyYXRpb25zOiBtaWdyYXRpb25zLm1hcChtID0+IG0ubmFtZSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cChzdGVwczogbnVtYmVyID0gMSwgZmlsdGVyczogTGlzdEZpbHRlcnMgPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlncmF0ZSh7XG4gICAgICAgICAgICAuLi5maWx0ZXJzLFxuICAgICAgICAgICAgc3RlcHNcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bihzdGVwczogbnVtYmVyID0gMSwgZmlsdGVyczogTGlzdEZpbHRlcnMgPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9sbGJhY2soe1xuICAgICAgICAgICAgLi4uZmlsdGVycyxcbiAgICAgICAgICAgIHN0ZXBzXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxhdGVzdChmaWx0ZXJzOiBMaXN0RmlsdGVycyA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taWdyYXRlKGZpbHRlcnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxhdGVzdE9yRmFpbChmaWx0ZXJzOiBMaXN0RmlsdGVycyA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5sYXRlc3QoZmlsdGVycylcblxuICAgICAgICBpZiAocmVzdWx0cy5zb21lKHIgPT4gci5yZXN1bHQgPT09ICdmYWlsZWQnKSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBydW4gYWxsIG1pZ3JhdGlvbnMnKVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IHJlc3VsdHMgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZyZXNoKGZpbHRlcnM6IExpc3RGaWx0ZXJzICYgeyBzdGVwcz86IG51bWJlciB9ID0ge30pOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdFtdPiB7XG4gICAgICAgIGNvbnN0IGRvd25SZXN1bHRzID0gYXdhaXQgdGhpcy5yb2xsYmFjayhmaWx0ZXJzKVxuXG4gICAgICAgIGlmIChkb3duUmVzdWx0cy5zb21lKHIgPT4gci5yZXN1bHQgPT09ICdmYWlsZWQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvd25SZXN1bHRzXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cFJlc3VsdHMgPSBhd2FpdCB0aGlzLm1pZ3JhdGUoZmlsdGVycylcblxuICAgICAgICByZXR1cm4gdXBSZXN1bHRzXG4gICAgfVxuXG59XG5cbiIsImltcG9ydCB7IGNyZWF0ZUlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzJ1xuXG5leHBvcnQgdHlwZSBJcGNNZXNzYWdlPFQgPSBhbnk+ID0ge1xuICAgIGlkOiBzdHJpbmdcbiAgICBldmVudDogc3RyaW5nXG4gICAgZGF0YTogVFxufVxuXG50eXBlIElwY0xpc3RlbmVyPFQgPSBhbnk+ID0gKGRhdGE6IFQpID0+IHZvaWRcblxuZXhwb3J0IGNsYXNzIFBsdWdpbklwY0NsaWVudCB7XG4gICAgcHJpdmF0ZSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PElwY0xpc3RlbmVyPj4oKVxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdtZXNzYWdlJywgKG1lc3NhZ2U6IElwY01lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5saXN0ZW5lcnMuZ2V0KG1lc3NhZ2UuZXZlbnQpXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJzKSByZXR1cm5cblxuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihtZXNzYWdlLmRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG9uPFQgPSBhbnk+KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBJcGNMaXN0ZW5lcjxUPik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50KSEuYWRkKGNhbGxiYWNrIGFzIElwY0xpc3RlbmVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBvZmY8VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IElwY0xpc3RlbmVyPFQ+KTogdm9pZCB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmdldChldmVudCk/LmRlbGV0ZShjYWxsYmFjayBhcyBJcGNMaXN0ZW5lcilcbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdDxUID0gYW55PihldmVudDogc3RyaW5nLCBkYXRhPzogVCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghcHJvY2Vzcy5zZW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsdWdpbklwY0NsaWVudC5lbWl0OiBwcm9jZXNzLnNlbmQgaXMgbm90IGF2YWlsYWJsZSDigJQgcHJvY2VzcyB3YXMgbm90IHNwYXduZWQgd2l0aCBJUEMgY2hhbm5lbCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZCA9IGNyZWF0ZUlkKClcbiAgICAgICAgY29uc3QgbWVzc2FnZTogSXBjTWVzc2FnZTxUPiA9IHsgaWQsIGV2ZW50LCBkYXRhOiBkYXRhIGFzIFQgfVxuICAgICAgICBwcm9jZXNzLnNlbmQobWVzc2FnZSlcblxuICAgICAgICByZXR1cm4gaWRcbiAgICB9XG5cbn1cblxuIiwiaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBjcmVhdGVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9jcmVhdGVJZC50cydcbmltcG9ydCB0eXBlIHsgSXBjTWVzc2FnZSB9IGZyb20gJy4vUGx1Z2luSXBjQ2xpZW50LnRzJ1xuXG50eXBlIElwY0xpc3RlbmVyPFQgPSBhbnk+ID0gKGRhdGE6IFQpID0+IHZvaWRcblxuZXhwb3J0IGNsYXNzIFBsdWdpbklwY0hvc3Qge1xuICAgIHByaXZhdGUgbGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxJcGNMaXN0ZW5lcj4+KClcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNoaWxkOiBDaGlsZFByb2Nlc3MpIHtcbiAgICAgICAgdGhpcy5jaGlsZC5vbignbWVzc2FnZScsIChtZXNzYWdlOiBJcGNNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubGlzdGVuZXJzLmdldChtZXNzYWdlLmV2ZW50KVxuICAgICAgICAgICAgaWYgKCFoYW5kbGVycykgcmV0dXJuXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIobWVzc2FnZS5kYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBvbjxUID0gYW55PihldmVudDogc3RyaW5nLCBjYWxsYmFjazogSXBjTGlzdGVuZXI8VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zZXQoZXZlbnQsIG5ldyBTZXQoKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmdldChldmVudCkhLmFkZChjYWxsYmFjayBhcyBJcGNMaXN0ZW5lcilcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmPFQgPSBhbnk+KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBJcGNMaXN0ZW5lcjxUPik6IHZvaWQge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpPy5kZWxldGUoY2FsbGJhY2sgYXMgSXBjTGlzdGVuZXIpXG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgZGF0YT86IFQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuY2hpbGQuc2VuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW5JcGNIb3N0LmVtaXQ6IGNoaWxkIHByb2Nlc3Mgd2FzIG5vdCBzcGF3bmVkIHdpdGggYW4gSVBDIGNoYW5uZWwnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSBjcmVhdGVJZCgpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IElwY01lc3NhZ2U8VD4gPSB7IGlkLCBldmVudCwgZGF0YTogZGF0YSBhcyBUIH1cbiAgICAgICAgdGhpcy5jaGlsZC5zZW5kKG1lc3NhZ2UpXG5cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBQbHVnaW5JcGNDbGllbnQgfSBmcm9tICcuL1BsdWdpbklwY0NsaWVudC50cydcblxuZXhwb3J0IHR5cGUgSHR0cE1ldGhvZCA9ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnUEFUQ0gnIHwgJ0RFTEVURSdcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZURlZmluaXRpb24ge1xuICAgIG1ldGhvZDogSHR0cE1ldGhvZFxuICAgIHBhdGg6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlUmVxdWVzdCB7XG4gICAgcmVxdWVzdElkOiBzdHJpbmdcbiAgICBtZXRob2Q6IEh0dHBNZXRob2RcbiAgICBwYXRoOiBzdHJpbmdcbiAgICBib2R5PzogYW55XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVSZXNwb25zZVBheWxvYWQge1xuICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gICAgc3RhdHVzOiBudW1iZXJcbiAgICBib2R5PzogYW55XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVJlcGx5IHtcbiAgICBzdGF0dXMoY29kZTogbnVtYmVyKTogUm91dGVSZXBseVxuICAgIHNlbmQoYm9keT86IGFueSk6IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgUm91dGVIYW5kbGVyID0gKHJlcTogUm91dGVSZXF1ZXN0LCByZXBseTogUm91dGVSZXBseSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cblxuaW50ZXJmYWNlIFJvdXRlRW50cnkgZXh0ZW5kcyBSb3V0ZURlZmluaXRpb24ge1xuICAgIGhhbmRsZXI6IFJvdXRlSGFuZGxlclxuICAgIHBhdHRlcm46IFJlZ0V4cFxuICAgIHBhcmFtTmFtZXM6IHN0cmluZ1tdXG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGF0dGVybihwYXRoOiBzdHJpbmcpOiB7IHBhdHRlcm46IFJlZ0V4cDsgcGFyYW1OYW1lczogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgcGFyYW1OYW1lczogc3RyaW5nW10gPSBbXVxuXG4gICAgY29uc3QgcmVnZXhTdHIgPSBwYXRoXG4gICAgICAgIC5yZXBsYWNlKC86W2EtekEtWl9dW2EtekEtWjAtOV9dKi9nLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHBhcmFtTmFtZXMucHVzaChtYXRjaC5zbGljZSgxKSlcbiAgICAgICAgICAgIHJldHVybiAnKFteL10rKSdcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXFxcXC8nKVxuXG4gICAgcmV0dXJuIHsgcGF0dGVybjogbmV3IFJlZ0V4cChgXiR7cmVnZXhTdHJ9JGApLCBwYXJhbU5hbWVzIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBsdWdpblJvdXRlciB7XG4gICAgcHJpdmF0ZSByb3V0ZXM6IFJvdXRlRW50cnlbXSA9IFtdXG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogUGx1Z2luSXBjQ2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50Lm9uPFJvdXRlUmVxdWVzdD4oJ3JvdXRlcjpyZXF1ZXN0JywgKHJlcSkgPT4gdGhpcy5kaXNwYXRjaChyZXEpKVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2gocmVxOiBSb3V0ZVJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiB0aGlzLnJvdXRlcykge1xuICAgICAgICAgICAgaWYgKHJvdXRlLm1ldGhvZCAhPT0gcmVxLm1ldGhvZCkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSByb3V0ZS5wYXR0ZXJuLmV4ZWMocmVxLnBhdGgpXG4gICAgICAgICAgICBpZiAoIW1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgcm91dGUucGFyYW1OYW1lcy5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyYW1zW25hbWVdID0gbWF0Y2hbaSArIDFdXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBsZXQgc3RhdHVzQ29kZSA9IDIwMFxuICAgICAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcGx5OiBSb3V0ZVJlcGx5ID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1cyhjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBjb2RlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZW5kOiAoYm9keT86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZTogUm91dGVSZXNwb25zZVBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcS5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5lbWl0KCdyb3V0ZXI6cmVzcG9uc2UnLCByZXNwb25zZSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCByb3V0ZS5oYW5kbGVyKHsgLi4ucmVxLCBwYXJhbXMgfSwgcmVwbHkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xpZW50LmVtaXQoJ3JvdXRlcjpyZXNwb25zZScsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogcmVxLnJlcXVlc3RJZCxcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgYm9keTogeyBtZXNzYWdlOiAnTm90IEZvdW5kJyB9LFxuICAgICAgICB9IHNhdGlzZmllcyBSb3V0ZVJlc3BvbnNlUGF5bG9hZClcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyKG1ldGhvZDogSHR0cE1ldGhvZCwgcGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBwYXJhbU5hbWVzIH0gPSBidWlsZFBhdHRlcm4ocGF0aClcblxuICAgICAgICB0aGlzLnJvdXRlcy5wdXNoKHsgbWV0aG9kLCBwYXRoLCBoYW5kbGVyLCBwYXR0ZXJuLCBwYXJhbU5hbWVzIH0pXG4gICAgICAgIHRoaXMuY2xpZW50LmVtaXQoJ3JvdXRlcjpyZWdpc3RlcicsIHsgbWV0aG9kLCBwYXRoIH0gc2F0aXNmaWVzIFJvdXRlRGVmaW5pdGlvbilcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUm91dGVIYW5kbGVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoJ0dFVCcsIHBhdGgsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgcHVibGljIHBvc3QocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlcignUE9TVCcsIHBhdGgsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgcHVibGljIHB1dChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdQVVQnLCBwYXRoLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdQQVRDSCcsIHBhdGgsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdERUxFVEUnLCBwYXRoLCBoYW5kbGVyKVxuICAgIH1cbn1cbiIsImltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InXG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5pbXBvcnQgdHlwZSBSb3V0ZSBmcm9tICcjc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgUm91dGVGaWxlRGVmaW5pdGlvbiB7XG4gICAgZmlsZTogc3RyaW5nXG4gICAgcm91dGVQYXRoOiBzdHJpbmdcbiAgICBtb2R1bGU/OiBzdHJpbmdcbiAgICBtZXRob2Q6ICdnZXQnIHwgJ3Bvc3QnIHwgJ3BhdGNoJyB8ICdkZWxldGUnIHwgJ3B1dCdcbiAgICBzb3J0S2V5OiBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyRmlsZUJhc2VSb3V0aW5nU2VydmljZSB7XG4gICAgcHJpdmF0ZSBkaXJlY3Rvcnk6IHN0cmluZyBcbiAgICBwcml2YXRlIHByZWZpeDogc3RyaW5nXG4gICAgcHJpdmF0ZSBtb2R1bGU/OiBzdHJpbmdcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICAgcHJpdmF0ZSBsb2dnZXIgPSBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgcHJpdmF0ZSByb3V0ZXM6IFJvdXRlRmlsZURlZmluaXRpb25bXSA9IFtdXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcblxuICAgIHB1YmxpYyBzZXREaXJlY3RvcnkoZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3RvcnlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UHJlZml4KHByZWZpeDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvdXRlcihyb3V0ZXI6IFJvdXRlcikge1xuICAgICAgICB0aGlzLnJvdXRlciA9IHJvdXRlclxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRNb2R1bGUobW9kdWxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9nZ2VyKGxvZ2dlcjogTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWdcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShkaXJlY3Rvcnk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkRmlsZXMoKSB7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gZmcuc3luYygnKiovKi4odHN8anN8bWpzKScsIHsgY3dkOiB0aGlzLmRpcmVjdG9yeSB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRm91bmQgJHtmaWxlcy5sZW5ndGh9IHJvdXRlIGZpbGVzIGluICR7dGhpcy5kaXJlY3Rvcnl9YCwge1xuICAgICAgICAgICAgICAgIGZpbGVzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2Nlc3MgYWxsIGZpbGVzIGFuZCBidWlsZCByb3V0ZSBkYXRhXG4gICAgICAgIGNvbnN0IHJvdXRlczogUm91dGVGaWxlRGVmaW5pdGlvbltdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBleHRlbnNpb25cbiAgICAgICAgICAgIGxldCByb3V0ZVBhdGggPSBmaWxlLnJlcGxhY2UoL1xcLih0c3xqc3xtanMpJC8sICcnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgSFRUUCBtZXRob2QgZnJvbSBzdWZmaXhcbiAgICAgICAgICAgIGxldCBtZXRob2Q6ICdnZXQnIHwgJ3Bvc3QnIHwgJ3BhdGNoJyB8ICdkZWxldGUnIHwgJ3B1dCcgPSAnZ2V0J1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kU3VmZml4ZXMgPSBbJy5wb3N0JywgJy5wYXRjaCcsICcuZGVsZXRlJywgJy5wdXQnXVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1ZmZpeCBvZiBtZXRob2RTdWZmaXhlcykge1xuICAgICAgICAgICAgICAgIGlmIChyb3V0ZVBhdGguZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBzdWZmaXguc3Vic3RyaW5nKDEpIGFzIGFueVxuICAgICAgICAgICAgICAgICAgICByb3V0ZVBhdGggPSByb3V0ZVBhdGgucmVwbGFjZShzdWZmaXgsICcnKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ29udmVydCBmaWxlIHBhdGggdG8gcm91dGUgcGF0aFxuICAgICAgICAgICAgLy8gUmVwbGFjZSAnaW5kZXgnIHdpdGggZW1wdHkgc3RyaW5nIGZvciBpbmRleCByb3V0ZXNcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IHJvdXRlUGF0aC5yZXBsYWNlKC9cXC9pbmRleCQvLCAnJylcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IHJvdXRlUGF0aC5yZXBsYWNlKC9eaW5kZXgkLywgJycpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvbnZlcnQgWy4uLm5hbWVdIHRvIC86bmFtZSguKikgZm9yIG5hbWVkIGNhdGNoLWFsbCByb3V0ZXNcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IHJvdXRlUGF0aC5yZXBsYWNlKC9cXFtcXC5cXC5cXC4oW15cXF1dKyldL2csICcqJDEnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gOnBhcmFtIGZvciByb3V0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgICByb3V0ZVBhdGggPSByb3V0ZVBhdGgucmVwbGFjZSgvXFxbKFteXFxdXSspXS9nLCAnOiQxJylcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRW5zdXJlIHJvdXRlIHN0YXJ0cyB3aXRoIC9cbiAgICAgICAgICAgIGlmICghcm91dGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIHJvdXRlUGF0aCA9ICcvJyArIHJvdXRlUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUgcm9vdCBpbmRleCBjYXNlXG4gICAgICAgICAgICBpZiAocm91dGVQYXRoID09PSAnLycpIHtcbiAgICAgICAgICAgICAgICByb3V0ZVBhdGggPSAnLydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQXBwbHkgcHJlZml4IGlmIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVmaXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUHJlZml4ID0gdGhpcy5wcmVmaXguc3RhcnRzV2l0aCgnLycpID8gdGhpcy5wcmVmaXggOiAnLycgKyB0aGlzLnByZWZpeFxuICAgICAgICAgICAgICAgIHJvdXRlUGF0aCA9IG5vcm1hbGl6ZWRQcmVmaXggKyByb3V0ZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNvcnQga2V5IGZvciBwcmlvcml0aXphdGlvblxuICAgICAgICAgICAgbGV0IHNvcnRLZXkgPSAwXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENhdGNoLWFsbCByb3V0ZXMgc2hvdWxkIGNvbWUgbGFzdCAoaGlnaCBzb3J0IGtleSlcbiAgICAgICAgICAgIGlmIChyb3V0ZVBhdGguaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgICAgICAgIHNvcnRLZXkgKz0gMTAwMDAwMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDb3VudCBwYXJhbWV0ZXJzIChyb3V0ZXMgd2l0aCBmZXdlciBwYXJhbXMgY29tZSBmaXJzdClcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtQ291bnQgPSAocm91dGVQYXRoLm1hdGNoKC86L2cpIHx8IFtdKS5sZW5ndGhcbiAgICAgICAgICAgIHNvcnRLZXkgKz0gcGFyYW1Db3VudCAqIDEwMDAwXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvdW50IHNlZ21lbnRzIChyb3V0ZXMgd2l0aCBtb3JlIHNlZ21lbnRzIGNvbWUgZmlyc3QsIHNvIHdlIHN1YnRyYWN0KVxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudENvdW50ID0gcm91dGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKHMgPT4gcykubGVuZ3RoXG4gICAgICAgICAgICBzb3J0S2V5IC09IHNlZ21lbnRDb3VudCAqIDEwMFxuICAgICAgICAgICAgXG4gICAgICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIHNvcnRLZXksXG4gICAgICAgICAgICAgICAgbW9kdWxlOiB0aGlzLm1vZHVsZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFNvcnQgcm91dGVzIGJ5IHNwZWNpZmljaXR5IChsb3dlciBzb3J0S2V5ID0gbW9yZSBzcGVjaWZpYyA9IHJlZ2lzdGVyZWQgZmlyc3QpXG4gICAgICAgIHJvdXRlcy5zb3J0KChhLCBiKSA9PiBhLnNvcnRLZXkgLSBiLnNvcnRLZXkpXG5cbiAgICAgICAgdGhpcy5yb3V0ZXMgPSByb3V0ZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJSb3V0ZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5yb3V0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdSb3V0ZXIgaW5zdGFuY2Ugbm90IHNldCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2R1bGVOYW1lID0gdGhpcy5tb2R1bGUgfHwgJ3Vua25vd24nXG5cbiAgICAgICAgY29uc3QgaG9vayA9IGZ1bmN0aW9uKHJvdXRlOiBSb3V0ZSl7XG4gICAgICAgICAgICByb3V0ZS5tZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAuLi5yb3V0ZS5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvdXRlci5vbignYWRkZWQnLCBob29rKVxuXG4gICAgICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlTW9kdWxlID0gYXdhaXQgaW1wb3J0KGAke3RoaXMuZGlyZWN0b3J5fS8ke3JvdXRlLmZpbGV9YClcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZU1vZHVsZS5kZWZhdWx0XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFJvdXRlIGZpbGUgJHtyb3V0ZS5maWxlfSBkb2VzIG5vdCBleHBvcnQgYSBkZWZhdWx0IGZ1bmN0aW9uYClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvdXRlcltyb3V0ZS5tZXRob2RdKHJvdXRlLnJvdXRlUGF0aCwgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucm91dGVyLm9mZignYWRkZWQnLCBob29rKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCl7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsZXMoKVxuICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUm91dGVzKClcblxuICAgIH1cbn1cbiIsImltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCB0eXBlIHsgSGFuZGxlciwgIE1pZGRsZXdhcmUgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Sb3V0ZXJDb250cmFjdC50cydcblxudHlwZSBSb3V0ZU1ldGhvZCA9ICdnZXQnIFxuICAgIHwgJ0dFVCcgXG4gICAgfCAncG9zdCcgXG4gICAgfCAnUE9TVCcgXG4gICAgfCAncHV0JyBcbiAgICB8ICdQVVQnIFxuICAgIHwgJ3BhdGNoJyBcbiAgICB8ICdQQVRDSCcgXG4gICAgfCAnZGVsZXRlJyBcbiAgICB8ICdERUxFVEUnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlIHtcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nID0gJydcbiAgICBwdWJsaWMgbWV0aG9kOiBSb3V0ZU1ldGhvZCA9ICdnZXQnXG4gICAgcHVibGljIGhhbmRsZXI6IEhhbmRsZXI8YW55PiB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG1pZGRsZXdhcmVzOiBNaWRkbGV3YXJlW10gPSBbXVxuICAgIHB1YmxpYyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSB7fVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxSb3V0ZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnBhdGggPSBkYXRhLnBhdGggfHwgJydcbiAgICAgICAgdGhpcy5tZXRob2QgPSBkYXRhLm1ldGhvZCB8fCAnZ2V0J1xuICAgICAgICB0aGlzLmhhbmRsZXIgPSBkYXRhLmhhbmRsZXIgfHwgbnVsbFxuICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gZGF0YS5taWRkbGV3YXJlcyB8fCBbXVxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gZGF0YS5tZXRhZGF0YSB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGFyYW1zKHJvdXRlUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlUGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudHMgPSByZXF1ZXN0UGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gcm91dGVTZWdtZW50c1tpXVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSByZXF1ZXN0U2VnbWVudHNbaV1cblxuICAgICAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgLy8gUmVtb3ZlIHRoZSAnOicgcHJlZml4XG4gICAgICAgICAgICAgICAgcGFyYW1zW3BhcmFtTmFtZV0gPSByZXF1ZXN0U2VnbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIGFsbCByZW1haW5pbmcgc2VnbWVudHMgYXMgYSBzaW5nbGUgcGF0aFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1NlZ21lbnRzID0gcmVxdWVzdFNlZ21lbnRzLnNsaWNlKGkpXG4gICAgICAgICAgICAgICAgcGFyYW1zWycqJ10gPSByZW1haW5pbmdTZWdtZW50cy5qb2luKCcvJylcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtc1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcXVlcnkocmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcmVxdWVzdFBhdGguc3BsaXQoJz8nKVsxXVxuXG4gICAgICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgICAgICAgbWlkZGxld2FyZXM6IHRoaXMubWlkZGxld2FyZXMubWFwKG13ID0+IG13LmNvbnN0cnVjdG9yLm5hbWUpLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGFcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXIge1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbWl0SG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgeyAgICAgICAgICAgICAgICBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMuZmlsdGVyKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50KSkge1xuICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Ib29rKGNvbnN0cnVjdG9yOiBhbnksIGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGNvbnN0IGV4aXN0cyA9IGxpc3RlbmVycy5maW5kKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICBldmVudCxcbiAgICAgICAgbGlzdGVuZXIgXG4gICAgfSlcblxuICAgIGNvbnN0cnVjdG9yLmxpc3RlbmVycyA9IGxpc3RlbmVyc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSG9va3NTdGF0aWM8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdC5hcHBseSh0aGlzLmNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBsaXN0ZW5lcnMgPSBbXSBhcyBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gb25Ib29rKHRoaXMsIGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRIb29rKHRoaXMsIGV2ZW50LCAuLi5hcmdzKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBIb29rczxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgbGlzdGVuZXJzOiBMaXN0ZW5lcltdXG5cbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGxpc3RlbmVyIFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVycy5maW5kSW5kZXgoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcHVibGljIGFzeW5jIGVtaXRBc3luYyhldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuSG9va3NTdGF0aWMuZW1pdCA9IGVtaXRIb29rXG5Ib29rc1N0YXRpYy5vbiA9IG9uSG9va1xuIiwiaW1wb3J0IHsgam9pbiB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCBSb3V0ZSBmcm9tICcjc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyLCBNaWRkbGV3YXJlLCBNaWRkbGV3YXJlSGFuZGxlUmVzdWx0IH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvUm91dGVyQ29udHJhY3QudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEhvb2tzIGZyb20gJyNzaGFyZWQvbWl4aW5zL0hvb2tzTWl4aW4udHMnXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcblxudHlwZSBSb3V0ZUNvbnRleHQgPSAnZ2xvYmFsJyB8ICdncm91cCcgfCAncm91dGUnXG5cbmludGVyZmFjZSBNaWRkbGV3YXJlUmVnaXN0ZXIge1xuICAgIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmVcbiAgICBjb250ZXh0OiBSb3V0ZUNvbnRleHRcbn1cblxuaW50ZXJmYWNlIExvYWRPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyPEMgPSB7fT4gZXh0ZW5kcyBjb21wb3NlKEhvb2tzKSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnUm91dGVyU2VydmljZSdcblxuICAgIHB1YmxpYyByb3V0ZXM6IFJvdXRlW10gPSBbXVxuXG4gICAgcHVibGljIG1pZGRsZXdhcmVzOiBNaWRkbGV3YXJlUmVnaXN0ZXJbXSA9IFtdXG4gICAgcHVibGljIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBwdWJsaWMgZ3JvdXBzOiBSb3V0ZXI8YW55PltdID0gW11cbiAgICBwdWJsaWMgZ3JvdXBQcmVmaXhlczogc3RyaW5nW10gPSBbXVxuXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyID0gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIHB1YmxpYyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFJvdXRlcjxDPj4gPSB7fSkge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMucm91dGVzID0gZGF0YS5yb3V0ZXMgfHwgW11cbiAgICAgICAgdGhpcy5taWRkbGV3YXJlcyA9IGRhdGEubWlkZGxld2FyZXMgfHwgW11cbiAgICAgICAgdGhpcy5wcmVmaXhlcyA9IGRhdGEucHJlZml4ZXMgfHwgW11cbiAgICAgICAgdGhpcy5ncm91cHMgPSBkYXRhLmdyb3VwcyB8fCBbXVxuICAgICAgICB0aGlzLmdyb3VwUHJlZml4ZXMgPSBkYXRhLmdyb3VwUHJlZml4ZXMgfHwgW11cbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgfHwge31cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBkYXRhLmxpc3RlbmVycyB8fCBbXVxuICAgIH1cblxuICAgIHB1YmxpYyB1c2U8VCBleHRlbmRzIE1pZGRsZXdhcmU+KG1pZGRsZXdhcmU6IFQsIGNvbnRleHQ6IFJvdXRlQ29udGV4dCA9ICdyb3V0ZScpIHtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlcy5wdXNoKHtcbiAgICAgICAgICAgIG1pZGRsZXdhcmUsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiB0aGlzIGFzIFJvdXRlcjxDICYgTWlkZGxld2FyZUhhbmRsZVJlc3VsdDxbdHlwZW9mIG1pZGRsZXdhcmVdPj5cbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlZml4KHByZWZpeDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucHJlZml4ZXMucHVzaChwcmVmaXgpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFrZVBhdGgoYXJnczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGpvaW4oWy4uLnRoaXMuZ3JvdXBQcmVmaXhlcywgLi4udGhpcy5wcmVmaXhlcywgYXJnc10sICcvJylcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKHBheWxvYWQ6IFBpY2s8Um91dGUsICdwYXRoJyB8ICdtZXRob2QnIHwgJ2hhbmRsZXInPikge1xuICAgICAgICBjb25zdCByb3V0ZSA9IG5ldyBSb3V0ZSh7XG4gICAgICAgICAgICBtZXRob2Q6IHBheWxvYWQubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogdGhpcy5tYWtlUGF0aChwYXlsb2FkLnBhdGgpLFxuICAgICAgICAgICAgaGFuZGxlcjogcGF5bG9hZC5oYW5kbGVyLFxuICAgICAgICAgICAgbWlkZGxld2FyZXM6IHRoaXMubWlkZGxld2FyZXMubWFwKG0gPT4gbS5taWRkbGV3YXJlKSxcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gdGhpcy5taWRkbGV3YXJlcy5maWx0ZXIobSA9PiBtLmNvbnRleHQgIT09ICdyb3V0ZScpXG5cbiAgICAgICAgdGhpcy5wcmVmaXhlcyA9IFtdIC8vIFJlc2V0IHByZWZpeGVzIGFmdGVyIHVzZVxuXG4gICAgICAgIHRoaXMucm91dGVzLnB1c2gocm91dGUpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhZGRlZCByb3V0ZScsIHJvdXRlKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0KCdhZGRlZCcsIHJvdXRlKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KSB7XG4gICAgICAgIHRoaXMuYWRkKHtcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcG9zdChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXI8Qz4pIHtcbiAgICAgICAgdGhpcy5hZGQoe1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcHV0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPikge1xuICAgICAgICB0aGlzLmFkZCh7XG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHBhdGNoKHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPikge1xuICAgICAgICB0aGlzLmFkZCh7XG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFueShtZXRob2RzOiBSb3V0ZVsnbWV0aG9kJ11bXSwgcGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KSB7XG4gICAgICAgIG1ldGhvZHMuZm9yRWFjaChtZXRob2QgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGQoe1xuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KSB7XG4gICAgICAgIHRoaXMuYWRkKHtcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfSlcbiAgICB9XG5cblxuICAgIHB1YmxpYyBncm91cCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgUm91dGVyPEM+KHtcbiAgICAgICAgICAgIGxpc3RlbmVyczogdGhpcy5saXN0ZW5lcnMsIC8vIEluaGVyaXQgbGlzdGVuZXJzIGZyb20gcGFyZW50XG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyxcbiAgICAgICAgfSlcblxuICAgICAgICBncm91cC5ncm91cFByZWZpeGVzID0gdGhpcy5wcmVmaXhlcyAvLyBJbmhlcml0IHByZWZpeGVzIGZyb20gcGFyZW50XG4gICAgICAgIGdyb3VwLm1pZGRsZXdhcmVzID0gdGhpcy5taWRkbGV3YXJlcy5tYXAociA9PiAoe1xuICAgICAgICAgICAgbWlkZGxld2FyZTogci5taWRkbGV3YXJlLFxuICAgICAgICAgICAgY29udGV4dDogJ2dyb3VwJ1xuICAgICAgICB9KSlcblxuICAgICAgICB0aGlzLmdyb3Vwcy5wdXNoKGdyb3VwKVxuXG4gICAgICAgIHRoaXMubWlkZGxld2FyZXMgPSB0aGlzLm1pZGRsZXdhcmVzLmZpbHRlcihtID0+IG0uY29udGV4dCAhPT0gJ3JvdXRlJylcbiAgICAgICAgdGhpcy5wcmVmaXhlcyA9IFtdIC8vIFJlc2V0IHByZWZpeGVzIGFmdGVyIHVzZVxuXG4gICAgICAgIHJldHVybiBncm91cFxuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlKG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmxpc3QoKVxuICAgICAgICAgICAgLmZpbmQociA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHIubWV0aG9kLnRvVXBwZXJDYXNlKCkgIT09IG1ldGhvZC50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoUGF0aChyLnBhdGgsIHBhdGgpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGlmICghcm91dGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm91dGVcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZShyb3V0ZTogUm91dGUsIGluaXRpYWxDdHg6IGFueSkge1xuICAgICAgICBpZiAoIXJvdXRlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgaGFuZGxlciBub3QgZm91bmQgZm9yICR7cm91dGUubWV0aG9kfSAke3JvdXRlLnBhdGh9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHsgLi4uaW5pdGlhbEN0eCB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBtaWRkbGV3YXJlIG9mIHJvdXRlLm1pZGRsZXdhcmVzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtaWRkbGV3YXJlLmhhbmRsZShjdHgpXG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgJ3JlZGlyZWN0JyBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY3R4LCByZXN1bHQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm91dGUuaGFuZGxlcihjdHgpXG4gICAgfVxuXG4gICAgcHVibGljIG1hdGNoUGF0aChyb3V0ZVBhdGg6IHN0cmluZywgcmVxdWVzdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBTcGxpdCBwYXRocyBpbnRvIHNlZ21lbnRzXG4gICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudHMgPSByb3V0ZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnRzID0gcmVxdWVzdFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcblxuICAgICAgICAvLyBDaGVjayBlYWNoIHNlZ21lbnRcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2ldXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudCA9IHJlcXVlc3RTZWdtZW50c1tpXVxuXG4gICAgICAgICAgICAvLyBJZiByb3V0ZSBzZWdtZW50IGlzIGEgd2lsZGNhcmQgKCopLCBpdCBtYXRjaGVzIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHBvaW50XG4gICAgICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSd2ZSBydW4gb3V0IG9mIHJlcXVlc3Qgc2VnbWVudHMgYnV0IHN0aWxsIGhhdmUgcm91dGUgc2VnbWVudHMsIG5vIG1hdGNoXG4gICAgICAgICAgICBpZiAoaSA+PSByZXF1ZXN0U2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHJvdXRlIHNlZ21lbnQgaXMgYSBwYXJhbWV0ZXIgKHN0YXJ0cyB3aXRoIDopLCBpdCBtYXRjaGVzIGFueSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNlZ21lbnRzIG11c3QgbWF0Y2ggZXhhY3RseVxuICAgICAgICAgICAgaWYgKHJvdXRlU2VnbWVudCAhPT0gcmVxdWVzdFNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgbW9yZSByZXF1ZXN0IHNlZ21lbnRzIHRoYW4gcm91dGUgc2VnbWVudHMgKGFuZCBubyB3aWxkY2FyZCksIG5vIG1hdGNoXG4gICAgICAgIGlmIChyZXF1ZXN0U2VnbWVudHMubGVuZ3RoID4gcm91dGVTZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY2xlYXInLCB7IGNvdW50OiB0aGlzLnJvdXRlcy5sZW5ndGggfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucm91dGVzID0gW11cbiAgICAgICAgdGhpcy5ncm91cHMgPSBbXVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXMuY29uY2F0KC4uLnRoaXMuZ3JvdXBzLm1hcChnID0+IGcucm91dGVzKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zOiBMb2FkT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IHRoaXMuZGVidWdcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3NlcnZpY2UgbG9hZGVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRTeW5jKG9wdGlvbnM6IExvYWRPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Zygnc2VydmljZSBsb2FkZWQgaW4gZGVidWcgbW9kZScpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgbG9nZ2VyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9sb2dnZXIudHMnXG5pbXBvcnQgdHlwZSBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCBTaGVsbEV4ZWNwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvU2hlbGxFeGNlcHRpb24udHMnXG5cbmludGVyZmFjZSBDb21tYW5kT3B0aW9ucyB7XG4gICAgY3dkPzogc3RyaW5nXG4gICAgZW52PzogTm9kZUpTLlByb2Nlc3NFbnZcbiAgICBzaGVsbD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlbGxTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdTaGVsbFNlcnZpY2UnXG5cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW5cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBwdWJsaWMgaW5pdChkYXRhOiBQYXJ0aWFsPFNoZWxsU2VydmljZT4gPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IGxvZ2dlci5jaGlsZCh7IGxhYmVsOiAnc2hlbGwnIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm4gYSBwcm9taXNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbW1hbmQoYmluOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBDb21tYW5kT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKGJpbiwgYXJncywge1xuICAgICAgICAgICAgICAgIGN3ZDogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgICAgICAgICAgIHNoZWxsOiBvcHRpb25zLnNoZWxsID8/IHRydWUsXG4gICAgICAgICAgICAgICAgZW52OiBvcHRpb25zLmVudiB8fCBwcm9jZXNzLmVudlxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbGV0IGRhdGEgPSAnJ1xuXG4gICAgICAgICAgICBjaGlsZC5zdGRvdXQ/Lm9uKCdkYXRhJywgKGQpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhICs9IGQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIChkKSA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YSArPSBkLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNoaWxkLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2NvbW1hbmQgZXhlY3V0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBDb21tYW5kIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2NvZGV9YFxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlLCB7XG4gICAgICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBkYXRhXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgU2hlbGxFeGVjcHRpb24oZXJyb3JNZXNzYWdlLCBkYXRhLCBiaW4sIGFyZ3MpKVxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ29tbWFuZCBleGVjdXRpb24gZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGEgc2hlbGwgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBvdXRwdXQgYXMgYSBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUNvbW1hbmRXaXRoT3V0cHV0KGJpbjogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogQ29tbWFuZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZXhlY3V0aW5nIGNvbW1hbmQnLCB7XG4gICAgICAgICAgICAgICAgYmluLFxuICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKGJpbiwgYXJncywge1xuICAgICAgICAgICAgICAgIGN3ZDogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgICAgICAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudjogb3B0aW9ucy5lbnYgfHwgcHJvY2Vzcy5lbnZcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGxldCBvdXRwdXQgPSAnJ1xuICAgICAgICAgICAgbGV0IGVycm9yT3V0cHV0ID0gJydcblxuICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgZXJyb3JPdXRwdXQgKz0gZGF0YS50b1N0cmluZygpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjaGlsZC5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3V0cHV0LnRyaW0oKSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgQ29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtjb2RlfTogJHtlcnJvck91dHB1dH1gXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmluLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck91dHB1dFxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgU2hlbGxFeGVjcHRpb24oZXJyb3JNZXNzYWdlLCBvdXRwdXQsIGJpbiwgYXJncykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0NvbW1hbmQgZXhlY3V0aW9uIGVycm9yJywge1xuICAgICAgICAgICAgICAgICAgICBiaW4sXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbjxUID0gYW55PiB7XG4gICAgaXRlbXM6IFRbXVxuICAgIHBhZ2U6IG51bWJlclxuICAgIHBlcl9wYWdlOiBudW1iZXJcbiAgICB0b3RhbDogbnVtYmVyXG4gICAgdG90YWxfcGFnZXM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRNYW55T3B0aW9ucyB7XG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvZmZzZXQ/OiBudW1iZXJcbiAgICBvcmRlckJ5Pzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBvcmRlckRpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnIHwgKCdhc2MnIHwgJ2Rlc2MnKVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVPcHRpb25zIHtcbiAgICBwYWdlPzogbnVtYmVyXG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckJ5PzogRmluZE1hbnlPcHRpb25zWydvcmRlckJ5J11cbiAgICBvcmRlckRpcmVjdGlvbj86IEZpbmRNYW55T3B0aW9uc1snb3JkZXJEaXJlY3Rpb24nXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZU1hbnlPcHRpb25zIHtcbiAgICBsaW1pdD86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhYmFzZVJlcG9zaXRvcnk8XG4gICAgVEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVFByaW1hcnlLZXkgPSBhbnksXG4gICAgVE9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIGRiOiBLeXNlbHk8YW55PiwgXG4gICAgICAgIHByb3RlY3RlZCB0YWJsZTogc3RyaW5nLCBcbiAgICAgICAgcHJvdGVjdGVkIHByaW1hcnlLZXk6IHN0cmluZ1xuICAgICkgeyAgICB9XG5cblxuICAgIHB1YmxpYyBxdWVyeShvcHRpb25zPzogeyBxYj86IGFueSB9ICYgVE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcWIgPSBvcHRpb25zPy5xYiB8fCB0aGlzLmRiLnNlbGVjdEZyb20odGhpcy50YWJsZSBhcyBhbnkpXG5cbiAgICAgICAgcmV0dXJuIHFiXG4gICAgfVxuXG4gICAgYXN5bmMgY291bnQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgbGV0IHFiID0gdGhpcy5xdWVyeShvcHRpb25zIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi5zZWxlY3QoKGViOiBhbnkpID0+IGViLmZuLmNvdW50QWxsKCkuYXMoJ2NvdW50JykpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuXG4gICAgICAgIHJldHVybiBOdW1iZXIocmVzdWx0LmNvdW50KVxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRNYW55KG9wdGlvbnM/OiBGaW5kTWFueU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkob3B0aW9ucykgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi5zZWxlY3RBbGwoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5saW1pdCkge1xuICAgICAgICAgICAgcWIgPSBxYi5saW1pdChvcHRpb25zLmxpbWl0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lm9mZnNldCkge1xuICAgICAgICAgICAgcWIgPSBxYi5vZmZzZXQob3B0aW9ucy5vZmZzZXQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8ub3JkZXJCeSkge1xuICAgICAgICAgICAgY29uc3Qgb3JkZXJCeSA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcmRlckJ5KSA/IG9wdGlvbnMub3JkZXJCeSA6IFtvcHRpb25zLm9yZGVyQnldXG4gICAgICAgICAgICBjb25zdCBvcmRlckRpcmVjdGlvbiA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcmRlckRpcmVjdGlvbikgPyBvcHRpb25zLm9yZGVyRGlyZWN0aW9uIDogW29wdGlvbnMub3JkZXJEaXJlY3Rpb24gPz8gJ2FzYyddXG5cbiAgICAgICAgICAgIG9yZGVyQnkuZm9yRWFjaCgob2IsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcWIgPSBxYi5vcmRlckJ5KG9iLCBvcmRlckRpcmVjdGlvbltpbmRleF0gfHwgJ2FzYycpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHFiLmV4ZWN1dGUoKVxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRPbmUob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgICAgICBsZXQgcWIgPSB0aGlzLnF1ZXJ5KG9wdGlvbnMgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnNlbGVjdEFsbCgpXG5cbiAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IHFiLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgYXN5bmMgZmluZEJ5SWQoaWQ6IFRQcmltYXJ5S2V5LCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkob3B0aW9ucyBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIuc2VsZWN0QWxsKClcblxuICAgICAgICBxYiA9IHFiLndoZXJlKHRoaXMucHJpbWFyeUtleSwgJz0nLCBpZClcblxuICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9XG5cbiAgICBhc3luYyBmaW5kQnlJZE9yRmFpbChpZDogVFByaW1hcnlLZXksIG9wdGlvbnM/OiBUT3B0aW9ucykge1xuICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy5maW5kQnlJZChpZCwgb3B0aW9ucylcblxuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdJdGVtIG5vdCBmb3VuZCcsIDQwNClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHBhZ2luYXRlKG9wdGlvbnM/OiBQYWdpbmF0ZU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8UGFnaW5hdGlvbj4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSA/PyAxXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IChwYWdlIC0gMSkgKiAob3B0aW9ucz8ubGltaXQgPz8gMTApXG4gICAgICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQgPz8gMTBcblxuICAgICAgICBjb25zdCBmaW5kQWxsT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIG9mZnNldFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRPcHRpb25zID0geyAuLi5vcHRpb25zIH1cblxuICAgICAgICBjb25zdCBbaXRlbXMsIHRvdGFsSXRlbXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy5maW5kTWFueShmaW5kQWxsT3B0aW9ucyBhcyBhbnkpLFxuICAgICAgICAgICAgdGhpcy5jb3VudChjb3VudE9wdGlvbnMgYXMgYW55KVxuICAgICAgICBdKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICBwZXJfcGFnZTogbGltaXQsXG4gICAgICAgICAgICB0b3RhbDogdG90YWxJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsX3BhZ2VzOiBNYXRoLmNlaWwodG90YWxJdGVtcyAvIGxpbWl0KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+KSB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMuZGIuaW5zZXJ0SW50byh0aGlzLnRhYmxlIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi52YWx1ZXMoZGF0YSkucmV0dXJuaW5nQWxsKClcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgICAgICByZXR1cm4gcmVzdWx0IGFzIGFueVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjcmVhdGVNYW55KGRhdGE6IFBhcnRpYWw8VEVudGl0eT5bXSkge1xuICAgICAgICBsZXQgcWIgPSB0aGlzLmRiLmluc2VydEludG8odGhpcy50YWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIudmFsdWVzKGRhdGEpLnJldHVybmluZ0FsbCgpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcWIuZXhlY3V0ZSgpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBhbnlbXVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGVCeUlkKGlkOiBUUHJpbWFyeUtleSwgZGF0YTogUGFydGlhbDxURW50aXR5Pikge1xuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmZpbmRCeUlkT3JGYWlsKGlkKVxuXG4gICAgICAgIGxldCBxYiA9IHRoaXMuZGIudXBkYXRlVGFibGUodGhpcy50YWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIuc2V0KGRhdGEpXG4gICAgICAgICAgICAud2hlcmUodGhpcy5wcmltYXJ5S2V5LCAnPScsIHJvd1t0aGlzLnByaW1hcnlLZXldKVxuICAgICAgICAgICAgLnJldHVybmluZ0FsbCgpXG5cbiAgICAgICAgYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbGV0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5KSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuZmluZEJ5SWRPckZhaWwoaWQpXG5cbiAgICAgICAgbGV0IHFiID0gdGhpcy5kYi5kZWxldGVGcm9tKHRoaXMudGFibGUgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLndoZXJlKHRoaXMucHJpbWFyeUtleSwgJz0nLCByb3dbdGhpcy5wcmltYXJ5S2V5XSlcblxuICAgICAgICBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0KClcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVNYW55KG9wdGlvbnM/OiBEZWxldGVNYW55T3B0aW9ucyAmIFRPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgcWI6IHRoaXMuZGIuZGVsZXRlRnJvbSh0aGlzLnRhYmxlIGFzIGFueSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkoZGVsZXRlT3B0aW9ucyBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5saW1pdCkge1xuICAgICAgICAgICAgcWIgPSBxYi5saW1pdChvcHRpb25zLmxpbWl0KVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgcWIuZXhlY3V0ZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb25Bc3NpZ25tZW50IH0gZnJvbSAnI3NoYXJlZC9zY2hlbWFzL3Blcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucyB7XG4gICAgaWQ/OiBudW1iZXIgfCBudW1iZXJbXVxuICAgIHBlcm1pc3Npb25JZD86IG51bWJlciB8IG51bWJlcltdXG4gICAgYXNzaWduYWJsZUlkPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBhc3NpZ25hYmxlVHlwZT86IHN0cmluZyB8IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeSBleHRlbmRzIERhdGFiYXNlUmVwb3NpdG9yeTxcbiAgICBQZXJtaXNzaW9uQXNzaWdubWVudCxcbiAgICBQZXJtaXNzaW9uQXNzaWdubWVudFsnaWQnXSxcbiAgICBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnlRdWVyeU9wdGlvbnNcbj4ge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICdwZXJtaXNzaW9uc19hc3NpZ25tZW50cycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM/OiBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnlRdWVyeU9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHFiID0gc3VwZXIucXVlcnkob3B0aW9ucyBhcyBhbnkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmlkKSB7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaWQpID8gb3B0aW9ucy5pZCA6IFtvcHRpb25zLmlkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdpZCcsICdpbicsIGlkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5wZXJtaXNzaW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb25JZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMucGVybWlzc2lvbklkKSA/IG9wdGlvbnMucGVybWlzc2lvbklkIDogW29wdGlvbnMucGVybWlzc2lvbklkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdwZXJtaXNzaW9uX2lkJywgJ2luJywgcGVybWlzc2lvbklkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5hc3NpZ25hYmxlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbmFibGVJZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuYXNzaWduYWJsZUlkKSA/IG9wdGlvbnMuYXNzaWduYWJsZUlkIDogW29wdGlvbnMuYXNzaWduYWJsZUlkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdhc3NpZ25hYmxlX2lkJywgJ2luJywgYXNzaWduYWJsZUlkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5hc3NpZ25hYmxlVHlwZSkge1xuICAgICAgICAgICAgY29uc3QgYXNzaWduYWJsZVR5cGVzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmFzc2lnbmFibGVUeXBlKSA/IG9wdGlvbnMuYXNzaWduYWJsZVR5cGUgOiBbb3B0aW9ucy5hc3NpZ25hYmxlVHlwZV1cblxuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnYXNzaWduYWJsZV90eXBlJywgJ2luJywgYXNzaWduYWJsZVR5cGVzKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHFiXG4gICAgfVxufVxuIiwiaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb24gfSBmcm9tICcjc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cydcblxuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucyB7XG4gICAgaWQ/OiBudW1iZXIgfCBudW1iZXJbXVxuICAgIHNlYXJjaD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJtaXNzaW9uUmVwb3NpdG9yeSBleHRlbmRzIERhdGFiYXNlUmVwb3NpdG9yeTxcbiAgICBQZXJtaXNzaW9uLFxuICAgIFBlcm1pc3Npb25bJ2lkJ10sXG4gICAgUGVybWlzc2lvblJlcG9zaXRvcnlRdWVyeU9wdGlvbnNcbj4ge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICdwZXJtaXNzaW9ucycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM/OiBQZXJtaXNzaW9uUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucykge1xuICAgICAgICBsZXQgcWIgPSBzdXBlci5xdWVyeShvcHRpb25zIGFzIGFueSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pZCkgPyBvcHRpb25zLmlkIDogW29wdGlvbnMuaWRdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2lkJywgJ2luJywgaWRzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnNlYXJjaCkge1xuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnbmFtZScsICdsaWtlJywgYCUke29wdGlvbnMuc2VhcmNofSVgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHFiXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGaW5kTWFueU9wdGlvbnMsIFBhZ2luYXRlT3B0aW9ucywgUGFnaW5hdGlvbiB9IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cydcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlcG9zaXRvcnlUeXBlczxURW50aXR5ID0gUmVjb3JkPHN0cmluZywgYW55PiwgVFByaW1hcnlLZXlUeXBlID0gYW55LCBUT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb3VudChvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj5cblxuICAgIGZpbmRNYW55KG9wdGlvbnM/OiBUT3B0aW9ucyAmIEZpbmRNYW55T3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPlxuICAgIGZpbmRCeUlkKGlkOiBUUHJpbWFyeUtleVR5cGUsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+XG4gICAgZmluZEJ5SWRPckZhaWwoaWQ6IFRQcmltYXJ5S2V5VHlwZSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5PlxuXG4gICAgcGFnaW5hdGUob3B0aW9ucz86IFRPcHRpb25zICYgUGFnaW5hdGVPcHRpb25zKTogUHJvbWlzZTxQYWdpbmF0aW9uPlxuXG4gICAgY3JlYXRlKGRhdGE6IFBhcnRpYWw8VEVudGl0eT4sIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eT5cbiAgICBjcmVhdGVNYW55KGRhdGE6IFBhcnRpYWw8VEVudGl0eT5bXSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5W10+IFxuXG4gICAgZGVsZXRlQnlJZChpZDogVFByaW1hcnlLZXlUeXBlKTogUHJvbWlzZTx2b2lkPlxuICAgIGRlc3Ryb3lNYW55KG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8dm9pZD5cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRGF0YWJhc2VSZXBvc2l0b3J5SW5mZXJNaXhpbjxURW50aXR5ID0gUmVjb3JkPHN0cmluZywgYW55PiwgVFByaW1hcnlLZXlUeXBlID0gYW55LCBUT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIGFueT4+KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiA8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICAgICAgYWJzdHJhY3QgY2xhc3MgT3B0aW9uc01peGluIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgICAgICAvLyBXZSBcImRlY2xhcmVcIiB0aGVzZSBtZXRob2RzIHNvIHRoZXkgZXhpc3QgaW4gdGhlIHR5cGUgc3BhY2VcbiAgICAgICAgICAgIC8vIGZvciB0aGlzIHNwZWNpZmljIFRPcHRpb25zLCB3aXRob3V0IG92ZXJyaWRpbmcgdGhlIGxvZ2ljLlxuICAgICAgICAgICAgYWJzdHJhY3QgY291bnQob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+XG5cbiAgICAgICAgICAgIGFic3RyYWN0IGZpbmRNYW55KG9wdGlvbnM/OiBUT3B0aW9ucyAmIEZpbmRNYW55T3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPlxuICAgICAgICAgICAgYWJzdHJhY3QgZmluZEJ5SWQoaWQ6IFRQcmltYXJ5S2V5VHlwZSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD5cbiAgICAgICAgICAgIGFic3RyYWN0IGZpbmRCeUlkT3JGYWlsKGlkOiBUUHJpbWFyeUtleVR5cGUsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eT5cblxuICAgICAgICAgICAgYWJzdHJhY3QgcGFnaW5hdGUob3B0aW9ucz86IFRPcHRpb25zICYgUGFnaW5hdGVPcHRpb25zKTogUHJvbWlzZTx7IGl0ZW1zOiBURW50aXR5W107IHRvdGFsOiBudW1iZXIgfT5cblxuICAgICAgICAgICAgYWJzdHJhY3QgY3JlYXRlKGRhdGE6IFBhcnRpYWw8VEVudGl0eT4sIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eT5cbiAgICAgICAgICAgIGFic3RyYWN0IGNyZWF0ZU1hbnkoZGF0YTogUGFydGlhbDxURW50aXR5PltdLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHlbXT5cblxuICAgICAgICAgICAgYWJzdHJhY3QgZGVsZXRlQnlJZChpZDogVFByaW1hcnlLZXlUeXBlKTogUHJvbWlzZTx2b2lkPlxuICAgICAgICAgICAgYWJzdHJhY3QgZGVzdHJveU1hbnkob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTx2b2lkPlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9wdGlvbnNNaXhpbiBhcyBUQmFzZSAmIENvbnN0cnVjdG9yPElSZXBvc2l0b3J5VHlwZXM8VEVudGl0eSwgVFByaW1hcnlLZXlUeXBlLCBUT3B0aW9ucz4+XG4gICAgfVxufVxuIiwiaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeUluZmVyIGZyb20gJyNzZXJ2ZXIvbWl4aW5zL0RhdGFiYXNlUmVwb3NpdG9yeUluZmVyTWl4aW4udHMnXG5pbXBvcnQgRGF0YWJhc2VSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cydcbmltcG9ydCB7IGNvbXBvc2UsIG1peGluIH0gZnJvbSAnI3NoYXJlZC91dGlscy9pbmRleC50cydcbmltcG9ydCB0eXBlIHsgVG9rZW4gfSBmcm9tICcjc2hhcmVkL3NjaGVtYXMvdG9rZW5TY2hlbWEudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXBvc2l0b3J5UXVlcnlPcHRpb25zIHtcbiAgICBpZD86IG51bWJlciB8IG51bWJlcltdXG4gICAgc2VhcmNoPzogc3RyaW5nIFxuICAgIHR5cGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2tlblJlcG9zaXRvcnkgZXh0ZW5kcyBjb21wb3NlKFxuICAgIG1peGluKERhdGFiYXNlUmVwb3NpdG9yeSksXG4gICAgRGF0YWJhc2VSZXBvc2l0b3J5SW5mZXI8VG9rZW4sIFRva2VuWydpZCddLCBUb2tlblJlcG9zaXRvcnlRdWVyeU9wdGlvbnM+KClcbikge1xuXG4gICAgY29uc3RydWN0b3IoZGI6IERhdGFiYXNlUmVwb3NpdG9yeVsnZGInXSkge1xuICAgICAgICBzdXBlcihkYiwgJ3Rva2VucycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM/OiBUb2tlblJlcG9zaXRvcnlRdWVyeU9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHFiID0gc3VwZXIucXVlcnkob3B0aW9ucyBhcyBhbnkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmlkKSB7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaWQpID8gb3B0aW9ucy5pZCA6IFtvcHRpb25zLmlkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdpZCcsICdpbicsIGlkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zZWFyY2gpIHtcbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ25hbWUnLCAnbGlrZScsIGAlJHtvcHRpb25zLnNlYXJjaH0lYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy50eXBlKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy50eXBlKSA/IG9wdGlvbnMudHlwZSA6IFtvcHRpb25zLnR5cGVdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ3R5cGUnLCAnaW4nLCB0eXBlcylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxYlxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kQnlUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxUb2tlbiB8IG51bGw+IHtcbiAgICAgICAgbGV0IHFiID0gdGhpcy5xdWVyeSgpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIuc2VsZWN0QWxsKClcblxuICAgICAgICBxYiA9IHFiLndoZXJlKCd0b2tlbicsICc9JywgdG9rZW4pXG5cbiAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IHFiLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgICAgIHJldHVybiBpdGVtIHx8IG51bGxcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBleGVjIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgd3JpdGVGaWxlLCB1bmxpbmsgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcblxuY29uc3QgZXhlY0FzeW5jID0gcHJvbWlzaWZ5KGV4ZWMpXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0UmVwb0luZm8ge1xuICAgIGRpcmVjdG9yeTogc3RyaW5nXG4gICAgaGVhZDogc3RyaW5nIHwgbnVsbFxuICAgIHNob3J0SGFzaDogc3RyaW5nXG4gICAgaXNEZXRhY2hlZEhlYWQ6IGJvb2xlYW5cbiAgICByZW1vdGVzOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEdhdGV3YXlPcHRpb25zIHtcbiAgICBjd2Q6IHN0cmluZ1xuICAgIHNzaEtleT86IHN0cmluZ1xuICAgIHNzaEtleUZpbGU/OiBzdHJpbmdcbiAgICBzc2hLZXlUbXBGaWxlTmFtZT86IHN0cmluZ1xuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gZXNjYXBlU2hlbGxBcmd1bWVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCcke3ZhbHVlLnJlcGxhY2UoLycvZywgYCdcXFxcJydgKX0nYFxufVxuXG5leHBvcnQgY2xhc3MgR2l0R2F0ZXdheSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjd2Q6IHN0cmluZ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3NoS2V5Pzogc3RyaW5nXG4gICAgcHJpdmF0ZSByZWFkb25seSBzc2hLZXlGaWxlPzogc3RyaW5nXG4gICAgcHJpdmF0ZSByZWFkb25seSBzc2hLZXlUbXBGaWxlTmFtZT86IHN0cmluZ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlID0gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVidWc6IGJvb2xlYW5cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEdhdGV3YXlPcHRpb25zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkRW52KCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzc2hLZXlGaWxlOiB1bmRlZmluZWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICAgIGNsZWFudXA6IGFzeW5jICgpID0+IHsgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNzaEtleUZpbGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbnYuR0lUX1NTSF9DT01NQU5EID0gYHNzaCAtaSAke2VzY2FwZVNoZWxsQXJndW1lbnQodGhpcy5zc2hLZXlGaWxlKX0gLW8gU3RyaWN0SG9zdEtleUNoZWNraW5nPW5vYFxuICAgICAgICAgICAgcmVzdWx0LnNzaEtleUZpbGUgPSB0aGlzLnNzaEtleUZpbGVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNzaEtleSkge1xuICAgICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSB0aGlzLnNzaEtleVRtcEZpbGVOYW1lID8/IGpvaW4odG1wZGlyKCksIGBnaXQtc3NoLWtleS0ke3JhbmRvbVVVSUQoKX1gKVxuXG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGVtcEZpbGUsIHRoaXMuc3NoS2V5LCB7IG1vZGU6IDBvNjAwIH0pXG5cbiAgICAgICAgICAgIHJlc3VsdC5lbnYuR0lUX1NTSF9DT01NQU5EID0gYHNzaCAtaSAke2VzY2FwZVNoZWxsQXJndW1lbnQodGVtcEZpbGUpfSAtbyBTdHJpY3RIb3N0S2V5Q2hlY2tpbmc9bm9gXG4gICAgICAgICAgICByZXN1bHQuc3NoS2V5RmlsZSA9IHRlbXBGaWxlXG4gICAgICAgICAgICByZXN1bHQuY2xlYW51cCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB1bmxpbmsodGVtcEZpbGUpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgdGVtcG9yYXJ5IFNTSCBrZXkgZmlsZTogJHt0ZW1wRmlsZX1gLCB7IGVycm9yOiBlcnIgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuKGFyZ3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICAgICAgY29uc3QgeyBlbnYsIHNzaEtleUZpbGUsIGNsZWFudXAgfSA9IGF3YWl0IHRoaXMuYnVpbGRFbnYoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZ2l0ICcgKyBhcmdzLCB7XG4gICAgICAgICAgICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgICAgICAgICAgICBzc2hLZXlGaWxlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlY0FzeW5jKGBnaXQgJHthcmdzfWAsIHtcbiAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgICAgICAgICAgIGVudixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gc3Rkb3V0LnRyaW0oKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgYXdhaXQgY2xlYW51cCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB0cnlSdW4oYXJnczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oYXJncylcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tvdXQocmVmOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW4oYGNoZWNrb3V0ICR7cmVmfWApXG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuKCdmZXRjaCAtLWFsbCAtLXBydW5lJylcbiAgICB9XG5cbiAgICBhc3luYyBwdWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmZldGNoKClcblxuICAgICAgICBjb25zdCB1cHN0cmVhbSA9IGF3YWl0IHRoaXMudHJ5UnVuKCdyZXYtcGFyc2UgLS1hYmJyZXYtcmVmIC0tc3ltYm9saWMtZnVsbC1uYW1lIEB7dXBzdHJlYW19JylcblxuICAgICAgICBpZiAodXBzdHJlYW0pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuKCdwdWxsIC0tZmYtb25seScpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRJbmZvKCk6IFByb21pc2U8R2l0UmVwb0luZm8+IHtcbiAgICAgICAgY29uc3QgaGVhZCA9IGF3YWl0IHRoaXMucnVuKCdyZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQnKVxuICAgICAgICBjb25zdCBpc0RldGFjaGVkSGVhZCA9IGhlYWQgPT09ICdIRUFEJ1xuXG4gICAgICAgIGNvbnN0IHNob3J0SGFzaCA9IGF3YWl0IHRoaXMucnVuKCdyZXYtcGFyc2UgLS1zaG9ydCBIRUFEJylcblxuICAgICAgICBjb25zdCByZW1vdGVzT3V0cHV0ID0gYXdhaXQgdGhpcy50cnlSdW4oJ3JlbW90ZScpXG4gICAgICAgIGNvbnN0IHJlbW90ZXMgPSByZW1vdGVzT3V0cHV0XG4gICAgICAgICAgICA/IHJlbW90ZXNPdXRwdXQuc3BsaXQoJ1xcbicpLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgOiBbXVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuY3dkLFxuICAgICAgICAgICAgaGVhZDogaXNEZXRhY2hlZEhlYWQgPyBudWxsIDogaGVhZCxcbiAgICAgICAgICAgIHNob3J0SGFzaCxcbiAgICAgICAgICAgIGlzRGV0YWNoZWRIZWFkLFxuICAgICAgICAgICAgcmVtb3RlcyxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBDb25maWdTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGNvbmZpZyA9IGNvbnRhaW5lci5wcm94eTxDb25maWdTZXJ2aWNlPihDb25maWdTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsImltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5cbmV4cG9ydCBjb25zdCBrZXkgPSAnZGF0YWJhc2UnXG5cbmNvbnN0IGRhdGFiYXNlID0gY29udGFpbmVyLnByb3h5PEt5c2VseTxEYXRhYmFzZUNvbnRyYWN0Pj4oa2V5KVxuXG5leHBvcnQgZGVmYXVsdCBkYXRhYmFzZVxuXG4iLCJpbXBvcnQgTWlncmF0b3JTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvTWlncmF0b3JTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgbWlncmF0b3IgPSBjb250YWluZXIucHJveHk8TWlncmF0b3JTZXJ2aWNlPihNaWdyYXRvclNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdG9yXG4iLCJpbXBvcnQgdHlwZSB7IEh0dHBDb250ZXh0IH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvSHR0cENvbnRleHRDb250cmFjdC50cydcbmltcG9ydCBSb3V0ZXJTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2NvbnRhaW5lci50cydcblxuY29uc3Qgcm91dGVyID0gY29udGFpbmVyLnByb3h5PFJvdXRlclNlcnZpY2U8SHR0cENvbnRleHQ+PihSb3V0ZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCByb3V0ZXJcbiIsImltcG9ydCBTaGVsbFNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9TaGVsbFNlcnZpY2UudHMnXG5cbmNvbnN0IHNoZWxsID0gbmV3IFNoZWxsU2VydmljZSgpXG5cbmV4cG9ydCBkZWZhdWx0IHNoZWxsXG4iLCJleHBvcnQgaW50ZXJmYWNlIExvYWRlcjxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxvYWQoZW50aXRpZXM6IFRbXSk6IFByb21pc2U8dm9pZD5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FkZXJSZWNvcmQ8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBba2V5OiBzdHJpbmddOiBMb2FkZXI8VD5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvYWRlcjxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4obG9hZGVyOiBMb2FkZXI8VD4pOiBMb2FkZXI8VD4ge1xuICAgIHJldHVybiBsb2FkZXJcbn1cbiIsImltcG9ydCB7IHNldCwgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZGVmaW5lTG9hZGVyIH0gZnJvbSAnI3NlcnZlci91dGlscy9kZWZpbmVMb2FkZXIudHMnXG5cbnR5cGUgS2V5T3JGdW5jdGlvbjxUPiA9IGtleW9mIFQgfCAoKGVudGl0eTogVCkgPT4gYW55KVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhc01hbnlUaHJvdWdoTG9hZGVyT3B0aW9uczxcbiAgICBURW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVFBpdm90RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVFRhcmdldEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4+IHtcbiAgICBrZXk6IHN0cmluZyAvLyB0YXJnZXQgcHJvcGVydHkgdG8gc2V0IG9uIHRoZSBlbnRpdHlcbiAgICBwaXZvdDoge1xuICAgICAgICBzb3VyY2VLZXk6IEtleU9yRnVuY3Rpb248VEVudGl0eT4gLy8gcGl2b3QgdGFibGUgZm9yZWlnbiBrZXkgdG8gcmVsYXRlZCBlbnRpdHlcbiAgICAgICAgdGFyZ2V0S2V5OiBLZXlPckZ1bmN0aW9uPFRQaXZvdEVudGl0eT4gLy8gcGl2b3QgdGFibGUgZm9yZWlnbiBrZXkgdG8gY3VycmVudCBlbnRpdHlcbiAgICAgICAgZmluZEVudGl0aWVzKGlkczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8VFBpdm90RW50aXR5W10+IC8vIGZ1bmN0aW9uIHRvIGZldGNoIHBpdm90IHRhYmxlIHJvd3MgYnkgcmVsYXRlZCBlbnRpdHkgaWRzXG4gICAgfSxcbiAgICB0YXJnZXQ6IHtcbiAgICAgICAgc291cmNlS2V5OiBLZXlPckZ1bmN0aW9uPFRQaXZvdEVudGl0eT4gLy8gdGFyZ2V0IGVudGl0eSBpZCBrZXksIGRlZmF1bHQgJ2lkJ1xuICAgICAgICB0YXJnZXRLZXk6IEtleU9yRnVuY3Rpb248VFRhcmdldEVudGl0eT4gLy8gdGFyZ2V0IGVudGl0eSBmb3JlaWduIGtleSB0byBwaXZvdCB0YWJsZVxuICAgICAgICBmaW5kRW50aXRpZXMoaWRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTxUVGFyZ2V0RW50aXR5W10+IC8vIGZ1bmN0aW9uIHRvIGZldGNoIHJlbGF0ZWQgZW50aXRpZXMgYnkgaWRzXG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEhhc01hbnlUaHJvdWdoPFxuICAgIFRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUUGl2b3RFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUVGFyZ2V0RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT5cbj4ocGF5bG9hZDogYW55IHwgYW55W10sIG9wdGlvbnM6IEhhc01hbnlUaHJvdWdoTG9hZGVyT3B0aW9uczxURW50aXR5LCBUUGl2b3RFbnRpdHksIFRUYXJnZXRFbnRpdHk+KSB7XG4gICAgY29uc3QgZW50aXRpZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0IFxuICAgIGNvbnN0IHBpdm90ID0gb3B0aW9ucy5waXZvdFxuXG4gICAgZnVuY3Rpb24gZmluZEtleShlbnRpdHk6IGFueSwga2V5T3JGbjogS2V5T3JGdW5jdGlvbjxhbnk+KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXlPckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5T3JGbihlbnRpdHkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0KGVudGl0eSwga2V5T3JGbilcbiAgICAgICAgXG4gICAgfVxuXG4gICAgY29uc3QgcGl2b0lkcyA9IGVudGl0aWVzLm1hcChlID0+IGZpbmRLZXkoZSwgcGl2b3Quc291cmNlS2V5KSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgY29uc3QgcGl2b3RFbnRpdGllcyA9IGF3YWl0IHBpdm90LmZpbmRFbnRpdGllcyhwaXZvSWRzKVxuICAgIGNvbnN0IHRhcmdldElkcyA9IHBpdm90RW50aXRpZXMubWFwKChwOiBhbnkpID0+IGZpbmRLZXkocCwgcGl2b3QudGFyZ2V0S2V5KSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgY29uc3QgdGFyZ2V0RW50aXRpZXMgPSBhd2FpdCB0YXJnZXQuZmluZEVudGl0aWVzKHRhcmdldElkcylcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IHBpdm90cyA9IHBpdm90RW50aXRpZXMuZmlsdGVyKChwOiBhbnkpID0+IGZpbmRLZXkocCwgcGl2b3Quc291cmNlS2V5KSA9PT0gZmluZEtleShlbnRpdHksIHBpdm90LnNvdXJjZUtleSkpXG5cbiAgICAgICAgaWYgKCFwaXZvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZXQoZW50aXR5LCBvcHRpb25zLmtleSwgW10pXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IHRhcmdldEVudGl0aWVzLmZpbHRlcigodDogYW55KSA9PiBwaXZvdHMuc29tZSgocDogYW55KSA9PiBmaW5kS2V5KHAsIHRhcmdldC5zb3VyY2VLZXkpID09PSBmaW5kS2V5KHQsIHRhcmdldC50YXJnZXRLZXkpKSlcblxuICAgICAgICBzZXQoZW50aXR5LCBvcHRpb25zLmtleSwgdGFyZ2V0cylcbiAgICB9XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhc01hbnlUaHJvdWdoTG9hZGVyPFxuICAgIFRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUUGl2b3RFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUVGFyZ2V0RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT5cbj4ob3B0aW9uczogSGFzTWFueVRocm91Z2hMb2FkZXJPcHRpb25zPFRFbnRpdHksIFRQaXZvdEVudGl0eSwgVFRhcmdldEVudGl0eT4pIHtcbiAgICByZXR1cm4gZGVmaW5lTG9hZGVyPFRFbnRpdHk+KHtcbiAgICAgICAgbG9hZDogYXN5bmMgKGVudGl0aWVzOiBURW50aXR5W10pID0+IGxvYWRIYXNNYW55VGhyb3VnaChlbnRpdGllcywgb3B0aW9ucylcbiAgICB9KVxufVxuXG5cbiIsImltcG9ydCBCYXNlQWNsIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQWNsRW50aXR5LnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbCBleHRlbmRzIEJhc2VBY2wge1xuICAgIHB1YmxpYyBhdXRob3JpemUoYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBpZiAodGhpcy5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0LCBvYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBCYXNlRXhjZXB0aW9uKCdVbmF1dGhvcml6ZWQnLCA0MDMpXG5cbiAgICAgICAgICAgIGxldCBzdWJqZWN0TmFtZSA9ICcnXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3ViamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0TmFtZSA9IHN1YmplY3RcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN1YmplY3QgJiYgdHlwZW9mIHN1YmplY3QgPT09ICdmdW5jdGlvbicgJiYgc3ViamVjdC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgc3ViamVjdE5hbWUgPSBzdWJqZWN0Lm5hbWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN1YmplY3QgJiYgdHlwZW9mIHN1YmplY3QgPT09ICdvYmplY3QnICYmIHN1YmplY3QuY29uc3RydWN0b3IgJiYgc3ViamVjdC5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICAgICAgICAgICAgc3ViamVjdE5hbWUgPSBzdWJqZWN0LmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwge1xuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBzdWJqZWN0OiBzdWJqZWN0TmFtZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gICAgUmVxdWVzdCwgXG4gICAgUmVzcG9uc2UsXG4gICAgQ29va2llT3B0aW9uc1xufSBmcm9tICdleHByZXNzJ1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb25maWcudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSBleHRlbmRzIEJhc2Uge1xuICAgIHB1YmxpYyByZXF1ZXN0OiBSZXF1ZXN0XG4gICAgcHVibGljIHJlc3BvbnNlOiBSZXNwb25zZVxuXG4gICAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCwgcmVzcG9uc2U6IFJlc3BvbnNlKSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGNvb2tpZXM6IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KE9iamVjdC5lbnRyaWVzKHJlcXVlc3QuY29va2llcykpLFxuICAgICAgICAgICAgcHJlZml4OiBjb25maWcuZ2V0KCdjb29raWUucHJlZml4JywgJycpXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2VcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IENvb2tpZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5wcmVmaXhcblxuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHByZWZpeCArIG5hbWVcblxuICAgICAgICBjb25zdCBvcHRzOiBDb29raWVPcHRpb25zID0ge1xuICAgICAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc3BvbnNlLmNvb2tpZShmdWxsTmFtZSwgdmFsdWUsIG9wdHMpXG4gICAgICAgIFxuICAgICAgICBzdXBlci5zZXQoZnVsbE5hbWUsIHZhbHVlLCBvcHRpb25zKVxuICAgIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgR2l0R2F0ZXdheSB9IGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvR2l0R2F0ZXdheS50cydcbmltcG9ydCB7IHRtcFBhdGggfSBmcm9tICcjc2VydmVyL3V0aWxzL2Jhc2VQYXRoLnRzJ1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBzaGVsbCBmcm9tICcjc2VydmVyL2ZhY2FkZXMvc2hlbGwudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgbG9nZ2VyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9sb2dnZXIudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgICBwdWJsaWMgZ2V0IGdpdCgpe1xuICAgICAgICByZXR1cm4gbmV3IEdpdEdhdGV3YXkoe1xuICAgICAgICAgICAgY3dkOiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgICAgIHNzaEtleTogY29uZmlnLmdldChgbW9kdWxlcy4ke3RoaXMuaWR9LnNzaF9rZXlgKSxcbiAgICAgICAgICAgIHNzaEtleVRtcEZpbGVOYW1lOiB0bXBQYXRoKGBzc2hfa2V5XyR7dGhpcy5pZH0ucGVtYCksXG4gICAgICAgICAgICBsb2dnZXI6IGxvZ2dlci5jaGlsZCh7IGxhYmVsOiAnZ2l0JyB9KSxcbiAgICAgICAgICAgIGRlYnVnOiBjb25maWcuZ2V0KCdnaXQuZGVidWcnLCBmYWxzZSksXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG1ha2VQYXRoKC4uLnBhcnRzOiBzdHJpbmdbXSkge1xuICAgICAgICByZXR1cm4gam9pbih0aGlzLmRpcmVjdG9yeSwgLi4ucGFydHMpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpY1BhdGgoLi4ucGFydHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBqb2luKCcvc3RhdGljJywgJ21vZHVsZXMnLCB0aGlzLmlkLCAuLi5wYXJ0cylcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tbWFuZDogdHlwZW9mIHNoZWxsLmNvbW1hbmQgPSAoYmluLCBhcmdzLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBzaGVsbC5jb21tYW5kKGJpbiwgYXJncywge1xuICAgICAgICAgICAgY3dkOiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoKXtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RQYXRoID0gdGhpcy5tYWtlUGF0aCgnbW9kdWxlLmpzb24nKVxuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmLTgnKVxuICAgICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShjb250ZW50KVxuXG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0ganNvbi5kZXBlbmRlbmNpZXMgfHwge31cbiAgICAgICAgdGhpcy5idWlsZCA9IGpzb24uYnVpbGQgfHwge30gICAgICBcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZENsaWVudEVudHJ5cG9pbnRGaWxlbmFtZShjb250ZXh0OiAnZGV2JyB8ICdub2RlJyB8ICdicm93c2VyJyA9ICdkZXYnKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXSBhcyBzdHJpbmdbXVxuXG4gICAgICAgIGlmIChjb250ZXh0ID09PSAnZGV2Jykge1xuICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudCcsICdtb2R1bGUuY2xpZW50LnRzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50JywgJ21vZHVsZS5jbGllbnQuanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQnLCAnY2xpZW50LnRzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50JywgJ2NsaWVudC5qcycpLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQgPT09ICdub2RlJykge1xuICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudC1kaXN0L25vZGUnLCAnaW5kZXguanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9ub2RlJywgJ2luZGV4Lm1qcycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudC1kaXN0L25vZGUnLCAnbW9kdWxlLmNsaWVudC5qcycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudC1kaXN0L25vZGUnLCAnbW9kdWxlLmNsaWVudC5tanMnKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0ID09PSAnYnJvd3NlcicpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9icm93c2VyJywgJ2luZGV4LmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3QvYnJvd3NlcicsICdpbmRleC5tanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9icm93c2VyJywgJ21vZHVsZS5jbGllbnQuanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9icm93c2VyJywgJ21vZHVsZS5jbGllbnQubWpzJyksXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCBDb29raWVNYXBFbnRpdHkgZnJvbSBcIiNzZXJ2ZXIvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzXCJcbmltcG9ydCBDb250YWluZXJTZXJ2aWNlIGZyb20gXCIjc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHNcIlxuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnXG5pbXBvcnQgdHlwZSB7IFJlc29sdmFibGVIZWFkIH0gZnJvbSAnQHVuaGVhZC92dWUnXG5pbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tIFwiI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlUmVxdWVzdENvbnRleHRFbnRpdHlPcHRpb25zIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICByZXF1ZXN0OiBSZXF1ZXN0O1xuICAgIHJlc3BvbnNlOiBSZXNwb25zZTtcblxuICAgIHN0YXRlPzogTWFwPHN0cmluZywgYW55PlxuXG4gICAgbm9kZUNvbnRhaW5lcj86IENvbnRhaW5lclNlcnZpY2VcbiAgICBub2RlQ29uZmlnPzogQ29uZmlnU2VydmljZVxuICAgIG5vZGVTdGF0ZT86IE1hcDxzdHJpbmcsIGFueT5cblxuICAgIGJyb3dzZXJDb250YWluZXI/OiBDb250YWluZXJTZXJ2aWNlXG4gICAgYnJvd3NlckNvbmZpZz86IENvbmZpZ1NlcnZpY2VcbiAgICBicm93c2VyU3RhdGU/OiBNYXA8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VSZXF1ZXN0Q29udGV4dEVudGl0eSB7XG4gICAgcHVibGljIHVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZXF1ZXN0OiBSZXF1ZXN0O1xuICAgIHB1YmxpYyByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgcHVibGljIGNvb2tpZXM6IENvb2tpZU1hcEVudGl0eVxuICAgIHB1YmxpYyBoZWFkOiBSZXNvbHZhYmxlSGVhZFtdXG5cbiAgICBwdWJsaWMgbm9kZUNvbnRhaW5lcjogQ29udGFpbmVyU2VydmljZVxuICAgIHB1YmxpYyBub2RlQ29uZmlnOiBDb25maWdTZXJ2aWNlXG4gICAgcHVibGljIG5vZGVTdGF0ZTogTWFwPHN0cmluZywgYW55PlxuXG4gICAgcHVibGljIGJyb3dzZXJDb250YWluZXI6IENvbnRhaW5lclNlcnZpY2VcbiAgICBwdWJsaWMgYnJvd3NlckNvbmZpZzogQ29uZmlnU2VydmljZVxuICAgIHB1YmxpYyBicm93c2VyU3RhdGU6IE1hcDxzdHJpbmcsIGFueT5cblxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFnZVJlcXVlc3RDb250ZXh0RW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsXG4gICAgICAgIHRoaXMucmVxdWVzdCA9IGRhdGEucmVxdWVzdFxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gZGF0YS5yZXNwb25zZVxuICAgICAgICB0aGlzLmNvb2tpZXMgPSBuZXcgQ29va2llTWFwRW50aXR5KHRoaXMucmVxdWVzdCwgdGhpcy5yZXNwb25zZSlcblxuICAgICAgICB0aGlzLmhlYWQgPSBbXVxuXG4gICAgICAgIHRoaXMubm9kZUNvbnRhaW5lciA9IGRhdGEubm9kZUNvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG4gICAgICAgIHRoaXMubm9kZUNvbmZpZyA9IGRhdGEubm9kZUNvbmZpZyB8fCBuZXcgQ29uZmlnU2VydmljZSgpXG4gICAgICAgIHRoaXMubm9kZVN0YXRlID0gZGF0YS5ub2RlU3RhdGUgfHwgbmV3IE1hcDxzdHJpbmcsIGFueT4oKVxuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbmZpZyA9IGRhdGEuYnJvd3NlckNvbmZpZyB8fCBuZXcgQ29uZmlnU2VydmljZSgpXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbnRhaW5lciA9IGRhdGEuYnJvd3NlckNvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG4gICAgICAgIHRoaXMuYnJvd3NlclN0YXRlID0gZGF0YS5icm93c2VyU3RhdGUgfHwgbmV3IE1hcDxzdHJpbmcsIGFueT4oKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRCcm93c2VyU3RhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5icm93c2VyU3RhdGUuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldE5vZGVTdGF0ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm5vZGVTdGF0ZS5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U3RhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXROb2RlU3RhdGUoa2V5LCB2YWx1ZSlcbiAgICAgICAgdGhpcy5zZXRCcm93c2VyU3RhdGUoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QnJvd3NlckNvbnRhaW5lclZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYnJvd3NlckNvbnRhaW5lci5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Tm9kZUNvbnRhaW5lclZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubm9kZUNvbnRhaW5lci5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29udGFpbmVyVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXROb2RlQ29udGFpbmVyVmFsdWUoa2V5LCB2YWx1ZSlcbiAgICAgICAgdGhpcy5zZXRCcm93c2VyQ29udGFpbmVyVmFsdWUoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QnJvd3NlckNvbmZpZ1ZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYnJvd3NlckNvbmZpZy5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Tm9kZUNvbmZpZ1ZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubm9kZUNvbmZpZy5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29uZmlnVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXROb2RlQ29uZmlnVmFsdWUoa2V5LCB2YWx1ZSlcbiAgICAgICAgdGhpcy5zZXRCcm93c2VyQ29uZmlnVmFsdWUoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbn1cbiIsImltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRyeUVudGl0eSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyBtYWtlUGF0aCguLi5wYXJ0czogc3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIGpvaW4odGhpcy5kaXJlY3RvcnksIC4uLnBhcnRzKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJ1xuaW1wb3J0IFJvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJGaWxlQmFzZVJvdXRpbmdTZXJ2aWNlLnRzJ1xuaW1wb3J0IHJvdXRlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvcm91dGVyLnRzJ1xuaW1wb3J0IFBsdWdpbkVudHJ5RW50aXR5IGZyb20gJy4vUGx1Z2luRW50cnlFbnRpdHkudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgeyBSb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnI3NlcnZlci9pbmRleC50cydcblxuaW50ZXJmYWNlIEFkZEFwaUZvbGRlck9wdGlvbnMge1xuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBQbHVnaW5FbnRyeUVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpY1BhdGgoLi4ucGFydHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBqb2luKCcvc3RhdGljJywgJ21vZHVsZXMnLCB0aGlzLmlkLCAuLi5wYXJ0cylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbG9hZCBhZGRpdGlvbmFsIGRhdGEgZnJvbSB0aGUgcGx1Z2luJ3MgZGlyZWN0b3J5IGlmIG5lZWRlZFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGRBcGlGb2xkZXIoZGlyZWN0b3J5OiBzdHJpbmcsIG9wdGlvbnM6IEFkZEFwaUZvbGRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5oYXMoUm91dGVyU2VydmljZSkpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IHByZWZpeCA9IG9wdGlvbnMucHJlZml4IHx8IGAvYXBpLyR7dGhpcy5pZH1gXG5cbiAgICAgICAgYXdhaXQgUm91dGVyRmlsZUJhc2VSb3V0aW5nU2VydmljZVxuICAgICAgICAgICAgLmNyZWF0ZShkaXJlY3RvcnkpXG4gICAgICAgICAgICAuc2V0UHJlZml4KHByZWZpeClcbiAgICAgICAgICAgIC5zZXRSb3V0ZXIocm91dGVyKVxuICAgICAgICAgICAgLnNldE1vZHVsZSh0aGlzLmlkKVxuICAgICAgICAgICAgLmxvYWQoKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVBsdWdpbkRpc2NvdmVyRW50aXR5PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBlbnRpdHk6IFBsdWdpbkVudHJ5RW50aXR5KTogVCB7XG4gICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogUGx1Z2luRW50aXR5KSBhcyBhbnlcblxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgbGV0IHBheWxvYWQgPSB7IFxuICAgICAgICAgICAgaWQ6IGVudGl0eS5pZCxcbiAgICAgICAgICAgIG5hbWU6IGVudGl0eS5uYW1lLFxuICAgICAgICAgICAgdmVyc2lvbjogZW50aXR5LnZlcnNpb24sXG4gICAgICAgICAgICBkaXJlY3Rvcnk6IGVudGl0eS5kaXJlY3RvcnksXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnRydWN0b3I/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBwYXlsb2FkID0gKGNvbnRydWN0b3IgYXMgYW55KS5wYXJzZShlbnRpdHkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mICh0aGlzIGFzIGFueSk/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShlbnRpdHkpXG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICB9XG5cblxufVxuIiwiaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5pbXBvcnQgdHlwZSB7IExvYWRlciwgTG9hZGVyUmVjb3JkIH0gZnJvbSAnLi9kZWZpbmVMb2FkZXIudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2FkZXJGYWN0b3J5PEUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PiwgUiBleHRlbmRzIExvYWRlclJlY29yZDxFPiA9IExvYWRlclJlY29yZDxFPj4obG9hZGVyczogUikge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWQoZW50aXRpZXM6IEUgfCBFW10sIG5hbWVzOiBrZXlvZiBSIHwgKGtleW9mIFIpW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KGVudGl0aWVzKSA/IGVudGl0aWVzIDogW2VudGl0aWVzXVxuICAgICAgICBjb25zdCByZWxhdGlvbk5hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IFtuYW1lc11cblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcmVsYXRpb25OYW1lcykge1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gbG9hZGVycz8uW25hbWUgYXMgc3RyaW5nXSBhcyBMb2FkZXJcblxuICAgICAgICAgICAgaWYgKCFsb2FkZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTG9hZGVyICR7U3RyaW5nKG5hbWUpfSBub3QgZGVjbGFyZWRgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCBsb2FkZXIubG9hZChpdGVtcylcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAga2V5czogT2JqZWN0LmtleXMobG9hZGVycykgYXMgKGtleW9mIFIpW10sXG4gICAgICAgIGxvYWRlcnMsXG4gICAgICAgIGxvYWQgXG4gICAgfVxufVxuXG4iLCJpbXBvcnQgdHlwZSB7IEh0dHBDb250ZXh0IH0gZnJvbSBcIiNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUhhbmRsZXIoaGFuZGxlcjogKGN0eDogSHR0cENvbnRleHQpID0+IFByb21pc2U8YW55Pikge1xuICAgIHJldHVybiBoYW5kbGVyXG59XG4iLCJpbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcblxuLy8gZ2VuZXJhdGUgaW5kZXhlcyBmb3IgZm9sZGVycyBcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4RmlsZShvcHRpb25zOiBhbnkpIHtcbiAgICBjb25zdCBmb2xkZXJzID0gb3B0aW9ucy5mb2xkZXJzXG4gICAgY29uc3QgZmlsZW5hbWUgPSBvcHRpb25zLmZpbGVuYW1lXG4gICAgY29uc3QgZ2xvYiA9IG9wdGlvbnMuZ2xvYiB8fCAnKiovKi4odHN8anMpJ1xuICAgIGNvbnN0IGRlZmF1bHRJZ25vcmUgPSBbXG4gICAgICAgIFwiKiovaW5kZXgudHNcIixcbiAgICAgICAgXCIqKi8qLnNwZWMudHNcIixcbiAgICAgICAgXCIqKi8qLnNwZWMtZC50c1wiLFxuICAgICAgICBcIioqLyoudGVzdC50c1wiLFxuICAgICAgICBcIioqLyoudGVzdC1kLnRzXCIsXG4gICAgXVxuXG4gICAgY29uc3QgaWdub3JlID0gb3B0aW9ucy5pZ25vcmUgfHwgW11cblxuICAgIGxldCBjb250ZW50ID0gJydcblxuICAgIGZvciAoY29uc3QgZm9sZGVyIG9mIGZvbGRlcnMpIHtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmZy5zeW5jKGAke2ZvbGRlcn0vJHtnbG9ifWAsIHtcbiAgICAgICAgICAgIGlnbm9yZTogWy4uLmRlZmF1bHRJZ25vcmUsIC4uLmlnbm9yZV0sIFxuICAgICAgICB9KVxuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShmaWxlbmFtZSksIGZpbGUpXG4gICAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZSlcblxuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JylcblxuICAgICAgICAgICAgbGV0IHNob3VsZEV4cG9ydERlZmF1bHQgPSBmaWxlQ29udGVudC5pbmNsdWRlcygnZXhwb3J0IGRlZmF1bHQnKSAmJiAhZmlsZVBhdGguaW5jbHVkZXMoJ2dlbmVyYXRlSW5kZXhGaWxlLnRzJylcblxuICAgICAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy52dWUnKSkge1xuICAgICAgICAgICAgICAgIHNob3VsZEV4cG9ydERlZmF1bHQgPSB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRlbnQgKz0gYGV4cG9ydCAqIGZyb20gJy4vJHtmaWxlUGF0aH0nXFxuYFxuXG4gICAgICAgICAgICAvLyBkZWZhdWx0IGV4cG9ydCBcbiAgICAgICAgICAgIGlmIChzaG91bGRFeHBvcnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgY29udGVudCArPSBgZXhwb3J0IHsgZGVmYXVsdCBhcyAke3BhdGguYmFzZW5hbWUoZmlsZSwgZXh0ZW5zaW9uKX0gfSBmcm9tICcuLyR7ZmlsZVBhdGh9J1xcbmBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRlbnQgPSBjb250ZW50LnRyaW0oKVxuXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlbmFtZSwgY29udGVudClcbn1cbiIsImltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0T25lKGZpbGVuYW1lczogc3RyaW5nW10pOiBQcm9taXNlPGFueT4ge1xuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZmlsZW5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVVcmwgPSBwYXRoVG9GaWxlVVJMKGZpbGVuYW1lKVxuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoZmlsZVVybC50b1N0cmluZygpKVxuXG4gICAgICAgIHJldHVybiBtb2RcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxufVxuIl0sIm1hcHBpbmdzIjoiZzJDQWFBLFNBQWdCLEVBQVksRUFBYyxFQUFFLENBQUUsRUFBeUIsRUFBRSxDQUFFLENBQ3ZFLElBQU0sRUFBYyxRQUFRLE9BQU8sU0FBVyxHQUl4QyxFQUFRLElBQUksRUFBTSxDQUNwQixTQUFVLEdBQ1YsbUJBQW9CLEdBQ3BCLFVBQVcsQ0FORSxFQUFRLFVBQVksS0FBSyxNQUFNLEVBQWMsR0FBSSxDQUMvQyxLQUFLLE1BQU0sRUFBYyxHQUFJLENBS1gsQ0FDcEMsQ0FBQyxDQUVGLElBQUssSUFBTSxLQUFPLE9BQU8sS0FBSyxFQUFPLENBQ2pDLEVBQU0sS0FBSyxDQUFDLEVB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
1
+ import{Command as e}from"commander";import t from"chalk";import n from"cli-table3";import r,{dirname as i,join as a,relative as o}from"path";import s from"fs";import{pathToFileURL as c}from"url";import l from"fast-glob";import{debounce as ee,get as u,has as te,join as ne,omit as re,orderBy as ie,set as d,unset as ae}from"lodash-es";import*as f from"valibot";import{format as p}from"date-fns";import oe from"qs";import{defineAbility as se,subject as m}from"@casl/ability";import ce,{spawn as le}from"child_process";import h from"js-yaml";import{Readable as ue}from"stream";import g from"ms";import{DeleteObjectCommand as de,DeleteObjectsCommand as fe,GetObjectCommand as pe,HeadObjectCommand as me,ListObjectsV2Command as he,PutObjectCommand as ge,S3Client as _e}from"@aws-sdk/client-s3";import{getSignedUrl as ve}from"@aws-sdk/s3-request-presigner";import{Upload as ye}from"@aws-sdk/lib-storage";import be from"mime";import{ProxyAgent as xe,fetch as Se}from"undici";import _ from"crypto";import Ce from"dotenv";import{exec as we}from"node:child_process";import{promisify as Te}from"node:util";import{unlink as Ee,writeFile as De}from"node:fs/promises";import{tmpdir as Oe}from"node:os";import{join as ke}from"node:path";import{randomUUID as Ae}from"node:crypto";import{CreateTableBuilder as v,sql as je}from"kysely";import{pathToFileURL as Me}from"node:url";import Ne from"node:fs";var Pe=Object.defineProperty,y=(e,t)=>{let n={};for(var r in e)Pe(n,r,{get:e[r],enumerable:!0});return t||Pe(n,Symbol.toStringTag,{value:`Module`}),n};function Fe(e={},t={}){let r=process.stdout.columns||80,i=new n({wordWrap:!0,wrapOnWordBoundary:!1,colWidths:[t.keyWidth||Math.floor(r*.2),Math.floor(r*.7)]});for(let t of Object.keys(e))i.push([t,String(e[t])]);console.log(i.toString())}function Ie(e,t){let r=(process.stdout.columns||80)-6,i=[],a=[];t&&a.push(...t),t||e.map(e=>Object.keys(e)).flat().filter((e,t,n)=>n.indexOf(e)===t).forEach(e=>{a.push({label:e,value:e})}),e.forEach(e=>{let t=[];a.forEach(n=>{let r=``;typeof n.value==`function`&&(r=n.value(e)),typeof n.value==`string`&&(r=e[n.value]),r??=``,(typeof r==`object`||Array.isArray(r))&&(r=JSON.stringify(r)),t.push(r)}),i.push(t)}),a.forEach(e=>{e.width&&=Number(e.width),e.label||=String(e.value)});let o=100-a.filter(e=>!!e.width).reduce((e,t)=>e+t.width,0),s=a.filter(e=>!e.width).length;a.forEach(e=>{e.width||=Math.floor(o/s)}),a.forEach(e=>{e.width&&(e.realWidth=Math.floor(r*(e.width/100)))});let c=new n({head:a.map(e=>e.label),style:{head:[],border:[]},wordWrap:!0,wrapOnWordBoundary:!1,colWidths:a.map(e=>e.realWidth)});c.push(...i),console.log(c.toString())}async function b(e){try{return[null,await e()]}catch(e){return[e,null]}}b.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var x=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},S=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},Le=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new S(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const C=globalThis.serverContainer||new Le;globalThis.serverContainer=C;const w=C.proxy(x);async function Re(e,t={}){let n={},i=e=>{Object.assign(e.error,{filename:e.filename}),w.error(`Failed to import ${e.filename}`,e.error)};t.onError&&(i=t.onError);for(let a of e){if(t.exclude&&t.exclude.some(e=>a.includes(e)))continue;let e={filename:a};t.onBeforeImport&&await t.onBeforeImport(e);let o=e.filename.split(`?`)[0];if(/\.(mts|ts|js)$/.test(o)){let o=c(r.resolve(e.filename));t.cache===!1&&o.searchParams.set(`t`,Date.now().toString());let[s,l]=await b(()=>import(o.toString()));if(s){Object.assign(s,{filename:e.filename,url:o}),i({filename:e.filename,error:s});continue}n[a]=l}if(/\.json$/.test(o)){let[t,r]=await b(async()=>{let t=await s.promises.readFile(e.filename,`utf8`);return JSON.parse(t)});if(t){i({filename:e.filename,error:t});continue}n[a]=r}t.onAfterImport&&await t.onAfterImport({...e,module:n[a]})}return n}async function ze(e,t={}){return Re(await l(e),t)}async function Be(e,t={}){return Re((await s.promises.readdir(e,{withFileTypes:!0})).filter(e=>e.isFile()).map(t=>r.join(e,t.name)),t)}function T(...e){return e.reduce((e,t)=>t(e),class{})}function E(e,...t){return t.reduce((e,t)=>t(e),e)}function Ve(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function D(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){D(i,e,n);continue}n[e]=i}return n}function He(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function O(e=``){return e+He()}var k=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let r=n.value;return typeof r!=`object`||Array.isArray(r)?!1:te(r,e.substring(t.length+1))}get(e,t){let n=this.entries.get(e);if(n)return n.value;if(!e.includes(`.`))return t;let r=e.split(`.`)[0],i=this.entries.get(r);if(!i){let n=this.entries.get(e);return n?n.value:t}let a=i.value;return typeof a!=`object`||Array.isArray(a)?t:u(a,e.substring(r.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),d(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(ae(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return D(this.toRecord())}},A=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new x,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}static create(t){return new e(t)}setDebug(e){this.debug=e,this.debug&&this.logger.debug(`debug mode enabled`)}setLogger(e){this.logger=e}on(e,t,n){let r=n?.id||O();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=n=>{t(n),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,t,n){let r=ee(t,n?.debounce||300),i=this.on(e,r,n);return i&&(i.originalListener=t),i}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let e of n)b.sync(()=>e.listener(t))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event`,{handlers:n.length,event:e,args:t});for await(let e of n)await e.listener(t)}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},Ue=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new x,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=ie(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await b(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},We=y({array:()=>j,arrayNumber:()=>Ye,boolean:()=>Ke,date:()=>qe,datetime:()=>Je,number:()=>Ge,object:()=>Xe});const Ge=()=>f.pipe(f.union([f.string(),f.number()]),f.transform(Number),f.integer()),Ke=()=>f.pipe(f.union([f.string(),f.boolean()]),f.transform(e=>e===!0||e===`true`)),qe=()=>f.pipe(f.union([f.string(),f.date()]),f.transform(e=>e instanceof Date?e:new Date(e)),f.transform(e=>e&&p(e,`yyyy-MM-dd`))),Je=()=>f.pipe(f.union([f.string(),f.date()]),f.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),p(e,`yyyy-MM-dd HH:mm`))))),j=(e=f.any())=>f.pipe(f.union([f.string(),f.array(f.string())]),f.transform(e=>Array.isArray(e)?e:e.split(`,`)),f.array(e)),Ye=()=>f.pipe(j(),f.transform(e=>e.map(Number))),Xe=()=>f.pipe(f.union([f.string(),f.record(f.string(),f.any())]),f.transform(e=>typeof e==`string`?oe.parse(e):e),f.transform(e=>{let t={};for(let n in e)d(t,n,u(e,n));return t}));var Ze=y({base:()=>Qe});const Qe=(e={})=>f.object({page:f.optional(Ge(),1),limit:f.optional(Ge(),e.maxLimit||100),orderBy:f.optional(e.orderFields?j(f.picklist(e.orderFields)):j(f.string()),[]),orderDirection:f.optional(j(f.union([f.literal(`asc`),f.literal(`desc`)])),[])}),$e={url:We,pagination:Ze};var et=class{static __container_entry_key=`ValidatorService`;v={...f,extras:$e};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=f.safeParse(n,e);if(!a){let e=f.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new S(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await f.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=f.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=f.safeParse(n,e);return r}};f.object({id:f.number(),permission_id:f.number(),assignable_type:f.string(),assignable_id:f.string(),created_at:f.string(),updated_at:f.string()}),f.object({id:f.number(),name:f.nullable(f.string()),description:f.nullable(f.string()),action:f.string(),subject:f.string(),conditions:f.nullable(f.string()),created_at:f.string(),updated_at:f.string(),expires_at:f.string()}),f.object({id:f.number(),name:f.nullable(f.string()),type:f.string(),user_id:f.number(),token:f.string(),created_at:f.string(),updated_at:f.string(),expires_at:f.string()});var tt=class extends S{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};const M=new et;function N(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}async function P(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function nt(e,t,n){let r=e.listeners||[];r.find(e=>e.event===t&&e.listener===n)||(r.push({event:t,listener:n}),e.listeners=r)}function F(e){return class extends e{constructor(...e){super(...e),typeof this.constructor.boot==`function`&&this.constructor.boot.apply(this.constructor)}static listeners=[];static on(e,t){return nt(this,e,t)}static async emit(e,...t){return P(this,e,...t)}}}function rt(e){return class extends e{listeners;constructor(...e){super(...e),this.listeners=[]}on(e,t){this.listeners.push({event:e,listener:t})}off(e,t){let n=this.listeners.findIndex(n=>n.event===e&&n.listener===t);n!==-1&&this.listeners.splice(n,1)}emit(e,...t){let n=this.listeners.filter(t=>t.event===e);for(let e of n)e.listener(...t)}async emitAsync(e,...t){let n=this.listeners.filter(t=>t.event===e);for await(let e of n)await e.listener(...t)}}}F.emit=P,F.on=nt;function I(e){return class extends e{deleted_at=null}}function L(e){return class extends e{created_at;updated_at}}var it=class extends T(N){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=b.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},at=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>it.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new x().child({label:`acl`}),this.ability=se(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=m(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=m(t,n);return this.ability.cannot(e,r)}subject(e,t){return m(e,t)}},ot=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};const st=()=>[{id:`fs`,label:$t(`File System`),description:$t(`Store files on the local file system.`),config_fields:{directory:{component:`text-field`,label:$t(`Directory`),description:$t(`The directory path where files will be stored.`),hint:$t(`Relative to the application root or absolute path, e.g., :0 or :1`,[`/var/zenith/uploads`,`storage/uploads`])}}},{id:`s3`,label:`S3`,description:$t(`Store files on an S3-compatible service like AWS S3, DigitalOcean Spaces, etc.`),config_fields:{accessKeyId:{component:`text-field`,label:$t(`Access Key ID`),hint:$t(`Your AWS access key ID.`),type:`password`},secretAccessKey:{component:`text-field`,label:$t(`Secret Access Key`),hint:$t(`Your AWS secret access key.`),type:`password`},bucket:{component:`text-field`,label:$t(`Bucket Name`),hint:$t(`The name of the S3 bucket to store files in.`)},region:{component:`text-field`,label:$t(`Region`),hint:$t(`The AWS region where your bucket is located.`)},prefix:{component:`text-field`,label:$t(`Prefix`),hint:$t(`An optional prefix (folder path) to store files under in the bucket.`)},endpoint:{component:`text-field`,label:$t(`Endpoint URL`),hint:$t(`Optional custom endpoint URL for S3-compatible services.`)}}}];var ct=class e{static get TYPES(){return st()}id;name;type;is_default;config;constructor(e){Object.assign(this,e)}get config_fields(){let t=e.TYPES.find(e=>e.id===this.type);return t?t.config_fields:{}}},lt=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}},ut=class extends T(N,L,I){id;drive;mimetype;purpose;client_name;filename;public;url;metas;isImage(){return this.mimetype.startsWith(`image/`)}},dt=class extends T(N,L,I){id;file_id;name;value};T(N,L,I);var ft=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},pt=class extends T(N,Ve(ft)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}};T(N);var mt=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},ht=class extends T(N){id;name;version;enabled;aliases};T(N,L,I),T(N,L,I);var gt=class n extends e{__is_cli_command=!0;table=Ie;object=Fe;colors=t;needs=new Set;need(...e){return e.forEach(e=>this.needs.add(e)),this}createCommand(e){return new n(e)}},_t=class e extends gt{static __container_entry_key=`CliService`;dirs=new Set;logger=new x;emmitter=new A;debug=!1;static create(t=`cli`){return new e(t)}setLogger(e){return this.logger=e,this}setDebug(e){return this.debug=e,this}setEmmitter(e){return this.emmitter=e,this}createCommand(t){return new e(t)}addDir(e){return this.dirs.add(e),this}async loadDir(e){let t=await Be(e,{exclude:[`.test.ts`,`.spec.ts`,`.test.js`,`.spec.js`],onError:({error:e,filename:t})=>{Object.assign(e,{filename:t}),this.logger.error(e.message,e)}});for(let[n,r]of Object.entries(t)){if(this.debug&&this.logger.debug(`imported file ${n} from ${e}`),!r.default||Object.keys(r.default).length===0)continue;if(!r.default.__is_cli_command){this.logger.warn(`default export of file ${r.filename} is not a CliCommand, skipping`);continue}let[t]=b.sync(()=>this.addCommand(r.default));if(t){Object.assign(t,{filename:r.filename}),this.logger.error(t.message,t);continue}this.debug&&this.logger.debug(`added command from file ${n} to cli`)}}async load(){for(let e of this.dirs)await this.loadDir(e);return this}},vt=class extends _t{constructor(){super(),this.exitOverride(),this.configureOutput({writeOut:()=>{},writeErr:()=>{}}),C.set(_t,this)}async add(e){await import(e)}async execute(e){await this.parseAsync([`node`,`arte`,...e])}},yt=class e{process=null;appBasePath;env=new Map;args=[];configArguments=new Map;configFiles=[];debug=!1;logger=new x;static create(){return new e}setBasePath(e){return this.appBasePath=e,this}setDebug(e){return this.debug=e,this}setLogger(e){return this.logger=e,this}addConfigArgument(e,t){return this.configArguments.set(e,t),this}addConfigFile(...e){return this.configFiles.push(...e),this}addEnv(e,t){return this.env.set(e,t),this}loadConfigArguments(){let e=process.argv.slice(2).filter(e=>e.startsWith(`@config:`));for(let t of e){let[e,n]=t.slice(8).split(`=`).map(e=>e.trim());this.configArguments.set(e,n)}}loadConfigFiles(){let e=process.argv.slice(2).filter(e=>e.startsWith(`@config-file:`)).map(e=>e.slice(13));if(this.addConfigFile(...e),process.env.CONFIG_FILES){let e=process.env.CONFIG_FILES.split(`,`).map(e=>e.trim()).filter(Boolean);this.addConfigFile(...e)}}loadEnvironment(){let e=Array.from(this.configArguments.entries()).map(([e,t])=>`${e}=${t}`).join(`;`);this.addEnv(`ZENITH_CONFIG_ARGUMENTS`,e),this.addEnv(`ZENITH_CONFIG_FILES`,this.configFiles.join(`,`))}loadArguments(e=[]){let t=[`@config:`,`@config-file:`],n=e.filter(e=>!t.some(t=>e.startsWith(t)));this.args=[`--no-warnings`,`--experimental-strip-types`,`--enable-source-maps`,r.join(this.appBasePath,`server`,`cli.ts`),...n]}kill(e=0){this.process&&!this.process.killed&&this.process.kill(`SIGTERM`),process.exit(e)}async run(e){if(!this.appBasePath)throw Error(`Base path not set. Please call setBasePath() before run().`);this.loadConfigArguments(),this.loadConfigFiles(),this.loadArguments(e||process.argv.slice(2)),this.loadEnvironment(),this.debug&&this.logger.debug(`run`,{args:this.args,env:this.env}),this.process=ce.spawn(`node`,this.args,{stdio:`inherit`,env:{...process.env,...Object.fromEntries(this.env.entries())}}),process.on(`SIGINT`,()=>this.kill()),process.on(`SIGTERM`,()=>this.kill()),process.on(`exit`,()=>this.kill())}};const R=process.env.ZENITH_BASE_PATH,bt=process.env.ZENITH_STORAGE_PATH||r.join(R||``,`storage`);function z(...e){if(!R)throw Error(`ZENITH_BASE_PATH environment variable is not set`);return r.resolve(R,...e)}function xt(...e){return r.resolve(bt,...e)}function St(...e){if(!R)throw Error(`ZENITH_BASE_PATH environment variable is not set`);return r.relative(process.cwd(),r.resolve(R,...e))}function Ct(...e){return z(`tmp`,...e)}var wt=class extends k{logger;debug=!1;format=`json`;directory;constructor(e={}){super(),this.debug=e.debug??!1,this.directory=e.directory??z(`config`),this.logger=e.logger??w.child({label:`config`}),this.format=e.format??`json`,this.debug&&this.logger.debug(`service initialized in debug mode`)}async write(e,t){let n=this.format===`yml`?`yml`:`json`,i=r.join(this.directory,`${e}.${n}`),a=this.format===`yml`?h.dump(t):JSON.stringify(t,null,4);await s.promises.writeFile(i,a,`utf-8`)}writeSync(e,t){let n=this.format===`yml`?`yml`:`json`,i=r.join(this.directory,`${e}.${n}`),a=this.format===`yml`?h.dump(t):JSON.stringify(t,null,4);s.writeFileSync(i,a,`utf-8`)}async load(){this.clear(),s.existsSync(this.directory)||(this.debug&&this.logger.debug(`config directory does not exist, creating: ${this.directory}`),s.mkdirSync(this.directory,{recursive:!0}));let e=await s.promises.readdir(this.directory);for(let t of e){let e=r.extname(t);if(this.format===`json`&&e!==`.json`||this.format===`yml`&&e!==`.yml`)continue;let n=r.join(this.directory,t),[i,a]=await b(async()=>{let e=await s.promises.readFile(n,`utf-8`);return r.extname(t)===`.yml`?h.load(e):JSON.parse(e)});if(i){this.logger.error(`failed to load config file ${t}`,i);continue}let o=r.basename(t,r.extname(t));super.set(o,a,`filesystem`),this.debug&&this.logger.debug(`loaded config file: ${t}`)}this.debug&&this.logger.debug(`config loaded in debug mode`)}parseKey(e){let[t,...n]=e.split(`.`);return{entry:t,key:n.join(`.`)}}set(e,t,n=`filesystem`){if(super.set(e,t,n),n!==`filesystem`)return;let{entry:r,key:i}=this.parseKey(e),a=this.get(r);i||(a=t),i&&a&&d(a,i,t),this.writeSync(r,a)}unset(e){let{entry:t,key:n}=this.parseKey(e);if(!n){let n=this.format===`yml`?`yml`:`json`,i=r.join(this.directory,`${t}.${n}`);s.unlinkSync(i),super.unset(e);return}let i=this.get(t);d(i,n,void 0),this.writeSync(t,i),super.unset(e)}},Tt=class{id;name;description;config={};constructor(e){this.id=e.id,this.name=e.name,this.description=e.description,this.config=e.config}list(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{folder:e}),t}find(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}exists(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}read(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}readStream(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}write(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,data:t}),n}writeStream(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,stream:t}),n}delete(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}url(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,options:t}),n}uploadUrl(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,options:t}),n}};const Et=M.create(e=>e.object({bucket:e.pipe(e.string(),e.minLength(1)),region:e.optional(e.string()),accessKeyId:e.pipe(e.string(),e.minLength(1)),secretAccessKey:e.pipe(e.string(),e.minLength(1)),sessionToken:e.optional(e.string()),endpoint:e.optional(e.string()),prefix:e.optional(e.string())}));function Dt(e){return!e||typeof e!=`object`||typeof e.on!=`function`?Promise.resolve(new Uint8Array):new Promise((t,n)=>{let r=[];e.on(`data`,e=>r.push(Buffer.from(e))),e.on(`end`,()=>t(new Uint8Array(Buffer.concat(r)))),e.on(`error`,n)})}var Ot=class extends Tt{schema=Et;_client;constructor(e){super(e)}get valid(){return M.isValid(this.config,this.schema)}checkValid(){if(!this.valid)throw new S($t(`Invalid drive configuration`))}get bucket(){return this.config.bucket}get prefix(){return this.config?.prefix?this.config?.prefix.endsWith(`/`)?this.config.prefix:this.config.prefix+`/`:``}getKey(e){let t=e.startsWith(`/`)?e.slice(1):e;return this.prefix?`${this.prefix.endsWith(`/`)?this.prefix:`${this.prefix}/`}${t}`:t}get client(){if(this._client)return this._client;let e=this.config;return this._client=new _e({region:e.region,endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,sessionToken:e.sessionToken}}),this._client}exists=async e=>{this.checkValid();let t=this.getKey(e);return this.client.send(new me({Bucket:this.bucket,Key:t})).then(()=>!0).catch(()=>!1)};list=async e=>{this.checkValid();let t=e?this.getKey(e):this.prefix||void 0;t&&!t.endsWith(`/`)&&(t+=`/`);let n=new he({Bucket:this.bucket,Prefix:t,Delimiter:`/`}),r=await this.client.send(n),i=[],a=r.CommonPrefixes||[];for(let e of a){let t=e.Prefix||``;t=t.replace(this.prefix,``),t.endsWith(`/`)&&(t=t.slice(0,-1));let n=new lt({name:t.split(`/`).pop()||t,path:`/`+t,type:`directory`,metas:{size:0,mimetype:`application/x-directory`}});i.push(n)}let o=r.Contents||[];for(let e of o){let t=e.Key||``;if(t=t.replace(this.prefix,``),t.endsWith(`/`))continue;let n=new lt({name:t.split(`/`).pop()||t,path:`/`+t,type:`file`,metas:{size:e.Size,mimetype:be.getType(t)||`application/octet-stream`}});i.push(n)}return i};find=async e=>{this.checkValid();let t=e.startsWith(`/`)?e:`/`+e,n=i(t),r=(await this.list(n)).find(e=>e.path===t);if(!r)throw Error(`File "${t}" not found`);return r};async mkdir(e){return this.checkValid(),Promise.resolve()}read=async e=>{this.checkValid();let t=this.getKey(e),n=(await this.client.send(new pe({Bucket:this.bucket,Key:t}))).Body;return Dt(n)};async readStream(e){this.checkValid();let t=this.getKey(e),n=new pe({Bucket:this.bucket,Key:t}),r=(await this.client.send(n)).Body;return Promise.resolve(r)}write=async(e,t)=>{this.checkValid();let n=this.getKey(e);await this.client.send(new ge({Bucket:this.bucket,Key:n,Body:Buffer.from(t)}))};async writeStream(e,t){this.checkValid();let n=this.getKey(e);await new ye({client:this.client,params:{Bucket:this.bucket,Key:n,Body:ue.from(t)}}).done()}delete=async e=>{this.checkValid();let t=this.getKey(e);if((await this.find(e)).type===`file`){let e=new de({Bucket:this.bucket,Key:t});await this.client.send(e);return}let n=await this.client.send(new he({Bucket:this.bucket,Prefix:t})),r=(n.Contents||[]).map(e=>({Key:e.Key}));r.length!==0&&(await this.client.send(new fe({Bucket:this.bucket,Delete:{Objects:r}})),n.IsTruncated&&this.delete(e))};url=async(e,t)=>{this.checkValid();let n=this.getKey(e),r=g(t?.expires||`30m`)||1800*1e3,i=Math.max(1,Math.round(r/1e3));return ve(this.client,new pe({Bucket:this.bucket,Key:n}),{expiresIn:i})};uploadUrl=async(e,t)=>{this.checkValid();let n=this.getKey(e),r=g(t?.expires||`30m`)||1800*1e3,i=Math.max(1,Math.round(r/1e3)),a=new ge({Bucket:this.bucket,Key:n});return ve(this.client,a,{expiresIn:i})}},kt=class extends k{prefix=``;logger;debug=!1;drive;bucket;region;endpoint;constructor(e){super(),this.debug=e.debug??!1,this.prefix=e.prefix??``,this.bucket=e.bucket,this.region=e.region||``,this.endpoint=e.endpoint,this.logger=e.logger??new x,this.drive=new Ot({id:`config-s3`,name:`config-s3`,config:{bucket:e.bucket,region:e.region,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,sessionToken:e.sessionToken,endpoint:e.endpoint}}),this.debug&&this.logger.debug(`service initialized in debug mode`)}parseKey(e){let[t,...n]=e.split(`.`);return{filename:t,key:n.join(`.`)}}async load(){this.clear();let e=this.prefix.replace(/^\/|\/$/g,``),t=await this.drive.list(e||void 0);for(let n of t){if(!n.name.endsWith(`.json`))continue;let t=n.name,r=e?`${e}/${t}`:t,[i,a]=await b(async()=>{let e=await this.drive.read(r),t=Buffer.from(e).toString(`utf-8`);return JSON.parse(t)});if(i){this.logger.error(`failed to load config file ${t}`,i);continue}let o=t.replace(/\.json$/,``);super.set(o,a),this.debug&&this.logger.debug(`loaded config file: ${t}`)}this.debug&&this.logger.debug(`config loaded in debug mode`)}set(e,t,n=`s3`){if(super.set(e,t,n),n!==`s3`)return;let{filename:r,key:i}=this.parseKey(e),a=this.get(r);i||(a=t),i&&a&&d(a,i,t);let o=this.prefix.replace(/^\/|\/$/g,``),s=o?`${o}/${r}.json`:`${r}.json`,c=Buffer.from(JSON.stringify(a,null,4));this.drive.write(s,c).catch(e=>{this.logger.error(`failed to write config to s3`,e)})}unset(e){let t=this.prefix.replace(/^\/|\/$/g,``);if(!e.includes(`.`)){let n=t?`${t}/${e}.json`:`${e}.json`;this.drive.delete(n).catch(e=>{this.logger.error(`failed to delete config from s3`,e)});return}let{filename:n,key:r}=this.parseKey(e),i=this.get(n);d(i,r,void 0);let a=t?`${t}/${n}.json`:`${n}.json`;this.drive.write(a,Buffer.from(JSON.stringify(i,null,4))).catch(e=>{this.logger.error(`failed to write config to s3`,e)}),super.unset(e)}},At=class e{env;logger;silent;constructor(e){this.env=e.env,this.logger=e.logger,this.silent=e.silent??!1}static create(t){return new e(t)}async loadS3Config(){let e=new kt({bucket:this.env.get(`ZENITH_CONFIG_S3_BUCKET`),region:this.env.get(`ZENITH_CONFIG_S3_REGION`),accessKeyId:this.env.get(`ZENITH_CONFIG_S3_ACCESS_KEY_ID`),secretAccessKey:this.env.get(`ZENITH_CONFIG_S3_SECRET_ACCESS_KEY`),debug:this.env.get(`ZENITH_CONFIG_DEBUG`),endpoint:this.env.get(`ZENITH_CONFIG_S3_ENDPOINT`),prefix:this.env.get(`ZENITH_CONFIG_S3_PREFIX`),sessionToken:this.env.get(`ZENITH_CONFIG_S3_SESSION_TOKEN`),logger:this.logger});return await e.load(),this.silent||this.logger.info(`using S3 configuration service`,{bucket:e.bucket,region:e.region,prefix:e.prefix}),e}async loadFSConfig(){let e=new wt({directory:this.env.get(`ZENITH_CONFIG_FS_PATH`),debug:this.env.get(`ZENITH_CONFIG_DEBUG`),format:this.env.get(`ZENITH_CONFIG_FS_FORMAT`),logger:this.logger});return await e.load(),this.silent||this.logger.info(`using filesystem configuration service`,{path:e.directory}),e}loadConfigFromEnv(e){for(let[t,n]of Object.entries(D(this.env.get(`ZENITH_CONFIG`)||{})))e.set(t,n,`env`);for(let[t,n]of Object.entries(D(this.env.get(`ZENITH_CONFIG_ARGUMENTS`)||{})))e.set(t,n,`argument`)}loadConfigFromFile(e,t){if(!s.existsSync(t)){this.logger.warn(`configuration file not found: ${t}`);return}let n=s.readFileSync(t,`utf-8`),r=null;if((t.endsWith(`.yml`)||t.endsWith(`.yaml`))&&(r=h.load(n)),!r)throw new S(`unsupported configuration file format: ${t}`);for(let[n,i]of Object.entries(D(r)))e.set(n,i,t)}loadConfigFromFiles(e,t){for(let n of t)this.loadConfigFromFile(e,n)}async load(){let e=null;if(this.env.get(`ZENITH_CONFIG_DRIVER`)===`s3`&&(e=await this.loadS3Config()),(!e||this.env.get(`ZENITH_CONFIG_DRIVER`)===`fs`)&&(e=await this.loadFSConfig()),!e)throw new S(`Failed to initialize configuration service: No valid driver found`);if(!e)throw new S(`Failed to initialize configuration service`);return this.loadConfigFromFiles(e,this.env.get(`ZENITH_CONFIG_FILES`)),this.loadConfigFromEnv(e),e}},jt=class{async fetch(e,t){let n=t||{};return t?.proxy&&(n.dispatcher=new xe(t.proxy)),console.log(`Downloading from URL:`,e,`with options:`,n),await Se(e,n)}async stream(e,t){let n=await this.fetch(e,t);if(!n.ok){let e=new S(`Failed to download`,400);throw Object.assign(e,{status:n.status,statusText:n.statusText}),e}if(!n.body)throw new S(`No body`,400);let r=n.headers.get(`content-type`)||`application/octet-stream`;return{stream:n.body,contentType:r}}};const B=C.proxy(k);function Mt(e,t={}){return function(n){return class extends n{static __isConfigModel=!0;static serialize(e){let t=new this;return Object.assign(t,e),t}static async list(){let t=this,n=B.get(e)||{},r=[];for(let[e,i]of Object.entries(n)){let n=t.serialize(JSON.parse(JSON.stringify({...i,id:e})));r.push(n)}return await F.emit(this,`afterList`,r),r}static async find(e){let t=(await this.list()).find(t=>t.id===e);if(!t)return null;let n=JSON.parse(JSON.stringify(t));return await F.emit(this,`afterFind`,n),n||null}static async findOrFail(e){let t=await this.find(e);if(!t)throw Error(`Entity item not found`);return t}static async create(n){if(t.readonly)throw new S(`Readonly config model`);if(!n.id)throw Error(`Entity item requires an id`);let r=this,i=B.get(e)||{};if(i[n.id])throw Error(`Entity item already exists`);return await F.emit(this,`beforeCreate`,n),i[n.id]={...n},delete i[n.id].id,await B.set(e,i),r.findOrFail(n.id)}static async update(n,r){if(t.readonly)throw new S(`Readonly config model`);let i=this,a=B.get(e)||{};if(!a[n])throw Error(`Entity item not found`);return await F.emit(this,`beforeUpdate`,r),Object.assign(a[n],r),await B.set(e,a),i.findOrFail(n)}static async updateOrCreate(e,t){let n=this;return await n.find(e)?n.update(e,t):n.create({...t,id:e})}static async destroy(n){if(t.readonly)throw new S(`Readonly config model`);let r=B.get(e)||{};if(!r[n])throw Error(`Entity item not found`);delete r[n],await B.set(e,r)}}}}var V=class extends E(ct,Mt(`drive.disks`)){static serialize(e){let t=new this;return t.id=e.id,t.name=e.name||e.id,t.type=e.type,t.config=e.config||{},t.is_default=B.get(`drive.default`)===e.id,t}};const Nt=f.pipe(f.union([f.literal(`true`),f.literal(`false`),f.literal(`1`),f.literal(`0`)]),f.transform(e=>e===`true`||e===`1`),f.boolean()),H=f.pipe(f.string(),f.transform(e=>{let t=e.split(/[;\n]/).filter(Boolean).filter(e=>e.includes(`=`)).map(e=>e.trim().split(`=`)),n=Object.fromEntries(t),r={};for(let[e,t]of Object.entries(n)){let n=t;t.startsWith(`bool:`)&&(n=t.replace(`bool:`,``).trim()===`true`),d(r,e,n)}return r})),Pt=f.pipe(f.string(),f.transform(e=>e.split(`,`).map(e=>e.trim()).filter(Boolean))),Ft=f.looseObject({NODE_ENV:f.optional(f.union([f.literal(`development`),f.literal(`production`),f.literal(`test`)]),`development`),ZENITH_BASE_PATH:f.string(),ZENITH_STORAGE_PATH:f.optional(f.string()),ZENITH_APP_URL:f.optional(f.string(),`http://localhost:3000`),ZENITH_PORT:f.optional(f.pipe(f.string(),f.transform(e=>parseInt(e))),`3000`),ZENITH_HOST:f.optional(f.string(),`0.0.0.0`),ZENITH_LOG_LEVEL:f.optional(f.picklist([`error`,`warn`,`info`,`debug`]),`info`),ZENITH_LIFECYCLE_DEBUG:f.optional(Nt,`false`),ZENITH_CLIENT_CONFIG:f.optional(H,``),ZENITH_CONFIG:f.optional(H,``),ZENITH_CONFIG_ARGUMENTS:f.optional(H,``),ZENITH_CONFIG_FILES:f.optional(Pt,``),ZENITH_CONFIG_DEBUG:f.optional(Nt,`false`),ZENITH_CONFIG_DRIVER:f.optional(f.picklist([`fs`,`s3`]),`fs`),ZENITH_CONFIG_FS_PATH:f.optional(f.string()),ZENITH_CONFIG_FS_FORMAT:f.optional(f.picklist([`json`,`yml`]),`json`),ZENITH_CONFIG_S3_BUCKET:f.optional(f.string()),ZENITH_CONFIG_S3_REGION:f.optional(f.string()),ZENITH_CONFIG_S3_ACCESS_KEY_ID:f.optional(f.string()),ZENITH_CONFIG_S3_SECRET_ACCESS_KEY:f.optional(f.string()),ZENITH_CONFIG_S3_SESSION_TOKEN:f.optional(f.string()),ZENITH_CONFIG_S3_ENDPOINT:f.optional(f.string()),ZENITH_CONFIG_S3_PREFIX:f.optional(f.string(),``),ZENITH_PLUGINS_DIRS:f.optional(Pt)});var It=class e{env=null;files=[];static create(){return new e}static dotEnvConfig(e){return Ce.config(e)}setFiles(e){return this.files=e,this}addFile(e){return this.files.push(e),this}load(){return e.dotEnvConfig({path:this.files,override:!0,quiet:!0}),this.env=f.parse(Ft,process.env),this}get production(){return this.get(`NODE_ENV`)===`production`}get development(){return this.get(`NODE_ENV`)===`development`}get test(){return this.get(`NODE_ENV`)===`test`}has(e){if(!this.env)throw new S(`Environment variables not loaded. Call load() before accessing environment variables.`);return this.env[e]!==void 0}get(e,t){if(!this.env)throw new S(`Environment variables not loaded. Call load() before accessing environment variables.`);return this.env[e]===void 0?t:this.env[e]}set(e,t){if(!this.env)throw new S(`Environment variables not loaded. Call load() before accessing environment variables.`);this.env[e]=t}},Lt=class e{static __container_entry_key=`EncryptService`;debug=!1;env;logger;algorithm=`aes-256-cbc`;key=null;constructor(e){this.env=e.env||new It,this.logger=e.logger||new x,this.debug=e.debug||!1,e.key&&(this.key=_.scryptSync(e.key,`salt`,32))}static create(t){return new e(t)}setDebug(e){this.debug=e,this.debug&&this.logger.debug(`debug mode enabled`)}setLogger(e){this.logger=e}setEnv(e){this.env=e}setKey(e){this.key=_.scryptSync(e,`salt`,32)}encrypt(e){if(!this.key)throw Error(`Encryption key not set`);let t=_.randomBytes(16),n=_.createCipheriv(this.algorithm,this.key,t),r=n.update(e,`utf8`,`hex`);return r+=n.final(`hex`),`${t.toString(`hex`)}:${r}`}decrypt(e){if(!this.key)throw Error(`Encryption key not set`);let[t,n]=e.split(`:`),r=Buffer.from(t,`hex`),i=_.createDecipheriv(this.algorithm,this.key,r),a=i.update(n,`hex`,`utf8`);return a+=i.final(`utf8`),a}encryptObject(e){let t=JSON.stringify(e);return this.encrypt(t)}decryptObject(e){let t=this.decrypt(e);return JSON.parse(t)}url(e,t){let n=t?.expireAt;if(t?.expires){let e=g(t.expires);n=Date.now()+e}n||=Date.now()+g(`15 minutes`),n instanceof Date&&(n=n.getTime());let r={data:t?.data||{},expireAt:n,expireAtReadable:p(new Date(n),`yyyy-MM-dd HH:mm:ss`)},i=this.encrypt(JSON.stringify(r)),a=this.env.get(`ZENITH_APP_URL`);if(!a)throw new S(`APP_URL not set in environment variables`);let o=new URL(e,a);return o.searchParams.append(`key`,encodeURIComponent(i)),o.toString()}verifyUrl(e){let t=this.decrypt(decodeURIComponent(e)),n=JSON.parse(t);if(n.expireAt&&Date.now()>n.expireAt){let e=new S(`URL has expired`,403);throw Object.assign(e,{expireAt:n.expireAt,expireAtReadable:n.expireAtReadable}),e}return n.data}};const U=C.proxy(Lt);var Rt=class extends Tt{schema=M.create(e=>e.object({directory:e.pipe(e.string(),e.minLength(1))}));constructor(e){super(e)}get valid(){return M.isValid(this.config,this.schema)}checkValid(){if(!this.valid)throw new S($t(`Invalid drive configuration`));if(!s.existsSync(this.rootPath))throw new S($t(`Drive root path does not exist`))}get rootPath(){return z(this.config.directory)}exists=async e=>(this.checkValid(),s.promises.access(a(this.rootPath,e)).then(()=>!0).catch(()=>!1));list=async e=>{this.checkValid();let t=e?a(this.rootPath,e):this.rootPath;if(!await this.exists(o(this.rootPath,t)))return[];let n=await s.promises.readdir(t),r=[];for(let e of n){let n=a(t,e),i=await s.promises.stat(n),c={};i.isFile()&&(c.size=i.size,c.mimetype=be.getType(e)||`application/octet-stream`);let l=new lt({name:e,path:`/`+o(this.rootPath,n),type:i.isDirectory()?`directory`:`file`,metas:c});r.push(l)}return r};find=async e=>{this.checkValid();let t=e.startsWith(`/`)?e:`/`+e,n=(await this.list(r.dirname(t))).find(e=>e.path===t);if(!n)throw Error(`File "${t}" not found`);return n};async mkdir(e){this.checkValid(),await this.exists(r.dirname(e))||await this.mkdir(r.dirname(e));let t=a(this.rootPath,e);await s.promises.mkdir(t,{recursive:!0})}read=async e=>{this.checkValid();let t=a(this.rootPath,e),n=await s.promises.readFile(t);return new Uint8Array(n)};async readStream(e){this.checkValid();let t=a(this.rootPath,e),n=s.createReadStream(t);return Promise.resolve(n)}write=async(e,t)=>{this.checkValid(),await this.exists(r.dirname(e))||await this.mkdir(r.dirname(e));let n=a(this.rootPath,e);await s.promises.writeFile(n,t)};async writeStream(e,t){this.checkValid(),await this.exists(r.dirname(e))||await this.mkdir(r.dirname(e));let n=a(this.rootPath,e);return new Promise((e,r)=>{let i=s.createWriteStream(n);t.pipe(i),i.on(`finish`,e),i.on(`error`,r)})}delete=async e=>{this.checkValid();let t=a(this.rootPath,e);if(await s.promises.stat(t).then(e=>e.isDirectory()).catch(()=>!1)){await s.promises.rmdir(t,{recursive:!0});return}await s.promises.unlink(t)};url=async(e,t)=>{this.checkValid();let n=e.startsWith(`/`)?e:`/${e}`;return U.url(`/api/drives/${this.id}/stream${n}`,{expires:t?.expires||`30m`})};uploadUrl=async(e,t)=>{this.checkValid();let n=e.startsWith(`/`)?e:`/${e}`;return U.url(`/api/drives/${this.id}/upload${n}`,{expires:t?.expires||`30m`,data:{mime_types:t?.mime_types,max_size:t?.max_size}})}},zt=class e{static __container_entry_key=`DriveService`;gateways;drives=new Map;selected;defaultDrive;debug=!1;logger;get current(){if(!this.selected)return;let e=this.drives.get(this.selected);if(e)return e}constructor(e={}){this.selected=e.selected||this.selected,this.debug=e.debug||this.debug,this.drives=e.drives||this.drives,this.logger=e.logger||w.child({label:`drive`}),this.gateways=new Map,this.gateways.set(`s3`,Ot),this.gateways.set(`fs`,Rt)}listDrives(){return Array.from(this.drives.values()).map(e=>({...e,default:e.id===this.defaultDrive}))}get(e){if(!e||!this.drives.has(e||``))throw new S(`Drive not found`);let t=this.drives.get(e);if(!t)throw new S(`Drive not found`);return t}use(t){if(!this.drives.has(t||``))throw new S(`Drive not found`);return new e({selected:t,drives:this.drives,debug:this.debug})}list(e){if(!this.current)throw new S(`No drive selected`);return this.current.list(e)}find(e){if(!this.current)throw new S(`No drive selected`);return this.current.find(e)}exists(e){if(!this.current)throw new S(`No drive selected`);return this.current.exists(e)}read(e){if(!this.current)throw new S(`No drive selected`);return this.current.read(e)}readStream(e){if(!this.current)throw new S(`No drive selected`);return this.current.readStream(e)}async readAsText(e){let t=await this.read(e);return new TextDecoder().decode(t)}write(e,t){if(!this.current)throw new S(`No drive selected`);let n=t;return typeof t==`object`&&!(t instanceof Uint8Array)&&(n=JSON.stringify(t,null,4)),typeof n==`string`&&(n=new TextEncoder().encode(n)),this.current.write(e,n)}writeStream(e,t){if(!this.current)throw new S(`No drive selected`);return this.current.writeStream(e,t)}async url(e,t={}){if(!this.current)throw new S(`No drive selected`);return this.current.url(e,t)}async uploadUrl(e,t={}){if(!this.current)throw new S(`No drive selected`);return this.current.uploadUrl(e,t)}async upload(e,t){let n=await s.promises.readFile(e),r=new Uint8Array(n);return this.write(t,r)}async download(e,t){let n=await this.read(e);await s.promises.writeFile(t,n)}delete(e){if(!this.current)throw new S(`No drive selected`);return this.current.delete(e)}async load(){this.drives.clear();let e=await V.list();for(let t of e){let e=this.gateways.get(t.type);if(!e){this.logger.warn(`Drive gateway for type "${t.type}" not found`);continue}let n=new e(t);this.drives.set(t.id,n),this.debug&&this.logger.debug(`drive loaded ${t.id} (${t.type})`)}this.selected=B.get(`drive.default`),this.defaultDrive=B.get(`drive.default`)}async createDefaultDrives(){await V.updateOrCreate(`storage-uploads`,{name:`Uploads`,type:`fs`,config:{directory:xt(`uploads`)}}),B.get(`drive.default`)||B.set(`drive.default`,`storage-uploads`),await this.load()}validateUpload(e,t){if(!e.mime_types.split(`,`).map(e=>e.trim()).some(e=>{if(!e.endsWith(`/*`))return e===t.mimetype;let n=e.slice(0,-2);return t.mimetype.startsWith(n+`/`)}))throw new S(`MIME type not allowed`,403);if(e.maxSize&&t.size>e.maxSize)throw new S(`File size exceeds the maximum allowed`,403)}},Bt=class extends A{},Vt=class{constructor(e){this.gateway=e}async list(){return(await this.gateway.run(`branch -a --format='%(HEAD)|%(refname:short)|%(refname)|%(upstream:remotename)'`)).split(`
2
+ `).filter(Boolean).filter(e=>e.includes(`|`)).map(e=>{let[t,n,r,i]=e.split(`|`),a=r.startsWith(`refs/remotes/`),o=n;return{name:o,remote:a?o.split(`/`)[0]:i||null,isCurrent:t===`*`,isRemote:a}})}async fetch(e){let{remote:t,branch:n,localName:r}=e,i=r??n;await this.gateway.run(`fetch ${t} ${n}:${i}`)}};const Ht=[`%H`,`%h`,`%an`,`%ae`,`%aI`,`%s`,`%D`].join(`%x09`);function Ut(e){if(!e.trim())return[];let t=[];for(let n of e.split(`, `)){let e=n.trim();if(e)if(e.startsWith(`HEAD -> `)){let n=e.slice(8);t.push({name:`HEAD`,shortName:`HEAD`,type:`other`}),t.push({name:`refs/heads/${n}`,shortName:n,type:`branch`})}else if(e.startsWith(`tag: `)){let n=e.slice(5);t.push({name:`refs/tags/${n}`,shortName:n,type:`tag`})}else e===`HEAD`?t.push({name:`HEAD`,shortName:`HEAD`,type:`other`}):e.includes(`/`)?t.push({name:`refs/remotes/${e}`,shortName:e,type:`remote`}):t.push({name:`refs/heads/${e}`,shortName:e,type:`branch`})}return t}var Wt=class{constructor(e){this.gateway=e}async list(e){let t=e?.page??1,n=e?.perPage??20,r=e?.branch??`HEAD`,i=(await this.gateway.run(`log ${r} --format='${Ht}'`)).split(`
3
+ `).filter(Boolean).map(e=>{let[t,n,r,i,a,o,s=``]=e.split(` `);return{hash:t,shortHash:n,authorName:r,authorEmail:i,date:a,message:o,refs:Ut(s)}}),a=i.length,o=Math.ceil(a/n),s=(t-1)*n;return{items:i.slice(s,s+n),total:a,page:t,perPage:n,totalPages:o}}},Gt=class extends Ue{async addDirectory(e){let t=await Be(e),n=[];for(let[e,r]of Object.entries(t)){let t=new(r.default||r);t.hook_id=t.hook_id||e,n.push(t)}n.forEach(e=>this.add(e))}},Kt=class{payload;table;foreignKey;parentKey=`id`;constructor(e,t,n,r){this.payload=e,this.table=t,this.foreignKey=n,r&&(this.parentKey=r)}get needWhereIn(){for(let e of Object.values(this.payload))if(typeof e==`string`||e.eq!==void 0||e.neq!==void 0||e.like!==void 0||e.nlike!==void 0||e.in!==void 0||e.nin!==void 0||e.gt!==void 0||e.gte!==void 0||e.lt!==void 0||e.lte!==void 0||e.is_null!==void 0||e.exists===!0)return!0;return!1}get needWhereNotIn(){for(let e of Object.values(this.payload))if(typeof e!=`string`&&e.exists===!1)return!0;return!1}apply(e){let t=e;return this.needWhereIn&&(t=t.where(this.parentKey,`in`,e=>e.selectFrom(this.table).select(this.foreignKey).where(this.whereIn(e)))),this.needWhereNotIn&&(t=t.where(this.parentKey,`not in`,e=>e.selectFrom(this.table).select(this.foreignKey).where(this.whereNotIn(e)))),t}buildRowConditions(e,t,n){if(typeof n==`string`)return[e.eb(`name`,`=`,t),e.eb(`value`,`=`,n)];let r=[e.eb(`name`,`=`,t)];return n.eq!==void 0&&r.push(e.eb(`value`,`=`,n.eq)),n.neq!==void 0&&r.push(e.eb(`value`,`!=`,n.neq)),n.like!==void 0&&r.push(e.eb(`value`,`like`,n.like)),n.nlike!==void 0&&r.push(e.eb(`value`,`not like`,n.nlike)),n.in&&r.push(e.eb(`value`,`in`,n.in)),n.nin&&r.push(e.eb(`value`,`not in`,n.nin)),n.gt!==void 0&&r.push(e.eb(`value`,`>`,n.gt)),n.gte!==void 0&&r.push(e.eb(`value`,`>=`,n.gte)),n.lt!==void 0&&r.push(e.eb(`value`,`<`,n.lt)),n.lte!==void 0&&r.push(e.eb(`value`,`<=`,n.lte)),n.is_null!==void 0&&r.push(e.eb(`value`,n.is_null?`is`:`is not`,null)),r}whereIn=e=>{let t=e;for(let[n,r]of Object.entries(this.payload))typeof r!=`string`&&r.exists===!1||(t=t.and(this.buildRowConditions(e,n,r)));return t};whereNotIn=e=>{let t=e;for(let[e,n]of Object.entries(this.payload))typeof n!=`string`&&n.exists===!1&&(t=t(`name`,`=`,e));return t}};const qt=`database`,W=C.proxy(qt);var Jt=class e{id;table;foreignKey;constructor(e){this.id=e.id,this.table=e.table,this.foreignKey=e.foreignKey}static parse(e){return typeof e==`string`&&e.startsWith(`json:`)?JSON.parse(e.slice(5)):typeof e==`string`&&e.startsWith(`bool:`)?e.slice(5)===`true`:typeof e==`string`&&e.startsWith(`number:`)?Number(e.slice(7)):typeof e==`string`&&e.startsWith(`string:`)?e.slice(7):e}static flatten(t){let n={};for(let r of t)n[r.name]=e.parse(r.value);return n}async get(t,n){let r=W.selectFrom(this.table);r=r.selectAll().where(this.foreignKey,`=`,this.id).where(`name`,`=`,t).limit(1);let i=await r.executeTakeFirst();return!i||!i.value?n:e.parse(i.value)}async set(e,t){let n=this.foreignKey,r=this.table,i={[n]:this.id,name:e,value:t};if(typeof t==`object`&&(i.value=`json:${JSON.stringify(t)}`),await W.selectFrom(r).where(n,`=`,this.id).where(`name`,`=`,e).executeTakeFirst()){await W.updateTable(r).set(i).where(n,`=`,this.id).where(`name`,`=`,e).execute();return}await W.insertInto(r).values(i).execute()}async list(){let t=this.foreignKey,n=this.table,r=W.selectFrom(n);return r=r.selectAll().where(t,`=`,this.id),(await r.execute()).map(t=>({name:t.name,value:e.parse(t.value)}))}async all(){let e=await this.list(),t={};for(let n of e)t[n.name]=n.value;return t}},Yt=class{name;source;filename;executedAt;constructor(e){this.name=e.name,this.source=e.source,this.filename=e.filename,this.executedAt=e.executedAt}async up(e){let t=await import(this.filename);if(typeof t.up!=`function`)throw new S(`Migration ${this.name} does not export an up function`);await t.up(e)}async down(e){let t=await import(this.filename);if(typeof t.down!=`function`)throw new S(`Migration ${this.name} does not export a down function`);await t.down(e)}},Xt=class{static __container_entry_key=`MigratorService`;debug=!1;emmitter;logger;db;sources;constructor(e){this.debug=e.debug??this.debug,this.emmitter=e.emmitter||new A,this.logger=e.logger||new x,this.db=e.db,this.sources=e.sources}addSource(e){this.sources.push(e)}async ensureMigrationsTable(){await this.db.schema.createTable(`migrations`).ifNotExists().addColumn(`name`,`varchar(255)`,e=>e.primaryKey()).addColumn(`module`,`varchar(255)`).addColumn(`executed_at`,`timestamp`,e=>e.notNull()).execute()}async listSource(e){let t=await s.promises.readdir(e.directory),n=[`.js`,`.ts`,`.mjs`,`.mts`],i=[];for(let a of t){if(!n.some(e=>a.endsWith(e)))continue;let t=r.join(e.directory,a),o=new Yt({name:r.basename(a,r.extname(a)),source:e.id,filename:t,executedAt:null});i.push(o)}return i}async list(e){await this.ensureMigrationsTable();let t=[];for await(let e of this.sources){let n=await this.listSource(e);t.push(...n)}let n=await this.db.selectFrom(`migrations`).selectAll().execute();for(let e of n){e.source||=`root`;let n=t.find(t=>t.name===e.name);n&&(n.executedAt=new Date(e.executed_at))}return e?.source&&(t=t.filter(t=>t.source===e.source)),t=ie(t,[`source`,`name`],[`asc`,`asc`]),t}async migrateUp(e){await e.up(this.db),await this.db.insertInto(`migrations`).values({name:e.name,module:e.source,executed_at:p(new Date,`yyyy-MM-dd HH:mm:ss`)}).execute(),this.logger.info(`${e.name} migrated successfully`)}async migrateDown(e){await e.down(this.db),await this.db.deleteFrom(`migrations`).where(`name`,`=`,e.name).where(`module`,`=`,e.source).execute(),this.logger.info(`${e.name} rolled back successfully`)}async migrateFile(e){await this.ensureMigrationsTable();let t=(await this.list()).find(t=>t.filename===e);if(!t)return{name:r.basename(e,r.extname(e)),filename:e,source:null,result:`failed`,error:Error(`Migration ${e} not found`)};if(t.executedAt)return{name:t.name,filename:t.filename,source:t.source,result:`success`};let[n]=await b(()=>this.migrateUp(t));return n?{name:t.name,filename:t.filename,source:t.source,result:`failed`,error:n}:{name:t.name,filename:t.filename,source:t.source,result:`success`}}async rollbackFile(e){await this.ensureMigrationsTable();let t=(await this.list()).find(t=>t.filename===e);if(!t)return{name:r.basename(e,r.extname(e)),filename:e,source:null,result:`failed`,error:`Migration ${e} not found`};if(!t.executedAt)return{name:t.name,filename:t.filename,source:t.source,result:`success`};let[n]=await b(()=>this.migrateDown(t));return n?{name:t.name,filename:t.filename,source:t.source,result:`failed`,error:n}:{name:t.name,filename:t.filename,source:t.source,result:`success`}}async migrate(e={}){await this.ensureMigrationsTable();let t=await this.list(e);if(t=t.filter(e=>!e.executedAt),t.sort((e,t)=>e.name.localeCompare(t.name)),e.steps!==void 0&&(t=t.slice(0,e.steps)),t.length===0)return[];await this.emmitter.emitAndWait(`migrator:before-migrate`,{migrations:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.migrateFile(e.filename);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`migrator:after-migrate`,{migrations:t,results:n}),n}async rollback(e={}){await this.ensureMigrationsTable();let t=await this.list(e);if(t=t.filter(e=>e.executedAt),t.sort((e,t)=>t.name.localeCompare(e.name)),e.steps!==void 0&&(t=t.slice(0,e.steps)),t.length===0)return[];await this.emmitter.emitAndWait(`migrator:before-rollback`,{migrations:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.rollbackFile(e.filename);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`migrator:after-rollback`,{migrations:t.map(e=>e.name)}),n}async up(e=1,t={}){return this.migrate({...t,steps:e})}async down(e=1,t={}){return this.rollback({...t,steps:e})}async latest(e={}){return this.migrate(e)}async latestOrFail(e={}){let t=await this.latest(e);if(t.some(e=>e.result===`failed`)){let e=Error(`Failed to run all migrations`);throw Object.assign(e,{results:t}),e}return t}async fresh(e={}){let t=await this.rollback(e);return t.some(e=>e.result===`failed`)?t:await this.migrate(e)}},Zt=class{listeners=new Map;constructor(){process.on(`message`,e=>{let t=this.listeners.get(e.event);if(t)for(let n of t)n(e.data)})}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){if(!process.send)throw Error(`PluginIpcClient.emit: process.send is not available — process was not spawned with IPC channel`);let n=O(),r={id:n,event:e,data:t};return process.send(r),n}},Qt=class{listeners=new Map;constructor(e){this.child=e,this.child.on(`message`,e=>{let t=this.listeners.get(e.event);if(t)for(let n of t)n(e.data)})}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){if(!this.child.send)throw Error(`PluginIpcHost.emit: child process was not spawned with an IPC channel`);let n=O(),r={id:n,event:e,data:t};return this.child.send(r),n}};function en(e){let t=[],n=e.replace(/:[a-zA-Z_][a-zA-Z0-9_]*/g,e=>(t.push(e.slice(1)),`([^/]+)`)).replace(/\//g,`\\/`);return{pattern:RegExp(`^${n}$`),paramNames:t}}var tn=class{routes=[];constructor(e){this.client=e,this.client.on(`router:request`,e=>this.dispatch(e))}async dispatch(e){for(let t of this.routes){if(t.method!==e.method)continue;let n=t.pattern.exec(e.path);if(!n)continue;let r={};t.paramNames.forEach((e,t)=>{r[e]=n[t+1]});let i=200,a={},o={status(e){return i=e,this},send:t=>{let n={requestId:e.requestId,status:i,body:t,headers:a};this.client.emit(`router:response`,n)}};await t.handler({...e,params:r},o);return}this.client.emit(`router:response`,{requestId:e.requestId,status:404,body:{message:`Not Found`}})}register(e,t,n){let{pattern:r,paramNames:i}=en(t);this.routes.push({method:e,path:t,handler:n,pattern:r,paramNames:i}),this.client.emit(`router:register`,{method:e,path:t})}get(e,t){this.register(`GET`,e,t)}post(e,t){this.register(`POST`,e,t)}put(e,t){this.register(`PUT`,e,t)}patch(e,t){this.register(`PATCH`,e,t)}delete(e,t){this.register(`DELETE`,e,t)}},nn=class e{directory;prefix;module;router;logger=new x;routes=[];debug=!1;setDirectory(e){return this.directory=e,this}setPrefix(e){return this.prefix=e,this}setRouter(e){return this.router=e,this}setModule(e){return this.module=e,this}setLogger(e){return this.logger=e,this}setDebug(e){return this.debug=e,this}static create(t){return new e().setDirectory(t)}async loadFiles(){let e=l.sync(`**/*.(ts|js|mjs)`,{cwd:this.directory});this.debug&&this.logger.debug(`Found ${e.length} route files in ${this.directory}`,{files:e});let t=[];for(let n of e){let e=n.replace(/\.(ts|js|mjs)$/,``),r=`get`;for(let t of[`.post`,`.patch`,`.delete`,`.put`])if(e.endsWith(t)){r=t.substring(1),e=e.replace(t,``);break}e=e.replace(/\/index$/,``),e=e.replace(/^index$/,``),e=e.replace(/\[\.\.\.([^\]]+)]/g,`*$1`),e=e.replace(/\[([^\]]+)]/g,`:$1`),e.startsWith(`/`)||(e=`/`+e),e===`/`&&(e=`/`),this.prefix&&(e=(this.prefix.startsWith(`/`)?this.prefix:`/`+this.prefix)+e);let i=0;e.includes(`*`)&&(i+=1e6);let a=(e.match(/:/g)||[]).length;i+=a*1e4;let o=e.split(`/`).filter(e=>e).length;i-=o*100,t.push({file:n,routePath:e,method:r,sortKey:i,module:this.module})}t.sort((e,t)=>e.sortKey-t.sortKey),this.routes=t}async registerRoutes(){if(!this.router)throw new S(`Router instance not set`);let e=this.module||`unknown`,t=function(t){t.metadata={...t.metadata,module:e}};this.router.on(`added`,t);for(let e of this.routes){let t=(await import(`${this.directory}/${e.file}`)).default;if(typeof t!=`function`){this.logger.warn(`Route file ${e.file} does not export a default function`);continue}this.router[e.method](e.routePath,t)}this.router.off(`added`,t)}async load(){await this.loadFiles(),await this.registerRoutes()}},rn=class{path=``;method=`get`;handler=null;middlewares=[];metadata={};constructor(e={}){this.path=e.path||``,this.method=e.method||`get`,this.handler=e.handler||null,this.middlewares=e.middlewares||[],this.metadata=e.metadata||{}}static params(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}static query(e){let t={},n=e.split(`?`)[1];return n?oe.parse(n):t}toJSON(){return{path:this.path,method:this.method,middlewares:this.middlewares.map(e=>e.constructor.name),metadata:this.metadata}}},an=class e extends T(rt){static __container_entry_key=`RouterService`;routes=[];middlewares=[];prefixes=[];groups=[];groupPrefixes=[];debug=!1;logger=new x;metadata={};constructor(e={}){super(),this.routes=e.routes||[],this.middlewares=e.middlewares||[],this.prefixes=e.prefixes||[],this.groups=e.groups||[],this.groupPrefixes=e.groupPrefixes||[],this.debug=e.debug||!1,this.metadata=e.metadata||{},this.listeners=e.listeners||[],this.logger=e.logger||new x}use(e,t=`route`){return this.middlewares.push({middleware:e,context:t}),this}prefix(e){return this.prefixes.push(e),this}makePath(e){return ne([...this.groupPrefixes,...this.prefixes,e],`/`)}add(e){let t=new rn({method:e.method,path:this.makePath(e.path),handler:e.handler,middlewares:this.middlewares.map(e=>e.middleware)});this.middlewares=this.middlewares.filter(e=>e.context!==`route`),this.prefixes=[],this.routes.push(t),this.debug&&this.logger.debug(`added route`,t),this.emit(`added`,t)}get(e,t){this.add({path:e,method:`GET`,handler:t})}post(e,t){this.add({path:e,method:`POST`,handler:t})}put(e,t){this.add({path:e,method:`PUT`,handler:t})}patch(e,t){this.add({path:e,method:`PATCH`,handler:t})}many(e,t,n){e.forEach(e=>{this.add({path:t,method:e,handler:n})})}delete(e,t){this.add({path:e,method:`DELETE`,handler:t})}group(){let t=new e({listeners:this.listeners,debug:this.debug});return t.groupPrefixes=this.prefixes,t.middlewares=this.middlewares.map(e=>({middleware:e.middleware,context:`group`})),this.groups.push(t),this.middlewares=this.middlewares.filter(e=>e.context!==`route`),this.prefixes=[],t}resolve(e,t){return this.list().find(n=>n.method.toUpperCase()===e.toUpperCase()?this.matchPath(n.path,t):!1)||null}async execute(e,t){if(!e.handler)throw Error(`Route handler not found for ${e.method} ${e.path}`);let n={...t};for await(let t of e.middlewares){let e=await t.handle(n);if(e&&`redirect`in e)return e;Object.assign(n,e)}return e.handler(n)}matchPath(e,t){let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean);for(let e=0;e<n.length;e++){let t=n[e],i=r[e];if(t===`*`)return!0;if(e>=r.length||!t.startsWith(`:`)&&t!==i)return!1}return!(r.length>n.length)}clear(){this.debug&&this.logger.debug(`clear`,{count:this.routes.length}),this.routes=[],this.groups=[]}list(){return this.routes.concat(...this.groups.map(e=>e.routes))}async load(e={}){this.debug=e.debug??this.debug,this.debug&&this.logger.debug(`service loaded in debug mode`)}loadSync(e={}){this.debug=e.debug??this.debug,this.debug&&this.logger.debug(`service loaded in debug mode`)}},on=class extends an{files=new Map;dirs=new Map;constructor(e={}){super(e)}addFile(e,t){let n={filepath:e,metadata:t||{}};this.emit(`addEntry`,n),this.files.set(e,n)}addDir(e,t){let n={filepath:e,metadata:t||{}};this.emit(`addEntry`,n),this.dirs.set(e,n)}async loadFile(e){if(!s.existsSync(e.filepath))return this.logger.warn(`File not found: ${e.filepath}`),!1;let t=function(t){t.metadata={...t.metadata,...e.metadata,filename:e.filepath}},n=`${e.filepath}?t=${Date.now()}`;this.on(`added`,t);let[r]=await b(()=>import(n));return this.off(`added`,t),r?(Object.assign(r,e),this.logger.error(`failed to load file`,r),!1):!0}async loadDir(e){let t=new Set;if(!s.existsSync(e.filepath))return this.logger.warn(`Directory not found: ${e.filepath}`),Array.from(t);let n=s.readdirSync(e.filepath);for(let i of n){if(i.endsWith(`.test.ts`)||i.endsWith(`.spec.ts`)||i.endsWith(`.test.js`)||i.endsWith(`.spec.js`))continue;let n=r.join(e.filepath,i),a={filepath:n,metadata:e.metadata};await this.loadFile(a)&&t.add(n)}return Array.from(t)}async load(){let e=new Set;for(let t of this.files.values())await this.loadFile(t)&&e.add(t.filepath);for(let t of this.dirs.values())(await this.loadDir(t)).forEach(t=>e.add(t));this.debug&&this.logger.debug(`load files`,{files:Array.from(e).map(e=>r.relative(process.cwd(),e))})}};const sn=[{method:`get`,path:`/`,handler:`index`,hooks:{before:[`beforeIndex`],after:[`afterIndex`]}},{method:`get`,path:`/:id`,handler:`show`,hooks:{before:[`beforeShow`],after:[`afterShow`]}},{method:`post`,path:`/`,handler:`store`,hooks:{before:[`beforeStore`,`beforeSave`],after:[`afterStore`,`afterSave`]}},{method:`put`,path:`/:id`,handler:`update`,hooks:{before:[`beforeUpdate`,`beforeSave`],after:[`afterUpdate`,`afterSave`]}},{method:`patch`,path:`/:id`,handler:`update`,hooks:{before:[`beforeUpdate`,`beforeSave`],after:[`afterUpdate`,`afterSave`]}},{method:`delete`,path:`/:id`,handler:`destroy`,hooks:{before:[`beforeDestroy`],after:[`afterDestroy`]}}];var cn=class extends T(rt){options;constructor(e={}){super(),this.options=e}async index(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async show(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async store(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async update(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async destroy(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}wrap(e,t,n){return async r=>{await this.emit(`beforeAll`,r);for(let e of t)await this.emit(e,r);let i=await this[e](r);for(let e of n)await this.emit(e,r,i);return i}}register(e){for(let t of sn){let n=t.method,r=t.handler;this.options.except&&this.options.except.includes(r)||(this.options.middleware&&this.options.middleware.all&&e.use(this.options.middleware.all),this.options.middleware&&this.options.middleware[r]&&e.use(this.options.middleware[r]),e[n](t.path,this.wrap(t.handler,t.hooks?.before||[],t.hooks?.after||[])))}}},ln=class extends cn{model;constructor(e,t={}){if(super(t),!e.__isConfigModel)throw Error(`RouterResourceConfigService requires a ConfigModel`);this.model=e}async index(e){return{items:await this.model.list()}}async show(e){let t=e.params.id;return await this.model.findOrFail(t)}async store(e){let t=e.request.body;return await this.model.create(t),{message:`Resource created successfully`}}async update(e){let t=e.params.id,n=e.request.body;return await this.model.update(t,n)}async destroy(e){let t=e.params.id;return await this.model.destroy(t),{success:!0}}},un=class{name;source;filename;constructor(e){this.name=e.name,this.source=e.source,this.filename=e.filename}async run(e){let t=await import(this.filename);if(typeof t.default!=`function`)throw new S(`Seeder ${this.name} does not export a function`);await t.default(e)}},dn=class{static __container_entry_key=`SeederService`;debug=!1;emmitter;logger;db;sources;constructor(e){this.debug=e.debug??this.debug,this.emmitter=e.emmitter||new A,this.logger=e.logger||new x,this.db=e.db,this.sources=e.sources||[]}addSource(e){this.sources.push(e)}async listSource(e){let t=await s.promises.readdir(e.directory),n=[`.js`,`.ts`,`.mjs`,`.mts`],i=[];for(let a of t){if(!n.includes(r.extname(a)))continue;let t=r.join(e.directory,a),o=new un({name:r.basename(a,r.extname(a)),source:e.id,filename:t});i.push(o)}return i}async list(e){let t=[];for await(let e of this.sources){let n=await this.listSource(e);t.push(...n)}if(e?.source){let n=Array.isArray(e.source)?e.source:[e.source];t=t.filter(e=>e.source&&n.includes(e.source))}if(e?.name){let n=Array.isArray(e.name)?e.name:[e.name];t=t.filter(e=>n.includes(e.name))}return t.sort((e,t)=>e.name.localeCompare(t.name)),t}async runSeeder(e){let[t]=await b(()=>e.run(this.db));return t?(this.logger.error(`failed to run seeder ${e.name}`,t),{name:e.name,filename:e.filename,source:e.source,result:`failed`,error:t}):(this.logger.info(`seeder ${e.name} ran successfully`),{name:e.name,filename:e.filename,source:e.source,result:`success`})}async run(e={}){let t=await this.list(e);await this.emmitter.emitAndWait(`seeder:before-run`,{seeders:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.runSeeder(e);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`seeder:after-run`,{seeders:n.map(e=>e.name)}),n}},fn=class{static __container_entry_key=`ShellService`;debug;logger;init(e={}){this.debug=e.debug||!1,this.logger=e.logger||w.child({label:`shell`}),this.debug&&this.logger.debug(`initialized in debug mode`)}async command(e,t,n={}){return new Promise((r,i)=>{let a=le(e,t,{cwd:n.cwd||process.cwd(),stdio:`pipe`,shell:n.shell??!0,env:n.env||process.env}),o=``;a.stdout?.on(`data`,e=>{o+=e.toString()}),a.stderr?.on(`data`,e=>{o+=e.toString()}),a.on(`close`,n=>{if(this.debug&&this.logger.debug(`command executed`,{bin:e,args:t,output:o}),n===0)return r();let a=`Command failed with exit code ${n}`;this.logger.error(a,{bin:e,args:t,code:n,output:o}),i(new tt(a,o,e,t))}),a.on(`error`,n=>{this.logger.error(`Command execution error`,{bin:e,args:t,error:n.message}),i(n)})})}async executeCommandWithOutput(e,t,n={}){return this.debug&&this.logger.debug(`executing command`,{bin:e,args:t}),new Promise((r,i)=>{let a=le(e,t,{cwd:n.cwd||process.cwd(),stdio:`pipe`,shell:!0,env:n.env||process.env}),o=``,s=``;a.stdout?.on(`data`,e=>{o+=e.toString()}),a.stderr?.on(`data`,e=>{s+=e.toString()}),a.on(`close`,n=>{if(n===0)r(o.trim());else{let r=`Command failed with exit code ${n}: ${s}`;this.logger.error(r,{bin:e,args:t,code:n,errorOutput:s}),i(new tt(r,o,e,t))}}),a.on(`error`,n=>{this.logger.error(`Command execution error`,{bin:e,args:t,error:n.message}),i(n)})})}},pn=class{constructor(e,t,n=`id`){this.config=e,this.key=t,this.primaryKey=n}getItems(){return this.config.get(this.key,[])}setItems(e){this.config.set(this.key,e)}query(e){return this.getItems()}async count(e){return this.query(e).length}async findMany(e){let t=this.query(e);if(e?.orderBy){let n=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy],r=Array.isArray(e.orderDirection)?e.orderDirection:[e.orderDirection??`asc`];t=ie(t,n,r)}return e?.offset&&(t=t.slice(e.offset)),e?.limit&&(t=t.slice(0,e.limit)),t}async findOne(e){return this.query(e)[0]??null}async findById(e,t){return this.query(t).find(t=>t[this.primaryKey]===e)??null}async findByIdOrFail(e,t){let n=await this.findById(e,t);if(!n)throw new S(`Item not found`,404);return n}async paginate(e){let t=e?.page??1,n=e?.limit??10,r=(t-1)*n,[i,a]=await Promise.all([this.findMany({...e,limit:n,offset:r}),this.count(e)]);return{items:i,page:t,per_page:n,total:a,total_pages:Math.ceil(a/n)}}async create(e){let t=this.getItems(),n={[this.primaryKey]:O(),...e};return t.push(n),this.setItems(t),n}async createMany(e){let t=this.getItems(),n=e.map(e=>({[this.primaryKey]:O(),...e}));return this.setItems([...t,...n]),n}async updateById(e,t){let n=this.getItems(),r=n.findIndex(t=>t[this.primaryKey]===e);if(r===-1)throw new S(`Item not found`,404);return n[r]={...n[r],...t},this.setItems(n),n[r]}async deleteById(e){await this.findByIdOrFail(e);let t=this.getItems().filter(t=>t[this.primaryKey]!==e);this.setItems(t)}async deleteMany(e){let t=this.query(e),n=e?.limit??t.length,r=new Set(t.slice(0,n).map(e=>e[this.primaryKey])),i=this.getItems().filter(e=>!r.has(e[this.primaryKey]));this.setItems(i)}},G=class{constructor(e,t,n){this.db=e,this.table=t,this.primaryKey=n}query(e){return e?.qb||this.db.selectFrom(this.table)}async count(e){let t=this.query(e);t=t.select(e=>e.fn.countAll().as(`count`));let n=await t.executeTakeFirstOrThrow();return Number(n.count)}async findMany(e){let t=this.query(e);if(t=t.selectAll(),e?.limit&&(t=t.limit(e.limit)),e?.offset&&(t=t.offset(e.offset)),e?.orderBy){let n=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy],r=Array.isArray(e.orderDirection)?e.orderDirection:[e.orderDirection??`asc`];n.forEach((e,n)=>{t=t.orderBy(e,r[n]||`asc`)})}return await t.execute()}async findOne(e){let t=this.query(e);return t=t.selectAll(),await t.executeTakeFirst()}async findById(e,t){let n=this.query(t);return n=n.selectAll(),n=n.where(this.primaryKey,`=`,e),await n.executeTakeFirst()}async findByIdOrFail(e,t){let n=await this.findById(e,t);if(!n)throw new S(`Item not found`,404);return n}async paginate(e){let t=e?.page??1,n=(t-1)*(e?.limit??10),r=e?.limit??10,i={...e,limit:r,offset:n},a={...e},[o,s]=await Promise.all([this.findMany(i),this.count(a)]);return{items:o,page:t,per_page:r,total:s,total_pages:Math.ceil(s/r)}}async create(e){let t=this.db.insertInto(this.table);return t=t.values(e).returningAll(),await t.executeTakeFirst()}async createMany(e){let t=this.db.insertInto(this.table);return t=t.values(e).returningAll(),await t.execute()}async updateById(e,t){let n=await this.findByIdOrFail(e),r=this.db.updateTable(this.table);r=r.set(t).where(this.primaryKey,`=`,n[this.primaryKey]).returningAll(),await r.executeTakeFirst()}async deleteById(e){let t=await this.findByIdOrFail(e),n=this.db.deleteFrom(this.table);n=n.where(this.primaryKey,`=`,t[this.primaryKey]),await n.executeTakeFirst()}async deleteMany(e){let t={...e,qb:this.db.deleteFrom(this.table)},n=this.query(t);e?.limit&&(n=n.limit(e.limit)),await n.execute()}},mn=class extends G{constructor(e){super(e,`files`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}return e?.search&&(t=t.where(`f.client_name`,`like`,`%${e.search}%`)),e?.purpose?.length&&(t=t.where(`f.purpose`,`in`,e.purpose)),e?.client_name?.length&&(t=t.where(`f.client_name`,`in`,e.client_name)),e?.metas&&(t=new Kt(e.metas,`file_metas`,`file_id`).apply(t)),t}},hn=class extends G{constructor(e){super(e,`permissions_assignments`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}if(e?.permissionId){let n=Array.isArray(e.permissionId)?e.permissionId:[e.permissionId];t=t.where(`permission_id`,`in`,n)}if(e?.assignableId){let n=Array.isArray(e.assignableId)?e.assignableId:[e.assignableId];t=t.where(`assignable_id`,`in`,n)}if(e?.assignableType){let n=Array.isArray(e.assignableType)?e.assignableType:[e.assignableType];t=t.where(`assignable_type`,`in`,n)}return t}},gn=class extends G{constructor(e){super(e,`permissions`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}return e?.search&&(t=t.where(`name`,`like`,`%${e.search}%`)),t}};function _n(){return function(e){class t extends e{}return t}}var vn=class extends T(Ve(G),_n()){constructor(e){super(e,`tokens`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}if(e?.search&&(t=t.where(`name`,`like`,`%${e.search}%`)),e?.type){let n=Array.isArray(e.type)?e.type:[e.type];t=t.where(`type`,`in`,n)}return t}async findByToken(e){let t=this.query();return t=t.selectAll(),t=t.where(`token`,`=`,e),await t.executeTakeFirst()||null}},yn=class extends G{constructor(e){super(e,`users`,`id`)}query(e={}){let t=super.query(e);return t=t.where(`deleted_at`,`is`,null),e?.email&&(t=t.where(`email`,`=`,e.email)),e?.username&&(t=t.where(`username`,`like`,`%${e.username}%`)),e?.id&&(t=t.where(`id`,`=`,e.id)),t}};const bn=Te(we);function xn(e){return`'${e.replace(/'/g,`'\\''`)}'`}var Sn=class{cwd;sshKey;sshKeyFile;sshKeyTmpFileName;logger=new x;debug;constructor(e){Object.assign(this,e)}async buildEnv(){let e={sshKeyFile:void 0,env:process.env,cleanup:async()=>{}};if(this.sshKeyFile&&(e.env.GIT_SSH_COMMAND=`ssh -i ${xn(this.sshKeyFile)} -o StrictHostKeyChecking=no`,e.sshKeyFile=this.sshKeyFile),this.sshKey){let t=this.sshKeyTmpFileName??ke(Oe(),`git-ssh-key-${Ae()}`);await De(t,this.sshKey,{mode:384}),e.env.GIT_SSH_COMMAND=`ssh -i ${xn(t)} -o StrictHostKeyChecking=no`,e.sshKeyFile=t,e.cleanup=async()=>{try{await Ee(t)}catch(e){this.logger.warn(`Failed to delete temporary SSH key file: ${t}`,{error:e})}}}return e}async run(e){let{env:t,sshKeyFile:n,cleanup:r}=await this.buildEnv();this.debug&&this.logger.debug(`git `+e,{cwd:this.cwd,sshKeyFile:n});try{let{stdout:n}=await bn(`git ${e}`,{cwd:this.cwd,env:t});return n.trim()}finally{await r()}}async tryRun(e){try{return await this.run(e)}catch{return null}}async checkout(e){await this.run(`checkout ${e}`)}async fetch(){await this.run(`fetch --all --prune`)}async pull(){await this.fetch(),await this.tryRun(`rev-parse --abbrev-ref --symbolic-full-name @{upstream}`)&&await this.run(`pull --ff-only`)}async getInfo(){let e=await this.run(`rev-parse --abbrev-ref HEAD`),t=e===`HEAD`,n=await this.run(`rev-parse --short HEAD`),r=await this.tryRun(`remote`),i=r?r.split(`
4
+ `).filter(Boolean):[];return{directory:this.cwd,head:t?null:e,shortHash:n,isDetachedHead:t,remotes:i}}};const K=()=>je`CURRENT_TIMESTAMP`;async function Cn(e,t){let n=W.selectFrom(e);t?.query&&(n=t.query(W.selectFrom(e))),n=n.clearSelect().clearOrderBy().select(e=>e.fn.countAll().as(`count`)),t?.debug&&console.log(n.compile());let r=await n.executeTakeFirst();return Number(r?.count??0)}var wn=y({fromDb:()=>En,toDb:()=>Tn});function Tn(e){if(e===null)return null;let t=W.currentConnectionDialectName;return t===`sqlite`||t===`mysql`?p(new Date(e),`yyyy-MM-dd HH:mm:ss`):new Date(e).toISOString()}function En(e){return e===null?null:new Date(e)}function Dn(e){return e===null?null:JSON.stringify(e)}const On=W;function kn(e){return e===null?null:On.currentConnectionDialectName===`sqlite`?+!!e:!!e}var An=y({fromDb:()=>Mn,toDb:()=>jn});function jn(e){let t={...e};for(let e in t)t[e]instanceof Date&&(t[e]=Tn(t[e])),typeof t[e]==`object`&&(t[e]=Dn(t[e])),typeof t[e]==`boolean`&&(t[e]=kn(t[e])),Array.isArray(t[e])&&(t[e]=Dn(t[e]));return t}function Mn(e){let t={...e};for(let e in t)t[e]=parseValue(t[e]);return t}const Nn={all:An,datetime:wn};async function Pn(e,t){let n=t?.values||{},r=await W.insertInto(e).values(n).returningAll().executeTakeFirst();return t?.serialize&&(r=t.serialize(r)),r}async function Fn(e,t){let n=t?.values||{},r=W.insertInto(e).values(n),i=t?.primaryKey||`id`,a=(await r.executeTakeFirst()).insertId,o=await W.selectFrom(e).selectAll().where(i,`=`,a).executeTakeFirst();return t?.serialize&&(o=t.serialize(o)),o}async function q(e,t){let n=t?.values||{},r=typeof t?.normalize==`function`?t?.normalize:Nn.all.toDb;t?.normalize!==!1&&(n=r(n));let i={...t,values:n};return W.driver===`mysql`?Fn(e,i):Pn(e,i)}async function J(e,t){let n=t?.query?t.query(W.deleteFrom(e)):W.deleteFrom(e);t?.where&&(n=n.where(e=>t.where(e))),await n.execute()}async function Y(e,t){let n=t?.query||W.selectFrom(e).selectAll();t?.query&&(n=t.query(W.selectFrom(e))),t?.where&&(n=n.where(e=>t.where(e))),t?.limit&&(n=n.limit(t.limit)),t?.offset&&(n=n.offset(t.offset)),t?.debug&&console.log(n.compile());let r=await n.execute();return t?.serialize&&(r=r.map(t.serialize)),r}async function In(e,t){return!!(await Y(e,t))[0]}async function X(e,t){let n=W.selectFrom(e).selectAll();t?.query&&(n=t.query(n)),t?.where&&(n=n.where(e=>t.where(e)));let r=await n.limit(1).executeTakeFirst();return r?t?.serialize?t.serialize(r):r:null}async function Z(e,t){let n=await X(e,t);if(!n)throw new S(`${t?.name??`Record`} not found`,404);return n}async function Ln(e,t){let n=await Y(e,{debug:t?.debug,serialize:t?.serialize,where:t?.where,query:()=>{let n=t?.select?t.select(W.selectFrom(e)):W.selectFrom(e).selectAll();return t?.where&&(n=n.where(e=>t.where(e))),n.limit(1)}});return n.length>0?n[0]:await q(e,{debug:t?.debug,serialize:t?.serialize,values:t?.values})}async function Rn(e,t){let n=t?.page&&t.page>0?t.page:1,r=t?.limit&&t.limit>0?t.limit:10,i=(n-1)*r,a=t?.orderBy&&(Array.isArray(t.orderBy)?t.orderBy:[t.orderBy]),o=t?.orderDesc&&(Array.isArray(t.orderDesc)?t.orderDesc:[t.orderDesc]),s=await Y(e,{serialize:t?.serialize,query:()=>{let n=W.selectFrom(e).selectAll();return t?.query&&(n=t.query(W.selectFrom(e))),t?.where&&(n=n.where(e=>t.where(e))),a&&a.map((e,t)=>[e,o&&o[t]?o[t]:`asc`]).forEach(([e,t])=>{n=n.orderBy(e,t)}),r>0&&(n=n.limit(r).offset(i)),t?.debug&&console.log(n.compile()),n}}),c=await Cn(e,{query:()=>{let n=W.selectFrom(e).selectAll();return t?.query&&(n=t.query(W.selectFrom(e))),t?.debug&&console.log(n.compile()),n}});return mt.from({items:s,total:c,page:n,per_page:r,total_pages:Math.ceil(c/r)})}function zn(e){return e.where(`deleted_at`,`is`,null)}function Bn(e){return e.eb(e.ref(`deleted_at`),`is`,null)}Bn.column=e=>t=>t.eb(e,`is`,null);const Vn=e=>e.eb(`deleted_at`,`is not`,null),Hn=e=>e.addColumn(`deleted_at`,`timestamp`);async function Un(e,t){let n=t?.query?t.query(W.updateTable(e)):W.updateTable(e);n=n.set({deleted_at:K()}).where(Bn);let r=await n.returningAll().execute();return t?.serialize&&(r=r.map(t.serialize)),r}v.prototype.addSoftDeleteColumn=function(){return this.addColumn(`deleted_at`,`timestamp`)};const Wn=e=>e.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(K()).notNull()),Gn=e=>e.addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(K()).notNull()),Kn=e=>e.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(K()).notNull()).addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(K()).notNull());v.prototype.addTimestampColumns=function(){return this.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(K()).notNull()).addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(K()).notNull())},v.prototype.addCreatedColumn=function(){return this.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(K()).notNull())},v.prototype.addUpdatedColumn=function(){return this.addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(K()).notNull())};async function qn(e,t){let n=t?.values||[],r=W.updateTable(e);r=r.set(n).returningAll(),t?.query&&(r=t.query(r)),t?.where&&(r=r.where(e=>t.where(e))),t?.debug&&console.log(r.compile());let i=await r.execute();return t?.serialize&&(i=i.map(t.serialize)),i}async function Jn(e,t){let n=t?.values||[],r=W.updateTable(e);t?.where&&r.where(e=>t.where(e)),await r.set(n).execute();let i=W.selectFrom(e).selectAll();t?.where&&i.where(e=>t.where(e)),t?.debug&&console.log(i.compile());let a=await i.execute();return t?.serialize&&(a=a.map(t.serialize)),a}async function Q(e,t){let n=t?.values||{},r=typeof t?.normalize==`function`?t?.normalize:Nn.all.toDb;t?.normalize!==!1&&(n=r(n));let i={...t,values:n};return W.driver===`mysql`?Jn(e,i):qn(e,i)}async function Yn(e,t){return await X(e,{debug:t?.debug,serialize:t?.serialize,where:t?.where})?(await Q(e,{debug:t?.debug,serialize:t?.serialize,values:t?.values,where:t?.where}),X(e,{debug:t?.debug,serialize:t?.serialize,where:t?.where})):await q(e,{debug:t?.debug,serialize:t?.serialize,values:t?.values})}v.prototype.addIdColumn=function(e=`id`){return W.driver===`postgresql`?this.addColumn(e,`serial`,e=>e.primaryKey()):W.driver===`mysql`?this.addColumn(e,`integer`,e=>e.primaryKey().autoIncrement()):this.addColumn(e,`integer`,e=>e.primaryKey())};function Xn(e){return typeof e==`object`?`json:${JSON.stringify(e)}`:typeof e==`boolean`?`bool:${e}`:typeof e==`number`?`number:${e}`:String(e)}function Zn(e,t){return function(n){return class extends n{async get(n,r){let i=this.constructor,a=i.__model?.table,o=i.__model?.primaryKey;if(!a||!o)throw Error(`Should use Model mixin before Metadata`);let s=W.selectFrom(e);s=s.selectAll().where(t,`=`,this[o]).where(`name`,`=`,n).limit(1);let c=await s.executeTakeFirst();if(!c||!c.value)return r;let l=c?.value;return typeof l==`string`&&l.startsWith(`json:`)&&(l=JSON.parse(l.slice(5))),typeof l==`string`&&l.startsWith(`bool:`)&&(l=l.slice(5)===`true`),l}async set(n,r){let i=this.constructor,a=i.__model?.table,o=i.__model?.primaryKey;if(!a||!o)throw Error(`Should use Model mixin before Metadata`);let s={[t]:this[o],name:n,value:r};s.value=Xn(r),await Yn(e,{values:s,where:e=>e.and([e.eb(t,`=`,this[o]),e.eb(`name`,`=`,n)])})}}}}function Qn(e,t=`id`){return function(n){return class extends n{static __model={table:e,primaryKey:t};static serialize(e){let t=new this;return Object.assign(t,e),t}static select(){return W.selectFrom(e)}static async paginate(t){let n=this,r=await Rn(e,{...t,serialize:e=>n.serialize(e)});for await(let e of r.items)await P(n,`serialized`,e);return await P(n,`afterPaginate`,r),r}static async list(t){let n=this,r=await Y(e,{...t,serialize:e=>n.serialize(e)});for await(let e of r)await P(n,`serialized`,e);return await P(n,`afterList`,r),r}static async findOne(t){let n=this,r=await X(e,{query:t?.query,where:t?.where,serialize:e=>n.serialize(e)});return r&&await P(n,`serialized`,r),await P(n,`afterFind`,r),r}static async findOneOrFail(t){let n=this,r=await Z(e,{...t,name:t?.name??n.name,serialize:e=>n.serialize(e)});return await P(n,`serialized`,r),await P(n,`afterFind`,r),r}static async find(n){let r=this,i=await X(e,{serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return i&&(await P(r,`serialized`,i),await P(r,`afterFind`,i)),i}static async findOrFail(n){let r=this,i=await Z(e,{name:r.name,serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return await P(r,`serialized`,i),await P(r,`afterFind`,i),i}static async findBy(t,n){let r=this,i=await Z(e,{serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return await P(r,`serialized`,i),await P(r,`afterFind`,i),i}static async findByOrFail(t,n){let r=this,i=await Z(e,{name:r.name,serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return await P(r,`serialized`,i),await P(r,`afterFind`,i),i}static exists(t){return In(e,{query:t?.query})}static count(t){return Cn(e,t)}static async create(t){let n=this,r={...t};await P(n,`beforeCreate`,r);let i=await q(e,{serialize:e=>n.serialize(e),values:r});return await P(n,`afterCreate`,i),await P(n,`serialized`,i),await P(n,`afterFind`,i),i}static async createMany(t){let n=this,r=[];for await(let i of t){await P(n,`beforeCreate`,i);let t=await q(e,{values:i,serialize:e=>n.serialize(e)});await P(n,`afterCreate`,t),await P(n,`serialized`,t),await P(n,`afterFind`,t),r.push(t)}return r}static async update(t){let n=this,r={...t.values};await P(n,`beforeUpdate`,r,t.where),await Q(e,{debug:t.debug,where:t.where,values:r,serialize:e=>n.serialize(e)});let i=await Z(e,{where:t.where,serialize:e=>n.serialize(e)});return await P(n,`afterUpdate`,i),i}static updateById(e,n,r){return this.update({debug:r?.debug,where:n=>n(t,`=`,e),values:n})}static async destroy(t){let n=this;await P(n,`beforeDestroy`,t),await J(e,t),await P(n,`afterDestroy`,t)}static firstOrCreate(t){let n=this;return Ln(e,{...t,serialize:e=>n.serialize(e)})}static updateOrCreate(t){let n=this;return Yn(e,{debug:t.debug,where:t.where,select:t.select,update:t.update,values:t.values,serialize:e=>n.serialize(e)})}static async destroyById(n){let r=this,i={query:e=>e.where(t,`=`,n)};await P(r,`beforeDestroy`,i),await J(e,i),await P(r,`afterDestroy`,i)}async save(){let n=this.constructor,r=re(this,[t]);await P(n,`beforeSave`,this,r),await Q(e,{where:e=>e(t,`=`,this[t]),values:r}),await P(n,`afterSave`,this)}async destroy(){let n=this.constructor;await P(n,`beforeDestroy`,this),await J(e,{query:e=>e.where(t,`=`,this.id)}),await P(n,`afterDestroy`,this)}async softDelete(){let n=this.constructor;await P(n,`beforeSoftDelete`,this);let r=(await Un(e,{query:e=>e.where(t,`=`,this.id)}))[0];Object.assign(this,r),await P(n,`afterSoftDelete`,this)}}}}function $n(e){return function(t){return class extends t{static async load(t,n){let r=Array.isArray(t)?t:[t],i=Array.isArray(n)?n:[n];for(let t of i){let n=e?.[t];if(!n)throw Error(`Relation ${String(t)} declared`);await n.load(r)}}}}}const er=new jt,$=C.proxy(zt),tr=C.proxy(A),nr=new mn(W),rr=C.proxy(Xt),ir=new hn(W),ar=new gn(W),or=C.proxy(an),sr=new fn,cr=new vn(W),lr=new yn(W);function ur(e){return e}async function dr(e,t){let n=Array.isArray(e)?e:[e],r=t.target,i=t.pivot;function a(e,t){return typeof t==`function`?t(e):u(e,t)}let o=n.map(e=>a(e,i.sourceKey)).filter(Boolean),s=await i.findEntities(o),c=s.map(e=>a(e,i.targetKey)).filter(Boolean),l=await r.findEntities(c);for(let e of n){let n=s.filter(t=>a(t,i.sourceKey)===a(e,i.sourceKey));if(!n.length){d(e,t.key,[]);continue}let o=l.filter(e=>n.some(t=>a(t,r.sourceKey)===a(e,r.targetKey)));d(e,t.key,o)}}function fr(e){return ur({load:async t=>dr(t,e)})}var pr=class extends at{authorize(e,t,n){if(this.cannot(e,t,n)){let n=new S(`Unauthorized`,403),r=``;throw typeof t==`string`&&(r=t),t&&typeof t==`function`&&t.name&&(r=t.name),t&&typeof t==`object`&&t.constructor&&t.constructor.name&&(r=t.constructor.name),Object.assign(n,{action:e,subject:r}),n}}},mr=class extends ot{request;response;constructor(e,t){super({cookies:new Map(Object.entries(e.cookies)),prefix:B.get(`cookie.prefix`,``)}),this.request=e,this.response=t}set(e,t,n){let r=this.prefix+e,i={httpOnly:!0,...n};this.response.cookie(r,t,i),super.set(r,t,n)}},hr=class extends E(dt,Qn(`file_metas`)){};const gr={metas:new class{table;tableKey;targetTable;targetKey;property;constructor(e){this.table=e.table,this.tableKey=e.tableKey,this.targetTable=e.targetTable,this.targetKey=e.targetKey,this.property=e.property}async load(e){let t=new Set;if(e.forEach(e=>t.add(e[this.tableKey])),!t.size)return;let n=W.selectFrom(this.targetTable);n=n.selectAll().where(this.targetKey,`in`,Array.from(t));let r=await n.execute();e.forEach(e=>{let t=r.filter(t=>t[this.targetKey]===e[this.tableKey]);d(e,this.property,Jt.flatten(t))})}}({table:`files`,tableKey:`id`,targetTable:`file_metas`,targetKey:`file_id`,property:`metas`})};var _r=class e extends E(ut,rt,Qn(`files`),$n(gr),Zn(`file_metas`,`file_id`)){static cache=new Map;static async has(e){return await this.exists({query:t=>t.where(`filename`,`=`,e)})}static async findByFilename(e){return await this.findOne({where:t=>t(`filename`,`=`,e)})}readStream(){return $.use(this.drive).readStream(this.filename)}async read(){return await $.use(this.drive).read(this.filename)}async loadUrl(t={}){let n=e.cache.get(this.filename),r=Date.now();if(n&&r<n.expires){this.url=n.url;return}if(t.expires||=`1h`,this.url=await $.use(this.drive).url(this.filename,t),!this.url)return;let i=r+g(t.expires)-1e3;e.cache.set(this.filename,{url:this.url,expires:i})}static async loadUrls(e,t={}){let n=Date.now();for(let r of e){let e=this.cache.get(r.filename);if(e&&n<e.expires){r.url=e.url;continue}await r.loadUrl(t)}}static async loadMetas(e){let t=e.map(e=>e.id);if(!t.length)return;let n=await hr.list({query:e=>e.selectAll().where(`file_id`,`in`,t)});e.forEach(e=>{e.metas=Jt.flatten(n.filter(t=>t.file_id===e.id))})}async deleteFromDrive(){await $.use(this.drive).delete(this.filename)}},vr=class extends E(pt){get git(){return new Sn({cwd:this.directory,sshKey:B.get(`modules.${this.id}.ssh_key`),sshKeyTmpFileName:Ct(`ssh_key_${this.id}.pem`),logger:w.child({label:`git`}),debug:B.get(`git.debug`,!1)})}makePath(...e){return a(this.directory,...e)}staticPath(...e){return a(`/static`,`modules`,this.id,...e)}command=(e,t,n)=>sr.command(e,t,{cwd:this.directory,...n});load(){let e=this.makePath(`module.json`);if(!s.existsSync(e))return;let t=s.readFileSync(e,`utf-8`),n=JSON.parse(t);this.dependencies=n.dependencies||{},this.build=n.build||{}}findClientEntrypointFilename(e=`dev`){let t=[];e===`dev`&&t.push(this.makePath(`client`,`module.client.ts`),this.makePath(`client`,`module.client.js`),this.makePath(`client`,`client.ts`),this.makePath(`client`,`client.js`)),e===`node`&&t.push(this.makePath(`client-dist/node`,`index.js`),this.makePath(`client-dist/node`,`index.mjs`),this.makePath(`client-dist/node`,`module.client.js`),this.makePath(`client-dist/node`,`module.client.mjs`)),e===`browser`&&t.push(this.makePath(`client-dist/browser`,`index.js`),this.makePath(`client-dist/browser`,`index.mjs`),this.makePath(`client-dist/browser`,`module.client.js`),this.makePath(`client-dist/browser`,`module.client.mjs`));for(let e of t)if(s.existsSync(e))return e;return null}},yr=class{url;request;response;cookies;head;nodeContainer;nodeConfig;nodeState;browserContainer;browserConfig;browserState;constructor(e){this.url=e.url,this.request=e.request,this.response=e.response,this.cookies=new mr(this.request,this.response),this.head=[],this.nodeContainer=e.nodeContainer||new Le,this.nodeConfig=e.nodeConfig||new k,this.nodeState=e.nodeState||new Map,this.browserConfig=e.browserConfig||new k,this.browserContainer=e.browserContainer||new Le,this.browserState=e.browserState||new Map}setBrowserState(e,t){this.browserState.set(e,t)}setNodeState(e,t){this.nodeState.set(e,t)}setState(e,t){this.setNodeState(e,t),this.setBrowserState(e,t)}setBrowserContainerValue(e,t){this.browserContainer.set(e,t)}setNodeContainerValue(e,t){this.nodeContainer.set(e,t)}setContainerValue(e,t){this.setNodeContainerValue(e,t),this.setBrowserContainerValue(e,t)}setBrowserConfigValue(e,t){this.browserConfig.set(e,t)}setNodeConfigValue(e,t){this.nodeConfig.set(e,t)}setConfigValue(e,t){this.setNodeConfigValue(e,t),this.setBrowserConfigValue(e,t)}},br=class extends E(ht){directory;makePath(...e){return ke(this.directory,...e)}},xr=class e extends br{apiFolders=new Map;apiDirectories=new Set;constructor(){super(),tr.on(`router:registered`,this.onRouterRegistered.bind(this))}staticPath(...e){return a(`/static`,`modules`,this.id,...e)}async load(){}async onRouterRegistered(e){let t=e.router;for(let[e,n]of this.apiFolders){let r=n.prefix||`/api/`;await nn.create(e).setPrefix(r).setRouter(t).setModule(this.id).load()}for(let e of this.apiDirectories)t.addDir(e,{module:this.id})}addApiFolder(e,t={}){this.apiFolders.set(e,t)}addRouterFolder(e){this.apiDirectories.add(e)}static fromPluginDiscoverEntity(t){let n=typeof this==`function`?this:e,r=new n,i={id:t.id,name:t.name,version:t.version,directory:t.directory};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}},Sr=class{async handle(e){if(!e.user||!e.token)throw new S(`Invalid authentication token`,401);return{user:e.user,token:e.token}}},Cr=class{async handle(e){let t=e.cookie.get(`Authorization`);if(e.request&&e.request.headers.authorization&&(t=e.request.headers.authorization),t&&t.startsWith(`Bearer `)&&(t=t.slice(7)),!t)return{user:void 0,token:void 0};let n=await cr.findByToken(t),r;return n&&(r=await lr.findOrFail(n.user_id)),{user:r,token:n||void 0}}},wr=class{permissions;constructor(e){this.permissions=Array.isArray(e)?e:[e]}async handle(e){for(let t of this.permissions)e.acl.authorize(t.action,t.resource,t.conditions||{})}},Tr=class{async handle(e){let t=e.token,n=[],r={};if(e.user&&t?.type===`auth`){let t=await ir.findMany({assignableId:String(e.user.id),assignableType:`user`});n=await ar.findMany({id:t.map(e=>e.permission_id)}),r.auth={user:{id:e.user.id,name:e.user.name,email:e.user.email}}}if(t&&t.type===`api`){let e=await ir.findMany({assignableId:String(t.id),assignableType:`token`});n=await ar.findMany({id:e.map(e=>e.permission_id)}),r.api={token:{id:t.id,name:t.name}}}return{acl:new pr({permissions:it.applyContext(n,r),debug:B.get(`acl.debug`)||B.get(`app.debug`),logger:w.child({label:`acl`})})}}static create(e){return new wr(e)}};function Er(e){async function t(t,n){let r=Array.isArray(t)?t:[t],i=Array.isArray(n)?n:[n];for(let t of i){let n=e?.[t];if(!n)throw new S(`Loader ${String(t)} not declared`);await n.load(r)}}return{keys:Object.keys(e),loaders:e,load:t}}function Dr(e){return e}function Or(e){let t=e.folders,n=e.filename,i=e.glob||`**/*.(ts|js)`,a=[`**/index.ts`,`**/*.spec.ts`,`**/*.spec-d.ts`,`**/*.test.ts`,`**/*.test-d.ts`],o=e.ignore||[],c=``;for(let e of t){let t=l.sync(`${e}/${i}`,{ignore:[...a,...o]});for(let e of t){let t=r.relative(r.dirname(n),e),i=r.extname(e),a=s.readFileSync(e,`utf-8`).includes(`export default`)&&!t.includes(`generateIndexFile.ts`);e.endsWith(`.vue`)&&(a=!0),c+=`export * from './${t}'\n`,a&&(c+=`export { default as ${r.basename(e,i)} } from './${t}'\n`)}}c=c.trim(),s.writeFileSync(n,c)}async function kr(e){for(let t of e){let e=Me(t);if(Ne.existsSync(t))return await import(e.toString())}return null}export{pr as AclEntity,Sr as AuthMiddleware,Cr as AuthSilenceMiddleware,Tr as AuthorizationMiddleware,wr as AuthorizePermission,gt as CliCommand,_t as CliService,vt as CliTesterService,yt as CliWrapperService,wt as ConfigFSService,At as ConfigManagerService,pn as ConfigRepository,kt as ConfigS3Service,mr as CookieMapEntity,G as DatabaseRepository,_n as DatabaseRepositoryInferMixin,jt as DownloadService,Tt as DriveBaseGateway,V as DriveConfigEntity,Rt as DriveFSGateway,Ot as DriveS3Gateway,zt as DriveService,Bt as EmmitterService,Lt as EncryptService,It as EnvService,_r as FileEntity,hr as FileMetaEntity,mn as FileRepository,Vt as GitBranchRepository,Wt as GitCommitRepository,Sn as GitGateway,Gt as LifecycleService,Zn as MetadataMixin,Kt as MetadataQueryService,Jt as MetadataService,Yt as MigrationEntity,Xt as MigratorService,Mt as ModelConfigMixin,Qn as ModelMixin,vr as ModuleEntity,yr as PageRequestContextEntity,hn as PermissionAssignmentRepository,gn as PermissionRepository,xr as PluginEntity,br as PluginEntryEntity,Zt as PluginIpcClient,Qt as PluginIpcHost,tn as PluginRouter,$n as RelationsMixin,rn as RouteEntity,nn as RouterFileBaseRoutingService,on as RouterRegisterService,ln as RouterResourceConfigService,cn as RouterResourceService,an as RouterService,un as SeederEntity,dn as SeederService,fn as ShellService,vn as TokenRepository,yn as UserRepository,Wn as addCreatedColumn,Hn as addSoftDeleteColumn,Kn as addTimestampColumns,Gn as addUpdatedColumn,z as basePath,B as config,C as container,Cn as count,q as create,Pn as createDefault,fr as createHasManyThroughLoader,Er as createLoaderFactory,Fn as createMysql,W as database,Dr as defineHandler,ur as defineLoader,Vn as deleted,J as destroy,er as download,$ as drive,tr as emmitter,U as encrypt,In as exists,nr as filesRepository,X as findOne,Z as findOneOrFail,Ln as firstOrCreate,Or as generateIndexFile,Be as importAll,Re as importFiles,ze as importGlob,kr as importOne,qt as key,Y as list,dr as loadHasManyThrough,w as logger,rr as migrator,K as now,Rn as paginate,ir as permissionAssignmentRepository,ar as permissionRepository,Fe as printObject,Ie as printTable,St as relativeToBasePath,or as router,sr as shell,Un as softDelete,xt as storagePath,Ct as tmpPath,cr as tokenRepository,Bn as undeleted,Q as update,qn as updateDefault,Jn as updateMysql,Yn as updateOrCreate,lr as userRepository,Xn as valueToString,zn as whereNotDeleted};
5
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiRW1taXR0ZXJTZXJ2aWNlIiwiTGlmZWN5Y2xlU2VydmljZSIsImJvb2xlYW4iLCJQZXJtaXNzaW9uIiwic3ViamVjdCIsImNyZWF0ZVN1YmplY3QiLCJDb29raWVNYXBFbnRpdHkiLCJEcml2ZUNvbmZpZyIsIkJhc2VFbnRpdHlNaXhpbiIsIkZpbGVNZXRhIiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIiwiTW9kdWxlIiwiUGx1Z2luRW50aXR5IiwiQ29tbWFuZGVyQ29tbWFuZCIsIkVtbWl0dGVyU2VydmljZSIsIkJhc2VEcml2ZSIsIkRyaXZlRW50aXR5IiwiUzNEcml2ZSIsIkJhc2UiLCJjcnlwdG8iLCJCYXNlRHJpdmUiLCJEcml2ZUVudGl0eSIsIkJhc2VFbW1pdHRlclNlcnZpY2UiLCJCYXNlTGlmZWN5Y2xlU2VydmljZSIsImRiIiwiRW1taXR0ZXJTZXJ2aWNlIiwiam9pbiIsIkVtbWl0dGVyU2VydmljZSIsIlNoZWxsRXhlY3B0aW9uIiwiRGF0YWJhc2VSZXBvc2l0b3J5SW5mZXIiLCJqb2luIiwiZGIiLCJ0b0RiIiwiZGIiLCJmcm9tRGIiLCJ0b0RiIiwidG9EYiIsImRhdGV0aW1lLnRvRGIiLCJqc29uLnRvRGIiLCJib29sZWFuLnRvRGIiLCJkYiIsImRiIiwiZGIiLCJkYiIsImRiIiwiZGIiLCJQYWdpbmF0aW9uIiwiZGIiLCJkYiIsImRiIiwiZGIiLCJkYiIsInF1ZXJpZXMucGFnaW5hdGUiLCJxdWVyaWVzLmxpc3QiLCJxdWVyaWVzLmZpbmRPbmUiLCJxdWVyaWVzLmZpbmRPbmVPckZhaWwiLCJxdWVyaWVzLmV4aXN0cyIsInF1ZXJpZXMuY291bnQiLCJxdWVyaWVzLmNyZWF0ZSIsInF1ZXJpZXMudXBkYXRlIiwicXVlcmllcy5kZXN0cm95IiwicXVlcmllcy5maXJzdE9yQ3JlYXRlIiwicXVlcmllcy51cGRhdGVPckNyZWF0ZSIsInF1ZXJpZXMuc29mdERlbGV0ZSIsIkVtbWl0dGVyU2VydmljZSIsImRiIiwiZGIiLCJkYiIsImRiIiwiQmFzZUFjbCIsIkJhc2UiLCJCYXNlTWV0YSIsImRiIiwiQmFzZSIsIkhvb2tzU3RhdGljIiwiQmFzZSIsIkJhc2UiLCJqb2luIiwiUGVybWlzc2lvbiIsInBhdGhUb0ZpbGVVUkwiLCJmcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvcHJpbnRUYWJsZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9jb250YWluZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvbG9nZ2VyLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9pbXBvcnRBbGwudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2ZsYXR0ZW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvdXJsVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9TaGVsbEV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZU1ldGFFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVVcGxvYWRTZXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QYWdpbmF0aW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1JvbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0NsaVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0NsaVRlc3RlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0NsaVdyYXBwZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9iYXNlUGF0aC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ29uZmlnRlNTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9nYXRld2F5cy9Ecml2ZUJhc2VHYXRld2F5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9nYXRld2F5cy9Ecml2ZVMzR2F0ZXdheS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ29uZmlnUzNTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Db25maWdNYW5hZ2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvRG93bmxvYWRTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2NvbmZpZy50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWl4aW5zL01vZGVsQ29uZmlnTWl4aW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL0RyaXZlQ29uZmlnRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zY2hlbWFzL2VudlNjaGVtYS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvRW52U2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvRW5jcnlwdFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZW5jcnlwdC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVGU0dhdGV3YXkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0RyaXZlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9HaXRCcmFuY2hSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9HaXRDb21taXRSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVF1ZXJ5U2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9NaWdyYXRpb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL01pZ3JhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUGx1Z2luSXBjQ2xpZW50LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5JcGNIb3N0LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5Sb3V0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1JvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJSZWdpc3RlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1JvdXRlclJlc291cmNlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUm91dGVyUmVzb3VyY2VDb25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9TZWVkZXJFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1NlZWRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1NoZWxsU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL0NvbmZpZ1JlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlcG9zaXRvcmllcy9GaWxlUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL1Blcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL1Blcm1pc3Npb25SZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9taXhpbnMvRGF0YWJhc2VSZXBvc2l0b3J5SW5mZXJNaXhpbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL1Rva2VuUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL1VzZXJSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9nYXRld2F5cy9HaXRHYXRld2F5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL2NvbW1vbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9jb3VudC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbm9ybWFsaXplcnMvZGF0ZXRpbWUudHMiLCIuLi8uLi9zcmMvc2VydmVyL25vcm1hbGl6ZXJzL2pzb24udHMiLCIuLi8uLi9zcmMvc2VydmVyL25vcm1hbGl6ZXJzL2Jvb2xlYW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL25vcm1hbGl6ZXJzL2FsbC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbm9ybWFsaXplcnMvaW5kZXgudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvY3JlYXRlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL2Rlc3Ryb3kudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvbGlzdC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9leGlzdHMudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvZmluZE9uZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9maXJzdE9yQ3JlYXRlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3BhZ2luYXRlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3NvZnREZWxldGUudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvdGltZXN0YW1wLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3VwZGF0ZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy91cGRhdGVPckNyZWF0ZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9pbmNyZW1lbnRhbC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWl4aW5zL01ldGFkYXRhTWl4aW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9taXhpbnMvUmVsYXRpb25zTWl4aW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZG93bmxvYWQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZHJpdmUudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZW1taXR0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZmlsZXNSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL21pZ3JhdG9yLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL3Blcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9wZXJtaXNzaW9uUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9yb3V0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvc2hlbGwudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvdG9rZW5SZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL3VzZXJSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9kZWZpbmVMb2FkZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2xvYWRlcnMvY3JlYXRlSGFzTWFueVRocm91Z2hMb2FkZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9GaWxlTWV0YUVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVsYXRpb25zL2hhc01ldGFzLnJlbGF0aW9uLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9GaWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1BhZ2VSZXF1ZXN0Q29udGV4dEVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvUGx1Z2luRW50cnlFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWlkZGxld2FyZXMvQXV0aE1pZGRsZXdhcmUudHMiLCIuLi8uLi9zcmMvc2VydmVyL21pZGRsZXdhcmVzL0F1dGhTaWxlbmNlTWlkZGxld2FyZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWlkZGxld2FyZXMvQXV0aG9yaXphdGlvbk1pZGRsZXdhcmUudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2NyZWF0ZUxvYWRlckZhY3RvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2RlZmluZUhhbmRsZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2dlbmVyYXRlSW5kZXhGaWxlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9pbXBvcnRPbmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRhYmxlIGZyb20gJ2NsaS10YWJsZTMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVDb2x1bW4ge1xuICAgIGxhYmVsOiBzdHJpbmdcbiAgICB2YWx1ZTogc3RyaW5nIHwgKChpdGVtOiBhbnkpID0+IHN0cmluZylcbiAgICB3aWR0aD86IG51bWJlclxuICAgIHJlYWxXaWR0aD86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdE9wdGlvbnMge1xuICAgIGtleVdpZHRoPzogbnVtYmVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludE9iamVjdChvdXRwdXQ6IGFueSA9IHt9LCBvcHRpb25zOiBPYmplY3RPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgfHwgODBcbiAgICBjb25zdCBrZXlXaWR0aCA9IG9wdGlvbnMua2V5V2lkdGggfHwgTWF0aC5mbG9vcihzY3JlZW5XaWR0aCAqIDAuMilcbiAgICBjb25zdCB2YWx1ZVdpZHRoID0gTWF0aC5mbG9vcihzY3JlZW5XaWR0aCAqIDAuNylcblxuICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHtcbiAgICAgICAgd29yZFdyYXA6IHRydWUsXG4gICAgICAgIHdyYXBPbldvcmRCb3VuZGFyeTogZmFsc2UsXG4gICAgICAgIGNvbFdpZHRoczogW2tleVdpZHRoLCB2YWx1ZVdpZHRoXSxcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3V0cHV0KSkge1xuICAgICAgICB0YWJsZS5wdXNoKFtrZXksIFN0cmluZyhvdXRwdXRba2V5XSldKVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKHRhYmxlLnRvU3RyaW5nKCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFRhYmxlKGl0ZW1zOiBhbnlbXSwgY29sdW1ucz86IFRhYmxlQ29sdW1uW10pIHtcbiAgICBjb25zdCBzY3JlZW5XaWR0aCA9IChwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIHx8IDgwKSAtIDZcbiAgICBjb25zdCByb3dzID0gW10gYXMgc3RyaW5nW11bXVxuICAgIGNvbnN0IGhlYWQ6IFRhYmxlQ29sdW1uW10gPSBbXVxuXG4gICAgaWYgKGNvbHVtbnMpIHtcbiAgICAgICAgaGVhZC5wdXNoKC4uLmNvbHVtbnMpXG4gICAgfVxuXG4gICAgaWYgKCFjb2x1bW5zKSB7XG4gICAgICAgIGl0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiBPYmplY3Qua2V5cyhpdGVtKSlcbiAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXG4gICAgICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaGVhZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICB9XG5cbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm93ID0gW10gYXMgc3RyaW5nW11cblxuICAgICAgICBoZWFkLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9ICcnXG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaC52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gaC52YWx1ZShpdGVtKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGgudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpdGVtW2gudmFsdWVdXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSAnJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJvdy5wdXNoKHZhbHVlKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJvd3MucHVzaChyb3cpXG4gICAgfSlcblxuICAgIGhlYWQuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICBpZiAoaC53aWR0aCkge1xuICAgICAgICAgICAgaC53aWR0aCA9IE51bWJlcihoLndpZHRoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoLmxhYmVsKSB7XG4gICAgICAgICAgICBoLmxhYmVsID0gU3RyaW5nKGgudmFsdWUpXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgdXNlZFdpZHRoID0gaGVhZC5maWx0ZXIoKGgpID0+ICEhaC53aWR0aCkucmVkdWNlKChhY2MsIGgpID0+IGFjYyArIGgud2lkdGghLCAwKVxuICAgIGNvbnN0IHJlbWFpbmluZ1dpZHRoID0gMTAwIC0gdXNlZFdpZHRoXG4gICAgY29uc3Qgd2l0aE5vV2lkdGggPSBoZWFkLmZpbHRlcigoaCkgPT4gIWgud2lkdGgpLmxlbmd0aFxuXG4gICAgaGVhZC5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgIGlmICghaC53aWR0aCkge1xuICAgICAgICAgICAgaC53aWR0aCA9IE1hdGguZmxvb3IocmVtYWluaW5nV2lkdGggLyB3aXRoTm9XaWR0aClcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBoZWFkLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgaWYgKGgud2lkdGgpIHtcbiAgICAgICAgICAgIGgucmVhbFdpZHRoID0gTWF0aC5mbG9vcihzY3JlZW5XaWR0aCAqIChoLndpZHRoIC8gMTAwKSlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSh7XG4gICAgICAgIGhlYWQ6IGhlYWQubWFwKChoKSA9PiBoLmxhYmVsKSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGhlYWQ6IFtdLCAvL2Rpc2FibGUgY29sb3JzIGluIGhlYWRlciBjZWxsc1xuICAgICAgICAgICAgYm9yZGVyOiBbXSwgLy9kaXNhYmxlIGNvbG9ycyBmb3IgdGhlIGJvcmRlclxuICAgICAgICB9LFxuICAgICAgICB3b3JkV3JhcDogdHJ1ZSxcbiAgICAgICAgd3JhcE9uV29yZEJvdW5kYXJ5OiBmYWxzZSxcbiAgICAgICAgY29sV2lkdGhzOiBoZWFkLm1hcCgoaCkgPT4gaC5yZWFsV2lkdGgpIGFzIG51bWJlcltdLFxuICAgIH0pXG5cbiAgICB0YWJsZS5wdXNoKC4uLnJvd3MpXG5cbiAgICBjb25zb2xlLmxvZyh0YWJsZS50b1N0cmluZygpKVxufVxuIiwiaW50ZXJmYWNlIFRyeWVyIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBhbnlcbn1cblxuaW50ZXJmYWNlIFRyeWVyQXN5bmMge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8YW55PiB8IGFueVxufVxuXG50eXBlIFRyeUNhdGNoUmVzdWx0PFQgZXh0ZW5kcyBUcnllcj4gPSBbbnVsbCwgUmV0dXJuVHlwZTxUPl0gfCBbRXJyb3IsIG51bGxdXG5cbnR5cGUgVHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4gPSBbbnVsbCwgQXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pl0gfCBbRXJyb3IsIG51bGxdXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlDYXRjaDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4odHJ5ZXI6IFQpOiBQcm9taXNlPFRyeUNhdGNoQXN5bmNSZXN1bHQ8VD4+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cblxudHJ5Q2F0Y2guc3luYyA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgVHJ5ZXI+KHRyeWVyOiBUKTogVHJ5Q2F0Y2hSZXN1bHQ8VD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xvZ2dlclNlcnZpY2UnIFxuXG4gICAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cblxuICAgIHB1YmxpYyBjaGlsZChvcHRpb25zOiBhbnkpOiBMb2dnZXJTZXJ2aWNlIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgICAgICByZXR1cm4gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHN0YXR1c0NvZGU6IG51bWJlciA9IDUwMFxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzQ29kZTogbnVtYmVyID0gNTAwKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZVxuICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogQmFzZUV4Y2VwdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUV4Y2VwdGlvbihlcnJvci5tZXNzYWdlLCA1MDApXG4gICAgfVxufSIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gXCIjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50c1wiXG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IG9iamVjdD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5cbnR5cGUgRW50cnlLZXkgPSBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RvclxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWluZXJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGVudHJpZXMgPSBuZXcgTWFwPEVudHJ5S2V5LCBhbnk+KClcblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHJlY29yZFtTdHJpbmcoa2V5KV0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0S2V5KHBheWxvYWQ6IEVudHJ5S2V5KTogRW50cnlLZXkge1xuICAgICAgICBsZXQga2V5ID0gcGF5bG9hZFxuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGtleSA9IHBheWxvYWQubmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNDb25zdHJ1Y3RvciA9IHR5cGVvZiBwYXlsb2FkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcGF5bG9hZCAhPT0gJ3N5bWJvbCdcblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAhKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogVGhlIGNvbnN0cnVjdG9yICR7cGF5bG9hZC5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIuIENvbnNpZGVyIGFkZGluZyBhIHN0YXRpYyBwcm9wZXJ0eSBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgdG8gYXZvaWQgcG90ZW50aWFsIGNvbmZsaWN0cy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGtleSA9IChwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KHBheWxvYWQ6IEVudHJ5S2V5LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHZhbHVlKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwYXlsb2FkOiBFbnRyeUtleSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuaGFzKGtleSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHBheWxvYWQ6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBFbnRyeSB3aXRoIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgbm90IGZvdW5kIGluIGNvbnRhaW5lci5gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2luZ2xldG9uPFQ+KGNsYXNzQ29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGNsYXNzQ29uc3RydWN0b3IubmFtZVxuICAgICAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyBjbGFzc0NvbnN0cnVjdG9yKClcbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIG5ld0luc3RhbmNlKVxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2VcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChlbnRyaWVzOiBSZWNvcmQ8YW55LCBhbnk+KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHk8VCA9IHVua25vd24+KGtleTogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5W3Byb3BdXG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGVudHJ5KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeVtwcm9wXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKF90YXJnZXQsIHByb3AsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgZW50cnlbcHJvcF0gPSB2YWx1ZVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkgYXMgVFxuICAgIH1cblxuICAgIHB1YmxpYyBrZXlzKCk6IEVudHJ5S2V5W10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMua2V5cygpKVxuICAgIH1cbn1cbiIsImltcG9ydCBDb250YWluZXJTZXJ2aWNlIGZyb20gXCIjc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHNcIjtcblxuY29uc3QgY29udGFpbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5zZXJ2ZXJDb250YWluZXIgfHwgbmV3IENvbnRhaW5lclNlcnZpY2UoKVxuXG5nbG9iYWxUaGlzLnNlcnZlckNvbnRhaW5lciA9IGNvbnRhaW5lclxuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXIgYXMgQ29udGFpbmVyU2VydmljZVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgbG9nZ2VyID0gY29udGFpbmVyLnByb3h5PExvZ2dlclNlcnZpY2U+KExvZ2dlclNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICd1cmwnXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvbG9nZ2VyLnRzJ1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gICAgY2FjaGU/OiBib29sZWFuO1xuICAgIG9uQmVmb3JlSW1wb3J0PzogKGN0eDogeyBmaWxlbmFtZTogc3RyaW5nIH0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIG9uQWZ0ZXJJbXBvcnQ/OiAoY3R4OiB7IGZpbGVuYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55IH0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIG9uRXJyb3I/OiAoY3R4OiB7IGZpbGVuYW1lOiBzdHJpbmcsIGVycm9yOiBFcnJvciB9KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBleGNsdWRlPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRGaWxlcyhmaWxlczogc3RyaW5nW10sIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG1vZHVsZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgIGxldCBvbkVycm9yOiBSZXF1aXJlZDxPcHRpb25zPlsnb25FcnJvciddID0gY3R4ID0+IHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjdHguZXJyb3IsIHsgZmlsZW5hbWU6IGN0eC5maWxlbmFtZSB9KSBcblxuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgJHtjdHguZmlsZW5hbWV9YCwgY3R4LmVycm9yKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uRXJyb3IpIHtcbiAgICAgICAgb25FcnJvciA9IG9wdGlvbnMub25FcnJvclxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSAmJiBvcHRpb25zLmV4Y2x1ZGUuc29tZShwYXR0ZXJuID0+IGZpbGVuYW1lLmluY2x1ZGVzKHBhdHRlcm4pKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHsgZmlsZW5hbWUgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlSW1wb3J0KSB7XG4gICAgICAgICAgICBhd2FpdCBvcHRpb25zLm9uQmVmb3JlSW1wb3J0KGN0eClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsZWFuRmlsZW5hbWUgPSBjdHguZmlsZW5hbWUuc3BsaXQoJz8nKVswXVxuXG4gICAgICAgIGlmICgvXFwuKG10c3x0c3xqcykkLy50ZXN0KGNsZWFuRmlsZW5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCBhYnMgPSBwYXRoLnJlc29sdmUoY3R4LmZpbGVuYW1lKVxuICAgICAgICAgICAgY29uc3QgZmlsZVVybCA9IHBhdGhUb0ZpbGVVUkwoYWJzKVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jYWNoZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBmaWxlVXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3QnLCBEYXRlLm5vdygpLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvciwgbW9kXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IGltcG9ydChmaWxlVXJsLnRvU3RyaW5nKCkpKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBjdHguZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHVybDogZmlsZVVybCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogY3R4LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBlcnJvciBcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vZHVsZXNbZmlsZW5hbWVdID0gbW9kXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICgvXFwuanNvbiQvLnRlc3QoY2xlYW5GaWxlbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtlcnJvciwganNvbl0gPSBhd2FpdCB0cnlDYXRjaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGN0eC5maWxlbmFtZSwgJ3V0ZjgnKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIG9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogY3R4LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBlcnJvciBcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vZHVsZXNbZmlsZW5hbWVdID0ganNvblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMub25BZnRlckltcG9ydCkge1xuICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5vbkFmdGVySW1wb3J0KHtcbiAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGVzW2ZpbGVuYW1lXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRHbG9iKHBhdHRlcm46IHN0cmluZywgb3B0aW9uczogT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmZyhwYXR0ZXJuKVxuXG4gICAgcmV0dXJuIGltcG9ydEZpbGVzKGZpbGVzIGFzIHN0cmluZ1tdLCBvcHRpb25zKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0QWxsKGRpcmVjdG9yeTogc3RyaW5nLCBvcHRpb25zOiBPcHRpb25zID0ge30pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuXG4gICAgY29uc3QgZmlsZXMgPSBkaXJlbnRzXG4gICAgICAgIC5maWx0ZXIoZGlyZW50ID0+IGRpcmVudC5pc0ZpbGUoKSlcbiAgICAgICAgLm1hcChkaXJlbnQgPT4gcGF0aC5qb2luKGRpcmVjdG9yeSwgZGlyZW50Lm5hbWUpKVxuXG4gICAgcmV0dXJuIGltcG9ydEZpbGVzKGZpbGVzLCBvcHRpb25zKVxufVxuXG5cblxuIiwiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgaXNJbmRleCA9IC9eXFxkKyQvLnRlc3Qoa2V5KVxuICAgICAgICBjb25zdCBuZXdLZXkgPSBpc0luZGV4ID8gYCR7cHJlZml4fVske2tleX1dYCA6IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBuZXdLZXksIHJlcylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn1cbiIsImZ1bmN0aW9uIHV1aWQoKXtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0byAmJiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBjcnlwdG8ucmFuZG9tVVVJRFxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDBcbiAgICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDhcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkKHByZWZpeCA9ICcnKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHV1aWQoKVxufSIsImltcG9ydCB7IGdldCwgc2V0LCBoYXMsIHVuc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJ1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NvbmZpZ1NlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRW50cnk+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJzpib29sZWFuJykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCc6Ym9vbGVhbicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRba2V5XSA9IGVudHJ5LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXModmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSBhcyBUXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyBlbnRyeS52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0KHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIGRlZmF1bHRWYWx1ZSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9uZTxUID0gYW55IHwgdW5kZWZpbmVkPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAncnVudGltZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGxldCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltYXJ5VmFsdWUgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCB2YWx1ZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICghcHJpbWFyeVZhbHVlKSByZXR1cm5cblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKVxuICAgIH1cblxuICAgIHB1YmxpYyBkdW1wKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLnRvUmVjb3JkKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBjcmVhdGVJZCwgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy9pbmRleC50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuaW50ZXJmYWNlIEVtbWl0dGVySGFuZGxlciB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgICBvcmlnaW5hbExpc3RlbmVyPzogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbn1cblxuaW50ZXJmYWNlIE9uT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICB1bmlxdWU/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBPbkRlYm91bmNlT3B0aW9ucyBleHRlbmRzIE9uT3B0aW9ucyB7XG4gICAgZGVib3VuY2U/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlclNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0VtbWl0dGVyU2VydmljZSdcblxuICAgIHByaXZhdGUgaGFuZGxlcnM6IEVtbWl0dGVySGFuZGxlcltdID0gW11cbiAgICBwcml2YXRlIGRlYnVnOiBib29sZWFuXG4gICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucz8uZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zPy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1taXR0ZXIgbG9hZGVkIHdpdGggZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEVtbWl0dGVyU2VydmljZTxFdmVudHM+KG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlkID0gb3B0aW9ucz8uaWQgfHwgY3JlYXRlSWQoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy51bmlxdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuaGFuZGxlcnMuc29tZShoID0+IChoLmV2ZW50ID09PSBldmVudCAmJiBoLmxpc3RlbmVyID09PSBsaXN0ZW5lcikgfHwgaC5pZCA9PT0gaWQpXG5cbiAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXI6IEVtbWl0dGVySGFuZGxlciA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKGhhbmRsZXIpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIGFkZGVkJywgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoYXJnczogYW55KSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihhcmdzKVxuXG4gICAgICAgICAgICB0aGlzLm9mZihldmVudCwgd3JhcHBlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCB3cmFwcGVyLCBvcHRpb25zKVxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRGVib3VuY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IGRlYm91bmNlKGxpc3RlbmVyLCBvcHRpb25zPy5kZWJvdW5jZSB8fCAzMDApXG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGRlYm91bmNlZCwgb3B0aW9ucylcblxuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlci5vcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uQW55T2Y8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnRzOiBLW10sIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW11cbiAgICBwdWJsaWMgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IEZ1bmN0aW9uLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBsaXN0ZW5lciBhcyBhbnksIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4ge1xuICAgICAgICAgICAgaWYgKGguZXZlbnQgPT09IGV2ZW50ICYmIChoLmxpc3RlbmVyID09PSBsaXN0ZW5lciB8fCBoLm9yaWdpbmFsTGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciByZW1vdmVkJywgeyBldmVudCB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0cnlDYXRjaC5zeW5jKCgpID0+IGhhbmRsZXIubGlzdGVuZXIoYXJncykpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSkge1xuXG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1pdHRpbmcgZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MpXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0QnlFdmVudChldmVudDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUocGF5bG9hZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiAhaWRzLmluY2x1ZGVzKGguaWQpKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlcnMgcmVtb3ZlZCcsIHsgaWRzIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWxsIGhhbmRsZXJzIGNsZWFyZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0hhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggPiAwXG4gICAgfVxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbnR5cGUgTGlmZWN5Y2xlTWV0aG9kID0gJ3JlZ2lzdGVyJyB8ICdsb2FkJyB8ICdib290JyB8ICdzaHV0ZG93bidcblxuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBleGNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgaG9va3M/OiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMaWZlY3ljbGVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhvb2tzOiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuaG9va3MgPSBkYXRhLmhvb2tzID8/IG5ldyBNYXAoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IGRhdGEub25FcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRXJyb3IoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY29udGV4dCB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBob29rICR7Y29udGV4dC5tZXRob2R9ICgke2NvbnRleHQuaG9va0lkfSk6YCwgZXJyb3IpXG4gICAgfVxuXG4gICAgcHVibGljIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWxsKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLmhvb2tfYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRBbGlhcyA9IGhvb2suaG9va19hbGlhc2VzLmZpbmQoYWxpYXMgPT4gYXJncy5pbmNsdWRlcyhhbGlhcykpXG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Qob3B0aW9ucz86IExpc3RPcHRpb25zKSB7XG4gICAgICAgIGxldCBob29rcyA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhjbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5leGNsdWRlKSA/IG9wdGlvbnMuZXhjbHVkZSA6IFtvcHRpb25zLmV4Y2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gIWlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZSkgPyBvcHRpb25zLmluY2x1ZGUgOiBbb3B0aW9ucy5pbmNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+IGlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MgPSBvcmRlckJ5KGhvb2tzLCBbJ29yZGVyJ10sIFsnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGhvb2tzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCguLi5wYXlsb2FkOiAoTGlmZWN5Y2xlSG9vayB8IENvbnN0cnVjdG9yPExpZmVjeWNsZUhvb2s+KVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2gobmV3IGl0ZW0oKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZXMucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFob29rLmhvb2tfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdTa2lwcGluZyBob29rIHdpdGhvdXQgaG9va19pZDonLCBob29rKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9va3Muc2V0KGhvb2suaG9va19pZCwgaG9vaylcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkICcgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLnN1Ymhvb2tzKSB7XG4gICAgICAgICAgICAgICAgaG9vay5zdWJob29rcy5mb3JFYWNoKHN1Ymhvb2sgPT4gdGhpcy5hZGQoc3ViaG9vaykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5saXN0KG9wdGlvbnMpIFxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZW1pdHRpbmcgJHttZXRob2R9IGZvciBob29rczpgLCB7XG4gICAgICAgICAgICAgICAgaG9va3M6IGhvb2tzLm1hcChob29rID0+IGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5saXN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXI6ICgpID0+IFByb21pc2UuYWxsKFtob29rLnJlZ2lzdGVyKCksIGhvb2sub25SZWdpc3RlcigpXSksXG4gICAgICAgICAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2subG9hZCgpLCBob29rLm9uTG9hZCgpXSksXG4gICAgICAgICAgICAgICAgYm9vdDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suYm9vdCgpLCBob29rLm9uQm9vdCgpXSksXG4gICAgICAgICAgICAgICAgc2h1dGRvd246ICgpID0+IFByb21pc2UuYWxsKFtob29rLnNodXRkb3duKCksIGhvb2sub25TaHV0ZG93bigpXSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBtYXBbbWV0aG9kXSgpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IsIHsgaG9va0lkOiBob29rLmhvb2tfaWQsIG1ldGhvZCB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7bWV0aG9kfSBgICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQocGF5bG9hZDogTGlmZWN5Y2xlTWV0aG9kIHwgTGlmZWN5Y2xlTWV0aG9kW10sIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRNZXRob2QobWV0aG9kLCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdyZWdpc3RlcicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2xvYWQnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBxcyBmcm9tICdxcydcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2Lm51bWJlcigpXSksXG4gICAgdi50cmFuc2Zvcm0oTnVtYmVyKSxcbiAgICB2LmludGVnZXIoKSxcbilcblxuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5ib29sZWFuKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPT09IHRydWUgfHwgdiA9PT0gJ3RydWUnKSxcbilcblxuZXhwb3J0IGNvbnN0IGRhdGUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgaW5zdGFuY2VvZiBEYXRlID8gdiA6IG5ldyBEYXRlKHYpKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPyBmb3JtYXQodiwgJ3l5eXktTU0tZGQnKSA6IHYpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZXRpbWUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHtcbiAgICAgICAgaWYgKCF2KSByZXR1cm4gdlxuXG4gICAgICAgIGlmICh2ID09PSAnbnVsbCcpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdiA9IG5ldyBEYXRlKHYpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0KHYsICd5eXl5LU1NLWRkIEhIOm1tJylcbiAgICB9KSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5ID0gPFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+KHNjaGVtYTogVCA9IHYuYW55KCkgYXMgYW55IGFzIFQpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmFycmF5KHYuc3RyaW5nKCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnNwbGl0KCcsJykpLFxuICAgIHYuYXJyYXkoc2NoZW1hKSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5TnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIGFycmF5KCksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdmFsdWUubWFwKE51bWJlcikpLFxuKVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0ID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHFzLnBhcnNlKHZhbHVlKSA6IHZhbHVlKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHNldChyZXN1bHQsIGtleSwgZ2V0KHZhbHVlLCBrZXkpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0pLFxuKVxuXG4iLCJpbXBvcnQgeyBudW1iZXIsIGFycmF5IH0gZnJvbSAnLi91cmxWYWxpZGF0b3IudHMnXG5pbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblBhcmFtcyB7XG4gICAgbWF4TGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckZpZWxkcz86IHN0cmluZ1tdXG59XG5cblxuZXhwb3J0IGNvbnN0IGJhc2UgPSAob3B0aW9uczogUGFnaW5hdGlvblBhcmFtcyA9IHt9KSA9PiB2Lm9iamVjdCh7XG4gICAgcGFnZTogdi5vcHRpb25hbChudW1iZXIoKSwgMSksXG4gICAgbGltaXQ6IHYub3B0aW9uYWwobnVtYmVyKCksIG9wdGlvbnMubWF4TGltaXQgfHwgMTAwKSxcbiAgICBvcmRlckJ5OiB2Lm9wdGlvbmFsKG9wdGlvbnMub3JkZXJGaWVsZHMgPyBhcnJheSh2LnBpY2tsaXN0KG9wdGlvbnMub3JkZXJGaWVsZHMpKSA6IGFycmF5KHYuc3RyaW5nKCkpLCBbXSksXG4gICAgb3JkZXJEaXJlY3Rpb246IHYub3B0aW9uYWwoYXJyYXkodi51bmlvbihbdi5saXRlcmFsKCdhc2MnKSwgdi5saXRlcmFsKCdkZXNjJyldKSksIFtdKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAnI3NoYXJlZC92YWxpZGF0b3JzL3VybFZhbGlkYXRvci50cydcbmltcG9ydCAqIGFzIHBhZ2luYXRpb24gZnJvbSAnI3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmNvbnN0IGV4dHJhcyA9IHtcbiAgICB1cmwsXG4gICAgcGFnaW5hdGlvbixcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWJvdCA9IHR5cGVvZiB2ICYgeyBleHRyYXM6IHR5cGVvZiBleHRyYXMgfSBcblxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYSA9IHYuQmFzZVNjaGVtYTx1bmtub3duLCB1bmtub3duLCB2LkJhc2VJc3N1ZTx1bmtub3duPj5cbmV4cG9ydCB0eXBlIFZhbGlib3RTY2hlbWFBc3luYyA9IHYuQmFzZVNjaGVtYUFzeW5jPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckNhbGxiYWNrPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPiB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+ID0ge1xuICAgIChfdjogVmFsaWJvdCk6IFRcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yUmVzdWx0PFQgZXh0ZW5kcyB2Lk9iamVjdEVudHJpZXM+ID0gdi5JbmZlck91dHB1dDx2Lk9iamVjdFNjaGVtYTxULCB1bmRlZmluZWQ+PlxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVBheWxvYWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPSBWYWxpYm90U2NoZW1hPiA9IFZhbGlkYXRvckNhbGxiYWNrPFQ+IHwgVFxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVJlc3VsdDxUIGV4dGVuZHMgVmFsaWRhdGVQYXlsb2FkPiA9XG4gICAgVCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPyB2LkluZmVyT3V0cHV0PFQ+IDpcbiAgICBUIGV4dGVuZHMgVmFsaWRhdG9yQ2FsbGJhY2s8aW5mZXIgVT4gPyB2LkluZmVyT3V0cHV0PFU+IDpcbiAgICB1bmtub3duXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdG9yU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVmFsaWRhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyB2OiBWYWxpYm90ID0ge1xuICAgICAgICAuLi52LFxuICAgICAgICBleHRyYXMsXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZTxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4oY2I6IFZhbGlkYXRvckNhbGxiYWNrPFQ+KSB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLnYpXG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0ZVBheWxvYWQ8VD4pIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXQsIGlzc3Vlcywgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZmxhdHRlbiA9IHYuZmxhdHRlbihpc3N1ZXMpXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IFtdIGFzIHN0cmluZ1tdXG5cbiAgICAgICAgICAgIGlmIChmbGF0dGVuLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLmZsYXR0ZW4ucm9vdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ubmVzdGVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZmxhdHRlbi5uZXN0ZWQpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5IGFzIFtzdHJpbmcsIHN0cmluZ1tdXVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4udmFsdWUubWFwKCh2KSA9PiBgJHtrZXl9OiAke3Z9YCkpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzLmxlbmd0aCA/IG1lc3NhZ2VzLmpvaW4oJywgJykgOiAnVmFsaWRhdGlvbiBmYWlsZWQnXG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEJhc2VFeGNlcHRpb24obWVzc2FnZSwgNDIyKVxuXG4gICAgICAgICAgICBlcnJvci5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcidcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBtZXNzYWdlcywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBc3luYzxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYUFzeW5jPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQ+IHwgVCkge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSBhd2FpdCB2LnNhZmVQYXJzZUFzeW5jKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5yb290LFxuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW4ubmVzdGVkLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGRldGFpbHMsIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MgfSA9IHYuc2FmZVBhcnNlKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbn1cblxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uQXNzaWdubWVudCA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHBlcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hPlxuXG5leHBvcnQgY29uc3QgcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgcGVybWlzc2lvbl9pZDogdi5udW1iZXIoKSxcbiAgICBhc3NpZ25hYmxlX3R5cGU6IHYuc3RyaW5nKCksXG4gICAgYXNzaWduYWJsZV9pZDogdi5zdHJpbmcoKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvblNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHBlcm1pc3Npb25TY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgbmFtZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBkZXNjcmlwdGlvbjogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBhY3Rpb246IHYuc3RyaW5nKCksXG4gICAgc3ViamVjdDogdi5zdHJpbmcoKSxcbiAgICBjb25kaXRpb25zOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICBleHBpcmVzX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgVG9rZW4gPSB2LkluZmVyT3V0cHV0PHR5cGVvZiB0b2tlblNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHRva2VuU2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIG5hbWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgdHlwZTogdi5zdHJpbmcoKSxcbiAgICB1c2VyX2lkOiB2Lm51bWJlcigpLFxuICAgIHRva2VuOiB2LnN0cmluZygpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICBleHBpcmVzX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4vQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlbGxFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgICBwdWJsaWMgb3V0cHV0OiBzdHJpbmdcbiAgICBwdWJsaWMgYmluOiBzdHJpbmcgXG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG91dHB1dDogc3RyaW5nLCBiaW46IHN0cmluZywgYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgNTAxKVxuXG4gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0XG4gICAgICAgIHRoaXMuYmluID0gYmluIFxuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIFxuICAgIH1cbn1cbiIsImltcG9ydCBWYWxpZGF0b3JTZXJ2aWNlIGZyb20gXCIuLi9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlXCJcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3JTZXJ2aWNlKClcblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdG9yXG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5pbnRlcmZhY2UgQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMge1xuICAgIHBhcnNlPzogKGRhdGE6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNlRW50aXR5KG9wdGlvbnM6IENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gb3B0aW9ucy5wYXJzZShkYXRhKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXIge1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbWl0SG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgeyAgICAgICAgICAgICAgICBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMuZmlsdGVyKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50KSkge1xuICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Ib29rKGNvbnN0cnVjdG9yOiBhbnksIGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGNvbnN0IGV4aXN0cyA9IGxpc3RlbmVycy5maW5kKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICBldmVudCxcbiAgICAgICAgbGlzdGVuZXIgXG4gICAgfSlcblxuICAgIGNvbnN0cnVjdG9yLmxpc3RlbmVycyA9IGxpc3RlbmVyc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSG9va3NTdGF0aWM8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdC5hcHBseSh0aGlzLmNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBsaXN0ZW5lcnMgPSBbXSBhcyBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gb25Ib29rKHRoaXMsIGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRIb29rKHRoaXMsIGV2ZW50LCAuLi5hcmdzKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBIb29rczxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgbGlzdGVuZXJzOiBMaXN0ZW5lcltdXG5cbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGxpc3RlbmVyIFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVycy5maW5kSW5kZXgoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcHVibGljIGFzeW5jIGVtaXRBc3luYyhldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuSG9va3NTdGF0aWMuZW1pdCA9IGVtaXRIb29rXG5Ib29rc1N0YXRpYy5vbiA9IG9uSG9va1xuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU29mdERlbGV0ZU1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgZGVsZXRlZF9hdDogRGF0ZSB8IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGltZXN0YW1wTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBjcmVhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgICAgIHB1YmxpYyB1cGRhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgb3JpZ2luOiBzdHJpbmdcbiAgICBwdWJsaWMgc3ViamVjdDogc3RyaW5nXG4gICAgcHVibGljIGFjdGlvbjogc3RyaW5nXG4gICAgcHVibGljIGNvbmRpdGlvbnM6IHN0cmluZyB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbnVsbFxuXG4gICAgcHVibGljIGdldCBlZGl0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luID09PSAnY3VzdG9tJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyc2VkQ29uZGl0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IHRyeUNhdGNoLnN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmRpdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5jb25kaXRpb25zIGFzIHN0cmluZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGVycm9yID8ge30gOiBqc29uXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lQWJpbGl0eSwgc3ViamVjdCBhcyBjcmVhdGVTdWJqZWN0IH0gZnJvbSAnQGNhc2wvYWJpbGl0eSdcbmltcG9ydCBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNsRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdBY2xFbnRpdHknXG5cbiAgICBwdWJsaWMgYWJpbGl0eTogUmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lQWJpbGl0eT5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBY2xFbnRpdHk+ID0ge30pIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBkYXRhLnBlcm1pc3Npb25zIHx8IFtdXG4gICAgICAgIGNvbnN0IHBlcm1zID0gcGVybWlzc2lvbnMubWFwKChwZXJtaXNzaW9uKSA9PiBQZXJtaXNzaW9uLmZyb20ocGVybWlzc2lvbikpXG5cbiAgICAgICAgXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtc1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKCkuY2hpbGQoeyBsYWJlbDogJ2FjbCcgfSlcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYWJpbGl0eSA9IGRlZmluZUFiaWxpdHkoKGNhbikgPT4ge1xuICAgICAgICAgICAgcGVybXMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbihwZXJtaXNzaW9uLmFjdGlvbiwgcGVybWlzc2lvbi5zdWJqZWN0LCBwZXJtaXNzaW9uLnBhcnNlZENvbmRpdGlvbnMpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScsIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuKGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblxuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW5ub3QoYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWJqZWN0KHN1YmplY3Q6IHN0cmluZywgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcbiAgICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvb2tpZU1hcEVudGl0eU9wdGlvbnMge1xuICAgIGNvb2tpZXM/OiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHJlZml4Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29va2llTWFwRW50aXR5J1xuXG4gICAgcHVibGljIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgcHJlZml4OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY29va2llcyA9IGRhdGE/LmNvb2tpZXMgfHwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLnByZWZpeCA9IGRhdGE/LnByZWZpeCB8fCAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBNYXA8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIGlmIChjb29raWVzIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29va2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29va2llc1trZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChmdWxsTmFtZSkgfHwgZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIFdlIHdhbnQgdG8gYWxsb3cgYW55IG9wdGlvbnMgdG8gYmUgcGFzc2VkIGhlcmUsIGFzIHRoZXkgbWF5IGJlIHVzZWQgYnkgdGhlIHVuZGVybHlpbmcgY29va2llXG4gICAgLy8gIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHRoaXMuY29va2llcy5zZXQoZnVsbE5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgodGhpcy5wcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5wcmVmaXhlZEtleSA9IGtleS5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgpXG5cbiAgICAgICAgICAgICAgICByZXN1bHRbdW5wcmVmaXhlZEtleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImV4cG9ydCBjb25zdCBUWVBFUyA9ICgpID0+IFtcbiAgICB7XG4gICAgICAgIGlkOiAnZnMnLFxuICAgICAgICBsYWJlbDogJHQoJ0ZpbGUgU3lzdGVtJyksXG4gICAgICAgIGRlc2NyaXB0aW9uOiAkdCgnU3RvcmUgZmlsZXMgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLicpLFxuICAgICAgICBjb25maWdfZmllbGRzOiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0RpcmVjdG9yeScpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAkdCgnVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIGZpbGVzIHdpbGwgYmUgc3RvcmVkLicpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdSZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24gcm9vdCBvciBhYnNvbHV0ZSBwYXRoLCBlLmcuLCA6MCAgb3IgOjEnLCBbJy92YXIvemVuaXRoL3VwbG9hZHMnLCAnc3RvcmFnZS91cGxvYWRzJ10pLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiAnczMnLFxuICAgICAgICBsYWJlbDogJ1MzJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICR0KCdTdG9yZSBmaWxlcyBvbiBhbiBTMy1jb21wYXRpYmxlIHNlcnZpY2UgbGlrZSBBV1MgUzMsIERpZ2l0YWxPY2VhbiBTcGFjZXMsIGV0Yy4nKSxcbiAgICAgICAgY29uZmlnX2ZpZWxkczoge1xuICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0FjY2VzcyBLZXkgSUQnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnWW91ciBBV1MgYWNjZXNzIGtleSBJRC4nKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleToge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnU2VjcmV0IEFjY2VzcyBLZXknKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnWW91ciBBV1Mgc2VjcmV0IGFjY2VzcyBrZXkuJyksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBidWNrZXQ6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0J1Y2tldCBOYW1lJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1RoZSBuYW1lIG9mIHRoZSBTMyBidWNrZXQgdG8gc3RvcmUgZmlsZXMgaW4uJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVnaW9uOiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdSZWdpb24nKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnVGhlIEFXUyByZWdpb24gd2hlcmUgeW91ciBidWNrZXQgaXMgbG9jYXRlZC4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVmaXg6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ1ByZWZpeCcpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdBbiBvcHRpb25hbCBwcmVmaXggKGZvbGRlciBwYXRoKSB0byBzdG9yZSBmaWxlcyB1bmRlciBpbiB0aGUgYnVja2V0LicpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuZHBvaW50OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdFbmRwb2ludCBVUkwnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnT3B0aW9uYWwgY3VzdG9tIGVuZHBvaW50IFVSTCBmb3IgUzMtY29tcGF0aWJsZSBzZXJ2aWNlcy4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICB9XG5dXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUNvbmZpZyB7XG4gICAgcHVibGljIHN0YXRpYyBnZXQgVFlQRVMoKSB7XG4gICAgICAgIHJldHVybiBUWVBFUygpXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmdcbiAgICBwdWJsaWMgaXNfZGVmYXVsdDogYm9vbGVhblxuICAgIHB1YmxpYyBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IERyaXZlQ29uZmlnKXtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29uZmlnX2ZpZWxkcygpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gRHJpdmVDb25maWcuVFlQRVMuZmluZChvcHQgPT4gb3B0LmlkID09PSB0aGlzLnR5cGUpXG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi5jb25maWdfZmllbGRzIDoge31cbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVFbnRyeSB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmdcbiAgICBwdWJsaWMgdHlwZTogJ2ZpbGUnIHwgJ2RpcmVjdG9yeSdcbiAgICBwdWJsaWMgbWV0YXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogRHJpdmVFbnRyeSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxufVxuIiwiaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZHJpdmU6IHN0cmluZ1xuICAgIHB1YmxpYyBtaW1ldHlwZTogc3RyaW5nXG4gICAgcHVibGljIHB1cnBvc2U6IHN0cmluZ1xuICAgIHB1YmxpYyBjbGllbnRfbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGZpbGVuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVibGljOiBib29sZWFuXG5cbiAgICAvLyBkeW5hbWljXG4gICAgcHVibGljIHVybD86IHN0cmluZ1xuICAgIHB1YmxpYyBtZXRhcz86IFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgIHB1YmxpYyBpc0ltYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW1ldHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlTWV0YSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBmaWxlX2lkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmcgfCBudWxsXG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkU2Vzc2lvbiBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWVfdHlwZXM6IHN0cmluZ1xuICAgIHB1YmxpYyBtYXhfc2l6ZTogbnVtYmVyXG5cbiAgICAvLyBkeW5hbWljIFxuICAgIHB1YmxpYyB1cGxvYWRfdXJsPzogc3RyaW5nXG4gICAgcHVibGljIGNyZWF0ZV9maWxlX3VybD86IHN0cmluZ1xuXG4gICAgcHVibGljIGdldFBhcnNlZE1pbWVUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWVfdHlwZXMuc3BsaXQoJywnKS5tYXAodHlwZSA9PiB0eXBlLnRyaW0oKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkTWltZVR5cGUobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLmdldFBhcnNlZE1pbWVUeXBlcygpXG4gICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMobWltZVR5cGUpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygnKi8qJylcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkU2l6ZShzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNpemUgPD0gdGhpcy5tYXhfc2l6ZVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZUhvb2sge1xuICAgIHB1YmxpYyBob29rX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgaG9va19hbGlhc2VzPzogc3RyaW5nW11cbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgc3ViaG9va3M/OiBMaWZlY3ljbGVIb29rW11cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgcmVnaXN0ZXIgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25SZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgbG9hZCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGJvb3QgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Cb290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBzaHV0ZG93biAqL1xuICAgIHB1YmxpYyBhc3luYyBvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbn1cbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnQge1xuICAgIGZyb206IHN0cmluZ1xuICAgIHRvPzogc3RyaW5nXG4gICAgdHlwZTogJ2dsb2JhbF9pbXBvcnQnXG59XG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGQge1xuICAgIGltcG9ydHM/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0W11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlTWFuaWZlc3QgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYXV0aG9yPzogc3RyaW5nXG4gICAgcHVibGljIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgYnVpbGQ/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uRW50aXR5PFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHVibGljIGl0ZW1zOiBUW11cbiAgICBwdWJsaWMgdG90YWw6IG51bWJlclxuICAgIHB1YmxpYyBwYWdlOiBudW1iZXJcbiAgICBwdWJsaWMgcGVyX3BhZ2U6IG51bWJlclxuICAgIHB1YmxpYyB0b3RhbF9wYWdlczogbnVtYmVyXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb208VCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPihwYXlsb2FkOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk8VD4+KTogUGFnaW5hdGlvbkVudGl0eTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbkVudGl0eShwYXlsb2FkIGFzIGFueSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYWxpYXNlczogc3RyaW5nW11cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuIiwiaW1wb3J0IHR5cGUgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgdHlwZSBSb2xlIGZyb20gJy4vUm9sZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZW1haWw6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdXNlcm5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXNzd29yZD86IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJpZmllZF9hdD86IERhdGUgfCBzdHJpbmcgfCBudWxsXG5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgcm9sZXM/OiBSb2xlW11cblxuICAgIHB1YmxpYyBnZXQgaW5pdGlhbHMoKXtcbiAgICAgICAgY29uc3QgW2ZpcnN0TmFtZSwgc2Vjb25kTmFtZV0gPSB0aGlzLm5hbWUuc3BsaXQoJyAnKVxuXG4gICAgICAgIGlmICghc2Vjb25kTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhID0gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgY29uc3QgYiA9IHNlY29uZE5hbWVbMF0udG9VcHBlckNhc2UoKVxuXG4gICAgICAgIHJldHVybiBhICsgYlxuICAgIH1cbn1cbiIsImltcG9ydCB7IENvbW1hbmQgYXMgQ29tbWFuZGVyQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcidcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCB7IHByaW50VGFibGUsIHByaW50T2JqZWN0IH0gZnJvbSAnLi4vdXRpbHMvcHJpbnRUYWJsZS50cydcbmltcG9ydCB7IGltcG9ydEFsbCB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvaW1wb3J0QWxsLnRzJ1xuaW1wb3J0IHsgRW1taXR0ZXJTZXJ2aWNlLCBMb2dnZXJTZXJ2aWNlLCB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpRXZlbnRzIHtcbiAgICAnY2xpOnJlZ2lzdGVyZWQnOiB7XG4gICAgICAgIGNsaTogQ2xpU2VydmljZVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kZXJDb21tYW5kIHtcbiAgICBwdWJsaWMgX19pc19jbGlfY29tbWFuZCA9IHRydWVcbiAgICBwdWJsaWMgdGFibGUgPSBwcmludFRhYmxlXG4gICAgcHVibGljIG9iamVjdCA9IHByaW50T2JqZWN0XG4gICAgcHVibGljIGNvbG9ycyA9IGNoYWxrXG5cbiAgICBwdWJsaWMgbmVlZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpXG4gICAgcHVibGljIG5lZWQoLi4uYXJnczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB0aGlzLm5lZWRzLmFkZChhcmcpKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgY3JlYXRlQ29tbWFuZChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2xpQ29tbWFuZChuYW1lKVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpU2VydmljZSBleHRlbmRzIENsaUNvbW1hbmQge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NsaVNlcnZpY2UnXG5cbiAgICBwdWJsaWMgZGlycyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgcHVibGljIGxvZ2dlciA9IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICBwdWJsaWMgZW1taXR0ZXIgPSBuZXcgRW1taXR0ZXJTZXJ2aWNlKClcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUobmFtZSA9ICdjbGknKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2xpU2VydmljZShuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RW1taXR0ZXIoZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLmVtbWl0dGVyID0gZW1taXR0ZXJcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGNyZWF0ZUNvbW1hbmQobmFtZT86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IENsaVNlcnZpY2UobmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRGlyKGRpcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZGlycy5hZGQoZGlyKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWREaXIoZGlyOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbW9kcyA9IGF3YWl0IGltcG9ydEFsbChkaXIsIHtcbiAgICAgICAgICAgIGV4Y2x1ZGU6IFsnLnRlc3QudHMnLCAnLnNwZWMudHMnLCAnLnRlc3QuanMnLCAnLnNwZWMuanMnXSxcbiAgICAgICAgICAgIG9uRXJyb3I6ICh7IGVycm9yLCBmaWxlbmFtZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IubWVzc2FnZSwgZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgZm9yIChjb25zdCBbZmlsZW5hbWUsIG1vZF0gb2YgT2JqZWN0LmVudHJpZXMobW9kcykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGltcG9ydGVkIGZpbGUgJHtmaWxlbmFtZX0gZnJvbSAke2Rpcn1gKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW1vZC5kZWZhdWx0IHx8IE9iamVjdC5rZXlzKG1vZC5kZWZhdWx0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW1vZC5kZWZhdWx0Ll9faXNfY2xpX2NvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBkZWZhdWx0IGV4cG9ydCBvZiBmaWxlICR7bW9kLmZpbGVuYW1lfSBpcyBub3QgYSBDbGlDb21tYW5kLCBza2lwcGluZ2ApXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yXSA9IHRyeUNhdGNoLnN5bmMoKCkgPT4gdGhpcy5hZGRDb21tYW5kKG1vZC5kZWZhdWx0KSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZTogbW9kLmZpbGVuYW1lIH0pXG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvcilcblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGFkZGVkIGNvbW1hbmQgZnJvbSBmaWxlICR7ZmlsZW5hbWV9IHRvIGNsaWApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGRpciBvZiB0aGlzLmRpcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZERpcihkaXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsImltcG9ydCBDbGlTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvQ2xpU2VydmljZS50cydcbmltcG9ydCBkaSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcnRlVGVzdGVyU2VydmljZSBleHRlbmRzIENsaVNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpIFxuXG4gICAgICAgIHRoaXMuZXhpdE92ZXJyaWRlKClcblxuICAgICAgICB0aGlzLmNvbmZpZ3VyZU91dHB1dCh7XG4gICAgICAgICAgICB3cml0ZU91dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN1cHByZXNzIGNvbW1hbmQgb3V0cHV0IGR1cmluZyB0ZXN0c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRlRXJyOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3VwcHJlc3MgZXJyb3Igb3V0cHV0IGR1cmluZyB0ZXN0c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICBkaS5zZXQoQ2xpU2VydmljZSwgdGhpcylcblxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkKHBhdGg6IHN0cmluZykge1xuICAgICAgICBhd2FpdCBpbXBvcnQocGF0aClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZShhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBhd2FpdCB0aGlzLnBhcnNlQXN5bmMoWydub2RlJywgJ2FydGUnLCAuLi5hcmdzXSlcbiAgICB9XG59XG4iLCJpbXBvcnQgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpV3JhcHBlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBwcm9jZXNzOiBjcC5DaGlsZFByb2Nlc3MgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgYXBwQmFzZVBhdGg6IHN0cmluZztcbiAgICBwdWJsaWMgZW52ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBwdWJsaWMgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgICBwdWJsaWMgY29uZmlnQXJndW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBwdWJsaWMgY29uZmlnRmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGxvZ2dlciA9IG5ldyBMb2dnZXJTZXJ2aWNlKCk7XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGlXcmFwcGVyU2VydmljZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRCYXNlUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5hcHBCYXNlUGF0aCA9IHBhdGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29uZmlnQXJndW1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jb25maWdBcmd1bWVudHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29uZmlnRmlsZSguLi5maWxlUGF0aHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHRoaXMuY29uZmlnRmlsZXMucHVzaCguLi5maWxlUGF0aHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRW52KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuZW52LnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRDb25maWdBcmd1bWVudHMoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0FyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMikuZmlsdGVyKGFyZyA9PiBhcmcuc3RhcnRzV2l0aCgnQGNvbmZpZzonKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNvbmZpZ0FyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5LnNsaWNlKCdAY29uZmlnOicubGVuZ3RoKS5zcGxpdCgnPScpLm1hcChzID0+IHMudHJpbSgpKTtcblxuICAgICAgICAgICAgdGhpcy5jb25maWdBcmd1bWVudHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRDb25maWdGaWxlcygpIHtcbiAgICAgICAgY29uc3QgY29uZmlnRmlsZUFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilcbiAgICAgICAgICAgIC5maWx0ZXIoYXJnID0+IGFyZy5zdGFydHNXaXRoKCdAY29uZmlnLWZpbGU6JykpXG4gICAgICAgICAgICAubWFwKGFyZyA9PiBhcmcuc2xpY2UoJ0Bjb25maWctZmlsZTonLmxlbmd0aCkpO1xuXG4gICAgICAgIHRoaXMuYWRkQ29uZmlnRmlsZSguLi5jb25maWdGaWxlQXJncyk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkNPTkZJR19GSUxFUykge1xuICAgICAgICAgICAgY29uc3QgZW52RmlsZXMgPSBwcm9jZXNzLmVudi5DT05GSUdfRklMRVMuc3BsaXQoJywnKS5tYXAoZiA9PiBmLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICB0aGlzLmFkZENvbmZpZ0ZpbGUoLi4uZW52RmlsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRFbnZpcm9ubWVudCgpIHtcbiAgICAgICAgY29uc3QgY29uZmlnQXJndW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLmNvbmZpZ0FyZ3VtZW50cy5lbnRyaWVzKCkpXG4gICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09JHt2YWx1ZX1gKS5qb2luKCc7Jyk7XG5cbiAgICAgICAgdGhpcy5hZGRFbnYoJ1pFTklUSF9DT05GSUdfQVJHVU1FTlRTJywgY29uZmlnQXJndW1lbnRzKTsgXG4gICAgICAgIHRoaXMuYWRkRW52KCdaRU5JVEhfQ09ORklHX0ZJTEVTJywgdGhpcy5jb25maWdGaWxlcy5qb2luKCcsJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkQXJndW1lbnRzKGFyZ3M6IHN0cmluZ1tdID0gW10pIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlcyA9IFsnQGNvbmZpZzonLCAnQGNvbmZpZy1maWxlOiddO1xuXG4gICAgICAgIGNvbnN0IGZvcndhcmRBcmdzID0gYXJncy5maWx0ZXIoYXJnID0+ICFuYW1lc3BhY2VzLnNvbWUobnMgPT4gYXJnLnN0YXJ0c1dpdGgobnMpKSk7XG5cbiAgICAgICAgdGhpcy5hcmdzID0gW1xuICAgICAgICAgICAgJy0tbm8td2FybmluZ3MnLFxuICAgICAgICAgICAgJy0tZXhwZXJpbWVudGFsLXN0cmlwLXR5cGVzJyxcbiAgICAgICAgICAgICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5hcHBCYXNlUGF0aCwgJ3NlcnZlcicsICdjbGkudHMnKSxcbiAgICAgICAgICAgIC4uLmZvcndhcmRBcmdzLFxuICAgICAgICBdO1xuXG4gICAgfVxuXG4gICAgcHVibGljIGtpbGwoY29kZTogbnVtYmVyID0gMCkge1xuICAgICAgICBpZiAodGhpcy5wcm9jZXNzICYmICF0aGlzLnByb2Nlc3Mua2lsbGVkKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3Mua2lsbCgnU0lHVEVSTScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBydW4oYXJncz86IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghdGhpcy5hcHBCYXNlUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYXNlIHBhdGggbm90IHNldC4gUGxlYXNlIGNhbGwgc2V0QmFzZVBhdGgoKSBiZWZvcmUgcnVuKCkuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRDb25maWdBcmd1bWVudHMoKTtcbiAgICAgICAgdGhpcy5sb2FkQ29uZmlnRmlsZXMoKTtcbiAgICAgICAgdGhpcy5sb2FkQXJndW1lbnRzKGFyZ3MgfHwgcHJvY2Vzcy5hcmd2LnNsaWNlKDIpKTtcblxuICAgICAgICB0aGlzLmxvYWRFbnZpcm9ubWVudCgpO1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygncnVuJywge1xuICAgICAgICAgICAgICAgIGFyZ3M6IHRoaXMuYXJncyxcbiAgICAgICAgICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvY2VzcyA9IGNwLnNwYXduKCdub2RlJywgdGhpcy5hcmdzLCB7XG4gICAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuZW52LmVudHJpZXMoKSksXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHRoaXMua2lsbCgpKTtcbiAgICAgICAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHRoaXMua2lsbCgpKTtcbiAgICAgICAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHRoaXMua2lsbCgpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuXG5jb25zdCBCQVNFX1BBVEggPSBwcm9jZXNzLmVudi5aRU5JVEhfQkFTRV9QQVRIIVxuY29uc3QgU1RPUkFHRV9QQVRIID0gcHJvY2Vzcy5lbnYuWkVOSVRIX1NUT1JBR0VfUEFUSCB8fCBwYXRoLmpvaW4oQkFTRV9QQVRIIHx8ICcnLCAnc3RvcmFnZScpXG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlUGF0aCguLi5hcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgaWYgKCFCQVNFX1BBVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdaRU5JVEhfQkFTRV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQnKVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoQkFTRV9QQVRILCAuLi5hcmdzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RvcmFnZVBhdGgoLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUoU1RPUkFHRV9QQVRILCAuLi5hcmdzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVUb0Jhc2VQYXRoKC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBpZiAoIUJBU0VfUEFUSCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pFTklUSF9CQVNFX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aC5yZXNvbHZlKEJBU0VfUEFUSCwgLi4uYXJncykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0bXBQYXRoKC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYmFzZVBhdGgoJ3RtcCcsIC4uLmFyZ3MpXG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgYmFzZVBhdGggfSBmcm9tICcjc2VydmVyL3V0aWxzL2Jhc2VQYXRoLnRzJ1xuaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCdcbmltcG9ydCBsb2dnZXIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2xvZ2dlci50cydcbmltcG9ydCB0eXBlIExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ0ZTU2VydmljZU9wdGlvbnMge1xuICAgIGRpcmVjdG9yeT86IHN0cmluZ1xuICAgIGZvcm1hdD86ICdqc29uJyB8ICd5bWwnXG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdGU1NlcnZpY2UgZXh0ZW5kcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcbiAgICBwdWJsaWMgZm9ybWF0OiAnanNvbicgfCAneW1sJyA9ICdqc29uJ1xuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQ29uZmlnRlNTZXJ2aWNlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gZmFsc2VcbiAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBvcHRpb25zLmRpcmVjdG9yeSA/PyBiYXNlUGF0aCgnY29uZmlnJylcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBsb2dnZXIuY2hpbGQoeyBsYWJlbDogJ2NvbmZpZycgfSlcbiAgICAgICAgdGhpcy5mb3JtYXQgPSBvcHRpb25zLmZvcm1hdCA/PyAnanNvbidcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3NlcnZpY2UgaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGUoZW50cnk6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZm9ybWF0ID09PSAneW1sJyA/ICd5bWwnIDogJ2pzb24nXG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBgJHtlbnRyeX0uJHtleHR9YClcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZm9ybWF0ID09PSAneW1sJyA/IHlhbWwuZHVtcChkYXRhKSA6IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDQpXG5cbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVuYW1lLCBjb250ZW50LCAndXRmLTgnKVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN5bmMoZW50cnk6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZm9ybWF0ID09PSAneW1sJyA/ICd5bWwnIDogJ2pzb24nXG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBgJHtlbnRyeX0uJHtleHR9YClcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZm9ybWF0ID09PSAneW1sJyA/IHlhbWwuZHVtcChkYXRhKSA6IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDQpXG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlbmFtZSwgY29udGVudCwgJ3V0Zi04JylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpXG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgY29uZmlnIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgY3JlYXRpbmc6ICR7dGhpcy5kaXJlY3Rvcnl9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMuZGlyZWN0b3J5KVxuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShmaWxlbmFtZSlcblxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSAnanNvbicgJiYgZXh0ICE9PSAnLmpzb24nKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSAneW1sJyAmJiBleHQgIT09ICcueW1sJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBmaWxlbmFtZSlcblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IGF3YWl0IHRyeUNhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpXG5cbiAgICAgICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGVuYW1lKSA9PT0gJy55bWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB5YW1sLmxvYWQodGV4dClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYGZhaWxlZCB0byBsb2FkIGNvbmZpZyBmaWxlICR7ZmlsZW5hbWV9YCwgZXJyb3IpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3Qga2V5ID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSlcblxuICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwganNvbiwgJ2ZpbGVzeXN0ZW0nKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBsb2FkZWQgY29uZmlnIGZpbGU6ICR7ZmlsZW5hbWV9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY29uZmlnIGxvYWRlZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VLZXkoZnVsbEtleTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IFtlbnRyeSwgLi4ucmVzdF0gPSBmdWxsS2V5LnNwbGl0KCcuJylcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW50cnksXG4gICAgICAgICAgICBrZXk6IHJlc3Quam9pbignLicpIFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldChmdWxsS2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHNvdXJjZSA9ICdmaWxlc3lzdGVtJyk6IHZvaWQge1xuICAgICAgICBzdXBlci5zZXQoZnVsbEtleSwgdmFsdWUsIHNvdXJjZSlcblxuICAgICAgICBpZiAoc291cmNlICE9PSAnZmlsZXN5c3RlbScpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBlbnRyeSwga2V5IH0gPSB0aGlzLnBhcnNlS2V5KGZ1bGxLZXkpXG4gICAgICAgIFxuICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5nZXQoZW50cnkpXG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ICYmIHZhbHVlcykge1xuICAgICAgICAgICAgc2V0KHZhbHVlcywga2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVTeW5jKGVudHJ5LCB2YWx1ZXMpXG4gICAgICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChmdWxsS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBlbnRyeSwga2V5IH0gPSB0aGlzLnBhcnNlS2V5KGZ1bGxLZXkpXG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZm9ybWF0ID09PSAneW1sJyA/ICd5bWwnIDogJ2pzb24nXG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBgJHtlbnRyeX0uJHtleHR9YClcblxuICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlbmFtZSlcblxuICAgICAgICAgICAgc3VwZXIudW5zZXQoZnVsbEtleSlcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0KGVudHJ5KVxuXG4gICAgICAgIHNldCh2YWx1ZXMsIGtleSwgdW5kZWZpbmVkKVxuXG4gICAgICAgIHRoaXMud3JpdGVTeW5jKGVudHJ5LCB2YWx1ZXMpXG5cbiAgICAgICAgc3VwZXIudW5zZXQoZnVsbEtleSlcbiAgICB9XG59XG5cbiIsImltcG9ydCBtcyBmcm9tICdtcydcbmltcG9ydCB0eXBlIERyaXZlRW50cnkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Ecml2ZUVudHJ5RW50aXR5LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVybE9wdGlvbnMge1xuICAgIGV4cGlyZXM/OiBtcy5TdHJpbmdWYWx1ZTsgLy8gbXMgZm9ybWF0LCBlLmcuICcxaCcsICczMG0nLCAnMTVzJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZFVybE9wdGlvbnMge1xuICAgIGV4cGlyZXM/OiBtcy5TdHJpbmdWYWx1ZTsgLy8gbXMgZm9ybWF0LCBlLmcuICcxaCcsICczMG0nLCAnMTVzJ1xuICAgIG1pbWVfdHlwZXM/OiBzdHJpbmdbXTtcbiAgICBtYXhfc2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVCYXNlR2F0ZXdheSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQaWNrPERyaXZlQmFzZUdhdGV3YXksICdpZCcgfCAnbmFtZScgfCAnZGVzY3JpcHRpb24nIHwgJ2NvbmZpZyc+KSB7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkXG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZVxuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvblxuICAgICAgICB0aGlzLmNvbmZpZyA9IGRhdGEuY29uZmlnXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoZm9sZGVyPzogc3RyaW5nKTogUHJvbWlzZTxEcml2ZUVudHJ5W10+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZvbGRlciB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICAgIHB1YmxpYyBmaW5kKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPERyaXZlRW50cnk+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZpbGVuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhpc3RzKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZpbGVuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZChmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRTdHJlYW0oZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8Tm9kZUpTLlJlYWRhYmxlU3RyZWFtPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGZpbGVuYW1lOiBzdHJpbmcsIGRhdGE6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IFxuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICBkYXRhIFxuICAgICAgICB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgc3RyZWFtIFxuICAgICAgICB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHVybChmaWxlbmFtZTogc3RyaW5nLCBvcHRpb25zPzogVXJsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgb3B0aW9ucyBcbiAgICAgICAgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWRVcmwoZmlsZW5hbWU6IHN0cmluZywgb3B0aW9ucz86IFVwbG9hZFVybE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgXG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnMgXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgXG59XG4iLCJpbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSdcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IG1zIGZyb20gJ21zJ1xuaW1wb3J0IHtcbiAgICBTM0NsaWVudCxcbiAgICBMaXN0T2JqZWN0c1YyQ29tbWFuZCxcbiAgICBHZXRPYmplY3RDb21tYW5kLFxuICAgIFB1dE9iamVjdENvbW1hbmQsXG4gICAgRGVsZXRlT2JqZWN0Q29tbWFuZCxcbiAgICBEZWxldGVPYmplY3RzQ29tbWFuZCxcbiAgICBIZWFkT2JqZWN0Q29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJ1xuaW1wb3J0IHsgZ2V0U2lnbmVkVXJsIH0gZnJvbSAnQGF3cy1zZGsvczMtcmVxdWVzdC1wcmVzaWduZXInXG5pbXBvcnQgeyBVcGxvYWQgfSBmcm9tICdAYXdzLXNkay9saWItc3RvcmFnZSdcbmltcG9ydCB0eXBlIHsgSW5mZXJPdXRwdXQgfSBmcm9tICd2YWxpYm90J1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZSdcbmltcG9ydCBEcml2ZUVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0RyaXZlRW50cnlFbnRpdHkudHMnXG5pbXBvcnQgQmFzZURyaXZlIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVCYXNlR2F0ZXdheS50cydcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnI3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5jb25zdCBzY2hlbWEgPSB2YWxpZGF0b3IuY3JlYXRlKCh2KSA9PiB2Lm9iamVjdCh7XG4gICAgYnVja2V0OiB2LnBpcGUodi5zdHJpbmcoKSwgdi5taW5MZW5ndGgoMSkpLFxuICAgIHJlZ2lvbjogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBhY2Nlc3NLZXlJZDogdi5waXBlKHYuc3RyaW5nKCksIHYubWluTGVuZ3RoKDEpKSxcbiAgICBzZWNyZXRBY2Nlc3NLZXk6IHYucGlwZSh2LnN0cmluZygpLCB2Lm1pbkxlbmd0aCgxKSksXG4gICAgc2Vzc2lvblRva2VuOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIGVuZHBvaW50OiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIHByZWZpeDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbn0pKVxuXG5leHBvcnQgdHlwZSBTM0RyaXZlQ29uZmlnID0gSW5mZXJPdXRwdXQ8dHlwZW9mIHNjaGVtYT5cblxuZnVuY3Rpb24gc3RyZWFtVG9VaW50OEFycmF5KHN0cmVhbTogYW55KTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgaWYgKCFzdHJlYW0gfHwgdHlwZW9mIHN0cmVhbSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHN0cmVhbS5vbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdXG4gICAgICAgIHN0cmVhbS5vbignZGF0YScsIChjaHVuazogQnVmZmVyKSA9PiBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpKVxuICAgICAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmNvbmNhdChjaHVua3MpKSkpXG4gICAgICAgIHN0cmVhbS5vbignZXJyb3InLCByZWplY3QpXG4gICAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVTMyBleHRlbmRzIEJhc2VEcml2ZSB7XG4gICAgcHJpdmF0ZSBzY2hlbWEgPSBzY2hlbWFcblxuICAgIHByaXZhdGUgX2NsaWVudD86IFMzQ2xpZW50XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQaWNrPEJhc2VEcml2ZSwgJ2lkJyB8ICduYW1lJyB8ICdkZXNjcmlwdGlvbicgfCAnY29uZmlnJz4pIHtcbiAgICAgICAgc3VwZXIoZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQodGhpcy5jb25maWcsIHRoaXMuc2NoZW1hKVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tWYWxpZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbigkdCgnSW52YWxpZCBkcml2ZSBjb25maWd1cmF0aW9uJykpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGJ1Y2tldCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKHRoaXMuY29uZmlnIGFzIFMzRHJpdmVDb25maWcpLmJ1Y2tldFxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgcHJlZml4KCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWc/LnByZWZpeCkgcmV0dXJuICcnXG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZz8ucHJlZml4LmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcmVmaXggKyAnLydcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcmVmaXhcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEtleShmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY2xlYW5GaWxlbmFtZSA9IGZpbGVuYW1lLnN0YXJ0c1dpdGgoJy8nKSA/IGZpbGVuYW1lLnNsaWNlKDEpIDogZmlsZW5hbWVcbiAgICAgICAgaWYgKCF0aGlzLnByZWZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsZWFuRmlsZW5hbWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGVhblByZWZpeCA9IHRoaXMucHJlZml4LmVuZHNXaXRoKCcvJykgPyB0aGlzLnByZWZpeCA6IGAke3RoaXMucHJlZml4fS9gXG4gICAgICAgIHJldHVybiBgJHtjbGVhblByZWZpeH0ke2NsZWFuRmlsZW5hbWV9YFxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgY2xpZW50KCk6IFMzQ2xpZW50IHtcbiAgICAgICAgaWYgKHRoaXMuX2NsaWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcgYXMgUzNEcml2ZUNvbmZpZ1xuXG4gICAgICAgIHRoaXMuX2NsaWVudCA9IG5ldyBTM0NsaWVudCh7XG4gICAgICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICAgICAgICBlbmRwb2ludDogY29uZmlnLmVuZHBvaW50LFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NLZXlJZDogY29uZmlnLmFjY2Vzc0tleUlkLFxuICAgICAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleTogY29uZmlnLnNlY3JldEFjY2Vzc0tleSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uVG9rZW46IGNvbmZpZy5zZXNzaW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudFxuICAgIH1cblxuICAgIHB1YmxpYyBleGlzdHM6IEJhc2VEcml2ZVsnZXhpc3RzJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZChuZXcgSGVhZE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIEtleVxuICAgICAgICB9KSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Q6IEJhc2VEcml2ZVsnbGlzdCddID0gYXN5bmMgKGZvbGRlcikgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGxldCBQcmVmaXggPSBmb2xkZXIgPyB0aGlzLmdldEtleShmb2xkZXIpIDogdGhpcy5wcmVmaXggfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKFByZWZpeCAmJiAhUHJlZml4LmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIFByZWZpeCArPSAnLydcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIFByZWZpeCxcbiAgICAgICAgICAgIERlbGltaXRlcjogJy8nLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKGNvbW1hbmQpXG5cbiAgICAgICAgY29uc3QgZW50cmllczogRHJpdmVFbnRpdHlbXSA9IFtdXG5cbiAgICAgICAgY29uc3QgY29tbW9uUHJlZml4ZXMgPSByZXNwLkNvbW1vblByZWZpeGVzIHx8IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBwcmVmaXggb2YgY29tbW9uUHJlZml4ZXMpIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBwcmVmaXguUHJlZml4IHx8ICcnXG5cbiAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKHRoaXMucHJlZml4LCAnJylcblxuICAgICAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgICAga2V5ID0ga2V5LnNsaWNlKDAsIC0xKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBEcml2ZUVudGl0eSh7XG4gICAgICAgICAgICAgICAgbmFtZToga2V5LnNwbGl0KCcvJykucG9wKCkgfHwga2V5LFxuICAgICAgICAgICAgICAgIHBhdGg6ICcvJyArIGtleSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGlyZWN0b3J5JyxcbiAgICAgICAgICAgICAgICBtZXRhczoge1xuICAgICAgICAgICAgICAgICAgICBzaXplOiAwLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3J5J1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmVzcC5Db250ZW50cyB8fCBbXVxuXG4gICAgICAgIGZvciAoY29uc3Qgb2JqIG9mIGNvbnRlbnRzKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gb2JqLktleSB8fCAnJ1xuXG4gICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSh0aGlzLnByZWZpeCwgJycpXG5cbiAgICAgICAgICAgIGlmIChrZXkuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IERyaXZlRW50aXR5KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXkuc3BsaXQoJy8nKS5wb3AoKSB8fCBrZXksXG4gICAgICAgICAgICAgICAgcGF0aDogJy8nICsga2V5LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgICAgICAgICAgICBtZXRhczoge1xuICAgICAgICAgICAgICAgICAgICBzaXplOiBvYmouU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IG1pbWUuZ2V0VHlwZShrZXkpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZDogQmFzZURyaXZlWydmaW5kJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IGZpbGVuYW1lLnN0YXJ0c1dpdGgoJy8nKSA/IGZpbGVuYW1lIDogJy8nICsgZmlsZW5hbWVcbiAgICAgICAgY29uc3QgZm9sZGVyID0gZGlybmFtZShmaWxlcGF0aClcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5saXN0KGZvbGRlcilcblxuICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZmluZChlID0+IGUucGF0aCA9PT0gZmlsZXBhdGgpXG5cbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIFwiJHtmaWxlcGF0aH1cIiBub3QgZm91bmRgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1rZGlyKF9maWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgLy8gUzMgaXMgb2JqZWN0IHN0b3JhZ2U7IGRpcmVjdG9yaWVzIGFyZSBpbXBsaWNpdC4gQ3JlYXRlIGEgemVyby1ieXRlIG9iamVjdCB3aXRoIHRyYWlsaW5nIHNsYXNoIHRvIGVtdWxhdGUgZGlyZWN0b3J5IGlmIG5lZWRlZC5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQ6IEJhc2VEcml2ZVsncmVhZCddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IEdldE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIEtleVxuICAgICAgICB9KSlcblxuICAgICAgICBjb25zdCBib2R5ID0gcmVzcC5Cb2R5IGFzIFJlYWRhYmxlXG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbVRvVWludDhBcnJheShib2R5KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCBjb21tYW5kID0gbmV3IEdldE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIEtleVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKGNvbW1hbmQpXG5cbiAgICAgICAgY29uc3QgYm9keSA9IHJlc3AuQm9keSBhcyBhbnlcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJvZHkpXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlOiBCYXNlRHJpdmVbJ3dyaXRlJ10gPSBhc3luYyAoZmlsZW5hbWUsIGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBQdXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBLZXksXG4gICAgICAgICAgICBCb2R5OiBCdWZmZXIuZnJvbShkYXRhKVxuICAgICAgICB9KSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGVTdHJlYW0oZmlsZW5hbWU6IHN0cmluZywgc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCB1cGxvYWQgPSBuZXcgVXBsb2FkKHtcbiAgICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgICAgIEtleSxcbiAgICAgICAgICAgICAgICBCb2R5OiBSZWFkYWJsZS5mcm9tKHN0cmVhbSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHVwbG9hZC5kb25lKClcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlOiBCYXNlRHJpdmVbJ2RlbGV0ZSddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmZpbmQoZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IG5ldyBEZWxldGVPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgICAgIEtleVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZChjb21tYW5kKVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgbGlzdFJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIFByZWZpeDogS2V5XG4gICAgICAgIH0pKVxuXG4gICAgICAgIGNvbnN0IHRvRGVsZXRlID0gKGxpc3RSZXNwb25zZS5Db250ZW50cyB8fCBbXSkubWFwKGMgPT4gKHsgS2V5OiBjLktleSB9KSlcblxuICAgICAgICBpZiAodG9EZWxldGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IERlbGV0ZU9iamVjdHNDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBEZWxldGU6IHsgT2JqZWN0czogdG9EZWxldGUgfVxuICAgICAgICB9KSlcblxuICAgICAgICBpZiAobGlzdFJlc3BvbnNlLklzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShmaWxlbmFtZSkgLy8gUmVjdXJzaXZlbHkgZGVsZXRlIGlmIHRoZXJlIGFyZSBtb3JlIG9iamVjdHMgdG8gZGVsZXRlZFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuXG5cbiAgICB9XG5cbiAgICBwdWJsaWMgdXJsOiBCYXNlRHJpdmVbJ3VybCddID0gYXN5bmMgKGZpbGVuYW1lLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgY29uc3QgZXhwaXJlc01zID0gbXMob3B0aW9ucz8uZXhwaXJlcyB8fCAnMzBtJykgfHwgMzAgKiA2MCAqIDEwMDBcbiAgICAgICAgY29uc3QgZXhwaXJlc1NlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGV4cGlyZXNNcyAvIDEwMDApKVxuXG4gICAgICAgIHJldHVybiBnZXRTaWduZWRVcmwodGhpcy5jbGllbnQsIG5ldyBHZXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBLZXlcbiAgICAgICAgfSksIHsgZXhwaXJlc0luOiBleHBpcmVzU2Vjb25kcyB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWRVcmw6IEJhc2VEcml2ZVsndXBsb2FkVXJsJ10gPSBhc3luYyAoZmlsZW5hbWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCBleHBpcmVzTXMgPSBtcyhvcHRpb25zPy5leHBpcmVzIHx8ICczMG0nKSB8fCAzMCAqIDYwICogMTAwMFxuICAgICAgICBjb25zdCBleHBpcmVzU2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZXhwaXJlc01zIC8gMTAwMCkpXG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IG5ldyBQdXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBLZXksXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGdldFNpZ25lZFVybCh0aGlzLmNsaWVudCwgY29tbWFuZCwgeyBleHBpcmVzSW46IGV4cGlyZXNTZWNvbmRzIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IFMzRHJpdmUgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZVMzR2F0ZXdheS50cydcbmltcG9ydCB0eXBlIHsgUzNEcml2ZUNvbmZpZyB9IGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVTM0dhdGV3YXkudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmludGVyZmFjZSBJbml0aU9wdGlvbnMgZXh0ZW5kcyBPbWl0PFMzRHJpdmVDb25maWcsICduYW1lJyB8ICdkZXNjcmlwdGlvbic+IHtcbiAgICBwcmVmaXg/OiBzdHJpbmdcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1MzU2VydmljZSBleHRlbmRzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBwcmVmaXggPSAnJ1xuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuICAgIHB1YmxpYyBkcml2ZTogUzNEcml2ZVxuICAgIHB1YmxpYyBidWNrZXQ6IHN0cmluZ1xuICAgIHB1YmxpYyByZWdpb246IHN0cmluZ1xuICAgIHB1YmxpYyBlbmRwb2ludD86IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSW5pdGlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKClcblxuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyBmYWxzZVxuICAgICAgICB0aGlzLnByZWZpeCA9IG9wdGlvbnMucHJlZml4ID8/ICcnXG4gICAgICAgIHRoaXMuYnVja2V0ID0gb3B0aW9ucy5idWNrZXRcbiAgICAgICAgdGhpcy5yZWdpb24gPSBvcHRpb25zLnJlZ2lvbiB8fCAnJ1xuICAgICAgICB0aGlzLmVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludFxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcblxuICAgICAgICB0aGlzLmRyaXZlID0gbmV3IFMzRHJpdmUoe1xuICAgICAgICAgICAgaWQ6ICdjb25maWctczMnLFxuICAgICAgICAgICAgbmFtZTogJ2NvbmZpZy1zMycsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBidWNrZXQ6IG9wdGlvbnMuYnVja2V0LFxuICAgICAgICAgICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IG9wdGlvbnMuYWNjZXNzS2V5SWQsXG4gICAgICAgICAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiBvcHRpb25zLnNlY3JldEFjY2Vzc0tleSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uVG9rZW46IG9wdGlvbnMuc2Vzc2lvblRva2VuLFxuICAgICAgICAgICAgICAgIGVuZHBvaW50OiBvcHRpb25zLmVuZHBvaW50LFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Zygnc2VydmljZSBpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VLZXkoZnVsbEtleTogc3RyaW5nKTogeyBmaWxlbmFtZTogc3RyaW5nOyBrZXk6IHN0cmluZyB9IHtcbiAgICAgICAgY29uc3QgW2ZpbGVuYW1lLCAuLi5yZXN0XSA9IGZ1bGxLZXkuc3BsaXQoJy4nKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIGtleTogcmVzdC5qb2luKCcuJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICB0aGlzLmNsZWFyKClcblxuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLnByZWZpeC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpXG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZHJpdmUubGlzdChwcmVmaXggfHwgdW5kZWZpbmVkKVxuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBlbnRyeS5uYW1lXG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcHJlZml4ID8gYCR7cHJlZml4fS8ke2ZpbGVuYW1lfWAgOiBmaWxlbmFtZVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIGRhdGFdID0gYXdhaXQgdHJ5Q2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHRoaXMuZHJpdmUucmVhZChmaWxlcGF0aClcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBCdWZmZXIuZnJvbShidWYpLnRvU3RyaW5nKCd1dGYtOCcpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYGZhaWxlZCB0byBsb2FkIGNvbmZpZyBmaWxlICR7ZmlsZW5hbWV9YCwgZXJyb3IpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qga2V5ID0gZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCAnJylcblxuICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwgZGF0YSlcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgbG9hZGVkIGNvbmZpZyBmaWxlOiAke2ZpbGVuYW1lfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2NvbmZpZyBsb2FkZWQgaW4gZGVidWcgbW9kZScpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGZ1bGxLZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ3MzJyk6IHZvaWQge1xuICAgICAgICBzdXBlci5zZXQoZnVsbEtleSwgdmFsdWUsIHNvdXJjZSlcblxuICAgICAgICBpZiAoc291cmNlICE9PSAnczMnKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZmlsZW5hbWUsIGtleSB9ID0gdGhpcy5wYXJzZUtleShmdWxsS2V5KVxuXG4gICAgICAgIGxldCB2YWx1ZXMgPSB0aGlzLmdldChmaWxlbmFtZSlcblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgJiYgdmFsdWVzKSB7XG4gICAgICAgICAgICBzZXQodmFsdWVzLCBrZXksIHZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW5QcmVmaXggPSB0aGlzLnByZWZpeC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpXG5cbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBjbGVhblByZWZpeCA/IGAke2NsZWFuUHJlZml4fS8ke2ZpbGVuYW1lfS5qc29uYCA6IGAke2ZpbGVuYW1lfS5qc29uYFxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZXMsIG51bGwsIDQpKVxuXG4gICAgICAgIHRoaXMuZHJpdmUud3JpdGUoZmlsZVBhdGgsIGJvZHkgYXMgdW5rbm93biBhcyBVaW50OEFycmF5KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2ZhaWxlZCB0byB3cml0ZSBjb25maWcgdG8gczMnLCBlcnIpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHVuc2V0KGZ1bGxLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGVhblByZWZpeCA9IHRoaXMucHJlZml4LnJlcGxhY2UoL15cXC98XFwvJC9nLCAnJylcblxuICAgICAgICBpZiAoIWZ1bGxLZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBjbGVhblByZWZpeCA/IGAke2NsZWFuUHJlZml4fS8ke2Z1bGxLZXl9Lmpzb25gIDogYCR7ZnVsbEtleX0uanNvbmBcblxuICAgICAgICAgICAgdGhpcy5kcml2ZS5kZWxldGUoZmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdmYWlsZWQgdG8gZGVsZXRlIGNvbmZpZyBmcm9tIHMzJywgZXJyKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZmlsZW5hbWUsIGtleSB9ID0gdGhpcy5wYXJzZUtleShmdWxsS2V5KVxuXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0KGZpbGVuYW1lKVxuXG4gICAgICAgIHNldCh2YWx1ZXMsIGtleSwgdW5kZWZpbmVkKVxuXG5cbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBjbGVhblByZWZpeCA/IGAke2NsZWFuUHJlZml4fS8ke2ZpbGVuYW1lfS5qc29uYCA6IGAke2ZpbGVuYW1lfS5qc29uYFxuXG4gICAgICAgIHRoaXMuZHJpdmUud3JpdGUoZmlsZVBhdGgsIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlcywgbnVsbCwgNCkpIGFzIHVua25vd24gYXMgVWludDhBcnJheSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdmYWlsZWQgdG8gd3JpdGUgY29uZmlnIHRvIHMzJywgZXJyKVxuICAgICAgICB9KVxuXG4gICAgICAgIHN1cGVyLnVuc2V0KGZ1bGxLZXkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbmZpZ0ZTU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0NvbmZpZ0ZTU2VydmljZS50cydcbmltcG9ydCBDb25maWdTM1NlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Db25maWdTM1NlcnZpY2UudHMnXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uLCB0eXBlIExvZ2dlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvZmxhdHRlbi50cydcbmltcG9ydCB0eXBlIEVudlNlcnZpY2UgZnJvbSAnLi9FbnZTZXJ2aWNlLnRzJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCdcblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdNYW5hZ2VyT3B0aW9ucyB7XG4gICAgZW52OiBFbnZTZXJ2aWNlXG4gICAgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgc2lsZW50PzogYm9vbGVhblxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdNYW5hZ2VyU2VydmljZSB7XG4gICAgcHVibGljIGVudjogRW52U2VydmljZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgc2lsZW50OiBib29sZWFuXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb25maWdNYW5hZ2VyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmVudiA9IG9wdGlvbnMuZW52XG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXJcbiAgICAgICAgdGhpcy5zaWxlbnQgPSBvcHRpb25zLnNpbGVudCA/PyBmYWxzZVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9wdGlvbnM6IENvbmZpZ01hbmFnZXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgQ29uZmlnTWFuYWdlclNlcnZpY2Uob3B0aW9ucylcblxuICAgICAgICByZXR1cm4gc2VydmljZVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZFMzQ29uZmlnKCkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlID0gbmV3IENvbmZpZ1MzU2VydmljZSh7XG4gICAgICAgICAgICBidWNrZXQ6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19CVUNLRVQnKSEsXG4gICAgICAgICAgICByZWdpb246IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19SRUdJT04nKSEsXG4gICAgICAgICAgICBhY2Nlc3NLZXlJZDogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX1MzX0FDQ0VTU19LRVlfSUQnKSEsXG4gICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19TRUNSRVRfQUNDRVNTX0tFWScpISxcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfREVCVUcnKSxcbiAgICAgICAgICAgIGVuZHBvaW50OiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfUzNfRU5EUE9JTlQnKSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX1MzX1BSRUZJWCcpLFxuICAgICAgICAgICAgc2Vzc2lvblRva2VuOiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfUzNfU0VTU0lPTl9UT0tFTicpLFxuICAgICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBzZXJ2aWNlLmxvYWQoKVxuXG4gICAgICAgIGlmICghdGhpcy5zaWxlbnQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3VzaW5nIFMzIGNvbmZpZ3VyYXRpb24gc2VydmljZScsIHtcbiAgICAgICAgICAgICAgICBidWNrZXQ6IHNlcnZpY2UuYnVja2V0LFxuICAgICAgICAgICAgICAgIHJlZ2lvbjogc2VydmljZS5yZWdpb24sXG4gICAgICAgICAgICAgICAgcHJlZml4OiBzZXJ2aWNlLnByZWZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRGU0NvbmZpZygpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IG5ldyBDb25maWdGU1NlcnZpY2Uoe1xuICAgICAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRlNfUEFUSCcpLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19ERUJVRycpLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRlNfRk9STUFUJykhLFxuICAgICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBzZXJ2aWNlLmxvYWQoKVxuXG4gICAgICAgIGlmICghdGhpcy5zaWxlbnQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3VzaW5nIGZpbGVzeXN0ZW0gY29uZmlndXJhdGlvbiBzZXJ2aWNlJywgeyBwYXRoOiBzZXJ2aWNlLmRpcmVjdG9yeSB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENvbmZpZ0Zyb21FbnYoc2VydmljZTogQ29uZmlnU2VydmljZSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmbGF0dGVuKHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJRycpIHx8IHt9KSkpIHtcbiAgICAgICAgICAgIHNlcnZpY2Uuc2V0KGtleSwgdmFsdWUsICdlbnYnKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmxhdHRlbih0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfQVJHVU1FTlRTJykgfHwge30pKSkge1xuICAgICAgICAgICAgc2VydmljZS5zZXQoa2V5LCB2YWx1ZSwgJ2FyZ3VtZW50JylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkQ29uZmlnRnJvbUZpbGUoc2VydmljZTogQ29uZmlnU2VydmljZSwgZmlsZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgY29uZmlndXJhdGlvbiBmaWxlIG5vdCBmb3VuZDogJHtmaWxlfWApXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JylcbiAgICAgICAgbGV0IGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbFxuXG4gICAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCcueW1sJykgfHwgZmlsZS5lbmRzV2l0aCgnLnlhbWwnKSkge1xuICAgICAgICAgICAgZGF0YSA9IHlhbWwubG9hZCh0ZXh0KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uIGZpbGUgZm9ybWF0OiAke2ZpbGV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZsYXR0ZW4oZGF0YSkpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlLnNldChrZXksIHZhbHVlLCBmaWxlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRDb25maWdGcm9tRmlsZXMoc2VydmljZTogQ29uZmlnU2VydmljZSwgZmlsZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgdGhpcy5sb2FkQ29uZmlnRnJvbUZpbGUoc2VydmljZSwgZmlsZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCk6IFByb21pc2U8Q29uZmlnU2VydmljZT4ge1xuICAgICAgICBsZXQgc2VydmljZTogQ29uZmlnU2VydmljZSB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgaWYgKHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19EUklWRVInKSA9PT0gJ3MzJykge1xuICAgICAgICAgICAgc2VydmljZSA9IGF3YWl0IHRoaXMubG9hZFMzQ29uZmlnKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VydmljZSB8fCB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRFJJVkVSJykgPT09ICdmcycpIHtcbiAgICAgICAgICAgIHNlcnZpY2UgPSBhd2FpdCB0aGlzLmxvYWRGU0NvbmZpZygpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIHNlcnZpY2U6IE5vIHZhbGlkIGRyaXZlciBmb3VuZCcpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIHNlcnZpY2UnKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkQ29uZmlnRnJvbUZpbGVzKHNlcnZpY2UsIHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19GSUxFUycpKVxuXG4gICAgICAgIHRoaXMubG9hZENvbmZpZ0Zyb21FbnYoc2VydmljZSlcblxuICAgICAgICByZXR1cm4gc2VydmljZVxuICAgIH1cbn1cblxuIiwiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SW5pdCB9IGZyb20gJ3VuZGljaSdcbmltcG9ydCB7IGZldGNoLCBQcm94eUFnZW50IH0gZnJvbSAndW5kaWNpJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRG93bmxvYWRlZEZldGNoT3B0aW9ucyBleHRlbmRzIFJlcXVlc3RJbml0IHtcbiAgICBwcm94eT86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3dubG9hZFNlcnZpY2Uge1xuICAgIHB1YmxpYyBhc3luYyBmZXRjaCh1cmw6IHN0cmluZywgb3B0aW9ucz86IERvd25sb2FkZWRGZXRjaE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5wcm94eSkge1xuICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmRpc3BhdGNoZXIgID0gbmV3IFByb3h5QWdlbnQob3B0aW9ucy5wcm94eSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdEb3dubG9hZGluZyBmcm9tIFVSTDonLCB1cmwsICd3aXRoIG9wdGlvbnM6JywgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBmZXRjaCh1cmwsIGZldGNoT3B0aW9ucylcblxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdHJlYW0odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBEb3dubG9hZGVkRmV0Y2hPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaCh1cmwsIG9wdGlvbnMpXG4gICAgXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEJhc2VFeGNlcHRpb24oJ0ZhaWxlZCB0byBkb3dubG9hZCcsIDQwMClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgXG4gICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCBcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gYm9keScsIDQwMClcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xuICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RyZWFtOiByZXNwb25zZS5ib2R5IGFzIHVua25vd24gYXMgTm9kZUpTLlJlYWRhYmxlU3RyZWFtLFxuICAgICAgICAgICAgY29udGVudFR5cGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBDb25maWdTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGNvbmZpZyA9IGNvbnRhaW5lci5wcm94eTxDb25maWdTZXJ2aWNlPihDb25maWdTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsImltcG9ydCB7IEhvb2tzU3RhdGljIH0gZnJvbSAnI3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cydcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IHR5cGUgQ29uZmlnTW9kZWwgPSBSZXR1cm5UeXBlPFJldHVyblR5cGU8dHlwZW9mIE1vZGVsQ29uZmlnPj5cblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICAgIHJlYWRvbmx5PzogYm9vbGVhblxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNb2RlbENvbmZpZyhrZXk6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIENvbmZpZ01vZGVsTWl4aW5FeHRlbmQ8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9faXNDb25maWdNb2RlbCA9IHRydWVcblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemU8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgcm93OiBhbnkpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0aGlzKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcm93KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxpc3Q8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gY29uZmlnLmdldDxSZWNvcmQ8c3RyaW5nLCBhbnk+PihrZXkpIHx8IHt9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IFtdXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpZCwga10gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY29uc3RydWN0b3Iuc2VyaWFsaXplKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaywgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZCBcbiAgICAgICAgICAgICAgICAgICAgfSkpKVxuXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBIb29rc1N0YXRpYy5lbWl0KHRoaXMsICdhZnRlckxpc3QnLCBpdGVtcylcblxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcyBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueSBhcyBDb25maWdNb2RlbFxuXG4gICAgICAgICAgICAgICAgY29uc3QgYWxsID0gYXdhaXQgY29uc3RydWN0b3IubGlzdCgpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYWxsLmZpbmQoaSA9PiAoaSBhcyBhbnkpLmlkID09PSBpZClcblxuICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgSG9va3NTdGF0aWMuZW1pdCh0aGlzLCAnYWZ0ZXJGaW5kJywgaXRlbSlcblxuICAgICAgICAgICAgICAgIHJldHVybiAoaXRlbSB8fCBudWxsKSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kT3JGYWlsPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55IGFzIENvbmZpZ01vZGVsXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgY29uc3RydWN0b3IuZmluZChpZClcblxuICAgICAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VudGl0eSBpdGVtIG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGl0ZW06IFQgJiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdSZWFkb25seSBjb25maWcgbW9kZWwnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghaXRlbS5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VudGl0eSBpdGVtIHJlcXVpcmVzIGFuIGlkJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55IGFzIENvbmZpZ01vZGVsXG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBjb25maWcuZ2V0PFJlY29yZDxzdHJpbmcsIGFueT4+KGtleSkgfHwge31cblxuICAgICAgICAgICAgICAgIGlmIChtYXBbaXRlbS5pZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRpdHkgaXRlbSBhbHJlYWR5IGV4aXN0cycpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgSG9va3NTdGF0aWMuZW1pdCh0aGlzLCAnYmVmb3JlQ3JlYXRlJywgaXRlbSlcblxuICAgICAgICAgICAgICAgIG1hcFtpdGVtLmlkXSA9IHsgLi4uaXRlbSB9IGFzIGFueVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtpdGVtLmlkXS5pZFxuXG4gICAgICAgICAgICAgICAgYXdhaXQgY29uZmlnLnNldChrZXksIG1hcClcblxuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5maW5kT3JGYWlsKGl0ZW0uaWQpIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIHVwZGF0ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCBpZDogc3RyaW5nLCBkYXRhOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1JlYWRvbmx5IGNvbmZpZyBtb2RlbCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueSBhcyBDb25maWdNb2RlbFxuXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gY29uZmlnLmdldDxSZWNvcmQ8c3RyaW5nLCBhbnk+PihrZXkpIHx8IHt9XG5cbiAgICAgICAgICAgICAgICBpZiAoIW1hcFtpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRpdHkgaXRlbSBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IEhvb2tzU3RhdGljLmVtaXQodGhpcywgJ2JlZm9yZVVwZGF0ZScsIGRhdGEpXG5cbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hcFtpZF0sIGRhdGEpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBjb25maWcuc2V0KGtleSwgbWFwKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmZpbmRPckZhaWwoaWQpIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIHVwZGF0ZU9yQ3JlYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcsIGRhdGE6IFBhcnRpYWw8VD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55IGFzIENvbmZpZ01vZGVsXG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGNvbnN0cnVjdG9yLmZpbmQoaWQpXG5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLnVwZGF0ZShpZCwgZGF0YSBhcyBhbnkpIGFzIGFueVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5jcmVhdGUoeyBcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRhdGEgYXMgYW55KSxcbiAgICAgICAgICAgICAgICAgICAgaWQgXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzdHJveTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCBpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1JlYWRvbmx5IGNvbmZpZyBtb2RlbCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gY29uZmlnLmdldDxSZWNvcmQ8c3RyaW5nLCBhbnk+PihrZXkpIHx8IHt9XG5cbiAgICAgICAgICAgICAgICBpZiAoIW1hcFtpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRpdHkgaXRlbSBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlbGV0ZSBtYXBbaWRdXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBjb25maWcuc2V0KGtleSwgbWFwKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IE1vZGVsQ29uZmlnIGZyb20gJyNzZXJ2ZXIvbWl4aW5zL01vZGVsQ29uZmlnTWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvRHJpdmVDb25maWdFbnRpdHkudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb25maWcudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlQ29uZmlnIGV4dGVuZHMgY29tcG9zZVdpdGgoXG4gICAgQmFzZSxcbiAgICBNb2RlbENvbmZpZygnZHJpdmUuZGlza3MnKVxuKSB7XG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemU8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgcm93OiBhbnkpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgdGhpcygpIGFzIERyaXZlQ29uZmlnXG5cbiAgICAgICAgaW5zdGFuY2UuaWQgPSByb3cuaWRcbiAgICAgICAgaW5zdGFuY2UubmFtZSA9IHJvdy5uYW1lIHx8IHJvdy5pZFxuICAgICAgICBpbnN0YW5jZS50eXBlID0gcm93LnR5cGVcbiAgICAgICAgaW5zdGFuY2UuY29uZmlnID0gcm93LmNvbmZpZyB8fCB7fVxuICAgICAgICBpbnN0YW5jZS5pc19kZWZhdWx0ID0gY29uZmlnLmdldCgnZHJpdmUuZGVmYXVsdCcpID09PSByb3cuaWRcblxuICAgICAgICByZXR1cm4gaW5zdGFuY2UgYXMgYW55XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG5leHBvcnQgdHlwZSBFbnZTY2hlbWEgPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBlbnZTY2hlbWE+XG5cbmNvbnN0IGJvb2xlYW4gPSB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5saXRlcmFsKCd0cnVlJyksIHYubGl0ZXJhbCgnZmFsc2UnKSwgdi5saXRlcmFsKCcxJyksIHYubGl0ZXJhbCgnMCcpXSksXG4gICAgdi50cmFuc2Zvcm0oKHZhbHVlKSA9PiB2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSAnMScpLFxuICAgIHYuYm9vbGVhbigpXG4pXG5cbmNvbnN0IGtleVZhbHVlID0gdi5waXBlKHYuc3RyaW5nKCksIHYudHJhbnNmb3JtKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGVudHJpZXMgPSB2YWx1ZS5zcGxpdCgvWztcXG5dLylcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuZmlsdGVyKGwgPT4gbC5pbmNsdWRlcygnPScpKVxuICAgICAgICAubWFwKGwgPT4gbC50cmltKCkuc3BsaXQoJz0nKSlcblxuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBsZXQgcGFyc2VkVmFsdWU6IGFueSA9IHZhbHVlXG5cbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ2Jvb2w6JykpIHtcbiAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gdmFsdWUucmVwbGFjZSgnYm9vbDonLCAnJykudHJpbSgpID09PSAndHJ1ZSdcbiAgICAgICAgfVxuXG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgcGFyc2VkVmFsdWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufSkpXG5cbmNvbnN0IHN0cmluZ0FycmF5ID0gdi5waXBlKFxuICAgIHYuc3RyaW5nKCksXG4gICAgdi50cmFuc2Zvcm0oKHZhbHVlKSA9PiB2YWx1ZVxuICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAubWFwKHMgPT4gcy50cmltKCkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICApXG4pXG5cbmV4cG9ydCBjb25zdCBlbnZTY2hlbWEgPSB2Lmxvb3NlT2JqZWN0KHtcbiAgICBOT0RFX0VOVjogdi5vcHRpb25hbCh2LnVuaW9uKFt2LmxpdGVyYWwoJ2RldmVsb3BtZW50JyksIHYubGl0ZXJhbCgncHJvZHVjdGlvbicpLCB2LmxpdGVyYWwoJ3Rlc3QnKV0pLCAnZGV2ZWxvcG1lbnQnKSxcblxuICAgIFpFTklUSF9CQVNFX1BBVEg6IHYuc3RyaW5nKCksXG4gICAgWkVOSVRIX1NUT1JBR0VfUEFUSDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcblxuICAgIFpFTklUSF9BUFBfVVJMOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCksICdodHRwOi8vbG9jYWxob3N0OjMwMDAnKSxcbiAgICBaRU5JVEhfUE9SVDogdi5vcHRpb25hbCh2LnBpcGUodi5zdHJpbmcoKSwgdi50cmFuc2Zvcm0oKHZhbHVlKSA9PiBwYXJzZUludCh2YWx1ZSkpKSwgJzMwMDAnKSxcbiAgICBaRU5JVEhfSE9TVDogdi5vcHRpb25hbCh2LnN0cmluZygpLCAnMC4wLjAuMCcpLFxuXG4gICAgWkVOSVRIX0xPR19MRVZFTDogdi5vcHRpb25hbCh2LnBpY2tsaXN0KFsnZXJyb3InLCAnd2FybicsICdpbmZvJywgJ2RlYnVnJ10pLCAnaW5mbycpLFxuICAgIFpFTklUSF9MSUZFQ1lDTEVfREVCVUc6IHYub3B0aW9uYWwoYm9vbGVhbiwgJ2ZhbHNlJyksXG4gICAgWkVOSVRIX0NMSUVOVF9DT05GSUc6IHYub3B0aW9uYWwoa2V5VmFsdWUsICcnKSxcblxuICAgIFpFTklUSF9DT05GSUc6IHYub3B0aW9uYWwoa2V5VmFsdWUsICcnKSxcbiAgICBaRU5JVEhfQ09ORklHX0FSR1VNRU5UUzogdi5vcHRpb25hbChrZXlWYWx1ZSwgJycpLFxuICAgIFpFTklUSF9DT05GSUdfRklMRVM6IHYub3B0aW9uYWwoc3RyaW5nQXJyYXksICcnKSxcblxuICAgIFpFTklUSF9DT05GSUdfREVCVUc6IHYub3B0aW9uYWwoYm9vbGVhbiwgJ2ZhbHNlJyksXG4gICAgWkVOSVRIX0NPTkZJR19EUklWRVI6IHYub3B0aW9uYWwodi5waWNrbGlzdChbJ2ZzJywgJ3MzJ10pLCAnZnMnKSxcbiAgICBaRU5JVEhfQ09ORklHX0ZTX1BBVEg6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19GU19GT1JNQVQ6IHYub3B0aW9uYWwodi5waWNrbGlzdChbJ2pzb24nLCAneW1sJ10pLCAnanNvbicpLFxuXG4gICAgWkVOSVRIX0NPTkZJR19TM19CVUNLRVQ6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19SRUdJT046IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19BQ0NFU1NfS0VZX0lEOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIFpFTklUSF9DT05GSUdfUzNfU0VDUkVUX0FDQ0VTU19LRVk6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19TRVNTSU9OX1RPS0VOOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIFpFTklUSF9DT05GSUdfUzNfRU5EUE9JTlQ6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19QUkVGSVg6IHYub3B0aW9uYWwodi5zdHJpbmcoKSwgJycpLFxuXG4gICAgWkVOSVRIX1BMVUdJTlNfRElSUzogdi5vcHRpb25hbChzdHJpbmdBcnJheSksXG59KVxuXG4iLCJpbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudidcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuaW1wb3J0IHsgZW52U2NoZW1hIH0gZnJvbSAnI3NlcnZlci9zY2hlbWFzL2VudlNjaGVtYS50cydcbmltcG9ydCB0eXBlIHsgRW52U2NoZW1hIH0gZnJvbSAnI3NlcnZlci9zY2hlbWFzL2VudlNjaGVtYS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW52U2VydmljZSB7XG4gICAgcHJpdmF0ZSBlbnY6IEVudlNjaGVtYSB8IG51bGwgPSBudWxsXG4gICAgcHJpdmF0ZSBmaWxlczogc3RyaW5nW10gPSBbXVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRW52U2VydmljZSgpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkb3RFbnZDb25maWcob3B0aW9ucz86IGRvdGVudi5Eb3RlbnZDb25maWdPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBkb3RlbnYuY29uZmlnKG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpbGVzKGZpbGVzOiBzdHJpbmdbXSkge1xuICAgICAgICB0aGlzLmZpbGVzID0gZmlsZXNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsZShmaWxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoKSB7XG4gICAgICAgIEVudlNlcnZpY2UuZG90RW52Q29uZmlnKHtcbiAgICAgICAgICAgIHBhdGg6IHRoaXMuZmlsZXMsXG4gICAgICAgICAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICAgICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuZW52ID0gdi5wYXJzZShlbnZTY2hlbWEsIHByb2Nlc3MuZW52KVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcm9kdWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ05PREVfRU5WJykgPT09ICdwcm9kdWN0aW9uJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGV2ZWxvcG1lbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgnTk9ERV9FTlYnKSA9PT0gJ2RldmVsb3BtZW50J1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGVzdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdOT0RFX0VOVicpID09PSAndGVzdCdcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzPEsgZXh0ZW5kcyBrZXlvZiBFbnZTY2hlbWE+KGtleTogSyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuZW52KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBsb2FkZWQuIENhbGwgbG9hZCgpIGJlZm9yZSBhY2Nlc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLicpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lbnYhW2tleV0gIT09IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8SyBleHRlbmRzIGtleW9mIEVudlNjaGVtYT4oa2V5OiBLLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBFbnZTY2hlbWFbS10ge1xuICAgICAgICBpZiAoIXRoaXMuZW52KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBsb2FkZWQuIENhbGwgbG9hZCgpIGJlZm9yZSBhY2Nlc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLicpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lbnYhW2tleV0gIT09IHVuZGVmaW5lZCA/IHRoaXMuZW52IVtrZXldIDogZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldDxLIGV4dGVuZHMga2V5b2YgRW52U2NoZW1hPihrZXk6IEssIHZhbHVlOiBFbnZTY2hlbWFbS10pIHtcbiAgICAgICAgaWYgKCF0aGlzLmVudikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0Vudmlyb25tZW50IHZhcmlhYmxlcyBub3QgbG9hZGVkLiBDYWxsIGxvYWQoKSBiZWZvcmUgYWNjZXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcy4nKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnYhW2tleV0gPSB2YWx1ZVxuICAgIH1cbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xuaW1wb3J0IG1zIGZyb20gJ21zJ1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgRW52U2VydmljZSBmcm9tICcuL0VudlNlcnZpY2UnO1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJztcbmltcG9ydCB7IEJhc2VFeGNlcHRpb24gfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJztcblxuaW50ZXJmYWNlIFVSTE9wdGlvbnMge1xuICAgIGRhdGE/OiBhbnk7XG4gICAgZXhwaXJlcz86IG1zLlN0cmluZ1ZhbHVlO1xuICAgIGV4cGlyZUF0PzogbnVtYmVyIHwgRGF0ZTtcbn1cblxuaW50ZXJmYWNlIEVuY3J5cHRTZXJ2aWNlT3B0aW9ucyB7XG4gICAga2V5Pzogc3RyaW5nO1xuICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlO1xuICAgIGVudj86IEVudlNlcnZpY2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVuY3J5cHRTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdFbmNyeXB0U2VydmljZSdcblxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGVudjogRW52U2VydmljZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxnb3JpdGhtID0gJ2Flcy0yNTYtY2JjJ1xuICAgIHByaXZhdGUga2V5OiBCdWZmZXIgfCBudWxsID0gbnVsbFxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogRW5jcnlwdFNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW52ID0gb3B0aW9ucy5lbnYgfHwgbmV3IEVudlNlcnZpY2UoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgfHwgZmFsc2VcblxuICAgICAgICBpZiAob3B0aW9ucy5rZXkpIHtcbiAgICAgICAgICAgIHRoaXMua2V5ID0gY3J5cHRvLnNjcnlwdFN5bmMob3B0aW9ucy5rZXksICdzYWx0JywgMzIpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBFbmNyeXB0U2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmNyeXB0U2VydmljZShvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWdcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2RlYnVnIG1vZGUgZW5hYmxlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9nZ2VyKGxvZ2dlcjogTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFbnYoZW52OiBFbnZTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52XG4gICAgfVxuXG4gICAgcHVibGljIHNldEtleShrZXk6IHN0cmluZykge1xuICAgICAgICB0aGlzLmtleSA9IGNyeXB0by5zY3J5cHRTeW5jKGtleSwgJ3NhbHQnLCAzMilcbiAgICB9XG5cbiAgICBwdWJsaWMgZW5jcnlwdCh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmtleSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uIGtleSBub3Qgc2V0JylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl2ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KVxuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYodGhpcy5hbGdvcml0aG0sIHRoaXMua2V5LCBpdilcblxuICAgICAgICBsZXQgZW5jcnlwdGVkID0gY2lwaGVyLnVwZGF0ZSh0ZXh0LCAndXRmOCcsICdoZXgnKVxuICAgICAgICBlbmNyeXB0ZWQgKz0gY2lwaGVyLmZpbmFsKCdoZXgnKVxuXG4gICAgICAgIHJldHVybiBgJHtpdi50b1N0cmluZygnaGV4Jyl9OiR7ZW5jcnlwdGVkfWBcbiAgICB9XG5cblxuXG4gICAgcHVibGljIGRlY3J5cHQob3B0aW9uczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmtleSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uIGtleSBub3Qgc2V0JylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtpdiwgZW5jcnlwdGVkXSA9IG9wdGlvbnMuc3BsaXQoJzonKVxuXG4gICAgICAgIGNvbnN0IGl2QnVmZmVyID0gQnVmZmVyLmZyb20oaXYsICdoZXgnKVxuXG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYodGhpcy5hbGdvcml0aG0sIHRoaXMua2V5LCBpdkJ1ZmZlcilcblxuICAgICAgICBsZXQgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKGVuY3J5cHRlZCwgJ2hleCcsICd1dGY4JylcbiAgICAgICAgZGVjcnlwdGVkICs9IGRlY2lwaGVyLmZpbmFsKCd1dGY4JylcblxuICAgICAgICByZXR1cm4gZGVjcnlwdGVkXG4gICAgfVxuXG4gICAgcHVibGljIGVuY3J5cHRPYmplY3Qob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob2JqKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHQoanNvblN0cmluZylcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjcnlwdE9iamVjdDxUPihlbmNyeXB0ZWRTdHJpbmc6IHN0cmluZyk6IFQge1xuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gdGhpcy5kZWNyeXB0KGVuY3J5cHRlZFN0cmluZylcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyaW5nKSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIHVybChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBVUkxPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGV4cGlyZUF0ID0gb3B0aW9ucz8uZXhwaXJlQXRcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhwaXJlcykge1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlcyA9IG1zKG9wdGlvbnMuZXhwaXJlcykgYXMgbnVtYmVyXG5cbiAgICAgICAgICAgIGV4cGlyZUF0ID0gRGF0ZS5ub3coKSArIGV4cGlyZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXhwaXJlQXQpIHtcbiAgICAgICAgICAgIGV4cGlyZUF0ID0gRGF0ZS5ub3coKSArIG1zKCcxNSBtaW51dGVzJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHBpcmVBdCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGV4cGlyZUF0ID0gZXhwaXJlQXQuZ2V0VGltZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgZGF0YTogb3B0aW9ucz8uZGF0YSB8fCB7fSxcbiAgICAgICAgICAgIGV4cGlyZUF0LFxuICAgICAgICAgICAgZXhwaXJlQXRSZWFkYWJsZTogZm9ybWF0KG5ldyBEYXRlKGV4cGlyZUF0KSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5lbmNyeXB0KEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKVxuXG4gICAgICAgIGNvbnN0IGFwcFVybCA9IHRoaXMuZW52LmdldCgnWkVOSVRIX0FQUF9VUkwnKVxuXG4gICAgICAgIGlmICghYXBwVXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignQVBQX1VSTCBub3Qgc2V0IGluIGVudmlyb25tZW50IHZhcmlhYmxlcycpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgsIGFwcFVybClcblxuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgna2V5JywgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkpXG5cbiAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpXG4gICAgfVxuXG4gICAgcHVibGljIHZlcmlmeVVybChlbmNyeXB0ZWRLZXk6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZERhdGEgPSB0aGlzLmRlY3J5cHQoZGVjb2RlVVJJQ29tcG9uZW50KGVuY3J5cHRlZEtleSkpXG5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoZGVjcnlwdGVkRGF0YSlcblxuICAgICAgICBpZiAocGF5bG9hZC5leHBpcmVBdCAmJiBEYXRlLm5vdygpID4gcGF5bG9hZC5leHBpcmVBdCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZUV4Y2VwdGlvbignVVJMIGhhcyBleHBpcmVkJywgNDAzKVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7XG4gICAgICAgICAgICAgICAgZXhwaXJlQXQ6IHBheWxvYWQuZXhwaXJlQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlQXRSZWFkYWJsZTogcGF5bG9hZC5leHBpcmVBdFJlYWRhYmxlXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQuZGF0YVxuICAgIH1cbn1cbiIsImltcG9ydCBFbmNyeXB0U2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0VuY3J5cHRTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lci50cydcblxuY29uc3QgZW5jcnlwdCA9IGNvbnRhaW5lci5wcm94eTxFbmNyeXB0U2VydmljZT4oRW5jcnlwdFNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGVuY3J5cHRcblxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGgsIHsgam9pbiwgcmVsYXRpdmUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZSdcbmltcG9ydCBEcml2ZUVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0RyaXZlRW50cnlFbnRpdHkudHMnXG5pbXBvcnQgQmFzZURyaXZlIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVCYXNlR2F0ZXdheS50cydcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnI3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cydcbmltcG9ydCBlbmNyeXB0IGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9lbmNyeXB0LnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5pbXBvcnQgeyBiYXNlUGF0aCB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvYmFzZVBhdGgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJpdmVGU0NvbmZpZyB7XG4gICAgZGlyZWN0b3J5OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVGUyBleHRlbmRzIEJhc2VEcml2ZSB7XG4gICAgcHJpdmF0ZSBzY2hlbWEgPSB2YWxpZGF0b3IuY3JlYXRlKCh2KSA9PiB2Lm9iamVjdCh7XG4gICAgICAgIGRpcmVjdG9yeTogdi5waXBlKHYuc3RyaW5nKCksIHYubWluTGVuZ3RoKDEpKSxcbiAgICB9KSlcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBpY2s8QmFzZURyaXZlLCAnaWQnIHwgJ25hbWUnIHwgJ2Rlc2NyaXB0aW9uJyB8ICdjb25maWcnPikge1xuICAgICAgICBzdXBlcihkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3IuaXNWYWxpZCh0aGlzLmNvbmZpZywgdGhpcy5zY2hlbWEpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1ZhbGlkKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCR0KCdJbnZhbGlkIGRyaXZlIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnJvb3RQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJHQoJ0RyaXZlIHJvb3QgcGF0aCBkb2VzIG5vdCBleGlzdCcpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCByb290UGF0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYmFzZVBhdGgodGhpcy5jb25maWcuZGlyZWN0b3J5IGFzIHN0cmluZylcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhpc3RzOiBCYXNlRHJpdmVbJ2V4aXN0cyddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZnMucHJvbWlzZXMuYWNjZXNzKGpvaW4odGhpcy5yb290UGF0aCwgZmlsZW5hbWUpKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdDogQmFzZURyaXZlWydsaXN0J10gPSBhc3luYyAoZm9sZGVyKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IGZvbGRlciA/IGpvaW4odGhpcy5yb290UGF0aCwgZm9sZGVyKSA6IHRoaXMucm9vdFBhdGhcblxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmV4aXN0cyhyZWxhdGl2ZSh0aGlzLnJvb3RQYXRoLCBmaWxlcGF0aCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZmlsZXBhdGgpXG5cbiAgICAgICAgY29uc3QgZW50cmllczogRHJpdmVFbnRpdHlbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGZpbGVwYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKVxuXG4gICAgICAgICAgICBjb25zdCBtZXRhczogYW55ID0ge31cblxuICAgICAgICAgICAgaWYgKHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgbWV0YXMuc2l6ZSA9IHN0YXRzLnNpemVcbiAgICAgICAgICAgICAgICBtZXRhcy5taW1ldHlwZSA9IG1pbWUuZ2V0VHlwZShmaWxlbmFtZSkgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgRHJpdmVFbnRpdHkoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHBhdGg6ICcvJyArIHJlbGF0aXZlKHRoaXMucm9vdFBhdGgsIGZpbGVQYXRoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBzdGF0cy5pc0RpcmVjdG9yeSgpID8gJ2RpcmVjdG9yeScgOiAnZmlsZScsXG4gICAgICAgICAgICAgICAgbWV0YXNcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgfVxuXG4gICAgcHVibGljIGZpbmQ6IEJhc2VEcml2ZVsnZmluZCddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IGZpbGVuYW1lLnN0YXJ0c1dpdGgoJy8nKSA/IGZpbGVuYW1lIDogJy8nICsgZmlsZW5hbWVcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5saXN0KHBhdGguZGlybmFtZShmaWxlcGF0aCkpXG5cbiAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmZpbmQoZSA9PiBlLnBhdGggPT09IGZpbGVwYXRoKVxuXG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZmlsZXBhdGh9XCIgbm90IGZvdW5kYClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBta2RpcihmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmV4aXN0cyhwYXRoLmRpcm5hbWUoZmlsZW5hbWUpKSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihmaWxlcGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZDogQmFzZURyaXZlWydyZWFkJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlcilcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVhZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4odGhpcy5yb290UGF0aCwgZmlsZW5hbWUpXG4gICAgICAgIFxuICAgICAgICBjb25zdCBzdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdHJlYW0pXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlOiBCYXNlRHJpdmVbJ3dyaXRlJ10gPSBhc3luYyAoZmlsZW5hbWUsIGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5leGlzdHMocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdyaXRlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuZXhpc3RzKHBhdGguZGlybmFtZShmaWxlbmFtZSkpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlbmFtZSkpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlUGF0aClcblxuICAgICAgICAgICAgc3RyZWFtLnBpcGUod3JpdGVTdHJlYW0pXG5cbiAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdmaW5pc2gnLCByZXNvbHZlKVxuICAgICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGU6IEJhc2VEcml2ZVsnZGVsZXRlJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCBpc0RpcmVjdG9yeSA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpXG4gICAgICAgICAgICAudGhlbihzdGF0ID0+IHN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSlcblxuICAgICAgICBpZiAoaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtZGlyKGZpbGVQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsoZmlsZVBhdGgpXG4gICAgfVxuXG4gICAgcHVibGljIHVybDogQmFzZURyaXZlWyd1cmwnXSA9IGFzeW5jIChmaWxlbmFtZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSBmaWxlbmFtZS5zdGFydHNXaXRoKCcvJykgPyBmaWxlbmFtZSA6IGAvJHtmaWxlbmFtZX1gXG5cbiAgICAgICAgcmV0dXJuIGVuY3J5cHQudXJsKGAvYXBpL2RyaXZlcy8ke3RoaXMuaWR9L3N0cmVhbSR7ZmlsZXBhdGh9YCwge1xuICAgICAgICAgICAgZXhwaXJlczogb3B0aW9ucz8uZXhwaXJlcyB8fCAnMzBtJ1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWRVcmw6IEJhc2VEcml2ZVsndXBsb2FkVXJsJ10gPSBhc3luYyAoZmlsZW5hbWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gZmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpID8gZmlsZW5hbWUgOiBgLyR7ZmlsZW5hbWV9YFxuXG4gICAgICAgIHJldHVybiBlbmNyeXB0LnVybChgL2FwaS9kcml2ZXMvJHt0aGlzLmlkfS91cGxvYWQke2ZpbGVwYXRofWAsIHtcbiAgICAgICAgICAgIGV4cGlyZXM6IG9wdGlvbnM/LmV4cGlyZXMgfHwgJzMwbScsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgbWltZV90eXBlczogb3B0aW9ucz8ubWltZV90eXBlcyxcbiAgICAgICAgICAgICAgICBtYXhfc2l6ZTogb3B0aW9ucz8ubWF4X3NpemUsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IERyaXZlRW50cnkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Ecml2ZUVudHJ5RW50aXR5LnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5pbXBvcnQgdHlwZSB7IERyaXZlVXJsT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RyaXZlQ29udHJhY3QudHMnXG5pbXBvcnQgeyBzdG9yYWdlUGF0aCB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvYmFzZVBhdGgudHMnXG5pbXBvcnQgQmFzZURyaXZlIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVCYXNlR2F0ZXdheS50cydcbmltcG9ydCBEcml2ZVMzIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVTM0dhdGV3YXkudHMnXG5pbXBvcnQgRHJpdmVDb25maWcgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS50cydcbmltcG9ydCB0eXBlIExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvbG9nZ2VyLnRzJ1xuaW1wb3J0IERyaXZlRlMgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZUZTR2F0ZXdheS50cydcbmltcG9ydCBjb25maWcgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2NvbmZpZy50cydcblxuaW50ZXJmYWNlIFZhbGlkYXRlVXBsb2FkT3B0aW9ucyB7XG4gICAgbWltZV90eXBlczogc3RyaW5nXG4gICAgbWF4U2l6ZT86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0RyaXZlU2VydmljZSdcblxuXG4gICAgcHVibGljIGdhdGV3YXlzOiBNYXA8c3RyaW5nLCB0eXBlb2YgQmFzZURyaXZlPlxuICAgIHB1YmxpYyBkcml2ZXM6IE1hcDxzdHJpbmcsIEJhc2VEcml2ZT4gPSBuZXcgTWFwKClcbiAgICBwdWJsaWMgc2VsZWN0ZWQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgZGVmYXVsdERyaXZlPzogc3RyaW5nXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZCkgcmV0dXJuIHVuZGVmaW5lZCBcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGRyaXZlID0gdGhpcy5kcml2ZXMuZ2V0KHRoaXMuc2VsZWN0ZWQpXG4gICAgICAgIFxuICAgICAgICBpZiAoIWRyaXZlKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgcmV0dXJuIGRyaXZlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxEcml2ZVNlcnZpY2U+ID0ge30pIHsgICAgICAgIFxuICAgICAgICB0aGlzLnNlbGVjdGVkID0gZGF0YS5zZWxlY3RlZCB8fCB0aGlzLnNlbGVjdGVkXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IHRoaXMuZGVidWdcbiAgICAgICAgdGhpcy5kcml2ZXMgPSBkYXRhLmRyaXZlcyB8fCB0aGlzLmRyaXZlc1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IGxvZ2dlci5jaGlsZCh7IGxhYmVsOiAnZHJpdmUnIH0pXG4gICAgICAgIHRoaXMuZ2F0ZXdheXMgPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIEJhc2VEcml2ZT4oKVxuXG4gICAgICAgIHRoaXMuZ2F0ZXdheXMuc2V0KCdzMycsIERyaXZlUzMpXG4gICAgICAgIHRoaXMuZ2F0ZXdheXMuc2V0KCdmcycsIERyaXZlRlMpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3REcml2ZXMoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZHJpdmVzLnZhbHVlcygpKS5tYXAoZHJpdmUgPT4gKHtcbiAgICAgICAgICAgIC4uLmRyaXZlLFxuICAgICAgICAgICAgZGVmYXVsdDogZHJpdmUuaWQgPT09IHRoaXMuZGVmYXVsdERyaXZlXG4gICAgICAgIH0pKVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZ2V0KG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFuYW1lIHx8ICF0aGlzLmRyaXZlcy5oYXMobmFtZSB8fCAnJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdEcml2ZSBub3QgZm91bmQnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHJpdmUgPSB0aGlzLmRyaXZlcy5nZXQobmFtZSlcblxuICAgICAgICBpZiAoIWRyaXZlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRHJpdmUgbm90IGZvdW5kJylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkcml2ZVxuICAgIH1cblxuICAgIHB1YmxpYyB1c2UobmFtZT86IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuZHJpdmVzLmhhcyhuYW1lIHx8ICcnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0RyaXZlIG5vdCBmb3VuZCcpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBuZXcgRHJpdmVTZXJ2aWNlKHsgXG4gICAgICAgICAgICBzZWxlY3RlZDogbmFtZSxcbiAgICAgICAgICAgIGRyaXZlczogdGhpcy5kcml2ZXMsXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyBcbiAgICAgICAgfSlcbiAgICB9XG4gICAgXG5cbiAgICBwdWJsaWMgbGlzdChmb2xkZXI/OiBzdHJpbmcpOiBQcm9taXNlPERyaXZlRW50cnlbXT4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGRyaXZlIHNlbGVjdGVkJylcblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Lmxpc3QoZm9sZGVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPERyaXZlRW50cnk+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC5maW5kKGZpbGVuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBleGlzdHMoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGRyaXZlIHNlbGVjdGVkJylcblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmV4aXN0cyhmaWxlbmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZChmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQucmVhZChmaWxlbmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQucmVhZFN0cmVhbShmaWxlbmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVhZEFzVGV4dChmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucmVhZChmaWxlbmFtZSlcblxuICAgICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGZpbGVuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IFVpbnQ4QXJyYXkgfCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IHBheWxvYWRcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgJiYgIShwYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCBudWxsLCA0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC53cml0ZShmaWxlbmFtZSwgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJlYW0oZmlsZW5hbWU6IHN0cmluZywgc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC53cml0ZVN0cmVhbShmaWxlbmFtZSwgc3RyZWFtKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGEgVVJMIGZvciBhIGZpbGUgaW4gdGhlIGRyaXZlLlxuICAgICAqIEBwYXJhbSBwYXlsb2FkICBGaWxlIGluc3RhbmNlLCBGaWxlIElELCBEcml2ZUVudHJ5IGluc3RhbmNlIG9yIGZpbGVuYW1lIHN0cmluZ1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFxuICAgICAqIEByZXR1cm5zIHN0cmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1cmwoZmlsZW5hbWU6IHN0cmluZywgb3B0aW9uczogRHJpdmVVcmxPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZz4geyAgICAgICAgXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQudXJsKGZpbGVuYW1lLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWRVcmwoZmlsZW5hbWU6IHN0cmluZywgb3B0aW9uczogRHJpdmVVcmxPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZz4geyAgICAgICAgXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQudXBsb2FkVXJsKGZpbGVuYW1lLCBvcHRpb25zKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBhIGZpbGUgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byB0aGUgZHJpdmUuXG4gICAgICogQHBhcmFtIHNvdXJjZSBmaWxlbmFtZSBpbiBsb2NhbCBmaWxlc3lzdGVtXG4gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1cGxvYWQoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoc291cmNlKVxuXG4gICAgICAgIGNvbnN0IHVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKVxuXG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlKGRlc3RpbmF0aW9uLCB1aW50OClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZCBhIGZpbGUgZnJvbSB0aGUgZHJpdmUgdG8gdGhlIGxvY2FsIGZpbGVzeXN0ZW0uXG4gICAgICogQHBhcmFtIGZpbGVuYW1lIGZpbGVuYW1lIGluIHRoZSBkcml2ZVxuICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWQoZmlsZW5hbWU6IHN0cmluZywgZGVzdGluYXRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZWFkKGZpbGVuYW1lKVxuICAgICAgICBcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGRlc3RpbmF0aW9uLCBkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGRyaXZlIHNlbGVjdGVkJylcblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmRlbGV0ZShmaWxlbmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpe1xuICAgICAgICB0aGlzLmRyaXZlcy5jbGVhcigpXG5cbiAgICAgICAgY29uc3QgY29uZmlncyA9IGF3YWl0IERyaXZlQ29uZmlnLmxpc3QoKVxuXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjb25maWdzKSB7XG4gICAgICAgICAgICBjb25zdCBnYXRld2F5Q2xhc3MgPSB0aGlzLmdhdGV3YXlzLmdldChjLnR5cGUpXG5cbiAgICAgICAgICAgIGlmICghZ2F0ZXdheUNsYXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgRHJpdmUgZ2F0ZXdheSBmb3IgdHlwZSBcIiR7Yy50eXBlfVwiIG5vdCBmb3VuZGApXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBnYXRld2F5Q2xhc3MoYylcblxuICAgICAgICAgICAgdGhpcy5kcml2ZXMuc2V0KGMuaWQsIGdhdGV3YXkpXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGRyaXZlIGxvYWRlZCAke2MuaWR9ICgke2MudHlwZX0pYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBjb25maWcuZ2V0KCdkcml2ZS5kZWZhdWx0JylcbiAgICAgICAgdGhpcy5kZWZhdWx0RHJpdmUgPSBjb25maWcuZ2V0KCdkcml2ZS5kZWZhdWx0JylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY3JlYXRlRGVmYXVsdERyaXZlcygpe1xuXG4gICAgICAgIGF3YWl0IERyaXZlQ29uZmlnLnVwZGF0ZU9yQ3JlYXRlKCdzdG9yYWdlLXVwbG9hZHMnLCB7XG4gICAgICAgICAgICBuYW1lOiAnVXBsb2FkcycsXG4gICAgICAgICAgICB0eXBlOiAnZnMnLFxuICAgICAgICAgICAgY29uZmlnOiB7IGRpcmVjdG9yeTogc3RvcmFnZVBhdGgoJ3VwbG9hZHMnKSB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFjb25maWcuZ2V0KCdkcml2ZS5kZWZhdWx0JykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5zZXQoJ2RyaXZlLmRlZmF1bHQnLCAnc3RvcmFnZS11cGxvYWRzJylcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZCgpXG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlVXBsb2FkKG9wdGlvbnM6IFZhbGlkYXRlVXBsb2FkT3B0aW9ucywgZmlsZTogeyBtaW1ldHlwZTogc3RyaW5nLCBzaXplOiBudW1iZXIgfSwpIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gb3B0aW9ucy5taW1lX3R5cGVzLnNwbGl0KCcsJykubWFwKHQgPT4gdC50cmltKCkpXG5cbiAgICAgICAgY29uc3QgaXNBbGxvd2VkID0gYWxsb3dlZFR5cGVzLnNvbWUoYWxsb3dlZFR5cGUgPT4ge1xuICAgICAgICAgICAgaWYgKCFhbGxvd2VkVHlwZS5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd2VkVHlwZSA9PT0gZmlsZS5taW1ldHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBiYXNlVHlwZSA9IGFsbG93ZWRUeXBlLnNsaWNlKDAsIC0yKVxuXG4gICAgICAgICAgICByZXR1cm4gZmlsZS5taW1ldHlwZS5zdGFydHNXaXRoKGJhc2VUeXBlICsgJy8nKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICghaXNBbGxvd2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTUlNRSB0eXBlIG5vdCBhbGxvd2VkJywgNDAzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4U2l6ZSAmJiBmaWxlLnNpemUgPiBvcHRpb25zLm1heFNpemUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdGaWxlIHNpemUgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkJywgNDAzKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbW1pdHRlclNlcnZpY2UgZnJvbSBcIi4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2VcIjtcbmltcG9ydCB0eXBlIHsgRXZlbnRDb250cmFjdCB9IGZyb20gJy4uL2NvbnRyYWN0cy9FdmVudENvbnRyYWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW1taXR0ZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZUVtbWl0dGVyU2VydmljZTxFdmVudENvbnRyYWN0PiB7fVxuIiwiaW1wb3J0IHR5cGUgeyBHaXRHYXRld2F5IH0gZnJvbSAnLi4vZ2F0ZXdheXMvR2l0R2F0ZXdheS50cydcblxuZXhwb3J0IGludGVyZmFjZSBHaXRCcmFuY2gge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIHJlbW90ZTogc3RyaW5nIHwgbnVsbFxuICAgIGlzQ3VycmVudDogYm9vbGVhblxuICAgIGlzUmVtb3RlOiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0QnJhbmNoRmV0Y2hPcHRpb25zIHtcbiAgICByZW1vdGU6IHN0cmluZ1xuICAgIGJyYW5jaDogc3RyaW5nXG4gICAgbG9jYWxOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBHaXRCcmFuY2hSZXBvc2l0b3J5IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGdhdGV3YXk6IEdpdEdhdGV3YXkpIHt9XG5cbiAgICBhc3luYyBsaXN0KCk6IFByb21pc2U8R2l0QnJhbmNoW10+IHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5nYXRld2F5LnJ1bihcbiAgICAgICAgICAgIGBicmFuY2ggLWEgLS1mb3JtYXQ9JyUoSEVBRCl8JShyZWZuYW1lOnNob3J0KXwlKHJlZm5hbWUpfCUodXBzdHJlYW06cmVtb3RlbmFtZSknYCxcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLmluY2x1ZGVzKCd8JykpXG4gICAgICAgICAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2hlYWQsIHJlZlNob3J0LCByZWZGdWxsLCByZW1vdGVOYW1lXSA9IGxpbmUuc3BsaXQoJ3wnKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNSZW1vdGUgPSByZWZGdWxsLnN0YXJ0c1dpdGgoJ3JlZnMvcmVtb3Rlcy8nKVxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSByZWZTaG9ydFxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlOiBpc1JlbW90ZSA/IG5hbWUuc3BsaXQoJy8nKVswXSA6IChyZW1vdGVOYW1lIHx8IG51bGwpLFxuICAgICAgICAgICAgICAgICAgICBpc0N1cnJlbnQ6IGhlYWQgPT09ICcqJyxcbiAgICAgICAgICAgICAgICAgICAgaXNSZW1vdGUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaChvcHRpb25zOiBHaXRCcmFuY2hGZXRjaE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyByZW1vdGUsIGJyYW5jaCwgbG9jYWxOYW1lIH0gPSBvcHRpb25zXG4gICAgICAgIGNvbnN0IGxvY2FsID0gbG9jYWxOYW1lID8/IGJyYW5jaFxuXG4gICAgICAgIGF3YWl0IHRoaXMuZ2F0ZXdheS5ydW4oYGZldGNoICR7cmVtb3RlfSAke2JyYW5jaH06JHtsb2NhbH1gKVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgR2l0R2F0ZXdheSB9IGZyb20gJy4uL2dhdGV3YXlzL0dpdEdhdGV3YXkudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0Q29tbWl0UmVmIHtcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBzaG9ydE5hbWU6IHN0cmluZ1xuICAgIHR5cGU6ICdicmFuY2gnIHwgJ3RhZycgfCAncmVtb3RlJyB8ICdvdGhlcidcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRDb21taXQge1xuICAgIGhhc2g6IHN0cmluZ1xuICAgIHNob3J0SGFzaDogc3RyaW5nXG4gICAgYXV0aG9yTmFtZTogc3RyaW5nXG4gICAgYXV0aG9yRW1haWw6IHN0cmluZ1xuICAgIGRhdGU6IHN0cmluZ1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIHJlZnM6IEdpdENvbW1pdFJlZltdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0Q29tbWl0TGlzdE9wdGlvbnMge1xuICAgIGJyYW5jaD86IHN0cmluZ1xuICAgIHBhZ2U/OiBudW1iZXJcbiAgICBwZXJQYWdlPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVkQ29tbWl0cyB7XG4gICAgaXRlbXM6IEdpdENvbW1pdFtdXG4gICAgdG90YWw6IG51bWJlclxuICAgIHBhZ2U6IG51bWJlclxuICAgIHBlclBhZ2U6IG51bWJlclxuICAgIHRvdGFsUGFnZXM6IG51bWJlclxufVxuXG4vLyAlRCBlbWl0cyB0aGUgcmVmIGRlY29yYXRpb25zIGZvciB0aGUgY29tbWl0IChlLmcuIFwiSEVBRCAtPiBtYWluLCB0YWc6IHYxLjAsIG9yaWdpbi9tYWluXCIpXG5jb25zdCBMT0dfRk9STUFUID0gWyclSCcsICclaCcsICclYW4nLCAnJWFlJywgJyVhSScsICclcycsICclRCddLmpvaW4oJyV4MDknKVxuXG5mdW5jdGlvbiBwYXJzZURlY29yYXRpb25zKGRlY29yU3RyOiBzdHJpbmcpOiBHaXRDb21taXRSZWZbXSB7XG4gICAgaWYgKCFkZWNvclN0ci50cmltKCkpIHJldHVybiBbXVxuXG4gICAgY29uc3QgcmVmczogR2l0Q29tbWl0UmVmW10gPSBbXVxuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGRlY29yU3RyLnNwbGl0KCcsICcpKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBwYXJ0LnRyaW0oKVxuICAgICAgICBpZiAoIXRyaW1tZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnSEVBRCAtPiAnKSkge1xuICAgICAgICAgICAgY29uc3Qgc2hvcnROYW1lID0gdHJpbW1lZC5zbGljZSg4KVxuICAgICAgICAgICAgcmVmcy5wdXNoKHsgbmFtZTogJ0hFQUQnLCBzaG9ydE5hbWU6ICdIRUFEJywgdHlwZTogJ290aGVyJyB9KVxuICAgICAgICAgICAgcmVmcy5wdXNoKHsgbmFtZTogYHJlZnMvaGVhZHMvJHtzaG9ydE5hbWV9YCwgc2hvcnROYW1lLCB0eXBlOiAnYnJhbmNoJyB9KVxuICAgICAgICB9IGVsc2UgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgndGFnOiAnKSkge1xuICAgICAgICAgICAgY29uc3Qgc2hvcnROYW1lID0gdHJpbW1lZC5zbGljZSg1KVxuICAgICAgICAgICAgcmVmcy5wdXNoKHsgbmFtZTogYHJlZnMvdGFncy8ke3Nob3J0TmFtZX1gLCBzaG9ydE5hbWUsIHR5cGU6ICd0YWcnIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHJpbW1lZCA9PT0gJ0hFQUQnKSB7XG4gICAgICAgICAgICByZWZzLnB1c2goeyBuYW1lOiAnSEVBRCcsIHNob3J0TmFtZTogJ0hFQUQnLCB0eXBlOiAnb3RoZXInIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHJpbW1lZC5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgICByZWZzLnB1c2goeyBuYW1lOiBgcmVmcy9yZW1vdGVzLyR7dHJpbW1lZH1gLCBzaG9ydE5hbWU6IHRyaW1tZWQsIHR5cGU6ICdyZW1vdGUnIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWZzLnB1c2goeyBuYW1lOiBgcmVmcy9oZWFkcy8ke3RyaW1tZWR9YCwgc2hvcnROYW1lOiB0cmltbWVkLCB0eXBlOiAnYnJhbmNoJyB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZnNcbn1cblxuZXhwb3J0IGNsYXNzIEdpdENvbW1pdFJlcG9zaXRvcnkge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZ2F0ZXdheTogR2l0R2F0ZXdheSkge31cblxuICAgIGFzeW5jIGxpc3Qob3B0aW9ucz86IEdpdENvbW1pdExpc3RPcHRpb25zKTogUHJvbWlzZTxQYWdpbmF0ZWRDb21taXRzPiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBvcHRpb25zPy5wYWdlID8/IDFcbiAgICAgICAgY29uc3QgcGVyUGFnZSA9IG9wdGlvbnM/LnBlclBhZ2UgPz8gMjBcbiAgICAgICAgY29uc3QgcmVmID0gb3B0aW9ucz8uYnJhbmNoID8/ICdIRUFEJ1xuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuZ2F0ZXdheS5ydW4oYGxvZyAke3JlZn0gLS1mb3JtYXQ9JyR7TE9HX0ZPUk1BVH0nYClcblxuICAgICAgICBjb25zdCBhbGw6IEdpdENvbW1pdFtdID0gb3V0cHV0XG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2hhc2gsIHNob3J0SGFzaCwgYXV0aG9yTmFtZSwgYXV0aG9yRW1haWwsIGRhdGUsIG1lc3NhZ2UsIGRlY29yU3RyID0gJyddID0gbGluZS5zcGxpdCgnXFx0JylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBoYXNoLFxuICAgICAgICAgICAgICAgICAgICBzaG9ydEhhc2gsXG4gICAgICAgICAgICAgICAgICAgIGF1dGhvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGF1dGhvckVtYWlsLFxuICAgICAgICAgICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICByZWZzOiBwYXJzZURlY29yYXRpb25zKGRlY29yU3RyKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHRvdGFsID0gYWxsLmxlbmd0aFxuICAgICAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRvdGFsIC8gcGVyUGFnZSlcbiAgICAgICAgY29uc3Qgc3RhcnQgPSAocGFnZSAtIDEpICogcGVyUGFnZVxuICAgICAgICBjb25zdCBpdGVtcyA9IGFsbC5zbGljZShzdGFydCwgc3RhcnQgKyBwZXJQYWdlKVxuXG4gICAgICAgIHJldHVybiB7IGl0ZW1zLCB0b3RhbCwgcGFnZSwgcGVyUGFnZSwgdG90YWxQYWdlcyB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgaW1wb3J0QWxsIH0gZnJvbSAnI3NlcnZlci91dGlscy9pbXBvcnRBbGwudHMnO1xuaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJztcbmltcG9ydCBCYXNlTGlmZWN5Y2xlU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZUxpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBhc3luYyBhZGREaXJlY3RvcnkoZGlybmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1vZHMgPSBhd2FpdCBpbXBvcnRBbGwoZGlybmFtZSlcbiAgICAgICAgY29uc3QgaG9va3M6IExpZmVjeWNsZUhvb2tbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbW9kXSBvZiBPYmplY3QuZW50cmllcyhtb2RzKSkge1xuICAgICAgICAgICAgY29uc3QgSG9va0NsYXNzID0gbW9kLmRlZmF1bHQgfHwgbW9kXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBIb29rQ2xhc3MoKSBhcyBMaWZlY3ljbGVIb29rXG5cbiAgICAgICAgICAgIGluc3RhbmNlLmhvb2tfaWQgPSBpbnN0YW5jZS5ob29rX2lkIHx8IG5hbWVcblxuICAgICAgICAgICAgaG9va3MucHVzaChpbnN0YW5jZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGhvb2tzLmZvckVhY2goaG9vayA9PiB0aGlzLmFkZChob29rKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcblxuZXhwb3J0IGludGVyZmFjZSBNZXRhZGFmaWx0ZXIge1xuICAgIGVxPzogc3RyaW5nLFxuICAgIG5lcT86IHN0cmluZyxcbiAgICBcbiAgICBsaWtlPzogc3RyaW5nLFxuICAgIG5saWtlPzogc3RyaW5nLFxuXG4gICAgaW4/OiBzdHJpbmdbXSxcbiAgICBuaW4/OiBzdHJpbmdbXSxcblxuICAgIGd0Pzogc3RyaW5nLFxuICAgIGd0ZT86IHN0cmluZyxcbiAgICBsdD86IHN0cmluZyxcbiAgICBsdGU/OiBzdHJpbmcsXG5cbiAgICBpc19udWxsPzogYm9vbGVhblxuICAgIGV4aXN0cz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YVF1ZXJ5UGF5bG9hZCB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgTWV0YWRhZmlsdGVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGFkYXRhUXVlcnlTZXJ2aWNlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIHByaXZhdGUgcGF5bG9hZDogTWV0YWRhdGFRdWVyeVBheWxvYWRcbiAgICBwcml2YXRlIHRhYmxlOiBUXG4gICAgcHJpdmF0ZSBmb3JlaWduS2V5OiBrZXlvZiBEYXRhYmFzZVtUXVxuICAgIHByaXZhdGUgcGFyZW50S2V5ID0gJ2lkJ1xuXG4gICAgY29uc3RydWN0b3IocGF5bG9hZDogTWV0YWRhdGFRdWVyeVBheWxvYWQsIHRhYmxlOiBULCBmb3JlaWduS2V5OiBrZXlvZiBEYXRhYmFzZVtUXSwgcGFyZW50S2V5Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlXG4gICAgICAgIHRoaXMuZm9yZWlnbktleSA9IGZvcmVpZ25LZXlcblxuICAgICAgICBpZiAocGFyZW50S2V5KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEtleSA9IHBhcmVudEtleVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuZWVkV2hlcmVJbigpe1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBPYmplY3QudmFsdWVzKHRoaXMucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjb25kaXRpb24uZXEgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5uZXEgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5saWtlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24ubmxpa2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5pbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLm5pbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLmd0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24uZ3RlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24ubHQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5sdGUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5pc19udWxsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24uZXhpc3RzID09PSB0cnVlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuZWVkV2hlcmVOb3RJbigpe1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBPYmplY3QudmFsdWVzKHRoaXMucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnc3RyaW5nJykgY29udGludWVcblxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbi5leGlzdHMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseShkYlF1ZXJ5OiBhbnkpIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gZGJRdWVyeVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRXaGVyZUluKSB7XG4gICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgICAgICAgLndoZXJlKHRoaXMucGFyZW50S2V5LCAnaW4nLCAoZWI6IGFueSkgPT4gXG4gICAgICAgICAgICAgICAgICAgIGViLnNlbGVjdEZyb20odGhpcy50YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QodGhpcy5mb3JlaWduS2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKHRoaXMud2hlcmVJbihlYikpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmVlZFdoZXJlTm90SW4pIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgICAgICAgICAgICAud2hlcmUodGhpcy5wYXJlbnRLZXksICdub3QgaW4nLCAoZWI6IGFueSkgPT4gXG4gICAgICAgICAgICAgICAgICAgIGViLnNlbGVjdEZyb20odGhpcy50YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QodGhpcy5mb3JlaWduS2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKHRoaXMud2hlcmVOb3RJbihlYikpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZFJvd0NvbmRpdGlvbnMoZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PiwgbmFtZTogc3RyaW5nLCBjb25kaXRpb246IHN0cmluZyB8IE1ldGFkYWZpbHRlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgZWIuZWIoJ25hbWUnLCAnPScsIG5hbWUpLFxuICAgICAgICAgICAgICAgIGViLmViKCd2YWx1ZScsICc9JywgY29uZGl0aW9uKVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhdXNlcyA9IFtcbiAgICAgICAgICAgIGViLmViKCduYW1lJywgJz0nLCBuYW1lKVxuICAgICAgICBdXG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5lcSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJz0nLCBjb25kaXRpb24uZXEpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5uZXEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICchPScsIGNvbmRpdGlvbi5uZXEpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5saWtlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnbGlrZScsIGNvbmRpdGlvbi5saWtlKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24ubmxpa2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICdub3QgbGlrZScsIGNvbmRpdGlvbi5ubGlrZSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLmluKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJ2luJywgY29uZGl0aW9uLmluKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24ubmluKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJ25vdCBpbicsIGNvbmRpdGlvbi5uaW4pKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5ndCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJz4nLCBjb25kaXRpb24uZ3QpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5ndGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICc+PScsIGNvbmRpdGlvbi5ndGUpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5sdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJzwnLCBjb25kaXRpb24ubHQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5sdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICc8PScsIGNvbmRpdGlvbi5sdGUpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5pc19udWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCBjb25kaXRpb24uaXNfbnVsbCA/ICdpcycgOiAnaXMgbm90JywgbnVsbCkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xhdXNlc1xuICAgIH1cblxuICAgIHB1YmxpYyB3aGVyZUluID0gPERCUXVlcnk+KGViOiAgRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgICAgIGxldCBxdWVyeSA9IGViIGFzIGFueVxuXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbmRpdGlvbl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wYXlsb2FkKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gIT09ICdzdHJpbmcnICYmIGNvbmRpdGlvbi5leGlzdHMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5hbmQodGhpcy5idWlsZFJvd0NvbmRpdGlvbnMoZWIsIG5hbWUsIGNvbmRpdGlvbikpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXVlcnkgYXMgREJRdWVyeVxuICAgIH1cblxuICAgIHB1YmxpYyB3aGVyZU5vdEluID0gPERCUXVlcnk+KGViOiAgRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgICAgIGxldCBxdWVyeSA9IGViIGFzIGFueVxuXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbmRpdGlvbl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wYXlsb2FkKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdzdHJpbmcnKSBjb250aW51ZVxuXG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uLmV4aXN0cyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5KCduYW1lJywgJz0nLCBuYW1lKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5IGFzIERCUXVlcnlcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuXG5leHBvcnQgY29uc3Qga2V5ID0gJ2RhdGFiYXNlJ1xuXG5jb25zdCBkYXRhYmFzZSA9IGNvbnRhaW5lci5wcm94eTxLeXNlbHk8RGF0YWJhc2VDb250cmFjdD4+KGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZGF0YWJhc2VcblxuIiwiaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0YWRhdGFTZXJ2aWNlIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyB0YWJsZTogc3RyaW5nXG4gICAgcHVibGljIGZvcmVpZ25LZXk6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IocGF5bG9hZDogUGljazxNZXRhZGF0YVNlcnZpY2UsICd0YWJsZScgfCAnZm9yZWlnbktleScgfCAnaWQnPikge1xuICAgICAgICB0aGlzLmlkID0gcGF5bG9hZC5pZFxuICAgICAgICB0aGlzLnRhYmxlID0gcGF5bG9hZC50YWJsZVxuICAgICAgICB0aGlzLmZvcmVpZ25LZXkgPSBwYXlsb2FkLmZvcmVpZ25LZXlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdqc29uOicpKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZS5zbGljZSg1KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ2Jvb2w6JykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSg1KSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdudW1iZXI6JykpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUuc2xpY2UoNykpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ3N0cmluZzonKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKDcpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZsYXR0ZW4oaXRlbXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH0+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICByZXN1bHRbaXRlbS5uYW1lXSA9IE1ldGFkYXRhU2VydmljZS5wYXJzZShpdGVtLnZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgICBcblxuICAgIHB1YmxpYyBhc3luYyBnZXQ8VCA9IGFueT4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPlxuICAgIHB1YmxpYyBhc3luYyBnZXQ8VCA9IGFueT4obmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpOiBQcm9taXNlPFQ+XG4gICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbSh0aGlzLnRhYmxlIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcXVlcnkgPSBxdWVyeVxuICAgICAgICAgICAgLnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAud2hlcmUoKHRoaXMuZm9yZWlnbktleSBhcyBzdHJpbmcpLCAnPScsIHRoaXMuaWQpXG4gICAgICAgICAgICAud2hlcmUoJ25hbWUnLCAnPScsIG5hbWUpXG4gICAgICAgICAgICAubGltaXQoMSlcblxuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyeS5leGVjdXRlVGFrZUZpcnN0KCkgXG5cbiAgICAgICAgaWYgKCFyb3cgfHwgIXJvdy52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBNZXRhZGF0YVNlcnZpY2UucGFyc2Uocm93LnZhbHVlKVxuXG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZm9yZWlnbktleSA9IHRoaXMuZm9yZWlnbktleVxuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVcblxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgICAgICBbZm9yZWlnbktleV06IHRoaXMuaWQsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB2YWx1ZXMudmFsdWUgPSBganNvbjoke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBkYi5zZWxlY3RGcm9tKHRhYmxlIGFzIGFueSkud2hlcmUoKGZvcmVpZ25LZXkgYXMgc3RyaW5nKSwgJz0nLCB0aGlzLmlkKS53aGVyZSgnbmFtZScsICc9JywgbmFtZSkuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgYXdhaXQgZGIudXBkYXRlVGFibGUodGFibGUgYXMgYW55KVxuICAgICAgICAgICAgICAgIC5zZXQodmFsdWVzKVxuICAgICAgICAgICAgICAgIC53aGVyZSgoZm9yZWlnbktleSBhcyBzdHJpbmcpLCAnPScsIHRoaXMuaWQpXG4gICAgICAgICAgICAgICAgLndoZXJlKCduYW1lJywgJz0nLCBuYW1lKVxuICAgICAgICAgICAgICAgIC5leGVjdXRlKClcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBkYi5pbnNlcnRJbnRvKHRhYmxlIGFzIGFueSlcbiAgICAgICAgICAgIC52YWx1ZXModmFsdWVzKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxBcnJheTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9Pj4ge1xuICAgICAgICBjb25zdCBmb3JlaWduS2V5ID0gdGhpcy5mb3JlaWduS2V5XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZVxuXG4gICAgICAgIGxldCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGFibGUgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgICAuc2VsZWN0QWxsKClcbiAgICAgICAgICAgIC53aGVyZSgoZm9yZWlnbktleSBhcyBzdHJpbmcpLCAnPScsIHRoaXMuaWQpXG5cbiAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5LmV4ZWN1dGUoKVxuXG4gICAgICAgIHJldHVybiByb3dzLm1hcCgocm93OiBhbnkpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiByb3cubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBNZXRhZGF0YVNlcnZpY2UucGFyc2Uocm93LnZhbHVlKVxuICAgICAgICB9KSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWxsKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5saXN0KClcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgICAgICByZXN1bHRbcm93Lm5hbWVdID0gcm93LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBCYXNlRXhjZXB0aW9uIH0gZnJvbSBcIiNzaGFyZWQvaW5kZXgudHNcIjtcbmltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSBcImt5c2VseVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvbkVudGl5RGF0YSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIGV4ZWN1dGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNaWdyYXRpb25FbnRpdHkge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgc291cmNlOiBzdHJpbmcgfCBudWxsXG4gICAgcHVibGljIGZpbGVuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZXhlY3V0ZWRBdDogRGF0ZSB8IG51bGxcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IE1pZ3JhdGlvbkVudGl5RGF0YSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWVcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZVxuICAgICAgICB0aGlzLmZpbGVuYW1lID0gZGF0YS5maWxlbmFtZVxuICAgICAgICB0aGlzLmV4ZWN1dGVkQXQgPSBkYXRhLmV4ZWN1dGVkQXRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXAoZGI6IEt5c2VseTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydCh0aGlzLmZpbGVuYW1lKVxuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kLnVwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTWlncmF0aW9uICR7dGhpcy5uYW1lfSBkb2VzIG5vdCBleHBvcnQgYW4gdXAgZnVuY3Rpb25gKVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbW9kLnVwKGRiKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3duKGRiOiBLeXNlbHk8YW55Pik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQodGhpcy5maWxlbmFtZSlcblxuICAgICAgICBpZiAodHlwZW9mIG1vZC5kb3duICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTWlncmF0aW9uICR7dGhpcy5uYW1lfSBkb2VzIG5vdCBleHBvcnQgYSBkb3duIGZ1bmN0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG1vZC5kb3duKGRiKVxuICAgIH1cbn1cblxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IEVtbWl0dGVyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IE1pZ3JhdGlvbkVudGl0eSBmcm9tICcjc2VydmVyL2VudGl0aWVzL01pZ3JhdGlvbkVudGl0eS50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0aW9uU291cmNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGRpcmVjdG9yeTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIGV4ZWN1dGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGaWx0ZXJzIHtcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBNaWdyYXRpb25SZXN1bHQge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICByZXN1bHQ6ICdzdWNjZXNzJyB8ICdmYWlsZWQnO1xuICAgIGVycm9yPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdG9yU2VydmljZU9wdGlvbnMge1xuICAgIHNvdXJjZXM6IE1pZ3JhdGlvblNvdXJjZVtdO1xuICAgIGRiOiBLeXNlbHk8YW55PjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgZW1taXR0ZXI/OiBFbW1pdHRlclNlcnZpY2U7XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNaWdyYXRvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ01pZ3JhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGVtbWl0dGVyOiBFbW1pdHRlclNlcnZpY2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRiOiBLeXNlbHk8YW55PlxuICAgIHB1YmxpYyBzb3VyY2VzOiBNaWdyYXRpb25Tb3VyY2VbXVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogTWlncmF0b3JTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBvcHRpb25zLmVtbWl0dGVyIHx8IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5kYiA9IG9wdGlvbnMuZGJcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gb3B0aW9ucy5zb3VyY2VzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZFNvdXJjZShzb3VyY2U6IE1pZ3JhdGlvblNvdXJjZSkge1xuICAgICAgICB0aGlzLnNvdXJjZXMucHVzaChzb3VyY2UpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBlbnN1cmVNaWdyYXRpb25zVGFibGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGIuc2NoZW1hXG4gICAgICAgICAgICAuY3JlYXRlVGFibGUoJ21pZ3JhdGlvbnMnKVxuICAgICAgICAgICAgLmlmTm90RXhpc3RzKClcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ25hbWUnLCAndmFyY2hhcigyNTUpJywgKGNvbCkgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ21vZHVsZScsICd2YXJjaGFyKDI1NSknKSAvLyBtb2R1bGUgd2lsbCBiZSByZW5hbWVkIHRvIHNvdXJjZSBpbiBmdXR1cmUgdmVyc2lvbnNcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2V4ZWN1dGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxpc3RTb3VyY2Uoc291cmNlOiBNaWdyYXRpb25Tb3VyY2UpIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoc291cmNlLmRpcmVjdG9yeSlcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmpzJywgJy50cycsICcubWpzJywgJy5tdHMnXVxuXG4gICAgICAgIGNvbnN0IGl0ZW1zOiBNaWdyYXRpb25FbnRpdHlbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoIWV4dGVuc2lvbnMuc29tZShleHQgPT4gZW50cnkuZW5kc1dpdGgoZXh0KSkpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHNvdXJjZS5kaXJlY3RvcnksIGVudHJ5KVxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHBhdGguYmFzZW5hbWUoZW50cnksIHBhdGguZXh0bmFtZShlbnRyeSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IG5ldyBNaWdyYXRpb25FbnRpdHkoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UuaWQsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZ1bGxQYXRoLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGVkQXQ6IG51bGwsXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdGVtcy5wdXNoKGVudGl0eSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsaXN0KGZpbHRlcnM/OiBMaXN0RmlsdGVycykge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1pZ3JhdGlvbnNUYWJsZSgpXG5cbiAgICAgICAgbGV0IGl0ZW1zID0gW10gYXMgTWlncmF0aW9uRW50aXR5W11cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pZ3JhdGlvbnMgPSBhd2FpdCB0aGlzLmxpc3RTb3VyY2Uoc291cmNlKVxuXG4gICAgICAgICAgICBpdGVtcy5wdXNoKC4uLm1pZ3JhdGlvbnMpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZXhlY3V0ZWQgbWlncmF0aW9ucyBmcm9tIGRhdGFiYXNlXG4gICAgICAgIGNvbnN0IGV4ZWN1dGVkID0gYXdhaXQgdGhpcy5kYlxuICAgICAgICAgICAgLnNlbGVjdEZyb20oJ21pZ3JhdGlvbnMnKVxuICAgICAgICAgICAgLnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG5cbiAgICAgICAgZm9yIChjb25zdCBlIG9mIGV4ZWN1dGVkKSB7XG4gICAgICAgICAgICBpZiAoIWUuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZS5zb3VyY2UgPSAncm9vdCdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbSA9IGl0ZW1zLmZpbmQobSA9PiBtLm5hbWUgPT09IGUubmFtZSlcblxuICAgICAgICAgICAgaWYgKCFtKSBjb250aW51ZVxuXG4gICAgICAgICAgICBtLmV4ZWN1dGVkQXQgPSBuZXcgRGF0ZShlLmV4ZWN1dGVkX2F0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlcnM/LnNvdXJjZSkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIobSA9PiBtLnNvdXJjZSA9PT0gZmlsdGVycy5zb3VyY2UpXG4gICAgICAgIH1cblxuICAgICAgICBpdGVtcyA9IG9yZGVyQnkoaXRlbXMsIFsnc291cmNlJywgJ25hbWUnXSwgWydhc2MnLCAnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtaWdyYXRlVXAobWlncmF0aW9uOiBNaWdyYXRpb25FbnRpdHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbWlncmF0aW9uLnVwKHRoaXMuZGIpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5kYlxuICAgICAgICAgICAgLmluc2VydEludG8oJ21pZ3JhdGlvbnMnKVxuICAgICAgICAgICAgLnZhbHVlcyh7XG4gICAgICAgICAgICAgICAgbmFtZTogbWlncmF0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgbW9kdWxlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGVkX2F0OiBmb3JtYXQobmV3IERhdGUoKSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgJHttaWdyYXRpb24ubmFtZX0gbWlncmF0ZWQgc3VjY2Vzc2Z1bGx5YClcblxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbWlncmF0ZURvd24obWlncmF0aW9uOiBNaWdyYXRpb25FbnRpdHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbWlncmF0aW9uLmRvd24odGhpcy5kYilcblxuICAgICAgICBhd2FpdCB0aGlzLmRiXG4gICAgICAgICAgICAuZGVsZXRlRnJvbSgnbWlncmF0aW9ucycpXG4gICAgICAgICAgICAud2hlcmUoJ25hbWUnLCAnPScsIG1pZ3JhdGlvbi5uYW1lKVxuICAgICAgICAgICAgLndoZXJlKCdtb2R1bGUnLCAnPScsIG1pZ3JhdGlvbi5zb3VyY2UpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgJHttaWdyYXRpb24ubmFtZX0gcm9sbGVkIGJhY2sgc3VjY2Vzc2Z1bGx5YClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbWlncmF0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTWlncmF0aW9uc1RhYmxlKClcblxuICAgICAgICBjb25zdCBtaWdyYXRpb25zID0gYXdhaXQgdGhpcy5saXN0KClcbiAgICAgICAgY29uc3QgbWlncmF0aW9uID0gbWlncmF0aW9ucy5maW5kKG0gPT4gbS5maWxlbmFtZSA9PT0gZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKCFtaWdyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSksXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYE1pZ3JhdGlvbiAke2ZpbGVuYW1lfSBub3QgZm91bmRgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbi5leGVjdXRlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IHRoaXMubWlncmF0ZVVwKG1pZ3JhdGlvbikpXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IG1pZ3JhdGlvbi5zb3VyY2UsXG4gICAgICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJvbGxiYWNrRmlsZShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVNaWdyYXRpb25zVGFibGUoKVxuXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbnMgPSBhd2FpdCB0aGlzLmxpc3QoKVxuICAgICAgICBjb25zdCBtaWdyYXRpb24gPSBtaWdyYXRpb25zLmZpbmQobSA9PiBtLmZpbGVuYW1lID09PSBmaWxlbmFtZSlcblxuICAgICAgICBpZiAoIW1pZ3JhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lLCBwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKSxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGBNaWdyYXRpb24gJHtmaWxlbmFtZX0gbm90IGZvdW5kYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtaWdyYXRpb24uZXhlY3V0ZWRBdCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogbWlncmF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbWlncmF0aW9uLnNvdXJjZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiB0aGlzLm1pZ3JhdGVEb3duKG1pZ3JhdGlvbikpXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IG1pZ3JhdGlvbi5zb3VyY2UsXG4gICAgICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1pZ3JhdGUoZmlsdGVyczogTGlzdEZpbHRlcnMgJiB7IHN0ZXBzPzogbnVtYmVyIH0gPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVNaWdyYXRpb25zVGFibGUoKVxuXG4gICAgICAgIGxldCBtaWdyYXRpb25zID0gYXdhaXQgdGhpcy5saXN0KGZpbHRlcnMpXG5cbiAgICAgICAgbWlncmF0aW9ucyA9IG1pZ3JhdGlvbnMuZmlsdGVyKG0gPT4gIW0uZXhlY3V0ZWRBdClcblxuICAgICAgICBtaWdyYXRpb25zLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpXG5cbiAgICAgICAgaWYgKGZpbHRlcnMuc3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWlncmF0aW9ucyA9IG1pZ3JhdGlvbnMuc2xpY2UoMCwgZmlsdGVycy5zdGVwcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaWdyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtbWl0dGVyLmVtaXRBbmRXYWl0KCdtaWdyYXRvcjpiZWZvcmUtbWlncmF0ZScsIHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnM6IG1pZ3JhdGlvbnMubWFwKG0gPT4gbS5uYW1lKVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IE1pZ3JhdGlvblJlc3VsdFtdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBtaWdyYXRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGVGaWxlKG1pZ3JhdGlvbi5maWxlbmFtZSlcblxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdClcblxuICAgICAgICAgICAgLy8gU3RvcCBvbiBmaXJzdCBmYWlsdXJlXG4gICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnbWlncmF0b3I6YWZ0ZXItbWlncmF0ZScsIHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnM6IG1pZ3JhdGlvbnMsXG4gICAgICAgICAgICByZXN1bHRzXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcm9sbGJhY2soZmlsdGVyczogTGlzdEZpbHRlcnMgJiB7IHN0ZXBzPzogbnVtYmVyIH0gPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVNaWdyYXRpb25zVGFibGUoKVxuXG4gICAgICAgIGxldCBtaWdyYXRpb25zID0gYXdhaXQgdGhpcy5saXN0KGZpbHRlcnMpXG5cbiAgICAgICAgbWlncmF0aW9ucyA9IG1pZ3JhdGlvbnMuZmlsdGVyKG0gPT4gbS5leGVjdXRlZEF0KVxuXG4gICAgICAgIG1pZ3JhdGlvbnMuc29ydCgoYSwgYikgPT4gYi5uYW1lLmxvY2FsZUNvbXBhcmUoYS5uYW1lKSlcblxuXG4gICAgICAgIGlmIChmaWx0ZXJzLnN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnMgPSBtaWdyYXRpb25zLnNsaWNlKDAsIGZpbHRlcnMuc3RlcHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnbWlncmF0b3I6YmVmb3JlLXJvbGxiYWNrJywge1xuICAgICAgICAgICAgbWlncmF0aW9uczogbWlncmF0aW9ucy5tYXAobSA9PiBtLm5hbWUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVzdWx0czogTWlncmF0aW9uUmVzdWx0W10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucm9sbGJhY2tGaWxlKG1pZ3JhdGlvbi5maWxlbmFtZSlcblxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdClcblxuICAgICAgICAgICAgLy8gU3RvcCBvbiBmaXJzdCBmYWlsdXJlXG4gICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnbWlncmF0b3I6YWZ0ZXItcm9sbGJhY2snLCB7XG4gICAgICAgICAgICBtaWdyYXRpb25zOiBtaWdyYXRpb25zLm1hcChtID0+IG0ubmFtZSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cChzdGVwczogbnVtYmVyID0gMSwgZmlsdGVyczogTGlzdEZpbHRlcnMgPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlncmF0ZSh7XG4gICAgICAgICAgICAuLi5maWx0ZXJzLFxuICAgICAgICAgICAgc3RlcHNcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bihzdGVwczogbnVtYmVyID0gMSwgZmlsdGVyczogTGlzdEZpbHRlcnMgPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9sbGJhY2soe1xuICAgICAgICAgICAgLi4uZmlsdGVycyxcbiAgICAgICAgICAgIHN0ZXBzXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxhdGVzdChmaWx0ZXJzOiBMaXN0RmlsdGVycyA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taWdyYXRlKGZpbHRlcnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxhdGVzdE9yRmFpbChmaWx0ZXJzOiBMaXN0RmlsdGVycyA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5sYXRlc3QoZmlsdGVycylcblxuICAgICAgICBpZiAocmVzdWx0cy5zb21lKHIgPT4gci5yZXN1bHQgPT09ICdmYWlsZWQnKSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBydW4gYWxsIG1pZ3JhdGlvbnMnKVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IHJlc3VsdHMgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZyZXNoKGZpbHRlcnM6IExpc3RGaWx0ZXJzICYgeyBzdGVwcz86IG51bWJlciB9ID0ge30pOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdFtdPiB7XG4gICAgICAgIGNvbnN0IGRvd25SZXN1bHRzID0gYXdhaXQgdGhpcy5yb2xsYmFjayhmaWx0ZXJzKVxuXG4gICAgICAgIGlmIChkb3duUmVzdWx0cy5zb21lKHIgPT4gci5yZXN1bHQgPT09ICdmYWlsZWQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvd25SZXN1bHRzXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cFJlc3VsdHMgPSBhd2FpdCB0aGlzLm1pZ3JhdGUoZmlsdGVycylcblxuICAgICAgICByZXR1cm4gdXBSZXN1bHRzXG4gICAgfVxuXG59XG5cbiIsImltcG9ydCB7IGNyZWF0ZUlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzJ1xuXG5leHBvcnQgdHlwZSBJcGNNZXNzYWdlPFQgPSBhbnk+ID0ge1xuICAgIGlkOiBzdHJpbmdcbiAgICBldmVudDogc3RyaW5nXG4gICAgZGF0YTogVFxufVxuXG50eXBlIElwY0xpc3RlbmVyPFQgPSBhbnk+ID0gKGRhdGE6IFQpID0+IHZvaWRcblxuZXhwb3J0IGNsYXNzIFBsdWdpbklwY0NsaWVudCB7XG4gICAgcHJpdmF0ZSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PElwY0xpc3RlbmVyPj4oKVxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdtZXNzYWdlJywgKG1lc3NhZ2U6IElwY01lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5saXN0ZW5lcnMuZ2V0KG1lc3NhZ2UuZXZlbnQpXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJzKSByZXR1cm5cblxuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihtZXNzYWdlLmRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG9uPFQgPSBhbnk+KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBJcGNMaXN0ZW5lcjxUPik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50KSEuYWRkKGNhbGxiYWNrIGFzIElwY0xpc3RlbmVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBvZmY8VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IElwY0xpc3RlbmVyPFQ+KTogdm9pZCB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmdldChldmVudCk/LmRlbGV0ZShjYWxsYmFjayBhcyBJcGNMaXN0ZW5lcilcbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdDxUID0gYW55PihldmVudDogc3RyaW5nLCBkYXRhPzogVCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghcHJvY2Vzcy5zZW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsdWdpbklwY0NsaWVudC5lbWl0OiBwcm9jZXNzLnNlbmQgaXMgbm90IGF2YWlsYWJsZSDigJQgcHJvY2VzcyB3YXMgbm90IHNwYXduZWQgd2l0aCBJUEMgY2hhbm5lbCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZCA9IGNyZWF0ZUlkKClcbiAgICAgICAgY29uc3QgbWVzc2FnZTogSXBjTWVzc2FnZTxUPiA9IHsgaWQsIGV2ZW50LCBkYXRhOiBkYXRhIGFzIFQgfVxuICAgICAgICBwcm9jZXNzLnNlbmQobWVzc2FnZSlcblxuICAgICAgICByZXR1cm4gaWRcbiAgICB9XG5cbn1cblxuIiwiaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBjcmVhdGVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9jcmVhdGVJZC50cydcbmltcG9ydCB0eXBlIHsgSXBjTWVzc2FnZSB9IGZyb20gJy4vUGx1Z2luSXBjQ2xpZW50LnRzJ1xuXG50eXBlIElwY0xpc3RlbmVyPFQgPSBhbnk+ID0gKGRhdGE6IFQpID0+IHZvaWRcblxuZXhwb3J0IGNsYXNzIFBsdWdpbklwY0hvc3Qge1xuICAgIHByaXZhdGUgbGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxJcGNMaXN0ZW5lcj4+KClcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNoaWxkOiBDaGlsZFByb2Nlc3MpIHtcbiAgICAgICAgdGhpcy5jaGlsZC5vbignbWVzc2FnZScsIChtZXNzYWdlOiBJcGNNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubGlzdGVuZXJzLmdldChtZXNzYWdlLmV2ZW50KVxuICAgICAgICAgICAgaWYgKCFoYW5kbGVycykgcmV0dXJuXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIobWVzc2FnZS5kYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBvbjxUID0gYW55PihldmVudDogc3RyaW5nLCBjYWxsYmFjazogSXBjTGlzdGVuZXI8VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zZXQoZXZlbnQsIG5ldyBTZXQoKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmdldChldmVudCkhLmFkZChjYWxsYmFjayBhcyBJcGNMaXN0ZW5lcilcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmPFQgPSBhbnk+KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBJcGNMaXN0ZW5lcjxUPik6IHZvaWQge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpPy5kZWxldGUoY2FsbGJhY2sgYXMgSXBjTGlzdGVuZXIpXG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgZGF0YT86IFQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuY2hpbGQuc2VuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW5JcGNIb3N0LmVtaXQ6IGNoaWxkIHByb2Nlc3Mgd2FzIG5vdCBzcGF3bmVkIHdpdGggYW4gSVBDIGNoYW5uZWwnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSBjcmVhdGVJZCgpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IElwY01lc3NhZ2U8VD4gPSB7IGlkLCBldmVudCwgZGF0YTogZGF0YSBhcyBUIH1cbiAgICAgICAgdGhpcy5jaGlsZC5zZW5kKG1lc3NhZ2UpXG5cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBQbHVnaW5JcGNDbGllbnQgfSBmcm9tICcuL1BsdWdpbklwY0NsaWVudC50cydcblxuZXhwb3J0IHR5cGUgSHR0cE1ldGhvZCA9ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnUEFUQ0gnIHwgJ0RFTEVURSdcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZURlZmluaXRpb24ge1xuICAgIG1ldGhvZDogSHR0cE1ldGhvZFxuICAgIHBhdGg6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlUmVxdWVzdCB7XG4gICAgcmVxdWVzdElkOiBzdHJpbmdcbiAgICBtZXRob2Q6IEh0dHBNZXRob2RcbiAgICBwYXRoOiBzdHJpbmdcbiAgICBib2R5PzogYW55XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVSZXNwb25zZVBheWxvYWQge1xuICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gICAgc3RhdHVzOiBudW1iZXJcbiAgICBib2R5PzogYW55XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVJlcGx5IHtcbiAgICBzdGF0dXMoY29kZTogbnVtYmVyKTogUm91dGVSZXBseVxuICAgIHNlbmQoYm9keT86IGFueSk6IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgUm91dGVIYW5kbGVyID0gKHJlcTogUm91dGVSZXF1ZXN0LCByZXBseTogUm91dGVSZXBseSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cblxuaW50ZXJmYWNlIFJvdXRlRW50cnkgZXh0ZW5kcyBSb3V0ZURlZmluaXRpb24ge1xuICAgIGhhbmRsZXI6IFJvdXRlSGFuZGxlclxuICAgIHBhdHRlcm46IFJlZ0V4cFxuICAgIHBhcmFtTmFtZXM6IHN0cmluZ1tdXG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGF0dGVybihwYXRoOiBzdHJpbmcpOiB7IHBhdHRlcm46IFJlZ0V4cDsgcGFyYW1OYW1lczogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgcGFyYW1OYW1lczogc3RyaW5nW10gPSBbXVxuXG4gICAgY29uc3QgcmVnZXhTdHIgPSBwYXRoXG4gICAgICAgIC5yZXBsYWNlKC86W2EtekEtWl9dW2EtekEtWjAtOV9dKi9nLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHBhcmFtTmFtZXMucHVzaChtYXRjaC5zbGljZSgxKSlcbiAgICAgICAgICAgIHJldHVybiAnKFteL10rKSdcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXFxcXC8nKVxuXG4gICAgcmV0dXJuIHsgcGF0dGVybjogbmV3IFJlZ0V4cChgXiR7cmVnZXhTdHJ9JGApLCBwYXJhbU5hbWVzIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBsdWdpblJvdXRlciB7XG4gICAgcHJpdmF0ZSByb3V0ZXM6IFJvdXRlRW50cnlbXSA9IFtdXG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogUGx1Z2luSXBjQ2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50Lm9uPFJvdXRlUmVxdWVzdD4oJ3JvdXRlcjpyZXF1ZXN0JywgKHJlcSkgPT4gdGhpcy5kaXNwYXRjaChyZXEpKVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2gocmVxOiBSb3V0ZVJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiB0aGlzLnJvdXRlcykge1xuICAgICAgICAgICAgaWYgKHJvdXRlLm1ldGhvZCAhPT0gcmVxLm1ldGhvZCkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSByb3V0ZS5wYXR0ZXJuLmV4ZWMocmVxLnBhdGgpXG4gICAgICAgICAgICBpZiAoIW1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgcm91dGUucGFyYW1OYW1lcy5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyYW1zW25hbWVdID0gbWF0Y2hbaSArIDFdXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBsZXQgc3RhdHVzQ29kZSA9IDIwMFxuICAgICAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcGx5OiBSb3V0ZVJlcGx5ID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1cyhjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBjb2RlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZW5kOiAoYm9keT86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZTogUm91dGVSZXNwb25zZVBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcS5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5lbWl0KCdyb3V0ZXI6cmVzcG9uc2UnLCByZXNwb25zZSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCByb3V0ZS5oYW5kbGVyKHsgLi4ucmVxLCBwYXJhbXMgfSwgcmVwbHkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xpZW50LmVtaXQoJ3JvdXRlcjpyZXNwb25zZScsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogcmVxLnJlcXVlc3RJZCxcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgYm9keTogeyBtZXNzYWdlOiAnTm90IEZvdW5kJyB9LFxuICAgICAgICB9IHNhdGlzZmllcyBSb3V0ZVJlc3BvbnNlUGF5bG9hZClcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyKG1ldGhvZDogSHR0cE1ldGhvZCwgcGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBwYXJhbU5hbWVzIH0gPSBidWlsZFBhdHRlcm4ocGF0aClcblxuICAgICAgICB0aGlzLnJvdXRlcy5wdXNoKHsgbWV0aG9kLCBwYXRoLCBoYW5kbGVyLCBwYXR0ZXJuLCBwYXJhbU5hbWVzIH0pXG4gICAgICAgIHRoaXMuY2xpZW50LmVtaXQoJ3JvdXRlcjpyZWdpc3RlcicsIHsgbWV0aG9kLCBwYXRoIH0gc2F0aXNmaWVzIFJvdXRlRGVmaW5pdGlvbilcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUm91dGVIYW5kbGVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoJ0dFVCcsIHBhdGgsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgcHVibGljIHBvc3QocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlcignUE9TVCcsIHBhdGgsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgcHVibGljIHB1dChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdQVVQnLCBwYXRoLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdQQVRDSCcsIHBhdGgsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdERUxFVEUnLCBwYXRoLCBoYW5kbGVyKVxuICAgIH1cbn1cbiIsImltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InXG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5pbXBvcnQgdHlwZSBSb3V0ZSBmcm9tICcjc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgUm91dGVGaWxlRGVmaW5pdGlvbiB7XG4gICAgZmlsZTogc3RyaW5nXG4gICAgcm91dGVQYXRoOiBzdHJpbmdcbiAgICBtb2R1bGU/OiBzdHJpbmdcbiAgICBtZXRob2Q6ICdnZXQnIHwgJ3Bvc3QnIHwgJ3BhdGNoJyB8ICdkZWxldGUnIHwgJ3B1dCdcbiAgICBzb3J0S2V5OiBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyRmlsZUJhc2VSb3V0aW5nU2VydmljZSB7XG4gICAgcHJpdmF0ZSBkaXJlY3Rvcnk6IHN0cmluZyBcbiAgICBwcml2YXRlIHByZWZpeDogc3RyaW5nXG4gICAgcHJpdmF0ZSBtb2R1bGU/OiBzdHJpbmdcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICAgcHJpdmF0ZSBsb2dnZXIgPSBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgcHJpdmF0ZSByb3V0ZXM6IFJvdXRlRmlsZURlZmluaXRpb25bXSA9IFtdXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcblxuICAgIHB1YmxpYyBzZXREaXJlY3RvcnkoZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3RvcnlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UHJlZml4KHByZWZpeDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvdXRlcihyb3V0ZXI6IFJvdXRlcikge1xuICAgICAgICB0aGlzLnJvdXRlciA9IHJvdXRlclxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRNb2R1bGUobW9kdWxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9nZ2VyKGxvZ2dlcjogTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWdcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShkaXJlY3Rvcnk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkRmlsZXMoKSB7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gZmcuc3luYygnKiovKi4odHN8anN8bWpzKScsIHsgY3dkOiB0aGlzLmRpcmVjdG9yeSB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRm91bmQgJHtmaWxlcy5sZW5ndGh9IHJvdXRlIGZpbGVzIGluICR7dGhpcy5kaXJlY3Rvcnl9YCwge1xuICAgICAgICAgICAgICAgIGZpbGVzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2Nlc3MgYWxsIGZpbGVzIGFuZCBidWlsZCByb3V0ZSBkYXRhXG4gICAgICAgIGNvbnN0IHJvdXRlczogUm91dGVGaWxlRGVmaW5pdGlvbltdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBleHRlbnNpb25cbiAgICAgICAgICAgIGxldCByb3V0ZVBhdGggPSBmaWxlLnJlcGxhY2UoL1xcLih0c3xqc3xtanMpJC8sICcnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgSFRUUCBtZXRob2QgZnJvbSBzdWZmaXhcbiAgICAgICAgICAgIGxldCBtZXRob2Q6ICdnZXQnIHwgJ3Bvc3QnIHwgJ3BhdGNoJyB8ICdkZWxldGUnIHwgJ3B1dCcgPSAnZ2V0J1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kU3VmZml4ZXMgPSBbJy5wb3N0JywgJy5wYXRjaCcsICcuZGVsZXRlJywgJy5wdXQnXVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1ZmZpeCBvZiBtZXRob2RTdWZmaXhlcykge1xuICAgICAgICAgICAgICAgIGlmIChyb3V0ZVBhdGguZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBzdWZmaXguc3Vic3RyaW5nKDEpIGFzIGFueVxuICAgICAgICAgICAgICAgICAgICByb3V0ZVBhdGggPSByb3V0ZVBhdGgucmVwbGFjZShzdWZmaXgsICcnKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ29udmVydCBmaWxlIHBhdGggdG8gcm91dGUgcGF0aFxuICAgICAgICAgICAgLy8gUmVwbGFjZSAnaW5kZXgnIHdpdGggZW1wdHkgc3RyaW5nIGZvciBpbmRleCByb3V0ZXNcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IHJvdXRlUGF0aC5yZXBsYWNlKC9cXC9pbmRleCQvLCAnJylcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IHJvdXRlUGF0aC5yZXBsYWNlKC9eaW5kZXgkLywgJycpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvbnZlcnQgWy4uLm5hbWVdIHRvIC86bmFtZSguKikgZm9yIG5hbWVkIGNhdGNoLWFsbCByb3V0ZXNcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IHJvdXRlUGF0aC5yZXBsYWNlKC9cXFtcXC5cXC5cXC4oW15cXF1dKyldL2csICcqJDEnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gOnBhcmFtIGZvciByb3V0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgICByb3V0ZVBhdGggPSByb3V0ZVBhdGgucmVwbGFjZSgvXFxbKFteXFxdXSspXS9nLCAnOiQxJylcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRW5zdXJlIHJvdXRlIHN0YXJ0cyB3aXRoIC9cbiAgICAgICAgICAgIGlmICghcm91dGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIHJvdXRlUGF0aCA9ICcvJyArIHJvdXRlUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUgcm9vdCBpbmRleCBjYXNlXG4gICAgICAgICAgICBpZiAocm91dGVQYXRoID09PSAnLycpIHtcbiAgICAgICAgICAgICAgICByb3V0ZVBhdGggPSAnLydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQXBwbHkgcHJlZml4IGlmIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVmaXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUHJlZml4ID0gdGhpcy5wcmVmaXguc3RhcnRzV2l0aCgnLycpID8gdGhpcy5wcmVmaXggOiAnLycgKyB0aGlzLnByZWZpeFxuICAgICAgICAgICAgICAgIHJvdXRlUGF0aCA9IG5vcm1hbGl6ZWRQcmVmaXggKyByb3V0ZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNvcnQga2V5IGZvciBwcmlvcml0aXphdGlvblxuICAgICAgICAgICAgbGV0IHNvcnRLZXkgPSAwXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENhdGNoLWFsbCByb3V0ZXMgc2hvdWxkIGNvbWUgbGFzdCAoaGlnaCBzb3J0IGtleSlcbiAgICAgICAgICAgIGlmIChyb3V0ZVBhdGguaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgICAgICAgIHNvcnRLZXkgKz0gMTAwMDAwMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDb3VudCBwYXJhbWV0ZXJzIChyb3V0ZXMgd2l0aCBmZXdlciBwYXJhbXMgY29tZSBmaXJzdClcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtQ291bnQgPSAocm91dGVQYXRoLm1hdGNoKC86L2cpIHx8IFtdKS5sZW5ndGhcbiAgICAgICAgICAgIHNvcnRLZXkgKz0gcGFyYW1Db3VudCAqIDEwMDAwXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvdW50IHNlZ21lbnRzIChyb3V0ZXMgd2l0aCBtb3JlIHNlZ21lbnRzIGNvbWUgZmlyc3QsIHNvIHdlIHN1YnRyYWN0KVxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudENvdW50ID0gcm91dGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKHMgPT4gcykubGVuZ3RoXG4gICAgICAgICAgICBzb3J0S2V5IC09IHNlZ21lbnRDb3VudCAqIDEwMFxuICAgICAgICAgICAgXG4gICAgICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIHNvcnRLZXksXG4gICAgICAgICAgICAgICAgbW9kdWxlOiB0aGlzLm1vZHVsZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFNvcnQgcm91dGVzIGJ5IHNwZWNpZmljaXR5IChsb3dlciBzb3J0S2V5ID0gbW9yZSBzcGVjaWZpYyA9IHJlZ2lzdGVyZWQgZmlyc3QpXG4gICAgICAgIHJvdXRlcy5zb3J0KChhLCBiKSA9PiBhLnNvcnRLZXkgLSBiLnNvcnRLZXkpXG5cbiAgICAgICAgdGhpcy5yb3V0ZXMgPSByb3V0ZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJSb3V0ZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5yb3V0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdSb3V0ZXIgaW5zdGFuY2Ugbm90IHNldCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2R1bGVOYW1lID0gdGhpcy5tb2R1bGUgfHwgJ3Vua25vd24nXG5cbiAgICAgICAgY29uc3QgaG9vayA9IGZ1bmN0aW9uKHJvdXRlOiBSb3V0ZSl7XG4gICAgICAgICAgICByb3V0ZS5tZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAuLi5yb3V0ZS5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvdXRlci5vbignYWRkZWQnLCBob29rKVxuXG4gICAgICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlTW9kdWxlID0gYXdhaXQgaW1wb3J0KGAke3RoaXMuZGlyZWN0b3J5fS8ke3JvdXRlLmZpbGV9YClcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZU1vZHVsZS5kZWZhdWx0XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFJvdXRlIGZpbGUgJHtyb3V0ZS5maWxlfSBkb2VzIG5vdCBleHBvcnQgYSBkZWZhdWx0IGZ1bmN0aW9uYClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvdXRlcltyb3V0ZS5tZXRob2RdKHJvdXRlLnJvdXRlUGF0aCwgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucm91dGVyLm9mZignYWRkZWQnLCBob29rKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCl7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsZXMoKVxuICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUm91dGVzKClcblxuICAgIH1cbn1cbiIsImltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCB0eXBlIHsgSGFuZGxlciwgIE1pZGRsZXdhcmUgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Sb3V0ZXJDb250cmFjdC50cydcblxudHlwZSBSb3V0ZU1ldGhvZCA9ICdnZXQnIFxuICAgIHwgJ0dFVCcgXG4gICAgfCAncG9zdCcgXG4gICAgfCAnUE9TVCcgXG4gICAgfCAncHV0JyBcbiAgICB8ICdQVVQnIFxuICAgIHwgJ3BhdGNoJyBcbiAgICB8ICdQQVRDSCcgXG4gICAgfCAnZGVsZXRlJyBcbiAgICB8ICdERUxFVEUnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlIHtcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nID0gJydcbiAgICBwdWJsaWMgbWV0aG9kOiBSb3V0ZU1ldGhvZCA9ICdnZXQnXG4gICAgcHVibGljIGhhbmRsZXI6IEhhbmRsZXI8YW55PiB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG1pZGRsZXdhcmVzOiBNaWRkbGV3YXJlW10gPSBbXVxuICAgIHB1YmxpYyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSB7fVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxSb3V0ZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnBhdGggPSBkYXRhLnBhdGggfHwgJydcbiAgICAgICAgdGhpcy5tZXRob2QgPSBkYXRhLm1ldGhvZCB8fCAnZ2V0J1xuICAgICAgICB0aGlzLmhhbmRsZXIgPSBkYXRhLmhhbmRsZXIgfHwgbnVsbFxuICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gZGF0YS5taWRkbGV3YXJlcyB8fCBbXVxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gZGF0YS5tZXRhZGF0YSB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGFyYW1zKHJvdXRlUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlUGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudHMgPSByZXF1ZXN0UGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gcm91dGVTZWdtZW50c1tpXVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSByZXF1ZXN0U2VnbWVudHNbaV1cblxuICAgICAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgLy8gUmVtb3ZlIHRoZSAnOicgcHJlZml4XG4gICAgICAgICAgICAgICAgcGFyYW1zW3BhcmFtTmFtZV0gPSByZXF1ZXN0U2VnbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIGFsbCByZW1haW5pbmcgc2VnbWVudHMgYXMgYSBzaW5nbGUgcGF0aFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1NlZ21lbnRzID0gcmVxdWVzdFNlZ21lbnRzLnNsaWNlKGkpXG4gICAgICAgICAgICAgICAgcGFyYW1zWycqJ10gPSByZW1haW5pbmdTZWdtZW50cy5qb2luKCcvJylcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtc1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcXVlcnkocmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcmVxdWVzdFBhdGguc3BsaXQoJz8nKVsxXVxuXG4gICAgICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgICAgICAgbWlkZGxld2FyZXM6IHRoaXMubWlkZGxld2FyZXMubWFwKG13ID0+IG13LmNvbnN0cnVjdG9yLm5hbWUpLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGFcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGpvaW4gfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgUm91dGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Sb3V0ZUVudGl0eS50cydcbmltcG9ydCB0eXBlIHsgSGFuZGxlciwgTWlkZGxld2FyZSwgTWlkZGxld2FyZUhhbmRsZVJlc3VsdCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBIb29rcyBmcm9tICcjc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzJ1xuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5cbnR5cGUgUm91dGVDb250ZXh0ID0gJ2dsb2JhbCcgfCAnZ3JvdXAnIHwgJ3JvdXRlJ1xuXG5pbnRlcmZhY2UgTWlkZGxld2FyZVJlZ2lzdGVyIHtcbiAgICBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlXG4gICAgY29udGV4dDogUm91dGVDb250ZXh0XG59XG5cbmludGVyZmFjZSBMb2FkT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlckV2ZW50cyB7XG4gICAgJ3JvdXRlcjpyZWdpc3RlcmVkJzoge1xuICAgICAgICByb3V0ZXI6IFJvdXRlclNlcnZpY2VcbiAgICB9XG4gICAgJ3JvdXRlcjpsb2FkZWQnOiB7XG4gICAgICAgIHJvdXRlcjogUm91dGVyU2VydmljZVxuICAgIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXJTZXJ2aWNlPEMgPSB7fT4gZXh0ZW5kcyBjb21wb3NlKEhvb2tzKSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnUm91dGVyU2VydmljZSdcblxuICAgIHB1YmxpYyByb3V0ZXM6IFJvdXRlW10gPSBbXVxuXG4gICAgcHVibGljIG1pZGRsZXdhcmVzOiBNaWRkbGV3YXJlUmVnaXN0ZXJbXSA9IFtdXG4gICAgcHVibGljIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBwdWJsaWMgZ3JvdXBzOiBSb3V0ZXJTZXJ2aWNlPGFueT5bXSA9IFtdXG4gICAgcHVibGljIGdyb3VwUHJlZml4ZXM6IHN0cmluZ1tdID0gW11cblxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlciA9IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICBwdWJsaWMgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxSb3V0ZXJTZXJ2aWNlPEM+PiA9IHt9KSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5yb3V0ZXMgPSBkYXRhLnJvdXRlcyB8fCBbXVxuICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gZGF0YS5taWRkbGV3YXJlcyB8fCBbXVxuICAgICAgICB0aGlzLnByZWZpeGVzID0gZGF0YS5wcmVmaXhlcyB8fCBbXVxuICAgICAgICB0aGlzLmdyb3VwcyA9IGRhdGEuZ3JvdXBzIHx8IFtdXG4gICAgICAgIHRoaXMuZ3JvdXBQcmVmaXhlcyA9IGRhdGEuZ3JvdXBQcmVmaXhlcyB8fCBbXVxuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gZGF0YS5tZXRhZGF0YSB8fCB7fVxuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IGRhdGEubGlzdGVuZXJzIHx8IFtdXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKSBcbiAgICB9XG5cbiAgICBwdWJsaWMgdXNlPFQgZXh0ZW5kcyBNaWRkbGV3YXJlPihtaWRkbGV3YXJlOiBULCBjb250ZXh0OiBSb3V0ZUNvbnRleHQgPSAncm91dGUnKSB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZXMucHVzaCh7XG4gICAgICAgICAgICBtaWRkbGV3YXJlLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpcyBhcyBSb3V0ZXJTZXJ2aWNlPEMgJiBNaWRkbGV3YXJlSGFuZGxlUmVzdWx0PFt0eXBlb2YgbWlkZGxld2FyZV0+PlxuICAgIH1cblxuICAgIHB1YmxpYyBwcmVmaXgocHJlZml4OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wcmVmaXhlcy5wdXNoKHByZWZpeClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBtYWtlUGF0aChhcmdzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gam9pbihbLi4udGhpcy5ncm91cFByZWZpeGVzLCAuLi50aGlzLnByZWZpeGVzLCBhcmdzXSwgJy8nKVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGQocGF5bG9hZDogUGljazxSb3V0ZSwgJ3BhdGgnIHwgJ21ldGhvZCcgfCAnaGFuZGxlcic+KSB7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gbmV3IFJvdXRlKHtcbiAgICAgICAgICAgIG1ldGhvZDogcGF5bG9hZC5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiB0aGlzLm1ha2VQYXRoKHBheWxvYWQucGF0aCksXG4gICAgICAgICAgICBoYW5kbGVyOiBwYXlsb2FkLmhhbmRsZXIsXG4gICAgICAgICAgICBtaWRkbGV3YXJlczogdGhpcy5taWRkbGV3YXJlcy5tYXAobSA9PiBtLm1pZGRsZXdhcmUpLFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWlkZGxld2FyZXMgPSB0aGlzLm1pZGRsZXdhcmVzLmZpbHRlcihtID0+IG0uY29udGV4dCAhPT0gJ3JvdXRlJylcblxuICAgICAgICB0aGlzLnByZWZpeGVzID0gW10gLy8gUmVzZXQgcHJlZml4ZXMgYWZ0ZXIgdXNlXG5cbiAgICAgICAgdGhpcy5yb3V0ZXMucHVzaChyb3V0ZSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FkZGVkIHJvdXRlJywgcm91dGUpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ2FkZGVkJywgcm91dGUpXG4gICAgfVxuXG4gICAgcHVibGljIGdldChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXI8Qz4pIHtcbiAgICAgICAgdGhpcy5hZGQoe1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwb3N0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPikge1xuICAgICAgICB0aGlzLmFkZCh7XG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwdXQocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KSB7XG4gICAgICAgIHRoaXMuYWRkKHtcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGF0Y2gocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KSB7XG4gICAgICAgIHRoaXMuYWRkKHtcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBtYW55KG1ldGhvZHM6IFJvdXRlWydtZXRob2QnXVtdLCBwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXI8Qz4pIHtcbiAgICAgICAgbWV0aG9kcy5mb3JFYWNoKG1ldGhvZCA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkZCh7XG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXI8Qz4pIHtcbiAgICAgICAgdGhpcy5hZGQoe1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICB9KVxuICAgIH1cblxuXG4gICAgcHVibGljIGdyb3VwKCkge1xuICAgICAgICBjb25zdCBncm91cCA9IG5ldyBSb3V0ZXJTZXJ2aWNlPEM+KHtcbiAgICAgICAgICAgIGxpc3RlbmVyczogdGhpcy5saXN0ZW5lcnMsIC8vIEluaGVyaXQgbGlzdGVuZXJzIGZyb20gcGFyZW50XG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyxcbiAgICAgICAgfSlcblxuICAgICAgICBncm91cC5ncm91cFByZWZpeGVzID0gdGhpcy5wcmVmaXhlcyAvLyBJbmhlcml0IHByZWZpeGVzIGZyb20gcGFyZW50XG4gICAgICAgIGdyb3VwLm1pZGRsZXdhcmVzID0gdGhpcy5taWRkbGV3YXJlcy5tYXAociA9PiAoe1xuICAgICAgICAgICAgbWlkZGxld2FyZTogci5taWRkbGV3YXJlLFxuICAgICAgICAgICAgY29udGV4dDogJ2dyb3VwJ1xuICAgICAgICB9KSlcblxuICAgICAgICB0aGlzLmdyb3Vwcy5wdXNoKGdyb3VwKVxuXG4gICAgICAgIHRoaXMubWlkZGxld2FyZXMgPSB0aGlzLm1pZGRsZXdhcmVzLmZpbHRlcihtID0+IG0uY29udGV4dCAhPT0gJ3JvdXRlJylcbiAgICAgICAgdGhpcy5wcmVmaXhlcyA9IFtdIC8vIFJlc2V0IHByZWZpeGVzIGFmdGVyIHVzZVxuXG4gICAgICAgIHJldHVybiBncm91cFxuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlKG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmxpc3QoKVxuICAgICAgICAgICAgLmZpbmQociA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHIubWV0aG9kLnRvVXBwZXJDYXNlKCkgIT09IG1ldGhvZC50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoUGF0aChyLnBhdGgsIHBhdGgpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGlmICghcm91dGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm91dGVcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZShyb3V0ZTogUm91dGUsIGluaXRpYWxDdHg6IGFueSkge1xuICAgICAgICBpZiAoIXJvdXRlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgaGFuZGxlciBub3QgZm91bmQgZm9yICR7cm91dGUubWV0aG9kfSAke3JvdXRlLnBhdGh9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHsgLi4uaW5pdGlhbEN0eCB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBtaWRkbGV3YXJlIG9mIHJvdXRlLm1pZGRsZXdhcmVzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtaWRkbGV3YXJlLmhhbmRsZShjdHgpXG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgJ3JlZGlyZWN0JyBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY3R4LCByZXN1bHQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm91dGUuaGFuZGxlcihjdHgpXG4gICAgfVxuXG4gICAgcHVibGljIG1hdGNoUGF0aChyb3V0ZVBhdGg6IHN0cmluZywgcmVxdWVzdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBTcGxpdCBwYXRocyBpbnRvIHNlZ21lbnRzXG4gICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudHMgPSByb3V0ZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnRzID0gcmVxdWVzdFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcblxuICAgICAgICAvLyBDaGVjayBlYWNoIHNlZ21lbnRcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2ldXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudCA9IHJlcXVlc3RTZWdtZW50c1tpXVxuXG4gICAgICAgICAgICAvLyBJZiByb3V0ZSBzZWdtZW50IGlzIGEgd2lsZGNhcmQgKCopLCBpdCBtYXRjaGVzIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHBvaW50XG4gICAgICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSd2ZSBydW4gb3V0IG9mIHJlcXVlc3Qgc2VnbWVudHMgYnV0IHN0aWxsIGhhdmUgcm91dGUgc2VnbWVudHMsIG5vIG1hdGNoXG4gICAgICAgICAgICBpZiAoaSA+PSByZXF1ZXN0U2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHJvdXRlIHNlZ21lbnQgaXMgYSBwYXJhbWV0ZXIgKHN0YXJ0cyB3aXRoIDopLCBpdCBtYXRjaGVzIGFueSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNlZ21lbnRzIG11c3QgbWF0Y2ggZXhhY3RseVxuICAgICAgICAgICAgaWYgKHJvdXRlU2VnbWVudCAhPT0gcmVxdWVzdFNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgbW9yZSByZXF1ZXN0IHNlZ21lbnRzIHRoYW4gcm91dGUgc2VnbWVudHMgKGFuZCBubyB3aWxkY2FyZCksIG5vIG1hdGNoXG4gICAgICAgIGlmIChyZXF1ZXN0U2VnbWVudHMubGVuZ3RoID4gcm91dGVTZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY2xlYXInLCB7IGNvdW50OiB0aGlzLnJvdXRlcy5sZW5ndGggfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucm91dGVzID0gW11cbiAgICAgICAgdGhpcy5ncm91cHMgPSBbXVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXMuY29uY2F0KC4uLnRoaXMuZ3JvdXBzLm1hcChnID0+IGcucm91dGVzKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zOiBMb2FkT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IHRoaXMuZGVidWdcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3NlcnZpY2UgbG9hZGVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRTeW5jKG9wdGlvbnM6IExvYWRPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Zygnc2VydmljZSBsb2FkZWQgaW4gZGVidWcgbW9kZScpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IFJvdXRlclNlcnZpY2UgZnJvbSAnLi9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IHR5cGUgUm91dGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Sb3V0ZUVudGl0eS50cydcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJSZWdpc3RlckVudHJ5IHtcbiAgICBmaWxlcGF0aDogc3RyaW5nXG4gICAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyUmVnaXN0ZXI8QyA9IHt9PiBleHRlbmRzIFJvdXRlclNlcnZpY2U8Qz4ge1xuICAgIHB1YmxpYyBmaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZXJSZWdpc3RlckVudHJ5PigpXG4gICAgcHVibGljIGRpcnMgPSBuZXcgTWFwPHN0cmluZywgUm91dGVyUmVnaXN0ZXJFbnRyeT4oKVxuICAgIFxuICAgIGNvbnN0cnVjdG9yKHJvdXRlcjogUGFydGlhbDxSb3V0ZXJTZXJ2aWNlPEM+PiA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHJvdXRlcilcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsZShmaWxlbmFtZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICBmaWxlcGF0aDogZmlsZW5hbWUsXG4gICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEgfHwge31cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnYWRkRW50cnknLCBlbnRyeSlcblxuICAgICAgICB0aGlzLmZpbGVzLnNldChmaWxlbmFtZSwgZW50cnkpXG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRGlyKGRpcm5hbWU6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgZmlsZXBhdGg6IGRpcm5hbWUsXG4gICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEgfHwge31cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnYWRkRW50cnknLCBlbnRyeSlcblxuICAgICAgICB0aGlzLmRpcnMuc2V0KGRpcm5hbWUsIGVudHJ5KVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEZpbGUoZW50cnk6IFJvdXRlclJlZ2lzdGVyRW50cnkpOiBQcm9taXNlPGJvb2xlYW4+IHsgICAgICAgIFxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZW50cnkuZmlsZXBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBGaWxlIG5vdCBmb3VuZDogJHtlbnRyeS5maWxlcGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBob29rID0gZnVuY3Rpb24ocm91dGU6IFJvdXRlKXtcbiAgICAgICAgICAgIHJvdXRlLm1ldGFkYXRhID0ge1xuICAgICAgICAgICAgICAgIC4uLnJvdXRlLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIC4uLmVudHJ5Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBlbnRyeS5maWxlcGF0aCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCB1bmFjaGVkID0gYCR7ZW50cnkuZmlsZXBhdGh9P3Q9JHtEYXRlLm5vdygpfWAgLy8gUHJldmVudCBjYWNoaW5nIGlzc3Vlc1xuXG4gICAgICAgIHRoaXMub24oJ2FkZGVkJywgaG9vaylcbiAgICBcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IGltcG9ydCh1bmFjaGVkKSlcblxuICAgICAgICB0aGlzLm9mZignYWRkZWQnLCBob29rKVxuICAgIFxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIGVudHJ5KVxuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZmFpbGVkIHRvIGxvYWQgZmlsZScsIGVycm9yKVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRGlyKGVudHJ5OiBSb3V0ZXJSZWdpc3RlckVudHJ5KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBjb25zdCBsb2FkZWQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpXG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGVudHJ5LmZpbGVwYXRoKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgRGlyZWN0b3J5IG5vdCBmb3VuZDogJHtlbnRyeS5maWxlcGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obG9hZGVkKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhlbnRyeS5maWxlcGF0aClcbiAgICAgICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0ZXN0IGZpbGVzXG4gICAgICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKSB8fCBmaWxlLmVuZHNXaXRoKCcuc3BlYy50cycpIHx8IGZpbGUuZW5kc1dpdGgoJy50ZXN0LmpzJykgfHwgZmlsZS5lbmRzV2l0aCgnLnNwZWMuanMnKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGVudHJ5LmZpbGVwYXRoLCBmaWxlKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgZmlsZVJvdXRlclJlZ2lzdGVyRW50cnkgPSB7IFxuICAgICAgICAgICAgICAgIGZpbGVwYXRoOiBmdWxsUGF0aCxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogZW50cnkubWV0YWRhdGEgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoYXdhaXQgdGhpcy5sb2FkRmlsZShmaWxlUm91dGVyUmVnaXN0ZXJFbnRyeSkpKSB7XG4gICAgICAgICAgICAgICAgbG9hZGVkLmFkZChmdWxsUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGxvYWRlZClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5maWxlcy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKChhd2FpdCB0aGlzLmxvYWRGaWxlKGUpKSkge1xuICAgICAgICAgICAgICAgIGxvYWRlZC5hZGQoZS5maWxlcGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZGlyIG9mIHRoaXMuZGlycy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgZGlyTG9hZGVkID0gYXdhaXQgdGhpcy5sb2FkRGlyKGRpcilcblxuICAgICAgICAgICAgZGlyTG9hZGVkLmZvckVhY2gocCA9PiBsb2FkZWQuYWRkKHApKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdsb2FkIGZpbGVzJywge1xuICAgICAgICAgICAgICAgIGZpbGVzOiBBcnJheS5mcm9tKGxvYWRlZCkubWFwKHAgPT4gcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwKSksXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gJy4vUm91dGVyU2VydmljZS50cydcbmltcG9ydCB0eXBlIHsgTWlkZGxld2FyZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBIb29rcyBmcm9tICcjc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzJ1xuaW1wb3J0IHR5cGUgUm91dGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Sb3V0ZUVudGl0eS50cydcbmltcG9ydCB0eXBlIHsgSHR0cENvbnRleHQgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9IdHRwQ29udGV4dENvbnRyYWN0LnRzJ1xuXG5leHBvcnQgdHlwZSBSZXNvdXJjZU1ldGhvZCA9ICdpbmRleCcgfCAnc2hvdycgfCAnc3RvcmUnIHwgJ3VwZGF0ZScgfCAnZGVzdHJveSdcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJSZXNvdXJjZU9wdGlvbnMge1xuICAgIG1pZGRsZXdhcmU/OiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZU1ldGhvZCB8ICdhbGwnLCBNaWRkbGV3YXJlPj5cbiAgICBleGNlcHQ/OiBSZXNvdXJjZU1ldGhvZFtdXG59XG5cbmNvbnN0IHJvdXRlcyA9IFtcbiAgICB7XG4gICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4JyxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgIGJlZm9yZTogWydiZWZvcmVJbmRleCddLFxuICAgICAgICAgICAgYWZ0ZXI6ICBbJ2FmdGVySW5kZXgnXSxcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgICBwYXRoOiAnLzppZCcsXG4gICAgICAgIGhhbmRsZXI6ICdzaG93JyxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgIGJlZm9yZTogWydiZWZvcmVTaG93J10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJTaG93J10sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgaGFuZGxlcjogJ3N0b3JlJyxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgIGJlZm9yZTogWydiZWZvcmVTdG9yZScsICdiZWZvcmVTYXZlJ10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJTdG9yZScsICdhZnRlclNhdmUnXSxcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBtZXRob2Q6ICdwdXQnLFxuICAgICAgICBwYXRoOiAnLzppZCcsXG4gICAgICAgIGhhbmRsZXI6ICd1cGRhdGUnLFxuICAgICAgICBob29rczoge1xuICAgICAgICAgICAgYmVmb3JlOiBbJ2JlZm9yZVVwZGF0ZScsICdiZWZvcmVTYXZlJ10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJVcGRhdGUnLCAnYWZ0ZXJTYXZlJ10sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbWV0aG9kOiAncGF0Y2gnLFxuICAgICAgICBwYXRoOiAnLzppZCcsXG4gICAgICAgIGhhbmRsZXI6ICd1cGRhdGUnLFxuICAgICAgICBob29rczoge1xuICAgICAgICAgICAgYmVmb3JlOiBbJ2JlZm9yZVVwZGF0ZScsICdiZWZvcmVTYXZlJ10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJVcGRhdGUnLCAnYWZ0ZXJTYXZlJ10sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbWV0aG9kOiAnZGVsZXRlJyxcbiAgICAgICAgcGF0aDogJy86aWQnLFxuICAgICAgICBoYW5kbGVyOiAnZGVzdHJveScsXG4gICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBiZWZvcmU6IFsnYmVmb3JlRGVzdHJveSddLFxuICAgICAgICAgICAgYWZ0ZXI6ICBbJ2FmdGVyRGVzdHJveSddLFxuICAgICAgICB9XG4gICAgfSxcbl1cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXJSZXNvdXJjZVNlcnZpY2UgZXh0ZW5kcyBjb21wb3NlKEhvb2tzKSB7XG4gICAgcHJpdmF0ZSBvcHRpb25zOiBSb3V0ZXJSZXNvdXJjZU9wdGlvbnNcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJvdXRlclJlc291cmNlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbmRleChjdHg6IEh0dHBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjdHggfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaG93KGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPGFueT4gIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjdHggfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdG9yZShjdHg6IEh0dHBDb250ZXh0KTogUHJvbWlzZTxhbnk+ICB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY3R4IH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPGFueT4gIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjdHggfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPGFueT4gIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjdHggfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHByaXZhdGUgd3JhcChcbiAgICAgICAgbWV0aG9kTmFtZTogJ2luZGV4JyB8ICdzaG93JyB8ICdzdG9yZScgfCAndXBkYXRlJyB8ICdkZXN0cm95JyxcbiAgICAgICAgYmVmb3JlOiBzdHJpbmdbXSxcbiAgICAgICAgYWZ0ZXI6IHN0cmluZ1tdLFxuICAgICkge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGN0eDogSHR0cENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlQWxsJywgY3R4KVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KGhvb2ssIGN0eClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpc1ttZXRob2ROYW1lXShjdHgpXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBhZnRlcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdChob29rLCBjdHgsIHJlc3VsdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgcmVnaXN0ZXIocm91dGVyOiBSb3V0ZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IHJvdXRlLm1ldGhvZCBhcyBSb3V0ZVsnbWV0aG9kJ11cbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSByb3V0ZS5oYW5kbGVyIGFzIFJlc291cmNlTWV0aG9kXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXhjZXB0ICYmIHRoaXMub3B0aW9ucy5leGNlcHQuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1pZGRsZXdhcmUgJiYgdGhpcy5vcHRpb25zLm1pZGRsZXdhcmVbJ2FsbCddKSB7XG4gICAgICAgICAgICAgICAgcm91dGVyLnVzZSh0aGlzLm9wdGlvbnMubWlkZGxld2FyZVsnYWxsJ10pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWlkZGxld2FyZSAmJiB0aGlzLm9wdGlvbnMubWlkZGxld2FyZVttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgICAgIHJvdXRlci51c2UodGhpcy5vcHRpb25zLm1pZGRsZXdhcmVbbWV0aG9kTmFtZV0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJvdXRlclttZXRob2RdKFxuICAgICAgICAgICAgICAgIHJvdXRlLnBhdGgsXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwKFxuICAgICAgICAgICAgICAgICAgICByb3V0ZS5oYW5kbGVyIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgcm91dGUuaG9va3M/LmJlZm9yZSB8fCBbXSxcbiAgICAgICAgICAgICAgICAgICAgcm91dGUuaG9va3M/LmFmdGVyIHx8IFtdLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBSb3V0ZXJSZXNvdXJjZVNlcnZpY2UgZnJvbSAnLi9Sb3V0ZXJSZXNvdXJjZVNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlclJlc291cmNlT3B0aW9ucyB9IGZyb20gJy4vUm91dGVyUmVzb3VyY2VTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBIdHRwQ29udGV4dCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHMnXG5pbXBvcnQgdHlwZSB7IENvbmZpZ01vZGVsIH0gZnJvbSAnI3NlcnZlci9taXhpbnMvTW9kZWxDb25maWdNaXhpbi50cydcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXJSZXNvdXJjZUNvbmZpZyBleHRlbmRzIFJvdXRlclJlc291cmNlU2VydmljZSB7XG4gICAgcHJpdmF0ZSBtb2RlbDogQ29uZmlnTW9kZWxcblxuICAgIGNvbnN0cnVjdG9yKG1vZGVsOiBDb25maWdNb2RlbCwgb3B0aW9uczogUm91dGVyUmVzb3VyY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucylcblxuICAgICAgICBpZiAoIW1vZGVsLl9faXNDb25maWdNb2RlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb3V0ZXJSZXNvdXJjZUNvbmZpZ1NlcnZpY2UgcmVxdWlyZXMgYSBDb25maWdNb2RlbCcpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWxcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2Uga25vdyB0aGlzIGlzIGNvcnJlY3QsIGJ1dCBUeXBlU2NyaXB0IGNhbid0IGluZmVyIGl0IFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgYXN5bmMgaW5kZXgoY3R4OiBIdHRwQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMubW9kZWwubGlzdCgpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtc1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNob3coY3R4OiBIdHRwQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpZCA9IGN0eC5wYXJhbXMuaWQhXG5cbiAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IHRoaXMubW9kZWwuZmluZE9yRmFpbChpZClcblxuICAgICAgICByZXR1cm4gaXRlbVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdG9yZShjdHg6IEh0dHBDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjdHgucmVxdWVzdC5ib2R5IGFzIGFueVxuXG4gICAgICAgIGF3YWl0IHRoaXMubW9kZWwuY3JlYXRlKGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXNvdXJjZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoY3R4OiBIdHRwQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpZCA9IGN0eC5wYXJhbXMuaWQhXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjdHgucmVxdWVzdC5ib2R5IGFzIGFueVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLm1vZGVsLnVwZGF0ZShpZCwgZGF0YSlcblxuICAgICAgICByZXR1cm4gdXBkYXRlZFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KGN0eDogSHR0cENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBjdHgucGFyYW1zLmlkIVxuXG4gICAgICAgIGF3YWl0IHRoaXMubW9kZWwuZGVzdHJveShpZClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEJhc2VFeGNlcHRpb24gfSBmcm9tIFwiI3NoYXJlZC9pbmRleC50c1wiO1xuaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tIFwia3lzZWx5XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VlZGVyRW50aXlEYXRhIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlZWRlckVudGl0eSB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBzb3VyY2U6IHN0cmluZyB8IG51bGxcbiAgICBwdWJsaWMgZmlsZW5hbWU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogU2VlZGVyRW50aXlEYXRhKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZVxuICAgICAgICB0aGlzLnNvdXJjZSA9IGRhdGEuc291cmNlXG4gICAgICAgIHRoaXMuZmlsZW5hbWUgPSBkYXRhLmZpbGVuYW1lXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJ1bihkYjogS3lzZWx5PGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KHRoaXMuZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBtb2QuZGVmYXVsdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFNlZWRlciAke3RoaXMubmFtZX0gZG9lcyBub3QgZXhwb3J0IGEgZnVuY3Rpb25gKVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbW9kLmRlZmF1bHQoZGIpXG4gICAgfVxuXG59XG5cbiIsImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgRW1taXR0ZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgU2VlZGVyRW50aXR5IGZyb20gJyNzZXJ2ZXIvZW50aXRpZXMvU2VlZGVyRW50aXR5LnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VlZGVyU291cmNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGRpcmVjdG9yeTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGaWx0ZXJzIHtcbiAgICBzb3VyY2U/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBuYW1lPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VlZGVyUmVzdWx0IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZyB8IG51bGw7XG4gICAgcmVzdWx0OiAnc3VjY2VzcycgfCAnZmFpbGVkJztcbiAgICBlcnJvcj86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWVkZXJFdmVudHMge1xuICAgICdzZWVkZXI6YmVmb3JlLXJ1bic6IHtcbiAgICAgICAgc2VlZGVyczogc3RyaW5nW107XG4gICAgfTtcbiAgICAnc2VlZGVyOmFmdGVyLXJ1bic6IHtcbiAgICAgICAgc2VlZGVyczogc3RyaW5nW107XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWVkZXJTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGI6IEt5c2VseTxhbnk+O1xuICAgIHNvdXJjZXM/OiBTZWVkZXJTb3VyY2VbXTtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgZW1taXR0ZXI/OiBFbW1pdHRlclNlcnZpY2U7XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWVlZGVyU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnU2VlZGVyU2VydmljZSdcblxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGVtbWl0dGVyOiBFbW1pdHRlclNlcnZpY2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRiOiBLeXNlbHk8YW55PlxuICAgIHB1YmxpYyBzb3VyY2VzOiBTZWVkZXJTb3VyY2VbXVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogU2VlZGVyU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuICAgICAgICB0aGlzLmVtbWl0dGVyID0gb3B0aW9ucy5lbW1pdHRlciB8fCBuZXcgRW1taXR0ZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIHRoaXMuZGIgPSBvcHRpb25zLmRiXG4gICAgICAgIHRoaXMuc291cmNlcyA9IG9wdGlvbnMuc291cmNlcyB8fCBbXVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRTb3VyY2Uoc291cmNlOiBTZWVkZXJTb3VyY2UpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VzLnB1c2goc291cmNlKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsaXN0U291cmNlKHNvdXJjZTogU2VlZGVyU291cmNlKSB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHNvdXJjZS5kaXJlY3RvcnkpXG4gICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmpzJywgJy50cycsICcubWpzJywgJy5tdHMnXVxuXG5cbiAgICAgICAgY29uc3QgaXRlbXM6IFNlZWRlckVudGl0eVtdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmICghZXh0ZW5zaW9ucy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoZW50cnkpKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHNvdXJjZS5kaXJlY3RvcnksIGVudHJ5KVxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHBhdGguYmFzZW5hbWUoZW50cnksIHBhdGguZXh0bmFtZShlbnRyeSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IG5ldyBTZWVkZXJFbnRpdHkoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UuaWQsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZ1bGxQYXRoLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXRlbXMucHVzaChlbnRpdHkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbGlzdChmaWx0ZXJzPzogTGlzdEZpbHRlcnMpIHtcbiAgICAgICAgbGV0IGl0ZW1zID0gW10gYXMgU2VlZGVyRW50aXR5W11cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVNlZWRlcnMgPSBhd2FpdCB0aGlzLmxpc3RTb3VyY2Uoc291cmNlKVxuXG4gICAgICAgICAgICBpdGVtcy5wdXNoKC4uLnNvdXJjZVNlZWRlcnMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVycz8uc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShmaWx0ZXJzLnNvdXJjZSkgPyBmaWx0ZXJzLnNvdXJjZSA6IFtmaWx0ZXJzLnNvdXJjZV1cblxuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLnNvdXJjZSAmJiBzb3VyY2VzLmluY2x1ZGVzKGkuc291cmNlKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJzPy5uYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IEFycmF5LmlzQXJyYXkoZmlsdGVycy5uYW1lKSA/IGZpbHRlcnMubmFtZSA6IFtmaWx0ZXJzLm5hbWVdXG5cbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gbmFtZXMuaW5jbHVkZXMoaS5uYW1lKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgYnkgbmFtZVxuICAgICAgICBpdGVtcy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBydW5TZWVkZXIoc2VlZGVyOiBTZWVkZXJFbnRpdHkpOiBQcm9taXNlPFNlZWRlclJlc3VsdD4ge1xuICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gc2VlZGVyLnJ1bih0aGlzLmRiKSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBmYWlsZWQgdG8gcnVuIHNlZWRlciAke3NlZWRlci5uYW1lfWAsIGVycm9yKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzZWVkZXIubmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogc2VlZGVyLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogc2VlZGVyLnNvdXJjZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgc2VlZGVyICR7c2VlZGVyLm5hbWV9IHJhbiBzdWNjZXNzZnVsbHlgKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBzZWVkZXIubmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBzZWVkZXIuZmlsZW5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IHNlZWRlci5zb3VyY2UsXG4gICAgICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJyxcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHVibGljIGFzeW5jIHJ1bihmaWx0ZXJzOiBMaXN0RmlsdGVycyAmIHsgc3RlcHM/OiBudW1iZXIgfSA9IHt9KTogUHJvbWlzZTxTZWVkZXJSZXN1bHRbXT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMubGlzdChmaWx0ZXJzKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1taXR0ZXIuZW1pdEFuZFdhaXQoJ3NlZWRlcjpiZWZvcmUtcnVuJywge1xuICAgICAgICAgICAgc2VlZGVyczogaXRlbXMubWFwKG0gPT4gbS5uYW1lKVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFNlZWRlclJlc3VsdFtdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuU2VlZGVyKHMpXG5cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpXG5cbiAgICAgICAgICAgIC8vIFN0b3Agb24gZmlyc3QgZmFpbHVyZVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1taXR0ZXIuZW1pdEFuZFdhaXQoJ3NlZWRlcjphZnRlci1ydW4nLCB7XG4gICAgICAgICAgICBzZWVkZXJzOiByZXN1bHRzLm1hcChtID0+IG0ubmFtZSksXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9XG59XG5cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2VzcydcbmltcG9ydCBsb2dnZXIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2xvZ2dlci50cydcbmltcG9ydCB0eXBlIExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IFNoZWxsRXhlY3B0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9TaGVsbEV4Y2VwdGlvbi50cydcblxuaW50ZXJmYWNlIENvbW1hbmRPcHRpb25zIHtcbiAgICBjd2Q/OiBzdHJpbmdcbiAgICBlbnY/OiBOb2RlSlMuUHJvY2Vzc0VudlxuICAgIHNoZWxsPzogYm9vbGVhblxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGVsbFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1NoZWxsU2VydmljZSdcblxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhblxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIHB1YmxpYyBpbml0KGRhdGE6IFBhcnRpYWw8U2hlbGxTZXJ2aWNlPiA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbG9nZ2VyLmNoaWxkKHsgbGFiZWw6ICdzaGVsbCcgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQgYW5kIHJldHVybiBhIHByb21pc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgY29tbWFuZChiaW46IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM6IENvbW1hbmRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oYmluLCBhcmdzLCB7XG4gICAgICAgICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICAgICAgICAgICAgc2hlbGw6IG9wdGlvbnMuc2hlbGwgPz8gdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbnY6IG9wdGlvbnMuZW52IHx8IHByb2Nlc3MuZW52XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBsZXQgZGF0YSA9ICcnXG5cbiAgICAgICAgICAgIGNoaWxkLnN0ZG91dD8ub24oJ2RhdGEnLCAoZCkgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGEgKz0gZC50b1N0cmluZygpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjaGlsZC5zdGRlcnI/Lm9uKCdkYXRhJywgKGQpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhICs9IGQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY2hpbGQub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY29tbWFuZCBleGVjdXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYENvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7Y29kZX1gXG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgYmluLFxuICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IGRhdGFcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBTaGVsbEV4ZWNwdGlvbihlcnJvck1lc3NhZ2UsIGRhdGEsIGJpbiwgYXJncykpXG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDb21tYW5kIGV4ZWN1dGlvbiBlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgYmluLFxuICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm4gdGhlIG91dHB1dCBhcyBhIHN0cmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZFdpdGhPdXRwdXQoYmluOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBDb21tYW5kT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdleGVjdXRpbmcgY29tbWFuZCcsIHtcbiAgICAgICAgICAgICAgICBiaW4sXG4gICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oYmluLCBhcmdzLCB7XG4gICAgICAgICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICAgICAgICAgICAgc2hlbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgZW52OiBvcHRpb25zLmVudiB8fCBwcm9jZXNzLmVudlxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbGV0IG91dHB1dCA9ICcnXG4gICAgICAgICAgICBsZXQgZXJyb3JPdXRwdXQgPSAnJ1xuXG4gICAgICAgICAgICBjaGlsZC5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gZGF0YS50b1N0cmluZygpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjaGlsZC5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBlcnJvck91dHB1dCArPSBkYXRhLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNoaWxkLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRwdXQudHJpbSgpKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBDb21tYW5kIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2NvZGV9OiAke2Vycm9yT3V0cHV0fWBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yT3V0cHV0XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBTaGVsbEV4ZWNwdGlvbihlcnJvck1lc3NhZ2UsIG91dHB1dCwgYmluLCBhcmdzKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ29tbWFuZCBleGVjdXRpb24gZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuaW1wb3J0IHR5cGUgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgeyBjcmVhdGVJZCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY3JlYXRlSWQudHMnXG5cbmltcG9ydCB0eXBlIHsgUGFnaW5hdGlvbiwgRmluZE1hbnlPcHRpb25zLCBQYWdpbmF0ZU9wdGlvbnMsIERlbGV0ZU1hbnlPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdSZXBvc2l0b3J5PFxuICAgIFRFbnRpdHkgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRPcHRpb25zID0gUmVjb3JkPHN0cmluZywgYW55PlxuPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBjb25maWc6IENvbmZpZ1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBrZXk6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHByaW1hcnlLZXk6IHN0cmluZyA9ICdpZCdcbiAgICApIHt9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0SXRlbXMoKTogVEVudGl0eVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmdldDxURW50aXR5W10+KHRoaXMua2V5LCBbXSlcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0SXRlbXMoaXRlbXM6IFRFbnRpdHlbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXQodGhpcy5rZXksIGl0ZW1zKVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBhbGxvdyBwYXNzaW5nIG9wdGlvbnMgZm9yIGZpbHRlcmluZyBpbiBzdWJjbGFzc2VzIFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgcXVlcnkob3B0aW9ucz86IFRPcHRpb25zKTogVEVudGl0eVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlbXMoKVxuICAgIH1cblxuICAgIGFzeW5jIGNvdW50KG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KG9wdGlvbnMpLmxlbmd0aFxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRNYW55KG9wdGlvbnM/OiBGaW5kTWFueU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMucXVlcnkob3B0aW9ucylcblxuICAgICAgICBpZiAob3B0aW9ucz8ub3JkZXJCeSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLm9yZGVyQnkpID8gb3B0aW9ucy5vcmRlckJ5IDogW29wdGlvbnMub3JkZXJCeV1cbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMub3JkZXJEaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLm9yZGVyRGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgOiBbb3B0aW9ucy5vcmRlckRpcmVjdGlvbiA/PyAnYXNjJ11cblxuICAgICAgICAgICAgaXRlbXMgPSBvcmRlckJ5KGl0ZW1zLCBmaWVsZHMsIGRpcmVjdGlvbnMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8ub2Zmc2V0KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLnNsaWNlKG9wdGlvbnMub2Zmc2V0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmxpbWl0KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLnNsaWNlKDAsIG9wdGlvbnMubGltaXQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBmaW5kT25lKG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLnF1ZXJ5KG9wdGlvbnMpXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zWzBdID8/IG51bGxcbiAgICB9XG5cbiAgICBhc3luYyBmaW5kQnlJZChpZDogc3RyaW5nLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5xdWVyeShvcHRpb25zKVxuXG4gICAgICAgIHJldHVybiBpdGVtcy5maW5kKGl0ZW0gPT4gKGl0ZW0gYXMgYW55KVt0aGlzLnByaW1hcnlLZXldID09PSBpZCkgPz8gbnVsbFxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRCeUlkT3JGYWlsKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy5maW5kQnlJZChpZCwgb3B0aW9ucylcblxuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdJdGVtIG5vdCBmb3VuZCcsIDQwNClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgYXN5bmMgcGFnaW5hdGUob3B0aW9ucz86IFBhZ2luYXRlT3B0aW9ucyAmIFRPcHRpb25zKTogUHJvbWlzZTxQYWdpbmF0aW9uPFRFbnRpdHk+PiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBvcHRpb25zPy5wYWdlID8/IDFcbiAgICAgICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCA/PyAxMFxuICAgICAgICBjb25zdCBvZmZzZXQgPSAocGFnZSAtIDEpICogbGltaXRcblxuICAgICAgICBjb25zdCBbaXRlbXMsIHRvdGFsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuZmluZE1hbnkoeyAuLi5vcHRpb25zLCBsaW1pdCwgb2Zmc2V0IH0gYXMgYW55KSxcbiAgICAgICAgICAgIHRoaXMuY291bnQob3B0aW9ucyBhcyBhbnkpLFxuICAgICAgICBdKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICBwZXJfcGFnZTogbGltaXQsXG4gICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgIHRvdGFsX3BhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGUoZGF0YTogUGFydGlhbDxURW50aXR5Pik6IFByb21pc2U8VEVudGl0eT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgICAgICBbdGhpcy5wcmltYXJ5S2V5XTogY3JlYXRlSWQoKSxcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgIH0gYXMgVEVudGl0eVxuXG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgdGhpcy5zZXRJdGVtcyhpdGVtcylcblxuICAgICAgICByZXR1cm4gaXRlbVxuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZU1hbnkoZGF0YTogUGFydGlhbDxURW50aXR5PltdKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKClcblxuICAgICAgICBjb25zdCBjcmVhdGVkID0gZGF0YS5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgW3RoaXMucHJpbWFyeUtleV06IGNyZWF0ZUlkKCksXG4gICAgICAgICAgICAuLi5kLFxuICAgICAgICB9IGFzIFRFbnRpdHkpKVxuXG4gICAgICAgIHRoaXMuc2V0SXRlbXMoWy4uLml0ZW1zLCAuLi5jcmVhdGVkXSlcblxuICAgICAgICByZXR1cm4gY3JlYXRlZFxuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZUJ5SWQoaWQ6IHN0cmluZywgZGF0YTogUGFydGlhbDxURW50aXR5Pik6IFByb21pc2U8VEVudGl0eT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKVxuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleChpdGVtID0+IChpdGVtIGFzIGFueSlbdGhpcy5wcmltYXJ5S2V5XSA9PT0gaWQpXG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0l0ZW0gbm90IGZvdW5kJywgNDA0KVxuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXNbaW5kZXhdID0geyAuLi5pdGVtc1tpbmRleF0sIC4uLmRhdGEgfVxuICAgICAgICB0aGlzLnNldEl0ZW1zKGl0ZW1zKVxuXG4gICAgICAgIHJldHVybiBpdGVtc1tpbmRleF1cbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVCeUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kQnlJZE9yRmFpbChpZClcblxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKS5maWx0ZXIoaXRlbSA9PiAoaXRlbSBhcyBhbnkpW3RoaXMucHJpbWFyeUtleV0gIT09IGlkKVxuXG4gICAgICAgIHRoaXMuc2V0SXRlbXMoaXRlbXMpXG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlTWFueShvcHRpb25zPzogRGVsZXRlTWFueU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IHRoaXMucXVlcnkob3B0aW9ucyBhcyBhbnkpXG4gICAgICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQgPz8gdG9EZWxldGUubGVuZ3RoXG4gICAgICAgIGNvbnN0IHRvRGVsZXRlSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgIHRvRGVsZXRlLnNsaWNlKDAsIGxpbWl0KS5tYXAoaXRlbSA9PiAoaXRlbSBhcyBhbnkpW3RoaXMucHJpbWFyeUtleV0pXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCByZW1haW5pbmcgPSB0aGlzLmdldEl0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gIXRvRGVsZXRlSWRzLmhhcygoaXRlbSBhcyBhbnkpW3RoaXMucHJpbWFyeUtleV0pKVxuXG4gICAgICAgIHRoaXMuc2V0SXRlbXMocmVtYWluaW5nKVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbjxUID0gYW55PiB7XG4gICAgaXRlbXM6IFRbXVxuICAgIHBhZ2U6IG51bWJlclxuICAgIHBlcl9wYWdlOiBudW1iZXJcbiAgICB0b3RhbDogbnVtYmVyXG4gICAgdG90YWxfcGFnZXM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRNYW55T3B0aW9ucyB7XG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvZmZzZXQ/OiBudW1iZXJcbiAgICBvcmRlckJ5Pzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBvcmRlckRpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnIHwgKCdhc2MnIHwgJ2Rlc2MnKVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVPcHRpb25zIHtcbiAgICBwYWdlPzogbnVtYmVyXG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckJ5PzogRmluZE1hbnlPcHRpb25zWydvcmRlckJ5J11cbiAgICBvcmRlckRpcmVjdGlvbj86IEZpbmRNYW55T3B0aW9uc1snb3JkZXJEaXJlY3Rpb24nXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZU1hbnlPcHRpb25zIHtcbiAgICBsaW1pdD86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhYmFzZVJlcG9zaXRvcnk8XG4gICAgVEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVFByaW1hcnlLZXkgPSBhbnksXG4gICAgVE9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIGRiOiBLeXNlbHk8YW55PiwgXG4gICAgICAgIHByb3RlY3RlZCB0YWJsZTogc3RyaW5nLCBcbiAgICAgICAgcHJvdGVjdGVkIHByaW1hcnlLZXk6IHN0cmluZ1xuICAgICkgeyAgICB9XG5cblxuICAgIHB1YmxpYyBxdWVyeShvcHRpb25zPzogeyBxYj86IGFueSB9ICYgVE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcWIgPSBvcHRpb25zPy5xYiB8fCB0aGlzLmRiLnNlbGVjdEZyb20odGhpcy50YWJsZSBhcyBhbnkpXG5cbiAgICAgICAgcmV0dXJuIHFiXG4gICAgfVxuXG4gICAgYXN5bmMgY291bnQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgbGV0IHFiID0gdGhpcy5xdWVyeShvcHRpb25zIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi5zZWxlY3QoKGViOiBhbnkpID0+IGViLmZuLmNvdW50QWxsKCkuYXMoJ2NvdW50JykpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuXG4gICAgICAgIHJldHVybiBOdW1iZXIocmVzdWx0LmNvdW50KVxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRNYW55KG9wdGlvbnM/OiBGaW5kTWFueU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkob3B0aW9ucykgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi5zZWxlY3RBbGwoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5saW1pdCkge1xuICAgICAgICAgICAgcWIgPSBxYi5saW1pdChvcHRpb25zLmxpbWl0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lm9mZnNldCkge1xuICAgICAgICAgICAgcWIgPSBxYi5vZmZzZXQob3B0aW9ucy5vZmZzZXQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8ub3JkZXJCeSkge1xuICAgICAgICAgICAgY29uc3Qgb3JkZXJCeSA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcmRlckJ5KSA/IG9wdGlvbnMub3JkZXJCeSA6IFtvcHRpb25zLm9yZGVyQnldXG4gICAgICAgICAgICBjb25zdCBvcmRlckRpcmVjdGlvbiA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcmRlckRpcmVjdGlvbikgPyBvcHRpb25zLm9yZGVyRGlyZWN0aW9uIDogW29wdGlvbnMub3JkZXJEaXJlY3Rpb24gPz8gJ2FzYyddXG5cbiAgICAgICAgICAgIG9yZGVyQnkuZm9yRWFjaCgob2IsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcWIgPSBxYi5vcmRlckJ5KG9iLCBvcmRlckRpcmVjdGlvbltpbmRleF0gfHwgJ2FzYycpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHFiLmV4ZWN1dGUoKVxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRPbmUob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgICAgICBsZXQgcWIgPSB0aGlzLnF1ZXJ5KG9wdGlvbnMgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnNlbGVjdEFsbCgpXG5cbiAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IHFiLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgYXN5bmMgZmluZEJ5SWQoaWQ6IFRQcmltYXJ5S2V5LCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkob3B0aW9ucyBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIuc2VsZWN0QWxsKClcblxuICAgICAgICBxYiA9IHFiLndoZXJlKHRoaXMucHJpbWFyeUtleSwgJz0nLCBpZClcblxuICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9XG5cbiAgICBhc3luYyBmaW5kQnlJZE9yRmFpbChpZDogVFByaW1hcnlLZXksIG9wdGlvbnM/OiBUT3B0aW9ucykge1xuICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy5maW5kQnlJZChpZCwgb3B0aW9ucylcblxuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdJdGVtIG5vdCBmb3VuZCcsIDQwNClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHBhZ2luYXRlKG9wdGlvbnM/OiBQYWdpbmF0ZU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8UGFnaW5hdGlvbj4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSA/PyAxXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IChwYWdlIC0gMSkgKiAob3B0aW9ucz8ubGltaXQgPz8gMTApXG4gICAgICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQgPz8gMTBcblxuICAgICAgICBjb25zdCBmaW5kQWxsT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIG9mZnNldFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRPcHRpb25zID0geyAuLi5vcHRpb25zIH1cblxuICAgICAgICBjb25zdCBbaXRlbXMsIHRvdGFsSXRlbXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy5maW5kTWFueShmaW5kQWxsT3B0aW9ucyBhcyBhbnkpLFxuICAgICAgICAgICAgdGhpcy5jb3VudChjb3VudE9wdGlvbnMgYXMgYW55KVxuICAgICAgICBdKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICBwZXJfcGFnZTogbGltaXQsXG4gICAgICAgICAgICB0b3RhbDogdG90YWxJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsX3BhZ2VzOiBNYXRoLmNlaWwodG90YWxJdGVtcyAvIGxpbWl0KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+KSB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMuZGIuaW5zZXJ0SW50byh0aGlzLnRhYmxlIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi52YWx1ZXMoZGF0YSkucmV0dXJuaW5nQWxsKClcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgICAgICByZXR1cm4gcmVzdWx0IGFzIGFueVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjcmVhdGVNYW55KGRhdGE6IFBhcnRpYWw8VEVudGl0eT5bXSkge1xuICAgICAgICBsZXQgcWIgPSB0aGlzLmRiLmluc2VydEludG8odGhpcy50YWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIudmFsdWVzKGRhdGEpLnJldHVybmluZ0FsbCgpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcWIuZXhlY3V0ZSgpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBhbnlbXVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGVCeUlkKGlkOiBUUHJpbWFyeUtleSwgZGF0YTogUGFydGlhbDxURW50aXR5Pikge1xuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmZpbmRCeUlkT3JGYWlsKGlkKVxuXG4gICAgICAgIGxldCBxYiA9IHRoaXMuZGIudXBkYXRlVGFibGUodGhpcy50YWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIuc2V0KGRhdGEpXG4gICAgICAgICAgICAud2hlcmUodGhpcy5wcmltYXJ5S2V5LCAnPScsIHJvd1t0aGlzLnByaW1hcnlLZXldKVxuICAgICAgICAgICAgLnJldHVybmluZ0FsbCgpXG5cbiAgICAgICAgYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbGV0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5KSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuZmluZEJ5SWRPckZhaWwoaWQpXG5cbiAgICAgICAgbGV0IHFiID0gdGhpcy5kYi5kZWxldGVGcm9tKHRoaXMudGFibGUgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLndoZXJlKHRoaXMucHJpbWFyeUtleSwgJz0nLCByb3dbdGhpcy5wcmltYXJ5S2V5XSlcblxuICAgICAgICBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0KClcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVNYW55KG9wdGlvbnM/OiBEZWxldGVNYW55T3B0aW9ucyAmIFRPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgcWI6IHRoaXMuZGIuZGVsZXRlRnJvbSh0aGlzLnRhYmxlIGFzIGFueSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkoZGVsZXRlT3B0aW9ucyBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5saW1pdCkge1xuICAgICAgICAgICAgcWIgPSBxYi5saW1pdChvcHRpb25zLmxpbWl0KVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgcWIuZXhlY3V0ZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgdHlwZSB7IE1ldGFkYXRhUXVlcnlQYXlsb2FkIH0gZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVF1ZXJ5U2VydmljZS50cydcbmltcG9ydCBNZXRhZGF0YVF1ZXJ5U2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL01ldGFkYXRhUXVlcnlTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgRmlsZUVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0ZpbGVFbnRpdHkudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlcG9zaXRvcnlRdWVyeU9wdGlvbnMge1xuICAgIGlkPzogbnVtYmVyIHwgbnVtYmVyW11cbiAgICBzZWFyY2g/OiBzdHJpbmdcbiAgICBwdXJwb3NlPzogc3RyaW5nW11cbiAgICBjbGllbnRfbmFtZT86IHN0cmluZ1tdXG4gICAgbWV0YXM/OiBNZXRhZGF0YVF1ZXJ5UGF5bG9hZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlUmVwb3NpdG9yeSBleHRlbmRzIERhdGFiYXNlUmVwb3NpdG9yeTxcbiAgICBGaWxlRW50aXR5LFxuICAgIEZpbGVFbnRpdHlbJ2lkJ10sXG4gICAgRmlsZVJlcG9zaXRvcnlRdWVyeU9wdGlvbnNcbj4ge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICdmaWxlcycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM/OiBGaWxlUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucykge1xuICAgICAgICBsZXQgcWIgPSBzdXBlci5xdWVyeShvcHRpb25zIGFzIGFueSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pZCkgPyBvcHRpb25zLmlkIDogW29wdGlvbnMuaWRdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2lkJywgJ2luJywgaWRzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnNlYXJjaCkge1xuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnZi5jbGllbnRfbmFtZScsICdsaWtlJywgYCUke29wdGlvbnMuc2VhcmNofSVgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnB1cnBvc2U/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnZi5wdXJwb3NlJywgJ2luJywgb3B0aW9ucy5wdXJwb3NlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmNsaWVudF9uYW1lPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2YuY2xpZW50X25hbWUnLCAnaW4nLCBvcHRpb25zLmNsaWVudF9uYW1lKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1ldGFzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhc1F1ZXJ5U2VydmljZSA9IG5ldyBNZXRhZGF0YVF1ZXJ5U2VydmljZShvcHRpb25zLm1ldGFzLCAnZmlsZV9tZXRhcycsICdmaWxlX2lkJylcblxuICAgICAgICAgICAgcWIgPSBtZXRhc1F1ZXJ5U2VydmljZS5hcHBseShxYilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxYlxuICAgIH1cbn1cbiIsImltcG9ydCBEYXRhYmFzZVJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uQXNzaWdubWVudCB9IGZyb20gJyNzaGFyZWQvc2NoZW1hcy9wZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYS50cydcblxuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnlRdWVyeU9wdGlvbnMge1xuICAgIGlkPzogbnVtYmVyIHwgbnVtYmVyW11cbiAgICBwZXJtaXNzaW9uSWQ/OiBudW1iZXIgfCBudW1iZXJbXVxuICAgIGFzc2lnbmFibGVJZD86IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgYXNzaWduYWJsZVR5cGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkgZXh0ZW5kcyBEYXRhYmFzZVJlcG9zaXRvcnk8XG4gICAgUGVybWlzc2lvbkFzc2lnbm1lbnQsXG4gICAgUGVybWlzc2lvbkFzc2lnbm1lbnRbJ2lkJ10sXG4gICAgUGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5UXVlcnlPcHRpb25zXG4+IHtcbiAgICBjb25zdHJ1Y3RvcihkYjogRGF0YWJhc2VSZXBvc2l0b3J5WydkYiddKSB7XG4gICAgICAgIHN1cGVyKGRiLCAncGVybWlzc2lvbnNfYXNzaWdubWVudHMnLCAnaWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBxdWVyeShvcHRpb25zPzogUGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5UXVlcnlPcHRpb25zKSB7XG4gICAgICAgIGxldCBxYiA9IHN1cGVyLnF1ZXJ5KG9wdGlvbnMgYXMgYW55KVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pZCkge1xuICAgICAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmlkKSA/IG9wdGlvbnMuaWQgOiBbb3B0aW9ucy5pZF1cblxuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnaWQnLCAnaW4nLCBpZHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8ucGVybWlzc2lvbklkKSB7XG4gICAgICAgICAgICBjb25zdCBwZXJtaXNzaW9uSWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnBlcm1pc3Npb25JZCkgPyBvcHRpb25zLnBlcm1pc3Npb25JZCA6IFtvcHRpb25zLnBlcm1pc3Npb25JZF1cblxuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgncGVybWlzc2lvbl9pZCcsICdpbicsIHBlcm1pc3Npb25JZHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uYXNzaWduYWJsZUlkKSB7XG4gICAgICAgICAgICBjb25zdCBhc3NpZ25hYmxlSWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmFzc2lnbmFibGVJZCkgPyBvcHRpb25zLmFzc2lnbmFibGVJZCA6IFtvcHRpb25zLmFzc2lnbmFibGVJZF1cblxuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnYXNzaWduYWJsZV9pZCcsICdpbicsIGFzc2lnbmFibGVJZHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uYXNzaWduYWJsZVR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbmFibGVUeXBlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5hc3NpZ25hYmxlVHlwZSkgPyBvcHRpb25zLmFzc2lnbmFibGVUeXBlIDogW29wdGlvbnMuYXNzaWduYWJsZVR5cGVdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2Fzc2lnbmFibGVfdHlwZScsICdpbicsIGFzc2lnbmFibGVUeXBlcylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxYlxuICAgIH1cbn1cbiIsImltcG9ydCBEYXRhYmFzZVJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uIH0gZnJvbSAnI3NoYXJlZC9zY2hlbWFzL3Blcm1pc3Npb25TY2hlbWEudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvblJlcG9zaXRvcnlRdWVyeU9wdGlvbnMge1xuICAgIGlkPzogbnVtYmVyIHwgbnVtYmVyW11cbiAgICBzZWFyY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvblJlcG9zaXRvcnkgZXh0ZW5kcyBEYXRhYmFzZVJlcG9zaXRvcnk8XG4gICAgUGVybWlzc2lvbixcbiAgICBQZXJtaXNzaW9uWydpZCddLFxuICAgIFBlcm1pc3Npb25SZXBvc2l0b3J5UXVlcnlPcHRpb25zXG4+IHtcbiAgICBjb25zdHJ1Y3RvcihkYjogRGF0YWJhc2VSZXBvc2l0b3J5WydkYiddKSB7XG4gICAgICAgIHN1cGVyKGRiLCAncGVybWlzc2lvbnMnLCAnaWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBxdWVyeShvcHRpb25zPzogUGVybWlzc2lvblJlcG9zaXRvcnlRdWVyeU9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHFiID0gc3VwZXIucXVlcnkob3B0aW9ucyBhcyBhbnkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmlkKSB7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaWQpID8gb3B0aW9ucy5pZCA6IFtvcHRpb25zLmlkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdpZCcsICdpbicsIGlkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zZWFyY2gpIHtcbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ25hbWUnLCAnbGlrZScsIGAlJHtvcHRpb25zLnNlYXJjaH0lYClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxYlxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRmluZE1hbnlPcHRpb25zLCBQYWdpbmF0ZU9wdGlvbnMsIFBhZ2luYXRpb24gfSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZXBvc2l0b3J5VHlwZXM8VEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sIFRQcmltYXJ5S2V5VHlwZSA9IGFueSwgVE9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY291bnQob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+XG5cbiAgICBmaW5kTWFueShvcHRpb25zPzogVE9wdGlvbnMgJiBGaW5kTWFueU9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHlbXT5cbiAgICBmaW5kQnlJZChpZDogVFByaW1hcnlLZXlUeXBlLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPlxuICAgIGZpbmRCeUlkT3JGYWlsKGlkOiBUUHJpbWFyeUtleVR5cGUsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eT5cblxuICAgIHBhZ2luYXRlKG9wdGlvbnM/OiBUT3B0aW9ucyAmIFBhZ2luYXRlT3B0aW9ucyk6IFByb21pc2U8UGFnaW5hdGlvbj5cblxuICAgIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+LCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHk+XG4gICAgY3JlYXRlTWFueShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+W10sIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPiBcblxuICAgIGRlbGV0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5VHlwZSk6IFByb21pc2U8dm9pZD5cbiAgICBkZXN0cm95TWFueShvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERhdGFiYXNlUmVwb3NpdG9yeUluZmVyTWl4aW48VEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sIFRQcmltYXJ5S2V5VHlwZSA9IGFueSwgVE9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIGFic3RyYWN0IGNsYXNzIE9wdGlvbnNNaXhpbiBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgLy8gV2UgXCJkZWNsYXJlXCIgdGhlc2UgbWV0aG9kcyBzbyB0aGV5IGV4aXN0IGluIHRoZSB0eXBlIHNwYWNlXG4gICAgICAgICAgICAvLyBmb3IgdGhpcyBzcGVjaWZpYyBUT3B0aW9ucywgd2l0aG91dCBvdmVycmlkaW5nIHRoZSBsb2dpYy5cbiAgICAgICAgICAgIGFic3RyYWN0IGNvdW50KG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPlxuXG4gICAgICAgICAgICBhYnN0cmFjdCBmaW5kTWFueShvcHRpb25zPzogVE9wdGlvbnMgJiBGaW5kTWFueU9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHlbXT5cbiAgICAgICAgICAgIGFic3RyYWN0IGZpbmRCeUlkKGlkOiBUUHJpbWFyeUtleVR5cGUsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+XG4gICAgICAgICAgICBhYnN0cmFjdCBmaW5kQnlJZE9yRmFpbChpZDogVFByaW1hcnlLZXlUeXBlLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHk+XG5cbiAgICAgICAgICAgIGFic3RyYWN0IHBhZ2luYXRlKG9wdGlvbnM/OiBUT3B0aW9ucyAmIFBhZ2luYXRlT3B0aW9ucyk6IFByb21pc2U8eyBpdGVtczogVEVudGl0eVtdOyB0b3RhbDogbnVtYmVyIH0+XG5cbiAgICAgICAgICAgIGFic3RyYWN0IGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+LCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHk+XG4gICAgICAgICAgICBhYnN0cmFjdCBjcmVhdGVNYW55KGRhdGE6IFBhcnRpYWw8VEVudGl0eT5bXSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5W10+XG5cbiAgICAgICAgICAgIGFic3RyYWN0IGRlbGV0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5VHlwZSk6IFByb21pc2U8dm9pZD5cbiAgICAgICAgICAgIGFic3RyYWN0IGRlc3Ryb3lNYW55KG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8dm9pZD5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBPcHRpb25zTWl4aW4gYXMgVEJhc2UgJiBDb25zdHJ1Y3RvcjxJUmVwb3NpdG9yeVR5cGVzPFRFbnRpdHksIFRQcmltYXJ5S2V5VHlwZSwgVE9wdGlvbnM+PlxuICAgIH1cbn1cbiIsImltcG9ydCBEYXRhYmFzZVJlcG9zaXRvcnlJbmZlciBmcm9tICcjc2VydmVyL21peGlucy9EYXRhYmFzZVJlcG9zaXRvcnlJbmZlck1peGluLnRzJ1xuaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvaW5kZXgudHMnXG5pbXBvcnQgdHlwZSB7IFRva2VuIH0gZnJvbSAnI3NoYXJlZC9zY2hlbWFzL3Rva2VuU2NoZW1hLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucyB7XG4gICAgaWQ/OiBudW1iZXIgfCBudW1iZXJbXVxuICAgIHNlYXJjaD86IHN0cmluZyBcbiAgICB0eXBlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5SZXBvc2l0b3J5IGV4dGVuZHMgY29tcG9zZShcbiAgICBtaXhpbihEYXRhYmFzZVJlcG9zaXRvcnkpLFxuICAgIERhdGFiYXNlUmVwb3NpdG9yeUluZmVyPFRva2VuLCBUb2tlblsnaWQnXSwgVG9rZW5SZXBvc2l0b3J5UXVlcnlPcHRpb25zPigpXG4pIHtcblxuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICd0b2tlbnMnLCAnaWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBxdWVyeShvcHRpb25zPzogVG9rZW5SZXBvc2l0b3J5UXVlcnlPcHRpb25zKSB7XG4gICAgICAgIGxldCBxYiA9IHN1cGVyLnF1ZXJ5KG9wdGlvbnMgYXMgYW55KVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pZCkge1xuICAgICAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmlkKSA/IG9wdGlvbnMuaWQgOiBbb3B0aW9ucy5pZF1cblxuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnaWQnLCAnaW4nLCBpZHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc2VhcmNoKSB7XG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCduYW1lJywgJ2xpa2UnLCBgJSR7b3B0aW9ucy5zZWFyY2h9JWApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8udHlwZSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkgPyBvcHRpb25zLnR5cGUgOiBbb3B0aW9ucy50eXBlXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCd0eXBlJywgJ2luJywgdHlwZXMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcWJcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEJ5VG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8VG9rZW4gfCBudWxsPiB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkoKSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnNlbGVjdEFsbCgpXG5cbiAgICAgICAgcWIgPSBxYi53aGVyZSgndG9rZW4nLCAnPScsIHRva2VuKVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgICAgICByZXR1cm4gaXRlbSB8fCBudWxsXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBVc2VyVGFibGUgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcuL0RhdGFiYXNlUmVwb3NpdG9yeSdcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucyB7XG4gICAgZW1haWw/OiBzdHJpbmdcbiAgICB1c2VybmFtZT86IHN0cmluZ1xuICAgIGlkPzogbnVtYmVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJSZXBvc2l0b3J5IGV4dGVuZHMgRGF0YWJhc2VSZXBvc2l0b3J5PFVzZXJUYWJsZSwgc3RyaW5nLCBVc2VyUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucz4ge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICd1c2VycycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM6IFVzZXJSZXBvc2l0b3J5UXVlcnlPcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gc3VwZXIucXVlcnkob3B0aW9ucylcblxuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKCdkZWxldGVkX2F0JywgJ2lzJywgbnVsbClcblxuICAgICAgICAvLyBBcHBseSBvcHRpb25zXG4gICAgICAgIGlmIChvcHRpb25zPy5lbWFpbCkge1xuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgnZW1haWwnLCAnPScsIG9wdGlvbnMuZW1haWwpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8udXNlcm5hbWUpIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3VzZXJuYW1lJywgJ2xpa2UnLCBgJSR7b3B0aW9ucy51c2VybmFtZX0lYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pZCkge1xuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgnaWQnLCAnPScsIG9wdGlvbnMuaWQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXVlcnlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBleGVjIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgd3JpdGVGaWxlLCB1bmxpbmsgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcblxuY29uc3QgZXhlY0FzeW5jID0gcHJvbWlzaWZ5KGV4ZWMpXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0UmVwb0luZm8ge1xuICAgIGRpcmVjdG9yeTogc3RyaW5nXG4gICAgaGVhZDogc3RyaW5nIHwgbnVsbFxuICAgIHNob3J0SGFzaDogc3RyaW5nXG4gICAgaXNEZXRhY2hlZEhlYWQ6IGJvb2xlYW5cbiAgICByZW1vdGVzOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEdhdGV3YXlPcHRpb25zIHtcbiAgICBjd2Q6IHN0cmluZ1xuICAgIHNzaEtleT86IHN0cmluZ1xuICAgIHNzaEtleUZpbGU/OiBzdHJpbmdcbiAgICBzc2hLZXlUbXBGaWxlTmFtZT86IHN0cmluZ1xuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gZXNjYXBlU2hlbGxBcmd1bWVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCcke3ZhbHVlLnJlcGxhY2UoLycvZywgYCdcXFxcJydgKX0nYFxufVxuXG5leHBvcnQgY2xhc3MgR2l0R2F0ZXdheSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjd2Q6IHN0cmluZ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3NoS2V5Pzogc3RyaW5nXG4gICAgcHJpdmF0ZSByZWFkb25seSBzc2hLZXlGaWxlPzogc3RyaW5nXG4gICAgcHJpdmF0ZSByZWFkb25seSBzc2hLZXlUbXBGaWxlTmFtZT86IHN0cmluZ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlID0gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVidWc6IGJvb2xlYW5cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEdhdGV3YXlPcHRpb25zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkRW52KCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzc2hLZXlGaWxlOiB1bmRlZmluZWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICAgIGNsZWFudXA6IGFzeW5jICgpID0+IHsgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNzaEtleUZpbGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbnYuR0lUX1NTSF9DT01NQU5EID0gYHNzaCAtaSAke2VzY2FwZVNoZWxsQXJndW1lbnQodGhpcy5zc2hLZXlGaWxlKX0gLW8gU3RyaWN0SG9zdEtleUNoZWNraW5nPW5vYFxuICAgICAgICAgICAgcmVzdWx0LnNzaEtleUZpbGUgPSB0aGlzLnNzaEtleUZpbGVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNzaEtleSkge1xuICAgICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSB0aGlzLnNzaEtleVRtcEZpbGVOYW1lID8/IGpvaW4odG1wZGlyKCksIGBnaXQtc3NoLWtleS0ke3JhbmRvbVVVSUQoKX1gKVxuXG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGVtcEZpbGUsIHRoaXMuc3NoS2V5LCB7IG1vZGU6IDBvNjAwIH0pXG5cbiAgICAgICAgICAgIHJlc3VsdC5lbnYuR0lUX1NTSF9DT01NQU5EID0gYHNzaCAtaSAke2VzY2FwZVNoZWxsQXJndW1lbnQodGVtcEZpbGUpfSAtbyBTdHJpY3RIb3N0S2V5Q2hlY2tpbmc9bm9gXG4gICAgICAgICAgICByZXN1bHQuc3NoS2V5RmlsZSA9IHRlbXBGaWxlXG4gICAgICAgICAgICByZXN1bHQuY2xlYW51cCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB1bmxpbmsodGVtcEZpbGUpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgdGVtcG9yYXJ5IFNTSCBrZXkgZmlsZTogJHt0ZW1wRmlsZX1gLCB7IGVycm9yOiBlcnIgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuKGFyZ3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICAgICAgY29uc3QgeyBlbnYsIHNzaEtleUZpbGUsIGNsZWFudXAgfSA9IGF3YWl0IHRoaXMuYnVpbGRFbnYoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZ2l0ICcgKyBhcmdzLCB7XG4gICAgICAgICAgICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgICAgICAgICAgICBzc2hLZXlGaWxlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlY0FzeW5jKGBnaXQgJHthcmdzfWAsIHtcbiAgICAgICAgICAgICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgICAgICAgICAgIGVudixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gc3Rkb3V0LnRyaW0oKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgYXdhaXQgY2xlYW51cCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB0cnlSdW4oYXJnczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oYXJncylcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tvdXQocmVmOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW4oYGNoZWNrb3V0ICR7cmVmfWApXG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuKCdmZXRjaCAtLWFsbCAtLXBydW5lJylcbiAgICB9XG5cbiAgICBhc3luYyBwdWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmZldGNoKClcblxuICAgICAgICBjb25zdCB1cHN0cmVhbSA9IGF3YWl0IHRoaXMudHJ5UnVuKCdyZXYtcGFyc2UgLS1hYmJyZXYtcmVmIC0tc3ltYm9saWMtZnVsbC1uYW1lIEB7dXBzdHJlYW19JylcblxuICAgICAgICBpZiAodXBzdHJlYW0pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuKCdwdWxsIC0tZmYtb25seScpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRJbmZvKCk6IFByb21pc2U8R2l0UmVwb0luZm8+IHtcbiAgICAgICAgY29uc3QgaGVhZCA9IGF3YWl0IHRoaXMucnVuKCdyZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQnKVxuICAgICAgICBjb25zdCBpc0RldGFjaGVkSGVhZCA9IGhlYWQgPT09ICdIRUFEJ1xuXG4gICAgICAgIGNvbnN0IHNob3J0SGFzaCA9IGF3YWl0IHRoaXMucnVuKCdyZXYtcGFyc2UgLS1zaG9ydCBIRUFEJylcblxuICAgICAgICBjb25zdCByZW1vdGVzT3V0cHV0ID0gYXdhaXQgdGhpcy50cnlSdW4oJ3JlbW90ZScpXG4gICAgICAgIGNvbnN0IHJlbW90ZXMgPSByZW1vdGVzT3V0cHV0XG4gICAgICAgICAgICA/IHJlbW90ZXNPdXRwdXQuc3BsaXQoJ1xcbicpLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgOiBbXVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuY3dkLFxuICAgICAgICAgICAgaGVhZDogaXNEZXRhY2hlZEhlYWQgPyBudWxsIDogaGVhZCxcbiAgICAgICAgICAgIHNob3J0SGFzaCxcbiAgICAgICAgICAgIGlzRGV0YWNoZWRIZWFkLFxuICAgICAgICAgICAgcmVtb3RlcyxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7ICBzcWwgIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RhYmxlLCBTZWxlY3RRdWVyeUJ1aWxkZXIsIEV4cHJlc3Npb25CdWlsZGVyIGFzIEtFeHByZXNzaW9uQnVpbGRlciB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuXG5leHBvcnQgdHlwZSBTZWxlY3RGcm9tPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPVxuICAgIFJldHVyblR5cGU8dHlwZW9mIGRiLnNlbGVjdEZyb208VD4+XG4gICAgfCBTZWxlY3RRdWVyeUJ1aWxkZXI8RGF0YWJhc2UsIFQsIGFueT5cblxuZXhwb3J0IHR5cGUgSW5zZXJ0RnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIuaW5zZXJ0SW50bzxUPj5cbmV4cG9ydCB0eXBlIFVwZGF0ZUZyb208VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IFJldHVyblR5cGU8dHlwZW9mIGRiLnVwZGF0ZVRhYmxlPFQ+PlxuZXhwb3J0IHR5cGUgRGVsZXRlRnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIuZGVsZXRlRnJvbTxUPj5cblxuZXhwb3J0IHR5cGUgU2VsZWN0QnVpbGRlcjxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gU2VsZWN0UXVlcnlCdWlsZGVyPERhdGFiYXNlLCBULCBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPj5cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb25CdWlsZGVyPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBLRXhwcmVzc2lvbkJ1aWxkZXI8RGF0YWJhc2UsIFQ+XG5cbmV4cG9ydCBjb25zdCBub3cgPSAoKSAgPT4gc3FsPHN0cmluZz5gQ1VSUkVOVF9USU1FU1RBTVBgXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IHtcbiAgICBzZXJpYWxpemU/OiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gYW55XG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVJlc3VsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBTZXJpYWxpemVPcHRpb25zPFQ+IHwgdW5kZWZpbmVkPiA9XG4gICAgTyBleHRlbmRzIHVuZGVmaW5lZCA/IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+IDpcbiAgICBPIGV4dGVuZHMgeyBzZXJpYWxpemU6IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBpbmZlciBSIH0gPyBSIDogU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT5cbiIsImltcG9ydCB0eXBlIHsgU2VsZWN0RnJvbSB9IGZyb20gJy4vY29tbW9uLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIHF1ZXJ5PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+XG4gICAgZGVidWc/OiBib29sZWFuXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3VudDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBDb3VudE9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbSh0YWJsZSkgYXMgYW55IFxuXG4gICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShkYi5zZWxlY3RGcm9tKHRhYmxlKSkgXG4gICAgfVxuXG4gICAgcXVlcnkgPSBxdWVyeVxuICAgICAgICAuY2xlYXJTZWxlY3QoKVxuICAgICAgICAuY2xlYXJPcmRlckJ5KClcbiAgICAgICAgLnNlbGVjdCgoZWI6IGFueSkgPT4gZWIuZm4uY291bnRBbGwoKS5hcygnY291bnQnKSlcblxuICAgIGlmIChvcHRpb25zPy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhxdWVyeS5jb21waWxlKCkpXG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gYXdhaXQgKHF1ZXJ5IGFzIGFueSkuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICByZXR1cm4gTnVtYmVyKHJvdz8uY291bnQgPz8gMClcbn0iLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiB0b0RiKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGRpYWxlY3QgPSAoZGIgYXMgYW55KS5jdXJyZW50Q29ubmVjdGlvbkRpYWxlY3ROYW1lXG5cbiAgICBpZiAoZGlhbGVjdCA9PT0gJ3NxbGl0ZScpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdChuZXcgRGF0ZSh2YWx1ZSksICd5eXl5LU1NLWRkIEhIOm1tOnNzJylcbiAgICB9XG5cbiAgICBpZiAoZGlhbGVjdCA9PT0gJ215c3FsJykge1xuICAgICAgICByZXR1cm4gZm9ybWF0KG5ldyBEYXRlKHZhbHVlKSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSkudG9JU09TdHJpbmcoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbURiKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogRGF0ZSB8IG51bGwgeyAgICBcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gdG9EYih2YWx1ZTogb2JqZWN0IHwgYW55W10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRGIodmFsdWU6IGFueSk6IG9iamVjdCB8IGFueVtdIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpXG59XG4iLCJpbXBvcnQgZGF0YWJhc2UgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG5jb25zdCBkYiA9IGRhdGFiYXNlIGFzIGFueVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EYih2YWx1ZTogYm9vbGVhbiB8IG51bWJlciB8IG51bGwpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsZWN0ID0gZGIuY3VycmVudENvbm5lY3Rpb25EaWFsZWN0TmFtZVxuXG4gICAgaWYgKGRpYWxlY3QgPT09ICdzcWxpdGUnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IDEgOiAwXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlID8gdHJ1ZSA6IGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRGIodmFsdWU6IGFueSB8IG51bGwpOiBib29sZWFuIHwgbnVsbCB7ICAgIFxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGRpYWxlY3QgPSBkYi5jdXJyZW50Q29ubmVjdGlvbkRpYWxlY3ROYW1lXG5cbiAgICBpZiAoZGlhbGVjdCAgPT09ICdzcWxpdGUnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMSA/IHRydWUgOiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlXG59XG4iLCJpbXBvcnQgKiBhcyAgZGF0ZXRpbWUgZnJvbSAnLi9kYXRldGltZS50cydcbmltcG9ydCAqIGFzIGpzb24gZnJvbSAnLi9qc29uLnRzJ1xuaW1wb3J0ICogYXMgYm9vbGVhbiBmcm9tICcuL2Jvb2xlYW4udHMnXG5cbmV4cG9ydCBmdW5jdGlvbiB0b0RiKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4ucGF5bG9hZCB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdFtrZXldIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkYXRldGltZS50b0RiKHJlc3VsdFtrZXldKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0ganNvbi50b0RiKHJlc3VsdFtrZXldKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRba2V5XSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IGJvb2xlYW4udG9EYihyZXN1bHRba2V5XSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtrZXldKSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBqc29uLnRvRGIocmVzdWx0W2tleV0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRGIodmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLnZhbHVlIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHJlc3VsdCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHBhcnNlVmFsdWUocmVzdWx0W2tleV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuIiwiaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vYWxsLnRzJ1xuaW1wb3J0ICogYXMgZGF0ZXRpbWUgZnJvbSAnLi9kYXRldGltZS50cydcblxuY29uc3Qgbm9ybWFsaXplcnMgPSB7XG4gICAgYWxsLFxuICAgIGRhdGV0aW1lXG59XG5cbmV4cG9ydCBkZWZhdWx0IG5vcm1hbGl6ZXJzXG4iLCJpbXBvcnQgdHlwZSB7IEluc2VydGFibGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZVJlc3VsdCwgU2VyaWFsaXplT3B0aW9ucyB9IGZyb20gJy4vY29tbW9uLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgbm9ybWFsaXplcnMgZnJvbSAnI3NlcnZlci9ub3JtYWxpemVycy9pbmRleC50cydcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gZXh0ZW5kcyBTZXJpYWxpemVPcHRpb25zPFQ+IHtcbiAgICB2YWx1ZXM6IEluc2VydGFibGU8RGF0YWJhc2VbVF0+XG4gICAgcHJpbWFyeUtleT86IHN0cmluZyAvLyBkZWZhdWx0ICdpZCdcbiAgICBub3JtYWxpemU/OiBib29sZWFuIHwgKCh2YWx1ZTogYW55KSA9PiBhbnkpIC8vIGRlZmF1bHQgdHJ1ZVxufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIENyZWF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGNvbnN0IHZhbHVlcyA9IChvcHRpb25zPy52YWx1ZXMgfHwge30pIGFzIEluc2VydGFibGU8RGF0YWJhc2VbVF0+XG4gICAgY29uc3QgaW5zZXJ0ID0gZGIuaW5zZXJ0SW50byh0YWJsZSkudmFsdWVzKHZhbHVlcylcblxuICAgIGxldCByb3c6IGFueSA9IGF3YWl0IGluc2VydC5yZXR1cm5pbmdBbGwoKS5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemUpIHtcbiAgICAgICAgcm93ID0gb3B0aW9ucy5zZXJpYWxpemUocm93KVxuICAgIH1cblxuICAgIHJldHVybiByb3cgYXMgU2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNeXNxbDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBDcmVhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBjb25zdCB2YWx1ZXMgPSAob3B0aW9ucz8udmFsdWVzIHx8IHt9KSBhcyBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPlxuICAgIGNvbnN0IGluc2VydCA9IGRiLmluc2VydEludG8odGFibGUpLnZhbHVlcyh2YWx1ZXMpXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gKG9wdGlvbnM/LnByaW1hcnlLZXkgfHwgJ2lkJykgYXMga2V5b2YgRGF0YWJhc2VbVF1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluc2VydC5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgIGNvbnN0IHJlc3VsdElkID0gcmVzdWx0Lmluc2VydElkIGFzIGFueVxuXG4gICAgY29uc3Qgc2VsZWN0ID0gZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKCkgYXMgYW55XG5cbiAgICBsZXQgcm93ID0gYXdhaXQgc2VsZWN0XG4gICAgICAgIC53aGVyZShwcmltYXJ5S2V5LCAnPScsIHJlc3VsdElkKVxuICAgICAgICAuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICBpZiAob3B0aW9ucz8uc2VyaWFsaXplKSB7XG4gICAgICAgIHJvdyA9IG9wdGlvbnMuc2VyaWFsaXplKHJvdylcbiAgICB9XG5cbiAgICByZXR1cm4gcm93IGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPlxufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgQ3JlYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgbGV0IHZhbHVlczogYW55ID0gb3B0aW9ucz8udmFsdWVzIHx8IHt9XG5cbiAgICBjb25zdCBub3JtYWxpemUgPSB0eXBlb2Ygb3B0aW9ucz8ubm9ybWFsaXplID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucz8ubm9ybWFsaXplIDogbm9ybWFsaXplcnMuYWxsLnRvRGJcblxuICAgIGlmIChvcHRpb25zPy5ub3JtYWxpemUgIT09IGZhbHNlKSB7XG4gICAgICAgIHZhbHVlcyA9IG5vcm1hbGl6ZSh2YWx1ZXMpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgdmFsdWVzXG4gICAgfVxuXG4gICAgaWYgKGRiLmRyaXZlciA9PT0gJ215c3FsJykge1xuICAgICAgICByZXR1cm4gY3JlYXRlTXlzcWwodGFibGUsIHBhcnNlZE9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZURlZmF1bHQodGFibGUsIHBhcnNlZE9wdGlvbnMpXG59IiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uV3JhcHBlciwgRXhwcmVzc2lvbkJ1aWxkZXIgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxudHlwZSBEZWxldGVGcm9tPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBSZXR1cm5UeXBlPHR5cGVvZiBkYi5kZWxldGVGcm9tPFQ+PlxuXG5leHBvcnQgaW50ZXJmYWNlIERlc3Ryb3lPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIHF1ZXJ5PzogKHFiOiBEZWxldGVGcm9tPFQ+KSA9PiBEZWxldGVGcm9tPFQ+XG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT5cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc3Ryb3k8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgRGVzdHJveU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGxldCBxdWVyeTogYW55ID0gb3B0aW9ucz8ucXVlcnkgXG4gICAgICAgID8gb3B0aW9ucy5xdWVyeShkYi5kZWxldGVGcm9tKHRhYmxlKSkgXG4gICAgICAgIDogZGIuZGVsZXRlRnJvbSh0YWJsZSlcblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpIGFzIGFueVxuICAgIH1cblxuICAgIGF3YWl0IHF1ZXJ5LmV4ZWN1dGUoKVxufSIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RGcm9tLCBTZXJpYWxpemVPcHRpb25zLCBTZXJpYWxpemFibGVSZXN1bHQgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gIGV4dGVuZHMgU2VyaWFsaXplT3B0aW9uczxUPiB7XG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvZmZzZXQ/OiBudW1iZXJcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICB3aGVyZT86IChxYjogRXhwcmVzc2lvbkJ1aWxkZXI8RGF0YWJhc2UsIFQ+KSA9PiBFeHByZXNzaW9uV3JhcHBlcjxEYXRhYmFzZSwgVCwgYW55PlxuICAgIHF1ZXJ5PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIExpc3RPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBsZXQgcXVlcnkgPSAob3B0aW9ucz8ucXVlcnkgfHwgZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKCkpIGFzIGFueVxuXG4gICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShkYi5zZWxlY3RGcm9tKHRhYmxlKSkgXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LndoZXJlKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoKGViOiBhbnkpID0+IG9wdGlvbnMud2hlcmUhKGViKSlcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5vZmZzZXQpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHF1ZXJ5LmNvbXBpbGUoKSlcbiAgICB9XG5cbiAgICBsZXQgcm93czogYW55W10gPSBhd2FpdCBxdWVyeS5leGVjdXRlKClcblxuICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemUpIHtcbiAgICAgICAgcm93cyA9IHJvd3MubWFwKG9wdGlvbnMuc2VyaWFsaXplKVxuICAgIH1cblxuICAgIHJldHVybiByb3dzIGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPltdXG59IiwiaW1wb3J0IHsgbGlzdCAgfSBmcm9tICcuL2xpc3QudHMnXG5pbXBvcnQgdHlwZSB7IExpc3RPcHRpb25zIH0gZnJvbSAnLi9saXN0LnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4aXN0czxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBMaXN0T3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IGxpc3QodGFibGUsIG9wdGlvbnMpXG5cbiAgICBjb25zdCBmb3VuZCA9IHJvd3NbMF1cblxuICAgIHJldHVybiAhIWZvdW5kXG59IiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uQnVpbGRlciwgRXhwcmVzc2lvbldyYXBwZXIgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlbGVjdEZyb20sIFNlcmlhbGl6YWJsZVJlc3VsdCwgU2VyaWFsaXplT3B0aW9ucyB9IGZyb20gJy4vY29tbW9uLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IGludGVyZmFjZSBGaW5kT25lT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IGV4dGVuZHMgU2VyaWFsaXplT3B0aW9uczxUPiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHF1ZXJ5PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+XG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT5cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRPbmU8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgRmluZE9uZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGxldCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGFibGUpLnNlbGVjdEFsbCgpIGFzIGFueVxuXG4gICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSkgYXMgYW55XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LndoZXJlKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoKGViOiBhbnkpID0+IG9wdGlvbnMud2hlcmUhKGViKSkgYXMgYW55XG4gICAgfVxuXG4gICAgY29uc3Qgcm93OiBhbnkgPSBhd2FpdCBxdWVyeS5saW1pdCgxKS5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgIGlmICghcm93KSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LnNlcmlhbGl6ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5zZXJpYWxpemUocm93KSBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5cbiAgICB9XG5cbiAgICByZXR1cm4gcm93IGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPlxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZE9uZU9yRmFpbDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBGaW5kT25lT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kT25lKHRhYmxlLCBvcHRpb25zKVxuXG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgICBjb25zdCBuYW1lID0gb3B0aW9ucz8ubmFtZSA/PyAnUmVjb3JkJ1xuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHtuYW1lfSBub3QgZm91bmRgLCA0MDQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kXG59IiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uQnVpbGRlciwgRXhwcmVzc2lvbldyYXBwZXIsIEluc2VydGFibGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlbGVjdEZyb20sIFNlcmlhbGl6YWJsZVJlc3VsdCwgU2VyaWFsaXplT3B0aW9ucyB9IGZyb20gJy4vY29tbW9uLnRzJ1xuaW1wb3J0IHsgbGlzdCB9IGZyb20gJy4vbGlzdC50cydcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJy4vY3JlYXRlLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlyc3RPckNyZWF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIHNlbGVjdD86IChxYjogU2VsZWN0RnJvbTxUPikgPT4gU2VsZWN0RnJvbTxUPlxuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+XG4gICAgdmFsdWVzOiBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPiB8IEluc2VydGFibGU8RGF0YWJhc2VbVF0+W11cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpcnN0T3JDcmVhdGU8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgRmlyc3RPckNyZWF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgbGlzdCh0YWJsZSwgeyBcbiAgICAgICAgZGVidWc6IG9wdGlvbnM/LmRlYnVnLFxuICAgICAgICBzZXJpYWxpemU6IG9wdGlvbnM/LnNlcmlhbGl6ZSxcbiAgICAgICAgd2hlcmU6IG9wdGlvbnM/LndoZXJlLFxuICAgICAgICBxdWVyeTogKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHF1ZXJ5OiBhbnkgPSBvcHRpb25zPy5zZWxlY3QgXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLnNlbGVjdChkYi5zZWxlY3RGcm9tKHRhYmxlKSkgXG4gICAgICAgICAgICAgICAgOiBkYi5zZWxlY3RGcm9tKHRhYmxlKS5zZWxlY3RBbGwoKVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8ud2hlcmUpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBxdWVyeS5saW1pdCgxKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBpdGVtc1swXSBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5cbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgY3JlYXRlKHRhYmxlLCB7IFxuICAgICAgICBkZWJ1Zzogb3B0aW9ucz8uZGVidWcsXG4gICAgICAgIHNlcmlhbGl6ZTogb3B0aW9ucz8uc2VyaWFsaXplLFxuICAgICAgICB2YWx1ZXM6IG9wdGlvbnM/LnZhbHVlcyBhcyBhbnlcbiAgICB9KVxuXG4gICAgcmV0dXJuIGNyZWF0ZWQgYXMgU2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+XG59IiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uQnVpbGRlciwgRXhwcmVzc2lvbldyYXBwZXIsIFNlbGVjdGFibGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlbGVjdEZyb20gfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB7IGxpc3QgfSBmcm9tICcuL2xpc3QudHMnXG5pbXBvcnQgeyBjb3VudCB9IGZyb20gJy4vY291bnQudHMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCBQYWdpbmF0aW9uIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvUGFnaW5hdGlvbkVudGl0eS50cydcblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgcGFnZT86IG51bWJlclxuICAgIGxpbWl0PzogbnVtYmVyXG4gICAgb3JkZXJCeT86IERhdGFiYXNlW1RdIHwgKGtleW9mIERhdGFiYXNlW1RdKVtdIFxuICAgIG9yZGVyRGVzYz86ICgnYXNjJyB8ICdkZXNjJykgfCAoJ2FzYycgfCAnZGVzYycpW11cbiAgICB3aGVyZT86IChxYjogRXhwcmVzc2lvbkJ1aWxkZXI8RGF0YWJhc2UsIFQ+KSA9PiBFeHByZXNzaW9uV3JhcHBlcjxEYXRhYmFzZSwgVCwgYW55PlxuICAgIHNlcmlhbGl6ZT86IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBhbnlcbiAgICBxdWVyeT86IChxYjogU2VsZWN0RnJvbTxUPikgPT4gYW55XG59XG5cbmV4cG9ydCB0eXBlIFBhZ2luYXRlUmVzdWx0PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFBhZ2luYXRlT3B0aW9uczxUPiB8IHVuZGVmaW5lZD4gPVxuICAgIE8gZXh0ZW5kcyB1bmRlZmluZWQgPyBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPiA6XG4gICAgTyBleHRlbmRzIHsgc2VyaWFsaXplOiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gaW5mZXIgUiB9ID8gUiA6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYWdpbmF0ZTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBQYWdpbmF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGNvbnN0IHBhZ2UgPSBvcHRpb25zPy5wYWdlICYmIG9wdGlvbnMucGFnZSA+IDAgPyBvcHRpb25zLnBhZ2UgOiAxXG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCAmJiBvcHRpb25zLmxpbWl0ID4gMCA/IG9wdGlvbnMubGltaXQgOiAxMFxuICAgIGNvbnN0IG9mZnNldCA9IChwYWdlIC0gMSkgKiBsaW1pdFxuICAgIGNvbnN0IG9yZGVyQnkgPSBvcHRpb25zPy5vcmRlckJ5ICYmIChBcnJheS5pc0FycmF5KG9wdGlvbnMub3JkZXJCeSkgPyBvcHRpb25zLm9yZGVyQnkgOiBbb3B0aW9ucy5vcmRlckJ5XSlcbiAgICBjb25zdCBvcmRlckRlc2MgPSBvcHRpb25zPy5vcmRlckRlc2MgJiYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcmRlckRlc2MpID8gb3B0aW9ucy5vcmRlckRlc2MgOiBbb3B0aW9ucy5vcmRlckRlc2NdKVxuICAgIFxuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgbGlzdCh0YWJsZSwgeyBcbiAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zPy5zZXJpYWxpemUsICBcbiAgICAgICAgcXVlcnk6ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBxdWVyeTogYW55ID0gZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKClcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KGRiLnNlbGVjdEZyb20odGFibGUpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8ud2hlcmUpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3JkZXJCeSkge1xuICAgICAgICAgICAgICAgIG9yZGVyQnlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sLCBpKSA9PiBbY29sLCBvcmRlckRlc2MgJiYgb3JkZXJEZXNjW2ldID8gb3JkZXJEZXNjW2ldIDogJ2FzYyddIGFzIGNvbnN0KVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoW2NvbCwgZGlyZWN0aW9uXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5vcmRlckJ5KGNvbCBhcyBzdHJpbmcsIGRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxpbWl0ID4gMCkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQobGltaXQpLm9mZnNldChvZmZzZXQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZGVidWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhxdWVyeS5jb21waWxlKCkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBxdWVyeVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IHRvdGFsID0gYXdhaXQgY291bnQodGFibGUsIHtcbiAgICAgICAgcXVlcnk6ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBxdWVyeTogYW55ID0gZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKClcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KGRiLnNlbGVjdEZyb20odGFibGUpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZGVidWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhxdWVyeS5jb21waWxlKCkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBxdWVyeVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBQYWdpbmF0aW9uLmZyb208UGFnaW5hdGVSZXN1bHQ8VCwgTz4+KHtcbiAgICAgICAgaXRlbXM6IGl0ZW1zIGFzIFBhZ2luYXRlUmVzdWx0PFQsIE8+LFxuICAgICAgICB0b3RhbCxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgcGVyX3BhZ2U6IGxpbWl0LFxuICAgICAgICB0b3RhbF9wYWdlczogTWF0aC5jZWlsKHRvdGFsIC8gbGltaXQpLFxuICAgIH0pXG59IiwiaW1wb3J0IHsgQ3JlYXRlVGFibGVCdWlsZGVyICB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCB0eXBlIHsgQ29sdW1uVHlwZSwgRXhwcmVzc2lvbkJ1aWxkZXIgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlbGVjdGFibGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgeyBub3cgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG50eXBlIFdoZXJlQ2FwYWJsZTxRQj4gPSB7XG4gIHdoZXJlOiAoLi4uYXJnczogYW55W10pID0+IFFCXG59XG5cbnR5cGUgVXBkYXRlRnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIudXBkYXRlVGFibGU8VD4+XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29mdERlbGV0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiB7XG4gICAgc2VyaWFsaXplPzogKHJvdzogU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT4pID0+IGFueVxuICAgIHF1ZXJ5OiAocWI6IFVwZGF0ZUZyb208VD4pID0+IFVwZGF0ZUZyb208VD5cbn1cblxuZXhwb3J0IHR5cGUgU29mdERlbGV0ZVJlc3VsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBTb2Z0RGVsZXRlT3B0aW9uczxUPiB8IHVuZGVmaW5lZD4gPVxuICAgIE8gZXh0ZW5kcyB1bmRlZmluZWQgPyBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPltdIDpcbiAgICBPIGV4dGVuZHMgeyBzZXJpYWxpemU6IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBpbmZlciBSIH0gPyBSW10gOiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPltdXG5cbmV4cG9ydCBpbnRlcmZhY2UgU29mdERlbGV0ZVRhYmxlIHtcbiAgZGVsZXRlZF9hdDogQ29sdW1uVHlwZTxEYXRlIHwgbnVsbCwgbmV2ZXIgfCBudWxsIHwgUmV0dXJuVHlwZTx0eXBlb2Ygbm93Piwgc3RyaW5nIHwgbnVsbCB8IFJldHVyblR5cGU8dHlwZW9mIG5vdz4+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aGVyZU5vdERlbGV0ZWQ8UUIgZXh0ZW5kcyBXaGVyZUNhcGFibGU8UUI+PihxYjogUUIpOiBRQiB7XG4gICAgcmV0dXJuIHFiLndoZXJlKCdkZWxldGVkX2F0JywgJ2lzJywgbnVsbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuZGVsZXRlZCAocWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55Pikge1xuICAgIHJldHVybiBxYi5lYihxYi5yZWYoJ2RlbGV0ZWRfYXQnKSwgJ2lzJywgbnVsbClcbn1cblxudW5kZWxldGVkLmNvbHVtbiA9IChjb2w6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgICAgICByZXR1cm4gcWIuZWIoY29sLCAnaXMnLCBudWxsKVxuICAgIH1cbn1cblxuXG5leHBvcnQgY29uc3QgZGVsZXRlZCA9IChxYjogRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgcmV0dXJuIHFiLmViKCdkZWxldGVkX2F0JywgJ2lzIG5vdCcsIG51bGwpXG59XG5cbmV4cG9ydCBjb25zdCBhZGRTb2Z0RGVsZXRlQ29sdW1uID0gKGN0YjogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgIHJldHVybiBjdGIuYWRkQ29sdW1uKCdkZWxldGVkX2F0JywgJ3RpbWVzdGFtcCcpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzb2Z0RGVsZXRlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFNvZnREZWxldGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pOiBQcm9taXNlPFNvZnREZWxldGVSZXN1bHQ8VCwgTz4+IHtcbiAgICBsZXQgcXVlcnk6IGFueSA9IG9wdGlvbnM/LnF1ZXJ5IFxuICAgICAgICA/IG9wdGlvbnMucXVlcnkoZGIudXBkYXRlVGFibGUodGFibGUpKSBcbiAgICAgICAgOiBkYi51cGRhdGVUYWJsZSh0YWJsZSlcblxuICAgIHF1ZXJ5ID0gcXVlcnkuc2V0KHsgZGVsZXRlZF9hdDogbm93KCkgfSkud2hlcmUodW5kZWxldGVkKVxuXG4gICAgbGV0IHJvd3M6IGFueVtdID0gYXdhaXQgcXVlcnlcbiAgICAgICAgLnJldHVybmluZ0FsbCgpXG4gICAgICAgIC5leGVjdXRlKClcblxuICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemUpIHtcbiAgICAgICAgcm93cyA9IHJvd3MubWFwKG9wdGlvbnMuc2VyaWFsaXplKVxuICAgIH1cblxuICAgIHJldHVybiByb3dzIGFzIFNvZnREZWxldGVSZXN1bHQ8VCwgTz5cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ2t5c2VseScge1xuICBpbnRlcmZhY2UgQ3JlYXRlVGFibGVCdWlsZGVyPFRCIGV4dGVuZHMgc3RyaW5nLCBDIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXI+IHtcbiAgICBhZGRTb2Z0RGVsZXRlQ29sdW1uKCk6IENyZWF0ZVRhYmxlQnVpbGRlcjxUQiwgQyB8ICdkZWxldGVkX2F0Jz5cbiAgfVxufVxuXG5DcmVhdGVUYWJsZUJ1aWxkZXIucHJvdG90eXBlLmFkZFNvZnREZWxldGVDb2x1bW4gPSBmdW5jdGlvbiAoXG4gICAgdGhpczogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55Pixcbikge1xuICAgIHJldHVybiB0aGlzLmFkZENvbHVtbignZGVsZXRlZF9hdCcsICd0aW1lc3RhbXAnKVxufSIsImltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciAgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IENvbHVtblR5cGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgeyBub3cgfSBmcm9tICcuL2NvbW1vbi50cydcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lc3RhbXBUYWJsZSB7XG4gIGNyZWF0ZWRfYXQ6IENvbHVtblR5cGU8RGF0ZSwgc3RyaW5nIHwgdW5kZWZpbmVkLCBuZXZlcj5cbiAgdXBkYXRlZF9hdDogQ29sdW1uVHlwZTxEYXRlLCBzdHJpbmcgfCB1bmRlZmluZWQsIERhdGUgfCBzdHJpbmcgfCBSZXR1cm5UeXBlPHR5cGVvZiBub3c+PlxufVxuXG5leHBvcnQgY29uc3QgYWRkQ3JlYXRlZENvbHVtbiA9IChjdGI6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4pID0+IHtcbiAgICByZXR1cm4gY3RiXG4gICAgICAgIC5hZGRDb2x1bW4oJ2NyZWF0ZWRfYXQnLCAndGltZXN0YW1wJywgKGNvbCkgPT4gIGNvbC5kZWZhdWx0VG8obm93KCkpLm5vdE51bGwoKSlcbn1cblxuZXhwb3J0IGNvbnN0IGFkZFVwZGF0ZWRDb2x1bW4gPSAoY3RiOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgcmV0dXJuIGN0YlxuICAgICAgICAuYWRkQ29sdW1uKCd1cGRhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG59XG5cbmV4cG9ydCBjb25zdCBhZGRUaW1lc3RhbXBDb2x1bW5zID0gKGN0YjogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgIHJldHVybiBjdGJcbiAgICAgICAgLmFkZENvbHVtbignY3JlYXRlZF9hdCcsICd0aW1lc3RhbXAnLCAoY29sKSA9PiAgY29sLmRlZmF1bHRUbyhub3coKSkubm90TnVsbCgpKVxuICAgICAgICAuYWRkQ29sdW1uKCd1cGRhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG59XG5cbmRlY2xhcmUgbW9kdWxlICdreXNlbHknIHtcbiAgaW50ZXJmYWNlIENyZWF0ZVRhYmxlQnVpbGRlcjxUQiBleHRlbmRzIHN0cmluZywgQyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPiB7XG4gICAgYWRkVGltZXN0YW1wQ29sdW1ucygpOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCAnY3JlYXRlZF9hdCcgfCAndXBkYXRlZF9hdCc+XG4gICAgYWRkQ3JlYXRlZENvbHVtbigpOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCAnY3JlYXRlZF9hdCc+XG4gICAgYWRkVXBkYXRlZENvbHVtbigpOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCAndXBkYXRlZF9hdCc+XG4gIH1cbn1cblxuQ3JlYXRlVGFibGVCdWlsZGVyLnByb3RvdHlwZS5hZGRUaW1lc3RhbXBDb2x1bW5zID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4sXG4pIHtcbiAgICByZXR1cm4gdGhpc1xuICAgICAgICAuYWRkQ29sdW1uKCdjcmVhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG4gICAgICAgIC5hZGRDb2x1bW4oJ3VwZGF0ZWRfYXQnLCAndGltZXN0YW1wJywgKGNvbCkgPT4gIGNvbC5kZWZhdWx0VG8obm93KCkpLm5vdE51bGwoKSlcbn1cblxuQ3JlYXRlVGFibGVCdWlsZGVyLnByb3RvdHlwZS5hZGRDcmVhdGVkQ29sdW1uID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4sXG4pIHtcbiAgICByZXR1cm4gdGhpc1xuICAgICAgICAuYWRkQ29sdW1uKCdjcmVhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG59XG5cbkNyZWF0ZVRhYmxlQnVpbGRlci5wcm90b3R5cGUuYWRkVXBkYXRlZENvbHVtbiA9IGZ1bmN0aW9uIChcbiAgICB0aGlzOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+LFxuKSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAgICAgLmFkZENvbHVtbigndXBkYXRlZF9hdCcsICd0aW1lc3RhbXAnLCAoY29sKSA9PiAgY29sLmRlZmF1bHRUbyhub3coKSkubm90TnVsbCgpKVxufSIsImltcG9ydCB0eXBlIHsgVXBkYXRlYWJsZSwgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBVcGRhdGVGcm9tLCBTZXJpYWxpemFibGVSZXN1bHQsIFNlcmlhbGl6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuaW1wb3J0IG5vcm1hbGl6ZXJzIGZyb20gJyNzZXJ2ZXIvbm9ybWFsaXplcnMvaW5kZXgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IGV4dGVuZHMgU2VyaWFsaXplT3B0aW9uczxUPiB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgdmFsdWVzOiBVcGRhdGVhYmxlPERhdGFiYXNlW1RdPlxuICAgIG5vcm1hbGl6ZT86IGJvb2xlYW4gfCAoKHZhbHVlOiBhbnkpID0+IGFueSkgLy8gZGVmYXVsdCB0cnVlXG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT5cbiAgICBxdWVyeT86IChxYjogVXBkYXRlRnJvbTxUPikgPT4gVXBkYXRlRnJvbTxUPlxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRGVmYXVsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBVcGRhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBvcHRpb25zPy52YWx1ZXMgfHwgW11cbiAgICBsZXQgcXVlcnkgPSBkYi51cGRhdGVUYWJsZSh0YWJsZSkgYXMgYW55XG5cbiAgICBxdWVyeSA9IHF1ZXJ5LnNldCh2YWx1ZXMpLnJldHVybmluZ0FsbCgpXG5cbiAgICBpZiAob3B0aW9ucz8ucXVlcnkpIHtcbiAgICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHF1ZXJ5LmNvbXBpbGUoKSlcbiAgICB9XG5cbiAgICBsZXQgcm93czogYW55W10gPSBhd2FpdCBxdWVyeS5leGVjdXRlKClcblxuICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemUpIHtcbiAgICAgICAgcm93cyA9IHJvd3MubWFwKG9wdGlvbnMuc2VyaWFsaXplKVxuICAgIH1cblxuICAgIHJldHVybiByb3dzIGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPltdXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVNeXNxbDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBVcGRhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBvcHRpb25zPy52YWx1ZXMgfHwgW11cbiAgICBjb25zdCB1cGRhdGVRYiA9IGRiLnVwZGF0ZVRhYmxlKHRhYmxlKSBhcyBhbnlcblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICB1cGRhdGVRYi53aGVyZSgoZWI6IGFueSkgPT4gb3B0aW9ucy53aGVyZSEoZWIpKVxuICAgIH1cblxuICAgIGF3YWl0IHVwZGF0ZVFiLnNldCh2YWx1ZXMpLmV4ZWN1dGUoKVxuXG4gICAgY29uc3Qgc2VsZWN0UWIgPSBkYi5zZWxlY3RGcm9tKHRhYmxlKS5zZWxlY3RBbGwoKSBhcyBhbnlcblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICBzZWxlY3RRYi53aGVyZSgoZWI6IGFueSkgPT4gb3B0aW9ucy53aGVyZSEoZWIpKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhzZWxlY3RRYi5jb21waWxlKCkpXG4gICAgfVxuXG4gICAgbGV0IHJvd3M6IGFueVtdID0gYXdhaXQgc2VsZWN0UWIuZXhlY3V0ZSgpXG5cbiAgICBpZiAob3B0aW9ucz8uc2VyaWFsaXplKSB7XG4gICAgICAgIHJvd3MgPSByb3dzLm1hcChvcHRpb25zLnNlcmlhbGl6ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cyBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5bXVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFVwZGF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGxldCB2YWx1ZXM6IGFueSA9IG9wdGlvbnM/LnZhbHVlcyB8fCB7fVxuXG4gICAgY29uc3Qgbm9ybWFsaXplID0gdHlwZW9mIG9wdGlvbnM/Lm5vcm1hbGl6ZSA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnM/Lm5vcm1hbGl6ZSA6IG5vcm1hbGl6ZXJzLmFsbC50b0RiXG5cbiAgICBpZiAob3B0aW9ucz8ubm9ybWFsaXplICE9PSBmYWxzZSkge1xuICAgICAgICB2YWx1ZXMgPSBub3JtYWxpemUodmFsdWVzKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZE9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChkYi5kcml2ZXIgPT09ICdteXNxbCcpIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU15c3FsKHRhYmxlLCBwYXJzZWRPcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVEZWZhdWx0KHRhYmxlLCBwYXJzZWRPcHRpb25zKVxufSIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyLCBJbnNlcnRhYmxlIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RGcm9tLCBTZXJpYWxpemFibGVSZXN1bHQsIFNlcmlhbGl6ZU9wdGlvbnMsIFVwZGF0ZUZyb20gfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJy4vY3JlYXRlLnRzJ1xuaW1wb3J0IHsgdXBkYXRlIH0gZnJvbSAnLi91cGRhdGUudHMnXG5pbXBvcnQgeyBmaW5kT25lIH0gZnJvbSAnLi9maW5kT25lLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVPckNyZWF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+XG4gICAgc2VsZWN0PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+XG4gICAgdXBkYXRlPzogKHFiOiBVcGRhdGVGcm9tPFQ+KSA9PiBVcGRhdGVGcm9tPFQ+XG4gICAgdmFsdWVzOiBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPiB8IEluc2VydGFibGU8RGF0YWJhc2VbVF0+W11cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU9yQ3JlYXRlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFVwZGF0ZU9yQ3JlYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IGZpbmRPbmUodGFibGUsIHsgXG4gICAgICAgIGRlYnVnOiBvcHRpb25zPy5kZWJ1ZyxcbiAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zPy5zZXJpYWxpemUsICBcbiAgICAgICAgd2hlcmU6IG9wdGlvbnM/LndoZXJlLFxuICAgIH0pXG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgICBhd2FpdCB1cGRhdGUodGFibGUsIHsgXG4gICAgICAgICAgICBkZWJ1Zzogb3B0aW9ucz8uZGVidWcsXG4gICAgICAgICAgICBzZXJpYWxpemU6IG9wdGlvbnM/LnNlcmlhbGl6ZSxcbiAgICAgICAgICAgIHZhbHVlczogb3B0aW9ucz8udmFsdWVzIGFzIGFueSxcbiAgICAgICAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBmaW5kT25lKHRhYmxlLCB7IFxuICAgICAgICAgICAgZGVidWc6IG9wdGlvbnM/LmRlYnVnLFxuICAgICAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zPy5zZXJpYWxpemUsICBcbiAgICAgICAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZSxcbiAgICAgICAgfSkgYXMgUHJvbWlzZTxTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz4+XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNyZWF0ZSh0YWJsZSwgeyBcbiAgICAgICAgZGVidWc6IG9wdGlvbnM/LmRlYnVnLFxuICAgICAgICBzZXJpYWxpemU6IG9wdGlvbnM/LnNlcmlhbGl6ZSxcbiAgICAgICAgdmFsdWVzOiBvcHRpb25zPy52YWx1ZXMgYXMgYW55XG4gICAgfSlcblxuICAgIHJldHVybiBjcmVhdGVkIGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPlxufVxuIiwiaW1wb3J0IHsgQ3JlYXRlVGFibGVCdWlsZGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuZGVjbGFyZSBtb2R1bGUgJ2t5c2VseScge1xuICBpbnRlcmZhY2UgQ3JlYXRlVGFibGVCdWlsZGVyPFRCIGV4dGVuZHMgc3RyaW5nLCBDIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXI+IHtcbiAgICBhZGRJZENvbHVtbjxDTiBleHRlbmRzIHN0cmluZyA9ICdpZCc+KFxuICAgICAgY29sPzogQ05cbiAgICApOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCBDTj5cbiAgfVxufVxuXG5DcmVhdGVUYWJsZUJ1aWxkZXIucHJvdG90eXBlLmFkZElkQ29sdW1uID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4sXG4gICAgY29sOiBzdHJpbmcgPSAnaWQnXG4pIHtcbiAgICBpZiAoZGIuZHJpdmVyID09PSAncG9zdGdyZXNxbCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ29sdW1uKGNvbCwgJ3NlcmlhbCcsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgIH1cblxuICAgIGlmIChkYi5kcml2ZXIgPT09ICdteXNxbCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ29sdW1uKGNvbCwgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKS5hdXRvSW5jcmVtZW50KCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkQ29sdW1uKGNvbCwgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbn0iLCJpbXBvcnQgeyB1cGRhdGVPckNyZWF0ZSB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9pbmRleC50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyAgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZVRvU3RyaW5nKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBganNvbjoke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBgYm9vbDoke3ZhbHVlfWBcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gYG51bWJlcjoke3ZhbHVlfWBcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZXRhZGF0YTxUYWJsZSBleHRlbmRzIGtleW9mIERhdGFiYXNlPihtZXRhc1RhYmxlOiBUYWJsZSwgZm9yZWlnbktleToga2V5b2YgRGF0YWJhc2VbVGFibGVdKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIE1ldGFkYXRhRXh0ZW5kPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+XG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBUKTogUHJvbWlzZTxUPlxuICAgICAgICAgICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3IgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IGNvbnN0cnVjdG9yLl9fbW9kZWw/LnRhYmxlXG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbWFyeUtleSA9IGNvbnN0cnVjdG9yLl9fbW9kZWw/LnByaW1hcnlLZXlcblxuICAgICAgICAgICAgICAgIGlmICghdGFibGUgfHwgIXByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgdXNlIE1vZGVsIG1peGluIGJlZm9yZSBNZXRhZGF0YScpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbShtZXRhc1RhYmxlKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAgICAgICAgIC53aGVyZSgoZm9yZWlnbktleSBhcyBzdHJpbmcpLCAnPScsICh0aGlzIGFzIGFueSlbcHJpbWFyeUtleV0pXG4gICAgICAgICAgICAgICAgICAgIC53aGVyZSgnbmFtZScsICc9JywgbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLmxpbWl0KDEpXG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyeS5leGVjdXRlVGFrZUZpcnN0KCkgXG5cbiAgICAgICAgICAgICAgICBpZiAoIXJvdyB8fCAhcm93LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSByb3c/LnZhbHVlXG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdqc29uOicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh2YWx1ZS5zbGljZSg1KSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdib29sOicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoNSkgPT09ICd0cnVlJ1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBhcyBUXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBhc3luYyBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjb25zdHJ1Y3Rvci5fX21vZGVsPy50YWJsZVxuICAgICAgICAgICAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSBjb25zdHJ1Y3Rvci5fX21vZGVsPy5wcmltYXJ5S2V5XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRhYmxlIHx8ICFwcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIHVzZSBNb2RlbCBtaXhpbiBiZWZvcmUgTWV0YWRhdGEnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgW2ZvcmVpZ25LZXldOiAodGhpcyBhcyBhbnkpW3ByaW1hcnlLZXldLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhbHVlcy52YWx1ZSA9IHZhbHVlVG9TdHJpbmcodmFsdWUpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVPckNyZWF0ZShtZXRhc1RhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYi5hbmQoW1xuICAgICAgICAgICAgICAgICAgICAgICAgcWIuZWIoKGZvcmVpZ25LZXkgYXMgc3RyaW5nKSwgJz0nLCAodGhpcyBhcyBhbnkpW3ByaW1hcnlLZXldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHFiLmViKCduYW1lJywgJz0nLCBuYW1lKVxuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBvbWl0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZW1pdEhvb2sgfSBmcm9tICcjc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzJ1xuaW1wb3J0IHR5cGUgeyBVcGRhdGVPckNyZWF0ZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvdXBkYXRlT3JDcmVhdGUudHMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0ICogYXMgcXVlcmllcyBmcm9tICcjc2VydmVyL3F1ZXJpZXMvaW5kZXgudHMnXG5cbmltcG9ydCB0eXBlIHsgTGlzdE9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvbGlzdC50cydcbmltcG9ydCB0eXBlIHsgUGFnaW5hdGVPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL3BhZ2luYXRlLnRzJ1xuaW1wb3J0IHR5cGUgeyBDb3VudE9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvY291bnQudHMnXG5pbXBvcnQgdHlwZSB7IENyZWF0ZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvY3JlYXRlLnRzJ1xuaW1wb3J0IHR5cGUgeyBVcGRhdGVPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL3VwZGF0ZS50cydcbmltcG9ydCB0eXBlIHsgRGVzdHJveU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvZGVzdHJveS50cydcbmltcG9ydCB0eXBlIHsgRmlyc3RPckNyZWF0ZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvZmlyc3RPckNyZWF0ZS50cydcbmltcG9ydCB0eXBlIHsgRmluZE9uZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvZmluZE9uZS50cydcbmltcG9ydCB0eXBlIFBhZ2luYXRpb24gZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QYWdpbmF0aW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgdHlwZSB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gJ2t5c2VseSdcblxuZXhwb3J0IHR5cGUgTW9kZWxMaXN0T3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxMaXN0T3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbEZpbmRPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBPbWl0PEZpbmRPbmVPcHRpb25zPFQ+LCAnc2VyaWFsaXplJyB8ICdvcmRlckJ5Jz5cbmV4cG9ydCB0eXBlIE1vZGVsUGFnaW5hdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBPbWl0PFBhZ2luYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbENvdW50T3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gQ291bnRPcHRpb25zPFQ+XG5leHBvcnQgdHlwZSBNb2RlbENyZWF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IE9taXQ8Q3JlYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbFVwZGF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IE9taXQ8VXBkYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbERlc3Ryb3lPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBEZXN0cm95T3B0aW9uczxUPlxuZXhwb3J0IHR5cGUgTW9kZWxGaXJzdE9yQ3JlYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxGaXJzdE9yQ3JlYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbFVwZGF0ZU9yQ3JlYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxVcGRhdGVPckNyZWF0ZU9wdGlvbnM8VD4sICdzZXJpYWxpemUnPlxuXG5leHBvcnQgdHlwZSBNb2RlbEVudGl0eSA9IFJldHVyblR5cGU8UmV0dXJuVHlwZTx0eXBlb2YgTW9kZWxNaXhpbjxhbnk+Pj5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTW9kZWxNaXhpbjxUYWJsZSBleHRlbmRzIGtleW9mIERhdGFiYXNlPih0YWJsZTogVGFibGUsIHByaW1hcnlLZXk6IGtleW9mIERhdGFiYXNlW1RhYmxlXSA9ICdpZCcgYXMgYW55KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIE1vZGVsRXh0ZW5kPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfX21vZGVsID0ge1xuICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgIHByaW1hcnlLZXksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCByb3c6IGFueSk6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0KCk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxEYXRhYmFzZSwgVGFibGUsIGFueT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYi5zZWxlY3RGcm9tKHRhYmxlKSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gJ3RoaXMnIGlzIHRoZSBjb25jcmV0ZSBjb25zdHJ1Y3RvciAoZS5nLiBGb29kKSwgc28gdGhlIHJldHVybiB0eXBlIGlzIGluZmVycmVkIGNvcnJlY3RseS5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcGFnaW5hdGU8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbFBhZ2luYXRlT3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPFBhZ2luYXRpb248VD4+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYWdpbmF0aW9uID0gYXdhaXQgcXVlcmllcy5wYWdpbmF0ZSh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICAuLi5vLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCByb3cgb2YgcGFnaW5hdGlvbi5pdGVtcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCByb3cpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlclBhZ2luYXRlJywgcGFnaW5hdGlvbilcblxuICAgICAgICAgICAgICAgIHJldHVybiBwYWdpbmF0aW9uIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxpc3Q8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbExpc3RPcHRpb25zPFRhYmxlPik6IFByb21pc2U8VFtdPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBxdWVyaWVzLmxpc3QodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubyxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCBpdGVtKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJMaXN0JywgaXRlbXMpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZE9uZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsRmluZE9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgcXVlcmllcy5maW5kT25lKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBvPy5xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IG8/LndoZXJlLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCByb3cpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93IGFzIGFueVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZE9uZU9yRmFpbDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsRmluZE9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgcXVlcmllcy5maW5kT25lT3JGYWlsKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm8sXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG8/Lm5hbWUgPz8gY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRmluZCcsIHJvdylcblxuICAgICAgICAgICAgICAgIHJldHVybiByb3cgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgaWQ6IGFueSk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmZpbmRPbmUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiAocWI6IGFueSkgPT4gcWIocHJpbWFyeUtleSBhcyBzdHJpbmcsICc9JywgaWQpXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93IGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmRPckZhaWw8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnkpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmZpbmRPbmVPckZhaWwodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiAocWI6IGFueSkgPT4gcWIocHJpbWFyeUtleSBhcyBzdHJpbmcsICc9JywgaWQpXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCByb3cpXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93IGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmRCeTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgY29sdW1uOiBrZXlvZiBEYXRhYmFzZVtUYWJsZV0sIHZhbHVlOiBhbnkpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmZpbmRPbmVPckZhaWwodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiAocWI6IGFueSkgPT4gcWIoY29sdW1uIGFzIHN0cmluZywgJz0nLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB9KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRmluZCcsIHJvdylcblxuICAgICAgICAgICAgICAgIHJldHVybiByb3cgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZEJ5T3JGYWlsPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBjb2x1bW46IGtleW9mIERhdGFiYXNlW1RhYmxlXSwgdmFsdWU6IGFueSk6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHF1ZXJpZXMuZmluZE9uZU9yRmFpbCh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYihjb2x1bW4gYXMgc3RyaW5nLCAnPScsIHZhbHVlKVxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdzZXJpYWxpemVkJywgcm93KVxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJGaW5kJywgcm93KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvdyBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleGlzdHM8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbExpc3RPcHRpb25zPFRhYmxlPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyaWVzLmV4aXN0cyh0YWJsZSwgeyBxdWVyeTogbz8ucXVlcnkgfSkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY291bnQ8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbENvdW50T3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyaWVzLmNvdW50KHRhYmxlLCBvKSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGU8VD4odGhpczogbmV3ICgpID0+IFQsIHBheWxvYWQ6IE1vZGVsQ3JlYXRlT3B0aW9uczxUYWJsZT5bJ3ZhbHVlcyddKTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0geyAuLi5wYXlsb2FkIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlQ3JlYXRlJywgdmFsdWVzKVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgcXVlcmllcy5jcmVhdGUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckNyZWF0ZScsIHJvdylcbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCByb3cpXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlTWFueTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgdmFsdWVzOiBBcnJheTxNb2RlbENyZWF0ZU9wdGlvbnM8VGFibGU+Wyd2YWx1ZXMnXT4pOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSBbXVxuXG4gICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdiZWZvcmVDcmVhdGUnLCB2YWx1ZSlcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmNyZWF0ZSh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogcm93ID0+IGNvbnN0cnVjdG9yLnNlcmlhbGl6ZShyb3cpLFxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJDcmVhdGUnLCByb3cpXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgcm93cy5wdXNoKHJvdylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93cyBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyB1cGRhdGU8VD4odGhpczogbmV3ICgpID0+IFQsIG86IE1vZGVsVXBkYXRlT3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB7IC4uLm8udmFsdWVzIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlVXBkYXRlJywgdmFsdWVzLCBvLndoZXJlKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcmllcy51cGRhdGUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWc6IG8uZGVidWcsXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiBvLndoZXJlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHF1ZXJpZXMuZmluZE9uZU9yRmFpbCh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICB3aGVyZTogby53aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyVXBkYXRlJywgcm93KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvd1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIHVwZGF0ZUJ5SWQ8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnksIHZhbHVlczogTW9kZWxVcGRhdGVPcHRpb25zPFRhYmxlPlsndmFsdWVzJ10sIG9wdGlvbnM/OiB7IGRlYnVnPzogYm9vbGVhbiB9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnOiBvcHRpb25zPy5kZWJ1ZyxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYihwcmltYXJ5S2V5IGFzIHN0cmluZywgJz0nLCBpZCksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc3Ryb3k8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbERlc3Ryb3lPcHRpb25zPFRhYmxlPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlRGVzdHJveScsIG8pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyaWVzLmRlc3Ryb3kodGFibGUsIG8pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRGVzdHJveScsIG8pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmlyc3RPckNyZWF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbzogTW9kZWxGaXJzdE9yQ3JlYXRlT3B0aW9uczxUYWJsZT4pOiBUIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlcmllcy5maXJzdE9yQ3JlYXRlKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm8sXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogcm93ID0+IGNvbnN0cnVjdG9yLnNlcmlhbGl6ZShyb3cpLFxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIHVwZGF0ZU9yQ3JlYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIG86IE1vZGVsVXBkYXRlT3JDcmVhdGVPcHRpb25zPFRhYmxlPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyaWVzLnVwZGF0ZU9yQ3JlYXRlKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnOiBvLmRlYnVnLFxuICAgICAgICAgICAgICAgICAgICB3aGVyZTogby53aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0OiBvLnNlbGVjdCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlOiBvLnVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBvLnZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzdHJveUJ5SWQ8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IChxYjogYW55KSA9PiBxYi53aGVyZShwcmltYXJ5S2V5IGFzIHN0cmluZywgJz0nLCBpZClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2JlZm9yZURlc3Ryb3knLCBvcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcmllcy5kZXN0cm95KHRhYmxlLCBvcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckRlc3Ryb3knLCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgc2F2ZSgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9ICh0aGlzIGFzIGFueSkuY29uc3RydWN0b3JcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvbWl0KHRoaXMgYXMgYW55LCBbcHJpbWFyeUtleSBhcyBzdHJpbmddKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdiZWZvcmVTYXZlJywgdGhpcywgdmFsdWVzKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcmllcy51cGRhdGUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYihwcmltYXJ5S2V5LCAnPScsICh0aGlzIGFzIGFueSlbcHJpbWFyeUtleV0pLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlclNhdmUnLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9ICh0aGlzIGFzIGFueSkuY29uc3RydWN0b3JcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlRGVzdHJveScsIHRoaXMpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyaWVzLmRlc3Ryb3kodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHFiID0+IChxYiBhcyBhbnkpLndoZXJlKHByaW1hcnlLZXksICc9JywgKHRoaXMgYXMgYW55KS5pZClcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckRlc3Ryb3knLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgc29mdERlbGV0ZSgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9ICh0aGlzIGFzIGFueSkuY29uc3RydWN0b3JcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlU29mdERlbGV0ZScsIHRoaXMpXG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcmllcy5zb2Z0RGVsZXRlKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBxYiA9PiAocWIgYXMgYW55KS53aGVyZShwcmltYXJ5S2V5LCAnPScsICh0aGlzIGFzIGFueSkuaWQpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHJvd3NbMF1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcyBhcyBhbnksIHJvdylcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJTb2Z0RGVsZXRlJywgdGhpcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmludGVyZmFjZSBSZWxhdGlvbiB7XG4gICAgbG9hZChlbnRpdGllczogYW55W10pOiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFJlbGF0aW9uPFIgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbj4+KHJlbGF0aW9uczogUikge1xuICAgIHJldHVybiBmdW5jdGlvbiBSZWxhdGlvbkV4dGVuZDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBlbnRpdGllczogVCB8IFRbXSwgbmFtZXM6IGtleW9mIFIgfCAoa2V5b2YgUilbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShlbnRpdGllcykgPyBlbnRpdGllcyA6IFtlbnRpdGllc11cbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGlvbk5hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IFtuYW1lc11cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiByZWxhdGlvbk5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uID0gcmVsYXRpb25zPy5bbmFtZSBhcyBzdHJpbmddIGFzIFJlbGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWxhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWxhdGlvbiAke1N0cmluZyhuYW1lKX0gZGVjbGFyZWRgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVsYXRpb24ubG9hZChpdGVtcylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IERvd25sb2FkU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0Rvd25sb2FkU2VydmljZS50cydcblxuY29uc3QgZG93bmxvYWQgPSBuZXcgRG93bmxvYWRTZXJ2aWNlKClcblxuZXhwb3J0IGRlZmF1bHQgZG93bmxvYWRcblxuIiwiaW1wb3J0IERyaXZlU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0RyaXZlU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXIudHMnXG5cbmNvbnN0IGRyaXZlID0gY29udGFpbmVyLnByb3h5PERyaXZlU2VydmljZT4oRHJpdmVTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBkcml2ZVxuXG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuaW1wb3J0IHsgRW1taXR0ZXJTZXJ2aWNlIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcblxuY29uc3QgZW1taXR0ZXIgPSBjb250YWluZXIucHJveHk8RW1taXR0ZXJTZXJ2aWNlPihFbW1pdHRlclNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGVtbWl0dGVyXG5cbiIsImltcG9ydCBGaWxlUmVwb3NpdG9yeSBmcm9tIFwiI3NlcnZlci9yZXBvc2l0b3JpZXMvRmlsZVJlcG9zaXRvcnkudHNcIjtcbmltcG9ydCBkYXRhYmFzZSBmcm9tIFwiLi9kYXRhYmFzZS50c1wiO1xuXG5jb25zdCBmaWxlUmVwb3NpdG9yeSA9IG5ldyBGaWxlUmVwb3NpdG9yeShkYXRhYmFzZSlcblxuZXhwb3J0IGRlZmF1bHQgZmlsZVJlcG9zaXRvcnlcbiIsImltcG9ydCBNaWdyYXRvclNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9NaWdyYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBtaWdyYXRvciA9IGNvbnRhaW5lci5wcm94eTxNaWdyYXRvclNlcnZpY2U+KE1pZ3JhdG9yU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbWlncmF0b3JcbiIsImltcG9ydCBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvUGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuY29uc3QgcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5ID0gbmV3IFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeShkYiBhcyBhbnkpXG5cbmV4cG9ydCBkZWZhdWx0IHBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeVxuIiwiaW1wb3J0IFBlcm1pc3Npb25SZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL1Blcm1pc3Npb25SZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuY29uc3QgcGVybWlzc2lvblJlcG9zaXRvcnkgPSBuZXcgUGVybWlzc2lvblJlcG9zaXRvcnkoZGIgYXMgYW55KVxuXG5leHBvcnQgZGVmYXVsdCBwZXJtaXNzaW9uUmVwb3NpdG9yeVxuIiwiaW1wb3J0IHR5cGUgeyBIdHRwQ29udGV4dCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHMnXG5pbXBvcnQgUm91dGVyU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb250YWluZXIudHMnXG5cbmNvbnN0IHJvdXRlciA9IGNvbnRhaW5lci5wcm94eTxSb3V0ZXJTZXJ2aWNlPEh0dHBDb250ZXh0Pj4oUm91dGVyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVyXG4iLCJpbXBvcnQgU2hlbGxTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvU2hlbGxTZXJ2aWNlLnRzJ1xuXG5jb25zdCBzaGVsbCA9IG5ldyBTaGVsbFNlcnZpY2UoKVxuXG5leHBvcnQgZGVmYXVsdCBzaGVsbFxuIiwiaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCBUb2tlblJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvVG9rZW5SZXBvc2l0b3J5LnRzJ1xuXG5jb25zdCB0b2tlblJlcG9zaXRvcnkgPSBuZXcgVG9rZW5SZXBvc2l0b3J5KGRiIGFzIGFueSlcblxuZXhwb3J0IGRlZmF1bHQgdG9rZW5SZXBvc2l0b3J5XG5cbiIsImltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgVXNlclJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvVXNlclJlcG9zaXRvcnkudHMnXG5cbmNvbnN0IHVzZXJSZXBvc2l0b3J5ID0gbmV3IFVzZXJSZXBvc2l0b3J5KGRiIGFzIGFueSlcblxuZXhwb3J0IGRlZmF1bHQgdXNlclJlcG9zaXRvcnlcblxuIiwiZXhwb3J0IGludGVyZmFjZSBMb2FkZXI8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsb2FkKGVudGl0aWVzOiBUW10pOiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVyUmVjb3JkPFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgW2tleTogc3RyaW5nXTogTG9hZGVyPFQ+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVMb2FkZXI8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+KGxvYWRlcjogTG9hZGVyPFQ+KTogTG9hZGVyPFQ+IHtcbiAgICByZXR1cm4gbG9hZGVyXG59XG4iLCJpbXBvcnQgeyBzZXQsIGdldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB7IGRlZmluZUxvYWRlciB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvZGVmaW5lTG9hZGVyLnRzJ1xuXG50eXBlIEtleU9yRnVuY3Rpb248VD4gPSBrZXlvZiBUIHwgKChlbnRpdHk6IFQpID0+IGFueSlcblxuZXhwb3J0IGludGVyZmFjZSBIYXNNYW55VGhyb3VnaExvYWRlck9wdGlvbnM8XG4gICAgVEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRQaXZvdEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRUYXJnZXRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PlxuPiB7XG4gICAga2V5OiBzdHJpbmcgLy8gdGFyZ2V0IHByb3BlcnR5IHRvIHNldCBvbiB0aGUgZW50aXR5XG4gICAgcGl2b3Q6IHtcbiAgICAgICAgc291cmNlS2V5OiBLZXlPckZ1bmN0aW9uPFRFbnRpdHk+IC8vIHBpdm90IHRhYmxlIGZvcmVpZ24ga2V5IHRvIHJlbGF0ZWQgZW50aXR5XG4gICAgICAgIHRhcmdldEtleTogS2V5T3JGdW5jdGlvbjxUUGl2b3RFbnRpdHk+IC8vIHBpdm90IHRhYmxlIGZvcmVpZ24ga2V5IHRvIGN1cnJlbnQgZW50aXR5XG4gICAgICAgIGZpbmRFbnRpdGllcyhpZHM6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPFRQaXZvdEVudGl0eVtdPiAvLyBmdW5jdGlvbiB0byBmZXRjaCBwaXZvdCB0YWJsZSByb3dzIGJ5IHJlbGF0ZWQgZW50aXR5IGlkc1xuICAgIH0sXG4gICAgdGFyZ2V0OiB7XG4gICAgICAgIHNvdXJjZUtleTogS2V5T3JGdW5jdGlvbjxUUGl2b3RFbnRpdHk+IC8vIHRhcmdldCBlbnRpdHkgaWQga2V5LCBkZWZhdWx0ICdpZCdcbiAgICAgICAgdGFyZ2V0S2V5OiBLZXlPckZ1bmN0aW9uPFRUYXJnZXRFbnRpdHk+IC8vIHRhcmdldCBlbnRpdHkgZm9yZWlnbiBrZXkgdG8gcGl2b3QgdGFibGVcbiAgICAgICAgZmluZEVudGl0aWVzKGlkczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8VFRhcmdldEVudGl0eVtdPiAvLyBmdW5jdGlvbiB0byBmZXRjaCByZWxhdGVkIGVudGl0aWVzIGJ5IGlkc1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRIYXNNYW55VGhyb3VnaDxcbiAgICBURW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVFBpdm90RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVFRhcmdldEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4+KHBheWxvYWQ6IGFueSB8IGFueVtdLCBvcHRpb25zOiBIYXNNYW55VGhyb3VnaExvYWRlck9wdGlvbnM8VEVudGl0eSwgVFBpdm90RW50aXR5LCBUVGFyZ2V0RW50aXR5Pikge1xuICAgIGNvbnN0IGVudGl0aWVzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cbiAgICBjb25zdCB0YXJnZXQgPSBvcHRpb25zLnRhcmdldCBcbiAgICBjb25zdCBwaXZvdCA9IG9wdGlvbnMucGl2b3RcblxuICAgIGZ1bmN0aW9uIGZpbmRLZXkoZW50aXR5OiBhbnksIGtleU9yRm46IEtleU9yRnVuY3Rpb248YW55Pik6IGFueSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5T3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGtleU9yRm4oZW50aXR5KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldChlbnRpdHksIGtleU9yRm4pXG4gICAgICAgIFxuICAgIH1cblxuICAgIGNvbnN0IHBpdm9JZHMgPSBlbnRpdGllcy5tYXAoZSA9PiBmaW5kS2V5KGUsIHBpdm90LnNvdXJjZUtleSkpLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHBpdm90RW50aXRpZXMgPSBhd2FpdCBwaXZvdC5maW5kRW50aXRpZXMocGl2b0lkcylcbiAgICBjb25zdCB0YXJnZXRJZHMgPSBwaXZvdEVudGl0aWVzLm1hcCgocDogYW55KSA9PiBmaW5kS2V5KHAsIHBpdm90LnRhcmdldEtleSkpLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHRhcmdldEVudGl0aWVzID0gYXdhaXQgdGFyZ2V0LmZpbmRFbnRpdGllcyh0YXJnZXRJZHMpXG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCBwaXZvdHMgPSBwaXZvdEVudGl0aWVzLmZpbHRlcigocDogYW55KSA9PiBmaW5kS2V5KHAsIHBpdm90LnNvdXJjZUtleSkgPT09IGZpbmRLZXkoZW50aXR5LCBwaXZvdC5zb3VyY2VLZXkpKVxuXG4gICAgICAgIGlmICghcGl2b3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgc2V0KGVudGl0eSwgb3B0aW9ucy5rZXksIFtdKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSB0YXJnZXRFbnRpdGllcy5maWx0ZXIoKHQ6IGFueSkgPT4gcGl2b3RzLnNvbWUoKHA6IGFueSkgPT4gZmluZEtleShwLCB0YXJnZXQuc291cmNlS2V5KSA9PT0gZmluZEtleSh0LCB0YXJnZXQudGFyZ2V0S2V5KSkpXG5cbiAgICAgICAgc2V0KGVudGl0eSwgb3B0aW9ucy5rZXksIHRhcmdldHMpXG4gICAgfVxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIYXNNYW55VGhyb3VnaExvYWRlcjxcbiAgICBURW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVFBpdm90RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVFRhcmdldEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4+KG9wdGlvbnM6IEhhc01hbnlUaHJvdWdoTG9hZGVyT3B0aW9uczxURW50aXR5LCBUUGl2b3RFbnRpdHksIFRUYXJnZXRFbnRpdHk+KSB7XG4gICAgcmV0dXJuIGRlZmluZUxvYWRlcjxURW50aXR5Pih7XG4gICAgICAgIGxvYWQ6IGFzeW5jIChlbnRpdGllczogVEVudGl0eVtdKSA9PiBsb2FkSGFzTWFueVRocm91Z2goZW50aXRpZXMsIG9wdGlvbnMpXG4gICAgfSlcbn1cblxuXG4iLCJpbXBvcnQgQmFzZUFjbCBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2wgZXh0ZW5kcyBCYXNlQWNsIHtcbiAgICBwdWJsaWMgYXV0aG9yaXplKGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgaWYgKHRoaXMuY2Fubm90KGFjdGlvbiwgc3ViamVjdCwgb2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZUV4Y2VwdGlvbignVW5hdXRob3JpemVkJywgNDAzKVxuXG4gICAgICAgICAgICBsZXQgc3ViamVjdE5hbWUgPSAnJ1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN1YmplY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgc3ViamVjdE5hbWUgPSBzdWJqZWN0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdWJqZWN0ICYmIHR5cGVvZiBzdWJqZWN0ID09PSAnZnVuY3Rpb24nICYmIHN1YmplY3QubmFtZSkge1xuICAgICAgICAgICAgICAgIHN1YmplY3ROYW1lID0gc3ViamVjdC5uYW1lXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdWJqZWN0ICYmIHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JyAmJiBzdWJqZWN0LmNvbnN0cnVjdG9yICYmIHN1YmplY3QuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgICAgICAgICAgIHN1YmplY3ROYW1lID0gc3ViamVjdC5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHtcbiAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgc3ViamVjdDogc3ViamVjdE5hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICAgIFJlcXVlc3QsIFxuICAgIFJlc3BvbnNlLFxuICAgIENvb2tpZU9wdGlvbnNcbn0gZnJvbSAnZXhwcmVzcydcbmltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkgZXh0ZW5kcyBCYXNlIHtcbiAgICBwdWJsaWMgcmVxdWVzdDogUmVxdWVzdFxuICAgIHB1YmxpYyByZXNwb25zZTogUmVzcG9uc2VcblxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QsIHJlc3BvbnNlOiBSZXNwb25zZSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBjb29raWVzOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihPYmplY3QuZW50cmllcyhyZXF1ZXN0LmNvb2tpZXMpKSxcbiAgICAgICAgICAgIHByZWZpeDogY29uZmlnLmdldCgnY29va2llLnByZWZpeCcsICcnKVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBDb29raWVPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHRoaXMucHJlZml4XG5cbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBwcmVmaXggKyBuYW1lXG5cbiAgICAgICAgY29uc3Qgb3B0czogQ29va2llT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNwb25zZS5jb29raWUoZnVsbE5hbWUsIHZhbHVlLCBvcHRzKVxuICAgICAgICBcbiAgICAgICAgc3VwZXIuc2V0KGZ1bGxOYW1lLCB2YWx1ZSwgb3B0aW9ucylcbiAgICB9XG59XG4iLCJpbXBvcnQgTW9kZWxNaXhpbiBmcm9tICcjc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzJ1xuaW1wb3J0IEJhc2VNZXRhIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvRmlsZU1ldGFFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZU1ldGEgZXh0ZW5kcyBjb21wb3NlV2l0aChcbiAgICBCYXNlTWV0YSxcbiAgICBNb2RlbE1peGluKCdmaWxlX21ldGFzJylcbikge1xuXG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgTWV0YWRhdGFTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLnRzJ1xuXG5pbnRlcmZhY2UgSGFzTWV0YXNPcHRpb25zIHtcbiAgICB0YWJsZToga2V5b2YgRGF0YWJhc2VcbiAgICB0YWJsZUtleTogc3RyaW5nXG4gICAgXG4gICAgdGFyZ2V0VGFibGU6IGtleW9mIERhdGFiYXNlXG4gICAgdGFyZ2V0S2V5OiBzdHJpbmdcblxuICAgIHByb3BlcnR5OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGFzTWV0YXMge1xuICAgIHB1YmxpYyB0YWJsZTogc3RyaW5nXG4gICAgcHVibGljIHRhYmxlS2V5OiBzdHJpbmdcbiAgICBcbiAgICBwdWJsaWMgdGFyZ2V0VGFibGU6IHN0cmluZ1xuICAgIHB1YmxpYyB0YXJnZXRLZXk6IHN0cmluZ1xuXG4gICAgcHVibGljIHByb3BlcnR5OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEhhc01ldGFzT3B0aW9ucykge1xuICAgICAgICB0aGlzLnRhYmxlID0gb3B0aW9ucy50YWJsZVxuICAgICAgICB0aGlzLnRhYmxlS2V5ID0gb3B0aW9ucy50YWJsZUtleVxuICAgICAgICBcbiAgICAgICAgdGhpcy50YXJnZXRUYWJsZSA9IG9wdGlvbnMudGFyZ2V0VGFibGVcbiAgICAgICAgdGhpcy50YXJnZXRLZXkgPSBvcHRpb25zLnRhcmdldEtleVxuICAgICAgICBcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IG9wdGlvbnMucHJvcGVydHlcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkKGVudGl0aWVzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBpZHMgPSBuZXcgU2V0KClcblxuICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGUgPT4gaWRzLmFkZChlW3RoaXMudGFibGVLZXldKSlcbiAgICAgICAgXG4gICAgICAgIGlmICghaWRzLnNpemUpIHJldHVyblxuXG4gICAgICAgIGxldCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGhpcy50YXJnZXRUYWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkuc2VsZWN0QWxsKCkud2hlcmUodGhpcy50YXJnZXRLZXksICdpbicsIEFycmF5LmZyb20oaWRzKSlcblxuICAgICAgICAvLyBBc3N1bWVzIHlvdXIgbW9kZWxzIGhhdmUgYSBzdGFuZGFyZCAubGlzdCgpIG9yIC53aGVyZSgpXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5leGVjdXRlKClcbiAgICAgICAgICAgIFxuICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm93cyA9IHJlc3VsdHMuZmlsdGVyKChyOiBhbnkpID0+IHJbdGhpcy50YXJnZXRLZXldID09PSBlW3RoaXMudGFibGVLZXldKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBzZXQoZSwgdGhpcy5wcm9wZXJ0eSwgTWV0YWRhdGFTZXJ2aWNlLmZsYXR0ZW4ocm93cykpXG4gICAgICAgIH0pXG5cbiAgICB9XG59XG4iLCJpbXBvcnQgbXMgZnJvbSAnbXMnXG5pbXBvcnQgRmlsZU1ldGEgZnJvbSAnLi9GaWxlTWV0YUVudGl0eS50cydcbmltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvRmlsZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IE1ldGFkYXRhIGZyb20gJyNzZXJ2ZXIvbWl4aW5zL01ldGFkYXRhTWl4aW4udHMnXG5pbXBvcnQgZHJpdmUgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RyaXZlLnRzJ1xuaW1wb3J0IEhvb2tzU3RhdGljIGZyb20gJyNzaGFyZWQvbWl4aW5zL0hvb2tzTWl4aW4udHMnXG5pbXBvcnQgdHlwZSB7IERyaXZlVXJsT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RyaXZlQ29udHJhY3QudHMnXG5pbXBvcnQgTWV0YWRhdGFTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLnRzJ1xuaW1wb3J0IEhhc01ldGFzIGZyb20gJyNzZXJ2ZXIvcmVsYXRpb25zL2hhc01ldGFzLnJlbGF0aW9uLnRzJ1xuaW1wb3J0IFJlbGF0aW9uIGZyb20gJyNzZXJ2ZXIvbWl4aW5zL1JlbGF0aW9uc01peGluLnRzJ1xuaW1wb3J0IE1vZGVsTWl4aW4gZnJvbSAnI3NlcnZlci9taXhpbnMvTW9kZWxNaXhpbi50cydcblxuaW50ZXJmYWNlIFVSTENhY2hlIHtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGV4cGlyZXM6IG51bWJlclxufVxuXG5jb25zdCBGaWxlUmVsYXRpb25zID0ge1xuICAgIG1ldGFzOiBuZXcgSGFzTWV0YXMoe1xuICAgICAgICB0YWJsZTogJ2ZpbGVzJyxcbiAgICAgICAgdGFibGVLZXk6ICdpZCcsXG5cbiAgICAgICAgdGFyZ2V0VGFibGU6ICdmaWxlX21ldGFzJyxcbiAgICAgICAgdGFyZ2V0S2V5OiAnZmlsZV9pZCcsXG5cbiAgICAgICAgcHJvcGVydHk6ICdtZXRhcycsXG4gICAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZSBleHRlbmRzIGNvbXBvc2VXaXRoKFxuICAgIEJhc2UsXG4gICAgSG9va3NTdGF0aWMsXG4gICAgTW9kZWxNaXhpbignZmlsZXMnKSxcbiAgICBSZWxhdGlvbihGaWxlUmVsYXRpb25zKSxcbiAgICBNZXRhZGF0YSgnZmlsZV9tZXRhcycsICdmaWxlX2lkJylcbikge1xuXG4gICAgcHVibGljIHN0YXRpYyBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBVUkxDYWNoZT4oKVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBoYXMoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmV4aXN0cyh7XG4gICAgICAgICAgICBxdWVyeTogcSA9PiBxLndoZXJlKCdmaWxlbmFtZScsICc9JywgZmlsZW5hbWUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGV4aXN0c1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZEJ5RmlsZW5hbWUoZmlsZW5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kT25lKHtcbiAgICAgICAgICAgIHdoZXJlOiBxYiA9PiBxYignZmlsZW5hbWUnLCAnPScsIGZpbGVuYW1lKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkU3RyZWFtKCkge1xuICAgICAgICByZXR1cm4gZHJpdmUudXNlKHRoaXMuZHJpdmUpLnJlYWRTdHJlYW0odGhpcy5maWxlbmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVhZCgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRyaXZlLnVzZSh0aGlzLmRyaXZlKS5yZWFkKHRoaXMuZmlsZW5hbWUpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWRVcmwob3B0aW9uczogRHJpdmVVcmxPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBGaWxlLmNhY2hlLmdldCh0aGlzLmZpbGVuYW1lKVxuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICAgICAgaWYgKGNhY2hlICYmIG5vdyA8IGNhY2hlLmV4cGlyZXMpIHtcbiAgICAgICAgICAgIHRoaXMudXJsID0gY2FjaGUudXJsXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5leHBpcmVzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmV4cGlyZXMgPSAnMWgnXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMudXJsID0gYXdhaXQgZHJpdmUudXNlKHRoaXMuZHJpdmUpLnVybCh0aGlzLmZpbGVuYW1lLCBvcHRpb25zKVxuICAgICAgICBcbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHBpcmVzID0gbm93ICsgbXMob3B0aW9ucy5leHBpcmVzKSAtIDEwMDAgLy8gMSBzZWNvbmQgZWFybHlcblxuICAgICAgICBGaWxlLmNhY2hlLnNldCh0aGlzLmZpbGVuYW1lLCB7XG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgZXhwaXJlc1xuICAgICAgICB9KVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWRVcmxzKGl0ZW1zOiBGaWxlW10sIG9wdGlvbnM6IERyaXZlVXJsT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZS5nZXQoaXRlbS5maWxlbmFtZSlcblxuICAgICAgICAgICAgaWYgKGNhY2hlICYmIG5vdyA8IGNhY2hlLmV4cGlyZXMpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9IGNhY2hlLnVybFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgYXdhaXQgaXRlbS5sb2FkVXJsKG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWRNZXRhcyhpdGVtczogRmlsZVtdKXtcbiAgICAgICAgY29uc3QgaWRzID0gaXRlbXMubWFwKGkgPT4gaS5pZClcbiAgICBcbiAgICAgICAgaWYgKCFpZHMubGVuZ3RoKSByZXR1cm5cbiAgICBcbiAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IEZpbGVNZXRhLmxpc3Qoe1xuICAgICAgICAgICAgcXVlcnk6IHEgPT4gcS5zZWxlY3RBbGwoKS53aGVyZSgnZmlsZV9pZCcsICdpbicsIGlkcylcbiAgICAgICAgfSlcbiAgICBcbiAgICAgICAgaXRlbXMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGYubWV0YXMgPSBNZXRhZGF0YVNlcnZpY2UuZmxhdHRlbihyb3dzLmZpbHRlcihyID0+IHIuZmlsZV9pZCA9PT0gZi5pZCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbGV0ZUZyb21Ecml2ZSgpIHtcbiAgICAgICAgYXdhaXQgZHJpdmUudXNlKHRoaXMuZHJpdmUpLmRlbGV0ZSh0aGlzLmZpbGVuYW1lKVxuICAgIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgR2l0R2F0ZXdheSB9IGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvR2l0R2F0ZXdheS50cydcbmltcG9ydCB7IHRtcFBhdGggfSBmcm9tICcjc2VydmVyL3V0aWxzL2Jhc2VQYXRoLnRzJ1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBzaGVsbCBmcm9tICcjc2VydmVyL2ZhY2FkZXMvc2hlbGwudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgbG9nZ2VyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9sb2dnZXIudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgICBwdWJsaWMgZ2V0IGdpdCgpe1xuICAgICAgICByZXR1cm4gbmV3IEdpdEdhdGV3YXkoe1xuICAgICAgICAgICAgY3dkOiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgICAgIHNzaEtleTogY29uZmlnLmdldChgbW9kdWxlcy4ke3RoaXMuaWR9LnNzaF9rZXlgKSxcbiAgICAgICAgICAgIHNzaEtleVRtcEZpbGVOYW1lOiB0bXBQYXRoKGBzc2hfa2V5XyR7dGhpcy5pZH0ucGVtYCksXG4gICAgICAgICAgICBsb2dnZXI6IGxvZ2dlci5jaGlsZCh7IGxhYmVsOiAnZ2l0JyB9KSxcbiAgICAgICAgICAgIGRlYnVnOiBjb25maWcuZ2V0KCdnaXQuZGVidWcnLCBmYWxzZSksXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG1ha2VQYXRoKC4uLnBhcnRzOiBzdHJpbmdbXSkge1xuICAgICAgICByZXR1cm4gam9pbih0aGlzLmRpcmVjdG9yeSwgLi4ucGFydHMpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpY1BhdGgoLi4ucGFydHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBqb2luKCcvc3RhdGljJywgJ21vZHVsZXMnLCB0aGlzLmlkLCAuLi5wYXJ0cylcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tbWFuZDogdHlwZW9mIHNoZWxsLmNvbW1hbmQgPSAoYmluLCBhcmdzLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBzaGVsbC5jb21tYW5kKGJpbiwgYXJncywge1xuICAgICAgICAgICAgY3dkOiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoKXtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RQYXRoID0gdGhpcy5tYWtlUGF0aCgnbW9kdWxlLmpzb24nKVxuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmLTgnKVxuICAgICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShjb250ZW50KVxuXG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0ganNvbi5kZXBlbmRlbmNpZXMgfHwge31cbiAgICAgICAgdGhpcy5idWlsZCA9IGpzb24uYnVpbGQgfHwge30gICAgICBcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZENsaWVudEVudHJ5cG9pbnRGaWxlbmFtZShjb250ZXh0OiAnZGV2JyB8ICdub2RlJyB8ICdicm93c2VyJyA9ICdkZXYnKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXSBhcyBzdHJpbmdbXVxuXG4gICAgICAgIGlmIChjb250ZXh0ID09PSAnZGV2Jykge1xuICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudCcsICdtb2R1bGUuY2xpZW50LnRzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50JywgJ21vZHVsZS5jbGllbnQuanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQnLCAnY2xpZW50LnRzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50JywgJ2NsaWVudC5qcycpLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQgPT09ICdub2RlJykge1xuICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudC1kaXN0L25vZGUnLCAnaW5kZXguanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9ub2RlJywgJ2luZGV4Lm1qcycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudC1kaXN0L25vZGUnLCAnbW9kdWxlLmNsaWVudC5qcycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudC1kaXN0L25vZGUnLCAnbW9kdWxlLmNsaWVudC5tanMnKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0ID09PSAnYnJvd3NlcicpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9icm93c2VyJywgJ2luZGV4LmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3QvYnJvd3NlcicsICdpbmRleC5tanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9icm93c2VyJywgJ21vZHVsZS5jbGllbnQuanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9icm93c2VyJywgJ21vZHVsZS5jbGllbnQubWpzJyksXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCBDb29raWVNYXBFbnRpdHkgZnJvbSBcIiNzZXJ2ZXIvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzXCJcbmltcG9ydCBDb250YWluZXJTZXJ2aWNlIGZyb20gXCIjc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHNcIlxuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnXG5pbXBvcnQgdHlwZSB7IFJlc29sdmFibGVIZWFkIH0gZnJvbSAnQHVuaGVhZC92dWUnXG5pbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tIFwiI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlUmVxdWVzdENvbnRleHRFbnRpdHlPcHRpb25zIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICByZXF1ZXN0OiBSZXF1ZXN0O1xuICAgIHJlc3BvbnNlOiBSZXNwb25zZTtcblxuICAgIHN0YXRlPzogTWFwPHN0cmluZywgYW55PlxuXG4gICAgbm9kZUNvbnRhaW5lcj86IENvbnRhaW5lclNlcnZpY2VcbiAgICBub2RlQ29uZmlnPzogQ29uZmlnU2VydmljZVxuICAgIG5vZGVTdGF0ZT86IE1hcDxzdHJpbmcsIGFueT5cblxuICAgIGJyb3dzZXJDb250YWluZXI/OiBDb250YWluZXJTZXJ2aWNlXG4gICAgYnJvd3NlckNvbmZpZz86IENvbmZpZ1NlcnZpY2VcbiAgICBicm93c2VyU3RhdGU/OiBNYXA8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VSZXF1ZXN0Q29udGV4dEVudGl0eSB7XG4gICAgcHVibGljIHVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZXF1ZXN0OiBSZXF1ZXN0O1xuICAgIHB1YmxpYyByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgcHVibGljIGNvb2tpZXM6IENvb2tpZU1hcEVudGl0eVxuICAgIHB1YmxpYyBoZWFkOiBSZXNvbHZhYmxlSGVhZFtdXG5cbiAgICBwdWJsaWMgbm9kZUNvbnRhaW5lcjogQ29udGFpbmVyU2VydmljZVxuICAgIHB1YmxpYyBub2RlQ29uZmlnOiBDb25maWdTZXJ2aWNlXG4gICAgcHVibGljIG5vZGVTdGF0ZTogTWFwPHN0cmluZywgYW55PlxuXG4gICAgcHVibGljIGJyb3dzZXJDb250YWluZXI6IENvbnRhaW5lclNlcnZpY2VcbiAgICBwdWJsaWMgYnJvd3NlckNvbmZpZzogQ29uZmlnU2VydmljZVxuICAgIHB1YmxpYyBicm93c2VyU3RhdGU6IE1hcDxzdHJpbmcsIGFueT5cblxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFnZVJlcXVlc3RDb250ZXh0RW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsXG4gICAgICAgIHRoaXMucmVxdWVzdCA9IGRhdGEucmVxdWVzdFxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gZGF0YS5yZXNwb25zZVxuICAgICAgICB0aGlzLmNvb2tpZXMgPSBuZXcgQ29va2llTWFwRW50aXR5KHRoaXMucmVxdWVzdCwgdGhpcy5yZXNwb25zZSlcblxuICAgICAgICB0aGlzLmhlYWQgPSBbXVxuXG4gICAgICAgIHRoaXMubm9kZUNvbnRhaW5lciA9IGRhdGEubm9kZUNvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG4gICAgICAgIHRoaXMubm9kZUNvbmZpZyA9IGRhdGEubm9kZUNvbmZpZyB8fCBuZXcgQ29uZmlnU2VydmljZSgpXG4gICAgICAgIHRoaXMubm9kZVN0YXRlID0gZGF0YS5ub2RlU3RhdGUgfHwgbmV3IE1hcDxzdHJpbmcsIGFueT4oKVxuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbmZpZyA9IGRhdGEuYnJvd3NlckNvbmZpZyB8fCBuZXcgQ29uZmlnU2VydmljZSgpXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbnRhaW5lciA9IGRhdGEuYnJvd3NlckNvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG4gICAgICAgIHRoaXMuYnJvd3NlclN0YXRlID0gZGF0YS5icm93c2VyU3RhdGUgfHwgbmV3IE1hcDxzdHJpbmcsIGFueT4oKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRCcm93c2VyU3RhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5icm93c2VyU3RhdGUuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldE5vZGVTdGF0ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm5vZGVTdGF0ZS5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U3RhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXROb2RlU3RhdGUoa2V5LCB2YWx1ZSlcbiAgICAgICAgdGhpcy5zZXRCcm93c2VyU3RhdGUoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QnJvd3NlckNvbnRhaW5lclZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYnJvd3NlckNvbnRhaW5lci5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Tm9kZUNvbnRhaW5lclZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubm9kZUNvbnRhaW5lci5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29udGFpbmVyVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXROb2RlQ29udGFpbmVyVmFsdWUoa2V5LCB2YWx1ZSlcbiAgICAgICAgdGhpcy5zZXRCcm93c2VyQ29udGFpbmVyVmFsdWUoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QnJvd3NlckNvbmZpZ1ZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYnJvd3NlckNvbmZpZy5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Tm9kZUNvbmZpZ1ZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubm9kZUNvbmZpZy5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29uZmlnVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXROb2RlQ29uZmlnVmFsdWUoa2V5LCB2YWx1ZSlcbiAgICAgICAgdGhpcy5zZXRCcm93c2VyQ29uZmlnVmFsdWUoa2V5LCB2YWx1ZSlcbiAgICB9XG5cbn1cbiIsImltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRyeUVudGl0eSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyBtYWtlUGF0aCguLi5wYXJ0czogc3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIGpvaW4odGhpcy5kaXJlY3RvcnksIC4uLnBhcnRzKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJ1xuaW1wb3J0IFJvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJGaWxlQmFzZVJvdXRpbmdTZXJ2aWNlLnRzJ1xuaW1wb3J0IFBsdWdpbkVudHJ5RW50aXR5IGZyb20gJy4vUGx1Z2luRW50cnlFbnRpdHkudHMnXG5pbXBvcnQgZW1taXR0ZXIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2VtbWl0dGVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZXJFdmVudHMgfSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSBSb3V0ZXJSZWdpc3RlciBmcm9tICcjc2VydmVyL3NlcnZpY2VzL1JvdXRlclJlZ2lzdGVyU2VydmljZS50cydcblxuaW50ZXJmYWNlIEFkZEFwaUZvbGRlck9wdGlvbnMge1xuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBQbHVnaW5FbnRyeUVudGl0eSB7XG4gICAgcHVibGljIGFwaUZvbGRlcnMgPSBuZXcgTWFwPHN0cmluZywgQWRkQXBpRm9sZGVyT3B0aW9ucz4oKVxuICAgIHB1YmxpYyBhcGlEaXJlY3RvcmllcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKVxuXG4gICAgICAgIGVtbWl0dGVyLm9uKCdyb3V0ZXI6cmVnaXN0ZXJlZCcsIHRoaXMub25Sb3V0ZXJSZWdpc3RlcmVkLmJpbmQodGhpcykpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpY1BhdGgoLi4ucGFydHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBqb2luKCcvc3RhdGljJywgJ21vZHVsZXMnLCB0aGlzLmlkLCAuLi5wYXJ0cylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbG9hZCBhZGRpdGlvbmFsIGRhdGEgZnJvbSB0aGUgcGx1Z2luJ3MgZGlyZWN0b3J5IGlmIG5lZWRlZFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvblJvdXRlclJlZ2lzdGVyZWQoY3R4OiBSb3V0ZXJFdmVudHNbJ3JvdXRlcjpyZWdpc3RlcmVkJ10pIHtcbiAgICAgICAgY29uc3Qgcm91dGVyID0gY3R4LnJvdXRlciBhcyBSb3V0ZXJSZWdpc3RlclxuXG4gICAgICAgIGZvciAoY29uc3QgW2RpcmVjdG9yeSwgb3B0aW9uc10gb2YgdGhpcy5hcGlGb2xkZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBvcHRpb25zLnByZWZpeCB8fCBgL2FwaS9gXG5cbiAgICAgICAgICAgIGF3YWl0IFJvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2VcbiAgICAgICAgICAgICAgICAuY3JlYXRlKGRpcmVjdG9yeSlcbiAgICAgICAgICAgICAgICAuc2V0UHJlZml4KHByZWZpeClcbiAgICAgICAgICAgICAgICAuc2V0Um91dGVyKHJvdXRlcilcbiAgICAgICAgICAgICAgICAuc2V0TW9kdWxlKHRoaXMuaWQpXG4gICAgICAgICAgICAgICAgLmxvYWQoKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBhcGlEaXIgb2YgdGhpcy5hcGlEaXJlY3Rvcmllcykge1xuICAgICAgICAgICAgcm91dGVyLmFkZERpcihhcGlEaXIsIHtcbiAgICAgICAgICAgICAgICBtb2R1bGU6IHRoaXMuaWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEFwaUZvbGRlcihkaXJlY3Rvcnk6IHN0cmluZywgb3B0aW9uczogQWRkQXBpRm9sZGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuYXBpRm9sZGVycy5zZXQoZGlyZWN0b3J5LCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRSb3V0ZXJGb2xkZXIoZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5hcGlEaXJlY3Rvcmllcy5hZGQoZGlyZWN0b3J5KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVBsdWdpbkRpc2NvdmVyRW50aXR5PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBlbnRpdHk6IFBsdWdpbkVudHJ5RW50aXR5KTogVCB7XG4gICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogUGx1Z2luRW50aXR5KSBhcyBhbnlcblxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICBpZDogZW50aXR5LmlkLFxuICAgICAgICAgICAgbmFtZTogZW50aXR5Lm5hbWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBlbnRpdHkudmVyc2lvbixcbiAgICAgICAgICAgIGRpcmVjdG9yeTogZW50aXR5LmRpcmVjdG9yeSxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29udHJ1Y3Rvcj8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGVudGl0eSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHBheWxvYWQgPSAodGhpcyBhcyBhbnkpLnBhcnNlKGVudGl0eSlcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgIH1cblxuXG59XG4iLCJpbXBvcnQgdHlwZSB7IFRva2VuLCBVc2VyRW50aXR5IH0gZnJvbSAnQHNpZGVraWNrLWNvZGVyL3plbml0aC1raXQvc2hhcmVkJ1xuaW1wb3J0IHR5cGUgeyAgTWlkZGxld2FyZSwgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Sb3V0ZXJDb250cmFjdC50cydcbmltcG9ydCB7IEJhc2VFeGNlcHRpb24gfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuXG5leHBvcnQgdHlwZSBBdXRoTWlkZGxld2FyZUNvbnRleHQgPSB7XG4gICAgdXNlcjogVXNlckVudGl0eVxuICAgIHRva2VuOiBUb2tlblxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdXRoTWlkZGxld2FyZSBpbXBsZW1lbnRzIE1pZGRsZXdhcmUge1xuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUoY3R4OiBhbnkpOiBQcm9taXNlPEF1dGhNaWRkbGV3YXJlQ29udGV4dD4ge1xuICAgICAgICBpZiAoIWN0eC51c2VyIHx8ICFjdHgudG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdJbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHRva2VuJywgNDAxKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVzZXI6IGN0eC51c2VyISxcbiAgICAgICAgICAgIHRva2VuOiBjdHgudG9rZW4hLFxuICAgICAgICB9XG4gICAgfVxufVxuXG4iLCJpbXBvcnQgdHlwZSB7IFRva2VuIH0gZnJvbSAnQHNpZGVraWNrLWNvZGVyL3plbml0aC1raXQvc2hhcmVkJ1xuaW1wb3J0IHR5cGUgeyBNaWRkbGV3YXJlLCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LnRzJ1xuaW1wb3J0IHR5cGUgVXNlciBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMnXG5pbXBvcnQgdG9rZW5SZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy90b2tlblJlcG9zaXRvcnkudHMnXG5pbXBvcnQgdXNlclJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9mYWNhZGVzL3VzZXJSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHR5cGUgeyBIdHRwQ29udGV4dCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHMnXG5cbmV4cG9ydCB0eXBlIEF1dGhTaWxlbmNlTWlkZGxld2FyZUNvbnRleHQgPSB7XG4gICAgdXNlcj86IFVzZXJcbiAgICB0b2tlbj86IFRva2VuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dGhTaWxlbmNlTWlkZGxld2FyZSBpbXBsZW1lbnRzIE1pZGRsZXdhcmUge1xuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUoY3R4OiBIdHRwQ29udGV4dCk6IFByb21pc2U8QXV0aFNpbGVuY2VNaWRkbGV3YXJlQ29udGV4dD4ge1xuICAgICAgICAvLyBFeGFtcGxlIGF1dGhlbnRpY2F0aW9uIGxvZ2ljXG4gICAgICAgIGxldCB0b2tlbiA9IGN0eC5jb29raWUuZ2V0KCdBdXRob3JpemF0aW9uJylcblxuICAgICAgICBpZiAoY3R4LnJlcXVlc3QgJiYgY3R4LnJlcXVlc3QuaGVhZGVyc1snYXV0aG9yaXphdGlvbiddKSB7XG4gICAgICAgICAgICB0b2tlbiA9IGN0eC5yZXF1ZXN0LmhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuICYmIHRva2VuLnN0YXJ0c1dpdGgoJ0JlYXJlciAnKSkge1xuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zbGljZSg3KSAvLyBSZW1vdmUgJ0JlYXJlciAnIHByZWZpeFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICAgICAgdXNlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRva2VuOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b2tlblJvdyA9IGF3YWl0IHRva2VuUmVwb3NpdG9yeS5maW5kQnlUb2tlbih0b2tlbilcbiAgICAgICAgbGV0IHVzZXI6IFVzZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICAgICAgICBpZiAodG9rZW5Sb3cpIHtcbiAgICAgICAgICAgIHVzZXIgPSBhd2FpdCB1c2VyUmVwb3NpdG9yeS5maW5kT3JGYWlsKHRva2VuUm93LnVzZXJfaWQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICB0b2tlbjogdG9rZW5Sb3cgfHwgdW5kZWZpbmVkLFxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBdXRoU2lsZW5jZU1pZGRsZXdhcmVDb250ZXh0IH0gZnJvbSAnLi9BdXRoU2lsZW5jZU1pZGRsZXdhcmUudHMnXG5pbXBvcnQgdHlwZSB7XG4gICAgTWlkZGxld2FyZSwgXG4gICAgTWlkZGxld2FyZUhhbmRsZVJlc3VsdCBcbn0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvUm91dGVyQ29udHJhY3QudHMnXG5cbmltcG9ydCBBY2wgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9BY2xFbnRpdHkudHMnXG5pbXBvcnQgUGVybWlzc2lvbiBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgbG9nZ2VyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9sb2dnZXIudHMnXG5pbXBvcnQgcGVybWlzc2lvblJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9mYWNhZGVzL3Blcm1pc3Npb25SZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LnRzJ1xuXG5leHBvcnQgdHlwZSBBdXRob3JpemF0aW9uQ29udGV4dCA9IE1pZGRsZXdhcmVIYW5kbGVSZXN1bHQ8W0F1dGhvcml6YXRpb25NaWRkbGV3YXJlXT5cblxuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpemVQZXJtaXNzaW9uUGF5bG9hZCB7XG4gICAgYWN0aW9uOiBzdHJpbmdcbiAgICByZXNvdXJjZTogc3RyaW5nXG4gICAgY29uZGl0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhvcml6ZVBlcm1pc3Npb24gaW1wbGVtZW50cyBNaWRkbGV3YXJlIHtcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBBdXRob3JpemVQZXJtaXNzaW9uUGF5bG9hZFtdXG5cbiAgICBjb25zdHJ1Y3RvcihwYXlsb2FkOiBBdXRob3JpemVQZXJtaXNzaW9uUGF5bG9hZCB8IEF1dGhvcml6ZVBlcm1pc3Npb25QYXlsb2FkW10pIHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZShjdHg6IEF1dGhvcml6YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLnBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICBjdHguYWNsLmF1dGhvcml6ZShcbiAgICAgICAgICAgICAgICBwLmFjdGlvbixcbiAgICAgICAgICAgICAgICBwLnJlc291cmNlLFxuICAgICAgICAgICAgICAgIHAuY29uZGl0aW9ucyB8fCB7fSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aG9yaXphdGlvbk1pZGRsZXdhcmUgaW1wbGVtZW50cyBNaWRkbGV3YXJlIHtcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKGN0eDogQXV0aFNpbGVuY2VNaWRkbGV3YXJlQ29udGV4dCl7XG4gICAgICAgIGNvbnN0IHRva2VuID0gY3R4LnRva2VuXG4gICAgICAgIGxldCBjdXJyZW50UGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSA9IFtdXG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25Db250ZXh0ID0ge30gYXMgUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgICAgIC8vIGlmIGF1dGggdG9rZW4gbG9hZCBwZXJtaXNzaW9ucyBmb3IgdXNlclxuICAgICAgICBpZiAoY3R4LnVzZXIgJiYgdG9rZW4/LnR5cGUgPT09ICdhdXRoJykge1xuICAgICAgICAgICAgY29uc3QgYXNzaWdubWVudHMgPSBhd2FpdCBwZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkuZmluZE1hbnkoe1xuICAgICAgICAgICAgICAgIGFzc2lnbmFibGVJZDogU3RyaW5nKGN0eC51c2VyLmlkKSxcbiAgICAgICAgICAgICAgICBhc3NpZ25hYmxlVHlwZTogJ3VzZXInXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjdXJyZW50UGVybWlzc2lvbnMgPSBhd2FpdCBwZXJtaXNzaW9uUmVwb3NpdG9yeS5maW5kTWFueSh7IGlkOiBhc3NpZ25tZW50cy5tYXAoYSA9PiBhLnBlcm1pc3Npb25faWQpIH0pXG5cbiAgICAgICAgICAgIHBlcm1pc3Npb25Db250ZXh0LmF1dGggPSB7XG4gICAgICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogY3R4LnVzZXIuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGN0eC51c2VyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVtYWlsOiBjdHgudXNlci5lbWFpbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgPT09ICdhcGknKSB7XG4gICAgICAgICAgICBjb25zdCBhc3NpZ25tZW50cyA9IGF3YWl0IHBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeS5maW5kTWFueSh7XG4gICAgICAgICAgICAgICAgYXNzaWduYWJsZUlkOiBTdHJpbmcodG9rZW4uaWQpLFxuICAgICAgICAgICAgICAgIGFzc2lnbmFibGVUeXBlOiAndG9rZW4nXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjdXJyZW50UGVybWlzc2lvbnMgPSBhd2FpdCBwZXJtaXNzaW9uUmVwb3NpdG9yeS5maW5kTWFueSh7IGlkOiBhc3NpZ25tZW50cy5tYXAoYSA9PiBhLnBlcm1pc3Npb25faWQpIH0pXG5cbiAgICAgICAgICAgIHBlcm1pc3Npb25Db250ZXh0LmFwaSA9IHtcbiAgICAgICAgICAgICAgICB0b2tlbjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gUGVybWlzc2lvbi5hcHBseUNvbnRleHQoY3VycmVudFBlcm1pc3Npb25zLCBwZXJtaXNzaW9uQ29udGV4dClcblxuICAgICAgICBjb25zdCBhY2wgPSBuZXcgQWNsKHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgZGVidWc6IGNvbmZpZy5nZXQoJ2FjbC5kZWJ1ZycpIHx8IGNvbmZpZy5nZXQoJ2FwcC5kZWJ1ZycpLFxuICAgICAgICAgICAgbG9nZ2VyOiBsb2dnZXIuY2hpbGQoeyBsYWJlbDogJ2FjbCcgfSksXG4gICAgICAgIH0pXG4gICAgICAgIFxuICAgICAgICByZXR1cm4geyBhY2wgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKHBheWxvYWQ6IEF1dGhvcml6ZVBlcm1pc3Npb25QYXlsb2FkIHwgQXV0aG9yaXplUGVybWlzc2lvblBheWxvYWRbXSkge1xuICAgICAgICByZXR1cm4gbmV3IEF1dGhvcml6ZVBlcm1pc3Npb24ocGF5bG9hZClcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXhjZXB0aW9uIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcbmltcG9ydCB0eXBlIHsgTG9hZGVyLCBMb2FkZXJSZWNvcmQgfSBmcm9tICcuL2RlZmluZUxvYWRlci50cydcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvYWRlckZhY3Rvcnk8RSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBSIGV4dGVuZHMgTG9hZGVyUmVjb3JkPEU+ID0gTG9hZGVyUmVjb3JkPEU+Pihsb2FkZXJzOiBSKSB7XG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZChlbnRpdGllczogRSB8IEVbXSwgbmFtZXM6IGtleW9mIFIgfCAoa2V5b2YgUilbXSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkoZW50aXRpZXMpID8gZW50aXRpZXMgOiBbZW50aXRpZXNdXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uTmFtZXMgPSBBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzIDogW25hbWVzXVxuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiByZWxhdGlvbk5hbWVzKSB7XG4gICAgICAgICAgICBjb25zdCBsb2FkZXIgPSBsb2FkZXJzPy5bbmFtZSBhcyBzdHJpbmddIGFzIExvYWRlclxuXG4gICAgICAgICAgICBpZiAoIWxvYWRlcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBMb2FkZXIgJHtTdHJpbmcobmFtZSl9IG5vdCBkZWNsYXJlZGApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IGxvYWRlci5sb2FkKGl0ZW1zKVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBrZXlzOiBPYmplY3Qua2V5cyhsb2FkZXJzKSBhcyAoa2V5b2YgUilbXSxcbiAgICAgICAgbG9hZGVycyxcbiAgICAgICAgbG9hZCBcbiAgICB9XG59XG5cbiIsImltcG9ydCB0eXBlIHsgSHR0cENvbnRleHQgfSBmcm9tIFwiI3NlcnZlci9jb250cmFjdHMvSHR0cENvbnRleHRDb250cmFjdC50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lSGFuZGxlcihoYW5kbGVyOiAoY3R4OiBIdHRwQ29udGV4dCkgPT4gKFByb21pc2U8YW55PiB8ICgoKSA9PiBhbnkpKSkge1xuICAgIHJldHVybiBoYW5kbGVyXG59XG4iLCJpbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcblxuLy8gZ2VuZXJhdGUgaW5kZXhlcyBmb3IgZm9sZGVycyBcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4RmlsZShvcHRpb25zOiBhbnkpIHtcbiAgICBjb25zdCBmb2xkZXJzID0gb3B0aW9ucy5mb2xkZXJzXG4gICAgY29uc3QgZmlsZW5hbWUgPSBvcHRpb25zLmZpbGVuYW1lXG4gICAgY29uc3QgZ2xvYiA9IG9wdGlvbnMuZ2xvYiB8fCAnKiovKi4odHN8anMpJ1xuICAgIGNvbnN0IGRlZmF1bHRJZ25vcmUgPSBbXG4gICAgICAgIFwiKiovaW5kZXgudHNcIixcbiAgICAgICAgXCIqKi8qLnNwZWMudHNcIixcbiAgICAgICAgXCIqKi8qLnNwZWMtZC50c1wiLFxuICAgICAgICBcIioqLyoudGVzdC50c1wiLFxuICAgICAgICBcIioqLyoudGVzdC1kLnRzXCIsXG4gICAgXVxuXG4gICAgY29uc3QgaWdub3JlID0gb3B0aW9ucy5pZ25vcmUgfHwgW11cblxuICAgIGxldCBjb250ZW50ID0gJydcblxuICAgIGZvciAoY29uc3QgZm9sZGVyIG9mIGZvbGRlcnMpIHtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmZy5zeW5jKGAke2ZvbGRlcn0vJHtnbG9ifWAsIHtcbiAgICAgICAgICAgIGlnbm9yZTogWy4uLmRlZmF1bHRJZ25vcmUsIC4uLmlnbm9yZV0sIFxuICAgICAgICB9KVxuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShmaWxlbmFtZSksIGZpbGUpXG4gICAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZSlcblxuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JylcblxuICAgICAgICAgICAgbGV0IHNob3VsZEV4cG9ydERlZmF1bHQgPSBmaWxlQ29udGVudC5pbmNsdWRlcygnZXhwb3J0IGRlZmF1bHQnKSAmJiAhZmlsZVBhdGguaW5jbHVkZXMoJ2dlbmVyYXRlSW5kZXhGaWxlLnRzJylcblxuICAgICAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy52dWUnKSkge1xuICAgICAgICAgICAgICAgIHNob3VsZEV4cG9ydERlZmF1bHQgPSB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRlbnQgKz0gYGV4cG9ydCAqIGZyb20gJy4vJHtmaWxlUGF0aH0nXFxuYFxuXG4gICAgICAgICAgICAvLyBkZWZhdWx0IGV4cG9ydCBcbiAgICAgICAgICAgIGlmIChzaG91bGRFeHBvcnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgY29udGVudCArPSBgZXhwb3J0IHsgZGVmYXVsdCBhcyAke3BhdGguYmFzZW5hbWUoZmlsZSwgZXh0ZW5zaW9uKX0gfSBmcm9tICcuLyR7ZmlsZVBhdGh9J1xcbmBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRlbnQgPSBjb250ZW50LnRyaW0oKVxuXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlbmFtZSwgY29udGVudClcbn1cbiIsImltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0T25lKGZpbGVuYW1lczogc3RyaW5nW10pOiBQcm9taXNlPGFueT4ge1xuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZmlsZW5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVVcmwgPSBwYXRoVG9GaWxlVVJMKGZpbGVuYW1lKVxuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoZmlsZVVybC50b1N0cmluZygpKVxuXG4gICAgICAgIHJldHVybiBtb2RcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxufVxuIl0sIm1hcHBpbmdzIjoiKy9DQWFBLFNBQWdCLEdBQVksRUFBYyxFQUFFLENBQUUsRUFBeUIsRUFBRSxDQUFFLENBQ3ZFLElBQU0sRUFBYyxRQUFRLE9BQU8sU0FBVyxHQUl4QyxFQUFRLElBQUksRUFBTSxDQUNwQixTQUFVLEdBQ1YsbUJBQW9CLEdBQ3BCLFVBQVcsQ0FORSxFQUFRLFVBQVksS0FBSyxNQUFNLEVBQWMsR0FBSSxDQUMvQyxLQUFLLE1BQU0sRUFBYyxHQUFJLENBS1gsQ0FDcEMsQ0FBQyxDQUVGLElBQUssSUFBTSxLQUFPLE9BQU8sS0FBSyxFQUFPLENBQ2pDLEVBQU0sS0FBSyxDQUFDLEVBQUssT0FBTyxFQUFPLEdBQUssQ0FBQyxDQUFDLENBRzFDLFFBQVEsSUFBSSxFQUFNLFVBQVUsQ0FBQyxDQUdqQyxTQUFnQixHQUFXLEVBQWMsRUFBeUIsQ0FDOUQsSUFBTSxHQUFlLFFBQVEsT0FBTyxTQUFXLElBQU0sRUFDL0MsRUFBTyxFQUFFLENBQ1QsRUFBc0IsRUFBRSxDQUUxQixHQUNBLEVBQUssS0FBSyxHQUFHLEVBQVEsQ0FHcEIsR0FDRCxFQUFNLElBQUssR0FBYyxPQUFPLEtBQUssRUFBSyxDQUFDLENBQ3RDLE1BQU0sQ0FDTixRQUFRLEVBQU8sRUFBTyxJQUFTLEVBQUssUUFBUSxFQUFNLEdBQUssRUFBTSxDQUM3RCxRQUFTLEdBQVEsQ0FDZCxFQUFLLEtBQUssQ0FDTixNQUFPLEVBQ1AsTUFBTyxFQUNWLENBQUMsRUFDSixDQUdWLEVBQU0sUUFBUyxHQUFjLENBQ3pCLElBQU0sRUFBTSxFQUFFLENBRWQsRUFBSyxRQUFTLEdBQU0sQ0FDaEIsSUFBSSxFQUFRLEdBRVIsT0FBTyxFQUFFLE9BQVUsYUFDbkIsRUFBUSxFQUFFLE1BQU0sRUFBSyxFQUdyQixPQUFPLEVBQUUsT0FBVSxXQUNuQixFQUFRLEVBQUssRUFBRSxRQUduQixBQUNJLElBQVEsSUFHUixPQUFPLEdBQVUsVUFBWSxNQUFNLFFBQVEsRUFBTSxJQUNqRCxFQUFRLEtBQUssVUFBVSxFQUFNLEVBR2pDLEVBQUksS0FBSyxFQUFNLEVBQ2pCLENBRUYsRUFBSyxLQUFLLEVBQUksRUFDaEIsQ0FFRixFQUFLLFFBQVMsR0FBTSxDQUNoQixBQUNJLEVBQUUsUUFBUSxPQUFPLEVBQUUsTUFBTSxDQUc3QixBQUNJLEVBQUUsUUFBUSxPQUFPLEVBQUUsTUFBTSxFQUUvQixDQUdGLElBQU0sRUFBaUIsSUFETCxFQUFLLE9BQVEsR0FBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFLLElBQU0sRUFBTSxFQUFFLE1BQVEsRUFBRSxDQUUvRSxFQUFjLEVBQUssT0FBUSxHQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsT0FFakQsRUFBSyxRQUFTLEdBQU0sQ0FDaEIsQUFDSSxFQUFFLFFBQVEsS0FBSyxNQUFNLEVBQWlCLEVBQVksRUFFeEQsQ0FFRixFQUFLLFFBQVMsR0FBTSxDQUNaLEVBQUUsUUFDRixFQUFFLFVBQVksS0FBSyxNQUFNLEdBQWUsRUFBRSxNQUFRLEtBQUssR0FFN0QsQ0FFRixJQUFNLEVBQVEsSUFBSSxFQUFNLENBQ3BCLEtBQU0sRUFBSyxJQUFLLEdBQU0sRUFBRSxNQUFNLENBQzlCLE1BQU8sQ0FDSCxLQUFNLEVBQUUsQ0FDUixPQUFRLEVBQUUsQ0FDYixDQUNELFNBQVUsR0FDVixtQkFBb0IsR0FDcEIsVUFBVyxFQUFLLElBQUssR0FBTSxFQUFFLFVBQVUsQ0FDMUMsQ0FBQyxDQUVGLEVBQU0sS0FBSyxHQUFHLEVBQUssQ0FFbkIsUUFBUSxJQUFJLEVBQU0sVUFBVSxDQUFDLENDM0dqQyxlQUFzQixFQUErQixFQUEyQyxDQUM1RixHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sTUFBTSxHQUFPLENBQ1AsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssRUFJbkMsRUFBUyxLQUFPLFNBQTJCLEVBQTZCLENBQ3BFLEdBQUksQ0FFQSxNQUFPLENBQUMsS0FETyxHQUFPLENBQ0QsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssR0N0Qm5DLElBQXFCLEVBQXJCLE1BQXFCLENBQWMsQ0FDL0IsT0FBYyxzQkFBd0IsZ0JBRXRDLEtBQVksRUFBaUIsRUFBa0IsRUFJL0MsTUFBYSxFQUFpQixFQUFrQixFQUloRCxLQUFZLEVBQWlCLEVBQWtCLEVBSS9DLE1BQWEsRUFBaUIsRUFBa0IsRUFJaEQsTUFBYSxFQUE2QixDQUV0QyxPQUFPLElBQUksSUN6QkUsRUFBckIsTUFBcUIsVUFBc0IsS0FBTSxDQUM3QyxXQUE0QixJQUM1QixZQUFZLEVBQWlCLEVBQXFCLElBQUssQ0FDbkQsTUFBTSxFQUFRLENBQ2QsS0FBSyxLQUFPLEtBQUssWUFBWSxLQUM3QixLQUFLLFdBQWEsRUFHdEIsT0FBYyxVQUFVLEVBQTZCLENBQ2pELE9BQU8sSUFBSSxFQUFjLEVBQU0sUUFBUyxJQUFJLEdDSC9CLEdBQXJCLEtBQXNDLENBQ2xDLFFBQWtCLElBQUksSUFFdEIsZUFBc0IsRUFBbUMsQ0FDckQsT0FBTyxRQUFRLEVBQU8sQ0FBQyxTQUFTLENBQUMsRUFBSyxLQUFXLENBQzdDLEtBQUssSUFBSSxFQUFLLEVBQU0sRUFDdEIsQ0FHTixVQUF1QyxDQUNuQyxJQUFNLEVBQThCLEVBQUUsQ0FFdEMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEtBQUssUUFBUSxTQUFTLENBQzdDLEVBQU8sT0FBTyxFQUFJLEVBQUksRUFHMUIsT0FBTyxFQUdYLE9BQWUsRUFBNkIsQ0FDeEMsSUFBSSxFQUFNLEdBRU4sT0FBTyxHQUFZLFlBQWMsT0FBTyxHQUFZLFlBQ3BELEVBQU0sRUFBUSxNQUdsQixJQUFNLEVBQWdCLE9BQU8sR0FBWSxVQUFZLE9BQU8sR0FBWSxTQVV4RSxPQVJJLEdBQWlCLENBQUUsRUFBZ0IsdUJBQ25DLFFBQVEsS0FBSyw0QkFBNEIsRUFBUSxLQUFLLDJIQUEySCxDQUdqTCxHQUFrQixFQUFnQix3QkFDbEMsRUFBTyxFQUFnQix1QkFHcEIsRUFJWCxJQUFXLEVBQW1CLEVBQVksQ0FDdEMsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFRLENBSWhDLE9BRkEsS0FBSyxRQUFRLElBQUksRUFBSyxFQUFNLENBRXJCLEtBR1gsSUFBVyxFQUE0QixDQUNuQyxJQUFNLEVBQU0sS0FBSyxPQUFPLEVBQVEsQ0FFaEMsT0FBTyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBR2hDLElBQWMsRUFBc0IsQ0FDaEMsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFRLENBRWhDLEdBQUksQ0FBQyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBQ3RCLE1BQU0sSUFBSSxFQUFjLG1CQUFtQixPQUFPLEVBQUksQ0FBQywyQkFBMkIsQ0FLdEYsT0FGYyxLQUFLLFFBQVEsSUFBSSxFQUFJLENBS3ZDLFVBQW9CLEVBQXFDLENBQ3JELElBQU0sRUFBTSxFQUFpQixLQUN2QixFQUFtQixLQUFLLFFBQVEsSUFBSSxFQUFJLENBRTlDLEdBQUksRUFDQSxPQUFPLEVBR1gsSUFBTSxFQUFjLElBQUksRUFFeEIsT0FEQSxLQUFLLFFBQVEsSUFBSSxFQUFLLEVBQVksQ0FDM0IsRUFHWCxLQUFZLEVBQWlDLENBQ3pDLE9BQU8sUUFBUSxFQUFRLENBQUMsU0FBUyxDQUFDLEVBQUssS0FBVyxDQUM5QyxLQUFLLElBQUksRUFBSyxFQUFNLEVBQ3RCLENBR04sTUFBMEIsRUFBa0IsQ0FDeEMsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFFLENBQ2pCLEtBQU0sRUFBUyxJQUFTLENBQ3BCLElBQU0sRUFBUSxLQUFLLElBQU8sRUFBSSxDQUN4QixFQUFRLEVBQU0sR0FNcEIsT0FKSSxPQUFPLEdBQVUsV0FDVixFQUFNLEtBQUssRUFBTSxDQUdyQixFQUFNLElBRWpCLEtBQU0sRUFBUyxFQUFNLElBQVUsQ0FDM0IsSUFBTSxFQUFRLEtBQUssSUFBTyxFQUFJLENBSTlCLE1BRkEsR0FBTSxHQUFRLEVBRVAsSUFFZCxDQUFDLENBR04sTUFBMEIsQ0FDdEIsT0FBTyxNQUFNLEtBQUssS0FBSyxRQUFRLE1BQU0sQ0FBQyxHQ2hIOUMsTUFBTSxFQUFhLFdBQW1CLGlCQUFtQixJQUFJLEdBRTdELFdBQVcsZ0JBQWtCLEVDRDdCLE1BQU0sRUFBUyxFQUFVLE1BQXFCLEVBQWMsQ0NZNUQsZUFBc0IsR0FBWSxFQUFpQixFQUFtQixFQUFFLENBQWdDLENBQ3BHLElBQU0sRUFBK0IsRUFBRSxDQUNuQyxFQUF3QyxHQUFPLENBQy9DLE9BQU8sT0FBTyxFQUFJLE1BQU8sQ0FBRSxTQUFVLEVBQUksU0FBVSxDQUFDLENBRXBELEVBQU8sTUFBTSxvQkFBb0IsRUFBSSxXQUFZLEVBQUksTUFBTSxFQUczRCxFQUFRLFVBQ1IsRUFBVSxFQUFRLFNBR3RCLElBQUssSUFBTSxLQUFZLEVBQU8sQ0FDMUIsR0FBSSxFQUFRLFNBQVcsRUFBUSxRQUFRLEtBQUssR0FBVyxFQUFTLFNBQVMsRUFBUSxDQUFDLENBQzlFLFNBR0osSUFBTSxFQUFNLENBQUUsV0FBVSxDQUVwQixFQUFRLGdCQUNSLE1BQU0sRUFBUSxlQUFlLEVBQUksQ0FHckMsSUFBTSxFQUFnQixFQUFJLFNBQVMsTUFBTSxJQUFJLENBQUMsR0FFOUMsR0FBSSxpQkFBaUIsS0FBSyxFQUFjLENBQUUsQ0FFdEMsSUFBTSxFQUFVLEVBREosRUFBSyxRQUFRLEVBQUksU0FBUyxDQUNKLENBRTlCLEVBQVEsUUFBVSxJQUNsQixFQUFRLGFBQWEsSUFBSSxJQUFLLEtBQUssS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUd4RCxHQUFNLENBQUMsRUFBTyxHQUFPLE1BQU0sTUFBZSxPQUFPLEVBQVEsVUFBVSxFQUFFLENBRXJFLEdBQUksRUFBTyxDQUNQLE9BQU8sT0FBTyxFQUFPLENBQ2pCLFNBQVUsRUFBSSxTQUNkLElBQUssRUFDUixDQUFDLENBQ0YsRUFBUSxDQUNKLFNBQVUsRUFBSSxTQUNkLFFBQ0gsQ0FBQyxDQUNGLFNBR0osRUFBUSxHQUFZLEVBR3hCLEdBQUksVUFBVSxLQUFLLEVBQWMsQ0FBRSxDQUMvQixHQUFNLENBQUMsRUFBTyxHQUFRLE1BQU0sRUFBUyxTQUFZLENBQzdDLElBQU0sRUFBTyxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQUksU0FBVSxPQUFPLENBRTdELE9BQU8sS0FBSyxNQUFNLEVBQUssRUFDekIsQ0FFRixHQUFJLEVBQU8sQ0FDUCxFQUFRLENBQ0osU0FBVSxFQUFJLFNBQ2QsUUFDSCxDQUFDLENBQ0YsU0FHSixFQUFRLEdBQVksRUFHcEIsRUFBUSxlQUNSLE1BQU0sRUFBUSxjQUFjLENBQ3hCLEdBQUcsRUFDSCxPQUFRLEVBQVEsR0FDbkIsQ0FBQyxDQUlWLE9BQU8sRUFHWCxlQUFzQixHQUFXLEVBQWlCLEVBQW1CLEVBQUUsQ0FBZ0MsQ0FHbkcsT0FBTyxHQUZPLE1BQU0sRUFBRyxFQUFRLENBRU8sRUFBUSxDQUdsRCxlQUFzQixHQUFVLEVBQW1CLEVBQW1CLEVBQUUsQ0FBZ0MsQ0FPcEcsT0FBTyxJQU5TLE1BQU0sRUFBRyxTQUFTLFFBQVEsRUFBVyxDQUFFLGNBQWUsR0FBTSxDQUFDLEVBR3hFLE9BQU8sR0FBVSxFQUFPLFFBQVEsQ0FBQyxDQUNqQyxJQUFJLEdBQVUsRUFBSyxLQUFLLEVBQVcsRUFBTyxLQUFLLENBQUMsQ0FFM0IsRUFBUSxDQ3JGdEMsU0FBZ0IsRUFFZCxHQUFHLEVBQXVELENBQ3hELE9BQU8sRUFBTyxRQUFRLEVBQU0sSUFBVSxFQUFNLEVBQUssQ0FBRSxLQUFNLEdBQVUsQ0FtQnZFLFNBQWdCLEVBSVosRUFDQSxHQUFHLEVBQytDLENBQ2xELE9BQU8sRUFBTyxRQUFRLEVBQU0sSUFBVSxFQUFNLEVBQUssQ0FBRSxFQUFpQixDQUd4RSxTQUFnQixHQUFpQyxFQUFlLENBQzVELE9BQU8sU0FBdUMsRUFBaUIsQ0FDM0QsTUFBTSxVQUFjLENBQU8sQ0FDdkIsWUFBWSxHQUFHLEVBQWEsQ0FDeEIsTUFBTSxHQUFHLEVBQUssQ0FDZCxJQUFNLEVBQVMsSUFBSSxFQUFPLEdBQUcsRUFBSyxDQUNsQyxPQUFPLE9BQU8sS0FBTSxFQUFPLEVBS25DLElBQUssSUFBTSxLQUFPLFFBQVEsUUFBUSxFQUFPLFVBQVUsQ0FDM0MsSUFBUSxlQUNSLE9BQU8sZUFDSCxFQUFNLFVBQ04sRUFDQSxPQUFPLHlCQUF5QixFQUFPLFVBQVcsRUFBSSxDQUN6RCxDQUlULE9BQU8sR0N6RWYsU0FBZ0IsRUFBUSxFQUFVLEVBQVMsR0FBSSxFQUFXLEVBQUUsQ0FBdUIsQ0FDL0UsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxFQUFJLENBQUUsQ0FFNUMsSUFBTSxFQURVLFFBQVEsS0FBSyxFQUFJLENBQ1IsR0FBRyxFQUFPLEdBQUcsRUFBSSxHQUFLLEVBQVMsR0FBRyxFQUFPLEdBQUcsSUFBUSxFQUU3RSxHQUFJLEdBQVMsT0FBTyxHQUFVLFNBQVUsQ0FDcEMsRUFBUSxFQUFPLEVBQVEsRUFBSSxDQUMzQixTQUdKLEVBQUksR0FBVSxFQUdsQixPQUFPLEVDZlgsU0FBUyxJQUFNLENBWVgsT0FYSSxPQUFPLE9BQVcsS0FBZSxPQUFPLFdBQ2pDLE9BQU8sWUFBWSxDQUUxQixPQUFPLEtBQVMsS0FBZSxLQUFLLFFBQVUsS0FBSyxPQUFPLFdBQ25ELEtBQUssT0FBTyxZQUFZLENBRS9CLE9BQU8sT0FBVyxLQUFlLE9BQU8sUUFBVSxPQUFPLE9BQU8sV0FDekQsT0FBTyxPQUFPLFlBQVksQ0FJOUIsdUNBQXVDLFFBQVEsUUFBUyxTQUFVLEVBQUcsQ0FDeEUsSUFBTSxFQUFLLEtBQUssUUFBUSxDQUFHLEdBQU0sRUFFakMsT0FEVSxJQUFNLElBQU0sRUFBSyxFQUFJLEVBQU8sR0FDN0IsU0FBUyxHQUFHLEVBQ3ZCLENBR04sU0FBZ0IsRUFBUyxFQUFTLEdBQUksQ0FDbEMsT0FBTyxFQUFTLElBQU0sQ0NYMUIsSUFBcUIsRUFBckIsS0FBbUMsQ0FDL0IsT0FBYyxzQkFBd0IsZ0JBRXRDLFFBRUEsYUFBYyxDQUNWLEtBQUssUUFBVSxJQUFJLElBR3ZCLE1BQWMsQ0FDVixPQUFPLE1BQU0sS0FBSyxLQUFLLFFBQVEsUUFBUSxDQUFDLENBRzVDLFdBQWtCLEVBQWlCLENBSy9CLE9BSkksT0FBTyxHQUFVLFVBQVksRUFBTSxTQUFTLFdBQVcsQ0FDaEQsRUFBTSxRQUFRLFdBQVksR0FBRyxDQUFDLE1BQU0sR0FBSyxPQUc3QyxFQUdYLGVBQXNCLEVBQTZCLEVBQVMsU0FBZ0IsQ0FDeEUsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxFQUFPLENBQzdDLEtBQUssUUFBUSxJQUFJLEVBQUssQ0FDbEIsTUFDQSxNQUFPLEtBQUssV0FBVyxFQUFNLENBQzdCLFNBQ0gsQ0FBQyxDQUlWLGdCQUF1QixFQUEwQixFQUFTLFNBQWdCLENBQ3RFLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxFQUN2QixLQUFLLFFBQVEsSUFBSSxFQUFLLENBQ2xCLE1BQ0EsTUFBTyxLQUFLLFdBQVcsRUFBTSxDQUM3QixTQUNILENBQUMsQ0FJVixVQUF1QyxDQUNuQyxJQUFNLEVBQThCLEVBQUUsQ0FFdEMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEtBQUssUUFBUSxTQUFTLENBQzdDLEVBQU8sR0FBTyxFQUFNLE1BR3hCLE9BQU8sRUFHWCxJQUFXLEVBQXNCLENBRzdCLEdBRmMsS0FBSyxRQUFRLElBQUksRUFBSSxDQUcvQixNQUFPLEdBR1gsR0FBSSxDQUFDLEVBQUksU0FBUyxJQUFJLENBQ2xCLE1BQU8sR0FHWCxJQUFNLEVBQVUsRUFBSSxNQUFNLElBQUksQ0FBQyxHQUN6QixFQUFlLEtBQUssUUFBUSxJQUFJLEVBQVEsQ0FFOUMsR0FBSSxDQUFDLEVBR0QsTUFGYyxPQUFLLFFBQVEsSUFBSSxFQUFJLENBS3ZDLElBQU0sRUFBUSxFQUFhLE1BTTNCLE9BSkksT0FBTyxHQUFVLFVBQVksTUFBTSxRQUFRLEVBQU0sQ0FDMUMsR0FHSixHQUFJLEVBQU8sRUFBSSxVQUFVLEVBQVEsT0FBUyxFQUFFLENBQUMsQ0FHeEQsSUFBZ0MsRUFBYSxFQUF1QixDQUNoRSxJQUFNLEVBQVEsS0FBSyxRQUFRLElBQUksRUFBSSxDQUVuQyxHQUFJLEVBQ0EsT0FBTyxFQUFNLE1BR2pCLEdBQUksQ0FBQyxFQUFJLFNBQVMsSUFBSSxDQUNsQixPQUFPLEVBR1gsSUFBTSxFQUFVLEVBQUksTUFBTSxJQUFJLENBQUMsR0FDekIsRUFBZSxLQUFLLFFBQVEsSUFBSSxFQUFRLENBRTlDLEdBQUksQ0FBQyxFQUFjLENBQ2YsSUFBTSxFQUFRLEtBQUssUUFBUSxJQUFJLEVBQUksQ0FFbkMsT0FBTyxFQUFRLEVBQU0sTUFBUSxFQUdqQyxJQUFNLEVBQVEsRUFBYSxNQVEzQixPQU5JLE9BQU8sR0FBVSxVQUFZLE1BQU0sUUFBUSxFQUFNLENBQzFDLEVBR0ksRUFBSSxFQUFPLEVBQUksVUFBVSxFQUFRLE9BQVMsRUFBRSxDQUFFLEVBQWEsQ0FLOUUsT0FBbUMsRUFBZ0IsRUFBdUIsQ0FDdEUsSUFBSyxJQUFNLEtBQU8sRUFDZCxHQUFJLEtBQUssSUFBSSxFQUFJLENBQ2IsT0FBTyxLQUFLLElBQU8sRUFBSSxDQUkvQixPQUFPLEVBR1gsSUFBVyxFQUFhLEVBQVksRUFBUyxVQUFpQixDQUMxRCxHQUFJLENBQUMsRUFBSSxTQUFTLElBQUksQ0FBRSxDQUNwQixLQUFLLFFBQVEsSUFBSSxFQUFLLENBQ2IsTUFDRyxTQUNSLFFBQ0gsQ0FBQyxDQUNGLE9BR0osSUFBTSxFQUFVLEVBQUksTUFBTSxJQUFJLENBQUMsR0FDM0IsRUFBZSxLQUFLLElBQUksRUFBUyxFQUFFLENBQUMsRUFFcEMsT0FBTyxHQUFpQixVQUFZLE1BQU0sUUFBUSxFQUFhLElBQy9ELEVBQWUsRUFBRSxFQUdyQixFQUFJLEVBQWMsRUFBSSxVQUFVLEVBQVEsT0FBUyxFQUFFLENBQUUsRUFBTSxDQUUzRCxLQUFLLFFBQVEsSUFBSSxFQUFTLENBQ3RCLElBQUssRUFDRyxTQUNSLE1BQU8sRUFDVixDQUFDLENBR04sTUFBYSxFQUFtQixDQUM1QixHQUFJLENBQUMsRUFBSSxTQUFTLElBQUksQ0FBRSxDQUNwQixLQUFLLFFBQVEsT0FBTyxFQUFJLENBQ3hCLE9BR0osSUFBTSxFQUFVLEVBQUksTUFBTSxJQUFJLENBQUMsR0FDekIsRUFBZSxLQUFLLElBQUksRUFBUyxFQUFFLENBQUMsQ0FFckMsSUFFRCxPQUFPLEdBQWlCLFVBQVksTUFBTSxRQUFRLEVBQWEsR0FJbkUsR0FBTSxFQUFjLEVBQUksVUFBVSxFQUFRLE9BQVMsRUFBRSxDQUFDLENBRXRELEtBQUssUUFBUSxJQUFJLEVBQVMsQ0FDdEIsSUFBSyxFQUNMLE9BQVEsVUFDUixNQUFPLEVBQ1YsQ0FBQyxHQUdOLE9BQXFCLENBQ2pCLEtBQUssUUFBUSxPQUFPLENBR3hCLE1BQW1DLENBQy9CLE9BQU8sRUFBUSxLQUFLLFVBQVUsQ0FBQyxHQ2hLbEJBLEVBQXJCLE1BQXFCQSxDQUEwRSxDQUMzRixPQUFjLHNCQUF3QixrQkFFdEMsU0FBc0MsRUFBRSxDQUN4QyxNQUNBLE9BRUEsWUFBYSxFQUFrQyxDQUMzQyxLQUFLLE1BQVEsR0FBUyxPQUFTLEdBQy9CLEtBQUssT0FBUyxHQUFTLFFBQVUsSUFBSSxFQUVqQyxLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0sMENBQTBDLENBSXBFLE9BQWMsT0FBaUUsRUFBa0MsQ0FDN0csT0FBTyxJQUFJQSxFQUF3QixFQUFRLENBRy9DLFNBQWdCLEVBQWdCLENBQzVCLEtBQUssTUFBUSxFQUVULEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FJL0MsVUFBaUIsRUFBdUIsQ0FDcEMsS0FBSyxPQUFTLEVBS2xCLEdBQVUsRUFBZSxFQUF1QyxFQUFxQixDQUNqRixJQUFNLEVBQUssR0FBUyxJQUFNLEdBQVUsQ0FFcEMsR0FBSSxHQUFTLFFBQ00sS0FBSyxTQUFTLEtBQUssR0FBTSxFQUFFLFFBQVUsR0FBUyxFQUFFLFdBQWEsR0FBYSxFQUFFLEtBQU8sRUFBRyxDQUdqRyxPQUlSLElBQU0sRUFBMkIsQ0FDN0IsS0FDQSxRQUNBLFdBQ0gsQ0FRRCxPQU5BLEtBQUssU0FBUyxLQUFLLEVBQVEsQ0FFdkIsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLGdCQUFpQixFQUFRLENBR3hDLEVBS1gsS0FBWSxFQUFlLEVBQXVDLEVBQXFCLENBQ25GLElBQU0sRUFBVyxHQUFjLENBQzNCLEVBQVMsRUFBSyxDQUVkLEtBQUssSUFBSSxFQUFPLEVBQVEsRUFHNUIsT0FBTyxLQUFLLEdBQUcsRUFBTyxFQUFTLEVBQVEsQ0FNM0MsV0FBa0IsRUFBZSxFQUF1QyxFQUE2QixDQUNqRyxJQUFNLEVBQVksR0FBUyxFQUFVLEdBQVMsVUFBWSxJQUFJLENBRXhELEVBQVUsS0FBSyxHQUFHLEVBQU8sRUFBVyxFQUFRLENBTWxELE9BSkksSUFDQSxFQUFRLGlCQUFtQixHQUd4QixFQUtYLFFBQWUsRUFBa0IsRUFBb0IsRUFBcUIsQ0FDdEUsSUFBTSxFQUE4QixFQUFFLENBRXRDLElBQUssSUFBTSxLQUFTLEVBQVEsQ0FDeEIsSUFBTSxFQUFVLEtBQUssR0FBRyxFQUFPLEVBQWlCLEVBQVEsQ0FFcEQsR0FDQSxFQUFTLEtBQUssRUFBUSxDQUk5QixPQUFPLEVBR1gsSUFBVyxFQUFlLEVBQW9CLENBQzFDLEtBQUssU0FBVyxLQUFLLFNBQVMsT0FBTyxHQUNqQyxFQUFJLEVBQUUsUUFBVSxJQUFVLEVBQUUsV0FBYSxHQUFZLEVBQUUsbUJBQXFCLElBSzlFLENBRUUsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLGtCQUFtQixDQUFFLFFBQU8sQ0FBQyxDQU12RCxLQUFZLEVBQWUsRUFBWSxDQUUvQixLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0saUJBQWtCLENBQ2hDLFFBQ0EsT0FDSCxDQUFDLENBR04sSUFBTSxFQUFXLEtBQUssU0FBUyxPQUFPLEdBQUssRUFBRSxRQUFVLEVBQU0sQ0FFN0QsSUFBSyxJQUFNLEtBQVcsRUFDbEIsRUFBUyxTQUFXLEVBQVEsU0FBUyxFQUFLLENBQUMsQ0FNbkQsTUFBYSxZQUFZLEVBQWUsRUFBWSxDQUdoRCxJQUFNLEVBQVcsS0FBSyxTQUFTLE9BQU8sR0FBSyxFQUFFLFFBQVUsRUFBTSxDQUV6RCxLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0saUJBQWtCLENBQ2hDLFNBQVUsRUFBUyxPQUNuQixRQUNBLE9BQ0gsQ0FBQyxDQUdOLFVBQVcsSUFBTSxLQUFXLEVBQ3hCLE1BQU0sRUFBUSxTQUFTLEVBQUssQ0FLcEMsTUFBYyxDQUNWLE9BQU8sS0FBSyxTQUdoQixZQUFtQixFQUFlLENBQzlCLE9BQU8sS0FBSyxTQUFTLE9BQU8sR0FBSyxFQUFFLFFBQVUsRUFBTSxDQUd2RCxPQUFjLEVBQTRCLENBQ3RDLElBQU0sRUFBTSxNQUFNLFFBQVEsRUFBUSxDQUFHLEVBQVUsQ0FBQyxFQUFRLENBRXhELEtBQUssU0FBVyxLQUFLLFNBQVMsT0FBTyxHQUFLLENBQUMsRUFBSSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBRTFELEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSxtQkFBb0IsQ0FBRSxNQUFLLENBQUMsQ0FJdEQsT0FBZSxDQUNYLEtBQUssU0FBVyxFQUFFLENBRWQsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUlqRCxhQUFxQixDQUNqQixPQUFPLEtBQUssU0FBUyxPQUFTLElDNUxqQkMsR0FBckIsS0FBc0MsQ0FDbEMsT0FBYyxzQkFBd0IsbUJBRXRDLE1BQ0EsT0FDQSxNQUFlLEdBRWYsWUFBWSxFQUFnQyxFQUFFLENBQUUsQ0FDNUMsS0FBSyxNQUFRLEVBQUssT0FBUyxLQUFLLE1BQ2hDLEtBQUssTUFBUSxFQUFLLE9BQVMsSUFBSSxJQUMvQixLQUFLLE9BQVMsRUFBSyxRQUFVLElBQUksRUFFN0IsRUFBSyxVQUNMLEtBQUssUUFBVSxFQUFLLFNBSTVCLFFBQWUsRUFBYyxFQUFzRCxDQUMvRSxPQUFPLE9BQU8sRUFBTyxDQUFFLFVBQVMsQ0FBQyxDQUVqQyxLQUFLLE9BQU8sTUFBTSxpQkFBaUIsRUFBUSxPQUFPLElBQUksRUFBUSxPQUFPLElBQUssRUFBTSxDQUdwRixXQUFrQixFQUFnQixDQUM5QixJQUFNLEVBQW1CLEVBQUUsQ0FDckIsRUFBTSxNQUFNLEtBQUssS0FBSyxNQUFNLFFBQVEsQ0FBQyxDQUUzQyxJQUFLLElBQU0sS0FBUSxFQUFLLENBQ3BCLEdBQUksRUFBSyxTQUFTLEVBQUssUUFBUSxDQUFFLENBQzdCLEVBQU8sS0FBSyxFQUFLLFFBQVEsQ0FDekIsU0FHQSxFQUFLLGNBQ2dCLEVBQUssYUFBYSxLQUFLLEdBQVMsRUFBSyxTQUFTLEVBQU0sQ0FBQyxFQUd0RSxFQUFPLEtBQUssRUFBSyxRQUFRLENBS3JDLE9BQU8sRUFHWCxLQUFZLEVBQXVCLENBQy9CLElBQUksRUFBUSxNQUFNLEtBQUssS0FBSyxNQUFNLFFBQVEsQ0FBQyxDQUUzQyxHQUFJLEdBQVMsUUFBUyxDQUNsQixJQUFJLEVBQU0sTUFBTSxRQUFRLEVBQVEsUUFBUSxDQUFHLEVBQVEsUUFBVSxDQUFDLEVBQVEsUUFBUSxDQUU5RSxFQUFNLEtBQUssV0FBVyxFQUFJLENBRTFCLEVBQVEsRUFBTSxPQUFPLEdBQVEsQ0FBQyxFQUFJLFNBQVMsRUFBSyxRQUFRLENBQUMsQ0FHN0QsR0FBSSxHQUFTLFFBQVMsQ0FDbEIsSUFBSSxFQUFNLE1BQU0sUUFBUSxFQUFRLFFBQVEsQ0FBRyxFQUFRLFFBQVUsQ0FBQyxFQUFRLFFBQVEsQ0FFOUUsRUFBTSxLQUFLLFdBQVcsRUFBSSxDQUUxQixFQUFRLEVBQU0sT0FBTyxHQUFRLEVBQUksU0FBUyxFQUFLLFFBQVEsQ0FBQyxDQUs1RCxNQUZBLEdBQVEsR0FBUSxFQUFPLENBQUMsUUFBUSxDQUFFLENBQUMsTUFBTSxDQUFDLENBRW5DLEVBR1gsSUFBVyxHQUFHLEVBQStELENBQ3pFLElBQU0sRUFBNkIsRUFBRSxDQUVyQyxJQUFLLElBQU0sS0FBUSxFQUFTLENBQ3hCLEdBQUksT0FBTyxHQUFTLFdBQVksQ0FDNUIsRUFBVSxLQUFLLElBQUksRUFBTyxDQUMxQixTQUdKLEVBQVUsS0FBSyxFQUFLLENBR3hCLElBQUssSUFBTSxLQUFRLEVBQVcsQ0FDMUIsR0FBSSxDQUFDLEVBQUssUUFBUyxDQUNmLEtBQUssT0FBTyxLQUFLLGlDQUFrQyxFQUFLLENBQ3hELFNBR0osS0FBSyxNQUFNLElBQUksRUFBSyxRQUFTLEVBQUssQ0FFOUIsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLE9BQVMsRUFBSyxRQUFRLENBR3hDLEVBQUssVUFDTCxFQUFLLFNBQVMsUUFBUSxHQUFXLEtBQUssSUFBSSxFQUFRLENBQUMsRUFLL0QsTUFBYSxXQUFXLEVBQXlCLEVBQXNDLENBQ25GLElBQU0sRUFBUSxLQUFLLEtBQUssRUFBUSxDQUU1QixLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0sWUFBWSxFQUFPLGFBQWMsQ0FDL0MsTUFBTyxFQUFNLElBQUksR0FBUSxFQUFLLFFBQVEsQ0FDekMsQ0FBQyxDQUdOLElBQUssSUFBTSxLQUFRLEtBQUssS0FBSyxFQUFRLENBQUUsQ0FDbkMsSUFBTSxFQUFNLENBQ1IsYUFBZ0IsUUFBUSxJQUFJLENBQUMsRUFBSyxVQUFVLENBQUUsRUFBSyxZQUFZLENBQUMsQ0FBQyxDQUNqRSxTQUFZLFFBQVEsSUFBSSxDQUFDLEVBQUssTUFBTSxDQUFFLEVBQUssUUFBUSxDQUFDLENBQUMsQ0FDckQsU0FBWSxRQUFRLElBQUksQ0FBQyxFQUFLLE1BQU0sQ0FBRSxFQUFLLFFBQVEsQ0FBQyxDQUFDLENBQ3JELGFBQWdCLFFBQVEsSUFBSSxDQUFDLEVBQUssVUFBVSxDQUFFLEVBQUssWUFBWSxDQUFDLENBQUMsQ0FDcEUsQ0FFSyxDQUFDLEdBQVMsTUFBTSxNQUFlLEVBQUksSUFBUyxDQUFDLENBRW5ELEdBQUksRUFBTyxDQUNQLEtBQUssUUFBUSxFQUFPLENBQUUsT0FBUSxFQUFLLFFBQVMsU0FBUSxDQUFDLENBQ3JELFNBR0EsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLEdBQUcsRUFBTyxHQUFLLEVBQUssUUFBUSxFQUsxRCxNQUFhLEtBQUssRUFBOEMsRUFBc0MsQ0FDbEcsSUFBTSxFQUFVLE1BQU0sUUFBUSxFQUFRLENBQUcsRUFBVSxDQUFDLEVBQVEsQ0FFNUQsSUFBSyxJQUFNLEtBQVUsRUFDakIsTUFBTSxLQUFLLFdBQVcsRUFBUSxFQUFRLENBSTlDLE1BQWEsU0FBUyxFQUFzQyxDQUN4RCxPQUFPLEtBQUssS0FBSyxXQUFZLEVBQVEsQ0FHekMsTUFBYSxLQUFLLEVBQXNDLENBQ3BELE9BQU8sS0FBSyxLQUFLLE9BQVEsRUFBUSxDQUdyQyxNQUFhLEtBQUssRUFBc0MsQ0FDcEQsT0FBTyxLQUFLLEtBQUssT0FBUSxFQUFRLENBR3JDLE1BQWEsU0FBUyxFQUFzQyxDQUN4RCxNQUFNLEtBQUssS0FBSyxXQUFZLEVBQVEsQ0FHeEMsT0FBcUIsQ0FDakIsS0FBSyxNQUFNLE9BQU8saUhDeksxQixNQUFhLE9BQWUsRUFBRSxLQUMxQixFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQ2pDLEVBQUUsVUFBVSxPQUFPLENBQ25CLEVBQUUsU0FBUyxDQUNkLENBRVlDLE9BQWdCLEVBQUUsS0FDM0IsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUNsQyxFQUFFLFVBQVUsR0FBSyxJQUFNLElBQVEsSUFBTSxPQUFPLENBQy9DLENBRVksT0FBYSxFQUFFLEtBQ3hCLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDL0IsRUFBRSxVQUFVLEdBQUssYUFBYSxLQUFPLEVBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUNyRCxFQUFFLFVBQVUsR0FBSyxHQUFJLEVBQU8sRUFBRyxhQUFhLENBQUssQ0FDcEQsQ0FFWSxPQUFpQixFQUFFLEtBQzVCLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDL0IsRUFBRSxVQUFVLEdBQ0gsSUFFRCxJQUFNLE9BQWUsTUFFckIsT0FBTyxHQUFNLFdBQ2IsRUFBSSxJQUFJLEtBQUssRUFBRSxFQUdaLEVBQU8sRUFBRyxtQkFBbUIsR0FDdEMsQ0FDTCxDQUVZLEdBQWdELEVBQVksRUFBRSxLQUFLLEdBQWlCLEVBQUUsS0FDL0YsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUMxQyxFQUFFLFVBQVUsR0FBUyxNQUFNLFFBQVEsRUFBTSxDQUFHLEVBQVEsRUFBTSxNQUFNLElBQUksQ0FBQyxDQUNyRSxFQUFFLE1BQU0sRUFBTyxDQUNsQixDQUVZLE9BQW9CLEVBQUUsS0FDL0IsR0FBTyxDQUNQLEVBQUUsVUFBVSxHQUFTLEVBQU0sSUFBSSxPQUFPLENBQUMsQ0FDMUMsQ0FFWSxPQUFlLEVBQUUsS0FDMUIsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNwRCxFQUFFLFVBQVUsR0FBUyxPQUFPLEdBQVUsU0FBVyxHQUFHLE1BQU0sRUFBTSxDQUFHLEVBQU0sQ0FDekUsRUFBRSxVQUFVLEdBQVMsQ0FDakIsSUFBTSxFQUE4QixFQUFFLENBRXRDLElBQUssSUFBTSxLQUFPLEVBQ2QsRUFBSSxFQUFRLEVBQUssRUFBSSxFQUFPLEVBQUksQ0FBQyxDQUdyQyxPQUFPLEdBQ1QsQ0FDTCx5QkNuREQsTUFBYSxJQUFRLEVBQTRCLEVBQUUsR0FBSyxFQUFFLE9BQU8sQ0FDN0QsS0FBTSxFQUFFLFNBQVMsSUFBUSxDQUFFLEVBQUUsQ0FDN0IsTUFBTyxFQUFFLFNBQVMsSUFBUSxDQUFFLEVBQVEsVUFBWSxJQUFJLENBQ3BELFFBQVMsRUFBRSxTQUFTLEVBQVEsWUFBYyxFQUFNLEVBQUUsU0FBUyxFQUFRLFlBQVksQ0FBQyxDQUFHLEVBQU0sRUFBRSxRQUFRLENBQUMsQ0FBRSxFQUFFLENBQUMsQ0FDekcsZUFBZ0IsRUFBRSxTQUFTLEVBQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLE1BQU0sQ0FBRSxFQUFFLFFBQVEsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFFLEVBQUUsQ0FBQyxDQUN4RixDQUFDLENDVEksR0FBUyxDQUNYLElBQUEsR0FDQSxXQUFBLEdBQ0gsQ0F5QkQsSUFBcUIsR0FBckIsS0FBc0MsQ0FDbEMsT0FBYyxzQkFBd0IsbUJBRXRDLEVBQW9CLENBQ2hCLEdBQUcsRUFDSCxVQUNILENBRUQsT0FBdUMsRUFBMEIsQ0FDN0QsT0FBTyxFQUFHLEtBQUssRUFBRSxDQUdyQixTQUF5QyxFQUFjLEVBQXdCLENBQzNFLElBQU0sRUFBWSxPQUFPLEdBQU8sV0FBYSxFQUFHLEtBQUssRUFBRSxDQUFHLEVBRXBELENBQUUsU0FBUSxTQUFRLFdBQVksRUFBRSxVQUFVLEVBQVEsRUFBUSxDQUVoRSxHQUFJLENBQUMsRUFBUyxDQUNWLElBQU0sRUFBVSxFQUFFLFFBQVEsRUFBTyxDQUMzQixFQUFXLEVBQUUsQ0FFZixFQUFRLE1BQ1IsRUFBUyxLQUFLLEdBQUcsRUFBUSxLQUFLLENBRzlCLEVBQVEsUUFDUixPQUFPLFFBQVEsRUFBUSxPQUFPLENBQUMsUUFBUyxHQUFVLENBQzlDLEdBQU0sQ0FBQyxFQUFLLEdBQVMsRUFFckIsRUFBUyxLQUFLLEdBQUcsRUFBTSxJQUFLLEdBQU0sR0FBRyxFQUFJLElBQUksSUFBSSxDQUFDLEVBQ3BELENBS04sSUFBTSxFQUFRLElBQUksRUFGRixFQUFTLE9BQVMsRUFBUyxLQUFLLEtBQUssQ0FBRyxvQkFFZixJQUFJLENBTTdDLEtBSkEsR0FBTSxLQUFPLGtCQUViLE9BQU8sT0FBTyxFQUFPLENBQUUsV0FBVyxDQUFDLENBRTdCLEVBR1YsT0FBTyxFQUdYLE1BQWEsY0FBNEMsRUFBYyxFQUFtQyxDQUN0RyxJQUFNLEVBQVksT0FBTyxHQUFPLFdBQWEsRUFBRyxLQUFLLEVBQUUsQ0FBRyxFQUVwRCxDQUFFLFNBQVEsU0FBUSxXQUFZLE1BQU0sRUFBRSxlQUFlLEVBQVEsRUFBUSxDQUUzRSxHQUFJLENBQUMsRUFBUyxDQUNWLElBQU0sRUFBWSxNQUFNLG9CQUFvQixDQUN0QyxFQUFVLEVBQUUsUUFBUSxFQUFPLENBQzNCLEVBQVUsQ0FDWixHQUFHLEVBQVEsS0FDWCxHQUFHLEVBQVEsT0FDZCxDQUlELE1BRkEsT0FBTyxPQUFPLEVBQU8sQ0FBRSxVQUFVLENBQUMsQ0FFNUIsRUFHVixPQUFPLEVBR1gsUUFBd0MsRUFBYyxFQUFpQyxDQUNuRixJQUFNLEVBQVksT0FBTyxHQUFPLFdBQWEsRUFBRyxLQUFLLEVBQUUsQ0FBRyxFQUVwRCxDQUFFLFdBQVksRUFBRSxVQUFVLEVBQVEsRUFBUSxDQUVoRCxPQUFPLElDdEcyQixFQUFFLE9BQU8sQ0FDL0MsR0FBSSxFQUFFLFFBQVEsQ0FDZCxjQUFlLEVBQUUsUUFBUSxDQUN6QixnQkFBaUIsRUFBRSxRQUFRLENBQzNCLGNBQWUsRUFBRSxRQUFRLENBQ3pCLFdBQVksRUFBRSxRQUFRLENBQ3RCLFdBQVksRUFBRSxRQUFRLENBQ3pCLENBQUMsQ0NQOEIsRUFBRSxPQUFPLENBQ3JDLEdBQUksRUFBRSxRQUFRLENBQ2QsS0FBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FDNUIsWUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FDbkMsT0FBUSxFQUFFLFFBQVEsQ0FDbEIsUUFBUyxFQUFFLFFBQVEsQ0FDbkIsV0FBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FDbEMsV0FBWSxFQUFFLFFBQVEsQ0FDdEIsV0FBWSxFQUFFLFFBQVEsQ0FDdEIsV0FBWSxFQUFFLFFBQVEsQ0FDekIsQ0FBQyxDQ1Z5QixFQUFFLE9BQU8sQ0FDaEMsR0FBSSxFQUFFLFFBQVEsQ0FDZCxLQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUM1QixLQUFNLEVBQUUsUUFBUSxDQUNoQixRQUFTLEVBQUUsUUFBUSxDQUNuQixNQUFPLEVBQUUsUUFBUSxDQUNqQixXQUFZLEVBQUUsUUFBUSxDQUN0QixXQUFZLEVBQUUsUUFBUSxDQUN0QixXQUFZLEVBQUUsUUFBUSxDQUN6QixDQUFDLENDWEYsSUFBcUIsR0FBckIsY0FBNEMsQ0FBYyxDQUN0RCxPQUNBLElBQ0EsS0FFQSxZQUFZLEVBQWlCLEVBQWdCLEVBQWEsRUFBZ0IsQ0FDdEUsTUFBTSxFQUFTLElBQUksQ0FFbkIsS0FBSyxPQUFTLEVBQ2QsS0FBSyxJQUFNLEVBQ1gsS0FBSyxLQUFPLElDVnBCLE1BQWEsRUFBWSxJQUFJLEdDK0I3QixTQUF3QixFQUFzQyxFQUFhLENBQ3ZFLE9BQU8sY0FBYyxDQUFLLENBQ3RCLE9BQWMsS0FBMkIsRUFBcUIsQ0FDMUQsSUFBTSxFQUFjLE9BQU8sTUFBUyxXQUFhLEtBQU8sRUFFbEQsRUFBVyxJQUFJLEVBRWpCLEVBQVUsQ0FBRSxHQUFHLEVBQU0sQ0FZekIsT0FWSSxPQUFPLEdBQVksT0FBVSxhQUM3QixFQUFXLEVBQW1CLE1BQU0sRUFBSyxFQUd6QyxPQUFRLE1BQWMsT0FBVSxhQUNoQyxFQUFXLEtBQWEsTUFBTSxFQUFLLEVBR3ZDLE9BQU8sT0FBTyxFQUFpQixFQUFRLENBRWhDLEVBR1gsTUFBYSxFQUEyQixDQUVwQyxPQURBLE9BQU8sT0FBTyxLQUFNLEVBQUssQ0FDbEIsT0NsRG5CLGVBQXNCLEVBQVMsRUFBa0IsRUFBZSxHQUFHLEVBQWEsQ0FDNUUsSUFBTSxFQUFZLEVBQVksV0FBYSxFQUFFLENBRTdDLFVBQVcsSUFBTSxLQUFLLEVBQVUsT0FBUSxHQUFXLEVBQUUsUUFBVSxFQUFNLENBQ2pFLE1BQU0sRUFBRSxTQUFTLEdBQUcsRUFBSyxDQUlqQyxTQUFnQixHQUFPLEVBQWtCLEVBQWUsRUFBb0MsQ0FDeEYsSUFBTSxFQUFZLEVBQVksV0FBYSxFQUFFLENBRTlCLEVBQVUsS0FBTSxHQUFXLEVBQUUsUUFBVSxHQUFTLEVBQUUsV0FBYSxFQUFTLEdBTXZGLEVBQVUsS0FBSyxDQUNYLFFBQ0EsV0FDSCxDQUFDLENBRUYsRUFBWSxVQUFZLEdBRzVCLFNBQWdCLEVBQXVDLEVBQWEsQ0FDaEUsT0FBTyxjQUFjLENBQUssQ0FDdEIsWUFBWSxHQUFHLEVBQWEsQ0FDeEIsTUFBTSxHQUFHLEVBQUssQ0FFVixPQUFRLEtBQUssWUFBb0IsTUFBUyxZQUN6QyxLQUFLLFlBQW9CLEtBQUssTUFBTSxLQUFLLFlBQVksQ0FJOUQsT0FBYyxVQUFZLEVBQUUsQ0FFNUIsT0FBYyxHQUFHLEVBQWUsRUFBb0MsQ0FDaEUsT0FBTyxHQUFPLEtBQU0sRUFBTyxFQUFTLENBR3hDLGFBQW9CLEtBQUssRUFBZSxHQUFHLEVBQWEsQ0FDcEQsT0FBTyxFQUFTLEtBQU0sRUFBTyxHQUFHLEVBQUssR0FLakQsU0FBd0IsR0FBaUMsRUFBYSxDQUNsRSxPQUFPLGNBQWMsQ0FBSyxDQUN0QixVQUVBLFlBQVksR0FBRyxFQUFhLENBQ3hCLE1BQU0sR0FBRyxFQUFLLENBQ2QsS0FBSyxVQUFZLEVBQUUsQ0FHdkIsR0FBVSxFQUFlLEVBQW9DLENBQ3pELEtBQUssVUFBVSxLQUFLLENBQ2hCLFFBQ0EsV0FDSCxDQUFDLENBR04sSUFBVyxFQUFlLEVBQW9DLENBQzFELElBQU0sRUFBUSxLQUFLLFVBQVUsVUFBVyxHQUFNLEVBQUUsUUFBVSxHQUFTLEVBQUUsV0FBYSxFQUFTLENBR3ZGLElBQVUsSUFJZCxLQUFLLFVBQVUsT0FBTyxFQUFPLEVBQUUsQ0FHbkMsS0FBWSxFQUFlLEdBQUcsRUFBYSxDQUN2QyxJQUFNLEVBQVksS0FBSyxVQUFVLE9BQVEsR0FBTSxFQUFFLFFBQVUsRUFBTSxDQUdqRSxJQUFLLElBQU0sS0FBSyxFQUNaLEVBQUUsU0FBUyxHQUFHLEVBQUssQ0FJM0IsTUFBYSxVQUFVLEVBQWUsR0FBRyxFQUFhLENBQ2xELElBQU0sRUFBWSxLQUFLLFVBQVUsT0FBUSxHQUFNLEVBQUUsUUFBVSxFQUFNLENBRWpFLFVBQVcsSUFBTSxLQUFLLEVBQ2xCLE1BQU0sRUFBRSxTQUFTLEdBQUcsRUFBSyxHQU16QyxFQUFZLEtBQU8sRUFDbkIsRUFBWSxHQUFLLEdDbkdqQixTQUF3QixFQUF1QyxFQUFTLENBQ3BFLE9BQU8sY0FBYyxDQUFLLENBQ3RCLFdBQTBDLE1DRmxELFNBQXdCLEVBQXNDLEVBQVMsQ0FDbkUsT0FBTyxjQUFjLENBQUssQ0FDdEIsV0FDQSxZQ0RSLElBQXFCLEdBQXJCLGNBQThDLEVBQVEsRUFBVyxBQUFDLENBQzlELEdBQ0EsS0FDQSxZQUFvQyxLQUNwQyxPQUNBLFFBQ0EsT0FDQSxXQUF5RCxLQUV6RCxJQUFXLFVBQVcsQ0FDbEIsT0FBTyxLQUFLLFNBQVcsU0FHM0IsSUFBVyxrQkFBbUIsQ0FDMUIsR0FBSSxDQUFDLEtBQUssV0FDTixNQUFPLEVBQUUsQ0FHYixHQUFNLENBQUMsRUFBTyxHQUFRLEVBQVMsU0FDdkIsT0FBTyxLQUFLLFlBQWUsU0FDcEIsS0FBSyxNQUFNLEtBQUssV0FBcUIsQ0FHekMsS0FBSyxXQUNkLENBRUYsT0FBTyxFQUFRLEVBQUUsQ0FBRyxJQzFCUCxHQUFyQixLQUErQixDQUMzQixPQUFjLHNCQUF3QixZQUV0QyxRQUNBLFlBQ0EsTUFBd0IsR0FDeEIsT0FFQSxZQUFZLEVBQTJCLEVBQUUsQ0FBRSxDQUV2QyxJQUFNLEdBRGMsRUFBSyxhQUFlLEVBQUUsRUFDaEIsSUFBSyxHQUFlQyxHQUFXLEtBQUssRUFBVyxDQUFDLENBRzFFLEtBQUssWUFBYyxFQUNuQixLQUFLLE1BQVEsRUFBSyxPQUFTLEdBQzNCLEtBQUssT0FBUyxFQUFLLFFBQVUsSUFBSSxHQUFlLENBQUMsTUFBTSxDQUFFLE1BQU8sTUFBTyxDQUFDLENBRXhFLEtBQUssUUFBVSxHQUFlLEdBQVEsQ0FDbEMsRUFBTSxRQUFTLEdBQWUsQ0FDMUIsRUFBSSxFQUFXLE9BQVEsRUFBVyxRQUFTLEVBQVcsaUJBQWlCLEVBQ3pFLEVBQ0osQ0FFRSxLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0sNEJBQTZCLENBQzNDLFlBQWEsS0FBSyxZQUNyQixDQUFDLENBSVYsSUFBVyxFQUFnQixFQUFjLEVBQThCLENBRW5FLEdBQUksQ0FBQyxFQUNELE9BQU8sS0FBSyxRQUFRLElBQUksRUFBUUMsRUFBUSxDQUc1QyxJQUFNLEVBQW9CQyxFQUFjRCxFQUFTLEVBQU8sQ0FFeEQsT0FBTyxLQUFLLFFBQVEsSUFBSSxFQUFRLEVBQWtCLENBR3RELE9BQWMsRUFBZ0IsRUFBYyxFQUE4QixDQUN0RSxHQUFJLENBQUMsRUFDRCxPQUFPLEtBQUssUUFBUSxPQUFPLEVBQVFBLEVBQVEsQ0FHL0MsSUFBTSxFQUFvQkMsRUFBY0QsRUFBUyxFQUFPLENBRXhELE9BQU8sS0FBSyxRQUFRLE9BQU8sRUFBUSxFQUFrQixDQUd6RCxRQUFlLEVBQWlCLEVBQTZCLENBQ3pELE9BQU9DLEVBQWNELEVBQVMsRUFBTyxHQ25EeEJFLEdBQXJCLEtBQXFDLENBQ2pDLE9BQWMsc0JBQXdCLGtCQUV0QyxRQUNBLE9BRUEsWUFBWSxFQUErQixDQUN2QyxLQUFLLFFBQVUsR0FBTSxTQUFXLElBQUksSUFDcEMsS0FBSyxPQUFTLEdBQU0sUUFBVSxHQUdsQyxLQUFZLEVBQXVELENBQy9ELEdBQUksYUFBbUIsSUFBSyxDQUN4QixJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsRUFBUSxTQUFTLENBQ3hDLEtBQUssSUFBSSxFQUFLLEVBQU0sQ0FHeEIsT0FHSixJQUFLLElBQU0sS0FBTyxPQUFPLEtBQUssRUFBUSxDQUNsQyxLQUFLLElBQUksRUFBSyxFQUFRLEdBQUssQ0FJbkMsSUFBVyxFQUFjLEVBQThCLEtBQXFCLENBQ3hFLElBQU0sRUFBVyxLQUFLLE9BQVMsRUFFL0IsT0FBTyxLQUFLLFFBQVEsSUFBSSxFQUFTLEVBQUksRUFLekMsSUFBVyxFQUFjLEVBQWUsRUFBZSxDQUNuRCxJQUFNLEVBQVcsS0FBSyxPQUFTLEVBRS9CLEtBQUssUUFBUSxJQUFJLEVBQVUsRUFBTSxDQUdyQyxVQUEwQyxDQUN0QyxJQUFNLEVBQWlDLEVBQUUsQ0FFekMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLEtBQUssUUFBUSxTQUFTLENBQzdDLEdBQUksRUFBSSxXQUFXLEtBQUssT0FBTyxDQUFFLENBQzdCLElBQU0sRUFBZ0IsRUFBSSxNQUFNLEtBQUssT0FBTyxPQUFPLENBRW5ELEVBQU8sR0FBaUIsRUFJaEMsT0FBTyxJQ3ZEZixNQUFhLE9BQWMsQ0FDdkIsQ0FDSSxHQUFJLEtBQ0osTUFBTyxHQUFHLGNBQWMsQ0FDeEIsWUFBYSxHQUFHLHdDQUF3QyxDQUN4RCxjQUFlLENBQ1gsVUFBVyxDQUNQLFVBQVcsYUFDWCxNQUFPLEdBQUcsWUFBWSxDQUN0QixZQUFhLEdBQUcsaURBQWlELENBQ2pFLEtBQU0sR0FBRyxxRUFBc0UsQ0FBQyxzQkFBdUIsa0JBQWtCLENBQUMsQ0FDN0gsQ0FDSixDQUNKLENBQ0QsQ0FDSSxHQUFJLEtBQ0osTUFBTyxLQUNQLFlBQWEsR0FBRyxpRkFBaUYsQ0FDakcsY0FBZSxDQUNYLFlBQWEsQ0FDVCxVQUFXLGFBQ1gsTUFBTyxHQUFHLGdCQUFnQixDQUMxQixLQUFNLEdBQUcsMEJBQTBCLENBQ25DLEtBQU0sV0FDVCxDQUNELGdCQUFpQixDQUNiLFVBQVcsYUFDWCxNQUFPLEdBQUcsb0JBQW9CLENBQzlCLEtBQU0sR0FBRyw4QkFBOEIsQ0FDdkMsS0FBTSxXQUNULENBQ0QsT0FBUSxDQUNKLFVBQVcsYUFDWCxNQUFPLEdBQUcsY0FBYyxDQUN4QixLQUFNLEdBQUcsK0NBQStDLENBQzNELENBQ0QsT0FBUSxDQUNKLFVBQVcsYUFDWCxNQUFPLEdBQUcsU0FBUyxDQUNuQixLQUFNLEdBQUcsK0NBQStDLENBQzNELENBQ0QsT0FBUSxDQUNKLFVBQVcsYUFDWCxNQUFPLEdBQUcsU0FBUyxDQUNuQixLQUFNLEdBQUcsdUVBQXVFLENBQ25GLENBQ0QsU0FBVSxDQUNOLFVBQVcsYUFDWCxNQUFPLEdBQUcsZUFBZSxDQUN6QixLQUFNLEdBQUcsMkRBQTJELENBQ3ZFLENBQ0osQ0FDSixDQUNKLENBQ0QsSUFBcUJDLEdBQXJCLE1BQXFCQSxDQUFZLENBQzdCLFdBQWtCLE9BQVEsQ0FDdEIsT0FBTyxJQUFPLENBR2xCLEdBQ0EsS0FDQSxLQUNBLFdBQ0EsT0FFQSxZQUFZLEVBQWtCLENBQzFCLE9BQU8sT0FBTyxLQUFNLEVBQUssQ0FHN0IsSUFBVyxlQUFnQixDQUN2QixJQUFNLEVBQVNBLEVBQVksTUFBTSxLQUFLLEdBQU8sRUFBSSxLQUFPLEtBQUssS0FBSyxDQUVsRSxPQUFPLEVBQVMsRUFBTyxjQUFnQixFQUFFLEdDeEU1QixHQUFyQixLQUFnQyxDQUM1QixLQUNBLEtBQ0EsS0FDQSxNQUFvQyxFQUFFLENBRXRDLFlBQVksRUFBa0IsQ0FDMUIsT0FBTyxPQUFPLEtBQU0sRUFBSyxHQ0ZaLEdBQXJCLGNBQXdDLEVBQVFDLEVBQWlCLEVBQWdCLEVBQWdCLEFBQUMsQ0FDOUYsR0FDQSxNQUNBLFNBQ0EsUUFDQSxZQUNBLFNBQ0EsT0FHQSxJQUNBLE1BRUEsU0FBMEIsQ0FDdEIsT0FBTyxLQUFLLFNBQVMsV0FBVyxTQUFTLEdDZDVCQyxHQUFyQixjQUFzQyxFQUFRQyxFQUFpQixFQUFnQixFQUFnQixBQUFDLENBQzVGLEdBQ0EsUUFDQSxLQUNBLE9DSnVDLEVBQVFDLEVBQWlCLEVBQWdCLEVBQWdCLENDTHBHLElBQXFCLEdBQXJCLEtBQW1DLENBQy9CLFFBQ0EsYUFDQSxNQUNBLFNBRUEsTUFBYSxVQUEwQixFQUN2QyxNQUFhLE1BQXNCLEVBQ25DLE1BQWEsTUFBc0IsRUFDbkMsTUFBYSxVQUEwQixFQUd2QyxNQUFhLFlBQTRCLEVBRXpDLE1BQWEsUUFBd0IsRUFFckMsTUFBYSxRQUF3QixFQUVyQyxNQUFhLFlBQTRCLElDUnhCQyxHQUFyQixjQUFvQyxFQUFRLEVBQVksR0FBTSxHQUFjLENBQUMsQUFBQyxDQUMxRSxHQUNBLEtBQ0EsUUFBMEIsR0FDMUIsYUFBMkMsRUFBRSxDQUM3QyxNQUF3QyxFQUFFLENBQzFDLFVBRUEsYUFFQSxRQUFlLEVBQXdDLENBQ25ELElBQU0sRUFBVyxPQUFPLFlBQ3BCLE9BQU8sUUFBUSxFQUFLLENBQUMsUUFBUSxFQUFHLEtBQU8sSUFBTSxJQUFBLEdBQVUsQ0FDMUQsQ0FFRCxPQUFPLE9BQU8sS0FBTSxFQUFTLENBRTdCLEtBQUssUUFBVSxVQUFVLEtBQUssT0NmTSxFQUFRLEVBQVcsQ0NaL0QsSUFBcUIsR0FBckIsTUFBcUIsQ0FBMEMsQ0FDM0QsTUFDQSxNQUNBLEtBQ0EsU0FDQSxZQUVBLFlBQVksRUFBaUMsQ0FDekMsT0FBTyxPQUFPLEtBQU0sRUFBSyxDQUc3QixPQUFjLEtBQWtDLEVBQTRELENBQ3hHLE9BQU8sSUFBSSxFQUFpQixFQUFlLEdDVDlCQyxHQUFyQixjQUEwQyxFQUFRLEVBQVcsQUFBQyxDQUMxRCxHQUNBLEtBQ0EsUUFDQSxRQUNBLFNDSDhCLEVBQVEsRUFBWSxFQUFnQixFQUFnQixDQ0U5QyxFQUFRLEVBQVksRUFBZ0IsRUFBZ0IsQ0NLNUYsSUFBYSxHQUFiLE1BQWEsVUFBbUJDLENBQWlCLENBQzdDLGlCQUEwQixHQUMxQixNQUFlLEdBQ2YsT0FBZ0IsR0FDaEIsT0FBZ0IsRUFFaEIsTUFBNEIsSUFBSSxJQUNoQyxLQUFZLEdBQUcsRUFBc0IsQ0FHakMsT0FGQSxFQUFLLFFBQVEsR0FBTyxLQUFLLE1BQU0sSUFBSSxFQUFJLENBQUMsQ0FFakMsS0FHWCxjQUFjLEVBQWUsQ0FDekIsT0FBTyxJQUFJLEVBQVcsRUFBSyxHQUlkLEdBQXJCLE1BQXFCLFVBQW1CLEVBQVcsQ0FDL0MsT0FBYyxzQkFBd0IsYUFFdEMsS0FBYyxJQUFJLElBQ2xCLE9BQWdCLElBQUksRUFDcEIsU0FBa0IsSUFBSUMsRUFDdEIsTUFBZSxHQUVmLE9BQWMsT0FBTyxFQUFPLE1BQU8sQ0FDL0IsT0FBTyxJQUFJLEVBQVcsRUFBSyxDQUcvQixVQUFpQixFQUF1QixDQUdwQyxNQUZBLE1BQUssT0FBUyxFQUVQLEtBR1gsU0FBZ0IsRUFBZ0IsQ0FHNUIsTUFGQSxNQUFLLE1BQVEsRUFFTixLQUdYLFlBQW1CLEVBQTJCLENBRzFDLE1BRkEsTUFBSyxTQUFXLEVBRVQsS0FHWCxjQUFjLEVBQWUsQ0FDekIsT0FBTyxJQUFJLEVBQVcsRUFBSyxDQUcvQixPQUFjLEVBQWEsQ0FHdkIsT0FGQSxLQUFLLEtBQUssSUFBSSxFQUFJLENBRVgsS0FHWCxNQUFhLFFBQVEsRUFBYSxDQUM5QixJQUFNLEVBQU8sTUFBTSxHQUFVLEVBQUssQ0FDOUIsUUFBUyxDQUFDLFdBQVksV0FBWSxXQUFZLFdBQVcsQ0FDekQsU0FBVSxDQUFFLFFBQU8sY0FBZSxDQUM5QixPQUFPLE9BQU8sRUFBTyxDQUFFLFdBQVUsQ0FBQyxDQUVsQyxLQUFLLE9BQU8sTUFBTSxFQUFNLFFBQVMsRUFBTSxFQUU5QyxDQUFDLENBRUYsSUFBSyxHQUFNLENBQUMsRUFBVSxLQUFRLE9BQU8sUUFBUSxFQUFLLENBQUUsQ0FLaEQsR0FKSSxLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0saUJBQWlCLEVBQVMsUUFBUSxJQUFNLENBRzFELENBQUMsRUFBSSxTQUFXLE9BQU8sS0FBSyxFQUFJLFFBQVEsQ0FBQyxTQUFXLEVBQ3BELFNBR0osR0FBSSxDQUFDLEVBQUksUUFBUSxpQkFBa0IsQ0FDL0IsS0FBSyxPQUFPLEtBQUssMEJBQTBCLEVBQUksU0FBUyxnQ0FBZ0MsQ0FDeEYsU0FHSixHQUFNLENBQUMsR0FBUyxFQUFTLFNBQVcsS0FBSyxXQUFXLEVBQUksUUFBUSxDQUFDLENBRWpFLEdBQUksRUFBTyxDQUNQLE9BQU8sT0FBTyxFQUFPLENBQUUsU0FBVSxFQUFJLFNBQVUsQ0FBQyxDQUVoRCxLQUFLLE9BQU8sTUFBTSxFQUFNLFFBQVMsRUFBTSxDQUV2QyxTQUdBLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSwyQkFBMkIsRUFBUyxTQUFTLEVBTTNFLE1BQWEsTUFBTyxDQUNoQixJQUFLLElBQU0sS0FBTyxLQUFLLEtBQ25CLE1BQU0sS0FBSyxRQUFRLEVBQUksQ0FHM0IsT0FBTyxPQ2pITSxHQUFyQixjQUErQyxFQUFXLENBQ3RELGFBQWMsQ0FDVixPQUFPLENBRVAsS0FBSyxjQUFjLENBRW5CLEtBQUssZ0JBQWdCLENBQ2pCLGFBQWdCLEdBR2hCLGFBQWdCLEdBR25CLENBQUMsQ0FFRixFQUFHLElBQUksR0FBWSxLQUFLLENBSzVCLE1BQWEsSUFBSSxFQUFjLENBQzNCLE1BQU0sT0FBTyxHQUdqQixNQUFhLFFBQVEsRUFBZ0IsQ0FDakMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxPQUFRLE9BQVEsR0FBRyxFQUFLLENBQUMsR0N4Qm5DLEdBQXJCLE1BQXFCLENBQWtCLENBQ25DLFFBQXlDLEtBQ3pDLFlBQ0EsSUFBYSxJQUFJLElBQ2pCLEtBQXdCLEVBQUUsQ0FDMUIsZ0JBQXlCLElBQUksSUFDN0IsWUFBK0IsRUFBRSxDQUNqQyxNQUF3QixHQUN4QixPQUFnQixJQUFJLEVBRXBCLE9BQWMsUUFBUyxDQUNuQixPQUFPLElBQUksRUFHZixZQUFtQixFQUFjLENBRTdCLE1BREEsTUFBSyxZQUFjLEVBQ1osS0FHWCxTQUFnQixFQUFnQixDQUU1QixNQURBLE1BQUssTUFBUSxFQUNOLEtBR1gsVUFBaUIsRUFBdUIsQ0FFcEMsTUFEQSxNQUFLLE9BQVMsRUFDUCxLQUdYLGtCQUF5QixFQUFhLEVBQWUsQ0FFakQsT0FEQSxLQUFLLGdCQUFnQixJQUFJLEVBQUssRUFBTSxDQUM3QixLQUdYLGNBQXFCLEdBQUcsRUFBcUIsQ0FFekMsT0FEQSxLQUFLLFlBQVksS0FBSyxHQUFHLEVBQVUsQ0FDNUIsS0FHWCxPQUFjLEVBQWEsRUFBWSxDQUVuQyxPQURBLEtBQUssSUFBSSxJQUFJLEVBQUssRUFBTSxDQUNqQixLQUdYLHFCQUE2QixDQUN6QixJQUFNLEVBQWEsUUFBUSxLQUFLLE1BQU0sRUFBRSxDQUFDLE9BQU8sR0FBTyxFQUFJLFdBQVcsV0FBVyxDQUFDLENBRWxGLElBQUssSUFBTSxLQUFTLEVBQVksQ0FDNUIsR0FBTSxDQUFDLEVBQUssR0FBUyxFQUFNLE1BQU0sRUFBa0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUssRUFBRSxNQUFNLENBQUMsQ0FFakYsS0FBSyxnQkFBZ0IsSUFBSSxFQUFLLEVBQU0sRUFJNUMsaUJBQXlCLENBQ3JCLElBQU0sRUFBaUIsUUFBUSxLQUFLLE1BQU0sRUFBRSxDQUN2QyxPQUFPLEdBQU8sRUFBSSxXQUFXLGdCQUFnQixDQUFDLENBQzlDLElBQUksR0FBTyxFQUFJLE1BQU0sR0FBdUIsQ0FBQyxDQUlsRCxHQUZBLEtBQUssY0FBYyxHQUFHLEVBQWUsQ0FFakMsUUFBUSxJQUFJLGFBQWMsQ0FDMUIsSUFBTSxFQUFXLFFBQVEsSUFBSSxhQUFhLE1BQU0sSUFBSSxDQUFDLElBQUksR0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUV2RixLQUFLLGNBQWMsR0FBRyxFQUFTLEVBSXZDLGlCQUF5QixDQUNyQixJQUFNLEVBQWtCLE1BQU0sS0FBSyxLQUFLLGdCQUFnQixTQUFTLENBQUMsQ0FDN0QsS0FBSyxDQUFDLEVBQUssS0FBVyxHQUFHLEVBQUksR0FBRyxJQUFRLENBQUMsS0FBSyxJQUFJLENBRXZELEtBQUssT0FBTywwQkFBMkIsRUFBZ0IsQ0FDdkQsS0FBSyxPQUFPLHNCQUF1QixLQUFLLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FHbEUsY0FBcUIsRUFBaUIsRUFBRSxDQUFFLENBQ3RDLElBQU0sRUFBYSxDQUFDLFdBQVksZ0JBQWdCLENBRTFDLEVBQWMsRUFBSyxPQUFPLEdBQU8sQ0FBQyxFQUFXLEtBQUssR0FBTSxFQUFJLFdBQVcsRUFBRyxDQUFDLENBQUMsQ0FFbEYsS0FBSyxLQUFPLENBQ1IsZ0JBQ0EsNkJBQ0EsdUJBQ0EsRUFBSyxLQUFLLEtBQUssWUFBYSxTQUFVLFNBQVMsQ0FDL0MsR0FBRyxFQUNOLENBSUwsS0FBWSxFQUFlLEVBQUcsQ0FDdEIsS0FBSyxTQUFXLENBQUMsS0FBSyxRQUFRLFFBQzlCLEtBQUssUUFBUSxLQUFLLFVBQVUsQ0FHaEMsUUFBUSxLQUFLLEVBQUssQ0FHdEIsTUFBYSxJQUFJLEVBQWlCLENBQzlCLEdBQUksQ0FBQyxLQUFLLFlBQ04sTUFBVSxNQUFNLDZEQUE2RCxDQUdqRixLQUFLLHFCQUFxQixDQUMxQixLQUFLLGlCQUFpQixDQUN0QixLQUFLLGNBQWMsR0FBUSxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUMsQ0FFakQsS0FBSyxpQkFBaUIsQ0FFbEIsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLE1BQU8sQ0FDckIsS0FBTSxLQUFLLEtBQ1gsSUFBSyxLQUFLLElBQ2IsQ0FBQyxDQUdOLEtBQUssUUFBVSxHQUFHLE1BQU0sT0FBUSxLQUFLLEtBQU0sQ0FDdkMsTUFBTyxVQUNQLElBQUssQ0FDRCxHQUFHLFFBQVEsSUFDWCxHQUFHLE9BQU8sWUFBWSxLQUFLLElBQUksU0FBUyxDQUFDLENBQzVDLENBQ0osQ0FBQyxDQUVGLFFBQVEsR0FBRyxhQUFnQixLQUFLLE1BQU0sQ0FBQyxDQUN2QyxRQUFRLEdBQUcsY0FBaUIsS0FBSyxNQUFNLENBQUMsQ0FDeEMsUUFBUSxHQUFHLFdBQWMsS0FBSyxNQUFNLENBQUMsR0NqSTdDLE1BQU0sRUFBWSxRQUFRLElBQUksaUJBQ3hCLEdBQWUsUUFBUSxJQUFJLHFCQUF1QixFQUFLLEtBQUssR0FBYSxHQUFJLFVBQVUsQ0FFN0YsU0FBZ0IsRUFBUyxHQUFHLEVBQXdCLENBQ2hELEdBQUksQ0FBQyxFQUNELE1BQVUsTUFBTSxtREFBbUQsQ0FHdkUsT0FBTyxFQUFLLFFBQVEsRUFBVyxHQUFHLEVBQUssQ0FHM0MsU0FBZ0IsR0FBWSxHQUFHLEVBQXdCLENBQ25ELE9BQU8sRUFBSyxRQUFRLEdBQWMsR0FBRyxFQUFLLENBRzlDLFNBQWdCLEdBQW1CLEdBQUcsRUFBd0IsQ0FDMUQsR0FBSSxDQUFDLEVBQ0QsTUFBVSxNQUFNLG1EQUFtRCxDQUd2RSxPQUFPLEVBQUssU0FBUyxRQUFRLEtBQUssQ0FBRSxFQUFLLFFBQVEsRUFBVyxHQUFHLEVBQUssQ0FBQyxDQUd6RSxTQUFnQixHQUFRLEdBQUcsRUFBd0IsQ0FDL0MsT0FBTyxFQUFTLE1BQU8sR0FBRyxFQUFLLENDVG5DLElBQXFCLEdBQXJCLGNBQTZDLENBQWMsQ0FDdkQsT0FDQSxNQUFlLEdBQ2YsT0FBZ0MsT0FDaEMsVUFFQSxZQUFZLEVBQWtDLEVBQUUsQ0FBRSxDQUM5QyxPQUFPLENBQ1AsS0FBSyxNQUFRLEVBQVEsT0FBUyxHQUM5QixLQUFLLFVBQVksRUFBUSxXQUFhLEVBQVMsU0FBUyxDQUN4RCxLQUFLLE9BQVMsRUFBUSxRQUFVLEVBQU8sTUFBTSxDQUFFLE1BQU8sU0FBVSxDQUFDLENBQ2pFLEtBQUssT0FBUyxFQUFRLFFBQVUsT0FFNUIsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLG9DQUFvQyxDQUk5RCxNQUFhLE1BQU0sRUFBZSxFQUFXLENBQ3pDLElBQU0sRUFBTSxLQUFLLFNBQVcsTUFBUSxNQUFRLE9BQ3RDLEVBQVcsRUFBSyxLQUFLLEtBQUssVUFBVyxHQUFHLEVBQU0sR0FBRyxJQUFNLENBQ3ZELEVBQVUsS0FBSyxTQUFXLE1BQVEsRUFBSyxLQUFLLEVBQUssQ0FBRyxLQUFLLFVBQVUsRUFBTSxLQUFNLEVBQUUsQ0FFdkYsTUFBTSxFQUFHLFNBQVMsVUFBVSxFQUFVLEVBQVMsUUFBUSxDQUczRCxVQUFpQixFQUFlLEVBQVcsQ0FDdkMsSUFBTSxFQUFNLEtBQUssU0FBVyxNQUFRLE1BQVEsT0FDdEMsRUFBVyxFQUFLLEtBQUssS0FBSyxVQUFXLEdBQUcsRUFBTSxHQUFHLElBQU0sQ0FDdkQsRUFBVSxLQUFLLFNBQVcsTUFBUSxFQUFLLEtBQUssRUFBSyxDQUFHLEtBQUssVUFBVSxFQUFNLEtBQU0sRUFBRSxDQUV2RixFQUFHLGNBQWMsRUFBVSxFQUFTLFFBQVEsQ0FHaEQsTUFBYSxNQUFPLENBQ2hCLEtBQUssT0FBTyxDQUVQLEVBQUcsV0FBVyxLQUFLLFVBQVUsR0FDMUIsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLDhDQUE4QyxLQUFLLFlBQVksQ0FHckYsRUFBRyxVQUFVLEtBQUssVUFBVyxDQUFFLFVBQVcsR0FBTSxDQUFDLEVBR3JELElBQU0sRUFBUSxNQUFNLEVBQUcsU0FBUyxRQUFRLEtBQUssVUFBVSxDQUV2RCxJQUFLLElBQU0sS0FBWSxFQUFPLENBQzFCLElBQU0sRUFBTSxFQUFLLFFBQVEsRUFBUyxDQU1sQyxHQUpJLEtBQUssU0FBVyxRQUFVLElBQVEsU0FJbEMsS0FBSyxTQUFXLE9BQVMsSUFBUSxPQUNqQyxTQUdKLElBQU0sRUFBVyxFQUFLLEtBQUssS0FBSyxVQUFXLEVBQVMsQ0FFOUMsQ0FBQyxFQUFPLEdBQVEsTUFBTSxFQUFTLFNBQVksQ0FDN0MsSUFBTSxFQUFPLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxRQUFRLENBTTFELE9BSkksRUFBSyxRQUFRLEVBQVMsR0FBSyxPQUNwQixFQUFLLEtBQUssRUFBSyxDQUduQixLQUFLLE1BQU0sRUFBSyxFQUN6QixDQUVGLEdBQUksRUFBTyxDQUNQLEtBQUssT0FBTyxNQUFNLDhCQUE4QixJQUFZLEVBQU0sQ0FDbEUsU0FHSixJQUFNLEVBQU0sRUFBSyxTQUFTLEVBQVUsRUFBSyxRQUFRLEVBQVMsQ0FBQyxDQUUzRCxNQUFNLElBQUksRUFBSyxFQUFNLGFBQWEsQ0FFOUIsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLHVCQUF1QixJQUFXLENBSXhELEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSw4QkFBOEIsQ0FJeEQsU0FBaUIsRUFBaUIsQ0FDOUIsR0FBTSxDQUFDLEVBQU8sR0FBRyxHQUFRLEVBQVEsTUFBTSxJQUFJLENBRTNDLE1BQU8sQ0FDSCxRQUNBLElBQUssRUFBSyxLQUFLLElBQUksQ0FDdEIsQ0FHTCxJQUFXLEVBQWlCLEVBQVksRUFBUyxhQUFvQixDQUdqRSxHQUZBLE1BQU0sSUFBSSxFQUFTLEVBQU8sRUFBTyxDQUU3QixJQUFXLGFBQ1gsT0FHSixHQUFNLENBQUUsUUFBTyxPQUFRLEtBQUssU0FBUyxFQUFRLENBRXpDLEVBQVMsS0FBSyxJQUFJLEVBQU0sQ0FFdkIsSUFDRCxFQUFTLEdBR1QsR0FBTyxHQUNQLEVBQUksRUFBUSxFQUFLLEVBQU0sQ0FHM0IsS0FBSyxVQUFVLEVBQU8sRUFBTyxDQUlqQyxNQUFhLEVBQXVCLENBQ2hDLEdBQU0sQ0FBRSxRQUFPLE9BQVEsS0FBSyxTQUFTLEVBQVEsQ0FFN0MsR0FBSSxDQUFDLEVBQUssQ0FDTixJQUFNLEVBQU0sS0FBSyxTQUFXLE1BQVEsTUFBUSxPQUV0QyxFQUFXLEVBQUssS0FBSyxLQUFLLFVBQVcsR0FBRyxFQUFNLEdBQUcsSUFBTSxDQUU3RCxFQUFHLFdBQVcsRUFBUyxDQUV2QixNQUFNLE1BQU0sRUFBUSxDQUVwQixPQUdKLElBQU0sRUFBUyxLQUFLLElBQUksRUFBTSxDQUU5QixFQUFJLEVBQVEsRUFBSyxJQUFBLEdBQVUsQ0FFM0IsS0FBSyxVQUFVLEVBQU8sRUFBTyxDQUU3QixNQUFNLE1BQU0sRUFBUSxHQ2xKUCxHQUFyQixLQUFzQyxDQUNsQyxHQUNBLEtBQ0EsWUFDQSxPQUFxQyxFQUFFLENBRXZDLFlBQVksRUFBd0UsQ0FDaEYsS0FBSyxHQUFLLEVBQUssR0FDZixLQUFLLEtBQU8sRUFBSyxLQUNqQixLQUFLLFlBQWMsRUFBSyxZQUN4QixLQUFLLE9BQVMsRUFBSyxPQUd2QixLQUFZLEVBQXdDLENBQ2hELElBQU0sRUFBWSxNQUFNLDBCQUEwQixDQUlsRCxNQUZBLE9BQU8sT0FBTyxFQUFPLENBQUUsU0FBUSxDQUFDLENBRTFCLEVBRVYsS0FBWSxFQUF1QyxDQUMvQyxJQUFNLEVBQVksTUFBTSwwQkFBMEIsQ0FJbEQsTUFGQSxPQUFPLE9BQU8sRUFBTyxDQUFFLFdBQVUsQ0FBQyxDQUU1QixFQUdWLE9BQWMsRUFBb0MsQ0FDOUMsSUFBTSxFQUFZLE1BQU0sMEJBQTBCLENBSWxELE1BRkEsT0FBTyxPQUFPLEVBQU8sQ0FBRSxXQUFVLENBQUMsQ0FFNUIsRUFHVixLQUFZLEVBQXVDLENBQy9DLElBQU0sRUFBWSxNQUFNLDBCQUEwQixDQUlsRCxNQUZBLE9BQU8sT0FBTyxFQUFPLENBQUUsV0FBVSxDQUFDLENBRTVCLEVBR1YsV0FBa0IsRUFBa0QsQ0FDaEUsSUFBTSxFQUFZLE1BQU0sMEJBQTBCLENBSWxELE1BRkEsT0FBTyxPQUFPLEVBQU8sQ0FBRSxXQUFVLENBQUMsQ0FFNUIsRUFHVixNQUFhLEVBQWtCLEVBQWlDLENBQzVELElBQU0sRUFBWSxNQUFNLDBCQUEwQixDQU9sRCxNQUxBLE9BQU8sT0FBTyxFQUFPLENBQ2pCLFdBQ0EsT0FDSCxDQUFDLENBRUksRUFHVixZQUFtQixFQUFrQixFQUE4QyxDQUMvRSxJQUFNLEVBQVksTUFBTSwwQkFBMEIsQ0FPbEQsTUFMQSxPQUFPLE9BQU8sRUFBTyxDQUNqQixXQUNBLFNBQ0gsQ0FBQyxDQUVJLEVBR1YsT0FBYyxFQUFpQyxDQUMzQyxJQUFNLEVBQVksTUFBTSwwQkFBMEIsQ0FJbEQsTUFGQSxPQUFPLE9BQU8sRUFBTyxDQUFFLFdBQVUsQ0FBQyxDQUU1QixFQUdWLElBQVcsRUFBa0IsRUFBdUMsQ0FDaEUsSUFBTSxFQUFZLE1BQU0sMEJBQTBCLENBT2xELE1BTEEsT0FBTyxPQUFPLEVBQU8sQ0FDakIsV0FDQSxVQUNILENBQUMsQ0FFSSxFQUdWLFVBQWlCLEVBQWtCLEVBQTZDLENBQzVFLElBQU0sRUFBWSxNQUFNLDBCQUEwQixDQU9sRCxNQUxBLE9BQU8sT0FBTyxFQUFPLENBQ2pCLFdBQ0EsVUFDSCxDQUFDLENBRUksSUM3RmQsTUFBTSxHQUFTLEVBQVUsT0FBUSxHQUFNLEVBQUUsT0FBTyxDQUM1QyxPQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQzFDLE9BQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQzlCLFlBQWEsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FDL0MsZ0JBQWlCLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQ25ELGFBQWMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQ3BDLFNBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQ2hDLE9BQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQ2pDLENBQUMsQ0FBQyxDQUlILFNBQVMsR0FBbUIsRUFBa0MsQ0FLMUQsTUFKSSxDQUFDLEdBQVUsT0FBTyxHQUFXLFVBQVksT0FBTyxFQUFPLElBQU8sV0FDdkQsUUFBUSxRQUFRLElBQUksV0FBYSxDQUdyQyxJQUFJLFNBQVMsRUFBUyxJQUFXLENBQ3BDLElBQU0sRUFBbUIsRUFBRSxDQUMzQixFQUFPLEdBQUcsT0FBUyxHQUFrQixFQUFPLEtBQUssT0FBTyxLQUFLLEVBQU0sQ0FBQyxDQUFDLENBQ3JFLEVBQU8sR0FBRyxVQUFhLEVBQVEsSUFBSSxXQUFXLE9BQU8sT0FBTyxFQUFPLENBQUMsQ0FBQyxDQUFDLENBQ3RFLEVBQU8sR0FBRyxRQUFTLEVBQU8sRUFDNUIsQ0FHTixJQUFxQixHQUFyQixjQUFxQ0MsRUFBVSxDQUMzQyxPQUFpQixHQUVqQixRQUVBLFlBQVksRUFBaUUsQ0FDekUsTUFBTSxFQUFLLENBR2YsSUFBVyxPQUFpQixDQUN4QixPQUFPLEVBQVUsUUFBUSxLQUFLLE9BQVEsS0FBSyxPQUFPLENBR3RELFlBQTJCLENBQ3ZCLEdBQUksQ0FBQyxLQUFLLE1BQ04sTUFBTSxJQUFJLEVBQWMsR0FBRyw4QkFBOEIsQ0FBQyxDQUlsRSxJQUFjLFFBQWlCLENBQzNCLE9BQVEsS0FBSyxPQUF5QixPQUcxQyxJQUFjLFFBQWlCLENBTzNCLE9BTkssS0FBSyxRQUFRLE9BRWIsS0FBSyxRQUFRLE9BQU8sU0FBUyxJQUFJLENBSS9CLEtBQUssT0FBTyxPQUhSLEtBQUssT0FBTyxPQUFTLElBSEMsR0FTckMsT0FBZSxFQUEwQixDQUNyQyxJQUFNLEVBQWdCLEVBQVMsV0FBVyxJQUFJLENBQUcsRUFBUyxNQUFNLEVBQUUsQ0FBRyxFQUtyRSxPQUpLLEtBQUssT0FJSCxHQURhLEtBQUssT0FBTyxTQUFTLElBQUksQ0FBRyxLQUFLLE9BQVMsR0FBRyxLQUFLLE9BQU8sS0FDckQsSUFIYixFQU1mLElBQWMsUUFBbUIsQ0FDN0IsR0FBSSxLQUFLLFFBQ0wsT0FBTyxLQUFLLFFBR2hCLElBQU0sRUFBUyxLQUFLLE9BWXBCLE1BVkEsTUFBSyxRQUFVLElBQUksR0FBUyxDQUN4QixPQUFRLEVBQU8sT0FDZixTQUFVLEVBQU8sU0FDakIsWUFBYSxDQUNULFlBQWEsRUFBTyxZQUNwQixnQkFBaUIsRUFBTyxnQkFDeEIsYUFBYyxFQUFPLGFBQ3hCLENBQ0osQ0FBQyxDQUVLLEtBQUssUUFHaEIsT0FBcUMsS0FBTyxJQUFhLENBQ3JELEtBQUssWUFBWSxDQUVqQixJQUFNLEVBQU0sS0FBSyxPQUFPLEVBQVMsQ0FFakMsT0FBTyxLQUFLLE9BQU8sS0FBSyxJQUFJLEdBQWtCLENBQzFDLE9BQVEsS0FBSyxPQUNiLE1BQ0gsQ0FBQyxDQUFDLENBQ0UsU0FBVyxHQUFLLENBQ2hCLFVBQVksR0FBTSxFQUczQixLQUFpQyxLQUFPLElBQVcsQ0FDL0MsS0FBSyxZQUFZLENBRWpCLElBQUksRUFBUyxFQUFTLEtBQUssT0FBTyxFQUFPLENBQUcsS0FBSyxRQUFVLElBQUEsR0FFdkQsR0FBVSxDQUFDLEVBQU8sU0FBUyxJQUFJLEdBQy9CLEdBQVUsS0FHZCxJQUFNLEVBQVUsSUFBSSxHQUFxQixDQUNyQyxPQUFRLEtBQUssT0FDYixTQUNBLFVBQVcsSUFDZCxDQUFDLENBRUksRUFBTyxNQUFNLEtBQUssT0FBTyxLQUFLLEVBQVEsQ0FFdEMsRUFBeUIsRUFBRSxDQUUzQixFQUFpQixFQUFLLGdCQUFrQixFQUFFLENBRWhELElBQUssSUFBTSxLQUFVLEVBQWdCLENBQ2pDLElBQUksRUFBTSxFQUFPLFFBQVUsR0FFM0IsRUFBTSxFQUFJLFFBQVEsS0FBSyxPQUFRLEdBQUcsQ0FFOUIsRUFBSSxTQUFTLElBQUksR0FDakIsRUFBTSxFQUFJLE1BQU0sRUFBRyxHQUFHLEVBRzFCLElBQU0sRUFBUSxJQUFJQyxHQUFZLENBQzFCLEtBQU0sRUFBSSxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUksRUFDOUIsS0FBTSxJQUFNLEVBQ1osS0FBTSxZQUNOLE1BQU8sQ0FDSCxLQUFNLEVBQ04sU0FBVSwwQkFDYixDQUNKLENBQUMsQ0FFRixFQUFRLEtBQUssRUFBTSxDQUd2QixJQUFNLEVBQVcsRUFBSyxVQUFZLEVBQUUsQ0FFcEMsSUFBSyxJQUFNLEtBQU8sRUFBVSxDQUN4QixJQUFJLEVBQU0sRUFBSSxLQUFPLEdBSXJCLEdBRkEsRUFBTSxFQUFJLFFBQVEsS0FBSyxPQUFRLEdBQUcsQ0FFOUIsRUFBSSxTQUFTLElBQUksQ0FDakIsU0FHSixJQUFNLEVBQVEsSUFBSUEsR0FBWSxDQUMxQixLQUFNLEVBQUksTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFJLEVBQzlCLEtBQU0sSUFBTSxFQUNaLEtBQU0sT0FDTixNQUFPLENBQ0gsS0FBTSxFQUFJLEtBQ1YsU0FBVSxHQUFLLFFBQVEsRUFBSSxFQUFJLDJCQUNsQyxDQUNKLENBQUMsQ0FFRixFQUFRLEtBQUssRUFBTSxDQUd2QixPQUFPLEdBR1gsS0FBaUMsS0FBTyxJQUFhLENBQ2pELEtBQUssWUFBWSxDQUVqQixJQUFNLEVBQVcsRUFBUyxXQUFXLElBQUksQ0FBRyxFQUFXLElBQU0sRUFDdkQsRUFBUyxFQUFRLEVBQVMsQ0FJMUIsR0FGVSxNQUFNLEtBQUssS0FBSyxFQUFPLEVBRWpCLEtBQUssR0FBSyxFQUFFLE9BQVMsRUFBUyxDQUVwRCxHQUFJLENBQUMsRUFDRCxNQUFVLE1BQU0sU0FBUyxFQUFTLGFBQWEsQ0FHbkQsT0FBTyxHQUdYLE1BQWEsTUFBTSxFQUFrQyxDQUlqRCxPQUhBLEtBQUssWUFBWSxDQUdWLFFBQVEsU0FBUyxDQUc1QixLQUFpQyxLQUFPLElBQWEsQ0FDakQsS0FBSyxZQUFZLENBRWpCLElBQU0sRUFBTSxLQUFLLE9BQU8sRUFBUyxDQU8zQixHQUxPLE1BQU0sS0FBSyxPQUFPLEtBQUssSUFBSSxHQUFpQixDQUNyRCxPQUFRLEtBQUssT0FDYixNQUNILENBQUMsQ0FBQyxFQUVlLEtBRWxCLE9BQU8sR0FBbUIsRUFBSyxFQUduQyxNQUFhLFdBQVcsRUFBa0IsQ0FDdEMsS0FBSyxZQUFZLENBRWpCLElBQU0sRUFBTSxLQUFLLE9BQU8sRUFBUyxDQUUzQixFQUFVLElBQUksR0FBaUIsQ0FDakMsT0FBUSxLQUFLLE9BQ2IsTUFDSCxDQUFDLENBSUksR0FGTyxNQUFNLEtBQUssT0FBTyxLQUFLLEVBQVEsRUFFMUIsS0FFbEIsT0FBTyxRQUFRLFFBQVEsRUFBSyxDQUdoQyxNQUFtQyxNQUFPLEVBQVUsSUFBUyxDQUN6RCxLQUFLLFlBQVksQ0FFakIsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFTLENBRWpDLE1BQU0sS0FBSyxPQUFPLEtBQUssSUFBSSxHQUFpQixDQUN4QyxPQUFRLEtBQUssT0FDYixNQUNBLEtBQU0sT0FBTyxLQUFLLEVBQUssQ0FDMUIsQ0FBQyxDQUFDLEVBR1AsTUFBYSxZQUFZLEVBQWtCLEVBQThDLENBQ3JGLEtBQUssWUFBWSxDQUVqQixJQUFNLEVBQU0sS0FBSyxPQUFPLEVBQVMsQ0FXakMsTUFUZSxJQUFJLEdBQU8sQ0FDdEIsT0FBUSxLQUFLLE9BQ2IsT0FBUSxDQUNKLE9BQVEsS0FBSyxPQUNiLE1BQ0EsS0FBTSxHQUFTLEtBQUssRUFBTyxDQUM5QixDQUNKLENBQUMsQ0FFVyxNQUFNLENBR3ZCLE9BQXFDLEtBQU8sSUFBYSxDQUNyRCxLQUFLLFlBQVksQ0FFakIsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFTLENBSWpDLElBRmMsTUFBTSxLQUFLLEtBQUssRUFBUyxFQUU3QixPQUFTLE9BQVEsQ0FDdkIsSUFBTSxFQUFVLElBQUksR0FBb0IsQ0FDcEMsT0FBUSxLQUFLLE9BQ2IsTUFDSCxDQUFDLENBRUYsTUFBTSxLQUFLLE9BQU8sS0FBSyxFQUFRLENBRS9CLE9BSUosSUFBTSxFQUFlLE1BQU0sS0FBSyxPQUFPLEtBQUssSUFBSSxHQUFxQixDQUNqRSxPQUFRLEtBQUssT0FDYixPQUFRLEVBQ1gsQ0FBQyxDQUFDLENBRUcsR0FBWSxFQUFhLFVBQVksRUFBRSxFQUFFLElBQUksSUFBTSxDQUFFLElBQUssRUFBRSxJQUFLLEVBQUUsQ0FFckUsRUFBUyxTQUFXLElBSXhCLE1BQU0sS0FBSyxPQUFPLEtBQUssSUFBSSxHQUFxQixDQUM1QyxPQUFRLEtBQUssT0FDYixPQUFRLENBQUUsUUFBUyxFQUFVLENBQ2hDLENBQUMsQ0FBQyxDQUVDLEVBQWEsYUFDYixLQUFLLE9BQU8sRUFBUyxHQU83QixJQUErQixNQUFPLEVBQVUsSUFBWSxDQUN4RCxLQUFLLFlBQVksQ0FFakIsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFTLENBRTNCLEVBQVksRUFBRyxHQUFTLFNBQVcsTUFBTSxFQUFJLEtBQVUsSUFDdkQsRUFBaUIsS0FBSyxJQUFJLEVBQUcsS0FBSyxNQUFNLEVBQVksSUFBSyxDQUFDLENBRWhFLE9BQU8sR0FBYSxLQUFLLE9BQVEsSUFBSSxHQUFpQixDQUNsRCxPQUFRLEtBQUssT0FDYixNQUNILENBQUMsQ0FBRSxDQUFFLFVBQVcsRUFBZ0IsQ0FBQyxFQUd0QyxVQUEyQyxNQUFPLEVBQVUsSUFBWSxDQUNwRSxLQUFLLFlBQVksQ0FFakIsSUFBTSxFQUFNLEtBQUssT0FBTyxFQUFTLENBRTNCLEVBQVksRUFBRyxHQUFTLFNBQVcsTUFBTSxFQUFJLEtBQVUsSUFDdkQsRUFBaUIsS0FBSyxJQUFJLEVBQUcsS0FBSyxNQUFNLEVBQVksSUFBSyxDQUFDLENBRTFELEVBQVUsSUFBSSxHQUFpQixDQUNqQyxPQUFRLEtBQUssT0FDYixNQUNILENBQUMsQ0FFRixPQUFPLEdBQWEsS0FBSyxPQUFRLEVBQVMsQ0FBRSxVQUFXLEVBQWdCLENBQUMsR0M3VTNELEdBQXJCLGNBQTZDLENBQWMsQ0FDdkQsT0FBZ0IsR0FDaEIsT0FDQSxNQUFlLEdBQ2YsTUFDQSxPQUNBLE9BQ0EsU0FFQSxZQUFZLEVBQXVCLENBQy9CLE9BQU8sQ0FFUCxLQUFLLE1BQVEsRUFBUSxPQUFTLEdBQzlCLEtBQUssT0FBUyxFQUFRLFFBQVUsR0FDaEMsS0FBSyxPQUFTLEVBQVEsT0FDdEIsS0FBSyxPQUFTLEVBQVEsUUFBVSxHQUNoQyxLQUFLLFNBQVcsRUFBUSxTQUN4QixLQUFLLE9BQVMsRUFBUSxRQUFVLElBQUksRUFFcEMsS0FBSyxNQUFRLElBQUlDLEdBQVEsQ0FDckIsR0FBSSxZQUNKLEtBQU0sWUFDTixPQUFRLENBQ0osT0FBUSxFQUFRLE9BQ2hCLE9BQVEsRUFBUSxPQUNoQixZQUFhLEVBQVEsWUFDckIsZ0JBQWlCLEVBQVEsZ0JBQ3pCLGFBQWMsRUFBUSxhQUN0QixTQUFVLEVBQVEsU0FDckIsQ0FDSixDQUFDLENBRUUsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLG9DQUFvQyxDQUk5RCxTQUFpQixFQUFvRCxDQUNqRSxHQUFNLENBQUMsRUFBVSxHQUFHLEdBQVEsRUFBUSxNQUFNLElBQUksQ0FFOUMsTUFBTyxDQUNILFdBQ0EsSUFBSyxFQUFLLEtBQUssSUFBSSxDQUN0QixDQUdMLE1BQWEsTUFBTyxDQUNoQixLQUFLLE9BQU8sQ0FFWixJQUFNLEVBQVMsS0FBSyxPQUFPLFFBQVEsV0FBWSxHQUFHLENBRTVDLEVBQVUsTUFBTSxLQUFLLE1BQU0sS0FBSyxHQUFVLElBQUEsR0FBVSxDQUUxRCxJQUFLLElBQU0sS0FBUyxFQUFTLENBQ3pCLEdBQUksQ0FBQyxFQUFNLEtBQUssU0FBUyxRQUFRLENBQzdCLFNBR0osSUFBTSxFQUFXLEVBQU0sS0FFakIsRUFBVyxFQUFTLEdBQUcsRUFBTyxHQUFHLElBQWEsRUFFOUMsQ0FBQyxFQUFPLEdBQVEsTUFBTSxFQUFTLFNBQVksQ0FDN0MsSUFBTSxFQUFNLE1BQU0sS0FBSyxNQUFNLEtBQUssRUFBUyxDQUVyQyxFQUFPLE9BQU8sS0FBSyxFQUFJLENBQUMsU0FBUyxRQUFRLENBRS9DLE9BQU8sS0FBSyxNQUFNLEVBQUssRUFDekIsQ0FFRixHQUFJLEVBQU8sQ0FDUCxLQUFLLE9BQU8sTUFBTSw4QkFBOEIsSUFBWSxFQUFNLENBQ2xFLFNBR0osSUFBTSxFQUFNLEVBQVMsUUFBUSxVQUFXLEdBQUcsQ0FFM0MsTUFBTSxJQUFJLEVBQUssRUFBSyxDQUVoQixLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0sdUJBQXVCLElBQVcsQ0FJeEQsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLDhCQUE4QixDQUl4RCxJQUFXLEVBQWlCLEVBQVksRUFBUyxLQUFZLENBR3pELEdBRkEsTUFBTSxJQUFJLEVBQVMsRUFBTyxFQUFPLENBRTdCLElBQVcsS0FDWCxPQUdKLEdBQU0sQ0FBRSxXQUFVLE9BQVEsS0FBSyxTQUFTLEVBQVEsQ0FFNUMsRUFBUyxLQUFLLElBQUksRUFBUyxDQUUxQixJQUNELEVBQVMsR0FHVCxHQUFPLEdBQ1AsRUFBSSxFQUFRLEVBQUssRUFBTSxDQUczQixJQUFNLEVBQWMsS0FBSyxPQUFPLFFBQVEsV0FBWSxHQUFHLENBRWpELEVBQVcsRUFBYyxHQUFHLEVBQVksR0FBRyxFQUFTLE9BQVMsR0FBRyxFQUFTLE9BRXpFLEVBQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFRLEtBQU0sRUFBRSxDQUFDLENBRXpELEtBQUssTUFBTSxNQUFNLEVBQVUsRUFBOEIsQ0FBQyxNQUFNLEdBQU8sQ0FDbkUsS0FBSyxPQUFPLE1BQU0sK0JBQWdDLEVBQUksRUFDeEQsQ0FHTixNQUFhLEVBQXVCLENBQ2hDLElBQU0sRUFBYyxLQUFLLE9BQU8sUUFBUSxXQUFZLEdBQUcsQ0FFdkQsR0FBSSxDQUFDLEVBQVEsU0FBUyxJQUFJLENBQUUsQ0FDeEIsSUFBTSxFQUFXLEVBQWMsR0FBRyxFQUFZLEdBQUcsRUFBUSxPQUFTLEdBQUcsRUFBUSxPQUU3RSxLQUFLLE1BQU0sT0FBTyxFQUFTLENBQ3RCLE1BQU0sR0FBTyxDQUNWLEtBQUssT0FBTyxNQUFNLGtDQUFtQyxFQUFJLEVBQzNELENBQ04sT0FHSixHQUFNLENBQUUsV0FBVSxPQUFRLEtBQUssU0FBUyxFQUFRLENBRTFDLEVBQVMsS0FBSyxJQUFJLEVBQVMsQ0FFakMsRUFBSSxFQUFRLEVBQUssSUFBQSxHQUFVLENBRzNCLElBQU0sRUFBVyxFQUFjLEdBQUcsRUFBWSxHQUFHLEVBQVMsT0FBUyxHQUFHLEVBQVMsT0FFL0UsS0FBSyxNQUFNLE1BQU0sRUFBVSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQVEsS0FBTSxFQUFFLENBQUMsQ0FBMEIsQ0FBQyxNQUFNLEdBQU8sQ0FDM0csS0FBSyxPQUFPLE1BQU0sK0JBQWdDLEVBQUksRUFDeEQsQ0FFRixNQUFNLE1BQU0sRUFBUSxHQy9JUCxHQUFyQixNQUFxQixDQUFxQixDQUN0QyxJQUNBLE9BQ0EsT0FFQSxZQUFZLEVBQStCLENBQ3ZDLEtBQUssSUFBTSxFQUFRLElBQ25CLEtBQUssT0FBUyxFQUFRLE9BQ3RCLEtBQUssT0FBUyxFQUFRLFFBQVUsR0FHcEMsT0FBYyxPQUFPLEVBQStCLENBR2hELE9BRmdCLElBQUksRUFBcUIsRUFBUSxDQUtyRCxNQUFjLGNBQWUsQ0FDekIsSUFBTSxFQUFVLElBQUksR0FBZ0IsQ0FDaEMsT0FBUSxLQUFLLElBQUksSUFBSSwwQkFBMEIsQ0FDL0MsT0FBUSxLQUFLLElBQUksSUFBSSwwQkFBMEIsQ0FDL0MsWUFBYSxLQUFLLElBQUksSUFBSSxpQ0FBaUMsQ0FDM0QsZ0JBQWlCLEtBQUssSUFBSSxJQUFJLHFDQUFxQyxDQUNuRSxNQUFPLEtBQUssSUFBSSxJQUFJLHNCQUFzQixDQUMxQyxTQUFVLEtBQUssSUFBSSxJQUFJLDRCQUE0QixDQUNuRCxPQUFRLEtBQUssSUFBSSxJQUFJLDBCQUEwQixDQUMvQyxhQUFjLEtBQUssSUFBSSxJQUFJLGlDQUFpQyxDQUM1RCxPQUFRLEtBQUssT0FDaEIsQ0FBQyxDQWFGLE9BWEEsTUFBTSxFQUFRLE1BQU0sQ0FFZixLQUFLLFFBQ04sS0FBSyxPQUFPLEtBQUssaUNBQWtDLENBQy9DLE9BQVEsRUFBUSxPQUNoQixPQUFRLEVBQVEsT0FDaEIsT0FBUSxFQUFRLE9BQ25CLENBQUMsQ0FJQyxFQUdYLE1BQWMsY0FBZSxDQUN6QixJQUFNLEVBQVUsSUFBSSxHQUFnQixDQUNoQyxVQUFXLEtBQUssSUFBSSxJQUFJLHdCQUF3QixDQUNoRCxNQUFPLEtBQUssSUFBSSxJQUFJLHNCQUFzQixDQUMxQyxPQUFRLEtBQUssSUFBSSxJQUFJLDBCQUEwQixDQUMvQyxPQUFRLEtBQUssT0FDaEIsQ0FBQyxDQVFGLE9BTkEsTUFBTSxFQUFRLE1BQU0sQ0FFZixLQUFLLFFBQ04sS0FBSyxPQUFPLEtBQUsseUNBQTBDLENBQUUsS0FBTSxFQUFRLFVBQVcsQ0FBQyxDQUdwRixFQUdYLGtCQUF5QixFQUF3QixDQUM3QyxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsT0FBTyxRQUFRLEVBQVEsS0FBSyxJQUFJLElBQUksZ0JBQWdCLEVBQUksRUFBRSxDQUFDLENBQUMsQ0FDbkYsRUFBUSxJQUFJLEVBQUssRUFBTyxNQUFNLENBR2xDLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsRUFBUSxLQUFLLElBQUksSUFBSSwwQkFBMEIsRUFBSSxFQUFFLENBQUMsQ0FBQyxDQUM3RixFQUFRLElBQUksRUFBSyxFQUFPLFdBQVcsQ0FJM0MsbUJBQTBCLEVBQXdCLEVBQWMsQ0FDNUQsR0FBSSxDQUFDLEVBQUcsV0FBVyxFQUFLLENBQUUsQ0FDdEIsS0FBSyxPQUFPLEtBQUssaUNBQWlDLElBQU8sQ0FDekQsT0FHSixJQUFNLEVBQU8sRUFBRyxhQUFhLEVBQU0sUUFBUSxDQUN2QyxFQUFtQyxLQU12QyxJQUpJLEVBQUssU0FBUyxPQUFPLEVBQUksRUFBSyxTQUFTLFFBQVEsSUFDL0MsRUFBTyxFQUFLLEtBQUssRUFBSyxFQUd0QixDQUFDLEVBQ0QsTUFBTSxJQUFJLEVBQWMsMENBQTBDLElBQU8sQ0FHN0UsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxFQUFRLEVBQUssQ0FBQyxDQUNwRCxFQUFRLElBQUksRUFBSyxFQUFPLEVBQUssQ0FJckMsb0JBQTJCLEVBQXdCLEVBQWlCLENBQ2hFLElBQUssSUFBTSxLQUFRLEVBQ2YsS0FBSyxtQkFBbUIsRUFBUyxFQUFLLENBSTlDLE1BQWEsTUFBK0IsQ0FDeEMsSUFBSSxFQUFnQyxLQVVwQyxHQVJJLEtBQUssSUFBSSxJQUFJLHVCQUF1QixHQUFLLE9BQ3pDLEVBQVUsTUFBTSxLQUFLLGNBQWMsR0FHbkMsQ0FBQyxHQUFXLEtBQUssSUFBSSxJQUFJLHVCQUF1QixHQUFLLFFBQ3JELEVBQVUsTUFBTSxLQUFLLGNBQWMsRUFHbkMsQ0FBQyxFQUNELE1BQU0sSUFBSSxFQUFjLG9FQUFvRSxDQUdoRyxHQUFJLENBQUMsRUFDRCxNQUFNLElBQUksRUFBYyw2Q0FBNkMsQ0FPekUsT0FKQSxLQUFLLG9CQUFvQixFQUFTLEtBQUssSUFBSSxJQUFJLHNCQUFzQixDQUFDLENBRXRFLEtBQUssa0JBQWtCLEVBQVEsQ0FFeEIsSUNqSU0sR0FBckIsS0FBcUMsQ0FDakMsTUFBYSxNQUFNLEVBQWEsRUFBa0MsQ0FDOUQsSUFBTSxFQUFlLEdBQVcsRUFBRSxDQVFsQyxPQU5JLEdBQVMsUUFDVCxFQUFhLFdBQWMsSUFBSSxHQUFXLEVBQVEsTUFBTSxFQUc1RCxRQUFRLElBQUksd0JBQXlCLEVBQUssZ0JBQWlCLEVBQWEsQ0FFakUsTUFBTSxHQUFNLEVBQUssRUFBYSxDQUl6QyxNQUFhLE9BQU8sRUFBYSxFQUFrQyxDQUMvRCxJQUFNLEVBQVcsTUFBTSxLQUFLLE1BQU0sRUFBSyxFQUFRLENBRS9DLEdBQUksQ0FBQyxFQUFTLEdBQUksQ0FDZCxJQUFNLEVBQVEsSUFBSSxFQUFjLHFCQUFzQixJQUFJLENBTzFELE1BTEEsT0FBTyxPQUFPLEVBQU8sQ0FDakIsT0FBUSxFQUFTLE9BQ2pCLFdBQVksRUFBUyxXQUN4QixDQUFDLENBRUksRUFHVixHQUFJLENBQUMsRUFBUyxLQUNWLE1BQU0sSUFBSSxFQUFjLFVBQVcsSUFBSSxDQUczQyxJQUFNLEVBQWMsRUFBUyxRQUFRLElBQUksZUFBZSxFQUFJLDJCQUU1RCxNQUFPLENBQ0gsT0FBUSxFQUFTLEtBQ2pCLGNBQ0gsR0MxQ1QsTUFBTSxFQUFTLEVBQVUsTUFBcUIsRUFBYyxDQ1E1RCxTQUF3QixHQUFZLEVBQWEsRUFBbUIsRUFBRSxDQUFFLENBQ3BFLE9BQU8sU0FBMkQsRUFBYSxDQUMzRSxPQUFPLGNBQWMsQ0FBSyxDQUN0QixPQUFjLGdCQUFrQixHQUVoQyxPQUFjLFVBQThDLEVBQXNCLENBQzlFLElBQU0sRUFBVyxJQUFJLEtBSXJCLE9BRkEsT0FBTyxPQUFPLEVBQWlCLEVBQUksQ0FFNUIsRUFHWCxhQUFvQixNQUF1RCxDQUN2RSxJQUFNLEVBQWMsS0FFZCxFQUFNLEVBQU8sSUFBeUIsRUFBSSxFQUFJLEVBQUUsQ0FFaEQsRUFBUSxFQUFFLENBRWhCLElBQUssR0FBTSxDQUFDLEVBQUksS0FBTSxPQUFPLFFBQVEsRUFBSSxDQUFFLENBQ3ZDLElBQU0sRUFBTyxFQUFZLFVBQVUsS0FBSyxNQUFNLEtBQUssVUFBVSxDQUN6RCxHQUFHLEVBQ0gsS0FDSCxDQUFDLENBQUMsQ0FBQyxDQUVKLEVBQU0sS0FBSyxFQUFLLENBS3BCLE9BRkEsTUFBTSxFQUFZLEtBQUssS0FBTSxZQUFhLEVBQU0sQ0FFekMsRUFHWCxhQUFvQixLQUF5QyxFQUErQixDQUt4RixJQUFNLEdBRk0sTUFGUSxLQUVVLE1BQU0sRUFFbkIsS0FBSyxHQUFNLEVBQVUsS0FBTyxFQUFHLENBRWhELEdBQUksQ0FBQyxFQUNELE9BQU8sS0FHWCxJQUFNLEVBQU8sS0FBSyxNQUFNLEtBQUssVUFBVSxFQUFLLENBQUMsQ0FJN0MsT0FGQSxNQUFNLEVBQVksS0FBSyxLQUFNLFlBQWEsRUFBSyxDQUV2QyxHQUFRLEtBR3BCLGFBQW9CLFdBQStDLEVBQXdCLENBR3ZGLElBQU0sRUFBTyxNQUZPLEtBRVcsS0FBSyxFQUFHLENBRXZDLEdBQUksQ0FBQyxFQUNELE1BQVUsTUFBTSx3QkFBd0IsQ0FHNUMsT0FBTyxFQUdYLGFBQW9CLE9BQTJDLEVBQXlDLENBQ3BHLEdBQUksRUFBUSxTQUNSLE1BQU0sSUFBSSxFQUFjLHdCQUF3QixDQUdwRCxHQUFJLENBQUMsRUFBSyxHQUNOLE1BQVUsTUFBTSw2QkFBNkIsQ0FHakQsSUFBTSxFQUFjLEtBRWQsRUFBTSxFQUFPLElBQXlCLEVBQUksRUFBSSxFQUFFLENBRXRELEdBQUksRUFBSSxFQUFLLElBQ1QsTUFBVSxNQUFNLDZCQUE2QixDQVdqRCxPQVJBLE1BQU0sRUFBWSxLQUFLLEtBQU0sZUFBZ0IsRUFBSyxDQUVsRCxFQUFJLEVBQUssSUFBTSxDQUFFLEdBQUcsRUFBTSxDQUUxQixPQUFPLEVBQUksRUFBSyxJQUFJLEdBRXBCLE1BQU0sRUFBTyxJQUFJLEVBQUssRUFBSSxDQUVuQixFQUFZLFdBQVcsRUFBSyxHQUFHLENBRzFDLGFBQW9CLE9BQTJDLEVBQVksRUFBd0IsQ0FDL0YsR0FBSSxFQUFRLFNBQ1IsTUFBTSxJQUFJLEVBQWMsd0JBQXdCLENBR3BELElBQU0sRUFBYyxLQUVkLEVBQU0sRUFBTyxJQUF5QixFQUFJLEVBQUksRUFBRSxDQUV0RCxHQUFJLENBQUMsRUFBSSxHQUNMLE1BQVUsTUFBTSx3QkFBd0IsQ0FTNUMsT0FOQSxNQUFNLEVBQVksS0FBSyxLQUFNLGVBQWdCLEVBQUssQ0FFbEQsT0FBTyxPQUFPLEVBQUksR0FBSyxFQUFLLENBRTVCLE1BQU0sRUFBTyxJQUFJLEVBQUssRUFBSSxDQUVuQixFQUFZLFdBQVcsRUFBRyxDQUdyQyxhQUFvQixlQUFtRCxFQUFZLEVBQWlDLENBQ2hILElBQU0sRUFBYyxLQVFwQixPQU5pQixNQUFNLEVBQVksS0FBSyxFQUFHLENBR2hDLEVBQVksT0FBTyxFQUFJLEVBQVksQ0FHdkMsRUFBWSxPQUFPLENBQ3RCLEdBQUksRUFDSixLQUNILENBQUMsQ0FHTixhQUFvQixRQUE0QyxFQUEyQixDQUN2RixHQUFJLEVBQVEsU0FDUixNQUFNLElBQUksRUFBYyx3QkFBd0IsQ0FHcEQsSUFBTSxFQUFNLEVBQU8sSUFBeUIsRUFBSSxFQUFJLEVBQUUsQ0FFdEQsR0FBSSxDQUFDLEVBQUksR0FDTCxNQUFVLE1BQU0sd0JBQXdCLENBRzVDLE9BQU8sRUFBSSxHQUVYLE1BQU0sRUFBTyxJQUFJLEVBQUssRUFBSSxJQ3BKMUMsSUFBcUIsRUFBckIsY0FBeUMsRUFDckNDLEdBQ0EsR0FBWSxjQUFjLENBQzdCLEFBQUMsQ0FDRSxPQUFjLFVBQThDLEVBQXNCLENBQzlFLElBQU0sRUFBVyxJQUFJLEtBUXJCLE1BTkEsR0FBUyxHQUFLLEVBQUksR0FDbEIsRUFBUyxLQUFPLEVBQUksTUFBUSxFQUFJLEdBQ2hDLEVBQVMsS0FBTyxFQUFJLEtBQ3BCLEVBQVMsT0FBUyxFQUFJLFFBQVUsRUFBRSxDQUNsQyxFQUFTLFdBQWEsRUFBTyxJQUFJLGdCQUFnQixHQUFLLEVBQUksR0FFbkQsSUNiZixNQUFNLEdBQVUsRUFBRSxLQUNkLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxPQUFPLENBQUUsRUFBRSxRQUFRLFFBQVEsQ0FBRSxFQUFFLFFBQVEsSUFBSSxDQUFFLEVBQUUsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUNoRixFQUFFLFVBQVcsR0FBVSxJQUFVLFFBQVUsSUFBVSxJQUFJLENBQ3pELEVBQUUsU0FBUyxDQUNkLENBRUssRUFBVyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUUsRUFBRSxVQUFXLEdBQVUsQ0FDdkQsSUFBTSxFQUFVLEVBQU0sTUFBTSxRQUFRLENBQy9CLE9BQU8sUUFBUSxDQUNmLE9BQU8sR0FBSyxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQzVCLElBQUksR0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUU1QixFQUFNLE9BQU8sWUFBWSxFQUFRLENBRWpDLEVBQThCLEVBQUUsQ0FFdEMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxFQUFJLENBQUUsQ0FDNUMsSUFBSSxFQUFtQixFQUVuQixFQUFNLFdBQVcsUUFBUSxHQUN6QixFQUFjLEVBQU0sUUFBUSxRQUFTLEdBQUcsQ0FBQyxNQUFNLEdBQUssUUFHeEQsRUFBSSxFQUFRLEVBQUssRUFBWSxDQUdqQyxPQUFPLEdBQ1QsQ0FBQyxDQUVHLEdBQWMsRUFBRSxLQUNsQixFQUFFLFFBQVEsQ0FDVixFQUFFLFVBQVcsR0FBVSxFQUNsQixNQUFNLElBQUksQ0FDVixJQUFJLEdBQUssRUFBRSxNQUFNLENBQUMsQ0FDbEIsT0FBTyxRQUFRLENBQ25CLENBQ0osQ0FFWSxHQUFZLEVBQUUsWUFBWSxDQUNuQyxTQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsY0FBYyxDQUFFLEVBQUUsUUFBUSxhQUFhLENBQUUsRUFBRSxRQUFRLE9BQU8sQ0FBQyxDQUFDLENBQUUsY0FBYyxDQUVwSCxpQkFBa0IsRUFBRSxRQUFRLENBQzVCLG9CQUFxQixFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FFM0MsZUFBZ0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFFLHdCQUF3QixDQUMvRCxZQUFhLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUUsRUFBRSxVQUFXLEdBQVUsU0FBUyxFQUFNLENBQUMsQ0FBQyxDQUFFLE9BQU8sQ0FDNUYsWUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUUsVUFBVSxDQUU5QyxpQkFBa0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFFBQVMsT0FBUSxPQUFRLFFBQVEsQ0FBQyxDQUFFLE9BQU8sQ0FDcEYsdUJBQXdCLEVBQUUsU0FBUyxHQUFTLFFBQVEsQ0FDcEQscUJBQXNCLEVBQUUsU0FBUyxFQUFVLEdBQUcsQ0FFOUMsY0FBZSxFQUFFLFNBQVMsRUFBVSxHQUFHLENBQ3ZDLHdCQUF5QixFQUFFLFNBQVMsRUFBVSxHQUFHLENBQ2pELG9CQUFxQixFQUFFLFNBQVMsR0FBYSxHQUFHLENBRWhELG9CQUFxQixFQUFFLFNBQVMsR0FBUyxRQUFRLENBQ2pELHFCQUFzQixFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsS0FBTSxLQUFLLENBQUMsQ0FBRSxLQUFLLENBQ2hFLHNCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FDN0Msd0JBQXlCLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxPQUFRLE1BQU0sQ0FBQyxDQUFFLE9BQU8sQ0FFeEUsd0JBQXlCLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUMvQyx3QkFBeUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQy9DLCtCQUFnQyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FDdEQsbUNBQW9DLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUMxRCwrQkFBZ0MsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQ3RELDBCQUEyQixFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FDakQsd0JBQXlCLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBRSxHQUFHLENBRW5ELG9CQUFxQixFQUFFLFNBQVMsR0FBWSxDQUMvQyxDQUFDLENDckVGLElBQXFCLEdBQXJCLE1BQXFCLENBQVcsQ0FDNUIsSUFBZ0MsS0FDaEMsTUFBMEIsRUFBRSxDQUU1QixPQUFjLFFBQVMsQ0FDbkIsT0FBTyxJQUFJLEVBR2YsT0FBYyxhQUFhLEVBQXNDLENBQzdELE9BQU8sR0FBTyxPQUFPLEVBQVEsQ0FHakMsU0FBZ0IsRUFBaUIsQ0FFN0IsTUFEQSxNQUFLLE1BQVEsRUFDTixLQUdYLFFBQWUsRUFBYyxDQUV6QixPQURBLEtBQUssTUFBTSxLQUFLLEVBQUssQ0FDZCxLQUdYLE1BQWMsQ0FTVixPQVJBLEVBQVcsYUFBYSxDQUNwQixLQUFNLEtBQUssTUFDWCxTQUFVLEdBQ1YsTUFBTyxHQUNWLENBQUMsQ0FFRixLQUFLLElBQU0sRUFBRSxNQUFNLEdBQVcsUUFBUSxJQUFJLENBRW5DLEtBR1gsSUFBVyxZQUFzQixDQUM3QixPQUFPLEtBQUssSUFBSSxXQUFXLEdBQUssYUFHcEMsSUFBVyxhQUF1QixDQUM5QixPQUFPLEtBQUssSUFBSSxXQUFXLEdBQUssY0FHcEMsSUFBVyxNQUFnQixDQUN2QixPQUFPLEtBQUssSUFBSSxXQUFXLEdBQUssT0FHcEMsSUFBc0MsRUFBaUIsQ0FDbkQsR0FBSSxDQUFDLEtBQUssSUFDTixNQUFNLElBQUksRUFBYyx3RkFBd0YsQ0FHcEgsT0FBTyxLQUFLLElBQUssS0FBUyxJQUFBLEdBRzlCLElBQXNDLEVBQVEsRUFBa0MsQ0FDNUUsR0FBSSxDQUFDLEtBQUssSUFDTixNQUFNLElBQUksRUFBYyx3RkFBd0YsQ0FHcEgsT0FBTyxLQUFLLElBQUssS0FBUyxJQUFBLEdBQTZCLEVBQWpCLEtBQUssSUFBSyxHQUdwRCxJQUFzQyxFQUFRLEVBQXFCLENBQy9ELEdBQUksQ0FBQyxLQUFLLElBQ04sTUFBTSxJQUFJLEVBQWMsd0ZBQXdGLENBR3BILEtBQUssSUFBSyxHQUFPLElDckRKLEdBQXJCLE1BQXFCLENBQWUsQ0FDaEMsT0FBYyxzQkFBd0IsaUJBRXRDLE1BQWUsR0FDZixJQUNBLE9BRUEsVUFBNkIsY0FDN0IsSUFBNkIsS0FFN0IsWUFBWSxFQUFnQyxDQUN4QyxLQUFLLElBQU0sRUFBUSxLQUFPLElBQUksR0FDOUIsS0FBSyxPQUFTLEVBQVEsUUFBVSxJQUFJLEVBQ3BDLEtBQUssTUFBUSxFQUFRLE9BQVMsR0FFMUIsRUFBUSxNQUNSLEtBQUssSUFBTUMsRUFBTyxXQUFXLEVBQVEsSUFBSyxPQUFRLEdBQUcsRUFJN0QsT0FBYyxPQUFPLEVBQWdDLENBQ2pELE9BQU8sSUFBSSxFQUFlLEVBQVEsQ0FHdEMsU0FBZ0IsRUFBZ0IsQ0FDNUIsS0FBSyxNQUFRLEVBRVQsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUkvQyxVQUFpQixFQUF1QixDQUNwQyxLQUFLLE9BQVMsRUFHbEIsT0FBYyxFQUFpQixDQUMzQixLQUFLLElBQU0sRUFHZixPQUFjLEVBQWEsQ0FDdkIsS0FBSyxJQUFNQSxFQUFPLFdBQVcsRUFBSyxPQUFRLEdBQUcsQ0FHakQsUUFBZSxFQUFjLENBQ3pCLEdBQUksQ0FBQyxLQUFLLElBQ04sTUFBVSxNQUFNLHlCQUF5QixDQUc3QyxJQUFNLEVBQUtBLEVBQU8sWUFBWSxHQUFHLENBQzNCLEVBQVNBLEVBQU8sZUFBZSxLQUFLLFVBQVcsS0FBSyxJQUFLLEVBQUcsQ0FFOUQsRUFBWSxFQUFPLE9BQU8sRUFBTSxPQUFRLE1BQU0sQ0FHbEQsTUFGQSxJQUFhLEVBQU8sTUFBTSxNQUFNLENBRXpCLEdBQUcsRUFBRyxTQUFTLE1BQU0sQ0FBQyxHQUFHLElBS3BDLFFBQWUsRUFBeUIsQ0FDcEMsR0FBSSxDQUFDLEtBQUssSUFDTixNQUFVLE1BQU0seUJBQXlCLENBRzdDLEdBQU0sQ0FBQyxFQUFJLEdBQWEsRUFBUSxNQUFNLElBQUksQ0FFcEMsRUFBVyxPQUFPLEtBQUssRUFBSSxNQUFNLENBRWpDLEVBQVdBLEVBQU8saUJBQWlCLEtBQUssVUFBVyxLQUFLLElBQUssRUFBUyxDQUV4RSxFQUFZLEVBQVMsT0FBTyxFQUFXLE1BQU8sT0FBTyxDQUd6RCxNQUZBLElBQWEsRUFBUyxNQUFNLE9BQU8sQ0FFNUIsRUFHWCxjQUFxQixFQUFrQixDQUNuQyxJQUFNLEVBQWEsS0FBSyxVQUFVLEVBQUksQ0FFdEMsT0FBTyxLQUFLLFFBQVEsRUFBVyxDQUduQyxjQUF3QixFQUE0QixDQUNoRCxJQUFNLEVBQWEsS0FBSyxRQUFRLEVBQWdCLENBRWhELE9BQU8sS0FBSyxNQUFNLEVBQVcsQ0FHakMsSUFBVyxFQUFjLEVBQThCLENBQ25ELElBQUksRUFBVyxHQUFTLFNBRXhCLEdBQUksR0FBUyxRQUFTLENBQ2xCLElBQU0sRUFBVSxFQUFHLEVBQVEsUUFBUSxDQUVuQyxFQUFXLEtBQUssS0FBSyxDQUFHLEVBRzVCLEFBQ0ksSUFBVyxLQUFLLEtBQUssQ0FBRyxFQUFHLGFBQWEsQ0FHeEMsYUFBb0IsT0FDcEIsRUFBVyxFQUFTLFNBQVMsRUFHakMsSUFBTSxFQUFVLENBQ1osS0FBTSxHQUFTLE1BQVEsRUFBRSxDQUN6QixXQUNBLGlCQUFrQixFQUFPLElBQUksS0FBSyxFQUFTLENBQUUsc0JBQXNCLENBQ3RFLENBRUssRUFBTSxLQUFLLFFBQVEsS0FBSyxVQUFVLEVBQVEsQ0FBQyxDQUUzQyxFQUFTLEtBQUssSUFBSSxJQUFJLGlCQUFpQixDQUU3QyxHQUFJLENBQUMsRUFDRCxNQUFNLElBQUksRUFBYywyQ0FBMkMsQ0FHdkUsSUFBTSxFQUFNLElBQUksSUFBSSxFQUFNLEVBQU8sQ0FJakMsT0FGQSxFQUFJLGFBQWEsT0FBTyxNQUFPLG1CQUFtQixFQUFJLENBQUMsQ0FFaEQsRUFBSSxVQUFVLENBR3pCLFVBQWlCLEVBQTJCLENBQ3hDLElBQU0sRUFBZ0IsS0FBSyxRQUFRLG1CQUFtQixFQUFhLENBQUMsQ0FFOUQsRUFBVSxLQUFLLE1BQU0sRUFBYyxDQUV6QyxHQUFJLEVBQVEsVUFBWSxLQUFLLEtBQUssQ0FBRyxFQUFRLFNBQVUsQ0FDbkQsSUFBTSxFQUFRLElBQUksRUFBYyxrQkFBbUIsSUFBSSxDQU92RCxNQUxBLE9BQU8sT0FBTyxFQUFPLENBQ2pCLFNBQVUsRUFBUSxTQUNsQixpQkFBa0IsRUFBUSxpQkFDN0IsQ0FBQyxDQUVJLEVBR1YsT0FBTyxFQUFRLE9DaEt2QixNQUFNLEVBQVUsRUFBVSxNQUFzQixHQUFlLENDVy9ELElBQXFCLEdBQXJCLGNBQXFDQyxFQUFVLENBQzNDLE9BQWlCLEVBQVUsT0FBUSxHQUFNLEVBQUUsT0FBTyxDQUM5QyxVQUFXLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQ2hELENBQUMsQ0FBQyxDQUVILFlBQVksRUFBaUUsQ0FDekUsTUFBTSxFQUFLLENBR2YsSUFBVyxPQUFpQixDQUN4QixPQUFPLEVBQVUsUUFBUSxLQUFLLE9BQVEsS0FBSyxPQUFPLENBR3RELFlBQTJCLENBQ3ZCLEdBQUksQ0FBQyxLQUFLLE1BQ04sTUFBTSxJQUFJLEVBQWMsR0FBRyw4QkFBOEIsQ0FBQyxDQUc5RCxHQUFJLENBQUMsRUFBRyxXQUFXLEtBQUssU0FBUyxDQUM3QixNQUFNLElBQUksRUFBYyxHQUFHLGlDQUFpQyxDQUFDLENBSXJFLElBQWMsVUFBbUIsQ0FDN0IsT0FBTyxFQUFTLEtBQUssT0FBTyxVQUFvQixDQUdwRCxPQUFxQyxLQUFPLEtBQ3hDLEtBQUssWUFBWSxDQUVWLEVBQUcsU0FBUyxPQUFPLEVBQUssS0FBSyxTQUFVLEVBQVMsQ0FBQyxDQUNuRCxTQUFXLEdBQUssQ0FDaEIsVUFBWSxHQUFNLEVBRzNCLEtBQWlDLEtBQU8sSUFBVyxDQUMvQyxLQUFLLFlBQVksQ0FFakIsSUFBTSxFQUFXLEVBQVMsRUFBSyxLQUFLLFNBQVUsRUFBTyxDQUFHLEtBQUssU0FFN0QsR0FBSSxDQUFFLE1BQU0sS0FBSyxPQUFPLEVBQVMsS0FBSyxTQUFVLEVBQVMsQ0FBQyxDQUN0RCxNQUFPLEVBQUUsQ0FHYixJQUFNLEVBQVEsTUFBTSxFQUFHLFNBQVMsUUFBUSxFQUFTLENBRTNDLEVBQXlCLEVBQUUsQ0FFakMsSUFBSyxJQUFNLEtBQVksRUFBTyxDQUMxQixJQUFNLEVBQVcsRUFBSyxFQUFVLEVBQVMsQ0FFbkMsRUFBUSxNQUFNLEVBQUcsU0FBUyxLQUFLLEVBQVMsQ0FFeEMsRUFBYSxFQUFFLENBRWpCLEVBQU0sUUFBUSxHQUNkLEVBQU0sS0FBTyxFQUFNLEtBQ25CLEVBQU0sU0FBVyxHQUFLLFFBQVEsRUFBUyxFQUFJLDRCQUcvQyxJQUFNLEVBQVEsSUFBSUMsR0FBWSxDQUMxQixLQUFNLEVBQ04sS0FBTSxJQUFNLEVBQVMsS0FBSyxTQUFVLEVBQVMsQ0FDN0MsS0FBTSxFQUFNLGFBQWEsQ0FBRyxZQUFjLE9BQzFDLFFBQ0gsQ0FBQyxDQUVGLEVBQVEsS0FBSyxFQUFNLENBR3ZCLE9BQU8sR0FHWCxLQUFpQyxLQUFPLElBQWEsQ0FDakQsS0FBSyxZQUFZLENBRWpCLElBQU0sRUFBVyxFQUFTLFdBQVcsSUFBSSxDQUFHLEVBQVcsSUFBTSxFQUl2RCxHQUZVLE1BQU0sS0FBSyxLQUFLLEVBQUssUUFBUSxFQUFTLENBQUMsRUFFakMsS0FBSyxHQUFLLEVBQUUsT0FBUyxFQUFTLENBRXBELEdBQUksQ0FBQyxFQUNELE1BQVUsTUFBTSxTQUFTLEVBQVMsYUFBYSxDQUduRCxPQUFPLEdBR1gsTUFBYSxNQUFNLEVBQWlDLENBQ2hELEtBQUssWUFBWSxDQUVYLE1BQU0sS0FBSyxPQUFPLEVBQUssUUFBUSxFQUFTLENBQUMsRUFDM0MsTUFBTSxLQUFLLE1BQU0sRUFBSyxRQUFRLEVBQVMsQ0FBQyxDQUc1QyxJQUFNLEVBQVcsRUFBSyxLQUFLLFNBQVUsRUFBUyxDQUU5QyxNQUFNLEVBQUcsU0FBUyxNQUFNLEVBQVUsQ0FBRSxVQUFXLEdBQU0sQ0FBQyxDQUcxRCxLQUFpQyxLQUFPLElBQWEsQ0FDakQsS0FBSyxZQUFZLENBRWpCLElBQU0sRUFBVyxFQUFLLEtBQUssU0FBVSxFQUFTLENBRXhDLEVBQVMsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFTLENBRW5ELE9BQU8sSUFBSSxXQUFXLEVBQU8sRUFHakMsTUFBYSxXQUFXLEVBQWtCLENBQ3RDLEtBQUssWUFBWSxDQUVqQixJQUFNLEVBQVcsRUFBSyxLQUFLLFNBQVUsRUFBUyxDQUV4QyxFQUFTLEVBQUcsaUJBQWlCLEVBQVMsQ0FFNUMsT0FBTyxRQUFRLFFBQVEsRUFBTyxDQUdsQyxNQUFtQyxNQUFPLEVBQVUsSUFBUyxDQUN6RCxLQUFLLFlBQVksQ0FFWixNQUFNLEtBQUssT0FBTyxFQUFLLFFBQVEsRUFBUyxDQUFDLEVBQzFDLE1BQU0sS0FBSyxNQUFNLEVBQUssUUFBUSxFQUFTLENBQUMsQ0FHNUMsSUFBTSxFQUFXLEVBQUssS0FBSyxTQUFVLEVBQVMsQ0FFOUMsTUFBTSxFQUFHLFNBQVMsVUFBVSxFQUFVLEVBQUssRUFHL0MsTUFBYSxZQUFZLEVBQWtCLEVBQThDLENBQ3JGLEtBQUssWUFBWSxDQUVaLE1BQU0sS0FBSyxPQUFPLEVBQUssUUFBUSxFQUFTLENBQUMsRUFDMUMsTUFBTSxLQUFLLE1BQU0sRUFBSyxRQUFRLEVBQVMsQ0FBQyxDQUc1QyxJQUFNLEVBQVcsRUFBSyxLQUFLLFNBQVUsRUFBUyxDQUU5QyxPQUFPLElBQUksU0FBUyxFQUFTLElBQVcsQ0FDcEMsSUFBTSxFQUFjLEVBQUcsa0JBQWtCLEVBQVMsQ0FFbEQsRUFBTyxLQUFLLEVBQVksQ0FFeEIsRUFBWSxHQUFHLFNBQVUsRUFBUSxDQUNqQyxFQUFZLEdBQUcsUUFBUyxFQUFPLEVBQ2pDLENBR04sT0FBcUMsS0FBTyxJQUFhLENBQ3JELEtBQUssWUFBWSxDQUVqQixJQUFNLEVBQVcsRUFBSyxLQUFLLFNBQVUsRUFBUyxDQU05QyxHQUpvQixNQUFNLEVBQUcsU0FBUyxLQUFLLEVBQVMsQ0FDL0MsS0FBSyxHQUFRLEVBQUssYUFBYSxDQUFDLENBQ2hDLFVBQVksR0FBTSxDQUVOLENBQ2IsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFVLENBQUUsVUFBVyxHQUFNLENBQUMsQ0FDdEQsT0FHSixNQUFNLEVBQUcsU0FBUyxPQUFPLEVBQVMsRUFHdEMsSUFBK0IsTUFBTyxFQUFVLElBQVksQ0FDeEQsS0FBSyxZQUFZLENBRWpCLElBQU0sRUFBVyxFQUFTLFdBQVcsSUFBSSxDQUFHLEVBQVcsSUFBSSxJQUUzRCxPQUFPLEVBQVEsSUFBSSxlQUFlLEtBQUssR0FBRyxTQUFTLElBQVksQ0FDM0QsUUFBUyxHQUFTLFNBQVcsTUFDaEMsQ0FBQyxFQUdOLFVBQTJDLE1BQU8sRUFBVSxJQUFZLENBQ3BFLEtBQUssWUFBWSxDQUVqQixJQUFNLEVBQVcsRUFBUyxXQUFXLElBQUksQ0FBRyxFQUFXLElBQUksSUFFM0QsT0FBTyxFQUFRLElBQUksZUFBZSxLQUFLLEdBQUcsU0FBUyxJQUFZLENBQzNELFFBQVMsR0FBUyxTQUFXLE1BQzdCLEtBQU0sQ0FDRixXQUFZLEdBQVMsV0FDckIsU0FBVSxHQUFTLFNBQ3RCLENBQ0osQ0FBQyxHQzFMVyxHQUFyQixNQUFxQixDQUFhLENBQzlCLE9BQWMsc0JBQXdCLGVBR3RDLFNBQ0EsT0FBd0MsSUFBSSxJQUM1QyxTQUNBLGFBQ0EsTUFBZSxHQUNmLE9BRUEsSUFBVyxTQUFVLENBQ2pCLEdBQUksQ0FBQyxLQUFLLFNBQVUsT0FFcEIsSUFBTSxFQUFRLEtBQUssT0FBTyxJQUFJLEtBQUssU0FBUyxDQUV2QyxLQUVMLE9BQU8sRUFHWCxZQUFZLEVBQThCLEVBQUUsQ0FBRSxDQUMxQyxLQUFLLFNBQVcsRUFBSyxVQUFZLEtBQUssU0FDdEMsS0FBSyxNQUFRLEVBQUssT0FBUyxLQUFLLE1BQ2hDLEtBQUssT0FBUyxFQUFLLFFBQVUsS0FBSyxPQUNsQyxLQUFLLE9BQVMsRUFBSyxRQUFVLEVBQU8sTUFBTSxDQUFFLE1BQU8sUUFBUyxDQUFDLENBQzdELEtBQUssU0FBVyxJQUFJLElBRXBCLEtBQUssU0FBUyxJQUFJLEtBQU0sR0FBUSxDQUNoQyxLQUFLLFNBQVMsSUFBSSxLQUFNLEdBQVEsQ0FHcEMsWUFBb0IsQ0FDaEIsT0FBTyxNQUFNLEtBQUssS0FBSyxPQUFPLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBVSxDQUNsRCxHQUFHLEVBQ0gsUUFBUyxFQUFNLEtBQU8sS0FBSyxhQUM5QixFQUFFLENBR1AsSUFBVyxFQUFlLENBQ3RCLEdBQUksQ0FBQyxHQUFRLENBQUMsS0FBSyxPQUFPLElBQUksR0FBUSxHQUFHLENBQ3JDLE1BQU0sSUFBSSxFQUFjLGtCQUFrQixDQUc5QyxJQUFNLEVBQVEsS0FBSyxPQUFPLElBQUksRUFBSyxDQUVuQyxHQUFJLENBQUMsRUFDRCxNQUFNLElBQUksRUFBYyxrQkFBa0IsQ0FHOUMsT0FBTyxFQUdYLElBQVcsRUFBZSxDQUN0QixHQUFJLENBQUMsS0FBSyxPQUFPLElBQUksR0FBUSxHQUFHLENBQzVCLE1BQU0sSUFBSSxFQUFjLGtCQUFrQixDQUc5QyxPQUFPLElBQUksRUFBYSxDQUNwQixTQUFVLEVBQ1YsT0FBUSxLQUFLLE9BQ2IsTUFBTyxLQUFLLE1BQ2YsQ0FBQyxDQUlOLEtBQVksRUFBd0MsQ0FDaEQsR0FBSSxDQUFDLEtBQUssUUFBUyxNQUFNLElBQUksRUFBYyxvQkFBb0IsQ0FFL0QsT0FBTyxLQUFLLFFBQVEsS0FBSyxFQUFPLENBR3BDLEtBQVksRUFBdUMsQ0FDL0MsR0FBSSxDQUFDLEtBQUssUUFBUyxNQUFNLElBQUksRUFBYyxvQkFBb0IsQ0FFL0QsT0FBTyxLQUFLLFFBQVEsS0FBSyxFQUFTLENBR3RDLE9BQWMsRUFBb0MsQ0FDOUMsR0FBSSxDQUFDLEtBQUssUUFBUyxNQUFNLElBQUksRUFBYyxvQkFBb0IsQ0FFL0QsT0FBTyxLQUFLLFFBQVEsT0FBTyxFQUFTLENBR3hDLEtBQVksRUFBdUMsQ0FDL0MsR0FBSSxDQUFDLEtBQUssUUFBUyxNQUFNLElBQUksRUFBYyxvQkFBb0IsQ0FFL0QsT0FBTyxLQUFLLFFBQVEsS0FBSyxFQUFTLENBR3RDLFdBQWtCLEVBQWtCLENBQ2hDLEdBQUksQ0FBQyxLQUFLLFFBQVMsTUFBTSxJQUFJLEVBQWMsb0JBQW9CLENBRS9ELE9BQU8sS0FBSyxRQUFRLFdBQVcsRUFBUyxDQUc1QyxNQUFhLFdBQVcsRUFBbUMsQ0FDdkQsSUFBTSxFQUFPLE1BQU0sS0FBSyxLQUFLLEVBQVMsQ0FFdEMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUssQ0FHekMsTUFBYSxFQUFrQixFQUF3RSxDQUNuRyxHQUFJLENBQUMsS0FBSyxRQUFTLE1BQU0sSUFBSSxFQUFjLG9CQUFvQixDQUUvRCxJQUFJLEVBQVksRUFVaEIsT0FSSSxPQUFPLEdBQVksVUFBWSxFQUFFLGFBQW1CLGNBQ3BELEVBQU8sS0FBSyxVQUFVLEVBQVMsS0FBTSxFQUFFLEVBR3ZDLE9BQU8sR0FBUyxXQUNoQixFQUFPLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBSyxFQUdsQyxLQUFLLFFBQVEsTUFBTSxFQUFVLEVBQUssQ0FHN0MsWUFBbUIsRUFBa0IsRUFBOEMsQ0FDL0UsR0FBSSxDQUFDLEtBQUssUUFBUyxNQUFNLElBQUksRUFBYyxvQkFBb0IsQ0FFL0QsT0FBTyxLQUFLLFFBQVEsWUFBWSxFQUFVLEVBQU8sQ0FTckQsTUFBYSxJQUFJLEVBQWtCLEVBQTJCLEVBQUUsQ0FBbUIsQ0FDL0UsR0FBSSxDQUFDLEtBQUssUUFBUyxNQUFNLElBQUksRUFBYyxvQkFBb0IsQ0FFL0QsT0FBTyxLQUFLLFFBQVEsSUFBSSxFQUFVLEVBQVEsQ0FHOUMsTUFBYSxVQUFVLEVBQWtCLEVBQTJCLEVBQUUsQ0FBbUIsQ0FDckYsR0FBSSxDQUFDLEtBQUssUUFBUyxNQUFNLElBQUksRUFBYyxvQkFBb0IsQ0FFL0QsT0FBTyxLQUFLLFFBQVEsVUFBVSxFQUFVLEVBQVEsQ0FTcEQsTUFBYSxPQUFPLEVBQWdCLEVBQW9DLENBQ3BFLElBQU0sRUFBUyxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQU8sQ0FFM0MsRUFBUSxJQUFJLFdBQVcsRUFBTyxDQUVwQyxPQUFPLEtBQUssTUFBTSxFQUFhLEVBQU0sQ0FTekMsTUFBYSxTQUFTLEVBQWtCLEVBQW9DLENBQ3hFLElBQU0sRUFBTyxNQUFNLEtBQUssS0FBSyxFQUFTLENBRXRDLE1BQU0sRUFBRyxTQUFTLFVBQVUsRUFBYSxFQUFLLENBR2xELE9BQWMsRUFBaUMsQ0FDM0MsR0FBSSxDQUFDLEtBQUssUUFBUyxNQUFNLElBQUksRUFBYyxvQkFBb0IsQ0FFL0QsT0FBTyxLQUFLLFFBQVEsT0FBTyxFQUFTLENBR3hDLE1BQWEsTUFBTSxDQUNmLEtBQUssT0FBTyxPQUFPLENBRW5CLElBQU0sRUFBVSxNQUFNLEVBQVksTUFBTSxDQUV4QyxJQUFLLElBQU0sS0FBSyxFQUFTLENBQ3JCLElBQU0sRUFBZSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssQ0FFOUMsR0FBSSxDQUFDLEVBQWMsQ0FDZixLQUFLLE9BQU8sS0FBSywyQkFBMkIsRUFBRSxLQUFLLGFBQWEsQ0FDaEUsU0FHSixJQUFNLEVBQVUsSUFBSSxFQUFhLEVBQUUsQ0FFbkMsS0FBSyxPQUFPLElBQUksRUFBRSxHQUFJLEVBQVEsQ0FFMUIsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUk3RCxLQUFLLFNBQVcsRUFBTyxJQUFJLGdCQUFnQixDQUMzQyxLQUFLLGFBQWUsRUFBTyxJQUFJLGdCQUFnQixDQUduRCxNQUFhLHFCQUFxQixDQUU5QixNQUFNLEVBQVksZUFBZSxrQkFBbUIsQ0FDaEQsS0FBTSxVQUNOLEtBQU0sS0FDTixPQUFRLENBQUUsVUFBVyxHQUFZLFVBQVUsQ0FBRSxDQUNoRCxDQUFDLENBRUcsRUFBTyxJQUFJLGdCQUFnQixFQUM1QixFQUFPLElBQUksZ0JBQWlCLGtCQUFrQixDQUdsRCxNQUFNLEtBQUssTUFBTSxDQUdyQixlQUFzQixFQUFnQyxFQUEyQyxDQWE3RixHQUFJLENBWmlCLEVBQVEsV0FBVyxNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUssRUFBRSxNQUFNLENBQUMsQ0FFdEMsS0FBSyxHQUFlLENBQy9DLEdBQUksQ0FBQyxFQUFZLFNBQVMsS0FBSyxDQUMzQixPQUFPLElBQWdCLEVBQUssU0FHaEMsSUFBTSxFQUFXLEVBQVksTUFBTSxFQUFHLEdBQUcsQ0FFekMsT0FBTyxFQUFLLFNBQVMsV0FBVyxFQUFXLElBQUksRUFDakQsQ0FHRSxNQUFNLElBQUksRUFBYyx3QkFBeUIsSUFBSSxDQUd6RCxHQUFJLEVBQVEsU0FBVyxFQUFLLEtBQU8sRUFBUSxRQUN2QyxNQUFNLElBQUksRUFBYyx3Q0FBeUMsSUFBSSxHQ3hQNUQsR0FBckIsY0FBNkNDLENBQW1DLEdDWW5FLEdBQWIsS0FBaUMsQ0FDN0IsWUFBWSxFQUFzQyxDQUFyQixLQUFBLFFBQUEsRUFFN0IsTUFBTSxNQUE2QixDQUsvQixPQUplLE1BQU0sS0FBSyxRQUFRLElBQzlCLGtGQUNILEVBR0ksTUFBTTtFQUFLLENBQ1gsT0FBTyxRQUFRLENBQ2YsT0FBTyxHQUFRLEVBQUssU0FBUyxJQUFJLENBQUMsQ0FDbEMsSUFBSyxHQUFTLENBQ1gsR0FBTSxDQUFDLEVBQU0sRUFBVSxFQUFTLEdBQWMsRUFBSyxNQUFNLElBQUksQ0FFdkQsRUFBVyxFQUFRLFdBQVcsZ0JBQWdCLENBQzlDLEVBQU8sRUFFYixNQUFPLENBQ0gsT0FDQSxPQUFRLEVBQVcsRUFBSyxNQUFNLElBQUksQ0FBQyxHQUFNLEdBQWMsS0FDdkQsVUFBVyxJQUFTLElBQ3BCLFdBQ0gsRUFDSCxDQUdWLE1BQU0sTUFBTSxFQUErQyxDQUN2RCxHQUFNLENBQUUsU0FBUSxTQUFRLGFBQWMsRUFDaEMsRUFBUSxHQUFhLEVBRTNCLE1BQU0sS0FBSyxRQUFRLElBQUksU0FBUyxFQUFPLEdBQUcsRUFBTyxHQUFHLElBQVEsR0NicEUsTUFBTSxHQUFhLENBQUMsS0FBTSxLQUFNLE1BQU8sTUFBTyxNQUFPLEtBQU0sS0FBSyxDQUFDLEtBQUssT0FBTyxDQUU3RSxTQUFTLEdBQWlCLEVBQWtDLENBQ3hELEdBQUksQ0FBQyxFQUFTLE1BQU0sQ0FBRSxNQUFPLEVBQUUsQ0FFL0IsSUFBTSxFQUF1QixFQUFFLENBRS9CLElBQUssSUFBTSxLQUFRLEVBQVMsTUFBTSxLQUFLLENBQUUsQ0FDckMsSUFBTSxFQUFVLEVBQUssTUFBTSxDQUN0QixLQUVMLEdBQUksRUFBUSxXQUFXLFdBQVcsQ0FBRSxDQUNoQyxJQUFNLEVBQVksRUFBUSxNQUFNLEVBQUUsQ0FDbEMsRUFBSyxLQUFLLENBQUUsS0FBTSxPQUFRLFVBQVcsT0FBUSxLQUFNLFFBQVMsQ0FBQyxDQUM3RCxFQUFLLEtBQUssQ0FBRSxLQUFNLGNBQWMsSUFBYSxZQUFXLEtBQU0sU0FBVSxDQUFDLFNBQ2xFLEVBQVEsV0FBVyxRQUFRLENBQUUsQ0FDcEMsSUFBTSxFQUFZLEVBQVEsTUFBTSxFQUFFLENBQ2xDLEVBQUssS0FBSyxDQUFFLEtBQU0sYUFBYSxJQUFhLFlBQVcsS0FBTSxNQUFPLENBQUMsTUFDOUQsSUFBWSxPQUNuQixFQUFLLEtBQUssQ0FBRSxLQUFNLE9BQVEsVUFBVyxPQUFRLEtBQU0sUUFBUyxDQUFDLENBQ3RELEVBQVEsU0FBUyxJQUFJLENBQzVCLEVBQUssS0FBSyxDQUFFLEtBQU0sZ0JBQWdCLElBQVcsVUFBVyxFQUFTLEtBQU0sU0FBVSxDQUFDLENBRWxGLEVBQUssS0FBSyxDQUFFLEtBQU0sY0FBYyxJQUFXLFVBQVcsRUFBUyxLQUFNLFNBQVUsQ0FBQyxDQUl4RixPQUFPLEVBR1gsSUFBYSxHQUFiLEtBQWlDLENBQzdCLFlBQVksRUFBc0MsQ0FBckIsS0FBQSxRQUFBLEVBRTdCLE1BQU0sS0FBSyxFQUEyRCxDQUNsRSxJQUFNLEVBQU8sR0FBUyxNQUFRLEVBQ3hCLEVBQVUsR0FBUyxTQUFXLEdBQzlCLEVBQU0sR0FBUyxRQUFVLE9BSXpCLEdBRlMsTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLEVBQUksYUFBYSxHQUFXLEdBQUcsRUFHdkUsTUFBTTtFQUFLLENBQ1gsT0FBTyxRQUFRLENBQ2YsSUFBSyxHQUFTLENBQ1gsR0FBTSxDQUFDLEVBQU0sRUFBVyxFQUFZLEVBQWEsRUFBTSxFQUFTLEVBQVcsSUFBTSxFQUFLLE1BQU0sSUFBSyxDQUNqRyxNQUFPLENBQ0gsT0FDQSxZQUNBLGFBQ0EsY0FDQSxPQUNBLFVBQ0EsS0FBTSxHQUFpQixFQUFTLENBQ25DLEVBQ0gsQ0FFQSxFQUFRLEVBQUksT0FDWixFQUFhLEtBQUssS0FBSyxFQUFRLEVBQVEsQ0FDdkMsR0FBUyxFQUFPLEdBQUssRUFHM0IsTUFBTyxDQUFFLE1BRkssRUFBSSxNQUFNLEVBQU8sRUFBUSxFQUFRLENBRS9CLFFBQU8sT0FBTSxVQUFTLGFBQVksR0MxRnJDLEdBQXJCLGNBQThDQyxFQUFxQixDQUMvRCxNQUFhLGFBQWEsRUFBaUIsQ0FDdkMsSUFBTSxFQUFPLE1BQU0sR0FBVSxFQUFRLENBQy9CLEVBQXlCLEVBQUUsQ0FFakMsSUFBSyxHQUFNLENBQUMsRUFBTSxLQUFRLE9BQU8sUUFBUSxFQUFLLENBQUUsQ0FFNUMsSUFBTSxFQUFXLElBREMsRUFBSSxTQUFXLEdBR2pDLEVBQVMsUUFBVSxFQUFTLFNBQVcsRUFFdkMsRUFBTSxLQUFLLEVBQVMsQ0FHeEIsRUFBTSxRQUFRLEdBQVEsS0FBSyxJQUFJLEVBQUssQ0FBQyxHQ1F4QixHQUFyQixLQUFvRSxDQUNoRSxRQUNBLE1BQ0EsV0FDQSxVQUFvQixLQUVwQixZQUFZLEVBQStCLEVBQVUsRUFBK0IsRUFBb0IsQ0FDcEcsS0FBSyxRQUFVLEVBQ2YsS0FBSyxNQUFRLEVBQ2IsS0FBSyxXQUFhLEVBRWQsSUFDQSxLQUFLLFVBQVksR0FJekIsSUFBVyxhQUFhLENBQ3BCLElBQUssSUFBTSxLQUFhLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FLL0MsR0FKSSxPQUFPLEdBQWMsVUFLckIsRUFBVSxLQUFPLElBQUEsSUFDZCxFQUFVLE1BQVEsSUFBQSxJQUNsQixFQUFVLE9BQVMsSUFBQSxJQUNuQixFQUFVLFFBQVUsSUFBQSxJQUNwQixFQUFVLEtBQU8sSUFBQSxJQUNqQixFQUFVLE1BQVEsSUFBQSxJQUNsQixFQUFVLEtBQU8sSUFBQSxJQUNqQixFQUFVLE1BQVEsSUFBQSxJQUNsQixFQUFVLEtBQU8sSUFBQSxJQUNqQixFQUFVLE1BQVEsSUFBQSxJQUNsQixFQUFVLFVBQVksSUFBQSxJQUN0QixFQUFVLFNBQVcsR0FFeEIsTUFBTyxHQUlmLE1BQU8sR0FHWCxJQUFXLGdCQUFnQixDQUN2QixJQUFLLElBQU0sS0FBYSxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQzNDLFVBQU8sR0FBYyxVQUVyQixFQUFVLFNBQVcsR0FDckIsTUFBTyxHQUlmLE1BQU8sR0FHWCxNQUFhLEVBQWMsQ0FDdkIsSUFBSSxFQUFRLEVBb0JaLE9BbEJJLEtBQUssY0FDTCxFQUFRLEVBQ0gsTUFBTSxLQUFLLFVBQVcsS0FBTyxHQUMxQixFQUFHLFdBQVcsS0FBSyxNQUFNLENBQ3BCLE9BQU8sS0FBSyxXQUFXLENBQ3ZCLE1BQU0sS0FBSyxRQUFRLEVBQUcsQ0FBQyxDQUMvQixFQUdMLEtBQUssaUJBQ0wsRUFBUSxFQUNILE1BQU0sS0FBSyxVQUFXLFNBQVcsR0FDOUIsRUFBRyxXQUFXLEtBQUssTUFBTSxDQUNwQixPQUFPLEtBQUssV0FBVyxDQUN2QixNQUFNLEtBQUssV0FBVyxFQUFHLENBQUMsQ0FDbEMsRUFHRixFQUdYLG1CQUEyQixFQUFpQyxFQUFjLEVBQWtDLENBQ3hHLEdBQUksT0FBTyxHQUFjLFNBQ3JCLE1BQU8sQ0FDSCxFQUFHLEdBQUcsT0FBUSxJQUFLLEVBQUssQ0FDeEIsRUFBRyxHQUFHLFFBQVMsSUFBSyxFQUFVLENBQ2pDLENBR0wsSUFBTSxFQUFVLENBQ1osRUFBRyxHQUFHLE9BQVEsSUFBSyxFQUFLLENBQzNCLENBOENELE9BNUNJLEVBQVUsS0FBTyxJQUFBLElBQ2pCLEVBQVEsS0FBSyxFQUFHLEdBQUcsUUFBUyxJQUFLLEVBQVUsR0FBRyxDQUFDLENBRy9DLEVBQVUsTUFBUSxJQUFBLElBQ2xCLEVBQVEsS0FBSyxFQUFHLEdBQUcsUUFBUyxLQUFNLEVBQVUsSUFBSSxDQUFDLENBR2pELEVBQVUsT0FBUyxJQUFBLElBQ25CLEVBQVEsS0FBSyxFQUFHLEdBQUcsUUFBUyxPQUFRLEVBQVUsS0FBSyxDQUFDLENBR3BELEVBQVUsUUFBVSxJQUFBLElBQ3BCLEVBQVEsS0FBSyxFQUFHLEdBQUcsUUFBUyxXQUFZLEVBQVUsTUFBTSxDQUFDLENBR3pELEVBQVUsSUFDVixFQUFRLEtBQUssRUFBRyxHQUFHLFFBQVMsS0FBTSxFQUFVLEdBQUcsQ0FBQyxDQUdoRCxFQUFVLEtBQ1YsRUFBUSxLQUFLLEVBQUcsR0FBRyxRQUFTLFNBQVUsRUFBVSxJQUFJLENBQUMsQ0FHckQsRUFBVSxLQUFPLElBQUEsSUFDakIsRUFBUSxLQUFLLEVBQUcsR0FBRyxRQUFTLElBQUssRUFBVSxHQUFHLENBQUMsQ0FHL0MsRUFBVSxNQUFRLElBQUEsSUFDbEIsRUFBUSxLQUFLLEVBQUcsR0FBRyxRQUFTLEtBQU0sRUFBVSxJQUFJLENBQUMsQ0FHakQsRUFBVSxLQUFPLElBQUEsSUFDakIsRUFBUSxLQUFLLEVBQUcsR0FBRyxRQUFTLElBQUssRUFBVSxHQUFHLENBQUMsQ0FHL0MsRUFBVSxNQUFRLElBQUEsSUFDbEIsRUFBUSxLQUFLLEVBQUcsR0FBRyxRQUFTLEtBQU0sRUFBVSxJQUFJLENBQUMsQ0FHakQsRUFBVSxVQUFZLElBQUEsSUFDdEIsRUFBUSxLQUFLLEVBQUcsR0FBRyxRQUFTLEVBQVUsUUFBVSxLQUFPLFNBQVUsS0FBSyxDQUFDLENBR3BFLEVBR1gsUUFBMkIsR0FBcUMsQ0FDNUQsSUFBSSxFQUFRLEVBRVosSUFBSyxHQUFNLENBQUMsRUFBTSxLQUFjLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FDcEQsT0FBTyxHQUFjLFVBQVksRUFBVSxTQUFXLEtBSTFELEVBQVEsRUFBTSxJQUFJLEtBQUssbUJBQW1CLEVBQUksRUFBTSxFQUFVLENBQUMsRUFHbkUsT0FBTyxHQUdYLFdBQThCLEdBQXFDLENBQy9ELElBQUksRUFBUSxFQUVaLElBQUssR0FBTSxDQUFDLEVBQU0sS0FBYyxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQ3BELE9BQU8sR0FBYyxVQUVyQixFQUFVLFNBQVcsS0FDckIsRUFBUSxFQUFNLE9BQVEsSUFBSyxFQUFLLEVBSXhDLE9BQU8sSUN6TGYsTUFBYSxHQUFNLFdBRWIsRUFBVyxFQUFVLE1BQWdDLEdBQUksQ0NKL0QsSUFBcUIsR0FBckIsTUFBcUIsQ0FBZ0IsQ0FDakMsR0FDQSxNQUNBLFdBRUEsWUFBWSxFQUErRCxDQUN2RSxLQUFLLEdBQUssRUFBUSxHQUNsQixLQUFLLE1BQVEsRUFBUSxNQUNyQixLQUFLLFdBQWEsRUFBUSxXQUc5QixPQUFjLE1BQU0sRUFBaUIsQ0FpQmpDLE9BaEJJLE9BQU8sR0FBVSxVQUFZLEVBQU0sV0FBVyxRQUFRLENBQy9DLEtBQUssTUFBTSxFQUFNLE1BQU0sRUFBRSxDQUFDLENBR2pDLE9BQU8sR0FBVSxVQUFZLEVBQU0sV0FBVyxRQUFRLENBQy9DLEVBQU0sTUFBTSxFQUFFLEdBQUssT0FHMUIsT0FBTyxHQUFVLFVBQVksRUFBTSxXQUFXLFVBQVUsQ0FDakQsT0FBTyxFQUFNLE1BQU0sRUFBRSxDQUFDLENBRzdCLE9BQU8sR0FBVSxVQUFZLEVBQU0sV0FBVyxVQUFVLENBQ2pELEVBQU0sTUFBTSxFQUFFLENBR2xCLEVBR1gsT0FBYyxRQUFRLEVBQWlFLENBQ25GLElBQU0sRUFBOEIsRUFBRSxDQUV0QyxJQUFLLElBQU0sS0FBUSxFQUNmLEVBQU8sRUFBSyxNQUFRLEVBQWdCLE1BQU0sRUFBSyxNQUFNLENBR3pELE9BQU8sRUFNWCxNQUFhLElBQWEsRUFBYyxFQUEwQyxDQUM5RSxJQUFJLEVBQVFDLEVBQUcsV0FBVyxLQUFLLE1BQWEsQ0FFNUMsRUFBUSxFQUNILFdBQVcsQ0FDWCxNQUFPLEtBQUssV0FBdUIsSUFBSyxLQUFLLEdBQUcsQ0FDaEQsTUFBTSxPQUFRLElBQUssRUFBSyxDQUN4QixNQUFNLEVBQUUsQ0FFYixJQUFNLEVBQU0sTUFBTSxFQUFNLGtCQUFrQixDQVExQyxNQU5JLENBQUMsR0FBTyxDQUFDLEVBQUksTUFDTixFQUdHLEVBQWdCLE1BQU0sRUFBSSxNQUFNLENBS2xELE1BQWEsSUFBSSxFQUFjLEVBQTJCLENBQ3RELElBQU0sRUFBYSxLQUFLLFdBQ2xCLEVBQVEsS0FBSyxNQUViLEVBQVMsRUFDVixHQUFhLEtBQUssR0FDbkIsT0FDQSxRQUNILENBUUQsR0FOSSxPQUFPLEdBQVUsV0FDakIsRUFBTyxNQUFRLFFBQVEsS0FBSyxVQUFVLEVBQU0sSUFHcEMsTUFBTUEsRUFBRyxXQUFXLEVBQWEsQ0FBQyxNQUFPLEVBQXVCLElBQUssS0FBSyxHQUFHLENBQUMsTUFBTSxPQUFRLElBQUssRUFBSyxDQUFDLGtCQUFrQixDQUU1SCxDQUNMLE1BQU1BLEVBQUcsWUFBWSxFQUFhLENBQzdCLElBQUksRUFBTyxDQUNYLE1BQU8sRUFBdUIsSUFBSyxLQUFLLEdBQUcsQ0FDM0MsTUFBTSxPQUFRLElBQUssRUFBSyxDQUN4QixTQUFTLENBRWQsT0FHSixNQUFNQSxFQUFHLFdBQVcsRUFBYSxDQUM1QixPQUFPLEVBQU8sQ0FDZCxTQUFTLENBSWxCLE1BQWEsTUFBcUQsQ0FDOUQsSUFBTSxFQUFhLEtBQUssV0FDbEIsRUFBUSxLQUFLLE1BRWYsRUFBUUEsRUFBRyxXQUFXLEVBQWEsQ0FRdkMsTUFOQSxHQUFRLEVBQ0gsV0FBVyxDQUNYLE1BQU8sRUFBdUIsSUFBSyxLQUFLLEdBQUcsRUFFbkMsTUFBTSxFQUFNLFNBQVMsRUFFdEIsSUFBSyxJQUFjLENBQzNCLEtBQU0sRUFBSSxLQUNWLE1BQU8sRUFBZ0IsTUFBTSxFQUFJLE1BQU0sQ0FDMUMsRUFBRSxDQUdQLE1BQWEsS0FBb0MsQ0FDN0MsSUFBTSxFQUFPLE1BQU0sS0FBSyxNQUFNLENBQ3hCLEVBQThCLEVBQUUsQ0FFdEMsSUFBSyxJQUFNLEtBQU8sRUFDZCxFQUFPLEVBQUksTUFBUSxFQUFJLE1BRzNCLE9BQU8sSUNsSE0sR0FBckIsS0FBcUMsQ0FDakMsS0FDQSxPQUNBLFNBQ0EsV0FFQSxZQUFZLEVBQTBCLENBQ2xDLEtBQUssS0FBTyxFQUFLLEtBQ2pCLEtBQUssT0FBUyxFQUFLLE9BQ25CLEtBQUssU0FBVyxFQUFLLFNBQ3JCLEtBQUssV0FBYSxFQUFLLFdBRzNCLE1BQWEsR0FBRyxFQUFnQyxDQUM1QyxJQUFNLEVBQU0sTUFBTSxPQUFPLEtBQUssVUFFOUIsR0FBSSxPQUFPLEVBQUksSUFBTyxXQUNsQixNQUFNLElBQUksRUFBYyxhQUFhLEtBQUssS0FBSyxpQ0FBaUMsQ0FHcEYsTUFBTSxFQUFJLEdBQUcsRUFBRyxDQUdwQixNQUFhLEtBQUssRUFBZ0MsQ0FDOUMsSUFBTSxFQUFNLE1BQU0sT0FBTyxLQUFLLFVBRTlCLEdBQUksT0FBTyxFQUFJLE1BQVMsV0FDcEIsTUFBTSxJQUFJLEVBQWMsYUFBYSxLQUFLLEtBQUssa0NBQWtDLENBR3JGLE1BQU0sRUFBSSxLQUFLLEVBQUcsR0NFTCxHQUFyQixLQUFxQyxDQUNqQyxPQUFjLHNCQUF3QixrQkFFdEMsTUFBZSxHQUNmLFNBQ0EsT0FDQSxHQUNBLFFBRUEsWUFBWSxFQUFpQyxDQUN6QyxLQUFLLE1BQVEsRUFBUSxPQUFTLEtBQUssTUFDbkMsS0FBSyxTQUFXLEVBQVEsVUFBWSxJQUFJQyxFQUN4QyxLQUFLLE9BQVMsRUFBUSxRQUFVLElBQUksRUFDcEMsS0FBSyxHQUFLLEVBQVEsR0FDbEIsS0FBSyxRQUFVLEVBQVEsUUFHM0IsVUFBaUIsRUFBeUIsQ0FDdEMsS0FBSyxRQUFRLEtBQUssRUFBTyxDQUc3QixNQUFjLHVCQUF3QixDQUNsQyxNQUFNLEtBQUssR0FBRyxPQUNULFlBQVksYUFBYSxDQUN6QixhQUFhLENBQ2IsVUFBVSxPQUFRLGVBQWlCLEdBQVEsRUFBSSxZQUFZLENBQUMsQ0FDNUQsVUFBVSxTQUFVLGVBQWUsQ0FDbkMsVUFBVSxjQUFlLFlBQWMsR0FBUSxFQUFJLFNBQVMsQ0FBQyxDQUM3RCxTQUFTLENBR2xCLE1BQWEsV0FBVyxFQUF5QixDQUM3QyxJQUFNLEVBQVUsTUFBTSxFQUFHLFNBQVMsUUFBUSxFQUFPLFVBQVUsQ0FDckQsRUFBYSxDQUFDLE1BQU8sTUFBTyxPQUFRLE9BQU8sQ0FFM0MsRUFBMkIsRUFBRSxDQUVuQyxJQUFLLElBQU0sS0FBUyxFQUFTLENBQ3pCLEdBQUksQ0FBQyxFQUFXLEtBQUssR0FBTyxFQUFNLFNBQVMsRUFBSSxDQUFDLENBQUUsU0FFbEQsSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFPLFVBQVcsRUFBTSxDQUc3QyxFQUFTLElBQUksR0FBZ0IsQ0FDL0IsS0FIUyxFQUFLLFNBQVMsRUFBTyxFQUFLLFFBQVEsRUFBTSxDQUFDLENBSWxELE9BQVEsRUFBTyxHQUNmLFNBQVUsRUFDVixXQUFZLEtBQ2YsQ0FBQyxDQUVGLEVBQU0sS0FBSyxFQUFPLENBR3RCLE9BQU8sRUFHWCxNQUFhLEtBQUssRUFBdUIsQ0FDckMsTUFBTSxLQUFLLHVCQUF1QixDQUVsQyxJQUFJLEVBQVEsRUFBRSxDQUVkLFVBQVcsSUFBTSxLQUFVLEtBQUssUUFBUyxDQUNyQyxJQUFNLEVBQWEsTUFBTSxLQUFLLFdBQVcsRUFBTyxDQUVoRCxFQUFNLEtBQUssR0FBRyxFQUFXLENBSTdCLElBQU0sRUFBVyxNQUFNLEtBQUssR0FDdkIsV0FBVyxhQUFhLENBQ3hCLFdBQVcsQ0FDWCxTQUFTLENBRWQsSUFBSyxJQUFNLEtBQUssRUFBVSxDQUN0QixBQUNJLEVBQUUsU0FBUyxPQUdmLElBQU0sRUFBSSxFQUFNLEtBQUssR0FBSyxFQUFFLE9BQVMsRUFBRSxLQUFLLENBRXZDLElBRUwsRUFBRSxXQUFhLElBQUksS0FBSyxFQUFFLFlBQVksRUFTMUMsT0FOSSxHQUFTLFNBQ1QsRUFBUSxFQUFNLE9BQU8sR0FBSyxFQUFFLFNBQVcsRUFBUSxPQUFPLEVBRzFELEVBQVEsR0FBUSxFQUFPLENBQUMsU0FBVSxPQUFPLENBQUUsQ0FBQyxNQUFPLE1BQU0sQ0FBQyxDQUVuRCxFQUdYLE1BQWMsVUFBVSxFQUEyQyxDQUMvRCxNQUFNLEVBQVUsR0FBRyxLQUFLLEdBQUcsQ0FFM0IsTUFBTSxLQUFLLEdBQ04sV0FBVyxhQUFhLENBQ3hCLE9BQU8sQ0FDSixLQUFNLEVBQVUsS0FDaEIsT0FBUSxFQUFVLE9BQ2xCLFlBQWEsRUFBTyxJQUFJLEtBQVEsc0JBQXNCLENBQ3pELENBQUMsQ0FDRCxTQUFTLENBRWQsS0FBSyxPQUFPLEtBQUssR0FBRyxFQUFVLEtBQUssd0JBQXdCLENBSS9ELE1BQWMsWUFBWSxFQUEyQyxDQUNqRSxNQUFNLEVBQVUsS0FBSyxLQUFLLEdBQUcsQ0FFN0IsTUFBTSxLQUFLLEdBQ04sV0FBVyxhQUFhLENBQ3hCLE1BQU0sT0FBUSxJQUFLLEVBQVUsS0FBSyxDQUNsQyxNQUFNLFNBQVUsSUFBSyxFQUFVLE9BQU8sQ0FDdEMsU0FBUyxDQUVkLEtBQUssT0FBTyxLQUFLLEdBQUcsRUFBVSxLQUFLLDJCQUEyQixDQUdsRSxNQUFhLFlBQVksRUFBNEMsQ0FDakUsTUFBTSxLQUFLLHVCQUF1QixDQUdsQyxJQUFNLEdBRGEsTUFBTSxLQUFLLE1BQU0sRUFDUCxLQUFLLEdBQUssRUFBRSxXQUFhLEVBQVMsQ0FFL0QsR0FBSSxDQUFDLEVBQ0QsTUFBTyxDQUNILEtBQU0sRUFBSyxTQUFTLEVBQVUsRUFBSyxRQUFRLEVBQVMsQ0FBQyxDQUMzQyxXQUNWLE9BQVEsS0FDUixPQUFRLFNBQ1IsTUFBVyxNQUFNLGFBQWEsRUFBUyxZQUFZLENBQ3RELENBR0wsR0FBSSxFQUFVLFdBQ1YsTUFBTyxDQUNILEtBQU0sRUFBVSxLQUNoQixTQUFVLEVBQVUsU0FDcEIsT0FBUSxFQUFVLE9BQ2xCLE9BQVEsVUFDWCxDQUdMLEdBQU0sQ0FBQyxHQUFTLE1BQU0sTUFBZSxLQUFLLFVBQVUsRUFBVSxDQUFDLENBWS9ELE9BVkksRUFDTyxDQUNILEtBQU0sRUFBVSxLQUNoQixTQUFVLEVBQVUsU0FDcEIsT0FBUSxFQUFVLE9BQ2xCLE9BQVEsU0FDUixRQUNILENBR0UsQ0FDSCxLQUFNLEVBQVUsS0FDaEIsU0FBVSxFQUFVLFNBQ3BCLE9BQVEsRUFBVSxPQUNsQixPQUFRLFVBQ1gsQ0FHTCxNQUFhLGFBQWEsRUFBNEMsQ0FDbEUsTUFBTSxLQUFLLHVCQUF1QixDQUdsQyxJQUFNLEdBRGEsTUFBTSxLQUFLLE1BQU0sRUFDUCxLQUFLLEdBQUssRUFBRSxXQUFhLEVBQVMsQ0FFL0QsR0FBSSxDQUFDLEVBQ0QsTUFBTyxDQUNILEtBQU0sRUFBSyxTQUFTLEVBQVUsRUFBSyxRQUFRLEVBQVMsQ0FBQyxDQUMzQyxXQUNWLE9BQVEsS0FDUixPQUFRLFNBQ1IsTUFBTyxhQUFhLEVBQVMsWUFDaEMsQ0FHTCxHQUFJLENBQUMsRUFBVSxXQUNYLE1BQU8sQ0FDSCxLQUFNLEVBQVUsS0FDaEIsU0FBVSxFQUFVLFNBQ3BCLE9BQVEsRUFBVSxPQUNsQixPQUFRLFVBQ1gsQ0FHTCxHQUFNLENBQUMsR0FBUyxNQUFNLE1BQWUsS0FBSyxZQUFZLEVBQVUsQ0FBQyxDQVlqRSxPQVZJLEVBQ08sQ0FDSCxLQUFNLEVBQVUsS0FDaEIsU0FBVSxFQUFVLFNBQ3BCLE9BQVEsRUFBVSxPQUNsQixPQUFRLFNBQ1IsUUFDSCxDQUdFLENBQ0gsS0FBTSxFQUFVLEtBQ2hCLFNBQVUsRUFBVSxTQUNwQixPQUFRLEVBQVUsT0FDbEIsT0FBUSxVQUNYLENBR0wsTUFBYSxRQUFRLEVBQTRDLEVBQUUsQ0FBOEIsQ0FDN0YsTUFBTSxLQUFLLHVCQUF1QixDQUVsQyxJQUFJLEVBQWEsTUFBTSxLQUFLLEtBQUssRUFBUSxDQVV6QyxHQVJBLEVBQWEsRUFBVyxPQUFPLEdBQUssQ0FBQyxFQUFFLFdBQVcsQ0FFbEQsRUFBVyxNQUFNLEVBQUcsSUFBTSxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUVuRCxFQUFRLFFBQVUsSUFBQSxLQUNsQixFQUFhLEVBQVcsTUFBTSxFQUFHLEVBQVEsTUFBTSxFQUcvQyxFQUFXLFNBQVcsRUFDdEIsTUFBTyxFQUFFLENBR2IsTUFBTSxLQUFLLFNBQVMsWUFBWSwwQkFBMkIsQ0FDdkQsV0FBWSxFQUFXLElBQUksR0FBSyxFQUFFLEtBQUssQ0FDMUMsQ0FBQyxDQUVGLElBQU0sRUFBNkIsRUFBRSxDQUVyQyxJQUFLLElBQU0sS0FBYSxFQUFZLENBQ2hDLElBQU0sRUFBUyxNQUFNLEtBQUssWUFBWSxFQUFVLFNBQVMsQ0FLekQsR0FIQSxFQUFRLEtBQUssRUFBTyxDQUdoQixFQUFPLFNBQVcsU0FDbEIsTUFTUixPQUxBLE1BQU0sS0FBSyxTQUFTLFlBQVkseUJBQTBCLENBQzFDLGFBQ1osVUFDSCxDQUFDLENBRUssRUFHWCxNQUFhLFNBQVMsRUFBNEMsRUFBRSxDQUE4QixDQUM5RixNQUFNLEtBQUssdUJBQXVCLENBRWxDLElBQUksRUFBYSxNQUFNLEtBQUssS0FBSyxFQUFRLENBV3pDLEdBVEEsRUFBYSxFQUFXLE9BQU8sR0FBSyxFQUFFLFdBQVcsQ0FFakQsRUFBVyxNQUFNLEVBQUcsSUFBTSxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUduRCxFQUFRLFFBQVUsSUFBQSxLQUNsQixFQUFhLEVBQVcsTUFBTSxFQUFHLEVBQVEsTUFBTSxFQUcvQyxFQUFXLFNBQVcsRUFDdEIsTUFBTyxFQUFFLENBR2IsTUFBTSxLQUFLLFNBQVMsWUFBWSwyQkFBNEIsQ0FDeEQsV0FBWSxFQUFXLElBQUksR0FBSyxFQUFFLEtBQUssQ0FDMUMsQ0FBQyxDQUVGLElBQU0sRUFBNkIsRUFBRSxDQUVyQyxJQUFLLElBQU0sS0FBYSxFQUFZLENBQ2hDLElBQU0sRUFBUyxNQUFNLEtBQUssYUFBYSxFQUFVLFNBQVMsQ0FLMUQsR0FIQSxFQUFRLEtBQUssRUFBTyxDQUdoQixFQUFPLFNBQVcsU0FDbEIsTUFRUixPQUpBLE1BQU0sS0FBSyxTQUFTLFlBQVksMEJBQTJCLENBQ3ZELFdBQVksRUFBVyxJQUFJLEdBQUssRUFBRSxLQUFLLENBQzFDLENBQUMsQ0FFSyxFQUdYLE1BQWEsR0FBRyxFQUFnQixFQUFHLEVBQXVCLEVBQUUsQ0FBOEIsQ0FDdEYsT0FBTyxLQUFLLFFBQVEsQ0FDaEIsR0FBRyxFQUNILFFBQ0gsQ0FBQyxDQUdOLE1BQWEsS0FBSyxFQUFnQixFQUFHLEVBQXVCLEVBQUUsQ0FBOEIsQ0FDeEYsT0FBTyxLQUFLLFNBQVMsQ0FDakIsR0FBRyxFQUNILFFBQ0gsQ0FBQyxDQUdOLE1BQWEsT0FBTyxFQUF1QixFQUFFLENBQThCLENBQ3ZFLE9BQU8sS0FBSyxRQUFRLEVBQVEsQ0FHaEMsTUFBYSxhQUFhLEVBQXVCLEVBQUUsQ0FBOEIsQ0FDN0UsSUFBTSxFQUFVLE1BQU0sS0FBSyxPQUFPLEVBQVEsQ0FFMUMsR0FBSSxFQUFRLEtBQUssR0FBSyxFQUFFLFNBQVcsU0FBUyxDQUFFLENBQzFDLElBQU0sRUFBWSxNQUFNLCtCQUErQixDQUl2RCxNQUZBLE9BQU8sT0FBTyxFQUFPLENBQUUsVUFBUyxDQUFDLENBRTNCLEVBR1YsT0FBTyxFQUdYLE1BQWEsTUFBTSxFQUE0QyxFQUFFLENBQThCLENBQzNGLElBQU0sRUFBYyxNQUFNLEtBQUssU0FBUyxFQUFRLENBUWhELE9BTkksRUFBWSxLQUFLLEdBQUssRUFBRSxTQUFXLFNBQVMsQ0FDckMsRUFHTyxNQUFNLEtBQUssUUFBUSxFQUFRLEdDL1d4QyxHQUFiLEtBQTZCLENBQ3pCLFVBQW9CLElBQUksSUFDeEIsYUFBYyxDQUNWLFFBQVEsR0FBRyxVQUFZLEdBQXdCLENBQzNDLElBQU0sRUFBVyxLQUFLLFVBQVUsSUFBSSxFQUFRLE1BQU0sQ0FDN0MsS0FFTCxJQUFLLElBQU0sS0FBVyxFQUNsQixFQUFRLEVBQVEsS0FBSyxFQUUzQixDQUdOLEdBQW1CLEVBQWUsRUFBZ0MsQ0FDekQsS0FBSyxVQUFVLElBQUksRUFBTSxFQUMxQixLQUFLLFVBQVUsSUFBSSxFQUFPLElBQUksSUFBTSxDQUd4QyxLQUFLLFVBQVUsSUFBSSxFQUFNLENBQUUsSUFBSSxFQUF3QixDQUczRCxJQUFvQixFQUFlLEVBQWdDLENBQy9ELEtBQUssVUFBVSxJQUFJLEVBQU0sRUFBRSxPQUFPLEVBQXdCLENBRzlELEtBQXFCLEVBQWUsRUFBa0IsQ0FDbEQsR0FBSSxDQUFDLFFBQVEsS0FDVCxNQUFVLE1BQU0saUdBQWlHLENBR3JILElBQU0sRUFBSyxHQUFVLENBQ2YsRUFBeUIsQ0FBRSxLQUFJLFFBQWEsT0FBVyxDQUc3RCxPQUZBLFFBQVEsS0FBSyxFQUFRLENBRWQsSUN0Q0YsR0FBYixLQUEyQixDQUN2QixVQUFvQixJQUFJLElBQ3hCLFlBQVksRUFBc0MsQ0FBckIsS0FBQSxNQUFBLEVBQ3pCLEtBQUssTUFBTSxHQUFHLFVBQVksR0FBd0IsQ0FDOUMsSUFBTSxFQUFXLEtBQUssVUFBVSxJQUFJLEVBQVEsTUFBTSxDQUM3QyxLQUVMLElBQUssSUFBTSxLQUFXLEVBQ2xCLEVBQVEsRUFBUSxLQUFLLEVBRTNCLENBR04sR0FBbUIsRUFBZSxFQUFnQyxDQUN6RCxLQUFLLFVBQVUsSUFBSSxFQUFNLEVBQzFCLEtBQUssVUFBVSxJQUFJLEVBQU8sSUFBSSxJQUFNLENBR3hDLEtBQUssVUFBVSxJQUFJLEVBQU0sQ0FBRSxJQUFJLEVBQXdCLENBRzNELElBQW9CLEVBQWUsRUFBZ0MsQ0FDL0QsS0FBSyxVQUFVLElBQUksRUFBTSxFQUFFLE9BQU8sRUFBd0IsQ0FHOUQsS0FBcUIsRUFBZSxFQUFrQixDQUNsRCxHQUFJLENBQUMsS0FBSyxNQUFNLEtBQ1osTUFBVSxNQUFNLHdFQUF3RSxDQUc1RixJQUFNLEVBQUssR0FBVSxDQUNmLEVBQXlCLENBQUUsS0FBSSxRQUFhLE9BQVcsQ0FHN0QsT0FGQSxLQUFLLE1BQU0sS0FBSyxFQUFRLENBRWpCLElDRGYsU0FBUyxHQUFhLEVBQXlELENBQzNFLElBQU0sRUFBdUIsRUFBRSxDQUV6QixFQUFXLEVBQ1osUUFBUSwyQkFBNkIsSUFDbEMsRUFBVyxLQUFLLEVBQU0sTUFBTSxFQUFFLENBQUMsQ0FDeEIsV0FDVCxDQUNELFFBQVEsTUFBTyxNQUFNLENBRTFCLE1BQU8sQ0FBRSxRQUFhLE9BQU8sSUFBSSxFQUFTLEdBQUcsQ0FBRSxhQUFZLENBRy9ELElBQWEsR0FBYixLQUEwQixDQUN0QixPQUErQixFQUFFLENBRWpDLFlBQVksRUFBMEMsQ0FBekIsS0FBQSxPQUFBLEVBQ3pCLEtBQUssT0FBTyxHQUFpQixpQkFBbUIsR0FBUSxLQUFLLFNBQVMsRUFBSSxDQUFDLENBRy9FLE1BQWMsU0FBUyxFQUFrQyxDQUNyRCxJQUFLLElBQU0sS0FBUyxLQUFLLE9BQVEsQ0FDN0IsR0FBSSxFQUFNLFNBQVcsRUFBSSxPQUFRLFNBRWpDLElBQU0sRUFBUSxFQUFNLFFBQVEsS0FBSyxFQUFJLEtBQUssQ0FDMUMsR0FBSSxDQUFDLEVBQU8sU0FFWixJQUFNLEVBQWlDLEVBQUUsQ0FDekMsRUFBTSxXQUFXLFNBQVMsRUFBTSxJQUFNLENBQ2xDLEVBQU8sR0FBUSxFQUFNLEVBQUksSUFDM0IsQ0FFRixJQUFJLEVBQWEsSUFDWCxFQUFrQyxFQUFFLENBRXBDLEVBQW9CLENBQ3RCLE9BQU8sRUFBTSxDQUVULE1BREEsR0FBYSxFQUNOLE1BRVgsS0FBTyxHQUFlLENBQ2xCLElBQU0sRUFBaUMsQ0FDbkMsVUFBVyxFQUFJLFVBQ2YsT0FBUSxFQUNSLE9BQ0EsVUFDSCxDQUNELEtBQUssT0FBTyxLQUFLLGtCQUFtQixFQUFTLEVBRXBELENBRUQsTUFBTSxFQUFNLFFBQVEsQ0FBRSxHQUFHLEVBQUssU0FBUSxDQUFFLEVBQU0sQ0FDOUMsT0FHSixLQUFLLE9BQU8sS0FBSyxrQkFBbUIsQ0FDaEMsVUFBVyxFQUFJLFVBQ2YsT0FBUSxJQUNSLEtBQU0sQ0FBRSxRQUFTLFlBQWEsQ0FDakMsQ0FBZ0MsQ0FHckMsU0FBaUIsRUFBb0IsRUFBYyxFQUE2QixDQUM1RSxHQUFNLENBQUUsVUFBUyxjQUFlLEdBQWEsRUFBSyxDQUVsRCxLQUFLLE9BQU8sS0FBSyxDQUFFLFNBQVEsT0FBTSxVQUFTLFVBQVMsYUFBWSxDQUFDLENBQ2hFLEtBQUssT0FBTyxLQUFLLGtCQUFtQixDQUFFLFNBQVEsT0FBTSxDQUEyQixDQUduRixJQUFXLEVBQWMsRUFBNkIsQ0FDbEQsS0FBSyxTQUFTLE1BQU8sRUFBTSxFQUFRLENBR3ZDLEtBQVksRUFBYyxFQUE2QixDQUNuRCxLQUFLLFNBQVMsT0FBUSxFQUFNLEVBQVEsQ0FHeEMsSUFBVyxFQUFjLEVBQTZCLENBQ2xELEtBQUssU0FBUyxNQUFPLEVBQU0sRUFBUSxDQUd2QyxNQUFhLEVBQWMsRUFBNkIsQ0FDcEQsS0FBSyxTQUFTLFFBQVMsRUFBTSxFQUFRLENBR3pDLE9BQWMsRUFBYyxFQUE2QixDQUNyRCxLQUFLLFNBQVMsU0FBVSxFQUFNLEVBQVEsR0MvR3pCLEdBQXJCLE1BQXFCLENBQTZCLENBQzlDLFVBQ0EsT0FDQSxPQUNBLE9BQ0EsT0FBaUIsSUFBSSxFQUNyQixPQUF3QyxFQUFFLENBQzFDLE1BQWUsR0FFZixhQUFvQixFQUFtQixDQUVuQyxNQURBLE1BQUssVUFBWSxFQUNWLEtBR1gsVUFBaUIsRUFBZ0IsQ0FFN0IsTUFEQSxNQUFLLE9BQVMsRUFDUCxLQUdYLFVBQWlCLEVBQWdCLENBRTdCLE1BREEsTUFBSyxPQUFTLEVBQ1AsS0FHWCxVQUFpQixFQUFnQixDQUU3QixNQURBLE1BQUssT0FBUyxFQUNQLEtBR1gsVUFBaUIsRUFBdUIsQ0FFcEMsTUFEQSxNQUFLLE9BQVMsRUFDUCxLQUdYLFNBQWdCLEVBQWdCLENBRTVCLE1BREEsTUFBSyxNQUFRLEVBQ04sS0FHWCxPQUFjLE9BQU8sRUFBbUIsQ0FDcEMsT0FBTyxJQUFJLEdBQThCLENBQUMsYUFBYSxFQUFVLENBR3JFLE1BQWEsV0FBWSxDQUNyQixJQUFNLEVBQVEsRUFBRyxLQUFLLG1CQUFvQixDQUFFLElBQUssS0FBSyxVQUFXLENBQUMsQ0FFOUQsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLFNBQVMsRUFBTSxPQUFPLGtCQUFrQixLQUFLLFlBQWEsQ0FDeEUsUUFDSCxDQUFDLENBSU4sSUFBTSxFQUFnQyxFQUFFLENBRXhDLElBQUssSUFBTSxLQUFRLEVBQU8sQ0FFdEIsSUFBSSxFQUFZLEVBQUssUUFBUSxpQkFBa0IsR0FBRyxDQUc5QyxFQUFzRCxNQUcxRCxJQUFLLElBQU0sSUFGWSxDQUFDLFFBQVMsU0FBVSxVQUFXLE9BQU8sQ0FHekQsR0FBSSxFQUFVLFNBQVMsRUFBTyxDQUFFLENBQzVCLEVBQVMsRUFBTyxVQUFVLEVBQUUsQ0FDNUIsRUFBWSxFQUFVLFFBQVEsRUFBUSxHQUFHLENBQ3pDLE1BTVIsRUFBWSxFQUFVLFFBQVEsV0FBWSxHQUFHLENBQzdDLEVBQVksRUFBVSxRQUFRLFVBQVcsR0FBRyxDQUc1QyxFQUFZLEVBQVUsUUFBUSxxQkFBc0IsTUFBTSxDQUcxRCxFQUFZLEVBQVUsUUFBUSxlQUFnQixNQUFNLENBRy9DLEVBQVUsV0FBVyxJQUFJLEdBQzFCLEVBQVksSUFBTSxHQUlsQixJQUFjLE1BQ2QsRUFBWSxLQUlaLEtBQUssU0FFTCxHQUR5QixLQUFLLE9BQU8sV0FBVyxJQUFJLENBQUcsS0FBSyxPQUFTLElBQU0sS0FBSyxRQUNqRCxHQUluQyxJQUFJLEVBQVUsRUFHVixFQUFVLFNBQVMsSUFBSSxHQUN2QixHQUFXLEtBSWYsSUFBTSxHQUFjLEVBQVUsTUFBTSxLQUFLLEVBQUksRUFBRSxFQUFFLE9BQ2pELEdBQVcsRUFBYSxJQUd4QixJQUFNLEVBQWUsRUFBVSxNQUFNLElBQUksQ0FBQyxPQUFPLEdBQUssRUFBRSxDQUFDLE9BQ3pELEdBQVcsRUFBZSxJQUUxQixFQUFPLEtBQUssQ0FDUixPQUNBLFlBQ0EsU0FDQSxVQUNBLE9BQVEsS0FBSyxPQUNoQixDQUFDLENBSU4sRUFBTyxNQUFNLEVBQUcsSUFBTSxFQUFFLFFBQVUsRUFBRSxRQUFRLENBRTVDLEtBQUssT0FBUyxFQUdsQixNQUFhLGdCQUFpQixDQUMxQixHQUFJLENBQUMsS0FBSyxPQUNOLE1BQU0sSUFBSSxFQUFjLDBCQUEwQixDQUd0RCxJQUFNLEVBQWEsS0FBSyxRQUFVLFVBRTVCLEVBQU8sU0FBUyxFQUFhLENBQy9CLEVBQU0sU0FBVyxDQUNiLEdBQUcsRUFBTSxTQUNULE9BQVEsRUFDWCxFQUdMLEtBQUssT0FBTyxHQUFHLFFBQVMsRUFBSyxDQUU3QixJQUFLLElBQU0sS0FBUyxLQUFLLE9BQVEsQ0FFN0IsSUFBTSxHQURjLE1BQU0sT0FBTyxHQUFHLEtBQUssVUFBVSxHQUFHLEVBQU0sU0FDaEMsUUFFNUIsR0FBSSxPQUFPLEdBQVksV0FBWSxDQUMvQixLQUFLLE9BQU8sS0FBSyxjQUFjLEVBQU0sS0FBSyxxQ0FBcUMsQ0FDL0UsU0FHSixLQUFLLE9BQU8sRUFBTSxRQUFRLEVBQU0sVUFBVyxFQUFRLENBR3ZELEtBQUssT0FBTyxJQUFJLFFBQVMsRUFBSyxDQUdsQyxNQUFhLE1BQU0sQ0FFZixNQUFNLEtBQUssV0FBVyxDQUN0QixNQUFNLEtBQUssZ0JBQWdCLEdDbktkLEdBQXJCLEtBQTJCLENBQ3ZCLEtBQXNCLEdBQ3RCLE9BQTZCLE1BQzdCLFFBQXNDLEtBQ3RDLFlBQW1DLEVBQUUsQ0FDckMsU0FBOEMsRUFBRSxDQUVoRCxZQUFZLEVBQXVCLEVBQUUsQ0FBRSxDQUNuQyxLQUFLLEtBQU8sRUFBSyxNQUFRLEdBQ3pCLEtBQUssT0FBUyxFQUFLLFFBQVUsTUFDN0IsS0FBSyxRQUFVLEVBQUssU0FBVyxLQUMvQixLQUFLLFlBQWMsRUFBSyxhQUFlLEVBQUUsQ0FDekMsS0FBSyxTQUFXLEVBQUssVUFBWSxFQUFFLENBR3ZDLE9BQWMsT0FBTyxFQUFtQixFQUE2QyxDQUNqRixJQUFNLEVBQWlDLEVBQUUsQ0FFbkMsRUFBZ0IsRUFBVSxNQUFNLElBQUksQ0FBQyxPQUFPLFFBQVEsQ0FDcEQsRUFBa0IsRUFBWSxNQUFNLElBQUksQ0FBQyxPQUFPLFFBQVEsQ0FFOUQsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQWMsT0FBUSxJQUFLLENBQzNDLElBQU0sRUFBZSxFQUFjLEdBQzdCLEVBQWlCLEVBQWdCLEdBRXZDLEdBQUksRUFBYSxXQUFXLElBQUksQ0FBRSxDQUM5QixJQUFNLEVBQVksRUFBYSxNQUFNLEVBQUUsQ0FDdkMsRUFBTyxHQUFhLEVBR3hCLEdBQUksSUFBaUIsSUFBSyxDQUd0QixFQUFPLEtBRG1CLEVBQWdCLE1BQU0sRUFBRSxDQUNsQixLQUFLLElBQUksQ0FDekMsT0FJUixPQUFPLEVBR1gsT0FBYyxNQUFNLEVBQTZDLENBQzdELElBQU0sRUFBZ0MsRUFBRSxDQUNsQyxFQUFjLEVBQVksTUFBTSxJQUFJLENBQUMsR0FNM0MsT0FKSyxFQUlFLEdBQUcsTUFBTSxFQUFZLENBSGpCLEVBTWYsUUFBZ0IsQ0FDWixNQUFPLENBQ0gsS0FBTSxLQUFLLEtBQ1gsT0FBUSxLQUFLLE9BQ2IsWUFBYSxLQUFLLFlBQVksSUFBSSxHQUFNLEVBQUcsWUFBWSxLQUFLLENBQzVELFNBQVUsS0FBSyxTQUNsQixHQzVDWSxHQUFyQixNQUFxQixVQUE4QixFQUFRLEdBQU0sQUFBQyxDQUM5RCxPQUFjLHNCQUF3QixnQkFFdEMsT0FBeUIsRUFBRSxDQUUzQixZQUEyQyxFQUFFLENBQzdDLFNBQTRCLEVBQUUsQ0FFOUIsT0FBc0MsRUFBRSxDQUN4QyxjQUFpQyxFQUFFLENBRW5DLE1BQWUsR0FDZixPQUFnQixJQUFJLEVBQ3BCLFNBQXVDLEVBQUUsQ0FFekMsWUFBWSxFQUFrQyxFQUFFLENBQUUsQ0FDOUMsT0FBTyxDQUNQLEtBQUssT0FBUyxFQUFLLFFBQVUsRUFBRSxDQUMvQixLQUFLLFlBQWMsRUFBSyxhQUFlLEVBQUUsQ0FDekMsS0FBSyxTQUFXLEVBQUssVUFBWSxFQUFFLENBQ25DLEtBQUssT0FBUyxFQUFLLFFBQVUsRUFBRSxDQUMvQixLQUFLLGNBQWdCLEVBQUssZUFBaUIsRUFBRSxDQUM3QyxLQUFLLE1BQVEsRUFBSyxPQUFTLEdBQzNCLEtBQUssU0FBVyxFQUFLLFVBQVksRUFBRSxDQUNuQyxLQUFLLFVBQVksRUFBSyxXQUFhLEVBQUUsQ0FDckMsS0FBSyxPQUFTLEVBQUssUUFBVSxJQUFJLEVBR3JDLElBQWlDLEVBQWUsRUFBd0IsUUFBUyxDQU03RSxPQUxBLEtBQUssWUFBWSxLQUFLLENBQ2xCLGFBQ0EsVUFDSCxDQUFDLENBRUssS0FHWCxPQUFjLEVBQWdCLENBRzFCLE9BRkEsS0FBSyxTQUFTLEtBQUssRUFBTyxDQUVuQixLQUdYLFNBQWdCLEVBQXNCLENBQ2xDLE9BQU9DLEdBQUssQ0FBQyxHQUFHLEtBQUssY0FBZSxHQUFHLEtBQUssU0FBVSxFQUFLLENBQUUsSUFBSSxDQUdyRSxJQUFXLEVBQXFELENBQzVELElBQU0sRUFBUSxJQUFJLEdBQU0sQ0FDcEIsT0FBUSxFQUFRLE9BQ2hCLEtBQU0sS0FBSyxTQUFTLEVBQVEsS0FBSyxDQUNqQyxRQUFTLEVBQVEsUUFDakIsWUFBYSxLQUFLLFlBQVksSUFBSSxHQUFLLEVBQUUsV0FBVyxDQUN2RCxDQUFDLENBRUYsS0FBSyxZQUFjLEtBQUssWUFBWSxPQUFPLEdBQUssRUFBRSxVQUFZLFFBQVEsQ0FFdEUsS0FBSyxTQUFXLEVBQUUsQ0FFbEIsS0FBSyxPQUFPLEtBQUssRUFBTSxDQUVuQixLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0sY0FBZSxFQUFNLENBRzNDLEtBQUssS0FBSyxRQUFTLEVBQU0sQ0FHN0IsSUFBVyxFQUFjLEVBQXFCLENBQzFDLEtBQUssSUFBSSxDQUNMLE9BQ0EsT0FBUSxNQUNSLFVBQ0gsQ0FBQyxDQUdOLEtBQVksRUFBYyxFQUFxQixDQUMzQyxLQUFLLElBQUksQ0FDTCxPQUNBLE9BQVEsT0FDUixVQUNILENBQUMsQ0FHTixJQUFXLEVBQWMsRUFBcUIsQ0FDMUMsS0FBSyxJQUFJLENBQ0wsT0FDQSxPQUFRLE1BQ1IsVUFDSCxDQUFDLENBR04sTUFBYSxFQUFjLEVBQXFCLENBQzVDLEtBQUssSUFBSSxDQUNMLE9BQ0EsT0FBUSxRQUNSLFVBQ0gsQ0FBQyxDQUdOLEtBQVksRUFBNEIsRUFBYyxFQUFxQixDQUN2RSxFQUFRLFFBQVEsR0FBVSxDQUN0QixLQUFLLElBQUksQ0FDTCxPQUNBLFNBQ0EsVUFDSCxDQUFDLEVBQ0osQ0FHTixPQUFjLEVBQWMsRUFBcUIsQ0FDN0MsS0FBSyxJQUFJLENBQ0wsT0FDQSxPQUFRLFNBQ1IsVUFDSCxDQUFDLENBSU4sT0FBZSxDQUNYLElBQU0sRUFBUSxJQUFJLEVBQWlCLENBQy9CLFVBQVcsS0FBSyxVQUNoQixNQUFPLEtBQUssTUFDZixDQUFDLENBYUYsTUFYQSxHQUFNLGNBQWdCLEtBQUssU0FDM0IsRUFBTSxZQUFjLEtBQUssWUFBWSxJQUFJLElBQU0sQ0FDM0MsV0FBWSxFQUFFLFdBQ2QsUUFBUyxRQUNaLEVBQUUsQ0FFSCxLQUFLLE9BQU8sS0FBSyxFQUFNLENBRXZCLEtBQUssWUFBYyxLQUFLLFlBQVksT0FBTyxHQUFLLEVBQUUsVUFBWSxRQUFRLENBQ3RFLEtBQUssU0FBVyxFQUFFLENBRVgsRUFHWCxRQUFlLEVBQWdCLEVBQWMsQ0FjekMsT0FiYyxLQUFLLE1BQU0sQ0FDcEIsS0FBSyxHQUNFLEVBQUUsT0FBTyxhQUFhLEdBQUssRUFBTyxhQUFhLENBSTVDLEtBQUssVUFBVSxFQUFFLEtBQU0sRUFBSyxDQUh4QixHQUliLEVBR0ssS0FNZixNQUFhLFFBQVEsRUFBYyxFQUFpQixDQUNoRCxHQUFJLENBQUMsRUFBTSxRQUNQLE1BQVUsTUFBTSwrQkFBK0IsRUFBTSxPQUFPLEdBQUcsRUFBTSxPQUFPLENBR2hGLElBQU0sRUFBTSxDQUFFLEdBQUcsRUFBWSxDQUU3QixVQUFXLElBQU0sS0FBYyxFQUFNLFlBQWEsQ0FDOUMsSUFBTSxFQUFTLE1BQU0sRUFBVyxPQUFPLEVBQUksQ0FFM0MsR0FBSSxHQUFVLGFBQWMsRUFDeEIsT0FBTyxFQUdYLE9BQU8sT0FBTyxFQUFLLEVBQU8sQ0FHOUIsT0FBTyxFQUFNLFFBQVEsRUFBSSxDQUc3QixVQUFpQixFQUFtQixFQUE4QixDQUU5RCxJQUFNLEVBQWdCLEVBQVUsTUFBTSxJQUFJLENBQUMsT0FBTyxRQUFRLENBQ3BELEVBQWtCLEVBQVksTUFBTSxJQUFJLENBQUMsT0FBTyxRQUFRLENBRzlELElBQUssSUFBSSxFQUFJLEVBQUcsRUFBSSxFQUFjLE9BQVEsSUFBSyxDQUMzQyxJQUFNLEVBQWUsRUFBYyxHQUM3QixFQUFpQixFQUFnQixHQUd2QyxHQUFJLElBQWlCLElBQ2pCLE1BQU8sR0FTUCxHQUxBLEdBQUssRUFBZ0IsUUFLckIsR0FBYSxXQUFXLElBQUksRUFLNUIsSUFBaUIsRUFDakIsTUFBTyxHQVNmLE1BSkEsRUFBSSxFQUFnQixPQUFTLEVBQWMsUUFPL0MsT0FBZSxDQUNQLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSxRQUFTLENBQUUsTUFBTyxLQUFLLE9BQU8sT0FBUSxDQUFDLENBRzdELEtBQUssT0FBUyxFQUFFLENBQ2hCLEtBQUssT0FBUyxFQUFFLENBR3BCLE1BQWMsQ0FDVixPQUFPLEtBQUssT0FBTyxPQUFPLEdBQUcsS0FBSyxPQUFPLElBQUksR0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUdoRSxNQUFhLEtBQUssRUFBdUIsRUFBRSxDQUFFLENBQ3pDLEtBQUssTUFBUSxFQUFRLE9BQVMsS0FBSyxNQUUvQixLQUFLLE9BQ0wsS0FBSyxPQUFPLE1BQU0sK0JBQStCLENBSXpELFNBQWdCLEVBQXVCLEVBQUUsQ0FBRSxDQUN2QyxLQUFLLE1BQVEsRUFBUSxPQUFTLEtBQUssTUFFL0IsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLCtCQUErQixHQ2pReEMsR0FBckIsY0FBb0QsRUFBaUIsQ0FDakUsTUFBZSxJQUFJLElBQ25CLEtBQWMsSUFBSSxJQUVsQixZQUFZLEVBQW9DLEVBQUUsQ0FBRSxDQUNoRCxNQUFNLEVBQU8sQ0FHakIsUUFBZSxFQUFrQixFQUFnQyxDQUM3RCxJQUFNLEVBQVEsQ0FDVixTQUFVLEVBQ1YsU0FBVSxHQUFZLEVBQUUsQ0FDM0IsQ0FFRCxLQUFLLEtBQUssV0FBWSxFQUFNLENBRTVCLEtBQUssTUFBTSxJQUFJLEVBQVUsRUFBTSxDQUluQyxPQUFjLEVBQWlCLEVBQWdDLENBQzNELElBQU0sRUFBUSxDQUNWLFNBQVUsRUFDVixTQUFVLEdBQVksRUFBRSxDQUMzQixDQUVELEtBQUssS0FBSyxXQUFZLEVBQU0sQ0FFNUIsS0FBSyxLQUFLLElBQUksRUFBUyxFQUFNLENBR2pDLE1BQWMsU0FBUyxFQUE4QyxDQUNqRSxHQUFJLENBQUMsRUFBRyxXQUFXLEVBQU0sU0FBUyxDQUU5QixPQURBLEtBQUssT0FBTyxLQUFLLG1CQUFtQixFQUFNLFdBQVcsQ0FDOUMsR0FHWCxJQUFNLEVBQU8sU0FBUyxFQUFhLENBQy9CLEVBQU0sU0FBVyxDQUNiLEdBQUcsRUFBTSxTQUNULEdBQUcsRUFBTSxTQUNULFNBQVUsRUFBTSxTQUNuQixFQUdDLEVBQVUsR0FBRyxFQUFNLFNBQVMsS0FBSyxLQUFLLEtBQUssR0FFakQsS0FBSyxHQUFHLFFBQVMsRUFBSyxDQUV0QixHQUFNLENBQUMsR0FBUyxNQUFNLE1BQWUsT0FBTyxHQUFTLENBWXJELE9BVkEsS0FBSyxJQUFJLFFBQVMsRUFBSyxDQUVuQixHQUNBLE9BQU8sT0FBTyxFQUFPLEVBQU0sQ0FFM0IsS0FBSyxPQUFPLE1BQU0sc0JBQXVCLEVBQU0sQ0FFeEMsSUFHSixHQUdYLE1BQWMsUUFBUSxFQUErQyxDQUNqRSxJQUFNLEVBQXNCLElBQUksSUFFaEMsR0FBSSxDQUFDLEVBQUcsV0FBVyxFQUFNLFNBQVMsQ0FFOUIsT0FEQSxLQUFLLE9BQU8sS0FBSyx3QkFBd0IsRUFBTSxXQUFXLENBQ25ELE1BQU0sS0FBSyxFQUFPLENBRzdCLElBQU0sRUFBUSxFQUFHLFlBQVksRUFBTSxTQUFTLENBRTVDLElBQUssSUFBTSxLQUFRLEVBQU8sQ0FFdEIsR0FBSSxFQUFLLFNBQVMsV0FBVyxFQUFJLEVBQUssU0FBUyxXQUFXLEVBQUksRUFBSyxTQUFTLFdBQVcsRUFBSSxFQUFLLFNBQVMsV0FBVyxDQUNoSCxTQUdKLElBQU0sRUFBVyxFQUFLLEtBQUssRUFBTSxTQUFVLEVBQUssQ0FFMUMsRUFBMEIsQ0FDNUIsU0FBVSxFQUNWLFNBQVUsRUFBTSxTQUNuQixDQUVJLE1BQU0sS0FBSyxTQUFTLEVBQXdCLEVBQzdDLEVBQU8sSUFBSSxFQUFTLENBSTVCLE9BQU8sTUFBTSxLQUFLLEVBQU8sQ0FHN0IsTUFBYSxNQUFPLENBQ2hCLElBQU0sRUFBUyxJQUFJLElBRW5CLElBQUssSUFBTSxLQUFLLEtBQUssTUFBTSxRQUFRLENBQzFCLE1BQU0sS0FBSyxTQUFTLEVBQUUsRUFDdkIsRUFBTyxJQUFJLEVBQUUsU0FBUyxDQUk5QixJQUFLLElBQU0sS0FBTyxLQUFLLEtBQUssUUFBUSxFQUNkLE1BQU0sS0FBSyxRQUFRLEVBQUksRUFFL0IsUUFBUSxHQUFLLEVBQU8sSUFBSSxFQUFFLENBQUMsQ0FHckMsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLGFBQWMsQ0FDNUIsTUFBTyxNQUFNLEtBQUssRUFBTyxDQUFDLElBQUksR0FBSyxFQUFLLFNBQVMsUUFBUSxLQUFLLENBQUUsRUFBRSxDQUFDLENBQ3RFLENBQUMsR0M5R2QsTUFBTSxHQUFTLENBQ1gsQ0FDSSxPQUFRLE1BQ1IsS0FBTSxJQUNOLFFBQVMsUUFDVCxNQUFPLENBQ0gsT0FBUSxDQUFDLGNBQWMsQ0FDdkIsTUFBUSxDQUFDLGFBQWEsQ0FDekIsQ0FDSixDQUNELENBQ0ksT0FBUSxNQUNSLEtBQU0sT0FDTixRQUFTLE9BQ1QsTUFBTyxDQUNILE9BQVEsQ0FBQyxhQUFhLENBQ3RCLE1BQVEsQ0FBQyxZQUFZLENBQ3hCLENBQ0osQ0FDRCxDQUNJLE9BQVEsT0FDUixLQUFNLElBQ04sUUFBUyxRQUNULE1BQU8sQ0FDSCxPQUFRLENBQUMsY0FBZSxhQUFhLENBQ3JDLE1BQVEsQ0FBQyxhQUFjLFlBQVksQ0FDdEMsQ0FDSixDQUNELENBQ0ksT0FBUSxNQUNSLEtBQU0sT0FDTixRQUFTLFNBQ1QsTUFBTyxDQUNILE9BQVEsQ0FBQyxlQUFnQixhQUFhLENBQ3RDLE1BQVEsQ0FBQyxjQUFlLFlBQVksQ0FDdkMsQ0FDSixDQUNELENBQ0ksT0FBUSxRQUNSLEtBQU0sT0FDTixRQUFTLFNBQ1QsTUFBTyxDQUNILE9BQVEsQ0FBQyxlQUFnQixhQUFhLENBQ3RDLE1BQVEsQ0FBQyxjQUFlLFlBQVksQ0FDdkMsQ0FDSixDQUNELENBQ0ksT0FBUSxTQUNSLEtBQU0sT0FDTixRQUFTLFVBQ1QsTUFBTyxDQUNILE9BQVEsQ0FBQyxnQkFBZ0IsQ0FDekIsTUFBUSxDQUFDLGVBQWUsQ0FDM0IsQ0FDSixDQUNKLENBR0QsSUFBcUIsR0FBckIsY0FBbUQsRUFBUSxHQUFNLEFBQUMsQ0FDOUQsUUFFQSxZQUFZLEVBQWlDLEVBQUUsQ0FBRSxDQUM3QyxPQUFPLENBQ1AsS0FBSyxRQUFVLEVBR25CLE1BQWEsTUFBTSxFQUFnQyxDQUMvQyxJQUFNLEVBQVksTUFBTSxrQkFBa0IsQ0FJMUMsTUFGQSxPQUFPLE9BQU8sRUFBTyxDQUFFLE1BQUssQ0FBQyxDQUV2QixFQUdWLE1BQWEsS0FBSyxFQUFpQyxDQUMvQyxJQUFNLEVBQVksTUFBTSxrQkFBa0IsQ0FJMUMsTUFGQSxPQUFPLE9BQU8sRUFBTyxDQUFFLE1BQUssQ0FBQyxDQUV2QixFQUdWLE1BQWEsTUFBTSxFQUFpQyxDQUNoRCxJQUFNLEVBQVksTUFBTSxrQkFBa0IsQ0FJMUMsTUFGQSxPQUFPLE9BQU8sRUFBTyxDQUFFLE1BQUssQ0FBQyxDQUV2QixFQUdWLE1BQWEsT0FBTyxFQUFpQyxDQUNqRCxJQUFNLEVBQVksTUFBTSxrQkFBa0IsQ0FJMUMsTUFGQSxPQUFPLE9BQU8sRUFBTyxDQUFFLE1BQUssQ0FBQyxDQUV2QixFQUdWLE1BQWEsUUFBUSxFQUFpQyxDQUNsRCxJQUFNLEVBQVksTUFBTSxrQkFBa0IsQ0FJMUMsTUFGQSxPQUFPLE9BQU8sRUFBTyxDQUFFLE1BQUssQ0FBQyxDQUV2QixFQUdWLEtBQ0ksRUFDQSxFQUNBLEVBQ0YsQ0FDRSxPQUFPLEtBQU8sSUFBcUIsQ0FDL0IsTUFBTSxLQUFLLEtBQUssWUFBYSxFQUFJLENBRWpDLElBQUssSUFBTSxLQUFRLEVBQ2YsTUFBTSxLQUFLLEtBQUssRUFBTSxFQUFJLENBRzlCLElBQU0sRUFBUyxNQUFNLEtBQUssR0FBWSxFQUFJLENBRTFDLElBQUssSUFBTSxLQUFRLEVBQ2YsTUFBTSxLQUFLLEtBQUssRUFBTSxFQUFLLEVBQU8sQ0FHdEMsT0FBTyxHQUtmLFNBQWdCLEVBQWdCLENBQzVCLElBQUssSUFBTSxLQUFTLEdBQVEsQ0FDeEIsSUFBTSxFQUFTLEVBQU0sT0FDZixFQUFhLEVBQU0sUUFFckIsS0FBSyxRQUFRLFFBQVUsS0FBSyxRQUFRLE9BQU8sU0FBUyxFQUFXLEdBSS9ELEtBQUssUUFBUSxZQUFjLEtBQUssUUFBUSxXQUFXLEtBQ25ELEVBQU8sSUFBSSxLQUFLLFFBQVEsV0FBVyxJQUFPLENBRzFDLEtBQUssUUFBUSxZQUFjLEtBQUssUUFBUSxXQUFXLElBQ25ELEVBQU8sSUFBSSxLQUFLLFFBQVEsV0FBVyxHQUFZLENBR25ELEVBQU8sR0FDSCxFQUFNLEtBQ04sS0FBSyxLQUNELEVBQU0sUUFDTixFQUFNLE9BQU8sUUFBVSxFQUFFLENBQ3pCLEVBQU0sT0FBTyxPQUFTLEVBQUUsQ0FDM0IsQ0FDSixLQ2pLUSxHQUFyQixjQUFrRCxFQUFzQixDQUNwRSxNQUVBLFlBQVksRUFBb0IsRUFBaUMsRUFBRSxDQUFFLENBR2pFLEdBRkEsTUFBTSxFQUFRLENBRVYsQ0FBQyxFQUFNLGdCQUNQLE1BQVUsTUFBTSxxREFBcUQsQ0FHekUsS0FBSyxNQUFRLEVBS2pCLE1BQWEsTUFBTSxFQUFrQixDQUdqQyxNQUFPLENBQ0gsTUFIVSxNQUFNLEtBQUssTUFBTSxNQUFNLENBSXBDLENBR0wsTUFBYSxLQUFLLEVBQWtCLENBQ2hDLElBQU0sRUFBSyxFQUFJLE9BQU8sR0FJdEIsT0FGYSxNQUFNLEtBQUssTUFBTSxXQUFXLEVBQUcsQ0FLaEQsTUFBYSxNQUFNLEVBQWtCLENBQ2pDLElBQU0sRUFBTyxFQUFJLFFBQVEsS0FJekIsT0FGQSxNQUFNLEtBQUssTUFBTSxPQUFPLEVBQUssQ0FFdEIsQ0FDSCxRQUFTLGdDQUNaLENBR0wsTUFBYSxPQUFPLEVBQWtCLENBQ2xDLElBQU0sRUFBSyxFQUFJLE9BQU8sR0FDaEIsRUFBTyxFQUFJLFFBQVEsS0FJekIsT0FGZ0IsTUFBTSxLQUFLLE1BQU0sT0FBTyxFQUFJLEVBQUssQ0FLckQsTUFBYSxRQUFRLEVBQWtCLENBQ25DLElBQU0sRUFBSyxFQUFJLE9BQU8sR0FJdEIsT0FGQSxNQUFNLEtBQUssTUFBTSxRQUFRLEVBQUcsQ0FFckIsQ0FDSCxRQUFTLEdBQ1osR0N0RFksR0FBckIsS0FBa0MsQ0FDOUIsS0FDQSxPQUNBLFNBRUEsWUFBWSxFQUF1QixDQUMvQixLQUFLLEtBQU8sRUFBSyxLQUNqQixLQUFLLE9BQVMsRUFBSyxPQUNuQixLQUFLLFNBQVcsRUFBSyxTQUd6QixNQUFhLElBQUksRUFBZ0MsQ0FDN0MsSUFBTSxFQUFNLE1BQU0sT0FBTyxLQUFLLFVBRTlCLEdBQUksT0FBTyxFQUFJLFNBQVksV0FDdkIsTUFBTSxJQUFJLEVBQWMsVUFBVSxLQUFLLEtBQUssNkJBQTZCLENBRzdFLE1BQU0sRUFBSSxRQUFRLEVBQUcsR0NpQlIsR0FBckIsS0FBb0MsQ0FDaEMsT0FBYyxzQkFBd0IsZ0JBRXRDLE1BQWUsR0FDZixTQUNBLE9BQ0EsR0FDQSxRQUVBLFlBQVksRUFBK0IsQ0FDdkMsS0FBSyxNQUFRLEVBQVEsT0FBUyxLQUFLLE1BQ25DLEtBQUssU0FBVyxFQUFRLFVBQVksSUFBSUMsRUFDeEMsS0FBSyxPQUFTLEVBQVEsUUFBVSxJQUFJLEVBQ3BDLEtBQUssR0FBSyxFQUFRLEdBQ2xCLEtBQUssUUFBVSxFQUFRLFNBQVcsRUFBRSxDQUd4QyxVQUFpQixFQUFzQixDQUNuQyxLQUFLLFFBQVEsS0FBSyxFQUFPLENBRzdCLE1BQWEsV0FBVyxFQUFzQixDQUMxQyxJQUFNLEVBQVUsTUFBTSxFQUFHLFNBQVMsUUFBUSxFQUFPLFVBQVUsQ0FDN0MsRUFBYSxDQUFDLE1BQU8sTUFBTyxPQUFRLE9BQU8sQ0FHbkQsRUFBd0IsRUFBRSxDQUVoQyxJQUFLLElBQU0sS0FBUyxFQUFTLENBQ3pCLEdBQUksQ0FBQyxFQUFXLFNBQVMsRUFBSyxRQUFRLEVBQU0sQ0FBQyxDQUN6QyxTQUdKLElBQU0sRUFBVyxFQUFLLEtBQUssRUFBTyxVQUFXLEVBQU0sQ0FHN0MsRUFBUyxJQUFJLEdBQWEsQ0FDNUIsS0FIUyxFQUFLLFNBQVMsRUFBTyxFQUFLLFFBQVEsRUFBTSxDQUFDLENBSWxELE9BQVEsRUFBTyxHQUNmLFNBQVUsRUFDYixDQUFDLENBRUYsRUFBTSxLQUFLLEVBQU8sQ0FHdEIsT0FBTyxFQUdYLE1BQWEsS0FBSyxFQUF1QixDQUNyQyxJQUFJLEVBQVEsRUFBRSxDQUVkLFVBQVcsSUFBTSxLQUFVLEtBQUssUUFBUyxDQUNyQyxJQUFNLEVBQWdCLE1BQU0sS0FBSyxXQUFXLEVBQU8sQ0FFbkQsRUFBTSxLQUFLLEdBQUcsRUFBYyxDQUdoQyxHQUFJLEdBQVMsT0FBUSxDQUNqQixJQUFNLEVBQVUsTUFBTSxRQUFRLEVBQVEsT0FBTyxDQUFHLEVBQVEsT0FBUyxDQUFDLEVBQVEsT0FBTyxDQUVqRixFQUFRLEVBQU0sT0FBTyxHQUFLLEVBQUUsUUFBVSxFQUFRLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FHckUsR0FBSSxHQUFTLEtBQU0sQ0FDZixJQUFNLEVBQVEsTUFBTSxRQUFRLEVBQVEsS0FBSyxDQUFHLEVBQVEsS0FBTyxDQUFDLEVBQVEsS0FBSyxDQUV6RSxFQUFRLEVBQU0sT0FBTyxHQUFLLEVBQU0sU0FBUyxFQUFFLEtBQUssQ0FBQyxDQU1yRCxPQUZBLEVBQU0sTUFBTSxFQUFHLElBQU0sRUFBRSxLQUFLLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FFM0MsRUFHWCxNQUFhLFVBQVUsRUFBNkMsQ0FDaEUsR0FBTSxDQUFDLEdBQVMsTUFBTSxNQUFlLEVBQU8sSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQWV6RCxPQWJJLEdBQ0EsS0FBSyxPQUFPLE1BQU0sd0JBQXdCLEVBQU8sT0FBUSxFQUFNLENBQ3hELENBQ0gsS0FBTSxFQUFPLEtBQ2IsU0FBVSxFQUFPLFNBQ2pCLE9BQVEsRUFBTyxPQUNmLE9BQVEsU0FDUixRQUNILEdBR0wsS0FBSyxPQUFPLEtBQUssVUFBVSxFQUFPLEtBQUssbUJBQW1CLENBRW5ELENBQ0gsS0FBTSxFQUFPLEtBQ2IsU0FBVSxFQUFPLFNBQ2pCLE9BQVEsRUFBTyxPQUNmLE9BQVEsVUFDWCxFQUlMLE1BQWEsSUFBSSxFQUE0QyxFQUFFLENBQTJCLENBQ3RGLElBQU0sRUFBUSxNQUFNLEtBQUssS0FBSyxFQUFRLENBRXRDLE1BQU0sS0FBSyxTQUFTLFlBQVksb0JBQXFCLENBQ2pELFFBQVMsRUFBTSxJQUFJLEdBQUssRUFBRSxLQUFLLENBQ2xDLENBQUMsQ0FFRixJQUFNLEVBQTBCLEVBQUUsQ0FFbEMsSUFBSyxJQUFNLEtBQUssRUFBTyxDQUNuQixJQUFNLEVBQVMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUt0QyxHQUhBLEVBQVEsS0FBSyxFQUFPLENBR2hCLEVBQU8sU0FBVyxTQUNsQixNQVFSLE9BSkEsTUFBTSxLQUFLLFNBQVMsWUFBWSxtQkFBb0IsQ0FDaEQsUUFBUyxFQUFRLElBQUksR0FBSyxFQUFFLEtBQUssQ0FDcEMsQ0FBQyxDQUVLLElDN0pNLEdBQXJCLEtBQWtDLENBQzlCLE9BQWMsc0JBQXdCLGVBRXRDLE1BQ0EsT0FFQSxLQUFZLEVBQThCLEVBQUUsQ0FBRSxDQUMxQyxLQUFLLE1BQVEsRUFBSyxPQUFTLEdBQzNCLEtBQUssT0FBUyxFQUFLLFFBQVUsRUFBTyxNQUFNLENBQUUsTUFBTyxRQUFTLENBQUMsQ0FFekQsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUFNLDRCQUE0QixDQU90RCxNQUFhLFFBQVEsRUFBYSxFQUFnQixFQUEwQixFQUFFLENBQWlCLENBQzNGLE9BQU8sSUFBSSxTQUFTLEVBQVMsSUFBVyxDQUNwQyxJQUFNLEVBQVEsR0FBTSxFQUFLLEVBQU0sQ0FDM0IsSUFBSyxFQUFRLEtBQU8sUUFBUSxLQUFLLENBQ2pDLE1BQU8sT0FDUCxNQUFPLEVBQVEsT0FBUyxHQUN4QixJQUFLLEVBQVEsS0FBTyxRQUFRLElBQy9CLENBQUMsQ0FFRSxFQUFPLEdBRVgsRUFBTSxRQUFRLEdBQUcsT0FBUyxHQUFNLENBQzVCLEdBQVEsRUFBRSxVQUFVLEVBQ3RCLENBRUYsRUFBTSxRQUFRLEdBQUcsT0FBUyxHQUFNLENBQzVCLEdBQVEsRUFBRSxVQUFVLEVBQ3RCLENBRUYsRUFBTSxHQUFHLFFBQVUsR0FBUyxDQVN4QixHQVJJLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSxtQkFBb0IsQ0FDbEMsTUFDQSxPQUNBLE9BQVEsRUFDWCxDQUFDLENBR0YsSUFBUyxFQUNULE9BQU8sR0FBUyxDQUdwQixJQUFNLEVBQWUsaUNBQWlDLElBRXRELEtBQUssT0FBTyxNQUFNLEVBQWMsQ0FDNUIsTUFDQSxPQUNBLE9BQ0EsT0FBUSxFQUNYLENBQUMsQ0FFRixFQUFPLElBQUlDLEdBQWUsRUFBYyxFQUFNLEVBQUssRUFBSyxDQUFDLEVBRTNELENBRUYsRUFBTSxHQUFHLFFBQVUsR0FBVSxDQUN6QixLQUFLLE9BQU8sTUFBTSwwQkFBMkIsQ0FDekMsTUFDQSxPQUNBLE1BQU8sRUFBTSxRQUNoQixDQUFDLENBRUYsRUFBTyxFQUFNLEVBQ2YsRUFDSixDQU1OLE1BQWEseUJBQXlCLEVBQWEsRUFBZ0IsRUFBMEIsRUFBRSxDQUFtQixDQU85RyxPQU5JLEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSxvQkFBcUIsQ0FDbkMsTUFDQSxPQUNILENBQUMsQ0FFQyxJQUFJLFNBQVMsRUFBUyxJQUFXLENBQ3BDLElBQU0sRUFBUSxHQUFNLEVBQUssRUFBTSxDQUMzQixJQUFLLEVBQVEsS0FBTyxRQUFRLEtBQUssQ0FDakMsTUFBTyxPQUNQLE1BQU8sR0FDUCxJQUFLLEVBQVEsS0FBTyxRQUFRLElBQy9CLENBQUMsQ0FFRSxFQUFTLEdBQ1QsRUFBYyxHQUVsQixFQUFNLFFBQVEsR0FBRyxPQUFTLEdBQVMsQ0FDL0IsR0FBVSxFQUFLLFVBQVUsRUFDM0IsQ0FFRixFQUFNLFFBQVEsR0FBRyxPQUFTLEdBQVMsQ0FDL0IsR0FBZSxFQUFLLFVBQVUsRUFDaEMsQ0FFRixFQUFNLEdBQUcsUUFBVSxHQUFTLENBQ3hCLEdBQUksSUFBUyxFQUNULEVBQVEsRUFBTyxNQUFNLENBQUMsS0FDbkIsQ0FDSCxJQUFNLEVBQWUsaUNBQWlDLEVBQUssSUFBSSxJQUMvRCxLQUFLLE9BQU8sTUFBTSxFQUFjLENBQzVCLE1BQ0EsT0FDQSxPQUNBLGNBQ0gsQ0FBQyxDQUVGLEVBQU8sSUFBSUEsR0FBZSxFQUFjLEVBQVEsRUFBSyxFQUFLLENBQUMsR0FFakUsQ0FFRixFQUFNLEdBQUcsUUFBVSxHQUFVLENBQ3pCLEtBQUssT0FBTyxNQUFNLDBCQUEyQixDQUN6QyxNQUNBLE9BQ0EsTUFBTyxFQUFNLFFBQ2hCLENBQUMsQ0FDRixFQUFPLEVBQU0sRUFDZixFQUNKLEdDcElXLEdBQXJCLEtBR0UsQ0FDRSxZQUNJLEVBQ0EsRUFDQSxFQUErQixLQUNqQyxDQUhZLEtBQUEsT0FBQSxFQUNBLEtBQUEsSUFBQSxFQUNBLEtBQUEsV0FBQSxFQUdkLFVBQWdDLENBQzVCLE9BQU8sS0FBSyxPQUFPLElBQWUsS0FBSyxJQUFLLEVBQUUsQ0FBQyxDQUduRCxTQUFtQixFQUF3QixDQUN2QyxLQUFLLE9BQU8sSUFBSSxLQUFLLElBQUssRUFBTSxDQUtwQyxNQUFhLEVBQStCLENBQ3hDLE9BQU8sS0FBSyxVQUFVLENBRzFCLE1BQU0sTUFBTSxFQUFxQyxDQUM3QyxPQUFPLEtBQUssTUFBTSxFQUFRLENBQUMsT0FHL0IsTUFBTSxTQUFTLEVBQTBELENBQ3JFLElBQUksRUFBUSxLQUFLLE1BQU0sRUFBUSxDQUUvQixHQUFJLEdBQVMsUUFBUyxDQUNsQixJQUFNLEVBQVMsTUFBTSxRQUFRLEVBQVEsUUFBUSxDQUFHLEVBQVEsUUFBVSxDQUFDLEVBQVEsUUFBUSxDQUM3RSxFQUFhLE1BQU0sUUFBUSxFQUFRLGVBQWUsQ0FDbEQsRUFBUSxlQUNSLENBQUMsRUFBUSxnQkFBa0IsTUFBTSxDQUV2QyxFQUFRLEdBQVEsRUFBTyxFQUFRLEVBQVcsQ0FXOUMsT0FSSSxHQUFTLFNBQ1QsRUFBUSxFQUFNLE1BQU0sRUFBUSxPQUFPLEVBR25DLEdBQVMsUUFDVCxFQUFRLEVBQU0sTUFBTSxFQUFHLEVBQVEsTUFBTSxFQUdsQyxFQUdYLE1BQU0sUUFBUSxFQUE2QyxDQUd2RCxPQUZjLEtBQUssTUFBTSxFQUFRLENBRXBCLElBQU0sS0FHdkIsTUFBTSxTQUFTLEVBQVksRUFBNkMsQ0FHcEUsT0FGYyxLQUFLLE1BQU0sRUFBUSxDQUVwQixLQUFLLEdBQVMsRUFBYSxLQUFLLGNBQWdCLEVBQUcsRUFBSSxLQUd4RSxNQUFNLGVBQWUsRUFBWSxFQUFzQyxDQUNuRSxJQUFNLEVBQU8sTUFBTSxLQUFLLFNBQVMsRUFBSSxFQUFRLENBRTdDLEdBQUksQ0FBQyxFQUNELE1BQU0sSUFBSSxFQUFjLGlCQUFrQixJQUFJLENBR2xELE9BQU8sRUFHWCxNQUFNLFNBQVMsRUFBb0UsQ0FDL0UsSUFBTSxFQUFPLEdBQVMsTUFBUSxFQUN4QixFQUFRLEdBQVMsT0FBUyxHQUMxQixHQUFVLEVBQU8sR0FBSyxFQUV0QixDQUFDLEVBQU8sR0FBUyxNQUFNLFFBQVEsSUFBSSxDQUNyQyxLQUFLLFNBQVMsQ0FBRSxHQUFHLEVBQVMsUUFBTyxTQUFRLENBQVEsQ0FDbkQsS0FBSyxNQUFNLEVBQWUsQ0FDN0IsQ0FBQyxDQUVGLE1BQU8sQ0FDSCxRQUNBLE9BQ0EsU0FBVSxFQUNWLFFBQ0EsWUFBYSxLQUFLLEtBQUssRUFBUSxFQUFNLENBQ3hDLENBR0wsTUFBTSxPQUFPLEVBQTBDLENBQ25ELElBQU0sRUFBUSxLQUFLLFVBQVUsQ0FFdkIsRUFBTyxFQUNSLEtBQUssWUFBYSxHQUFVLENBQzdCLEdBQUcsRUFDTixDQUtELE9BSEEsRUFBTSxLQUFLLEVBQUssQ0FDaEIsS0FBSyxTQUFTLEVBQU0sQ0FFYixFQUdYLE1BQU0sV0FBVyxFQUE4QyxDQUMzRCxJQUFNLEVBQVEsS0FBSyxVQUFVLENBRXZCLEVBQVUsRUFBSyxJQUFJLElBQU0sRUFDMUIsS0FBSyxZQUFhLEdBQVUsQ0FDN0IsR0FBRyxFQUNOLEVBQWEsQ0FJZCxPQUZBLEtBQUssU0FBUyxDQUFDLEdBQUcsRUFBTyxHQUFHLEVBQVEsQ0FBQyxDQUU5QixFQUdYLE1BQU0sV0FBVyxFQUFZLEVBQTBDLENBQ25FLElBQU0sRUFBUSxLQUFLLFVBQVUsQ0FDdkIsRUFBUSxFQUFNLFVBQVUsR0FBUyxFQUFhLEtBQUssY0FBZ0IsRUFBRyxDQUU1RSxHQUFJLElBQVUsR0FDVixNQUFNLElBQUksRUFBYyxpQkFBa0IsSUFBSSxDQU1sRCxNQUhBLEdBQU0sR0FBUyxDQUFFLEdBQUcsRUFBTSxHQUFRLEdBQUcsRUFBTSxDQUMzQyxLQUFLLFNBQVMsRUFBTSxDQUViLEVBQU0sR0FHakIsTUFBTSxXQUFXLEVBQTJCLENBQ3hDLE1BQU0sS0FBSyxlQUFlLEVBQUcsQ0FFN0IsSUFBTSxFQUFRLEtBQUssVUFBVSxDQUFDLE9BQU8sR0FBUyxFQUFhLEtBQUssY0FBZ0IsRUFBRyxDQUVuRixLQUFLLFNBQVMsRUFBTSxDQUd4QixNQUFNLFdBQVcsRUFBdUQsQ0FDcEUsSUFBTSxFQUFXLEtBQUssTUFBTSxFQUFlLENBQ3JDLEVBQVEsR0FBUyxPQUFTLEVBQVMsT0FDbkMsRUFBYyxJQUFJLElBQ3BCLEVBQVMsTUFBTSxFQUFHLEVBQU0sQ0FBQyxJQUFJLEdBQVMsRUFBYSxLQUFLLFlBQVksQ0FDdkUsQ0FFSyxFQUFZLEtBQUssVUFBVSxDQUFDLE9BQU8sR0FBUSxDQUFDLEVBQVksSUFBSyxFQUFhLEtBQUssWUFBWSxDQUFDLENBRWxHLEtBQUssU0FBUyxFQUFVLEdDaElYLEVBQXJCLEtBSUUsQ0FDRSxZQUNJLEVBQ0EsRUFDQSxFQUNGLENBSFksS0FBQSxHQUFBLEVBQ0EsS0FBQSxNQUFBLEVBQ0EsS0FBQSxXQUFBLEVBSWQsTUFBYSxFQUFtQyxDQUc1QyxPQUZXLEdBQVMsSUFBTSxLQUFLLEdBQUcsV0FBVyxLQUFLLE1BQWEsQ0FLbkUsTUFBTSxNQUFNLEVBQStCLENBQ3ZDLElBQUksRUFBSyxLQUFLLE1BQU0sRUFBZSxDQUVuQyxFQUFLLEVBQUcsT0FBUSxHQUFZLEVBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FFekQsSUFBTSxFQUFTLE1BQU0sRUFBRyx5QkFBeUIsQ0FFakQsT0FBTyxPQUFPLEVBQU8sTUFBTSxDQUcvQixNQUFNLFNBQVMsRUFBMEQsQ0FDckUsSUFBSSxFQUFLLEtBQUssTUFBTSxFQUFRLENBWTVCLEdBVkEsRUFBSyxFQUFHLFdBQVcsQ0FFZixHQUFTLFFBQ1QsRUFBSyxFQUFHLE1BQU0sRUFBUSxNQUFNLEVBRzVCLEdBQVMsU0FDVCxFQUFLLEVBQUcsT0FBTyxFQUFRLE9BQU8sRUFHOUIsR0FBUyxRQUFTLENBQ2xCLElBQU0sRUFBVSxNQUFNLFFBQVEsRUFBUSxRQUFRLENBQUcsRUFBUSxRQUFVLENBQUMsRUFBUSxRQUFRLENBQzlFLEVBQWlCLE1BQU0sUUFBUSxFQUFRLGVBQWUsQ0FBRyxFQUFRLGVBQWlCLENBQUMsRUFBUSxnQkFBa0IsTUFBTSxDQUV6SCxFQUFRLFNBQVMsRUFBSSxJQUFVLENBQzNCLEVBQUssRUFBRyxRQUFRLEVBQUksRUFBZSxJQUFVLE1BQU0sRUFDckQsQ0FHTixPQUFPLE1BQU0sRUFBRyxTQUFTLENBRzdCLE1BQU0sUUFBUSxFQUE2QyxDQUN2RCxJQUFJLEVBQUssS0FBSyxNQUFNLEVBQWUsQ0FNbkMsTUFKQSxHQUFLLEVBQUcsV0FBVyxDQUVOLE1BQU0sRUFBRyxrQkFBa0IsQ0FLNUMsTUFBTSxTQUFTLEVBQWlCLEVBQTZDLENBQ3pFLElBQUksRUFBSyxLQUFLLE1BQU0sRUFBZSxDQVFuQyxNQU5BLEdBQUssRUFBRyxXQUFXLENBRW5CLEVBQUssRUFBRyxNQUFNLEtBQUssV0FBWSxJQUFLLEVBQUcsQ0FFMUIsTUFBTSxFQUFHLGtCQUFrQixDQUs1QyxNQUFNLGVBQWUsRUFBaUIsRUFBb0IsQ0FDdEQsSUFBTSxFQUFPLE1BQU0sS0FBSyxTQUFTLEVBQUksRUFBUSxDQUU3QyxHQUFJLENBQUMsRUFDRCxNQUFNLElBQUksRUFBYyxpQkFBa0IsSUFBSSxDQUdsRCxPQUFPLEVBR1gsTUFBYSxTQUFTLEVBQTJELENBQzdFLElBQU0sRUFBTyxHQUFTLE1BQVEsRUFDeEIsR0FBVSxFQUFPLElBQU0sR0FBUyxPQUFTLElBQ3pDLEVBQVEsR0FBUyxPQUFTLEdBRTFCLEVBQWlCLENBQ25CLEdBQUcsRUFDSCxRQUNBLFNBQ0gsQ0FFSyxFQUFlLENBQUUsR0FBRyxFQUFTLENBRTdCLENBQUMsRUFBTyxHQUFjLE1BQU0sUUFBUSxJQUFJLENBQzFDLEtBQUssU0FBUyxFQUFzQixDQUNwQyxLQUFLLE1BQU0sRUFBb0IsQ0FDbEMsQ0FBQyxDQUVGLE1BQU8sQ0FDSCxRQUNBLE9BQ0EsU0FBVSxFQUNWLE1BQU8sRUFDUCxZQUFhLEtBQUssS0FBSyxFQUFhLEVBQU0sQ0FDN0MsQ0FHTCxNQUFhLE9BQU8sRUFBd0IsQ0FDeEMsSUFBSSxFQUFLLEtBQUssR0FBRyxXQUFXLEtBQUssTUFBYSxDQU05QyxNQUpBLEdBQUssRUFBRyxPQUFPLEVBQUssQ0FBQyxjQUFjLENBRXBCLE1BQU0sRUFBRyxrQkFBa0IsQ0FLOUMsTUFBYSxXQUFXLEVBQTBCLENBQzlDLElBQUksRUFBSyxLQUFLLEdBQUcsV0FBVyxLQUFLLE1BQWEsQ0FNOUMsTUFKQSxHQUFLLEVBQUcsT0FBTyxFQUFLLENBQUMsY0FBYyxDQUVwQixNQUFNLEVBQUcsU0FBUyxDQUtyQyxNQUFhLFdBQVcsRUFBaUIsRUFBd0IsQ0FDN0QsSUFBTSxFQUFNLE1BQU0sS0FBSyxlQUFlLEVBQUcsQ0FFckMsRUFBSyxLQUFLLEdBQUcsWUFBWSxLQUFLLE1BQWEsQ0FFL0MsRUFBSyxFQUFHLElBQUksRUFBSyxDQUNaLE1BQU0sS0FBSyxXQUFZLElBQUssRUFBSSxLQUFLLFlBQVksQ0FDakQsY0FBYyxDQUVuQixNQUFNLEVBQUcsa0JBQWtCLENBRy9CLE1BQWEsV0FBVyxFQUFpQixDQUNyQyxJQUFNLEVBQU0sTUFBTSxLQUFLLGVBQWUsRUFBRyxDQUVyQyxFQUFLLEtBQUssR0FBRyxXQUFXLEtBQUssTUFBYSxDQUU5QyxFQUFLLEVBQUcsTUFBTSxLQUFLLFdBQVksSUFBSyxFQUFJLEtBQUssWUFBWSxDQUV6RCxNQUFNLEVBQUcsa0JBQWtCLENBRy9CLE1BQU0sV0FBVyxFQUF3QyxDQUNyRCxJQUFNLEVBQWdCLENBQ2xCLEdBQUcsRUFDSCxHQUFJLEtBQUssR0FBRyxXQUFXLEtBQUssTUFBYSxDQUM1QyxDQUVHLEVBQUssS0FBSyxNQUFNLEVBQXFCLENBRXJDLEdBQVMsUUFDVCxFQUFLLEVBQUcsTUFBTSxFQUFRLE1BQU0sRUFHaEMsTUFBTSxFQUFHLFNBQVMsR0N0TEwsR0FBckIsY0FBNEMsQ0FJMUMsQ0FDRSxZQUFZLEVBQThCLENBQ3RDLE1BQU0sRUFBSSxRQUFTLEtBQUssQ0FHNUIsTUFBYSxFQUFzQyxDQUMvQyxJQUFJLEVBQUssTUFBTSxNQUFNLEVBQWUsQ0FFcEMsR0FBSSxHQUFTLEdBQUksQ0FDYixJQUFNLEVBQU0sTUFBTSxRQUFRLEVBQVEsR0FBRyxDQUFHLEVBQVEsR0FBSyxDQUFDLEVBQVEsR0FBRyxDQUVqRSxFQUFLLEVBQUcsTUFBTSxLQUFNLEtBQU0sRUFBSSxDQXFCbEMsT0FsQkksR0FBUyxTQUNULEVBQUssRUFBRyxNQUFNLGdCQUFpQixPQUFRLElBQUksRUFBUSxPQUFPLEdBQUcsRUFHN0QsR0FBUyxTQUFTLFNBQ2xCLEVBQUssRUFBRyxNQUFNLFlBQWEsS0FBTSxFQUFRLFFBQVEsRUFHakQsR0FBUyxhQUFhLFNBQ3RCLEVBQUssRUFBRyxNQUFNLGdCQUFpQixLQUFNLEVBQVEsWUFBWSxFQUd6RCxHQUFTLFFBR1QsRUFGMEIsSUFBSSxHQUFxQixFQUFRLE1BQU8sYUFBYyxVQUFVLENBRW5FLE1BQU0sRUFBRyxFQUc3QixJQ3ZDTSxHQUFyQixjQUE0RCxDQUkxRCxDQUNFLFlBQVksRUFBOEIsQ0FDdEMsTUFBTSxFQUFJLDBCQUEyQixLQUFLLENBRzlDLE1BQWEsRUFBc0QsQ0FDL0QsSUFBSSxFQUFLLE1BQU0sTUFBTSxFQUFlLENBRXBDLEdBQUksR0FBUyxHQUFJLENBQ2IsSUFBTSxFQUFNLE1BQU0sUUFBUSxFQUFRLEdBQUcsQ0FBRyxFQUFRLEdBQUssQ0FBQyxFQUFRLEdBQUcsQ0FFakUsRUFBSyxFQUFHLE1BQU0sS0FBTSxLQUFNLEVBQUksQ0FHbEMsR0FBSSxHQUFTLGFBQWMsQ0FDdkIsSUFBTSxFQUFnQixNQUFNLFFBQVEsRUFBUSxhQUFhLENBQUcsRUFBUSxhQUFlLENBQUMsRUFBUSxhQUFhLENBRXpHLEVBQUssRUFBRyxNQUFNLGdCQUFpQixLQUFNLEVBQWMsQ0FHdkQsR0FBSSxHQUFTLGFBQWMsQ0FDdkIsSUFBTSxFQUFnQixNQUFNLFFBQVEsRUFBUSxhQUFhLENBQUcsRUFBUSxhQUFlLENBQUMsRUFBUSxhQUFhLENBRXpHLEVBQUssRUFBRyxNQUFNLGdCQUFpQixLQUFNLEVBQWMsQ0FHdkQsR0FBSSxHQUFTLGVBQWdCLENBQ3pCLElBQU0sRUFBa0IsTUFBTSxRQUFRLEVBQVEsZUFBZSxDQUFHLEVBQVEsZUFBaUIsQ0FBQyxFQUFRLGVBQWUsQ0FFakgsRUFBSyxFQUFHLE1BQU0sa0JBQW1CLEtBQU0sRUFBZ0IsQ0FHM0QsT0FBTyxJQ3RDTSxHQUFyQixjQUFrRCxDQUloRCxDQUNFLFlBQVksRUFBOEIsQ0FDdEMsTUFBTSxFQUFJLGNBQWUsS0FBSyxDQUdsQyxNQUFhLEVBQTRDLENBQ3JELElBQUksRUFBSyxNQUFNLE1BQU0sRUFBZSxDQUVwQyxHQUFJLEdBQVMsR0FBSSxDQUNiLElBQU0sRUFBTSxNQUFNLFFBQVEsRUFBUSxHQUFHLENBQUcsRUFBUSxHQUFLLENBQUMsRUFBUSxHQUFHLENBRWpFLEVBQUssRUFBRyxNQUFNLEtBQU0sS0FBTSxFQUFJLENBT2xDLE9BSkksR0FBUyxTQUNULEVBQUssRUFBRyxNQUFNLE9BQVEsT0FBUSxJQUFJLEVBQVEsT0FBTyxHQUFHLEVBR2pELElDWGYsU0FBd0IsSUFBcUgsQ0FDekksT0FBTyxTQUFxQyxFQUFhLENBQ3JELE1BQWUsVUFBcUIsQ0FBSyxFQWtCekMsT0FBTyxHQzVCZixJQUFxQixHQUFyQixjQUE2QyxFQUN6QyxHQUFNLEVBQW1CLENBQ3pCQyxJQUEwRSxDQUM3RSxBQUFDLENBRUUsWUFBWSxFQUE4QixDQUN0QyxNQUFNLEVBQUksU0FBVSxLQUFLLENBRzdCLE1BQWEsRUFBdUMsQ0FDaEQsSUFBSSxFQUFLLE1BQU0sTUFBTSxFQUFlLENBRXBDLEdBQUksR0FBUyxHQUFJLENBQ2IsSUFBTSxFQUFNLE1BQU0sUUFBUSxFQUFRLEdBQUcsQ0FBRyxFQUFRLEdBQUssQ0FBQyxFQUFRLEdBQUcsQ0FFakUsRUFBSyxFQUFHLE1BQU0sS0FBTSxLQUFNLEVBQUksQ0FPbEMsR0FKSSxHQUFTLFNBQ1QsRUFBSyxFQUFHLE1BQU0sT0FBUSxPQUFRLElBQUksRUFBUSxPQUFPLEdBQUcsRUFHcEQsR0FBUyxLQUFNLENBQ2YsSUFBTSxFQUFRLE1BQU0sUUFBUSxFQUFRLEtBQUssQ0FBRyxFQUFRLEtBQU8sQ0FBQyxFQUFRLEtBQUssQ0FFekUsRUFBSyxFQUFHLE1BQU0sT0FBUSxLQUFNLEVBQU0sQ0FHdEMsT0FBTyxFQUdYLE1BQWEsWUFBWSxFQUFzQyxDQUMzRCxJQUFJLEVBQUssS0FBSyxPQUFPLENBUXJCLE1BTkEsR0FBSyxFQUFHLFdBQVcsQ0FFbkIsRUFBSyxFQUFHLE1BQU0sUUFBUyxJQUFLLEVBQU0sQ0FFckIsTUFBTSxFQUFHLGtCQUFrQixFQUV6QixPQzFDRixHQUFyQixjQUE0QyxDQUFrRSxDQUMxRyxZQUFZLEVBQThCLENBQ3RDLE1BQU0sRUFBSSxRQUFTLEtBQUssQ0FHNUIsTUFBYSxFQUFzQyxFQUFFLENBQUUsQ0FDbkQsSUFBSSxFQUFRLE1BQU0sTUFBTSxFQUFRLENBaUJoQyxNQWZBLEdBQVEsRUFBTSxNQUFNLGFBQWMsS0FBTSxLQUFLLENBR3pDLEdBQVMsUUFDVCxFQUFRLEVBQU0sTUFBTSxRQUFTLElBQUssRUFBUSxNQUFNLEVBR2hELEdBQVMsV0FDVCxFQUFRLEVBQU0sTUFBTSxXQUFZLE9BQVEsSUFBSSxFQUFRLFNBQVMsR0FBRyxFQUdoRSxHQUFTLEtBQ1QsRUFBUSxFQUFNLE1BQU0sS0FBTSxJQUFLLEVBQVEsR0FBRyxFQUd2QyxJQ3hCZixNQUFNLEdBQVksR0FBVSxHQUFLLENBbUJqQyxTQUFTLEdBQW9CLEVBQXVCLENBQ2hELE1BQU8sSUFBSSxFQUFNLFFBQVEsS0FBTSxRQUFRLENBQUMsR0FHNUMsSUFBYSxHQUFiLEtBQXdCLENBQ3BCLElBQ0EsT0FDQSxXQUNBLGtCQUNBLE9BQXlDLElBQUksRUFDN0MsTUFFQSxZQUFZLEVBQTRCLENBQ3BDLE9BQU8sT0FBTyxLQUFNLEVBQVEsQ0FHaEMsTUFBYyxVQUFXLENBQ3JCLElBQU0sRUFBUyxDQUNYLFdBQVksSUFBQSxHQUNaLElBQUssUUFBUSxJQUNiLFFBQVMsU0FBWSxHQUN4QixDQU9ELEdBTEksS0FBSyxhQUNMLEVBQU8sSUFBSSxnQkFBa0IsVUFBVSxHQUFvQixLQUFLLFdBQVcsQ0FBQyw4QkFDNUUsRUFBTyxXQUFhLEtBQUssWUFHekIsS0FBSyxPQUFRLENBQ2IsSUFBTSxFQUFXLEtBQUssbUJBQXFCQyxHQUFLLElBQVEsQ0FBRSxlQUFlLElBQVksR0FBRyxDQUV4RixNQUFNLEdBQVUsRUFBVSxLQUFLLE9BQVEsQ0FBRSxLQUFNLElBQU8sQ0FBQyxDQUV2RCxFQUFPLElBQUksZ0JBQWtCLFVBQVUsR0FBb0IsRUFBUyxDQUFDLDhCQUNyRSxFQUFPLFdBQWEsRUFDcEIsRUFBTyxRQUFVLFNBQVksQ0FDekIsR0FBSSxDQUNBLE1BQU0sR0FBTyxFQUFTLE9BQ2pCLEVBQUssQ0FDVixLQUFLLE9BQU8sS0FBSyw0Q0FBNEMsSUFBWSxDQUFFLE1BQU8sRUFBSyxDQUFDLEdBS3BHLE9BQU8sRUFHWCxNQUFNLElBQUksRUFBK0IsQ0FFckMsR0FBTSxDQUFFLE1BQUssYUFBWSxXQUFZLE1BQU0sS0FBSyxVQUFVLENBRXRELEtBQUssT0FDTCxLQUFLLE9BQU8sTUFBTSxPQUFTLEVBQU0sQ0FDN0IsSUFBSyxLQUFLLElBQ1YsYUFDSCxDQUFDLENBR04sR0FBSSxDQUNBLEdBQU0sQ0FBRSxVQUFXLE1BQU0sR0FBVSxPQUFPLElBQVEsQ0FDOUMsSUFBSyxLQUFLLElBQ1YsTUFDSCxDQUFDLENBQ0YsT0FBTyxFQUFPLE1BQU0sUUFDZCxDQUNOLE1BQU0sR0FBUyxFQUl2QixNQUFNLE9BQU8sRUFBc0MsQ0FDL0MsR0FBSSxDQUNBLE9BQU8sTUFBTSxLQUFLLElBQUksRUFBSyxNQUN2QixDQUNKLE9BQU8sTUFJZixNQUFNLFNBQVMsRUFBNEIsQ0FDdkMsTUFBTSxLQUFLLElBQUksWUFBWSxJQUFNLENBR3JDLE1BQU0sT0FBdUIsQ0FDekIsTUFBTSxLQUFLLElBQUksc0JBQXNCLENBR3pDLE1BQU0sTUFBc0IsQ0FDeEIsTUFBTSxLQUFLLE9BQU8sQ0FFRCxNQUFNLEtBQUssT0FBTywwREFBMEQsRUFHekYsTUFBTSxLQUFLLElBQUksaUJBQWlCLENBSXhDLE1BQU0sU0FBZ0MsQ0FDbEMsSUFBTSxFQUFPLE1BQU0sS0FBSyxJQUFJLDhCQUE4QixDQUNwRCxFQUFpQixJQUFTLE9BRTFCLEVBQVksTUFBTSxLQUFLLElBQUkseUJBQXlCLENBRXBELEVBQWdCLE1BQU0sS0FBSyxPQUFPLFNBQVMsQ0FDM0MsRUFBVSxFQUNWLEVBQWMsTUFBTTtFQUFLLENBQUMsT0FBTyxRQUFRLENBQ3pDLEVBQUUsQ0FFUixNQUFPLENBQ0gsVUFBVyxLQUFLLElBQ2hCLEtBQU0sRUFBaUIsS0FBTyxFQUM5QixZQUNBLGlCQUNBLFVBQ0gsR0MzSFQsTUFBYSxNQUFhLEVBQVcsb0JDUHJDLGVBQXNCLEdBQTJELEVBQVUsRUFBOEIsQ0FDckgsSUFBSSxFQUFRQyxFQUFHLFdBQVcsRUFBTSxDQUU1QixHQUFTLFFBQ1QsRUFBUSxFQUFRLE1BQU1BLEVBQUcsV0FBVyxFQUFNLENBQUMsRUFHL0MsRUFBUSxFQUNILGFBQWEsQ0FDYixjQUFjLENBQ2QsT0FBUSxHQUFZLEVBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FFbEQsR0FBUyxPQUNULFFBQVEsSUFBSSxFQUFNLFNBQVMsQ0FBQyxDQUdoQyxJQUFNLEVBQU0sTUFBTyxFQUFjLGtCQUFrQixDQUVuRCxPQUFPLE9BQU8sR0FBSyxPQUFTLEVBQUUsdUNDeEJsQyxTQUFnQkMsR0FBSyxFQUE0QyxDQUM3RCxHQUFJLElBQVUsS0FDVixPQUFPLEtBR1gsSUFBTSxFQUFXQyxFQUFXLDZCQVU1QixPQVJJLElBQVksVUFJWixJQUFZLFFBQ0wsRUFBTyxJQUFJLEtBQUssRUFBTSxDQUFFLHNCQUFzQixDQUdsRCxJQUFJLEtBQUssRUFBTSxDQUFDLGFBQWEsQ0FHeEMsU0FBZ0JDLEdBQU8sRUFBbUMsQ0FLdEQsT0FKSSxJQUFVLEtBQ0gsS0FHSixJQUFJLEtBQUssRUFBTSxDQzFCMUIsU0FBZ0JDLEdBQUssRUFBc0MsQ0FLdkQsT0FKSSxJQUFVLEtBQ0gsS0FHSixLQUFLLFVBQVUsRUFBTSxDQ0hoQyxNQUFNLEdBQUssRUFFWCxTQUFnQkMsR0FBSyxFQUFnQyxDQVdqRCxPQVZJLElBQVUsS0FDSCxLQUdLLEdBQUcsK0JBRUgsU0FDTCxLQUdKLDBDQ1hYLFNBQWdCLEdBQUssRUFBOEIsQ0FFL0MsSUFBTSxFQUFTLENBQUUsR0FBRyxFQUFTLENBRTdCLElBQUssSUFBTSxLQUFPLEVBQ1YsRUFBTyxhQUFnQixPQUN2QixFQUFPLEdBQU9DLEdBQWMsRUFBTyxHQUFLLEVBR3hDLE9BQU8sRUFBTyxJQUFTLFdBQ3ZCLEVBQU8sR0FBT0MsR0FBVSxFQUFPLEdBQUssRUFHcEMsT0FBTyxFQUFPLElBQVMsWUFDdkIsRUFBTyxHQUFPQyxHQUFhLEVBQU8sR0FBSyxFQUd2QyxNQUFNLFFBQVEsRUFBTyxHQUFLLEdBQzFCLEVBQU8sR0FBT0QsR0FBVSxFQUFPLEdBQUssRUFJNUMsT0FBTyxFQUdYLFNBQWdCLEdBQU8sRUFBNEIsQ0FDL0MsSUFBTSxFQUFTLENBQUUsR0FBRyxFQUFPLENBRTNCLElBQUssSUFBTSxLQUFPLEVBQ2QsRUFBTyxHQUFPLFdBQVcsRUFBTyxHQUFLLENBR3pDLE9BQU8sRUNqQ1gsTUFBTSxHQUFjLENBQ2hCLElBQUEsR0FDQSxTQUFBLEdBQ0gsQ0NPRCxlQUFzQixHQUFvRSxFQUFVLEVBQWEsQ0FDN0csSUFBTSxFQUFVLEdBQVMsUUFBVSxFQUFFLENBR2pDLEVBQVcsTUFGQUUsRUFBRyxXQUFXLEVBQU0sQ0FBQyxPQUFPLEVBQU8sQ0FFdEIsY0FBYyxDQUFDLGtCQUFrQixDQU03RCxPQUpJLEdBQVMsWUFDVCxFQUFNLEVBQVEsVUFBVSxFQUFJLEVBR3pCLEVBR1gsZUFBc0IsR0FBa0UsRUFBVSxFQUFhLENBQzNHLElBQU0sRUFBVSxHQUFTLFFBQVUsRUFBRSxDQUMvQixFQUFTQSxFQUFHLFdBQVcsRUFBTSxDQUFDLE9BQU8sRUFBTyxDQUU1QyxFQUFjLEdBQVMsWUFBYyxLQUlyQyxHQUZTLE1BQU0sRUFBTyxrQkFBa0IsRUFFdEIsU0FJcEIsRUFBTSxNQUZLQSxFQUFHLFdBQVcsRUFBTSxDQUFDLFdBQVcsQ0FHMUMsTUFBTSxFQUFZLElBQUssRUFBUyxDQUNoQyxrQkFBa0IsQ0FNdkIsT0FKSSxHQUFTLFlBQ1QsRUFBTSxFQUFRLFVBQVUsRUFBSSxFQUd6QixFQUlYLGVBQXNCLEVBQTZELEVBQVUsRUFBYSxDQUN0RyxJQUFJLEVBQWMsR0FBUyxRQUFVLEVBQUUsQ0FFakMsRUFBWSxPQUFPLEdBQVMsV0FBYyxXQUFhLEdBQVMsVUFBWSxHQUFZLElBQUksS0FFOUYsR0FBUyxZQUFjLEtBQ3ZCLEVBQVMsRUFBVSxFQUFPLEVBRzlCLElBQU0sRUFBZ0IsQ0FDbEIsR0FBRyxFQUNILFNBQ0gsQ0FNRCxPQUpJQSxFQUFHLFNBQVcsUUFDUCxHQUFZLEVBQU8sRUFBYyxDQUdyQyxHQUFjLEVBQU8sRUFBYyxDQ3pEOUMsZUFBc0IsRUFBK0QsRUFBVSxFQUFhLENBQ3hHLElBQUksRUFBYSxHQUFTLE1BQ3BCLEVBQVEsTUFBTUMsRUFBRyxXQUFXLEVBQU0sQ0FBQyxDQUNuQ0EsRUFBRyxXQUFXLEVBQU0sQ0FFdEIsR0FBUyxRQUNULEVBQVEsRUFBTSxNQUFPLEdBQVksRUFBUSxNQUFPLEVBQUcsQ0FBQyxFQUd4RCxNQUFNLEVBQU0sU0FBUyxDQ1B6QixlQUFzQixFQUF5RCxFQUFVLEVBQWEsQ0FDbEcsSUFBSSxFQUFTLEdBQVMsT0FBU0MsRUFBRyxXQUFXLEVBQU0sQ0FBQyxXQUFXLENBRTNELEdBQVMsUUFDVCxFQUFRLEVBQVEsTUFBTUEsRUFBRyxXQUFXLEVBQU0sQ0FBQyxFQUczQyxHQUFTLFFBQ1QsRUFBUSxFQUFNLE1BQU8sR0FBWSxFQUFRLE1BQU8sRUFBRyxDQUFDLEVBR3BELEdBQVMsUUFDVCxFQUFRLEVBQU0sTUFBTSxFQUFRLE1BQU0sRUFHbEMsR0FBUyxTQUNULEVBQVEsRUFBTSxPQUFPLEVBQVEsT0FBTyxFQUdwQyxHQUFTLE9BQ1QsUUFBUSxJQUFJLEVBQU0sU0FBUyxDQUFDLENBR2hDLElBQUksRUFBYyxNQUFNLEVBQU0sU0FBUyxDQU12QyxPQUpJLEdBQVMsWUFDVCxFQUFPLEVBQUssSUFBSSxFQUFRLFVBQVUsRUFHL0IsRUN0Q1gsZUFBc0IsR0FBMkQsRUFBVSxFQUFhLENBS3BHLE1BQU8sQ0FBQyxFQUpLLE1BQU0sRUFBSyxFQUFPLEVBQVEsRUFFcEIsR0NLdkIsZUFBc0IsRUFBK0QsRUFBVSxFQUFhLENBQ3hHLElBQUksRUFBUUMsRUFBRyxXQUFXLEVBQU0sQ0FBQyxXQUFXLENBRXhDLEdBQVMsUUFDVCxFQUFRLEVBQVEsTUFBTSxFQUFNLEVBRzVCLEdBQVMsUUFDVCxFQUFRLEVBQU0sTUFBTyxHQUFZLEVBQVEsTUFBTyxFQUFHLENBQUMsRUFHeEQsSUFBTSxFQUFXLE1BQU0sRUFBTSxNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsQ0FVeEQsT0FSSyxFQUlELEdBQVMsVUFDRixFQUFRLFVBQVUsRUFBSSxDQUcxQixFQVBJLEtBVWYsZUFBc0IsRUFBcUUsRUFBVSxFQUFhLENBQzlHLElBQU0sRUFBUSxNQUFNLEVBQVEsRUFBTyxFQUFRLENBRTNDLEdBQUksQ0FBQyxFQUVELE1BQU0sSUFBSSxFQUFjLEdBRFgsR0FBUyxNQUFRLFNBQ0UsWUFBYSxJQUFJLENBR3JELE9BQU8sRUM5QlgsZUFBc0IsR0FBMkUsRUFBVSxFQUFhLENBQ3BILElBQU0sRUFBUSxNQUFNLEVBQUssRUFBTyxDQUM1QixNQUFPLEdBQVMsTUFDaEIsVUFBVyxHQUFTLFVBQ3BCLE1BQU8sR0FBUyxNQUNoQixVQUFhLENBQ1QsSUFBSSxFQUFhLEdBQVMsT0FDcEIsRUFBUSxPQUFPQyxFQUFHLFdBQVcsRUFBTSxDQUFDLENBQ3BDQSxFQUFHLFdBQVcsRUFBTSxDQUFDLFdBQVcsQ0FNdEMsT0FKSSxHQUFTLFFBQ1QsRUFBUSxFQUFNLE1BQU8sR0FBWSxFQUFRLE1BQU8sRUFBRyxDQUFDLEVBR2pELEVBQU0sTUFBTSxFQUFFLEVBRTVCLENBQUMsQ0FZRixPQVZJLEVBQU0sT0FBUyxFQUNSLEVBQU0sR0FHRCxNQUFNLEVBQU8sRUFBTyxDQUNoQyxNQUFPLEdBQVMsTUFDaEIsVUFBVyxHQUFTLFVBQ3BCLE9BQVEsR0FBUyxPQUNwQixDQUFDLENDakJOLGVBQXNCLEdBQWlFLEVBQVUsRUFBYSxDQUMxRyxJQUFNLEVBQU8sR0FBUyxNQUFRLEVBQVEsS0FBTyxFQUFJLEVBQVEsS0FBTyxFQUMxRCxFQUFRLEdBQVMsT0FBUyxFQUFRLE1BQVEsRUFBSSxFQUFRLE1BQVEsR0FDOUQsR0FBVSxFQUFPLEdBQUssRUFDdEIsRUFBVSxHQUFTLFVBQVksTUFBTSxRQUFRLEVBQVEsUUFBUSxDQUFHLEVBQVEsUUFBVSxDQUFDLEVBQVEsUUFBUSxFQUNuRyxFQUFZLEdBQVMsWUFBYyxNQUFNLFFBQVEsRUFBUSxVQUFVLENBQUcsRUFBUSxVQUFZLENBQUMsRUFBUSxVQUFVLEVBRTdHLEVBQVEsTUFBTSxFQUFLLEVBQU8sQ0FDNUIsVUFBVyxHQUFTLFVBQ3BCLFVBQWEsQ0FDVCxJQUFJLEVBQWFDLEVBQUcsV0FBVyxFQUFNLENBQUMsV0FBVyxDQTRCakQsT0ExQkksR0FBUyxRQUNULEVBQVEsRUFBUSxNQUFNQSxFQUFHLFdBQVcsRUFBTSxDQUFDLEVBRzNDLEdBQVMsUUFDVCxFQUFRLEVBQU0sTUFBTyxHQUFZLEVBQVEsTUFBTyxFQUFHLENBQUMsRUFHcEQsR0FDQSxFQUNLLEtBQUssRUFBSyxJQUFNLENBQUMsRUFBSyxHQUFhLEVBQVUsR0FBSyxFQUFVLEdBQUssTUFBTSxDQUFVLENBQ2pGLFNBQVMsQ0FBQyxFQUFLLEtBQWUsQ0FDM0IsRUFBUSxFQUFNLFFBQVEsRUFBZSxFQUFVLEVBQ2pELENBR04sRUFBUSxJQUNSLEVBQVEsRUFBTSxNQUFNLEVBQU0sQ0FBQyxPQUFPLEVBQU8sRUFLekMsR0FBUyxPQUNULFFBQVEsSUFBSSxFQUFNLFNBQVMsQ0FBQyxDQUd6QixHQUVkLENBQUMsQ0FFSSxFQUFRLE1BQU0sR0FBTSxFQUFPLENBQzdCLFVBQWEsQ0FDVCxJQUFJLEVBQWFBLEVBQUcsV0FBVyxFQUFNLENBQUMsV0FBVyxDQVVqRCxPQVJJLEdBQVMsUUFDVCxFQUFRLEVBQVEsTUFBTUEsRUFBRyxXQUFXLEVBQU0sQ0FBQyxFQUczQyxHQUFTLE9BQ1QsUUFBUSxJQUFJLEVBQU0sU0FBUyxDQUFDLENBR3pCLEdBRWQsQ0FBQyxDQUVGLE9BQU9DLEdBQVcsS0FBMkIsQ0FDbEMsUUFDUCxRQUNBLE9BQ0EsU0FBVSxFQUNWLFlBQWEsS0FBSyxLQUFLLEVBQVEsRUFBTSxDQUN4QyxDQUFDLENDN0ROLFNBQWdCLEdBQTZDLEVBQVksQ0FDckUsT0FBTyxFQUFHLE1BQU0sYUFBYyxLQUFNLEtBQUssQ0FHN0MsU0FBZ0IsR0FBVyxFQUFpQyxDQUN4RCxPQUFPLEVBQUcsR0FBRyxFQUFHLElBQUksYUFBYSxDQUFFLEtBQU0sS0FBSyxDQUdsRCxHQUFVLE9BQVUsR0FDUixHQUNHLEVBQUcsR0FBRyxFQUFLLEtBQU0sS0FBSyxDQUtyQyxNQUFhLEdBQVcsR0FDYixFQUFHLEdBQUcsYUFBYyxTQUFVLEtBQUssQ0FHakMsR0FBdUIsR0FDekIsRUFBSSxVQUFVLGFBQWMsWUFBWSxDQUduRCxlQUFzQixHQUFxRSxFQUFVLEVBQThDLENBQy9JLElBQUksRUFBYSxHQUFTLE1BQ3BCLEVBQVEsTUFBTUMsRUFBRyxZQUFZLEVBQU0sQ0FBQyxDQUNwQ0EsRUFBRyxZQUFZLEVBQU0sQ0FFM0IsRUFBUSxFQUFNLElBQUksQ0FBRSxXQUFZLEdBQUssQ0FBRSxDQUFDLENBQUMsTUFBTSxHQUFVLENBRXpELElBQUksRUFBYyxNQUFNLEVBQ25CLGNBQWMsQ0FDZCxTQUFTLENBTWQsT0FKSSxHQUFTLFlBQ1QsRUFBTyxFQUFLLElBQUksRUFBUSxVQUFVLEVBRy9CLEVBU1gsRUFBbUIsVUFBVSxvQkFBc0IsVUFFakQsQ0FDRSxPQUFPLEtBQUssVUFBVSxhQUFjLFlBQVksRUNuRXBELE1BQWEsR0FBb0IsR0FDdEIsRUFDRixVQUFVLGFBQWMsWUFBYyxHQUFTLEVBQUksVUFBVSxHQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FHMUUsR0FBb0IsR0FDdEIsRUFDRixVQUFVLGFBQWMsWUFBYyxHQUFTLEVBQUksVUFBVSxHQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FHMUUsR0FBdUIsR0FDekIsRUFDRixVQUFVLGFBQWMsWUFBYyxHQUFTLEVBQUksVUFBVSxHQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FDOUUsVUFBVSxhQUFjLFlBQWMsR0FBUyxFQUFJLFVBQVUsR0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBV3ZGLEVBQW1CLFVBQVUsb0JBQXNCLFVBRWpELENBQ0UsT0FBTyxLQUNGLFVBQVUsYUFBYyxZQUFjLEdBQVMsRUFBSSxVQUFVLEdBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUM5RSxVQUFVLGFBQWMsWUFBYyxHQUFTLEVBQUksVUFBVSxHQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFHdkYsRUFBbUIsVUFBVSxpQkFBbUIsVUFFOUMsQ0FDRSxPQUFPLEtBQ0YsVUFBVSxhQUFjLFlBQWMsR0FBUyxFQUFJLFVBQVUsR0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBR3ZGLEVBQW1CLFVBQVUsaUJBQW1CLFVBRTlDLENBQ0UsT0FBTyxLQUNGLFVBQVUsYUFBYyxZQUFjLEdBQVMsRUFBSSxVQUFVLEdBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQ3RDdkYsZUFBc0IsR0FBb0UsRUFBVSxFQUFhLENBQzdHLElBQU0sRUFBUyxHQUFTLFFBQVUsRUFBRSxDQUNoQyxFQUFRQyxFQUFHLFlBQVksRUFBTSxDQUVqQyxFQUFRLEVBQU0sSUFBSSxFQUFPLENBQUMsY0FBYyxDQUVwQyxHQUFTLFFBQ1QsRUFBUSxFQUFRLE1BQU0sRUFBTSxFQUc1QixHQUFTLFFBQ1QsRUFBUSxFQUFNLE1BQU8sR0FBWSxFQUFRLE1BQU8sRUFBRyxDQUFDLEVBR3BELEdBQVMsT0FDVCxRQUFRLElBQUksRUFBTSxTQUFTLENBQUMsQ0FHaEMsSUFBSSxFQUFjLE1BQU0sRUFBTSxTQUFTLENBTXZDLE9BSkksR0FBUyxZQUNULEVBQU8sRUFBSyxJQUFJLEVBQVEsVUFBVSxFQUcvQixFQUdYLGVBQXNCLEdBQWtFLEVBQVUsRUFBYSxDQUMzRyxJQUFNLEVBQVMsR0FBUyxRQUFVLEVBQUUsQ0FDOUIsRUFBV0EsRUFBRyxZQUFZLEVBQU0sQ0FFbEMsR0FBUyxPQUNULEVBQVMsTUFBTyxHQUFZLEVBQVEsTUFBTyxFQUFHLENBQUMsQ0FHbkQsTUFBTSxFQUFTLElBQUksRUFBTyxDQUFDLFNBQVMsQ0FFcEMsSUFBTSxFQUFXQSxFQUFHLFdBQVcsRUFBTSxDQUFDLFdBQVcsQ0FFN0MsR0FBUyxPQUNULEVBQVMsTUFBTyxHQUFZLEVBQVEsTUFBTyxFQUFHLENBQUMsQ0FHL0MsR0FBUyxPQUNULFFBQVEsSUFBSSxFQUFTLFNBQVMsQ0FBQyxDQUduQyxJQUFJLEVBQWMsTUFBTSxFQUFTLFNBQVMsQ0FNMUMsT0FKSSxHQUFTLFlBQ1QsRUFBTyxFQUFLLElBQUksRUFBUSxVQUFVLEVBRy9CLEVBR1gsZUFBc0IsRUFBNkQsRUFBVSxFQUFhLENBQ3RHLElBQUksRUFBYyxHQUFTLFFBQVUsRUFBRSxDQUVqQyxFQUFZLE9BQU8sR0FBUyxXQUFjLFdBQWEsR0FBUyxVQUFZLEdBQVksSUFBSSxLQUU5RixHQUFTLFlBQWMsS0FDdkIsRUFBUyxFQUFVLEVBQU8sRUFHOUIsSUFBTSxFQUFnQixDQUNsQixHQUFHLEVBQ0gsU0FDSCxDQU1ELE9BSklBLEVBQUcsU0FBVyxRQUNQLEdBQVksRUFBTyxFQUFjLENBR3JDLEdBQWMsRUFBTyxFQUFjLENDekU5QyxlQUFzQixHQUE2RSxFQUFVLEVBQWEsQ0E0QnRILE9BM0JhLE1BQU0sRUFBUSxFQUFPLENBQzlCLE1BQU8sR0FBUyxNQUNoQixVQUFXLEdBQVMsVUFDcEIsTUFBTyxHQUFTLE1BQ25CLENBQUMsRUFHRSxNQUFNLEVBQU8sRUFBTyxDQUNoQixNQUFPLEdBQVMsTUFDaEIsVUFBVyxHQUFTLFVBQ3BCLE9BQVEsR0FBUyxPQUNqQixNQUFPLEdBQVMsTUFDbkIsQ0FBQyxDQUVLLEVBQVEsRUFBTyxDQUNsQixNQUFPLEdBQVMsTUFDaEIsVUFBVyxHQUFTLFVBQ3BCLE1BQU8sR0FBUyxNQUNuQixDQUFDLEVBR1UsTUFBTSxFQUFPLEVBQU8sQ0FDaEMsTUFBTyxHQUFTLE1BQ2hCLFVBQVcsR0FBUyxVQUNwQixPQUFRLEdBQVMsT0FDcEIsQ0FBQyxDQzlCTixFQUFtQixVQUFVLFlBQWMsU0FFdkMsRUFBYyxLQUNoQixDQVNFLE9BUklDLEVBQUcsU0FBVyxhQUNQLEtBQUssVUFBVSxFQUFLLFNBQVUsR0FBTyxFQUFJLFlBQVksQ0FBQyxDQUc3REEsRUFBRyxTQUFXLFFBQ1AsS0FBSyxVQUFVLEVBQUssVUFBVyxHQUFPLEVBQUksWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUczRSxLQUFLLFVBQVUsRUFBSyxVQUFXLEdBQU8sRUFBSSxZQUFZLENBQUMsRUNsQmxFLFNBQWdCLEdBQWMsRUFBb0IsQ0FhOUMsT0FaSSxPQUFPLEdBQVUsU0FDVixRQUFRLEtBQUssVUFBVSxFQUFNLEdBR3BDLE9BQU8sR0FBVSxVQUNWLFFBQVEsSUFHZixPQUFPLEdBQVUsU0FDVixVQUFVLElBR2QsT0FBTyxFQUFNLENBR3hCLFNBQXdCLEdBQXVDLEVBQW1CLEVBQW1DLENBQ2pILE9BQU8sU0FBbUQsRUFBYSxDQUNuRSxPQUFPLGNBQWMsQ0FBSyxDQUd0QixNQUFhLElBQWEsRUFBYyxFQUEwQyxDQUM5RSxJQUFNLEVBQWMsS0FBSyxZQUVuQixFQUFRLEVBQVksU0FBUyxNQUM3QixFQUFhLEVBQVksU0FBUyxXQUV4QyxHQUFJLENBQUMsR0FBUyxDQUFDLEVBQ1gsTUFBVSxNQUFNLHlDQUF5QyxDQUc3RCxJQUFJLEVBQVFDLEVBQUcsV0FBVyxFQUFXLENBRXJDLEVBQVEsRUFDSCxXQUFXLENBQ1gsTUFBTyxFQUF1QixJQUFNLEtBQWEsR0FBWSxDQUM3RCxNQUFNLE9BQVEsSUFBSyxFQUFLLENBQ3hCLE1BQU0sRUFBRSxDQUViLElBQU0sRUFBTSxNQUFNLEVBQU0sa0JBQWtCLENBRTFDLEdBQUksQ0FBQyxHQUFPLENBQUMsRUFBSSxNQUNiLE9BQU8sRUFHWCxJQUFJLEVBQVEsR0FBSyxNQVVqQixPQVJJLE9BQU8sR0FBVSxVQUFZLEVBQU0sV0FBVyxRQUFRLEdBQ3RELEVBQVEsS0FBSyxNQUFNLEVBQU0sTUFBTSxFQUFFLENBQUMsRUFHbEMsT0FBTyxHQUFVLFVBQVksRUFBTSxXQUFXLFFBQVEsR0FDdEQsRUFBUSxFQUFNLE1BQU0sRUFBRSxHQUFLLFFBR3hCLEVBR1gsTUFBYSxJQUFJLEVBQWMsRUFBMkIsQ0FDdEQsSUFBTSxFQUFjLEtBQUssWUFFbkIsRUFBUSxFQUFZLFNBQVMsTUFDN0IsRUFBYSxFQUFZLFNBQVMsV0FFeEMsR0FBSSxDQUFDLEdBQVMsQ0FBQyxFQUNYLE1BQVUsTUFBTSx5Q0FBeUMsQ0FHN0QsSUFBTSxFQUFTLEVBQ1YsR0FBYyxLQUFhLEdBQzVCLE9BQ0EsUUFDSCxDQUVELEVBQU8sTUFBUSxHQUFjLEVBQU0sQ0FFbkMsTUFBTSxHQUFlLEVBQVksQ0FDckIsU0FDUixNQUFRLEdBQVksRUFBRyxJQUFJLENBQ3ZCLEVBQUcsR0FBSSxFQUF1QixJQUFNLEtBQWEsR0FBWSxDQUM3RCxFQUFHLEdBQUcsT0FBUSxJQUFLLEVBQUssQ0FDM0IsQ0FBQyxDQUNMLENBQUMsSUN4RGxCLFNBQXdCLEdBQXlDLEVBQWMsRUFBb0MsS0FBYSxDQUM1SCxPQUFPLFNBQWdELEVBQWEsQ0FDaEUsT0FBTyxjQUFjLENBQUssQ0FDdEIsT0FBYyxRQUFVLENBQ3BCLFFBQ0EsYUFDSCxDQUVELE9BQWMsVUFBZ0MsRUFBc0IsQ0FDaEUsSUFBTSxFQUFXLElBQUksS0FJckIsT0FGQSxPQUFPLE9BQU8sRUFBaUIsRUFBSSxDQUU1QixFQUdYLE9BQWMsUUFBbUQsQ0FDN0QsT0FBT0MsRUFBRyxXQUFXLEVBQU0sQ0FJL0IsYUFBb0IsU0FBK0IsRUFBeUQsQ0FDeEcsSUFBTSxFQUFjLEtBRWQsRUFBYSxNQUFNQyxHQUFpQixFQUFPLENBQzdDLEdBQUcsRUFDSCxVQUFXLEdBQU8sRUFBWSxVQUFVLEVBQUksQ0FDL0MsQ0FBQyxDQUVGLFVBQVcsSUFBTSxLQUFPLEVBQVcsTUFDL0IsTUFBTSxFQUFTLEVBQWEsYUFBYyxFQUFJLENBS2xELE9BRkEsTUFBTSxFQUFTLEVBQWEsZ0JBQWlCLEVBQVcsQ0FFakQsRUFHWCxhQUFvQixLQUEyQixFQUEyQyxDQUN0RixJQUFNLEVBQWMsS0FFZCxFQUFRLE1BQU1DLEVBQWEsRUFBTyxDQUNwQyxHQUFHLEVBQ0gsVUFBVyxHQUFPLEVBQVksVUFBVSxFQUFJLENBQy9DLENBQUMsQ0FFRixVQUFXLElBQU0sS0FBUSxFQUNyQixNQUFNLEVBQVMsRUFBYSxhQUFjLEVBQUssQ0FLbkQsT0FGQSxNQUFNLEVBQVMsRUFBYSxZQUFhLEVBQU0sQ0FFeEMsRUFHWCxhQUFvQixRQUE4QixFQUFxRCxDQUNuRyxJQUFNLEVBQWMsS0FFZCxFQUFNLE1BQU1DLEVBQWdCLEVBQU8sQ0FDckMsTUFBTyxHQUFHLE1BQ1YsTUFBTyxHQUFHLE1BQ1YsVUFBVyxHQUFPLEVBQVksVUFBVSxFQUFJLENBQy9DLENBQUMsQ0FRRixPQU5JLEdBQ0EsTUFBTSxFQUFTLEVBQWEsYUFBYyxFQUFJLENBR2xELE1BQU0sRUFBUyxFQUFhLFlBQWEsRUFBSSxDQUV0QyxFQUlYLGFBQW9CLGNBQW9DLEVBQXlDLENBQzdGLElBQU0sRUFBYyxLQUVkLEVBQU0sTUFBTUMsRUFBc0IsRUFBTyxDQUMzQyxHQUFHLEVBQ0gsS0FBTSxHQUFHLE1BQVEsRUFBWSxLQUM3QixVQUFXLEdBQU8sRUFBWSxVQUFVLEVBQUksQ0FDL0MsQ0FBQyxDQUtGLE9BSEEsTUFBTSxFQUFTLEVBQWEsYUFBYyxFQUFJLENBQzlDLE1BQU0sRUFBUyxFQUFhLFlBQWEsRUFBSSxDQUV0QyxFQUdYLGFBQW9CLEtBQTJCLEVBQTRCLENBQ3ZFLElBQU0sRUFBYyxLQUVkLEVBQU0sTUFBTUQsRUFBZ0IsRUFBTyxDQUNyQyxVQUFXLEdBQU8sRUFBWSxVQUFVLEVBQUksQ0FDNUMsTUFBUSxHQUFZLEVBQUcsRUFBc0IsSUFBSyxFQUFHLENBQ3hELENBQUMsQ0FRRixPQU5JLElBQ0EsTUFBTSxFQUFTLEVBQWEsYUFBYyxFQUFJLENBQzlDLE1BQU0sRUFBUyxFQUFhLFlBQWEsRUFBSSxFQUkxQyxFQUdYLGFBQW9CLFdBQWlDLEVBQXFCLENBQ3RFLElBQU0sRUFBYyxLQUVkLEVBQU0sTUFBTUMsRUFBc0IsRUFBTyxDQUMzQyxLQUFNLEVBQVksS0FDbEIsVUFBVyxHQUFPLEVBQVksVUFBVSxFQUFJLENBQzVDLE1BQVEsR0FBWSxFQUFHLEVBQXNCLElBQUssRUFBRyxDQUN4RCxDQUFDLENBS0YsT0FIQSxNQUFNLEVBQVMsRUFBYSxhQUFjLEVBQUksQ0FDOUMsTUFBTSxFQUFTLEVBQWEsWUFBYSxFQUFJLENBRXRDLEVBR1gsYUFBb0IsT0FBNkIsRUFBK0IsRUFBd0IsQ0FDcEcsSUFBTSxFQUFjLEtBRWQsRUFBTSxNQUFNQSxFQUFzQixFQUFPLENBQzNDLFVBQVcsR0FBTyxFQUFZLFVBQVUsRUFBSSxDQUM1QyxNQUFRLEdBQVksRUFBRyxFQUFrQixJQUFLLEVBQU0sQ0FDdkQsQ0FBQyxDQUtGLE9BSEEsTUFBTSxFQUFTLEVBQWEsYUFBYyxFQUFJLENBQzlDLE1BQU0sRUFBUyxFQUFhLFlBQWEsRUFBSSxDQUV0QyxFQUdYLGFBQW9CLGFBQW1DLEVBQStCLEVBQXdCLENBQzFHLElBQU0sRUFBYyxLQUVkLEVBQU0sTUFBTUEsRUFBc0IsRUFBTyxDQUMzQyxLQUFNLEVBQVksS0FDbEIsVUFBVyxHQUFPLEVBQVksVUFBVSxFQUFJLENBQzVDLE1BQVEsR0FBWSxFQUFHLEVBQWtCLElBQUssRUFBTSxDQUN2RCxDQUFDLENBS0YsT0FIQSxNQUFNLEVBQVMsRUFBYSxhQUFjLEVBQUksQ0FDOUMsTUFBTSxFQUFTLEVBQWEsWUFBYSxFQUFJLENBRXRDLEVBR1gsT0FBYyxPQUE2QixFQUErQyxDQUN0RixPQUFPQyxHQUFlLEVBQU8sQ0FBRSxNQUFPLEdBQUcsTUFBTyxDQUFDLENBR3JELE9BQWMsTUFBNEIsRUFBK0MsQ0FDckYsT0FBT0MsR0FBYyxFQUFPLEVBQUUsQ0FHbEMsYUFBb0IsT0FBNkIsRUFBMEQsQ0FDdkcsSUFBTSxFQUFjLEtBRWQsRUFBUyxDQUFFLEdBQUcsRUFBUyxDQUU3QixNQUFNLEVBQVMsRUFBYSxlQUFnQixFQUFPLENBRW5ELElBQU0sRUFBTSxNQUFNQyxFQUFlLEVBQU8sQ0FDcEMsVUFBVyxHQUFPLEVBQVksVUFBVSxFQUFJLENBQ3BDLFNBQ1gsQ0FBQyxDQU1GLE9BSkEsTUFBTSxFQUFTLEVBQWEsY0FBZSxFQUFJLENBQy9DLE1BQU0sRUFBUyxFQUFhLGFBQWMsRUFBSSxDQUM5QyxNQUFNLEVBQVMsRUFBYSxZQUFhLEVBQUksQ0FFdEMsRUFHWCxhQUFvQixXQUFpQyxFQUFrRSxDQUNuSCxJQUFNLEVBQWMsS0FFZCxFQUFPLEVBQUUsQ0FFZixVQUFXLElBQU0sS0FBUyxFQUFRLENBQzlCLE1BQU0sRUFBUyxFQUFhLGVBQWdCLEVBQU0sQ0FFbEQsSUFBTSxFQUFNLE1BQU1BLEVBQWUsRUFBTyxDQUNwQyxPQUFRLEVBQ1IsVUFBVyxHQUFPLEVBQVksVUFBVSxFQUFJLENBQy9DLENBQUMsQ0FFRixNQUFNLEVBQVMsRUFBYSxjQUFlLEVBQUksQ0FDL0MsTUFBTSxFQUFTLEVBQWEsYUFBYyxFQUFJLENBQzlDLE1BQU0sRUFBUyxFQUFhLFlBQWEsRUFBSSxDQUU3QyxFQUFLLEtBQUssRUFBSSxDQUdsQixPQUFPLEVBR1gsYUFBb0IsT0FBNkIsRUFBMEMsQ0FDdkYsSUFBTSxFQUFjLEtBRWQsRUFBUyxDQUFFLEdBQUcsRUFBRSxPQUFRLENBRTlCLE1BQU0sRUFBUyxFQUFhLGVBQWdCLEVBQVEsRUFBRSxNQUFNLENBRTVELE1BQU1DLEVBQWUsRUFBTyxDQUN4QixNQUFPLEVBQUUsTUFDVCxNQUFPLEVBQUUsTUFDRCxTQUNSLFVBQVcsR0FBTyxFQUFZLFVBQVUsRUFBSSxDQUMvQyxDQUFDLENBRUYsSUFBTSxFQUFNLE1BQU1KLEVBQXNCLEVBQU8sQ0FDM0MsTUFBTyxFQUFFLE1BQ1QsVUFBVyxHQUFPLEVBQVksVUFBVSxFQUFJLENBQy9DLENBQUMsQ0FJRixPQUZBLE1BQU0sRUFBUyxFQUFhLGNBQWUsRUFBSSxDQUV4QyxFQUdYLE9BQWMsV0FBaUMsRUFBUyxFQUE2QyxFQUEyQyxDQUc1SSxPQUZvQixLQUVELE9BQU8sQ0FDdEIsTUFBTyxHQUFTLE1BQ2hCLE1BQVEsR0FBWSxFQUFHLEVBQXNCLElBQUssRUFBRyxDQUM3QyxTQUNYLENBQUMsQ0FHTixhQUFvQixRQUE4QixFQUErQyxDQUM3RixJQUFNLEVBQWMsS0FFcEIsTUFBTSxFQUFTLEVBQWEsZ0JBQWlCLEVBQUUsQ0FFL0MsTUFBTUssRUFBZ0IsRUFBTyxFQUFFLENBRS9CLE1BQU0sRUFBUyxFQUFhLGVBQWdCLEVBQUUsQ0FHbEQsT0FBYyxjQUFvQyxFQUF3QyxDQUN0RixJQUFNLEVBQWMsS0FFcEIsT0FBT0MsR0FBc0IsRUFBTyxDQUNoQyxHQUFHLEVBQ0gsVUFBVyxHQUFPLEVBQVksVUFBVSxFQUFJLENBQy9DLENBQUMsQ0FHTixPQUFjLGVBQW1ELEVBQXlDLENBQ3RHLElBQU0sRUFBYyxLQUVwQixPQUFPQyxHQUF1QixFQUFPLENBQ2pDLE1BQU8sRUFBRSxNQUNULE1BQU8sRUFBRSxNQUNULE9BQVEsRUFBRSxPQUNWLE9BQVEsRUFBRSxPQUNWLE9BQVEsRUFBRSxPQUNWLFVBQVcsR0FBTyxFQUFZLFVBQVUsRUFBSSxDQUMvQyxDQUFDLENBR04sYUFBb0IsWUFBa0MsRUFBd0IsQ0FDMUUsSUFBTSxFQUFjLEtBQ2QsRUFBVSxDQUNaLE1BQVEsR0FBWSxFQUFHLE1BQU0sRUFBc0IsSUFBSyxFQUFHLENBQzlELENBRUQsTUFBTSxFQUFTLEVBQWEsZ0JBQWlCLEVBQVEsQ0FFckQsTUFBTUYsRUFBZ0IsRUFBTyxFQUFRLENBRXJDLE1BQU0sRUFBUyxFQUFhLGVBQWdCLEVBQVEsQ0FHeEQsTUFBYSxNQUFPLENBQ2hCLElBQU0sRUFBZSxLQUFhLFlBQzVCLEVBQVMsR0FBSyxLQUFhLENBQUMsRUFBcUIsQ0FBQyxDQUV4RCxNQUFNLEVBQVMsRUFBYSxhQUFjLEtBQU0sRUFBTyxDQUV2RCxNQUFNRCxFQUFlLEVBQU8sQ0FDeEIsTUFBUSxHQUFZLEVBQUcsRUFBWSxJQUFNLEtBQWEsR0FBWSxDQUMxRCxTQUNYLENBQUMsQ0FFRixNQUFNLEVBQVMsRUFBYSxZQUFhLEtBQUssQ0FHbEQsTUFBYSxTQUFVLENBQ25CLElBQU0sRUFBZSxLQUFhLFlBRWxDLE1BQU0sRUFBUyxFQUFhLGdCQUFpQixLQUFLLENBRWxELE1BQU1DLEVBQWdCLEVBQU8sQ0FDekIsTUFBTyxHQUFPLEVBQVcsTUFBTSxFQUFZLElBQU0sS0FBYSxHQUFHLENBQ3BFLENBQUMsQ0FFRixNQUFNLEVBQVMsRUFBYSxlQUFnQixLQUFLLENBR3JELE1BQWEsWUFBYSxDQUN0QixJQUFNLEVBQWUsS0FBYSxZQUVsQyxNQUFNLEVBQVMsRUFBYSxtQkFBb0IsS0FBSyxDQU1yRCxJQUFNLEdBSk8sTUFBTUcsR0FBbUIsRUFBTyxDQUN6QyxNQUFPLEdBQU8sRUFBVyxNQUFNLEVBQVksSUFBTSxLQUFhLEdBQUcsQ0FDcEUsQ0FBQyxFQUVlLEdBRWpCLE9BQU8sT0FBTyxLQUFhLEVBQUksQ0FFL0IsTUFBTSxFQUFTLEVBQWEsa0JBQW1CLEtBQUssSUN2VnBFLFNBQXdCLEdBQTZDLEVBQWMsQ0FDL0UsT0FBTyxTQUFtRCxFQUFhLENBQ25FLE9BQU8sY0FBYyxDQUFLLENBRXRCLGFBQW9CLEtBQTJCLEVBQW1CLEVBQThCLENBQzVGLElBQU0sRUFBUSxNQUFNLFFBQVEsRUFBUyxDQUFHLEVBQVcsQ0FBQyxFQUFTLENBQ3ZELEVBQWdCLE1BQU0sUUFBUSxFQUFNLENBQUcsRUFBUSxDQUFDLEVBQU0sQ0FFNUQsSUFBSyxJQUFNLEtBQVEsRUFBZSxDQUM5QixJQUFNLEVBQVcsSUFBWSxHQUU3QixHQUFJLENBQUMsRUFDRCxNQUFVLE1BQU0sWUFBWSxPQUFPLEVBQUssQ0FBQyxXQUFXLENBR3hELE1BQU0sRUFBUyxLQUFLLEVBQU0sS0NuQjlDLE1BQU0sR0FBVyxJQUFJLEdDQ2YsRUFBUSxFQUFVLE1BQW9CLEdBQWEsQ0NBbkQsR0FBVyxFQUFVLE1BQXVCQyxFQUFnQixDQ0E1RCxHQUFpQixJQUFJLEdBQWUsRUFBUyxDQ0E3QyxHQUFXLEVBQVUsTUFBdUIsR0FBZ0IsQ0NBNUQsR0FBaUMsSUFBSSxHQUErQkMsRUFBVSxDQ0E5RSxHQUF1QixJQUFJLEdBQXFCQyxFQUFVLENDQzFELEdBQVMsRUFBVSxNQUFrQyxHQUFjLENDRm5FLEdBQVEsSUFBSSxHQ0NaLEdBQWtCLElBQUksR0FBZ0JDLEVBQVUsQ0NBaEQsR0FBaUIsSUFBSSxHQUFlQyxFQUFVLENDS3BELFNBQWdCLEdBQXNDLEVBQThCLENBQ2hGLE9BQU8sRUNjWCxlQUFzQixHQUlwQixFQUFzQixFQUE0RSxDQUNoRyxJQUFNLEVBQVcsTUFBTSxRQUFRLEVBQVEsQ0FBRyxFQUFVLENBQUMsRUFBUSxDQUN2RCxFQUFTLEVBQVEsT0FDakIsRUFBUSxFQUFRLE1BRXRCLFNBQVMsRUFBUSxFQUFhLEVBQWtDLENBSzVELE9BSkksT0FBTyxHQUFZLFdBQ1osRUFBUSxFQUFPLENBR25CLEVBQUksRUFBUSxFQUFRLENBSS9CLElBQU0sRUFBVSxFQUFTLElBQUksR0FBSyxFQUFRLEVBQUcsRUFBTSxVQUFVLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FDeEUsRUFBZ0IsTUFBTSxFQUFNLGFBQWEsRUFBUSxDQUNqRCxFQUFZLEVBQWMsSUFBSyxHQUFXLEVBQVEsRUFBRyxFQUFNLFVBQVUsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUN0RixFQUFpQixNQUFNLEVBQU8sYUFBYSxFQUFVLENBRTNELElBQUssSUFBTSxLQUFVLEVBQVUsQ0FDM0IsSUFBTSxFQUFTLEVBQWMsT0FBUSxHQUFXLEVBQVEsRUFBRyxFQUFNLFVBQVUsR0FBSyxFQUFRLEVBQVEsRUFBTSxVQUFVLENBQUMsQ0FFakgsR0FBSSxDQUFDLEVBQU8sT0FBUSxDQUNoQixFQUFJLEVBQVEsRUFBUSxJQUFLLEVBQUUsQ0FBQyxDQUM1QixTQUdKLElBQU0sRUFBVSxFQUFlLE9BQVEsR0FBVyxFQUFPLEtBQU0sR0FBVyxFQUFRLEVBQUcsRUFBTyxVQUFVLEdBQUssRUFBUSxFQUFHLEVBQU8sVUFBVSxDQUFDLENBQUMsQ0FFekksRUFBSSxFQUFRLEVBQVEsSUFBSyxFQUFRLEVBS3pDLFNBQWdCLEdBSWQsRUFBNEUsQ0FDMUUsT0FBTyxHQUFzQixDQUN6QixLQUFNLEtBQU8sSUFBd0IsR0FBbUIsRUFBVSxFQUFRLENBQzdFLENBQUMsQ0NqRU4sSUFBcUIsR0FBckIsY0FBaUNDLEVBQVEsQ0FDckMsVUFBaUIsRUFBZ0IsRUFBYyxFQUE4QixDQUN6RSxHQUFJLEtBQUssT0FBTyxFQUFRLEVBQVMsRUFBTyxDQUFFLENBQ3RDLElBQU0sRUFBUSxJQUFJLEVBQWMsZUFBZ0IsSUFBSSxDQUVoRCxFQUFjLEdBbUJsQixNQWpCSSxPQUFPLEdBQVksV0FDbkIsRUFBYyxHQUdkLEdBQVcsT0FBTyxHQUFZLFlBQWMsRUFBUSxPQUNwRCxFQUFjLEVBQVEsTUFHdEIsR0FBVyxPQUFPLEdBQVksVUFBWSxFQUFRLGFBQWUsRUFBUSxZQUFZLE9BQ3JGLEVBQWMsRUFBUSxZQUFZLE1BR3RDLE9BQU8sT0FBTyxFQUFPLENBQ2pCLFNBQ0EsUUFBUyxFQUNaLENBQUMsQ0FFSSxLQ25CRyxHQUFyQixjQUE2Q0MsRUFBSyxDQUM5QyxRQUNBLFNBRUEsWUFBWSxFQUFrQixFQUFvQixDQUM5QyxNQUFNLENBQ0YsUUFBUyxJQUFJLElBQW9CLE9BQU8sUUFBUSxFQUFRLFFBQVEsQ0FBQyxDQUNqRSxPQUFRLEVBQU8sSUFBSSxnQkFBaUIsR0FBRyxDQUMxQyxDQUFDLENBRUYsS0FBSyxRQUFVLEVBQ2YsS0FBSyxTQUFXLEVBR3BCLElBQVcsRUFBYyxFQUFlLEVBQXlCLENBRzdELElBQU0sRUFGUyxLQUFLLE9BRU0sRUFFcEIsRUFBc0IsQ0FDeEIsU0FBVSxHQUNWLEdBQUcsRUFDTixDQUVELEtBQUssU0FBUyxPQUFPLEVBQVUsRUFBTyxFQUFLLENBRTNDLE1BQU0sSUFBSSxFQUFVLEVBQU8sRUFBUSxHQzlCdEIsR0FBckIsY0FBc0MsRUFDbENDLEdBQ0EsR0FBVyxhQUFhLENBQzNCLEFBQUMsR0VXRixNQUFNLEdBQWdCLENBQ2xCLE1BQU8sSURKWCxLQUE4QixDQUMxQixNQUNBLFNBRUEsWUFDQSxVQUVBLFNBRUEsWUFBWSxFQUEwQixDQUNsQyxLQUFLLE1BQVEsRUFBUSxNQUNyQixLQUFLLFNBQVcsRUFBUSxTQUV4QixLQUFLLFlBQWMsRUFBUSxZQUMzQixLQUFLLFVBQVksRUFBUSxVQUV6QixLQUFLLFNBQVcsRUFBUSxTQUc1QixNQUFNLEtBQUssRUFBaUIsQ0FDeEIsSUFBTSxFQUFNLElBQUksSUFJaEIsR0FGQSxFQUFTLFFBQVEsR0FBSyxFQUFJLElBQUksRUFBRSxLQUFLLFVBQVUsQ0FBQyxDQUU1QyxDQUFDLEVBQUksS0FBTSxPQUVmLElBQUksRUFBUUMsRUFBRyxXQUFXLEtBQUssWUFBbUIsQ0FFbEQsRUFBUSxFQUFNLFdBQVcsQ0FBQyxNQUFNLEtBQUssVUFBVyxLQUFNLE1BQU0sS0FBSyxFQUFJLENBQUMsQ0FHdEUsSUFBTSxFQUFVLE1BQU0sRUFBTSxTQUFTLENBRXJDLEVBQVMsUUFBUSxHQUFLLENBQ2xCLElBQU0sRUFBTyxFQUFRLE9BQVEsR0FBVyxFQUFFLEtBQUssYUFBZSxFQUFFLEtBQUssVUFBVSxDQUUvRSxFQUFJLEVBQUcsS0FBSyxTQUFVLEdBQWdCLFFBQVEsRUFBSyxDQUFDLEVBQ3RELEdDakNjLENBQ2hCLE1BQU8sUUFDUCxTQUFVLEtBRVYsWUFBYSxhQUNiLFVBQVcsVUFFWCxTQUFVLFFBQ2IsQ0FBQyxDQUNMLENBRUQsSUFBcUIsR0FBckIsTUFBcUIsVUFBYSxFQUM5QkMsR0FDQUMsR0FDQSxHQUFXLFFBQVEsQ0FDbkIsR0FBUyxHQUFjLENBQ3ZCLEdBQVMsYUFBYyxVQUFVLENBQ3BDLEFBQUMsQ0FFRSxPQUFjLE1BQVEsSUFBSSxJQUUxQixhQUFvQixJQUFJLEVBQW9DLENBS3hELE9BSmUsTUFBTSxLQUFLLE9BQU8sQ0FDN0IsTUFBTyxHQUFLLEVBQUUsTUFBTSxXQUFZLElBQUssRUFBUyxDQUNqRCxDQUFDLENBS04sYUFBb0IsZUFBZSxFQUFrQixDQUNqRCxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQ3RCLE1BQU8sR0FBTSxFQUFHLFdBQVksSUFBSyxFQUFTLENBQzdDLENBQUMsQ0FHTixZQUFvQixDQUNoQixPQUFPLEVBQU0sSUFBSSxLQUFLLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUcxRCxNQUFhLE1BQU8sQ0FDaEIsT0FBTyxNQUFNLEVBQU0sSUFBSSxLQUFLLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUcxRCxNQUFhLFFBQVEsRUFBMkIsRUFBRSxDQUFFLENBQ2hELElBQU0sRUFBUSxFQUFLLE1BQU0sSUFBSSxLQUFLLFNBQVMsQ0FDckMsRUFBTSxLQUFLLEtBQUssQ0FFdEIsR0FBSSxHQUFTLEVBQU0sRUFBTSxRQUFTLENBQzlCLEtBQUssSUFBTSxFQUFNLElBQ2pCLE9BU0osR0FOQSxBQUNJLEVBQVEsVUFBVSxLQUd0QixLQUFLLElBQU0sTUFBTSxFQUFNLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVUsRUFBUSxDQUU5RCxDQUFDLEtBQUssSUFDTixPQUdKLElBQU0sRUFBVSxFQUFNLEVBQUcsRUFBUSxRQUFRLENBQUcsSUFFNUMsRUFBSyxNQUFNLElBQUksS0FBSyxTQUFVLENBQzFCLElBQUssS0FBSyxJQUNWLFVBQ0gsQ0FBQyxDQUdOLGFBQW9CLFNBQVMsRUFBZSxFQUEyQixFQUFFLENBQUUsQ0FDdkUsSUFBTSxFQUFNLEtBQUssS0FBSyxDQUN0QixJQUFLLElBQU0sS0FBUSxFQUFPLENBRXRCLElBQU0sRUFBUSxLQUFLLE1BQU0sSUFBSSxFQUFLLFNBQVMsQ0FFM0MsR0FBSSxHQUFTLEVBQU0sRUFBTSxRQUFTLENBQzlCLEVBQUssSUFBTSxFQUFNLElBQ2pCLFNBSUosTUFBTSxFQUFLLFFBQVEsRUFBUSxFQUluQyxhQUFvQixVQUFVLEVBQWMsQ0FDeEMsSUFBTSxFQUFNLEVBQU0sSUFBSSxHQUFLLEVBQUUsR0FBRyxDQUVoQyxHQUFJLENBQUMsRUFBSSxPQUFRLE9BRWpCLElBQU0sRUFBTyxNQUFNLEdBQVMsS0FBSyxDQUM3QixNQUFPLEdBQUssRUFBRSxXQUFXLENBQUMsTUFBTSxVQUFXLEtBQU0sRUFBSSxDQUN4RCxDQUFDLENBRUYsRUFBTSxRQUFRLEdBQUssQ0FDZixFQUFFLE1BQVEsR0FBZ0IsUUFBUSxFQUFLLE9BQU8sR0FBSyxFQUFFLFVBQVksRUFBRSxHQUFHLENBQUMsRUFDekUsQ0FHTixNQUFhLGlCQUFrQixDQUMzQixNQUFNLEVBQU0sSUFBSSxLQUFLLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxHQzlHcEMsR0FBckIsY0FBb0MsRUFBWUMsR0FBSyxBQUFDLENBQ2xELElBQVcsS0FBSyxDQUNaLE9BQU8sSUFBSSxHQUFXLENBQ2xCLElBQUssS0FBSyxVQUNWLE9BQVEsRUFBTyxJQUFJLFdBQVcsS0FBSyxHQUFHLFVBQVUsQ0FDaEQsa0JBQW1CLEdBQVEsV0FBVyxLQUFLLEdBQUcsTUFBTSxDQUNwRCxPQUFRLEVBQU8sTUFBTSxDQUFFLE1BQU8sTUFBTyxDQUFDLENBQ3RDLE1BQU8sRUFBTyxJQUFJLFlBQWEsR0FBTSxDQUN4QyxDQUFDLENBR04sU0FBZ0IsR0FBRyxFQUFpQixDQUNoQyxPQUFPLEVBQUssS0FBSyxVQUFXLEdBQUcsRUFBTSxDQUd6QyxXQUFrQixHQUFHLEVBQWlCLENBQ2xDLE9BQU8sRUFBSyxVQUFXLFVBQVcsS0FBSyxHQUFJLEdBQUcsRUFBTSxDQUd4RCxTQUF3QyxFQUFLLEVBQU0sSUFDeEMsR0FBTSxRQUFRLEVBQUssRUFBTSxDQUM1QixJQUFLLEtBQUssVUFDVixHQUFHLEVBQ04sQ0FBQyxDQUdOLE1BQWEsQ0FDVCxJQUFNLEVBQWUsS0FBSyxTQUFTLGNBQWMsQ0FFakQsR0FBSSxDQUFDLEVBQUcsV0FBVyxFQUFhLENBQzVCLE9BR0osSUFBTSxFQUFVLEVBQUcsYUFBYSxFQUFjLFFBQVEsQ0FDaEQsRUFBTyxLQUFLLE1BQU0sRUFBUSxDQUVoQyxLQUFLLGFBQWUsRUFBSyxjQUFnQixFQUFFLENBQzNDLEtBQUssTUFBUSxFQUFLLE9BQVMsRUFBRSxDQUdqQyw2QkFBb0MsRUFBc0MsTUFBc0IsQ0FDNUYsSUFBTSxFQUFhLEVBQUUsQ0FFakIsSUFBWSxPQUNaLEVBQVcsS0FDUCxLQUFLLFNBQVMsU0FBVSxtQkFBbUIsQ0FDM0MsS0FBSyxTQUFTLFNBQVUsbUJBQW1CLENBQzNDLEtBQUssU0FBUyxTQUFVLFlBQVksQ0FDcEMsS0FBSyxTQUFTLFNBQVUsWUFBWSxDQUN2QyxDQUdELElBQVksUUFDWixFQUFXLEtBQ1AsS0FBSyxTQUFTLG1CQUFvQixXQUFXLENBQzdDLEtBQUssU0FBUyxtQkFBb0IsWUFBWSxDQUM5QyxLQUFLLFNBQVMsbUJBQW9CLG1CQUFtQixDQUNyRCxLQUFLLFNBQVMsbUJBQW9CLG9CQUFvQixDQUN6RCxDQUdELElBQVksV0FDWixFQUFXLEtBQ1AsS0FBSyxTQUFTLHNCQUF1QixXQUFXLENBQ2hELEtBQUssU0FBUyxzQkFBdUIsWUFBWSxDQUNqRCxLQUFLLFNBQVMsc0JBQXVCLG1CQUFtQixDQUN4RCxLQUFLLFNBQVMsc0JBQXVCLG9CQUFvQixDQUM1RCxDQUdMLElBQUssSUFBTSxLQUFhLEVBQ3BCLEdBQUksRUFBRyxXQUFXLEVBQVUsQ0FDeEIsT0FBTyxFQUlmLE9BQU8sT0NoRU0sR0FBckIsS0FBOEMsQ0FDMUMsSUFDQSxRQUNBLFNBQ0EsUUFDQSxLQUVBLGNBQ0EsV0FDQSxVQUVBLGlCQUNBLGNBQ0EsYUFHQSxZQUFZLEVBQXVDLENBQy9DLEtBQUssSUFBTSxFQUFLLElBQ2hCLEtBQUssUUFBVSxFQUFLLFFBQ3BCLEtBQUssU0FBVyxFQUFLLFNBQ3JCLEtBQUssUUFBVSxJQUFJLEdBQWdCLEtBQUssUUFBUyxLQUFLLFNBQVMsQ0FFL0QsS0FBSyxLQUFPLEVBQUUsQ0FFZCxLQUFLLGNBQWdCLEVBQUssZUFBaUIsSUFBSSxHQUMvQyxLQUFLLFdBQWEsRUFBSyxZQUFjLElBQUksRUFDekMsS0FBSyxVQUFZLEVBQUssV0FBYSxJQUFJLElBRXZDLEtBQUssY0FBZ0IsRUFBSyxlQUFpQixJQUFJLEVBQy9DLEtBQUssaUJBQW1CLEVBQUssa0JBQW9CLElBQUksR0FDckQsS0FBSyxhQUFlLEVBQUssY0FBZ0IsSUFBSSxJQUdqRCxnQkFBdUIsRUFBYSxFQUFZLENBQzVDLEtBQUssYUFBYSxJQUFJLEVBQUssRUFBTSxDQUdyQyxhQUFvQixFQUFhLEVBQVksQ0FDekMsS0FBSyxVQUFVLElBQUksRUFBSyxFQUFNLENBR2xDLFNBQWdCLEVBQWEsRUFBWSxDQUNyQyxLQUFLLGFBQWEsRUFBSyxFQUFNLENBQzdCLEtBQUssZ0JBQWdCLEVBQUssRUFBTSxDQUdwQyx5QkFBZ0MsRUFBYSxFQUFZLENBQ3JELEtBQUssaUJBQWlCLElBQUksRUFBSyxFQUFNLENBR3pDLHNCQUE2QixFQUFhLEVBQVksQ0FDbEQsS0FBSyxjQUFjLElBQUksRUFBSyxFQUFNLENBR3RDLGtCQUF5QixFQUFhLEVBQVksQ0FDOUMsS0FBSyxzQkFBc0IsRUFBSyxFQUFNLENBQ3RDLEtBQUsseUJBQXlCLEVBQUssRUFBTSxDQUc3QyxzQkFBNkIsRUFBYSxFQUFZLENBQ2xELEtBQUssY0FBYyxJQUFJLEVBQUssRUFBTSxDQUd0QyxtQkFBMEIsRUFBYSxFQUFZLENBQy9DLEtBQUssV0FBVyxJQUFJLEVBQUssRUFBTSxDQUduQyxlQUFzQixFQUFhLEVBQVksQ0FDM0MsS0FBSyxtQkFBbUIsRUFBSyxFQUFNLENBQ25DLEtBQUssc0JBQXNCLEVBQUssRUFBTSxHQ3ZGekIsR0FBckIsY0FBK0MsRUFBWUMsR0FBSyxBQUFDLENBQzdELFVBRUEsU0FBZ0IsR0FBRyxFQUFpQixDQUNoQyxPQUFPQyxHQUFLLEtBQUssVUFBVyxHQUFHLEVBQU0sR0NHeEIsR0FBckIsTUFBcUIsVUFBcUIsRUFBa0IsQ0FDeEQsV0FBb0IsSUFBSSxJQUN4QixlQUF3QixJQUFJLElBRTVCLGFBQWMsQ0FDVixPQUFPLENBRVAsR0FBUyxHQUFHLG9CQUFxQixLQUFLLG1CQUFtQixLQUFLLEtBQUssQ0FBQyxDQUd4RSxXQUFrQixHQUFHLEVBQWlCLENBQ2xDLE9BQU8sRUFBSyxVQUFXLFVBQVcsS0FBSyxHQUFJLEdBQUcsRUFBTSxDQUd4RCxNQUFhLE1BQU8sRUFJcEIsTUFBYSxtQkFBbUIsRUFBd0MsQ0FDcEUsSUFBTSxFQUFTLEVBQUksT0FFbkIsSUFBSyxHQUFNLENBQUMsRUFBVyxLQUFZLEtBQUssV0FBWSxDQUNoRCxJQUFNLEVBQVMsRUFBUSxRQUFVLFFBRWpDLE1BQU0sR0FDRCxPQUFPLEVBQVUsQ0FDakIsVUFBVSxFQUFPLENBQ2pCLFVBQVUsRUFBTyxDQUNqQixVQUFVLEtBQUssR0FBRyxDQUNsQixNQUFNLENBR2YsSUFBSyxJQUFNLEtBQVUsS0FBSyxlQUN0QixFQUFPLE9BQU8sRUFBUSxDQUNsQixPQUFRLEtBQUssR0FDaEIsQ0FBQyxDQUlWLGFBQW9CLEVBQW1CLEVBQStCLEVBQUUsQ0FBRSxDQUN0RSxLQUFLLFdBQVcsSUFBSSxFQUFXLEVBQVEsQ0FHM0MsZ0JBQXVCLEVBQW1CLENBQ3RDLEtBQUssZUFBZSxJQUFJLEVBQVUsQ0FHdEMsT0FBYyx5QkFBK0MsRUFBOEIsQ0FDdkYsSUFBTSxFQUFjLE9BQU8sTUFBUyxXQUFhLEtBQU8sRUFFbEQsRUFBVyxJQUFJLEVBRWpCLEVBQVUsQ0FDVixHQUFJLEVBQU8sR0FDWCxLQUFNLEVBQU8sS0FDYixRQUFTLEVBQU8sUUFDaEIsVUFBVyxFQUFPLFVBQ3JCLENBWUQsT0FWSSxPQUFPLEdBQVksT0FBVSxhQUM3QixFQUFXLEVBQW1CLE1BQU0sRUFBTyxFQUczQyxPQUFRLE1BQWMsT0FBVSxhQUNoQyxFQUFXLEtBQWEsTUFBTSxFQUFPLEVBR3pDLE9BQU8sT0FBTyxFQUFpQixFQUFRLENBRWhDLElDdkVNLEdBQXJCLEtBQTBELENBQ3RELE1BQWEsT0FBTyxFQUEwQyxDQUMxRCxHQUFJLENBQUMsRUFBSSxNQUFRLENBQUMsRUFBSSxNQUNsQixNQUFNLElBQUksRUFBYywrQkFBZ0MsSUFBSSxDQUdoRSxNQUFPLENBQ0gsS0FBTSxFQUFJLEtBQ1YsTUFBTyxFQUFJLE1BQ2QsR0NOWSxHQUFyQixLQUFpRSxDQUM3RCxNQUFhLE9BQU8sRUFBeUQsQ0FFekUsSUFBSSxFQUFRLEVBQUksT0FBTyxJQUFJLGdCQUFnQixDQVUzQyxHQVJJLEVBQUksU0FBVyxFQUFJLFFBQVEsUUFBUSxnQkFDbkMsRUFBUSxFQUFJLFFBQVEsUUFBUSxlQUc1QixHQUFTLEVBQU0sV0FBVyxVQUFVLEdBQ3BDLEVBQVEsRUFBTSxNQUFNLEVBQUUsRUFHdEIsQ0FBQyxFQUNELE1BQU8sQ0FDSCxLQUFNLElBQUEsR0FDTixNQUFPLElBQUEsR0FDVixDQUdMLElBQU0sRUFBVyxNQUFNLEdBQWdCLFlBQVksRUFBTSxDQUNyRCxFQU1KLE9BSkksSUFDQSxFQUFPLE1BQU0sR0FBZSxXQUFXLEVBQVMsUUFBUSxFQUdyRCxDQUNILE9BQ0EsTUFBTyxHQUFZLElBQUEsR0FDdEIsR0NyQkksR0FBYixLQUF1RCxDQUNuRCxZQUVBLFlBQVksRUFBb0UsQ0FDNUUsS0FBSyxZQUFjLE1BQU0sUUFBUSxFQUFRLENBQUcsRUFBVSxDQUFDLEVBQVEsQ0FHbkUsTUFBYSxPQUFPLEVBQTJCLENBQzNDLElBQUssSUFBTSxLQUFLLEtBQUssWUFDakIsRUFBSSxJQUFJLFVBQ0osRUFBRSxPQUNGLEVBQUUsU0FDRixFQUFFLFlBQWMsRUFBRSxDQUNyQixHQUtRLEdBQXJCLEtBQW1FLENBQy9ELE1BQWEsT0FBTyxFQUFrQyxDQUNsRCxJQUFNLEVBQVEsRUFBSSxNQUNkLEVBQW1DLEVBQUUsQ0FDbkMsRUFBb0IsRUFBRSxDQUc1QixHQUFJLEVBQUksTUFBUSxHQUFPLE9BQVMsT0FBUSxDQUNwQyxJQUFNLEVBQWMsTUFBTSxHQUErQixTQUFTLENBQzlELGFBQWMsT0FBTyxFQUFJLEtBQUssR0FBRyxDQUNqQyxlQUFnQixPQUNuQixDQUFDLENBRUYsRUFBcUIsTUFBTSxHQUFxQixTQUFTLENBQUUsR0FBSSxFQUFZLElBQUksR0FBSyxFQUFFLGNBQWMsQ0FBRSxDQUFDLENBRXZHLEVBQWtCLEtBQU8sQ0FDckIsS0FBTSxDQUNGLEdBQUksRUFBSSxLQUFLLEdBQ2IsS0FBTSxFQUFJLEtBQUssS0FDZixNQUFPLEVBQUksS0FBSyxNQUNuQixDQUNKLENBR0wsR0FBSSxHQUFTLEVBQU0sT0FBUyxNQUFPLENBQy9CLElBQU0sRUFBYyxNQUFNLEdBQStCLFNBQVMsQ0FDOUQsYUFBYyxPQUFPLEVBQU0sR0FBRyxDQUM5QixlQUFnQixRQUNuQixDQUFDLENBRUYsRUFBcUIsTUFBTSxHQUFxQixTQUFTLENBQUUsR0FBSSxFQUFZLElBQUksR0FBSyxFQUFFLGNBQWMsQ0FBRSxDQUFDLENBRXZHLEVBQWtCLElBQU0sQ0FDcEIsTUFBTyxDQUNILEdBQUksRUFBTSxHQUNWLEtBQU0sRUFBTSxLQUNmLENBQ0osQ0FXTCxNQUFPLENBQUUsSUFORyxJQUFJLEdBQUksQ0FDaEIsWUFIZ0JDLEdBQVcsYUFBYSxFQUFvQixFQUFrQixDQUk5RSxNQUFPLEVBQU8sSUFBSSxZQUFZLEVBQUksRUFBTyxJQUFJLFlBQVksQ0FDekQsT0FBUSxFQUFPLE1BQU0sQ0FBRSxNQUFPLE1BQU8sQ0FBQyxDQUN6QyxDQUFDLENBRVksQ0FHbEIsT0FBYyxPQUFPLEVBQW9FLENBQ3JGLE9BQU8sSUFBSSxHQUFvQixFQUFRLEdDeEYvQyxTQUFnQixHQUFzSCxFQUFZLENBQzlJLGVBQWUsRUFBSyxFQUFtQixFQUE4QixDQUNqRSxJQUFNLEVBQVEsTUFBTSxRQUFRLEVBQVMsQ0FBRyxFQUFXLENBQUMsRUFBUyxDQUN2RCxFQUFnQixNQUFNLFFBQVEsRUFBTSxDQUFHLEVBQVEsQ0FBQyxFQUFNLENBRTVELElBQUssSUFBTSxLQUFRLEVBQWUsQ0FDOUIsSUFBTSxFQUFTLElBQVUsR0FFekIsR0FBSSxDQUFDLEVBQ0QsTUFBTSxJQUFJLEVBQWMsVUFBVSxPQUFPLEVBQUssQ0FBQyxlQUFlLENBR2xFLE1BQU0sRUFBTyxLQUFLLEVBQU0sRUFLaEMsTUFBTyxDQUNILEtBQU0sT0FBTyxLQUFLLEVBQVEsQ0FDMUIsVUFDQSxPQUNILENDdEJMLFNBQWdCLEdBQWMsRUFBNkQsQ0FDdkYsT0FBTyxFQ0VYLFNBQWdCLEdBQWtCLEVBQWMsQ0FDNUMsSUFBTSxFQUFVLEVBQVEsUUFDbEIsRUFBVyxFQUFRLFNBQ25CLEVBQU8sRUFBUSxNQUFRLGVBQ3ZCLEVBQWdCLENBQ2xCLGNBQ0EsZUFDQSxpQkFDQSxlQUNBLGlCQUNILENBRUssRUFBUyxFQUFRLFFBQVUsRUFBRSxDQUUvQixFQUFVLEdBRWQsSUFBSyxJQUFNLEtBQVUsRUFBUyxDQUMxQixJQUFNLEVBQVEsRUFBRyxLQUFLLEdBQUcsRUFBTyxHQUFHLElBQVEsQ0FDdkMsT0FBUSxDQUFDLEdBQUcsRUFBZSxHQUFHLEVBQU8sQ0FDeEMsQ0FBQyxDQUVGLElBQUssSUFBTSxLQUFRLEVBQU8sQ0FDdEIsSUFBTSxFQUFXLEVBQUssU0FBUyxFQUFLLFFBQVEsRUFBUyxDQUFFLEVBQUssQ0FDdEQsRUFBWSxFQUFLLFFBQVEsRUFBSyxDQUloQyxFQUZnQixFQUFHLGFBQWEsRUFBTSxRQUFRLENBRVosU0FBUyxpQkFBaUIsRUFBSSxDQUFDLEVBQVMsU0FBUyx1QkFBdUIsQ0FFMUcsRUFBSyxTQUFTLE9BQU8sR0FDckIsRUFBc0IsSUFHMUIsR0FBVyxvQkFBb0IsRUFBUyxLQUdwQyxJQUNBLEdBQVcsdUJBQXVCLEVBQUssU0FBUyxFQUFNLEVBQVUsQ0FBQyxhQUFhLEVBQVMsT0FLbkcsRUFBVSxFQUFRLE1BQU0sQ0FFeEIsRUFBRyxjQUFjLEVBQVUsRUFBUSxDQzlDdkMsZUFBc0IsR0FBVSxFQUFtQyxDQUMvRCxJQUFLLElBQU0sS0FBWSxFQUFXLENBQzlCLElBQU0sRUFBVUMsR0FBYyxFQUFTLENBRWxDQyxNQUFHLFdBQVcsRUFBUyxDQU01QixPQUZZLE1BQU0sT0FBTyxFQUFRLFVBQVUsRUFLL0MsT0FBTyJ9