tango-app-ui-analyse-trax 3.9.2 → 3.9.3
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.
- package/.eslintrc.json +37 -0
- package/ng-package.json +7 -0
- package/package.json +12 -25
- package/src/lib/components/action-centre/action-centre.component.html +607 -0
- package/src/lib/components/action-centre/action-centre.component.scss +185 -0
- package/src/lib/components/action-centre/action-centre.component.spec.ts +23 -0
- package/src/lib/components/action-centre/action-centre.component.ts +279 -0
- package/src/lib/components/activity-log/activity-log.component.html +84 -0
- package/src/lib/components/activity-log/activity-log.component.scss +33 -0
- package/src/lib/components/activity-log/activity-log.component.spec.ts +23 -0
- package/src/lib/components/activity-log/activity-log.component.ts +137 -0
- package/src/lib/components/activity-log-v2/activity-log-v2.component.html +189 -0
- package/src/lib/components/activity-log-v2/activity-log-v2.component.scss +162 -0
- package/src/lib/components/activity-log-v2/activity-log-v2.component.spec.ts +23 -0
- package/src/lib/components/activity-log-v2/activity-log-v2.component.ts +517 -0
- package/src/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.html +19 -0
- package/src/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.scss +148 -0
- package/src/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.spec.ts +23 -0
- package/src/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.ts +141 -0
- package/src/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.html +42 -0
- package/src/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.scss +49 -0
- package/src/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.spec.ts +23 -0
- package/src/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.ts +22 -0
- package/src/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.html +724 -0
- package/src/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.scss +217 -0
- package/src/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.spec.ts +23 -0
- package/src/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.ts +122 -0
- package/src/lib/components/add-checklist/add-checklist.component.html +1459 -0
- package/src/lib/components/add-checklist/add-checklist.component.scss +1205 -0
- package/src/lib/components/add-checklist/add-checklist.component.spec.ts +23 -0
- package/src/lib/components/add-checklist/add-checklist.component.ts +2460 -0
- package/src/lib/components/add-checklist/checklist-popup/checklist-popup.component.html +207 -0
- package/src/lib/components/add-checklist/checklist-popup/checklist-popup.component.scss +213 -0
- package/src/lib/components/add-checklist/checklist-popup/checklist-popup.component.spec.ts +23 -0
- package/src/lib/components/add-checklist/checklist-popup/checklist-popup.component.ts +621 -0
- package/src/lib/components/add-checklist/counter/counter.component.html +43 -0
- package/src/lib/components/add-checklist/counter/counter.component.scss +49 -0
- package/src/lib/components/add-checklist/counter/counter.component.spec.ts +23 -0
- package/src/lib/components/add-checklist/counter/counter.component.ts +123 -0
- package/src/lib/components/add-multitask/add-multitask.component.html +705 -0
- package/src/lib/components/add-multitask/add-multitask.component.scss +296 -0
- package/src/lib/components/add-multitask/add-multitask.component.spec.ts +23 -0
- package/src/lib/components/add-multitask/add-multitask.component.ts +611 -0
- package/src/lib/components/add-multitask/ascending-validator.ts +13 -0
- package/src/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.html +197 -0
- package/src/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.scss +31 -0
- package/src/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.spec.ts +23 -0
- package/src/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.ts +285 -0
- package/src/lib/components/add-multitask/create-task.data.ts +374 -0
- package/src/lib/components/add-multitask/create-task.interface.ts +177 -0
- package/src/lib/components/add-multitask/unique-string-validator.ts +13 -0
- package/src/lib/components/add-multitask/whitespace-validator.ts +11 -0
- package/src/lib/components/add-task/add-task.component.html +654 -0
- package/src/lib/components/add-task/add-task.component.scss +536 -0
- package/src/lib/components/add-task/add-task.component.spec.ts +23 -0
- package/src/lib/components/add-task/add-task.component.ts +569 -0
- package/src/lib/components/add-task/ascending-validator.ts +13 -0
- package/src/lib/components/add-task/create-task.data.ts +374 -0
- package/src/lib/components/add-task/create-task.interface.ts +192 -0
- package/src/lib/components/add-task/unique-string-validator.ts +13 -0
- package/src/lib/components/add-task/whitespace-validator.ts +11 -0
- package/src/lib/components/approval-popup/approval-popup.component.html +25 -0
- package/src/lib/components/approval-popup/approval-popup.component.scss +3 -0
- package/src/lib/components/approval-popup/approval-popup.component.spec.ts +23 -0
- package/src/lib/components/approval-popup/approval-popup.component.ts +26 -0
- package/src/lib/components/checklist/checklist.component.html +330 -0
- package/src/lib/components/checklist/checklist.component.scss +112 -0
- package/src/lib/components/checklist/checklist.component.spec.ts +23 -0
- package/src/lib/components/checklist/checklist.component.ts +344 -0
- package/src/lib/components/checklist-configure/assign/assign.component.html +665 -0
- package/src/lib/components/checklist-configure/assign/assign.component.scss +219 -0
- package/src/lib/components/checklist-configure/assign/assign.component.spec.ts +23 -0
- package/src/lib/components/checklist-configure/assign/assign.component.ts +932 -0
- package/src/lib/components/checklist-configure/checklist-configure.component.html +4340 -0
- package/src/lib/components/checklist-configure/checklist-configure.component.scss +2338 -0
- package/src/lib/components/checklist-configure/checklist-configure.component.spec.ts +23 -0
- package/src/lib/components/checklist-configure/checklist-configure.component.ts +4659 -0
- package/src/lib/components/checklistlayout/checklistlayout.component.html +30 -0
- package/src/lib/components/checklistlayout/checklistlayout.component.scss +15 -0
- package/src/lib/components/checklistlayout/checklistlayout.component.spec.ts +23 -0
- package/src/lib/components/checklistlayout/checklistlayout.component.ts +47 -0
- package/src/lib/components/chip-dropdown/chip-dropdown.component.html +36 -0
- package/src/lib/components/chip-dropdown/chip-dropdown.component.scss +97 -0
- package/src/lib/components/chip-dropdown/chip-dropdown.component.spec.ts +23 -0
- package/src/lib/components/chip-dropdown/chip-dropdown.component.ts +125 -0
- package/src/lib/components/create-task/create-task.component.html +2003 -0
- package/src/lib/components/create-task/create-task.component.scss +272 -0
- package/src/lib/components/create-task/create-task.component.spec.ts +23 -0
- package/src/lib/components/create-task/create-task.component.ts +614 -0
- package/src/lib/components/create-task/create-task.data.ts +372 -0
- package/src/lib/components/create-task/create-task.interface.ts +182 -0
- package/src/lib/components/create-task/validators/ascending-validator.ts +13 -0
- package/src/lib/components/create-task/validators/unique-string-validator.ts +13 -0
- package/src/lib/components/create-task/validators/whitespace-validator.ts +11 -0
- package/src/lib/components/custom-select/custom-select.component.html +44 -0
- package/src/lib/components/custom-select/custom-select.component.scss +144 -0
- package/src/lib/components/custom-select/custom-select.component.spec.ts +23 -0
- package/src/lib/components/custom-select/custom-select.component.ts +265 -0
- package/src/lib/components/dashboard/dashboard.component.html +1076 -0
- package/src/lib/components/dashboard/dashboard.component.scss +237 -0
- package/src/lib/components/dashboard/dashboard.component.spec.ts +23 -0
- package/src/lib/components/dashboard/dashboard.component.ts +539 -0
- package/src/lib/components/dashboard-info/dashboard-info.component.html +1420 -0
- package/src/lib/components/dashboard-info/dashboard-info.component.scss +409 -0
- package/src/lib/components/dashboard-info/dashboard-info.component.spec.ts +23 -0
- package/src/lib/components/dashboard-info/dashboard-info.component.ts +772 -0
- package/src/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.html +110 -0
- package/src/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.scss +260 -0
- package/src/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.spec.ts +23 -0
- package/src/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.ts +143 -0
- package/src/lib/components/dashboard-layout/dashboard-layout.component.html +1 -0
- package/src/lib/components/dashboard-layout/dashboard-layout.component.scss +0 -0
- package/src/lib/components/dashboard-layout/dashboard-layout.component.spec.ts +23 -0
- package/src/lib/components/dashboard-layout/dashboard-layout.component.ts +10 -0
- package/src/lib/components/disabled-select/disabled-select.component.html +44 -0
- package/src/lib/components/disabled-select/disabled-select.component.scss +149 -0
- package/src/lib/components/disabled-select/disabled-select.component.spec.ts +23 -0
- package/src/lib/components/disabled-select/disabled-select.component.ts +146 -0
- package/src/lib/components/export-gallery/export-gallery.component.html +175 -0
- package/src/lib/components/export-gallery/export-gallery.component.scss +200 -0
- package/src/lib/components/export-gallery/export-gallery.component.spec.ts +23 -0
- package/src/lib/components/export-gallery/export-gallery.component.ts +263 -0
- package/src/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.html +36 -0
- package/src/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.scss +97 -0
- package/src/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.ts +104 -0
- package/src/lib/components/eye-test-audit/custom-select/custom-select.component.html +44 -0
- package/src/lib/components/eye-test-audit/custom-select/custom-select.component.scss +144 -0
- package/src/lib/components/eye-test-audit/custom-select/custom-select.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/custom-select/custom-select.component.ts +265 -0
- package/src/lib/components/eye-test-audit/eye-test/eye-test.component.html +1804 -0
- package/src/lib/components/eye-test-audit/eye-test/eye-test.component.scss +806 -0
- package/src/lib/components/eye-test-audit/eye-test/eye-test.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/eye-test/eye-test.component.ts +1890 -0
- package/src/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.html +25 -0
- package/src/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.scss +0 -0
- package/src/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.ts +20 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit-routing.module.ts +26 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.html +1 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.scss +0 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.ts +24 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.module.ts +44 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.html +490 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.scss +721 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.ts +1017 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.html +708 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.scss +247 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.ts +446 -0
- package/src/lib/components/eye-test-audit/group-select/group-select.component.html +44 -0
- package/src/lib/components/eye-test-audit/group-select/group-select.component.scss +144 -0
- package/src/lib/components/eye-test-audit/group-select/group-select.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/group-select/group-select.component.ts +147 -0
- package/src/lib/components/eye-test-audit/reactive-select/reactive-select.component.html +18 -0
- package/src/lib/components/eye-test-audit/reactive-select/reactive-select.component.scss +49 -0
- package/src/lib/components/eye-test-audit/reactive-select/reactive-select.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/reactive-select/reactive-select.component.ts +104 -0
- package/src/lib/components/eye-test-audit/select-drop/select-drop.component.html +44 -0
- package/src/lib/components/eye-test-audit/select-drop/select-drop.component.scss +144 -0
- package/src/lib/components/eye-test-audit/select-drop/select-drop.component.spec.ts +23 -0
- package/src/lib/components/eye-test-audit/select-drop/select-drop.component.ts +152 -0
- package/src/lib/components/eye-test-audit/services/eye-test-audit.service.spec.ts +16 -0
- package/src/lib/components/eye-test-audit/services/eye-test-audit.service.ts +190 -0
- package/src/lib/components/flag-layout/flag-layout.component.html +1 -0
- package/src/lib/components/flag-layout/flag-layout.component.scss +0 -0
- package/src/lib/components/flag-layout/flag-layout.component.spec.ts +23 -0
- package/src/lib/components/flag-layout/flag-layout.component.ts +10 -0
- package/src/lib/components/flags/flags.component.html +473 -0
- package/src/lib/components/flags/flags.component.scss +86 -0
- package/src/lib/components/flags/flags.component.spec.ts +23 -0
- package/src/lib/components/flags/flags.component.ts +280 -0
- package/{lib/components/flags/flags.interface.d.ts → src/lib/components/flags/flags.interface.ts} +73 -65
- package/src/lib/components/flags-info/flags-info.component.html +6012 -0
- package/src/lib/components/flags-info/flags-info.component.scss +278 -0
- package/src/lib/components/flags-info/flags-info.component.spec.ts +23 -0
- package/src/lib/components/flags-info/flags-info.component.ts +490 -0
- package/src/lib/components/flags-info/flags-info.interface.ts +441 -0
- package/src/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.html +1 -0
- package/src/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.scss +4 -0
- package/src/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.ts +78 -0
- package/src/lib/components/flags-new/flags-new.component.html +904 -0
- package/src/lib/components/flags-new/flags-new.component.scss +121 -0
- package/src/lib/components/flags-new/flags-new.component.spec.ts +23 -0
- package/src/lib/components/flags-new/flags-new.component.ts +357 -0
- package/{lib/components/flags-new/flags-new.interface.d.ts → src/lib/components/flags-new/flags-new.interface.ts} +90 -81
- package/src/lib/components/gallery/gallery.component.html +3660 -0
- package/src/lib/components/gallery/gallery.component.scss +930 -0
- package/src/lib/components/gallery/gallery.component.ts +3527 -0
- package/src/lib/components/group-select/group-select.component.html +44 -0
- package/src/lib/components/group-select/group-select.component.scss +144 -0
- package/src/lib/components/group-select/group-select.component.spec.ts +23 -0
- package/src/lib/components/group-select/group-select.component.ts +145 -0
- package/src/lib/components/image-popup/image-popup.component.html +11 -0
- package/src/lib/components/image-popup/image-popup.component.scss +5 -0
- package/src/lib/components/image-popup/image-popup.component.ts +18 -0
- package/src/lib/components/lib/custom-select/custom-select.component.html +42 -0
- package/src/lib/components/lib/custom-select/custom-select.component.scss +131 -0
- package/src/lib/components/lib/custom-select/custom-select.component.spec.ts +23 -0
- package/src/lib/components/lib/custom-select/custom-select.component.ts +151 -0
- package/src/lib/components/manage-task/manage-task.component.html +265 -0
- package/src/lib/components/manage-task/manage-task.component.scss +69 -0
- package/src/lib/components/manage-task/manage-task.component.spec.ts +23 -0
- package/src/lib/components/manage-task/manage-task.component.ts +267 -0
- package/src/lib/components/managechecklist/managechecklist.component.html +176 -0
- package/src/lib/components/managechecklist/managechecklist.component.scss +43 -0
- package/src/lib/components/managechecklist/managechecklist.component.spec.ts +23 -0
- package/src/lib/components/managechecklist/managechecklist.component.ts +176 -0
- package/src/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.html +46 -0
- package/src/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.scss +181 -0
- package/src/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.spec.ts +23 -0
- package/src/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.ts +221 -0
- package/src/lib/components/multi-date-datepicker/multi-date-datepicker.component.html +36 -0
- package/src/lib/components/multi-date-datepicker/multi-date-datepicker.component.scss +89 -0
- package/src/lib/components/multi-date-datepicker/multi-date-datepicker.component.spec.ts +23 -0
- package/src/lib/components/multi-date-datepicker/multi-date-datepicker.component.ts +118 -0
- package/src/lib/components/orders/orders.component.html +203 -0
- package/src/lib/components/orders/orders.component.scss +180 -0
- package/src/lib/components/orders/orders.component.spec.ts +25 -0
- package/src/lib/components/orders/orders.component.ts +197 -0
- package/src/lib/components/pagination/pagination.component.html +28 -0
- package/src/lib/components/pagination/pagination.component.scss +6 -0
- package/src/lib/components/pagination/pagination.component.spec.ts +23 -0
- package/src/lib/components/pagination/pagination.component.ts +54 -0
- package/src/lib/components/reactive-select/reactive-select.component.html +18 -0
- package/src/lib/components/reactive-select/reactive-select.component.scss +48 -0
- package/src/lib/components/reactive-select/reactive-select.component.spec.ts +23 -0
- package/src/lib/components/reactive-select/reactive-select.component.ts +104 -0
- package/src/lib/components/reports/date-picker/date-picker.component.html +54 -0
- package/src/lib/components/reports/date-picker/date-picker.component.scss +156 -0
- package/src/lib/components/reports/date-picker/date-picker.component.spec.ts +23 -0
- package/src/lib/components/reports/date-picker/date-picker.component.ts +60 -0
- package/src/lib/components/reports/reports.component.html +225 -0
- package/src/lib/components/reports/reports.component.scss +69 -0
- package/src/lib/components/reports/reports.component.spec.ts +23 -0
- package/src/lib/components/reports/reports.component.ts +334 -0
- package/{lib/components/reports/reports.interface.d.ts → src/lib/components/reports/reports.interface.ts} +50 -46
- package/src/lib/components/tango-analyse-trax/tango-analyse-trax.component.html +1 -0
- package/src/lib/components/tango-analyse-trax/tango-analyse-trax.component.scss +15 -0
- package/src/lib/components/tango-analyse-trax/tango-analyse-trax.component.spec.ts +23 -0
- package/src/lib/components/tango-analyse-trax/tango-analyse-trax.component.ts +31 -0
- package/src/lib/components/task/task.component.html +322 -0
- package/src/lib/components/task/task.component.scss +169 -0
- package/src/lib/components/task/task.component.spec.ts +23 -0
- package/src/lib/components/task/task.component.ts +340 -0
- package/src/lib/components/task-configure/task-configure.component.html +737 -0
- package/src/lib/components/task-configure/task-configure.component.scss +569 -0
- package/src/lib/components/task-configure/task-configure.component.spec.ts +23 -0
- package/src/lib/components/task-configure/task-configure.component.ts +1603 -0
- package/src/lib/components/task-configure/task-configure.interface.ts +138 -0
- package/src/lib/components/task-info/task-info.component.html +390 -0
- package/src/lib/components/task-info/task-info.component.scss +56 -0
- package/src/lib/components/task-info/task-info.component.spec.ts +23 -0
- package/src/lib/components/task-info/task-info.component.ts +400 -0
- package/src/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.html +141 -0
- package/src/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.scss +460 -0
- package/src/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.spec.ts +23 -0
- package/src/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.ts +202 -0
- package/src/lib/components/task-layout/task-layout.component.html +1 -0
- package/src/lib/components/task-layout/task-layout.component.scss +0 -0
- package/src/lib/components/task-layout/task-layout.component.spec.ts +23 -0
- package/src/lib/components/task-layout/task-layout.component.ts +10 -0
- package/src/lib/components/task-logs/task-logs.component.html +97 -0
- package/src/lib/components/task-logs/task-logs.component.scss +301 -0
- package/src/lib/components/task-logs/task-logs.component.spec.ts +23 -0
- package/src/lib/components/task-logs/task-logs.component.ts +80 -0
- package/src/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.html +84 -0
- package/src/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.scss +229 -0
- package/src/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.spec.ts +23 -0
- package/src/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.ts +111 -0
- package/src/lib/components/trax-store/trax-store.component.html +78 -0
- package/src/lib/components/trax-store/trax-store.component.scss +134 -0
- package/src/lib/components/trax-store/trax-store.component.spec.ts +23 -0
- package/src/lib/components/trax-store/trax-store.component.ts +172 -0
- package/src/lib/components/traxpopup/traxpopup.component.html +130 -0
- package/src/lib/components/traxpopup/traxpopup.component.scss +225 -0
- package/src/lib/components/traxpopup/traxpopup.component.spec.ts +23 -0
- package/src/lib/components/traxpopup/traxpopup.component.ts +71 -0
- package/src/lib/services/trax.service.spec.ts +16 -0
- package/src/lib/services/trax.service.ts +789 -0
- package/src/lib/tango-analyse-trax-routing.module.ts +151 -0
- package/src/lib/tango-analyse-trax.module.ts +140 -0
- package/{public-api.d.ts → src/public-api.ts} +6 -2
- package/tsconfig.lib.json +14 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/esm2022/lib/components/action-centre/action-centre.component.mjs +0 -288
- package/esm2022/lib/components/activity-log/activity-log.component.mjs +0 -150
- package/esm2022/lib/components/activity-log-v2/activity-log-v2.component.mjs +0 -502
- package/esm2022/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.mjs +0 -114
- package/esm2022/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.mjs +0 -24
- package/esm2022/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.mjs +0 -126
- package/esm2022/lib/components/add-checklist/add-checklist.component.mjs +0 -2352
- package/esm2022/lib/components/add-checklist/checklist-popup/checklist-popup.component.mjs +0 -612
- package/esm2022/lib/components/add-checklist/counter/counter.component.mjs +0 -138
- package/esm2022/lib/components/add-multitask/add-multitask.component.mjs +0 -604
- package/esm2022/lib/components/add-multitask/ascending-validator.mjs +0 -11
- package/esm2022/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.mjs +0 -297
- package/esm2022/lib/components/add-multitask/create-task.data.mjs +0 -372
- package/esm2022/lib/components/add-multitask/create-task.interface.mjs +0 -2
- package/esm2022/lib/components/add-multitask/unique-string-validator.mjs +0 -10
- package/esm2022/lib/components/add-multitask/whitespace-validator.mjs +0 -10
- package/esm2022/lib/components/add-task/add-task.component.mjs +0 -561
- package/esm2022/lib/components/add-task/ascending-validator.mjs +0 -11
- package/esm2022/lib/components/add-task/create-task.data.mjs +0 -372
- package/esm2022/lib/components/add-task/create-task.interface.mjs +0 -2
- package/esm2022/lib/components/add-task/unique-string-validator.mjs +0 -10
- package/esm2022/lib/components/add-task/whitespace-validator.mjs +0 -10
- package/esm2022/lib/components/approval-popup/approval-popup.component.mjs +0 -30
- package/esm2022/lib/components/checklist/checklist.component.mjs +0 -327
- package/esm2022/lib/components/checklist-configure/assign/assign.component.mjs +0 -912
- package/esm2022/lib/components/checklist-configure/checklist-configure.component.mjs +0 -4161
- package/esm2022/lib/components/checklistlayout/checklistlayout.component.mjs +0 -44
- package/esm2022/lib/components/chip-dropdown/chip-dropdown.component.mjs +0 -120
- package/esm2022/lib/components/create-task/create-task.component.mjs +0 -585
- package/esm2022/lib/components/create-task/create-task.data.mjs +0 -372
- package/esm2022/lib/components/create-task/create-task.interface.mjs +0 -2
- package/esm2022/lib/components/create-task/validators/ascending-validator.mjs +0 -11
- package/esm2022/lib/components/create-task/validators/unique-string-validator.mjs +0 -10
- package/esm2022/lib/components/create-task/validators/whitespace-validator.mjs +0 -10
- package/esm2022/lib/components/custom-select/custom-select.component.mjs +0 -240
- package/esm2022/lib/components/dashboard/dashboard.component.mjs +0 -532
- package/esm2022/lib/components/dashboard-info/dashboard-info.component.mjs +0 -741
- package/esm2022/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.mjs +0 -155
- package/esm2022/lib/components/dashboard-layout/dashboard-layout.component.mjs +0 -12
- package/esm2022/lib/components/disabled-select/disabled-select.component.mjs +0 -158
- package/esm2022/lib/components/export-gallery/export-gallery.component.mjs +0 -266
- package/esm2022/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.mjs +0 -105
- package/esm2022/lib/components/eye-test-audit/custom-select/custom-select.component.mjs +0 -240
- package/esm2022/lib/components/eye-test-audit/eye-test/eye-test.component.mjs +0 -1733
- package/esm2022/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.mjs +0 -24
- package/esm2022/lib/components/eye-test-audit/eye-test-audit/eye-test-audit-routing.module.mjs +0 -34
- package/esm2022/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.mjs +0 -27
- package/esm2022/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.module.mjs +0 -71
- package/esm2022/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.mjs +0 -823
- package/esm2022/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.mjs +0 -412
- package/esm2022/lib/components/eye-test-audit/group-select/group-select.component.mjs +0 -157
- package/esm2022/lib/components/eye-test-audit/reactive-select/reactive-select.component.mjs +0 -105
- package/esm2022/lib/components/eye-test-audit/select-drop/select-drop.component.mjs +0 -162
- package/esm2022/lib/components/eye-test-audit/services/eye-test-audit.service.mjs +0 -166
- package/esm2022/lib/components/flag-layout/flag-layout.component.mjs +0 -12
- package/esm2022/lib/components/flags/flags.component.mjs +0 -263
- package/esm2022/lib/components/flags/flags.interface.mjs +0 -2
- package/esm2022/lib/components/flags-info/flags-info.component.mjs +0 -452
- package/esm2022/lib/components/flags-info/flags-info.interface.mjs +0 -2
- package/esm2022/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.mjs +0 -71
- package/esm2022/lib/components/flags-new/flags-new.component.mjs +0 -335
- package/esm2022/lib/components/flags-new/flags-new.interface.mjs +0 -2
- package/esm2022/lib/components/gallery/gallery.component.mjs +0 -3402
- package/esm2022/lib/components/group-select/group-select.component.mjs +0 -155
- package/esm2022/lib/components/image-popup/image-popup.component.mjs +0 -25
- package/esm2022/lib/components/lib/custom-select/custom-select.component.mjs +0 -158
- package/esm2022/lib/components/manage-task/manage-task.component.mjs +0 -264
- package/esm2022/lib/components/managechecklist/managechecklist.component.mjs +0 -186
- package/esm2022/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.mjs +0 -229
- package/esm2022/lib/components/multi-date-datepicker/multi-date-datepicker.component.mjs +0 -124
- package/esm2022/lib/components/orders/orders.component.mjs +0 -171
- package/esm2022/lib/components/pagination/pagination.component.mjs +0 -62
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +0 -108
- package/esm2022/lib/components/reports/date-picker/date-picker.component.mjs +0 -60
- package/esm2022/lib/components/reports/reports.component.mjs +0 -300
- package/esm2022/lib/components/reports/reports.interface.mjs +0 -2
- package/esm2022/lib/components/tango-analyse-trax/tango-analyse-trax.component.mjs +0 -32
- package/esm2022/lib/components/task/task.component.mjs +0 -341
- package/esm2022/lib/components/task-configure/task-configure.component.mjs +0 -1532
- package/esm2022/lib/components/task-configure/task-configure.interface.mjs +0 -2
- package/esm2022/lib/components/task-info/task-info.component.mjs +0 -375
- package/esm2022/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.mjs +0 -208
- package/esm2022/lib/components/task-layout/task-layout.component.mjs +0 -12
- package/esm2022/lib/components/task-logs/task-logs.component.mjs +0 -104
- package/esm2022/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.mjs +0 -107
- package/esm2022/lib/components/trax-store/trax-store.component.mjs +0 -179
- package/esm2022/lib/components/traxpopup/traxpopup.component.mjs +0 -70
- package/esm2022/lib/services/trax.service.mjs +0 -559
- package/esm2022/lib/tango-analyse-trax-routing.module.mjs +0 -153
- package/esm2022/lib/tango-analyse-trax.module.mjs +0 -221
- package/esm2022/public-api.mjs +0 -6
- package/esm2022/tango-app-ui-analyse-trax.mjs +0 -5
- package/fesm2022/tango-app-ui-analyse-trax.mjs +0 -28896
- package/fesm2022/tango-app-ui-analyse-trax.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/components/action-centre/action-centre.component.d.ts +0 -68
- package/lib/components/activity-log/activity-log.component.d.ts +0 -39
- package/lib/components/activity-log-v2/activity-log-v2.component.d.ts +0 -78
- package/lib/components/activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component.d.ts +0 -24
- package/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.d.ts +0 -9
- package/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.d.ts +0 -34
- package/lib/components/add-checklist/add-checklist.component.d.ts +0 -121
- package/lib/components/add-checklist/checklist-popup/checklist-popup.component.d.ts +0 -45
- package/lib/components/add-checklist/counter/counter.component.d.ts +0 -29
- package/lib/components/add-multitask/add-multitask.component.d.ts +0 -102
- package/lib/components/add-multitask/ascending-validator.d.ts +0 -2
- package/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.d.ts +0 -45
- package/lib/components/add-multitask/create-task.data.d.ts +0 -293
- package/lib/components/add-multitask/create-task.interface.d.ts +0 -159
- package/lib/components/add-multitask/unique-string-validator.d.ts +0 -2
- package/lib/components/add-multitask/whitespace-validator.d.ts +0 -2
- package/lib/components/add-task/add-task.component.d.ts +0 -89
- package/lib/components/add-task/ascending-validator.d.ts +0 -2
- package/lib/components/add-task/create-task.data.d.ts +0 -293
- package/lib/components/add-task/create-task.interface.d.ts +0 -161
- package/lib/components/add-task/unique-string-validator.d.ts +0 -2
- package/lib/components/add-task/whitespace-validator.d.ts +0 -2
- package/lib/components/approval-popup/approval-popup.component.d.ts +0 -14
- package/lib/components/checklist/checklist.component.d.ts +0 -40
- package/lib/components/checklist-configure/assign/assign.component.d.ts +0 -105
- package/lib/components/checklist-configure/checklist-configure.component.d.ts +0 -325
- package/lib/components/checklistlayout/checklistlayout.component.d.ts +0 -15
- package/lib/components/chip-dropdown/chip-dropdown.component.d.ts +0 -28
- package/lib/components/create-task/create-task.component.d.ts +0 -76
- package/lib/components/create-task/create-task.data.d.ts +0 -293
- package/lib/components/create-task/create-task.interface.d.ts +0 -163
- package/lib/components/create-task/validators/ascending-validator.d.ts +0 -2
- package/lib/components/create-task/validators/unique-string-validator.d.ts +0 -2
- package/lib/components/create-task/validators/whitespace-validator.d.ts +0 -2
- package/lib/components/custom-select/custom-select.component.d.ts +0 -35
- package/lib/components/dashboard/dashboard.component.d.ts +0 -80
- package/lib/components/dashboard-info/dashboard-info.component.d.ts +0 -117
- package/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.d.ts +0 -41
- package/lib/components/dashboard-layout/dashboard-layout.component.d.ts +0 -5
- package/lib/components/disabled-select/disabled-select.component.d.ts +0 -34
- package/lib/components/export-gallery/export-gallery.component.d.ts +0 -44
- package/lib/components/eye-test-audit/chip-dropdown/chip-dropdown.component.d.ts +0 -26
- package/lib/components/eye-test-audit/custom-select/custom-select.component.d.ts +0 -35
- package/lib/components/eye-test-audit/eye-test/eye-test.component.d.ts +0 -218
- package/lib/components/eye-test-audit/eye-test/send-alert/send-alert.component.d.ts +0 -12
- package/lib/components/eye-test-audit/eye-test-audit/eye-test-audit-routing.module.d.ts +0 -7
- package/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.component.d.ts +0 -11
- package/lib/components/eye-test-audit/eye-test-audit/eye-test-audit.module.d.ts +0 -21
- package/lib/components/eye-test-audit/eye-test-audit/settings-audit/settings-audit.component.d.ts +0 -129
- package/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.d.ts +0 -86
- package/lib/components/eye-test-audit/group-select/group-select.component.d.ts +0 -33
- package/lib/components/eye-test-audit/reactive-select/reactive-select.component.d.ts +0 -32
- package/lib/components/eye-test-audit/select-drop/select-drop.component.d.ts +0 -33
- package/lib/components/eye-test-audit/services/eye-test-audit.service.d.ts +0 -47
- package/lib/components/flag-layout/flag-layout.component.d.ts +0 -5
- package/lib/components/flags/flags.component.d.ts +0 -52
- package/lib/components/flags-info/flags-info.component.d.ts +0 -73
- package/lib/components/flags-info/flags-info.interface.d.ts +0 -430
- package/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.d.ts +0 -13
- package/lib/components/flags-new/flags-new.component.d.ts +0 -60
- package/lib/components/gallery/gallery.component.d.ts +0 -261
- package/lib/components/group-select/group-select.component.d.ts +0 -33
- package/lib/components/image-popup/image-popup.component.d.ts +0 -11
- package/lib/components/lib/custom-select/custom-select.component.d.ts +0 -33
- package/lib/components/manage-task/manage-task.component.d.ts +0 -47
- package/lib/components/managechecklist/managechecklist.component.d.ts +0 -33
- package/lib/components/multi-chip-dropdown/multi-chip-dropdown.component.d.ts +0 -40
- package/lib/components/multi-date-datepicker/multi-date-datepicker.component.d.ts +0 -27
- package/lib/components/orders/orders.component.d.ts +0 -38
- package/lib/components/pagination/pagination.component.d.ts +0 -16
- package/lib/components/reactive-select/reactive-select.component.d.ts +0 -32
- package/lib/components/reports/date-picker/date-picker.component.d.ts +0 -23
- package/lib/components/reports/reports.component.d.ts +0 -55
- package/lib/components/tango-analyse-trax/tango-analyse-trax.component.d.ts +0 -14
- package/lib/components/task/task.component.d.ts +0 -70
- package/lib/components/task-configure/task-configure.component.d.ts +0 -142
- package/lib/components/task-configure/task-configure.interface.d.ts +0 -128
- package/lib/components/task-info/task-info.component.d.ts +0 -76
- package/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.d.ts +0 -61
- package/lib/components/task-layout/task-layout.component.d.ts +0 -5
- package/lib/components/task-logs/task-logs.component.d.ts +0 -27
- package/lib/components/trax-run-ai-popup/trax-run-ai-popup.component.d.ts +0 -26
- package/lib/components/trax-store/trax-store.component.d.ts +0 -45
- package/lib/components/traxpopup/traxpopup.component.d.ts +0 -24
- package/lib/services/trax.service.d.ts +0 -175
- package/lib/tango-analyse-trax-routing.module.d.ts +0 -7
- package/lib/tango-analyse-trax.module.d.ts +0 -68
|
@@ -1,1532 +0,0 @@
|
|
|
1
|
-
import { Component, ViewChild } from '@angular/core';
|
|
2
|
-
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
3
|
-
import { BehaviorSubject, Subject, debounceTime, distinctUntilChanged, takeUntil } from "rxjs";
|
|
4
|
-
import dayjs from 'dayjs';
|
|
5
|
-
import utc from 'dayjs/plugin/utc';
|
|
6
|
-
import { FormControl } from '@angular/forms';
|
|
7
|
-
import { TraxStoreComponent } from '../trax-store/trax-store.component';
|
|
8
|
-
import * as XLSX from 'xlsx';
|
|
9
|
-
import { TraxpopupComponent } from '../traxpopup/traxpopup.component';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@angular/router";
|
|
12
|
-
import * as i2 from "tango-app-ui-global";
|
|
13
|
-
import * as i3 from "../../services/trax.service";
|
|
14
|
-
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
15
|
-
import * as i5 from "tango-app-ui-shared";
|
|
16
|
-
import * as i6 from "@angular/forms";
|
|
17
|
-
import * as i7 from "@angular/common";
|
|
18
|
-
import * as i8 from "ngx-daterangepicker-material";
|
|
19
|
-
import * as i9 from "../chip-dropdown/chip-dropdown.component";
|
|
20
|
-
import * as i10 from "../multi-chip-dropdown/multi-chip-dropdown.component";
|
|
21
|
-
dayjs.extend(utc);
|
|
22
|
-
dayjs.extend(customParseFormat);
|
|
23
|
-
export class TaskConfigureComponent {
|
|
24
|
-
route;
|
|
25
|
-
pageInfo;
|
|
26
|
-
traxService;
|
|
27
|
-
dialog;
|
|
28
|
-
toastService;
|
|
29
|
-
router;
|
|
30
|
-
cd;
|
|
31
|
-
fb;
|
|
32
|
-
destroy$ = new Subject();
|
|
33
|
-
dayjs = dayjs;
|
|
34
|
-
scheduleDate;
|
|
35
|
-
minDate = this.dayjs().format();
|
|
36
|
-
scheduleEndTime = new FormControl(this.getCurrentTime());
|
|
37
|
-
currentTaskId;
|
|
38
|
-
headerData;
|
|
39
|
-
taskDetails;
|
|
40
|
-
approver = new FormControl();
|
|
41
|
-
priorityType = new FormControl('high');
|
|
42
|
-
allowedStoreLocation = new FormControl(false);
|
|
43
|
-
restrictAttendance = new FormControl(false);
|
|
44
|
-
approversList;
|
|
45
|
-
assignTableApiState = new BehaviorSubject('loading');
|
|
46
|
-
assignTableData;
|
|
47
|
-
itemsPerPage = 5;
|
|
48
|
-
currentPage = 1;
|
|
49
|
-
totalItems = 0;
|
|
50
|
-
configData;
|
|
51
|
-
storeCoverage = true;
|
|
52
|
-
userCoverage = false;
|
|
53
|
-
reupload = false;
|
|
54
|
-
userData = [];
|
|
55
|
-
listofId;
|
|
56
|
-
excelUserData = [];
|
|
57
|
-
assignType;
|
|
58
|
-
initialLoading = true;
|
|
59
|
-
assignSingle;
|
|
60
|
-
assignGroup;
|
|
61
|
-
singleAssign;
|
|
62
|
-
groupAssign;
|
|
63
|
-
paginationSizes = [5, 10, 20, 30];
|
|
64
|
-
pageSize = 5;
|
|
65
|
-
searchInput = new FormControl('');
|
|
66
|
-
selectAllInput = new FormControl(false);
|
|
67
|
-
removedUsers = new Set();
|
|
68
|
-
added = [];
|
|
69
|
-
removed = [];
|
|
70
|
-
fileInput;
|
|
71
|
-
fileInput1;
|
|
72
|
-
bulkupload;
|
|
73
|
-
afterValidation;
|
|
74
|
-
confirmUser;
|
|
75
|
-
reminderRepeatSchedules;
|
|
76
|
-
reminderRepeatScheduleOptions = [30, 45, 60, 75, 90];
|
|
77
|
-
constructor(route, pageInfo, traxService, dialog, toastService, router, cd, fb) {
|
|
78
|
-
this.route = route;
|
|
79
|
-
this.pageInfo = pageInfo;
|
|
80
|
-
this.traxService = traxService;
|
|
81
|
-
this.dialog = dialog;
|
|
82
|
-
this.toastService = toastService;
|
|
83
|
-
this.router = router;
|
|
84
|
-
this.cd = cd;
|
|
85
|
-
this.fb = fb;
|
|
86
|
-
this.headerData = JSON.parse(localStorage.getItem('header-filters'));
|
|
87
|
-
this.searchInput.valueChanges.pipe(takeUntil(this.destroy$)).pipe(debounceTime(1000), distinctUntilChanged()).subscribe((val) => {
|
|
88
|
-
if (val === null || val === undefined) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
this.selectAllInput.valueChanges.pipe(takeUntil(this.destroy$)).subscribe((val) => {
|
|
93
|
-
if (val === null || val === undefined) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
if (val) {
|
|
97
|
-
this.assignTableData?.forEach(val => val.checkFlag = true);
|
|
98
|
-
this.removedUsers.clear();
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
this.assignTableData?.forEach(val => { val.checkFlag = false, this.onUserAssignChange(val.checkFlag, val.id); });
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
this.reminderRepeatSchedules = this.fb.array([]);
|
|
105
|
-
}
|
|
106
|
-
ngOnDestroy() {
|
|
107
|
-
this.destroy$.next(true);
|
|
108
|
-
this.destroy$.complete();
|
|
109
|
-
}
|
|
110
|
-
ngOnInit() {
|
|
111
|
-
this.scheduleDate = { startDate: this.dayjs().format('DD-MM-YYYY'), endDate: this.dayjs().format('DD-MM-YYYY') };
|
|
112
|
-
this.setPageData();
|
|
113
|
-
this.route.queryParams
|
|
114
|
-
.pipe(takeUntil(this.destroy$))
|
|
115
|
-
.subscribe((params) => {
|
|
116
|
-
if (params?.taskId) {
|
|
117
|
-
this.currentTaskId = params.taskId;
|
|
118
|
-
this.getTask(this.currentTaskId);
|
|
119
|
-
this.getClientUser();
|
|
120
|
-
this.selectInitialTab();
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
setPageData() {
|
|
125
|
-
this.pageInfo.setTitle("Tasks");
|
|
126
|
-
this.pageInfo.setDescription("");
|
|
127
|
-
this.pageInfo.setBreadcrumbs([
|
|
128
|
-
{ title: "Tango Trax", path: "/manage/trax/dashboard", isActive: false, isSeparator: false },
|
|
129
|
-
{ title: "Tango Trax", path: "/manage/trax/dashboard", isActive: false, isSeparator: true }
|
|
130
|
-
]);
|
|
131
|
-
}
|
|
132
|
-
getTask(id) {
|
|
133
|
-
this.traxService.getTaskconfig(id, this.headerData?.client).pipe(takeUntil(this.destroy$)).subscribe({
|
|
134
|
-
next: (res) => {
|
|
135
|
-
if (res?.code === 200) {
|
|
136
|
-
this.configData = res?.data;
|
|
137
|
-
this.taskDetails = res.data.checkListDetails;
|
|
138
|
-
this.taskDetails.assign = [];
|
|
139
|
-
// this.idList = this.configData.checkListDetails.assignedusers;
|
|
140
|
-
// this.listofId = this.configData.checkListDetails.assignedusers;
|
|
141
|
-
this.coverage = this.configData.checkListDetails.coverage;
|
|
142
|
-
this.selectRadio(this.coverage);
|
|
143
|
-
if (this.taskDetails?.scheduleDate) {
|
|
144
|
-
if (dayjs(this.taskDetails.scheduleDate).isBefore(dayjs())) {
|
|
145
|
-
this.minDate = this.dayjs(this.taskDetails.scheduleDate).format();
|
|
146
|
-
}
|
|
147
|
-
this.scheduleDate = { startDate: this.dayjs(this.taskDetails.scheduleDate).utc().format('DD-MM-YYYY'), endDate: this.dayjs(this.taskDetails.scheduleDate).utc().format('DD-MM-YYYY') };
|
|
148
|
-
}
|
|
149
|
-
if (!this.taskDetails?.removedUsers?.length) {
|
|
150
|
-
this.selectAllInput.setValue(true, { emitEvent: false });
|
|
151
|
-
}
|
|
152
|
-
if (this.taskDetails?.scheduleEndTime) {
|
|
153
|
-
this.scheduleEndTime.setValue(dayjs(this.taskDetails?.scheduleEndTime, 'hh:mm A').format('HH:mm'));
|
|
154
|
-
}
|
|
155
|
-
if (this.taskDetails?.approver?.length) {
|
|
156
|
-
this.approver.setValue(this.taskDetails?.approver);
|
|
157
|
-
}
|
|
158
|
-
if (this.taskDetails?.priorityType) {
|
|
159
|
-
this.priorityType.setValue(this.taskDetails?.priorityType);
|
|
160
|
-
}
|
|
161
|
-
if (this.taskDetails?.allowedStoreLocation === true || this.taskDetails?.allowedStoreLocation === false) {
|
|
162
|
-
this.allowedStoreLocation.setValue(this.taskDetails?.allowedStoreLocation);
|
|
163
|
-
}
|
|
164
|
-
if (this.taskDetails?.restrictAttendance === true || this.taskDetails?.restrictAttendance === false) {
|
|
165
|
-
this.restrictAttendance.setValue(this.taskDetails?.restrictAttendance);
|
|
166
|
-
}
|
|
167
|
-
if (this.taskDetails?.remainder?.length) {
|
|
168
|
-
this.reminderRepeatSchedules.clear();
|
|
169
|
-
this.taskDetails?.remainder.forEach((item) => {
|
|
170
|
-
this.reminderRepeatSchedules.push(this.fb.control(item));
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
selectedTab(value) {
|
|
178
|
-
this.tableArray = [];
|
|
179
|
-
this.assignTableData = [];
|
|
180
|
-
this.assignType = value;
|
|
181
|
-
this.currentPage = 1;
|
|
182
|
-
this.pageSize = 5;
|
|
183
|
-
this.searchInput.setValue('');
|
|
184
|
-
this.configData.checkListDetails.assign = [];
|
|
185
|
-
this.getassignDropdown();
|
|
186
|
-
}
|
|
187
|
-
selectInitialTab() {
|
|
188
|
-
this.storeCoverage ? this.assignType = 'store' : this.assignType = 'user';
|
|
189
|
-
}
|
|
190
|
-
getCurrentTime() {
|
|
191
|
-
// const now = new Date();
|
|
192
|
-
// const hours = now.getHours().toString().padStart(2, '0');
|
|
193
|
-
// const minutes = now.getMinutes().toString().padStart(2, '0');
|
|
194
|
-
// return `${hours}:${minutes}`;
|
|
195
|
-
return '23:59';
|
|
196
|
-
}
|
|
197
|
-
get dueDateFormatted() {
|
|
198
|
-
return this.dayjs(this.scheduleDate.startDate, 'DD-MM-YYYY')?.format('DD MMM YYYY');
|
|
199
|
-
}
|
|
200
|
-
get dueTimeFormatted() {
|
|
201
|
-
return dayjs(this.scheduleEndTime.value, 'HH:mm').format('h:mm A');
|
|
202
|
-
}
|
|
203
|
-
getClientUser() {
|
|
204
|
-
this.traxService.getClientUser(this.headerData.client).pipe(takeUntil(this.destroy$)).subscribe((res) => {
|
|
205
|
-
if (res && res.code == 200 && res.data.length) {
|
|
206
|
-
this.approversList = res.data.map((item) => { return { name: item.userName, value: item.email, role: item.role }; });
|
|
207
|
-
if (!this.taskDetails?.approver?.length) {
|
|
208
|
-
let userInfo = JSON.parse(localStorage.getItem('user-info') || '{}');
|
|
209
|
-
if (userInfo?.userType == 'tango' || (userInfo?.userType == 'client' && userInfo?.role == 'user')) {
|
|
210
|
-
let userList = this.approversList.find((ele) => ele.role == 'superadmin');
|
|
211
|
-
if (userList) {
|
|
212
|
-
this.approver.setValue([{ name: userList.name, value: userList.value }]);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
this.approver.setValue([this.approversList.find((ele) => ele.value == userInfo.email)]);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
this.approversList = [];
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
onSubmit(action) {
|
|
226
|
-
const payload = {
|
|
227
|
-
scheduleDate: this.dayjs(this.scheduleDate.startDate, 'DD-MM-YYYY').format('YYYY-MM-DD'),
|
|
228
|
-
scheduleEndTime: this.dayjs(this.scheduleEndTime.value, 'HH:mm').format('hh:mm A'),
|
|
229
|
-
approver: this.approver.value ?? [],
|
|
230
|
-
priorityType: this.priorityType.value,
|
|
231
|
-
allowedStoreLocation: this.allowedStoreLocation.value,
|
|
232
|
-
restrictAttendance: this.restrictAttendance.value,
|
|
233
|
-
clientId: this.headerData?.client,
|
|
234
|
-
submitType: action,
|
|
235
|
-
_id: this.taskDetails?._id,
|
|
236
|
-
removedUsers: [...this.removedUsers],
|
|
237
|
-
remainder: this.reminderRepeatSchedules?.value || [],
|
|
238
|
-
...(action === 'publish') ? { publish: true } : { publish: false },
|
|
239
|
-
assignedUsers: [...this.singleAssign, ...this.groupAssign],
|
|
240
|
-
storeCount: this.assignSingle?.length + this.groupAssign?.length,
|
|
241
|
-
coverage: this.coverage,
|
|
242
|
-
added: this.added,
|
|
243
|
-
removed: this.removed
|
|
244
|
-
};
|
|
245
|
-
if (action === 'publish') {
|
|
246
|
-
let popupcontent = {
|
|
247
|
-
displayprop: false,
|
|
248
|
-
imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#D1FADF"/><path d="M38 27.0818V28.0018C37.9988 30.1582 37.3005 32.2565 36.0093 33.9836C34.7182 35.7108 32.9033 36.9743 30.8354 37.5857C28.7674 38.1971 26.5573 38.1237 24.5345 37.3764C22.5117 36.6291 20.7847 35.2479 19.611 33.4389C18.4373 31.6299 17.8798 29.4899 18.0217 27.3381C18.1636 25.1864 18.9972 23.1381 20.3983 21.4989C21.7994 19.8596 23.6928 18.7172 25.7962 18.242C27.8996 17.7667 30.1003 17.9842 32.07 18.8618M38 20.0018L28 30.0118L25 27.0118" stroke="#039855" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#ECFDF3" stroke-width="8"/></svg>`,
|
|
249
|
-
title: `Are you sure you want to publish ${this.taskDetails?.checkListName} task?`,
|
|
250
|
-
content: `Publishing will make this task live, and changes will take effect immediately.`,
|
|
251
|
-
buttontype: 'confirm'
|
|
252
|
-
};
|
|
253
|
-
const dialogRef = this.dialog.open(TraxpopupComponent, { centered: true, size: 'md' });
|
|
254
|
-
dialogRef.componentInstance.data = popupcontent;
|
|
255
|
-
dialogRef.result.then((res) => {
|
|
256
|
-
if (res == 'confirm') {
|
|
257
|
-
this.traxService.configTask(payload).pipe(takeUntil(this.destroy$)).subscribe({
|
|
258
|
-
next: (res) => {
|
|
259
|
-
if (res.code === 200) {
|
|
260
|
-
if (action) {
|
|
261
|
-
this.toastService.getSuccessToast(res?.data?.message || 'Configuration updated successfully');
|
|
262
|
-
this.router.navigate(['manage/trax/checklist/managetask']);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
},
|
|
266
|
-
error: (err) => {
|
|
267
|
-
this.toastService.getErrorToast(err?.error?.error?.message || 'Something went wrong');
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
else if (action === 'save') {
|
|
274
|
-
const dialogRef = this.dialog.open(TraxpopupComponent, { centered: true, size: 'md' });
|
|
275
|
-
dialogRef.componentInstance.data = {
|
|
276
|
-
imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>`,
|
|
277
|
-
title: `Unsaved changes`,
|
|
278
|
-
content: `Do you want to save as draft?`,
|
|
279
|
-
buttontype: 'draft'
|
|
280
|
-
};
|
|
281
|
-
dialogRef.result.then((res) => {
|
|
282
|
-
if (res === 'confirm') {
|
|
283
|
-
this.traxService.configTask(payload).pipe(takeUntil(this.destroy$)).subscribe({
|
|
284
|
-
next: (res) => {
|
|
285
|
-
if (res.code === 200) {
|
|
286
|
-
if (action) {
|
|
287
|
-
this.toastService.getSuccessToast(res?.data?.message || 'Configuration updated successfully');
|
|
288
|
-
this.router.navigate(['manage/trax/checklist/managetask']);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
},
|
|
292
|
-
error: (err) => {
|
|
293
|
-
this.toastService.getErrorToast(err?.error?.error?.message || 'Something went wrong');
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
detassignUpdate(action) {
|
|
301
|
-
const payload = {
|
|
302
|
-
"taskId": this.currentTaskId,
|
|
303
|
-
"assignedList": this.assignSingle || [],
|
|
304
|
-
"assignedGroup": this.assignGroup || [],
|
|
305
|
-
"clientId": this.headerData?.client,
|
|
306
|
-
"coverage": this.coverage
|
|
307
|
-
};
|
|
308
|
-
this.traxService.assigntaskUpdate(payload).pipe(takeUntil(this.destroy$)).subscribe({
|
|
309
|
-
next: (res) => {
|
|
310
|
-
if (res && res?.code == 200) {
|
|
311
|
-
this.added = res?.data?.added;
|
|
312
|
-
this.removed = res?.data?.removed;
|
|
313
|
-
this.onSubmit(action);
|
|
314
|
-
}
|
|
315
|
-
},
|
|
316
|
-
error: (err) => {
|
|
317
|
-
this.toastService.getErrorToast(err);
|
|
318
|
-
},
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
onApproveAdded(event) {
|
|
322
|
-
this.approver.setValue(event);
|
|
323
|
-
}
|
|
324
|
-
idList = [];
|
|
325
|
-
getInitialData(data, change) {
|
|
326
|
-
let tempId = data.map((el) => el?.id);
|
|
327
|
-
let res = this.storeList.filter((el) => tempId.includes(el?._id));
|
|
328
|
-
res.forEach((element) => element.isSelected = true);
|
|
329
|
-
this.taskDetails.assign = res;
|
|
330
|
-
if (this.assignType === 'store' || this.assignType === 'user') {
|
|
331
|
-
this.assignTableApiState.next('loaded');
|
|
332
|
-
// this.userDetails(),
|
|
333
|
-
// (this.assignType === 'store' && this.initialLoading) ? (this.initialLoading = false) : this.getTableData(change ? change : '');
|
|
334
|
-
this.idList = this.singleAssign;
|
|
335
|
-
}
|
|
336
|
-
else {
|
|
337
|
-
this.idList = this.groupAssign;
|
|
338
|
-
this.userDetailsV2();
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
getTableData(change) {
|
|
342
|
-
let count = 0;
|
|
343
|
-
if (this.assignSingle?.length) {
|
|
344
|
-
if (this.taskDetails.assign.length != this.assignSingle.length) {
|
|
345
|
-
count++;
|
|
346
|
-
}
|
|
347
|
-
this.taskDetails.assign.forEach((assign) => {
|
|
348
|
-
let findList = this.assignSingle.filter((item) => item.storeId == assign.storeId);
|
|
349
|
-
if (findList.length) {
|
|
350
|
-
if (findList.length > 1) {
|
|
351
|
-
count++;
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
if (assign.userEmail.toLowerCase() != findList[0].userEmail.toLowerCase() && this.coverage === 'store') {
|
|
355
|
-
assign.userEmail = findList[0].userEmail;
|
|
356
|
-
assign.userName = findList[0].userName;
|
|
357
|
-
count++;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
});
|
|
362
|
-
if (count) {
|
|
363
|
-
this.upload = change ? 'upload' : 'store';
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
// this.tableArray = this.assignSingle ? this.assignSingle : this.taskDetails.assign;
|
|
367
|
-
change ? this.tableArray = this.assignSingle : [];
|
|
368
|
-
if (this.upload === 'store') {
|
|
369
|
-
let table = [...this.tableArray, ...this.taskDetails.assign];
|
|
370
|
-
let uniqueTable = new Map();
|
|
371
|
-
// Convert objects to JSON strings for full comparison
|
|
372
|
-
table.forEach((item) => {
|
|
373
|
-
item = {
|
|
374
|
-
storeName: item?.storeName,
|
|
375
|
-
storeId: item.storeId,
|
|
376
|
-
userEmail: item.userEmail.toLowerCase(),
|
|
377
|
-
userName: item.userName,
|
|
378
|
-
_id: item._id
|
|
379
|
-
};
|
|
380
|
-
let data = {
|
|
381
|
-
_id: item._id,
|
|
382
|
-
...(this.storeCoverage) ? { userEmail: item.userEmail.toLowerCase(), storeName: item?.storeName } : {},
|
|
383
|
-
};
|
|
384
|
-
let key = JSON.stringify(data); // Convert entire object to string as a key
|
|
385
|
-
if (!uniqueTable.has(data)) {
|
|
386
|
-
uniqueTable.set(key, item); // Store the object only if it's completely unique
|
|
387
|
-
}
|
|
388
|
-
});
|
|
389
|
-
this.assignSingle = Array.from(uniqueTable.values());
|
|
390
|
-
this.tableArray = this.assignSingle;
|
|
391
|
-
}
|
|
392
|
-
else if (this.upload === 'upload') {
|
|
393
|
-
this.tableArray = this.assignSingle;
|
|
394
|
-
}
|
|
395
|
-
else {
|
|
396
|
-
this.tableArray = this.taskDetails.assign;
|
|
397
|
-
this.assignSingle = this.tableArray;
|
|
398
|
-
}
|
|
399
|
-
// this.tableArray?.length ? this.assignTableApiState.next('loaded') : this.assignTableApiState.next('loading');
|
|
400
|
-
this.totalItems = this.tableArray.length;
|
|
401
|
-
if (this.totalItems < 5) {
|
|
402
|
-
this.paginationSizes = [this.totalItems];
|
|
403
|
-
this.pageSize = this.totalItems;
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
406
|
-
this.paginationSizes = [5, 10, 15, 20];
|
|
407
|
-
this.pageSize = 5;
|
|
408
|
-
}
|
|
409
|
-
this.assignTableApiState.next('loaded');
|
|
410
|
-
this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
|
|
411
|
-
}
|
|
412
|
-
coverage = 'store';
|
|
413
|
-
selectRadio(data) {
|
|
414
|
-
this.coverage = data;
|
|
415
|
-
this.currentPage = 1;
|
|
416
|
-
this.pageSize = 5;
|
|
417
|
-
this.searchInput.setValue('');
|
|
418
|
-
this.taskDetails.assign = [];
|
|
419
|
-
this.tableArray = [];
|
|
420
|
-
this.assignTableData = [];
|
|
421
|
-
if (data === 'store') {
|
|
422
|
-
this.storeCoverage = true;
|
|
423
|
-
this.userCoverage = false;
|
|
424
|
-
}
|
|
425
|
-
else if (data === 'user') {
|
|
426
|
-
this.userCoverage = true;
|
|
427
|
-
this.storeCoverage = false;
|
|
428
|
-
}
|
|
429
|
-
this.selectInitialTab();
|
|
430
|
-
if (this.coverage === this.configData.checkListDetails.coverage) {
|
|
431
|
-
this.singleAssign = this.configData.checkListDetails.singleAssign;
|
|
432
|
-
this.groupAssign = this.configData.checkListDetails.groupAssign;
|
|
433
|
-
setTimeout(() => {
|
|
434
|
-
this.assignType ? this.userDetails() : '';
|
|
435
|
-
}, 3000);
|
|
436
|
-
}
|
|
437
|
-
else {
|
|
438
|
-
this.singleAssign = [];
|
|
439
|
-
this.groupAssign = [];
|
|
440
|
-
this.assignSingle = [], this.assignGroup = [];
|
|
441
|
-
this.assignTableApiState.next('loading');
|
|
442
|
-
}
|
|
443
|
-
this.getassignDropdown();
|
|
444
|
-
}
|
|
445
|
-
confirmUserpopup() {
|
|
446
|
-
const dialogRef = this.dialog.open(this.confirmUser, { centered: true, backdrop: 'static' });
|
|
447
|
-
dialogRef.closed.subscribe((res) => {
|
|
448
|
-
if (res === 'confirm') {
|
|
449
|
-
this.validateDetails('addUser');
|
|
450
|
-
}
|
|
451
|
-
});
|
|
452
|
-
}
|
|
453
|
-
storeList = [];
|
|
454
|
-
searchKey = [];
|
|
455
|
-
getassignDropdown(change) {
|
|
456
|
-
let data = {
|
|
457
|
-
"clientId": this.headerData?.client,
|
|
458
|
-
"coverage": this.coverage,
|
|
459
|
-
"assignType": this.assignType
|
|
460
|
-
};
|
|
461
|
-
this.storeList = [];
|
|
462
|
-
this.traxService.getassignDropdown(data).subscribe((res) => {
|
|
463
|
-
if (res && res.code == 200 && res.data.data.length) {
|
|
464
|
-
this.storeList = res?.data?.data;
|
|
465
|
-
if (data?.coverage === 'store') {
|
|
466
|
-
this.searchKey = ['storeName', 'clusterName'];
|
|
467
|
-
}
|
|
468
|
-
else if (data?.coverage === 'user') {
|
|
469
|
-
this.searchKey = ['userName', 'teamName'];
|
|
470
|
-
}
|
|
471
|
-
!change ? this.getInitialData((this.assignType === 'store' || this.assignType === 'user') ? this.singleAssign : this.groupAssign, change ? change : '') : '';
|
|
472
|
-
this.cd.detectChanges();
|
|
473
|
-
}
|
|
474
|
-
else {
|
|
475
|
-
this.storeList = [];
|
|
476
|
-
}
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
userDetailsV2(data) {
|
|
480
|
-
const payload = {
|
|
481
|
-
"taskId": this.currentTaskId,
|
|
482
|
-
"idList": this.idList,
|
|
483
|
-
"coverage": this.coverage,
|
|
484
|
-
"clientId": this.headerData?.client,
|
|
485
|
-
"search": this.searchInput.value
|
|
486
|
-
};
|
|
487
|
-
this.assignTableApiState.next('loading');
|
|
488
|
-
this.tableArray = [];
|
|
489
|
-
this.assignTableData = [];
|
|
490
|
-
this.traxService.selecttaskChips(payload).pipe(takeUntil(this.destroy$)).subscribe({
|
|
491
|
-
next: (res) => {
|
|
492
|
-
if (res && res?.code === 200) {
|
|
493
|
-
this.assignTableApiState.next('loaded');
|
|
494
|
-
this.tableArray = res?.data?.uniqueArr;
|
|
495
|
-
this.assignGroup = this.tableArray;
|
|
496
|
-
this.totalItems = res?.data?.count;
|
|
497
|
-
if (this.totalItems < 5) {
|
|
498
|
-
this.paginationSizes = [this.totalItems];
|
|
499
|
-
this.pageSize = this.totalItems;
|
|
500
|
-
}
|
|
501
|
-
else {
|
|
502
|
-
this.paginationSizes = [5, 10, 15, 20];
|
|
503
|
-
this.pageSize = 5;
|
|
504
|
-
}
|
|
505
|
-
this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
|
|
506
|
-
// console.log('assignTableData?.length', this.assignTableData?.length)
|
|
507
|
-
}
|
|
508
|
-
else {
|
|
509
|
-
this.tableArray = [];
|
|
510
|
-
this.assignTableData = [];
|
|
511
|
-
this.assignTableApiState.next('loaded');
|
|
512
|
-
// this.showImage = true;
|
|
513
|
-
// this.tableLoading = true;
|
|
514
|
-
}
|
|
515
|
-
// this.storeCoverage ? this.getInitialData(res?.data?.storeList) : this.getInitialData(res?.data?.userList);
|
|
516
|
-
},
|
|
517
|
-
error: (err) => {
|
|
518
|
-
this.tableArray = [];
|
|
519
|
-
this.assignTableData = [];
|
|
520
|
-
this.assignTableApiState.next('loaded');
|
|
521
|
-
this.toastService.getErrorToast(err?.message);
|
|
522
|
-
},
|
|
523
|
-
});
|
|
524
|
-
}
|
|
525
|
-
userDetails() {
|
|
526
|
-
this.pageSize = 5;
|
|
527
|
-
this.assignTableApiState.next('loading');
|
|
528
|
-
let params = {
|
|
529
|
-
id: this.currentTaskId,
|
|
530
|
-
clientId: this.headerData?.client
|
|
531
|
-
};
|
|
532
|
-
this.traxService.gettaskUserDetailsV1(params).pipe(takeUntil(this.destroy$)).subscribe((res) => {
|
|
533
|
-
this.assignTableApiState.next('loaded');
|
|
534
|
-
let count = 0;
|
|
535
|
-
if (res == null) {
|
|
536
|
-
// this.showImage = true;
|
|
537
|
-
if (this.searchInput.value)
|
|
538
|
-
this.tableArray = [];
|
|
539
|
-
this.assignTableData = [];
|
|
540
|
-
}
|
|
541
|
-
if (res && res.code == 200) {
|
|
542
|
-
this.assignTableApiState.next('loaded');
|
|
543
|
-
if (this.storeCoverage) {
|
|
544
|
-
this.tableArray = res.data.userDetails.filter((el) => el?.clusterName == '' && el?.storeId != '');
|
|
545
|
-
this.assignGroup = res.data.userDetails.filter((el) => el?.clusterName !== '');
|
|
546
|
-
}
|
|
547
|
-
else if (this.userCoverage) {
|
|
548
|
-
this.tableArray = res.data.userDetails.filter((el) => el?.teamName == '' && el?.userName != '');
|
|
549
|
-
this.assignGroup = res.data.userDetails.filter((el) => el?.teamName !== '');
|
|
550
|
-
}
|
|
551
|
-
this.assignSingle = this.tableArray;
|
|
552
|
-
this.totalItems = this.tableArray.length;
|
|
553
|
-
// this.totalItems = res.data.count;
|
|
554
|
-
if (this.totalItems < 5) {
|
|
555
|
-
this.paginationSizes = [this.totalItems];
|
|
556
|
-
this.pageSize = this.totalItems;
|
|
557
|
-
}
|
|
558
|
-
else {
|
|
559
|
-
this.paginationSizes = [5, 10, 15, 20];
|
|
560
|
-
this.pageSize = 5;
|
|
561
|
-
}
|
|
562
|
-
this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
|
|
563
|
-
this.assignTableData ? this.assignTableApiState.next('loaded') : this.assignTableApiState.next('loading');
|
|
564
|
-
// this.getInitialData();
|
|
565
|
-
}
|
|
566
|
-
});
|
|
567
|
-
}
|
|
568
|
-
sortColumn;
|
|
569
|
-
sortBy = -1;
|
|
570
|
-
sortData(value) {
|
|
571
|
-
this.sortColumn = value;
|
|
572
|
-
this.sortBy *= -1;
|
|
573
|
-
const sortBy = parseInt(this.sortBy, 10) === -1 ? -1 : 1;
|
|
574
|
-
this.tableArray.sort((a, b) => {
|
|
575
|
-
// if (a[this.sortColumn] == null || b[this.sortColumn] == null) return 0;
|
|
576
|
-
// if (typeof a[this.sortColumn] === 'string' && typeof b[this.sortColumn] === 'string') {
|
|
577
|
-
return sortBy * (a[this.sortColumn] || '').localeCompare(b[this.sortColumn] || '');
|
|
578
|
-
// }
|
|
579
|
-
});
|
|
580
|
-
this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
|
|
581
|
-
}
|
|
582
|
-
getAssignTable() {
|
|
583
|
-
this.assignTableApiState.next('loading');
|
|
584
|
-
const query = {
|
|
585
|
-
"clientId": this.headerData?.client,
|
|
586
|
-
"limit": this.pageSize,
|
|
587
|
-
"offset": this.currentPage > 0 ? this.currentPage - 1 : 0,
|
|
588
|
-
"search": this.searchInput.value,
|
|
589
|
-
"taskId": this.currentTaskId
|
|
590
|
-
};
|
|
591
|
-
this.traxService.getTaskUserDetails(query).pipe(takeUntil(this.destroy$)).subscribe({
|
|
592
|
-
next: (res) => {
|
|
593
|
-
this.assignTableApiState.next('loaded');
|
|
594
|
-
if (res?.data?.count) {
|
|
595
|
-
this.totalItems = res.data.count;
|
|
596
|
-
}
|
|
597
|
-
else {
|
|
598
|
-
this.totalItems = 0;
|
|
599
|
-
}
|
|
600
|
-
if (res?.data?.users) {
|
|
601
|
-
this.assignTableData = res.data.users;
|
|
602
|
-
}
|
|
603
|
-
else {
|
|
604
|
-
this.assignTableData = [];
|
|
605
|
-
}
|
|
606
|
-
},
|
|
607
|
-
error: (e) => {
|
|
608
|
-
this.assignTableApiState.next('loaded');
|
|
609
|
-
}
|
|
610
|
-
});
|
|
611
|
-
}
|
|
612
|
-
onPageSizeChange(pageSize) {
|
|
613
|
-
this.currentPage = 1;
|
|
614
|
-
this.itemsPerPage = pageSize;
|
|
615
|
-
this.pageSize = pageSize;
|
|
616
|
-
this.assignTableData = [];
|
|
617
|
-
if (this.searchInput.value) {
|
|
618
|
-
this.totalItems = this.searchTable.length;
|
|
619
|
-
if (this.totalItems < 5) {
|
|
620
|
-
this.paginationSizes = [this.totalItems];
|
|
621
|
-
this.pageSize = this.totalItems;
|
|
622
|
-
}
|
|
623
|
-
else {
|
|
624
|
-
this.paginationSizes = [5, 10, 15, 20];
|
|
625
|
-
// this.size = 5;
|
|
626
|
-
}
|
|
627
|
-
this.assignTableData = this.searchTable.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
|
|
628
|
-
// this.assignTableData ? this.tableLoading = false : this.tableLoading = true;
|
|
629
|
-
}
|
|
630
|
-
else {
|
|
631
|
-
this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
|
|
632
|
-
// this.assignTableData ? this.tableLoading = false : this.tableLoading = true;
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
onPageChange(pageOffset) {
|
|
636
|
-
this.currentPage = pageOffset;
|
|
637
|
-
this.assignTableData = [];
|
|
638
|
-
if (this.searchInput.value) {
|
|
639
|
-
// this.searchTableData();
|
|
640
|
-
this.totalItems = this.searchTable.length;
|
|
641
|
-
if (this.totalItems < 5) {
|
|
642
|
-
this.paginationSizes = [this.totalItems];
|
|
643
|
-
this.pageSize = this.totalItems;
|
|
644
|
-
}
|
|
645
|
-
else {
|
|
646
|
-
this.paginationSizes = [5, 10, 15, 20];
|
|
647
|
-
this.pageSize = 5;
|
|
648
|
-
}
|
|
649
|
-
this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
|
|
650
|
-
// this.tableData ? this.tableLoading = false : this.tableLoading = true;
|
|
651
|
-
}
|
|
652
|
-
else {
|
|
653
|
-
this.assignTableData = this.tableArray.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
|
|
654
|
-
// this.tableData ? this.tableLoading = false : this.tableLoading = true;
|
|
655
|
-
}
|
|
656
|
-
// this.assignTableData ? this.tableLoading = false : this.tableLoading = true;
|
|
657
|
-
// this.getAssignTable()
|
|
658
|
-
}
|
|
659
|
-
searchTable;
|
|
660
|
-
searchTableData() {
|
|
661
|
-
this.assignTableData = [];
|
|
662
|
-
this.pageSize = 5;
|
|
663
|
-
this.currentPage = 1;
|
|
664
|
-
// this.tableLoading = true;
|
|
665
|
-
let searchField = ['storeName', 'userName', 'userEmail', 'clusterName', 'teamName'];
|
|
666
|
-
if (!this.searchInput.value) {
|
|
667
|
-
(this.assignType === 'store' || this.assignType === 'user') ? (this.singleAssign = this.idList, this.getTableData()) : (this.groupAssign = this.idList, this.userDetailsV2());
|
|
668
|
-
}
|
|
669
|
-
else {
|
|
670
|
-
const searchData = this.searchInput.value.toLowerCase();
|
|
671
|
-
const searchTerm = searchData.split(',').map((el) => el.trim());
|
|
672
|
-
this.searchTable = this.tableArray?.filter((item) => searchField.some((field) => searchTerm.some((term) => item[field]?.toLowerCase().includes(term))));
|
|
673
|
-
this.totalItems = this.searchTable.length;
|
|
674
|
-
if (this.totalItems < 5) {
|
|
675
|
-
this.paginationSizes = [this.totalItems];
|
|
676
|
-
this.pageSize = this.totalItems;
|
|
677
|
-
}
|
|
678
|
-
else {
|
|
679
|
-
this.paginationSizes = [5, 10, 15, 20];
|
|
680
|
-
this.pageSize = 5;
|
|
681
|
-
}
|
|
682
|
-
this.assignTableData = this.searchTable.slice((this.currentPage * this.pageSize) - this.pageSize, this.currentPage * this.pageSize);
|
|
683
|
-
}
|
|
684
|
-
this.assignTableData ? this.assignTableApiState.next('loaded') : this.assignTableApiState.next('loading');
|
|
685
|
-
// let params = {
|
|
686
|
-
// offset: 0,
|
|
687
|
-
// limit: this.size,
|
|
688
|
-
// search: this.tableFilter,
|
|
689
|
-
// id: this.checklistId,
|
|
690
|
-
// clientId:this.clientId
|
|
691
|
-
// }
|
|
692
|
-
// if (this.tableFilter.length) {
|
|
693
|
-
// this.SopService.getUserDetails(params).pipe(takeUntil(this.detach)).subscribe((res: any) => {
|
|
694
|
-
// this.tableLoading = false;
|
|
695
|
-
// if (res == null) {
|
|
696
|
-
// this.showImage = true;
|
|
697
|
-
// if (this.tableFilter.length)
|
|
698
|
-
// this.showImage = false;
|
|
699
|
-
// this.tableData = [];
|
|
700
|
-
// }
|
|
701
|
-
// if (res && res.code == 200) {
|
|
702
|
-
// this.showImage = false;
|
|
703
|
-
// this.tableData = res.data.users;
|
|
704
|
-
// this.recordsCount = this.tableData.length;
|
|
705
|
-
// this.recordsTotal = res.data.count;
|
|
706
|
-
// let count = 0 ;
|
|
707
|
-
// if(this.recordsTotal < 5) {
|
|
708
|
-
// this.paginationSize = [this.recordsTotal]
|
|
709
|
-
// this.size = this.recordsTotal;
|
|
710
|
-
// }
|
|
711
|
-
// else {
|
|
712
|
-
// this.paginationSize = [5,10,15,20]
|
|
713
|
-
// this.size = 5;
|
|
714
|
-
// }
|
|
715
|
-
// this.tableData.forEach((item:any) =>{
|
|
716
|
-
// if(item.checkFlag && !this.configData.checkListDetails.assignedUsers.includes(item.id) && !this.removeUsers.includes(item.id))
|
|
717
|
-
// this.configData.checkListDetails.assignedUsers.push(item.id);
|
|
718
|
-
// if (this.configData.checkListDetails.assignedUsers.includes(item.id)) {
|
|
719
|
-
// count +=1;
|
|
720
|
-
// }
|
|
721
|
-
// })
|
|
722
|
-
// if (count == this.recordsCount) {
|
|
723
|
-
// this.selectAll = true;
|
|
724
|
-
// }
|
|
725
|
-
// else {
|
|
726
|
-
// this.selectAll = false
|
|
727
|
-
// }
|
|
728
|
-
// }
|
|
729
|
-
// })
|
|
730
|
-
// }
|
|
731
|
-
// else {
|
|
732
|
-
// this.userDetails();
|
|
733
|
-
// }
|
|
734
|
-
}
|
|
735
|
-
dropDown = false;
|
|
736
|
-
openDropdown(event) {
|
|
737
|
-
this.dropDown = !this.dropDown;
|
|
738
|
-
}
|
|
739
|
-
bulkuploadModel() {
|
|
740
|
-
this.dropDown = false;
|
|
741
|
-
this.dialog.open(this.bulkupload, {
|
|
742
|
-
centered: true, backdrop: 'static'
|
|
743
|
-
});
|
|
744
|
-
}
|
|
745
|
-
excelError;
|
|
746
|
-
afterUplload(data) {
|
|
747
|
-
this.excelError = data;
|
|
748
|
-
this.dialog.open(this.afterValidation, { centered: true, backdrop: 'static' });
|
|
749
|
-
}
|
|
750
|
-
onUserAssignChange(event, id) {
|
|
751
|
-
if (!event) {
|
|
752
|
-
this.removedUsers.add(id);
|
|
753
|
-
}
|
|
754
|
-
else {
|
|
755
|
-
this.removedUsers.delete(id);
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
downloadTemplateV2() {
|
|
759
|
-
let excelData = [];
|
|
760
|
-
if (this.storeCoverage) {
|
|
761
|
-
if (this.tableArray == null || !this.tableArray?.length) {
|
|
762
|
-
if (this.assignType === 'store') {
|
|
763
|
-
excelData.push({
|
|
764
|
-
storeName: '',
|
|
765
|
-
userName: '',
|
|
766
|
-
userEmail: '',
|
|
767
|
-
userPhone: '',
|
|
768
|
-
city: ''
|
|
769
|
-
});
|
|
770
|
-
}
|
|
771
|
-
else {
|
|
772
|
-
excelData.push({
|
|
773
|
-
storeName: '',
|
|
774
|
-
userName: '',
|
|
775
|
-
userEmail: '',
|
|
776
|
-
clusterName: '',
|
|
777
|
-
userPhone: '',
|
|
778
|
-
city: ''
|
|
779
|
-
});
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
if (this.tableArray && this.tableArray?.length) {
|
|
783
|
-
this.tableArray.forEach((item) => {
|
|
784
|
-
if (this.assignType === 'store') {
|
|
785
|
-
excelData.push({
|
|
786
|
-
storeName: item.storeName,
|
|
787
|
-
userName: item.userName,
|
|
788
|
-
userEmail: item.userEmail,
|
|
789
|
-
userPhone: item.userPhone,
|
|
790
|
-
city: item.city
|
|
791
|
-
});
|
|
792
|
-
}
|
|
793
|
-
else {
|
|
794
|
-
excelData.push({
|
|
795
|
-
storeName: item.storeName,
|
|
796
|
-
userName: item.userName,
|
|
797
|
-
userEmail: item.userEmail,
|
|
798
|
-
clusterName: item.clusterName,
|
|
799
|
-
userPhone: item.userPhone,
|
|
800
|
-
city: item.city
|
|
801
|
-
});
|
|
802
|
-
}
|
|
803
|
-
});
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
else if (this.userCoverage) {
|
|
807
|
-
if (this.tableArray == null || !this.tableArray?.length) {
|
|
808
|
-
if (this.assignType === 'user') {
|
|
809
|
-
excelData.push({
|
|
810
|
-
userName: '',
|
|
811
|
-
userEmail: '',
|
|
812
|
-
userPhone: '',
|
|
813
|
-
});
|
|
814
|
-
}
|
|
815
|
-
else {
|
|
816
|
-
excelData.push({
|
|
817
|
-
userName: '',
|
|
818
|
-
userEmail: '',
|
|
819
|
-
teamName: '',
|
|
820
|
-
userPhone: '',
|
|
821
|
-
});
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
|
-
if (this.tableArray && this.tableArray?.length) {
|
|
825
|
-
this.tableArray.forEach((item) => {
|
|
826
|
-
if (this.assignType === 'user') {
|
|
827
|
-
excelData.push({
|
|
828
|
-
userName: item.userName,
|
|
829
|
-
userEmail: item.userEmail,
|
|
830
|
-
userPhone: item.userPhone,
|
|
831
|
-
});
|
|
832
|
-
}
|
|
833
|
-
else {
|
|
834
|
-
excelData.push({
|
|
835
|
-
userName: item.userName,
|
|
836
|
-
userEmail: item.userEmail,
|
|
837
|
-
teamName: item.teamName,
|
|
838
|
-
userPhone: item.userPhone,
|
|
839
|
-
});
|
|
840
|
-
}
|
|
841
|
-
});
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
this.traxService.exportAsExcelFile(excelData, `CheckList_${this.assignType}_`);
|
|
845
|
-
}
|
|
846
|
-
downloadTemplate() {
|
|
847
|
-
let params = {
|
|
848
|
-
limit: 10000,
|
|
849
|
-
offset: 0,
|
|
850
|
-
taskId: this.currentTaskId,
|
|
851
|
-
search: this.searchInput.value,
|
|
852
|
-
clientId: this.headerData.client,
|
|
853
|
-
};
|
|
854
|
-
this.traxService.getTaskUserDetails(params).pipe(takeUntil(this.destroy$)).subscribe((res) => {
|
|
855
|
-
let excelData = [];
|
|
856
|
-
if (this.storeCoverage) {
|
|
857
|
-
if (res == null) {
|
|
858
|
-
excelData.push({
|
|
859
|
-
storeName: '',
|
|
860
|
-
clusterName: '',
|
|
861
|
-
userEmail: '',
|
|
862
|
-
userName: '',
|
|
863
|
-
userPhone: '',
|
|
864
|
-
city: ''
|
|
865
|
-
});
|
|
866
|
-
}
|
|
867
|
-
if (res && res.code == 200) {
|
|
868
|
-
res.data.users.forEach((item) => {
|
|
869
|
-
excelData.push({
|
|
870
|
-
storeName: item.storeName,
|
|
871
|
-
clusterName: item.clusterName,
|
|
872
|
-
userEmail: item.userEmail,
|
|
873
|
-
userName: item.userName,
|
|
874
|
-
userPhone: item.userPhone,
|
|
875
|
-
city: item.city
|
|
876
|
-
});
|
|
877
|
-
});
|
|
878
|
-
}
|
|
879
|
-
}
|
|
880
|
-
else if (this.userCoverage) {
|
|
881
|
-
if (res == null) {
|
|
882
|
-
excelData.push({
|
|
883
|
-
// storeName: '',
|
|
884
|
-
teamName: '',
|
|
885
|
-
userEmail: '',
|
|
886
|
-
userName: '',
|
|
887
|
-
userPhone: '',
|
|
888
|
-
city: ''
|
|
889
|
-
});
|
|
890
|
-
}
|
|
891
|
-
if (res && res?.code == 200) {
|
|
892
|
-
res?.data?.users.forEach((item) => {
|
|
893
|
-
excelData.push({
|
|
894
|
-
// storeName: item.storeName,
|
|
895
|
-
teamName: item.teamName,
|
|
896
|
-
userEmail: item.userEmail,
|
|
897
|
-
userName: item.userName,
|
|
898
|
-
userPhone: item.userPhone,
|
|
899
|
-
city: item.city
|
|
900
|
-
});
|
|
901
|
-
});
|
|
902
|
-
}
|
|
903
|
-
}
|
|
904
|
-
this.traxService.exportAsExcelFile(excelData, 'Task_Userlist_');
|
|
905
|
-
});
|
|
906
|
-
}
|
|
907
|
-
updateAssign(event) {
|
|
908
|
-
this.upload = '';
|
|
909
|
-
this.currentPage = 1;
|
|
910
|
-
// if (this.taskDetails) {
|
|
911
|
-
this.taskDetails.assign = event;
|
|
912
|
-
const assigneduser = event.map((el) => {
|
|
913
|
-
return { id: el?._id, type: el?.type };
|
|
914
|
-
});
|
|
915
|
-
// this.idList = event.map((el: any) => {
|
|
916
|
-
// return el?._id
|
|
917
|
-
// })
|
|
918
|
-
this.idList = assigneduser;
|
|
919
|
-
this.searchInput.setValue('');
|
|
920
|
-
(this.assignType === 'store' || this.assignType === 'user') ? (this.singleAssign = this.idList, this.getTableData()) : (this.groupAssign = this.idList, this.userDetailsV2(event));
|
|
921
|
-
}
|
|
922
|
-
removedChip(event) {
|
|
923
|
-
this.tableArray = this.tableArray.filter((item) => !event.includes(item._id));
|
|
924
|
-
this.taskDetails.assign = this.taskDetails.assign.filter((item) => !event.includes(item._id));
|
|
925
|
-
}
|
|
926
|
-
tableArray = [];
|
|
927
|
-
excelData;
|
|
928
|
-
showUser = false;
|
|
929
|
-
showTeam = false;
|
|
930
|
-
showStore = false;
|
|
931
|
-
showCluster = false;
|
|
932
|
-
onFileUpload(event, reupload) {
|
|
933
|
-
this.validatedStore = [];
|
|
934
|
-
this.validatedUser = [];
|
|
935
|
-
this.validatedCluster = [];
|
|
936
|
-
this.validatedTeam = [];
|
|
937
|
-
this.newUser = [];
|
|
938
|
-
this.inactiveStores = [];
|
|
939
|
-
this.showUser = false;
|
|
940
|
-
this.showTeam = false;
|
|
941
|
-
this.showStore = false;
|
|
942
|
-
this.showCluster = false;
|
|
943
|
-
this.showInactive = false;
|
|
944
|
-
this.currentPage = 1;
|
|
945
|
-
this.reupload = false;
|
|
946
|
-
this.upload = 'upload';
|
|
947
|
-
this.userData = this.excelUserData = [];
|
|
948
|
-
let data;
|
|
949
|
-
const target = (event.target);
|
|
950
|
-
let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);
|
|
951
|
-
let error = [];
|
|
952
|
-
let ValidationError = false;
|
|
953
|
-
if (isExcelFile) {
|
|
954
|
-
const reader = new FileReader();
|
|
955
|
-
reader.readAsBinaryString(target.files[0]);
|
|
956
|
-
reader.onload = (e) => {
|
|
957
|
-
const bstr = e.target.result;
|
|
958
|
-
const wb = XLSX.read(bstr, { type: 'binary' });
|
|
959
|
-
const wsname = wb.SheetNames[0];
|
|
960
|
-
const ws = wb.Sheets[wsname];
|
|
961
|
-
data = XLSX.utils.sheet_to_json(ws);
|
|
962
|
-
this.excelData = data;
|
|
963
|
-
if (!data.length || (data.some((item) => 'clusterName' in item || 'teamName' in item))) {
|
|
964
|
-
this.toastService.getErrorToast('Please Upload a Valid file.');
|
|
965
|
-
return;
|
|
966
|
-
}
|
|
967
|
-
const requiredKeys = this.storeCoverage ? ['storeName', 'userName', 'userEmail'] : ['userName', 'userEmail']; // Must always be present
|
|
968
|
-
const optionalKeys = this.storeCoverage ? ['userPhone', 'city'] : ['userPhone', 'city'];
|
|
969
|
-
const isValid = data.some((item) => {
|
|
970
|
-
const keys = Object.keys(item);
|
|
971
|
-
const hasRequiredKeys = requiredKeys.every(key => keys.includes(key));
|
|
972
|
-
const allKeysAreAllowed = keys.every(key => requiredKeys.includes(key) || optionalKeys.includes(key));
|
|
973
|
-
return hasRequiredKeys && allKeysAreAllowed;
|
|
974
|
-
});
|
|
975
|
-
if (!isValid) {
|
|
976
|
-
this.toastService.getErrorToast('Please Upload a Valid file.');
|
|
977
|
-
return;
|
|
978
|
-
}
|
|
979
|
-
data = data.filter((item) => {
|
|
980
|
-
return ((item?.storeName && item?.storeName.trim() != '' && item?.storeName.trim() != null) || (item?.userName && item?.userName.trim() != '' && item?.userName.trim() != null) || (item?.userEmail && item?.userEmail.trim() != '' && item?.userEmail.trim() != null));
|
|
981
|
-
});
|
|
982
|
-
data.forEach((element, index) => {
|
|
983
|
-
if (element?.userEmail) {
|
|
984
|
-
element.userEmail = element?.userEmail.replace(/\s/g, '');
|
|
985
|
-
}
|
|
986
|
-
if (this.storeCoverage) {
|
|
987
|
-
if ((element.storeName && element.storeName.trim() == '') || element.storeName == null) {
|
|
988
|
-
error.push(`Invalid StoreName - A${index + 2}`);
|
|
989
|
-
}
|
|
990
|
-
if ((element.userName && element.userName.trim() == '') || element.userName == null) {
|
|
991
|
-
error.push(`Invalid UserName - B${index + 2}`);
|
|
992
|
-
}
|
|
993
|
-
if ((element.userEmail && element.userEmail.trim() == '') || element.userEmail == null) {
|
|
994
|
-
error.push(`Invalid userEmail - C${index + 2}`);
|
|
995
|
-
}
|
|
996
|
-
if (element?.userEmail && !element.userEmail.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/)) {
|
|
997
|
-
error.push(`Invalid userEmail - C${index + 2}`);
|
|
998
|
-
}
|
|
999
|
-
if (element.clusterName) {
|
|
1000
|
-
if (element.clusterName.trim() == '' || element.clusterName == null) {
|
|
1001
|
-
error.push(`Invalid clusterName - D${index + 2}`);
|
|
1002
|
-
}
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
else if (this.userCoverage && !element?.storeName) {
|
|
1006
|
-
if ((element.userName && element.userName.trim() == '') || element.userName == null) {
|
|
1007
|
-
error.push(`Invalid UserName - A${index + 2}`);
|
|
1008
|
-
}
|
|
1009
|
-
if ((element.userEmail && element.userEmail.trim() == '') || element.userEmail == null) {
|
|
1010
|
-
error.push(`Invalid userEmail - B${index + 2}`);
|
|
1011
|
-
}
|
|
1012
|
-
if (element?.userEmail && !element.userEmail.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/)) {
|
|
1013
|
-
error.push(`Invalid userEmail - B${index + 2}`);
|
|
1014
|
-
}
|
|
1015
|
-
if (element.teamName) {
|
|
1016
|
-
if (element.teamName.trim() == '' || element.teamName == null) {
|
|
1017
|
-
error.push(`Invalid teamName - C${index + 2}`);
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
else {
|
|
1022
|
-
this.toastService.getErrorToast('Please upload a valid file.');
|
|
1023
|
-
ValidationError = true;
|
|
1024
|
-
}
|
|
1025
|
-
if (this.storeCoverage) {
|
|
1026
|
-
if (this.assignType === 'store') {
|
|
1027
|
-
this.userData.push({
|
|
1028
|
-
storeName: element?.storeName?.trim(),
|
|
1029
|
-
userName: element?.userName?.trim(),
|
|
1030
|
-
userEmail: element?.userEmail?.toLowerCase()?.trim(),
|
|
1031
|
-
userPhone: element?.userPhone,
|
|
1032
|
-
// checkFlag: element?.check ? element.check : false,
|
|
1033
|
-
city: element?.city,
|
|
1034
|
-
type: 'store'
|
|
1035
|
-
});
|
|
1036
|
-
}
|
|
1037
|
-
else {
|
|
1038
|
-
this.userData.push({
|
|
1039
|
-
storeName: element?.storeName?.trim(),
|
|
1040
|
-
userName: element?.userName?.trim(),
|
|
1041
|
-
userEmail: element?.userEmail?.toLowerCase()?.trim(),
|
|
1042
|
-
clusterName: element?.clusterName,
|
|
1043
|
-
userPhone: element?.userPhone,
|
|
1044
|
-
// checkFlag: element?.check ? element.check : false,
|
|
1045
|
-
city: element?.city,
|
|
1046
|
-
type: 'cluster'
|
|
1047
|
-
});
|
|
1048
|
-
}
|
|
1049
|
-
}
|
|
1050
|
-
else if (this.userCoverage) {
|
|
1051
|
-
if (this.assignType === 'user') {
|
|
1052
|
-
this.userData.push({
|
|
1053
|
-
userName: element?.userName?.trim(),
|
|
1054
|
-
userEmail: element?.userEmail?.toLowerCase()?.trim(),
|
|
1055
|
-
userPhone: element?.userPhone,
|
|
1056
|
-
// checkFlag: element?.check ? element.check : false,
|
|
1057
|
-
type: 'user'
|
|
1058
|
-
});
|
|
1059
|
-
}
|
|
1060
|
-
else {
|
|
1061
|
-
this.userData.push({
|
|
1062
|
-
userName: element?.userName?.trim(),
|
|
1063
|
-
userEmail: element?.userEmail?.toLowerCase()?.trim(),
|
|
1064
|
-
teamName: element?.teamName,
|
|
1065
|
-
userPhone: element?.userPhone,
|
|
1066
|
-
// checkFlag: element?.check ? element.check : false,
|
|
1067
|
-
type: 'teams'
|
|
1068
|
-
});
|
|
1069
|
-
}
|
|
1070
|
-
}
|
|
1071
|
-
});
|
|
1072
|
-
if (error.length) {
|
|
1073
|
-
this.dialog.dismissAll();
|
|
1074
|
-
const popupcontent = {
|
|
1075
|
-
displayprop: false,
|
|
1076
|
-
imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>`,
|
|
1077
|
-
title: `Invalid details!`,
|
|
1078
|
-
content: `Please provide correct and complete store information.`,
|
|
1079
|
-
buttontype: 'error',
|
|
1080
|
-
error: error
|
|
1081
|
-
};
|
|
1082
|
-
this.afterUplload(popupcontent);
|
|
1083
|
-
return;
|
|
1084
|
-
}
|
|
1085
|
-
else {
|
|
1086
|
-
!ValidationError ? this.afterUplload() : '';
|
|
1087
|
-
}
|
|
1088
|
-
if (this.fileInput) {
|
|
1089
|
-
this.fileInput.nativeElement.value = '';
|
|
1090
|
-
}
|
|
1091
|
-
if (this.fileInput1) {
|
|
1092
|
-
this.fileInput1.nativeElement.value = '';
|
|
1093
|
-
}
|
|
1094
|
-
};
|
|
1095
|
-
}
|
|
1096
|
-
else {
|
|
1097
|
-
if (this.fileInput) {
|
|
1098
|
-
this.fileInput.nativeElement.value = '';
|
|
1099
|
-
}
|
|
1100
|
-
if (this.fileInput1) {
|
|
1101
|
-
this.fileInput1.nativeElement.value = '';
|
|
1102
|
-
}
|
|
1103
|
-
this.toastService.getErrorToast('Please Upload a Excel file.');
|
|
1104
|
-
}
|
|
1105
|
-
}
|
|
1106
|
-
upload = 'upload';
|
|
1107
|
-
validatedStore = [];
|
|
1108
|
-
validatedUser = [];
|
|
1109
|
-
validatedCluster = [];
|
|
1110
|
-
validatedTeam = [];
|
|
1111
|
-
newUser = [];
|
|
1112
|
-
inactiveStores = [];
|
|
1113
|
-
showInactive = false;
|
|
1114
|
-
validateDetails(addUser) {
|
|
1115
|
-
let params = {
|
|
1116
|
-
taskId: this.currentTaskId,
|
|
1117
|
-
// assignUsers: this.userData,
|
|
1118
|
-
assignedUsers: this.userData,
|
|
1119
|
-
clientId: this.headerData?.client,
|
|
1120
|
-
coverage: this.coverage
|
|
1121
|
-
};
|
|
1122
|
-
addUser ? params.addUser = true : '';
|
|
1123
|
-
this.traxService.taskvalidateUserv1(params).pipe(takeUntil(this.destroy$)).subscribe({
|
|
1124
|
-
next: (res) => {
|
|
1125
|
-
if (res && res?.code == 200) {
|
|
1126
|
-
if (this.upload === 'store') {
|
|
1127
|
-
this.tableArray.unshift(...res?.data?.data);
|
|
1128
|
-
this.configData.checkListDetails.assign = this.tableArray;
|
|
1129
|
-
let data = this.tableArray.map((el) => {
|
|
1130
|
-
return { id: el?._id, type: el?.type };
|
|
1131
|
-
});
|
|
1132
|
-
this.idList = data;
|
|
1133
|
-
this.singleAssign = this.idList;
|
|
1134
|
-
this.getTableData();
|
|
1135
|
-
this.assignType === 'user' ? this.getassignDropdown('change') : '';
|
|
1136
|
-
}
|
|
1137
|
-
else {
|
|
1138
|
-
this.tableArray = [];
|
|
1139
|
-
this.assignTableApiState.next('loading');
|
|
1140
|
-
this.tableArray = res?.data?.data;
|
|
1141
|
-
this.assignSingle = res?.data?.data;
|
|
1142
|
-
this.configData.checkListDetails.assign = this.tableArray;
|
|
1143
|
-
let data = res?.data?.data.map((el) => {
|
|
1144
|
-
return { id: el?._id, type: el?.type };
|
|
1145
|
-
});
|
|
1146
|
-
this.idList = data;
|
|
1147
|
-
this.singleAssign = this.idList;
|
|
1148
|
-
this.assignTableApiState.next('loaded');
|
|
1149
|
-
this.getTableData();
|
|
1150
|
-
this.assignType === 'user' ? this.getassignDropdown('change') : '';
|
|
1151
|
-
}
|
|
1152
|
-
this.dialog.dismissAll();
|
|
1153
|
-
}
|
|
1154
|
-
},
|
|
1155
|
-
error: (err) => {
|
|
1156
|
-
if (err?.error?.error && err?.error?.code == 400) {
|
|
1157
|
-
let errorData = err?.error?.error;
|
|
1158
|
-
this.excelData = errorData?.data;
|
|
1159
|
-
this.userData = errorData?.data;
|
|
1160
|
-
if (errorData.existEmail?.length) {
|
|
1161
|
-
this.toastService.getErrorToast(`Already ${errorData.existEmail.toString()} assigned to another client`);
|
|
1162
|
-
}
|
|
1163
|
-
else if (errorData.store?.length && !errorData.existEmail?.length) {
|
|
1164
|
-
this.validatedStore = errorData?.store;
|
|
1165
|
-
this.showStore = true;
|
|
1166
|
-
this.afterUplload();
|
|
1167
|
-
}
|
|
1168
|
-
else if (errorData.store?.length && errorData.existEmail?.length) {
|
|
1169
|
-
!errorData?.inActiveStores?.length ? this.dialog.dismissAll() : '';
|
|
1170
|
-
this.toastService.getErrorToast(`Already ${errorData.store.toString()} assigned to another client`);
|
|
1171
|
-
}
|
|
1172
|
-
else if (errorData?.inActiveStores?.length) {
|
|
1173
|
-
this.inactiveStores = errorData?.inActiveStores;
|
|
1174
|
-
this.showInactive = true;
|
|
1175
|
-
this.afterUplload();
|
|
1176
|
-
}
|
|
1177
|
-
else if (errorData?.user?.length && !errorData?.existEmail?.length) {
|
|
1178
|
-
this.validatedUser = errorData.user;
|
|
1179
|
-
this.showUser = true;
|
|
1180
|
-
if (this.upload === 'store') {
|
|
1181
|
-
this.confirmUserpopup();
|
|
1182
|
-
}
|
|
1183
|
-
else {
|
|
1184
|
-
this.afterUplload();
|
|
1185
|
-
}
|
|
1186
|
-
}
|
|
1187
|
-
else if (errorData?.user?.length && errorData?.existEmail?.length) {
|
|
1188
|
-
this.dialog.dismissAll();
|
|
1189
|
-
this.toastService.getErrorToast(`Already ${errorData?.user.toString()} assigned to another client`);
|
|
1190
|
-
}
|
|
1191
|
-
if (errorData?.duplicates?.length) {
|
|
1192
|
-
this.dialog.dismissAll();
|
|
1193
|
-
this.toastService.getErrorToast(`${errorData?.duplicates?.toString()} - ${errorData?.message}`);
|
|
1194
|
-
}
|
|
1195
|
-
}
|
|
1196
|
-
},
|
|
1197
|
-
});
|
|
1198
|
-
}
|
|
1199
|
-
Reupload() {
|
|
1200
|
-
// this.dialog.dismissAll();
|
|
1201
|
-
this.validatedStore = [];
|
|
1202
|
-
this.validatedUser = [];
|
|
1203
|
-
this.validatedCluster = [];
|
|
1204
|
-
this.validatedTeam = [];
|
|
1205
|
-
this.newUser = [];
|
|
1206
|
-
this.inactiveStores = [];
|
|
1207
|
-
this.showUser = false;
|
|
1208
|
-
this.showTeam = false;
|
|
1209
|
-
this.showStore = false;
|
|
1210
|
-
this.showCluster = false;
|
|
1211
|
-
this.showInactive = false;
|
|
1212
|
-
if (this.fileInput) {
|
|
1213
|
-
this.fileInput.nativeElement.value = '';
|
|
1214
|
-
}
|
|
1215
|
-
if (this.fileInput1) {
|
|
1216
|
-
this.fileInput1.nativeElement.value = '';
|
|
1217
|
-
}
|
|
1218
|
-
let ele = document.getElementById('kt_account_team_size_select_2');
|
|
1219
|
-
ele?.click();
|
|
1220
|
-
this.cd.detectChanges();
|
|
1221
|
-
}
|
|
1222
|
-
closeactivepopup() {
|
|
1223
|
-
this.dialog.dismissAll();
|
|
1224
|
-
}
|
|
1225
|
-
// onFileUpload(event: any) {
|
|
1226
|
-
// //Empty sheet validation ---done
|
|
1227
|
-
// //empty field validation for storeName, userName, userEmail, city. I
|
|
1228
|
-
// // validate user email
|
|
1229
|
-
// // Email unique for store
|
|
1230
|
-
// // Email unique for username
|
|
1231
|
-
// const target: DataTransfer = <DataTransfer>(event.target);
|
|
1232
|
-
// // let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);
|
|
1233
|
-
// const reader: FileReader = new FileReader();
|
|
1234
|
-
// reader.readAsBinaryString(target.files[0]);
|
|
1235
|
-
// reader.onload = (e: any) => {
|
|
1236
|
-
// const bstr: string = e.target.result;
|
|
1237
|
-
// const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });
|
|
1238
|
-
// const wsname: string = wb.SheetNames[0];
|
|
1239
|
-
// const ws: XLSX.WorkSheet = wb.Sheets[wsname];
|
|
1240
|
-
// const jsonWithPosition: any[] = [];
|
|
1241
|
-
// const range = XLSX.utils.decode_range(ws['!ref'] || '');
|
|
1242
|
-
// const headers: string[] = [];
|
|
1243
|
-
// for (let C = range.s.c; C <= range.e.c; ++C) {
|
|
1244
|
-
// const cellAddress = XLSX.utils.encode_cell({ r: range.s.r, c: C });
|
|
1245
|
-
// const header = ws[cellAddress]?.v || `Column${C + 1}`;
|
|
1246
|
-
// headers.push(header);
|
|
1247
|
-
// }
|
|
1248
|
-
// for (let R = range.s.r + 1; R <= range.e.r; ++R) {
|
|
1249
|
-
// const rowData: any = { row: R + 1 };
|
|
1250
|
-
// for (let C = range.s.c; C <= range.e.c; ++C) {
|
|
1251
|
-
// const cellAddress = XLSX.utils.encode_cell({ r: R, c: C });
|
|
1252
|
-
// const cell = ws[cellAddress];
|
|
1253
|
-
// const header = headers[C - range.s.c];
|
|
1254
|
-
// rowData[header] = cell?.v || "";
|
|
1255
|
-
// rowData[`column_${header}`] = XLSX.utils.encode_col(C);
|
|
1256
|
-
// }
|
|
1257
|
-
// jsonWithPosition.push(rowData);
|
|
1258
|
-
// }
|
|
1259
|
-
// const filteredData = jsonWithPosition.filter(row => {
|
|
1260
|
-
// const keys = Object.keys(row).filter(key => !key.startsWith('column_') && key !== 'row');
|
|
1261
|
-
// return keys.some(key => row[key].trim() !== undefined && row[key].trim() !== null && row[key].trim() !== "");
|
|
1262
|
-
// });
|
|
1263
|
-
// if (!filteredData.length) {
|
|
1264
|
-
// return this.toastService.getErrorToast(`Please enter valid details`)
|
|
1265
|
-
// }
|
|
1266
|
-
// const emptyKeys: any[] = []
|
|
1267
|
-
// const invalidEmails: any[] = []
|
|
1268
|
-
// filteredData.forEach((row) => {
|
|
1269
|
-
// const keys = Object.keys(row).filter(key => !key.startsWith('column_') && key !== 'row')
|
|
1270
|
-
// keys.forEach((key) => {
|
|
1271
|
-
// if (key === 'userEmail') {
|
|
1272
|
-
// const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
|
|
1273
|
-
// const isValidMail = emailRegex.test(row['userEmail']);
|
|
1274
|
-
// if (!isValidMail) invalidEmails.push(row[`column_${key}`] + row.row)
|
|
1275
|
-
// }
|
|
1276
|
-
// if (!row[key] && (key === 'storeName' || key === 'userEmail' || key === 'userName')) emptyKeys.push(row[`column_${key}`] + row.row)
|
|
1277
|
-
// })
|
|
1278
|
-
// })
|
|
1279
|
-
// if (emptyKeys.length) {
|
|
1280
|
-
// return this.toastService.getErrorToast(`Please fill the cells ${emptyKeys.join(', ')}`)
|
|
1281
|
-
// }
|
|
1282
|
-
// if (invalidEmails.length) {
|
|
1283
|
-
// return this.toastService.getErrorToast(`Please enter valid emails at ${invalidEmails.join(', ')}`)
|
|
1284
|
-
// }
|
|
1285
|
-
// const groupedByEmail = filteredData.reduce((acc, item) => {
|
|
1286
|
-
// if (!acc[item.userEmail]) {
|
|
1287
|
-
// acc[item.userEmail] = [];
|
|
1288
|
-
// }
|
|
1289
|
-
// acc[item.userEmail].push(item.storeName);
|
|
1290
|
-
// return acc;
|
|
1291
|
-
// }, {} as Record<string, string[]>);
|
|
1292
|
-
// const uniqueResult = Object.entries(groupedByEmail).map(([email, storeNames]) => {
|
|
1293
|
-
// const uniqueStoreNames = new Set<string>(storeNames as string);
|
|
1294
|
-
// return {
|
|
1295
|
-
// userEmail: email,
|
|
1296
|
-
// isStoreNameUnique: uniqueStoreNames.size === (storeNames as Array<string>).length,
|
|
1297
|
-
// storeNames: Array.from(uniqueStoreNames),
|
|
1298
|
-
// };
|
|
1299
|
-
// });
|
|
1300
|
-
// const notUnique = uniqueResult.filter((item) => !item.isStoreNameUnique).map((item) => item.userEmail)
|
|
1301
|
-
// if (notUnique.length) {
|
|
1302
|
-
// return this.toastService.getErrorToast(`${notUnique.join(', ')} should be unique for store name`)
|
|
1303
|
-
// }
|
|
1304
|
-
// this.fileInput.nativeElement.value = ''
|
|
1305
|
-
// event.target.value = ''
|
|
1306
|
-
// const assignList = filteredData.map((data) => {
|
|
1307
|
-
// return {
|
|
1308
|
-
// storeName: data.storeName,
|
|
1309
|
-
// userEmail: data.userEmail,
|
|
1310
|
-
// userName: data.userName,
|
|
1311
|
-
// userPhone: data?.userPhone,
|
|
1312
|
-
// city: data?.city
|
|
1313
|
-
// }
|
|
1314
|
-
// })
|
|
1315
|
-
// const payload = {
|
|
1316
|
-
// id: this.currentTaskId,
|
|
1317
|
-
// uploadUser: true,
|
|
1318
|
-
// clientId: this.headerData.client,
|
|
1319
|
-
// assignedUsers: assignList
|
|
1320
|
-
// }
|
|
1321
|
-
// this.uploadAssigneesList(payload).subscribe({
|
|
1322
|
-
// next: (res: any) => {
|
|
1323
|
-
// if (res?.data?.validate) {
|
|
1324
|
-
// this.getAssignTable()
|
|
1325
|
-
// }
|
|
1326
|
-
// if (res?.data?.user?.length) {
|
|
1327
|
-
// const popupcontent = {
|
|
1328
|
-
// displayprop: false,
|
|
1329
|
-
// imagesrc: '<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>',
|
|
1330
|
-
// title: `Invite new users added in CSV`,
|
|
1331
|
-
// content: `This CSV contains new users. Invite users by sending mail to them`,
|
|
1332
|
-
// buttontype: 'Invite',
|
|
1333
|
-
// user: res.data.user
|
|
1334
|
-
// }
|
|
1335
|
-
// const dialogRef = this.dialog.open(TraxpopupComponent, {
|
|
1336
|
-
// centered: true, size: 'md'
|
|
1337
|
-
// });
|
|
1338
|
-
// dialogRef.componentInstance.data = popupcontent;
|
|
1339
|
-
// dialogRef.result.then((result) => {
|
|
1340
|
-
// if (result.message === 'confirm') {
|
|
1341
|
-
// const payload = {
|
|
1342
|
-
// id: this.currentTaskId,
|
|
1343
|
-
// uploadUser: true,
|
|
1344
|
-
// clientId: this.headerData.client,
|
|
1345
|
-
// assignedUsers: assignList
|
|
1346
|
-
// }
|
|
1347
|
-
// this.uploadAssigneesList(payload, { addUser: true }).pipe(takeUntil(this.destroy$)).subscribe({
|
|
1348
|
-
// next: (res) => {
|
|
1349
|
-
// this.getAssignTable()
|
|
1350
|
-
// }
|
|
1351
|
-
// })
|
|
1352
|
-
// }
|
|
1353
|
-
// });
|
|
1354
|
-
// }
|
|
1355
|
-
// if (res?.data?.store?.length) {
|
|
1356
|
-
// function formatMessages(messages: any[]): string {
|
|
1357
|
-
// const groupedMessages: Record<string, string[]> = {};
|
|
1358
|
-
// messages.forEach(({ store, message }) => {
|
|
1359
|
-
// if (!groupedMessages[store]) {
|
|
1360
|
-
// groupedMessages[store] = [];
|
|
1361
|
-
// }
|
|
1362
|
-
// groupedMessages[store].push(message);
|
|
1363
|
-
// });
|
|
1364
|
-
// const formattedMessages = Object.entries(groupedMessages).map(([store, msgs]) => {
|
|
1365
|
-
// return `${msgs.join(', ')} in ${store}`;
|
|
1366
|
-
// });
|
|
1367
|
-
// return formattedMessages.join(', ');
|
|
1368
|
-
// }
|
|
1369
|
-
// this.toastService.getErrorToast(formatMessages(res?.data?.store))
|
|
1370
|
-
// }
|
|
1371
|
-
// },
|
|
1372
|
-
// error: (err) => {
|
|
1373
|
-
// this.toastService.getErrorToast(err?.error?.error || 'Something went wrong')
|
|
1374
|
-
// }
|
|
1375
|
-
// })
|
|
1376
|
-
// }
|
|
1377
|
-
// }
|
|
1378
|
-
addStoreComponent() {
|
|
1379
|
-
const dialogRef = this.dialog.open(TraxStoreComponent, {
|
|
1380
|
-
centered: true, size: 'md'
|
|
1381
|
-
});
|
|
1382
|
-
dialogRef.componentInstance.data = {
|
|
1383
|
-
checklistId: this.currentTaskId,
|
|
1384
|
-
obj: {
|
|
1385
|
-
checkListId: this.currentTaskId,
|
|
1386
|
-
clientId: this.headerData.client,
|
|
1387
|
-
},
|
|
1388
|
-
coverage: this.coverage,
|
|
1389
|
-
};
|
|
1390
|
-
dialogRef.result.then((res) => {
|
|
1391
|
-
if (res) {
|
|
1392
|
-
this.userData = res;
|
|
1393
|
-
this.upload = 'store';
|
|
1394
|
-
this.validateDetails();
|
|
1395
|
-
}
|
|
1396
|
-
});
|
|
1397
|
-
// dialogRef.result.then((res) => {
|
|
1398
|
-
// if (res) {
|
|
1399
|
-
// const payload = {
|
|
1400
|
-
// id: this.currentTaskId,
|
|
1401
|
-
// uploadUser: true,
|
|
1402
|
-
// clientId: this.headerData.client,
|
|
1403
|
-
// assignedUsers: res
|
|
1404
|
-
// }
|
|
1405
|
-
// this.uploadAssigneesList(payload, { delete: false }).pipe(takeUntil(this.destroy$)).subscribe({
|
|
1406
|
-
// next: (res1: any) => {
|
|
1407
|
-
// if (res1.code === 200) {
|
|
1408
|
-
// if (res1?.data?.user?.length) {
|
|
1409
|
-
// const popupcontent = {
|
|
1410
|
-
// displayprop: false,
|
|
1411
|
-
// imagesrc: '<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>',
|
|
1412
|
-
// title: `Invite new users added in CSV`,
|
|
1413
|
-
// content: `This CSV contains new users. Invite users by sending mail to them`,
|
|
1414
|
-
// buttontype: 'Invite',
|
|
1415
|
-
// user: res1.data.user
|
|
1416
|
-
// }
|
|
1417
|
-
// const dialogRef = this.dialog.open(TraxpopupComponent, {
|
|
1418
|
-
// centered: true, size: 'md'
|
|
1419
|
-
// });
|
|
1420
|
-
// dialogRef.componentInstance.data = popupcontent;
|
|
1421
|
-
// dialogRef.result.then((result) => {
|
|
1422
|
-
// if (result.message === 'confirm') {
|
|
1423
|
-
// const payload = {
|
|
1424
|
-
// id: this.currentTaskId,
|
|
1425
|
-
// uploadUser: true,
|
|
1426
|
-
// clientId: this.headerData.client,
|
|
1427
|
-
// assignedUsers: res
|
|
1428
|
-
// }
|
|
1429
|
-
// this.uploadAssigneesList(payload, { delete: false, addUser: true }).pipe(takeUntil(this.destroy$)).subscribe({
|
|
1430
|
-
// next: (res) => {
|
|
1431
|
-
// this.getAssignTable()
|
|
1432
|
-
// }
|
|
1433
|
-
// })
|
|
1434
|
-
// }
|
|
1435
|
-
// });
|
|
1436
|
-
// } else {
|
|
1437
|
-
// this.getAssignTable()
|
|
1438
|
-
// }
|
|
1439
|
-
// }
|
|
1440
|
-
// },
|
|
1441
|
-
// error: (err) => {
|
|
1442
|
-
// this.toastService.getErrorToast(err.error.error)
|
|
1443
|
-
// }
|
|
1444
|
-
// })
|
|
1445
|
-
// }
|
|
1446
|
-
// })
|
|
1447
|
-
}
|
|
1448
|
-
getStoreCounts(data) {
|
|
1449
|
-
if (this.storeCoverage) {
|
|
1450
|
-
const uniqueStoreNames = new Set(data.map((item) => item.storeName));
|
|
1451
|
-
return uniqueStoreNames.size;
|
|
1452
|
-
}
|
|
1453
|
-
else if (this.userCoverage) {
|
|
1454
|
-
const uniqueUserNames = new Set(data.map((item) => item.userName));
|
|
1455
|
-
return uniqueUserNames.size;
|
|
1456
|
-
}
|
|
1457
|
-
}
|
|
1458
|
-
uploadAssigneesList(payload, extraArgs) {
|
|
1459
|
-
const reqPayload = {
|
|
1460
|
-
...payload,
|
|
1461
|
-
...extraArgs
|
|
1462
|
-
};
|
|
1463
|
-
return this.traxService.uploadTaskAssignees(reqPayload);
|
|
1464
|
-
}
|
|
1465
|
-
getFormControlFromArray(index) {
|
|
1466
|
-
return this.reminderRepeatSchedules.at(index);
|
|
1467
|
-
}
|
|
1468
|
-
addMoreSchedules() {
|
|
1469
|
-
const scheduleValue = this.reminderRepeatScheduleOptions.filter((val) => !this.reminderRepeatSchedules?.value.includes(val));
|
|
1470
|
-
if (this.reminderRepeatSchedules.length < 3) {
|
|
1471
|
-
this.reminderRepeatSchedules.push(this.fb.control(scheduleValue[0]));
|
|
1472
|
-
}
|
|
1473
|
-
}
|
|
1474
|
-
disableScheduleOption(option) {
|
|
1475
|
-
return this.reminderRepeatSchedules.value.includes(option);
|
|
1476
|
-
}
|
|
1477
|
-
enableReminder(event) {
|
|
1478
|
-
if (event.target.checked) {
|
|
1479
|
-
this.reminderRepeatSchedules.clear();
|
|
1480
|
-
this.reminderRepeatSchedules.push(this.fb.control(this.reminderRepeatScheduleOptions[0]));
|
|
1481
|
-
}
|
|
1482
|
-
else {
|
|
1483
|
-
this.reminderRepeatSchedules.clear();
|
|
1484
|
-
}
|
|
1485
|
-
}
|
|
1486
|
-
onDragLeave(event) {
|
|
1487
|
-
event.preventDefault();
|
|
1488
|
-
event.target.classList.remove('drag-over');
|
|
1489
|
-
}
|
|
1490
|
-
onDragOver(event) {
|
|
1491
|
-
event.preventDefault();
|
|
1492
|
-
event.stopPropagation();
|
|
1493
|
-
// Add a visual effect to indicate drag is over the area
|
|
1494
|
-
event.target.classList.add('drag-over');
|
|
1495
|
-
}
|
|
1496
|
-
onDrop(event) {
|
|
1497
|
-
event.preventDefault();
|
|
1498
|
-
event.target.classList.remove('drag-over');
|
|
1499
|
-
if (event.dataTransfer?.files.length) {
|
|
1500
|
-
const file = event.dataTransfer.files[0];
|
|
1501
|
-
const fileInputElement = this.fileInput.nativeElement;
|
|
1502
|
-
// Manually set the file to the input
|
|
1503
|
-
const dataTransfer = new DataTransfer();
|
|
1504
|
-
dataTransfer.items.add(file);
|
|
1505
|
-
fileInputElement.files = dataTransfer.files;
|
|
1506
|
-
// Trigger the change event manually
|
|
1507
|
-
fileInputElement.dispatchEvent(new Event('change'));
|
|
1508
|
-
}
|
|
1509
|
-
}
|
|
1510
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskConfigureComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.PageInfoService }, { token: i3.TraxService }, { token: i4.NgbModal }, { token: i5.ToastService }, { token: i1.Router }, { token: i0.ChangeDetectorRef }, { token: i6.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
1511
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TaskConfigureComponent, selector: "lib-task-configure", viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["file"], descendants: true }, { propertyName: "fileInput1", first: true, predicate: ["file1"], descendants: true }, { propertyName: "bulkupload", first: true, predicate: ["bulkupload"], descendants: true }, { propertyName: "afterValidation", first: true, predicate: ["afterValidation"], descendants: true }, { propertyName: "confirmUser", first: true, predicate: ["confirmUser"], descendants: true }], ngImport: i0, template: "<div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"c-card d-flex justify-content-between\">\r\n <div class=\"d-flex justify-content-start align-items-center\">\r\n <div [routerLink]=\"'/manage/trax/checklist/managetask'\" class=\"btn btn-sm btn-outline me-5 px-3 py-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M15.8332 10.0003H4.1665M4.1665 10.0003L9.99984 15.8337M4.1665 10.0003L9.99984 4.16699\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></div>\r\n <div *ngIf=\"taskDetails\">\r\n <div class=\"checklist-name mb-5\">{{taskDetails.checkListName}}</div>\r\n <div class=\"checklist-desc\">{{taskDetails.checkListDescription}}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <button class=\"btn btn-primary py-3 me-5\" (click)=\"detassignUpdate('publish')\">Publish</button>\r\n <button class=\"btn btn-outline\" (click)=\"detassignUpdate('save')\">Save as Draft</button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <div style=\"height: 80vh; overflow-y: auto;\" class=\"c-card\">\r\n <h2 class=\"mb-5\">Schedule</h2>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M16 2V6M8 2V6M3 10H21M5 4H19C20.1046 4 21 4.89543 21 6V20C21 21.1046 20.1046 22 19 22H5C3.89543 22 3 21.1046 3 20V6C3 4.89543 3.89543 4 5 4Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">\r\n {{dueDateFormatted}}\r\n </span>\r\n </div>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M12 6V12L16 14M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">{{dueTimeFormatted}}</span>\r\n </div>\r\n <h2 class=\"mb-5\">Assign</h2>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M16 4H18C18.5304 4 19.0391 4.21071 19.4142 4.58579C19.7893 4.96086 20 5.46957 20 6V20C20 20.5304 19.7893 21.0391 19.4142 21.4142C19.0391 21.7893 18.5304 22 18 22H6C5.46957 22 4.96086 21.7893 4.58579 21.4142C4.21071 21.0391 4 20.5304 4 20V6C4 5.46957 4.21071 4.96086 4.58579 4.58579C4.96086 4.21071 5.46957 4 6 4H8M9 2H15C15.5523 2 16 2.44772 16 3V5C16 5.55228 15.5523 6 15 6H9C8.44772 6 8 5.55228 8 5V3C8 2.44772 8.44772 2 9 2Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">\r\n {{coverage}}s\r\n </span>\r\n </div>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M3.08995 6.88381L3.02401 6.98681C2.30358 8.25569 3.06101 9.87957 4.46464 10.0664C4.58627 10.0813 4.70112 10.0894 4.8145 10.0894C5.55255 10.0894 6.20523 9.77241 6.65953 9.27929L7.21286 8.67867L7.76432 9.28101C8.21367 9.77184 8.8652 10.0894 9.60776 10.0894C10.3471 10.0894 11.0022 9.77149 11.4512 9.28101L12.0044 8.67677L12.5576 9.28101C13.0066 9.77149 13.6617 10.0894 14.401 10.0894C15.1404 10.0894 15.7954 9.77149 16.2445 9.28101L16.7977 8.67678L17.3508 9.28101C17.7999 9.77149 18.4549 10.0894 19.1943 10.0894C19.3041 10.0894 19.4223 10.0812 19.5433 10.0665C20.9772 9.8718 21.7355 8.164 20.9155 6.88431C20.9154 6.88425 20.9154 6.8842 20.9154 6.88414L18.8056 3.59441L18.8056 3.59441L18.8046 3.59294C18.7582 3.52014 18.6649 3.46436 18.5584 3.46436H5.44307C5.3365 3.46436 5.24326 3.52014 5.19681 3.59295L5.19619 3.59391L3.08995 6.88381ZM4.81818 12.7501C4.71644 12.7501 4.616 12.747 4.5169 12.7411V16.6429V18.9644C4.5169 19.8212 5.22663 20.5358 6.11942 20.5358H17.882C18.7748 20.5358 19.4845 19.8212 19.4845 18.9644V16.6429V12.7416C19.3874 12.7471 19.2893 12.7501 19.1906 12.7501C19.0022 12.7501 18.8157 12.74 18.632 12.7203V16.6429V17.3929H17.882H6.11942H5.36942V16.6429V12.7211C5.18866 12.7402 5.00472 12.7501 4.81818 12.7501Z\"\r\n stroke=\"#101828\" stroke-width=\"1.5\" />\r\n </svg>\r\n <span class=\"schedule-text\">{{assignSingle?.length + groupAssign?.length}} {{coverage}}{{(assignSingle?.length + groupAssign?.length) > 1 ? 's':''}}</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-9\">\r\n <div style=\"height: 80vh; overflow-y: auto;\" class=\"c-card\">\r\n <div class=\"row\">\r\n <div class=\"col-6 mb-5\">\r\n <div class=\"date-picker\">\r\n <label for=\"datepick\" class=\"form-label\">Due date</label>\r\n <div style=\"position: relative;\">\r\n <svg style=\"position: absolute; top: 12px; left:12px;\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <input id=\"datepick\" class=\"fx-date-range form-control ps-14\" type=\"text\"\r\n ngxDaterangepickerMd [singleDatePicker]=\"true\" [minDate]=\"minDate\" [drops]=\"'down'\"\r\n [opens]=\"'right'\" [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\"\r\n [showCancel]=\"true\" autocomplete=\"off\" [(ngModel)]=\"scheduleDate\" [autoApply]=\"false\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n name=\"daterange\" [readonly]=\"true\" />\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label for=\"timePick\" class=\"form-label\">Due time</label>\r\n <input [formControl]=\"scheduleEndTime\" type=\"time\" class=\"form-control\" id=\"timePick\"\r\n >\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label class=\"form-label\">Approver</label>\r\n <lib-chip-dropdown [data]=\"approversList\" [selectedData]=\"approver.value\"\r\n (selectedList)=\"onApproveAdded($event)\"></lib-chip-dropdown>\r\n\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label for=\"priority\" class=\"form-label\">Priority</label>\r\n <select [formControl]=\"priorityType\" id=\"priority\" class=\"form-select mb-5\">\r\n <option value=\"high\">High</option>\r\n <option value=\"medium\">Medium</option>\r\n <option value=\"low\">Low</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"toggle-card\" [ngClass]=\"allowedStoreLocation.value ? 'selected' : ''\">\r\n <div class=\"form-check form-switch me-4\">\r\n <input [formControl]=\"allowedStoreLocation\" class=\"form-check-input\" type=\"checkbox\"\r\n role=\"switch\">\r\n </div>\r\n <div>\r\n <div class=\"header\">Geo fencing</div>\r\n <div class=\"desc\">By enabling, the checklist can be filled by the user only when inside the\r\n store.</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"toggle-card \" [ngClass]=\"restrictAttendance.value ? 'selected' : ''\">\r\n <div class=\"form-check form-switch me-4\">\r\n <input [formControl]=\"restrictAttendance\" class=\"form-check-input\" type=\"checkbox\"\r\n role=\"switch\">\r\n </div>\r\n <div>\r\n <div class=\"header\">Restrict attendance</div>\r\n <div class=\"desc\">By enabling, user can't be able to clockout without completing the task.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <label class=\"reminder-header me-4\" for=\"reminderToggle\">Reminder</label>\r\n <div class=\"form-check form-switch\">\r\n <input [checked]=\"reminderRepeatSchedules.controls.length\" (change)=\"enableReminder($event)\" class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"reminderToggle\">\r\n </div>\r\n </div>\r\n <div class=\"reminder-description mb-5\" >\r\n By enabling, the users will be reminded in the selected interval \r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mb-5\" >\r\n <ng-container *ngIf=\"reminderRepeatSchedules.controls.length\" >\r\n <div class=\"reminder-sub me-4\" >Notify user before</div>\r\n <ng-container *ngFor=\"let control of reminderRepeatSchedules.controls; let i = index\" >\r\n <div class=\"d-flex align-items-center position-relative w-200px me-4\" >\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1487_47636)\">\r\n <path\r\n d=\"M10.0013 5.00033V10.0003L13.3346 11.667M18.3346 10.0003C18.3346 14.6027 14.6037 18.3337 10.0013 18.3337C5.39893 18.3337 1.66797 14.6027 1.66797 10.0003C1.66797 5.39795 5.39893 1.66699 10.0013 1.66699C14.6037 1.66699 18.3346 5.39795 18.3346 10.0003Z\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1487_47636\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <select [formControl]=\"getFormControlFromArray(i)\" class=\"form-select ps-14 me-5\" >\r\n <ng-container *ngFor=\"let item of reminderRepeatScheduleOptions\" >\r\n <option [ngClass]=\"disableScheduleOption(item) ? 'd-none' : ''\" [ngValue]=\"item\" >{{item}} mins</option>\r\n </ng-container>\r\n </select>\r\n </div> \r\n </ng-container>\r\n </ng-container>\r\n\r\n \r\n <div *ngIf=\"reminderRepeatSchedules.controls.length > 0 && reminderRepeatSchedules.controls.length < 3 \" class=\"me-4\">\r\n <button (click)=\"addMoreSchedules()\" class=\"btn btn-sm btn-outline h-100\" ><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\" >\r\n <path d=\"M10.0013 4.16699V15.8337M4.16797 10.0003H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div> \r\n </div>\r\n\r\n <div class=\"reminder-sub me-4\" ><span *ngIf=\"reminderRepeatSchedules.controls?.[0]\" >Send Alerts {{reminderRepeatSchedules.at(0).value}} Mins</span><span *ngIf=\"reminderRepeatSchedules.controls?.[1]\">, {{reminderRepeatSchedules.at(1).value}} Mins </span><span *ngIf=\"reminderRepeatSchedules.controls?.[2]\">and {{reminderRepeatSchedules.at(2).value}} Mins</span> before the checklist end time</div>\r\n \r\n </div>\r\n\r\n\r\n <div class=\"col-12\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <h2>Assign</h2>\r\n </div>\r\n\r\n <div class=\"mb-5 ms-5 d-flex\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input\r\n class=\"form-check-input selected-radio cursor-pointer me-3\" type=\"radio\" name=\"stores\" [checked]=\"storeCoverage\" (click)=\"selectRadio('store')\">\r\n <label class=\"uploadtext cursor-pointer fw-semibold\">Assign Stores and Clusters</label>\r\n </div>\r\n <div class=\"form-check ms-5 d-flex align-items-center\">\r\n <input\r\n class=\"form-check-input selected-radio cursor-pointer me-3\" type=\"radio\" name=\"users\" [checked]=\"userCoverage\" (click)=\"selectRadio('user')\">\r\n <label class=\"uploadtext cursor-pointer fw-semibold\">Assign Users and Teams</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex ms-5 align-items-center justify-content-between\">\r\n <div class=\"d-flex overflow-auto h-45px w-75 mt-5\">\r\n <ul *ngIf=\"storeCoverage\"\r\n class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li (click)=\"selectedTab('store')\" class=\"nav-item cursor-pointer h-100\"><span\r\n [ngClass]=\"assignType ==='store' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Stores</span>\r\n </li>\r\n <li (click)=\"selectedTab('cluster')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='cluster' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Clusters</a></li>\r\n </ul>\r\n <ul *ngIf=\"userCoverage\"\r\n class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li (click)=\"selectedTab('user')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='user' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Users</a>\r\n </li>\r\n <li (click)=\"selectedTab('team')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='team' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Teams</a></li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"!['cluster','team'].includes(assignType)\" class=\"d-flex align-items-center\">\r\n <div *ngIf=\"storeCoverage\" (click)=\"addStoreComponent()\" class=\"btn btn-outline px-4 ng-star-inserted mt-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16602V15.8327M4.16675 9.99935H15.8334\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span>Assign Store</span>\r\n </div>\r\n <div *ngIf=\"userCoverage\" (click)=\"addStoreComponent()\" class=\"btn btn-outline px-4 ng-star-inserted mt-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16602V15.8327M4.16675 9.99935H15.8334\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span>Assign User</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 ms-5\">\r\n <div class=\"table-header mt-5 d-flex align-items-center justify-content-between\">\r\n <div class=\"table-title\">Selected <span *ngIf=\"storeCoverage\">{{assignType | titlecase}}s</span></div>\r\n </div>\r\n <div class=\"w-100 mt-3 pe-5\">\r\n <lib-multi-chip-dropdown *ngIf=\"storeList && taskDetails\" [items]=\"storeList\" [multi]=\"true\" [searchField]=\"['storeName','clusterName','storeId','userName','teamName']\" [searchKey]=\"searchKey\" [idField]=\"'_id'\"\r\n (selected)=\"updateAssign($event)\" (removed)=\"removedChip($event)\" [selectedValues]=\"taskDetails.assign\"></lib-multi-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(assignTableApiState | async) === 'loaded' && tableArray?.length\" class=\"card-body px-0 mt-0 pt-0 pb-0 mx-4 mb-5\">\r\n <div class=\" w-100\">\r\n <div class=\"table-header mt-5 d-flex align-items-center justify-content-between\">\r\n <div class=\"table-title\">Selected <span>{{assignType | titlecase}}s</span> List</div>\r\n <div class=\"d-flex align-items-center justify-content-start\">\r\n <div class=\"me-3\">\r\n <!-- <span class=\"svg-icon svg-icon-1 align-items-center position-absolute mt-3 ms-6\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\"\r\n rx=\"1\" transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span> -->\r\n <input [formControl]=\"searchInput\" type=\"text\" data-kt-subscription-table-filter=\"search\" (change)=\"searchTableData()\"\r\n class=\"form-control form-control-solid w-200px ps-5 mx-1 me-4\" autocomplete=\"off\" \r\n autocapitalize=\"none\" \r\n spellcheck=\"false\" style=\"text-transform: none\" placeholder=\"Search...\"> \r\n </div>\r\n\r\n <div *ngIf=\"!['cluster','team'].includes(assignType)\" class=\"position-relative w-100 mt-5 mb-5\">\r\n <button type=\"button\"\r\n class=\"btn py-3 btn-default w-100 btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between\">\r\n <span class=\"me-3 cursor-pointer\" (click)=\"file.click()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> <span #upload class=\"template-dropdown ms-3 bg-white\">BulkUpload </span></span>\r\n <span class=\"subtitle mx-3 me-2\"> | </span>\r\n <span class=\"cursor-pointer\" (click)=\"openDropdown($event)\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n <span><input style=\"display: none;\" type=\"file\" #file\r\n id=\"kt_account_team_size_select_1\" (change)=\"onFileUpload($event)\" /></span>\r\n </button>\r\n\r\n <div *ngIf=\"dropDown\" class=\"card template-dropdown h-40px w-100 position-absolute rounded-3 z-1 top-50px end-0\">\r\n <ul class=\"list-unstyled mb-0 w-auto cursor-pointer\" (click)=\"bulkuploadModel()\">\r\n <li class=\"px-5 fw-semibold cursor-pointer py-2\">Download Template</li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"['cluster','team'].includes(assignType)\">\r\n <button type=\"button\"\r\n class=\"btn py-3 btn-default w-100 btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between\" (click)=\"downloadTemplateV2()\">\r\n <span class=\"me-3 cursor-pointer\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M8.125 13.125H16.3562L14.7438 14.7438L15.625 15.625L18.75 12.5L15.625 9.375L14.7438 10.2562L16.3562 11.875H8.125V13.125Z\" fill=\"black\"/>\r\n <path d=\"M13.75 8.75001V6.25001C13.7505 6.16776 13.7347 6.08622 13.7036 6.01007C13.6725 5.93392 13.6267 5.86466 13.5688 5.80626L9.19375 1.43126C9.13535 1.37333 9.06609 1.32751 8.98994 1.2964C8.91379 1.2653 8.83225 1.24953 8.75 1.25001H2.5C2.16848 1.25001 1.85054 1.38171 1.61612 1.61613C1.3817 1.85055 1.25 2.16849 1.25 2.50001V17.5C1.25 17.8315 1.3817 18.1495 1.61612 18.3839C1.85054 18.6183 2.16848 18.75 2.5 18.75H12.5C12.8315 18.75 13.1495 18.6183 13.3839 18.3839C13.6183 18.1495 13.75 17.8315 13.75 17.5V16.25H12.5V17.5H2.5V2.50001H7.5V6.25001C7.5 6.58153 7.6317 6.89947 7.86612 7.13389C8.10054 7.36831 8.41848 7.50001 8.75 7.50001H12.5V8.75001H13.75ZM8.75 6.25001V2.75626L12.2438 6.25001H8.75Z\" fill=\"black\"/>\r\n </svg> <span class=\"template-dropdown bg-white ms-3\">Export </span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(assignTableApiState | async) === 'loaded' && tableArray?.length\">\r\n <div class=\"col-lg-12\" *ngIf=\"searchInput.value && !assignTableData?.length\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-12\" *ngIf=\"!searchInput.value && !assignTableData?.length\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"assignTableData?.length\">\r\n <div class=\"table-responsive mt-5 mx-4\">\r\n <table *ngIf=\"storeCoverage\" class=\"w-100 table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('storeName')\">\r\n Store Name\r\n <span\r\n *ngIf=\"sortColumn === 'storeName' && sortBy !== 1 || sortColumn !== 'storeName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'storeName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userName')\">\r\n SPOC Name\r\n <span\r\n *ngIf=\"sortColumn === 'userName' && sortBy !== 1 || sortColumn !== 'userName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userEmail')\">\r\n SPOC Email\r\n <span\r\n *ngIf=\"sortColumn === 'userEmail' && sortBy !== 1 || sortColumn !== 'userEmail' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userEmail' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"assignType ==='cluster'\" class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('clusterName')\">\r\n Cluster Name\r\n <span\r\n *ngIf=\"sortColumn === 'clusterName' && sortBy !== 1 || sortColumn !== 'clusterName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'clusterName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of assignTableData;let i=index\">\r\n <td>{{data.storeName}}\r\n </td>\r\n <td>{{data.userName ? data.userName : '--'}}</td>\r\n <td>{{data.userEmail ? data.userEmail : '--'}}</td>\r\n <td *ngIf=\"assignType ==='cluster'\">{{data.clusterName ? data.clusterName : '--'}}</td>\r\n </tbody>\r\n </table>\r\n <table *ngIf=\"userCoverage\" class=\"w-100 table bottom-border text-nowrap\"> \r\n <thead>\r\n <tr>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userName')\">\r\n User Name\r\n <span\r\n *ngIf=\"sortColumn === 'userName' && sortBy !== 1 || sortColumn !== 'userName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userEmail')\">\r\n User Email\r\n <span\r\n *ngIf=\"sortColumn === 'userEmail' && sortBy !== 1 || sortColumn !== 'userEmail' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userEmail' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"assignType ==='team'\" class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('teamName')\">\r\n Teams Name\r\n <span\r\n *ngIf=\"sortColumn === 'teamName' && sortBy !== 1 || sortColumn !== 'teamName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'teamName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of assignTableData;let i=index\">\r\n <td>{{data.userName}}</td>\r\n <td>{{data.userEmail ? data.userEmail : '--'}}</td>\r\n <td *ngIf=\"assignType ==='team'\">{{data.teamName ? data.teamName : '--'}}</td>\r\n </tbody>\r\n </table>\r\n </div>\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"(assignTableApiState | async) === 'loading' || (assignTableApiState | async) === 'initial'\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container>\r\n <div>\r\n <ng-container\r\n *ngIf=\"(assignTableApiState | async) === 'loaded' && !tableArray?.length && this.taskDetails?.assign && !['cluster','team'].includes(assignType)\">\r\n <div class=\"row mb-6\">\r\n <div class=\"col-lg-12 assignpadding mb-10 mt-10\">\r\n <div class=\"row\">\r\n <div class=\"hr w-100 border border-1 position-relative\">\r\n <div class=\"position-absolute template-dropdown orposition bg-white w-100px\">or</div>\r\n </div>\r\n <div class=\"uploadpadding mt-10\">\r\n <ul class=\"subtext list-unstyled d-flex flex-column align-items-center mx-4\">\r\n <li>Use the template to upload multiple <span *ngIf=\"storeCoverage\">stores</span> <span *ngIf=\"userCoverage\">users</span> at once.</li> \r\n <li> Download the template here - <span (click)=\"downloadTemplateV2()\" class=\"cursor-pointer\"><span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span><span class=\"text-primary\">Download Template</span></span></li>\r\n <li> Add your data to the Template File</li>\r\n </ul>\r\n </div>\r\n <div class=\"w-100 border border-2 text-center border-dashed rounded-3 border-primary p-5\" (dragover)=\"onDragOver($event)\" \r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"file.click()\">\r\n <div class=\"\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\"/>\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\" stroke-width=\"6\"/>\r\n <g clip-path=\"url(#clip0_7979_5202)\">\r\n <path d=\"M26.3335 26.3332L23.0002 22.9999M23.0002 22.9999L19.6669 26.3332M23.0002 22.9999V30.4999M29.9919 28.3249C30.8047 27.8818 31.4467 27.1806 31.8168 26.3321C32.1868 25.4835 32.2637 24.5359 32.0354 23.6388C31.807 22.7417 31.2865 21.9462 30.5558 21.3778C29.8251 20.8094 28.9259 20.5005 28.0002 20.4999H26.9502C26.698 19.5243 26.2278 18.6185 25.5752 17.8507C24.9225 17.0829 24.1042 16.4731 23.182 16.0671C22.2597 15.661 21.2573 15.4694 20.2503 15.5065C19.2433 15.5436 18.2578 15.8085 17.3679 16.2813C16.4779 16.7541 15.7068 17.4225 15.1124 18.2362C14.518 19.05 14.1158 19.9879 13.936 20.9794C13.7563 21.9709 13.8036 22.9903 14.0746 23.961C14.3455 24.9316 14.8329 25.8281 15.5002 26.5832\" stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_7979_5202\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13 13)\"/>\r\n </clipPath>\r\n </defs>\r\n </svg></div>\r\n <div class=\"storetext cursor-pointer fw-bold\"><span class=\"text-primary text-decoration-underline\">Click To Upload</span> \r\n or drag and drop\r\n </div>\r\n <div class=\"headeralign fw-400\">the data added template file for processing.</div>\r\n <input style=\"visibility: hidden;\" type=\"file\" #file\r\n id=\"kt_account_team_size_select_1\" (change)=\"onFileUpload($event)\" />\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container>\r\n <div class=\"col-lg-12\" *ngIf=\"(assignTableApiState | async) === 'loaded' && !tableArray?.length && this.taskDetails?.assign && ['cluster','team'].includes(assignType)\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #bulkupload let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div> <span class=\"config-heading fw-semibold ms-5 w-auto\">Bulk Upload</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step 1 - <a class=\"text-decoration-underline cursor-pointer\" (click)=\"downloadTemplateV2()\">Download the template here</a></div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step2 - Add your data to the Template File with existing <span *ngIf=\"storeCoverage\">store</span> <span *ngIf=\"userCoverage\">user</span> data</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step3 - Upload it below for processing</div>\r\n\r\n <div class=\"fw-bold storeAssign mt-10\">**Note : On upload, all the existing data will be replaced</div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"model.close()\">Cancel</button>\r\n <button class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"file1.click()\">Upload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Assign <span *nfIf=\"storeCoverage\">Stores</span> <span *ngIf=\"userCoverage\">Users</span></span></div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total <span *nfIf=\"storeCoverage\">Stores</span> <span *ngIf=\"userCoverage\">Users</span></div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div *ngIf=\"!showStore&&!showTeam&&!showCluster&&!showUser&&!showInactive\">You're about to assign {{getStoreCounts(excelData)}} <span *ngIf=\"storeCoverage\">stores</span><span *ngIf=\"userCoverage\">users</span> to the checklist. Are you sure want to proceed?</div>\r\n <div *ngIf=\"storeCoverage && showStore\" class=\"mt-3\">Store <span *ngFor=\"let store of validatedStore;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/stores\" [queryParams]=\"{tyoe: 'stores'}\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Onboard Stores</a></div>\r\n <div *ngIf=\"userCoverage && showUser\" class=\"mt-3\">User <span *ngFor=\"let store of validatedUser;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup();confirmUserpopup()\">Onboard Users</a></div>\r\n <div *ngIf=\"userCoverage && showTeam\" class=\"mt-3\">Team <span *ngFor=\"let store of validatedTeam;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/users/client\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Create Team</a></div>\r\n <div *ngIf=\"storeCoverage && showCluster\" class=\"mt-3\">user <span *ngFor=\"let store of validatedCluster;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/stores\" class=\"text-decoration-underline cursor-pointer\" [queryParams]=\"{tyoe: 'cluster'}\" (click)=\"closeactivepopup()\">Create Cluster</a></div>\r\n <div *ngIf=\"storeCoverage && showUser\" class=\"mt-3\">User <span *ngFor=\"let store of validatedUser;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup();confirmUserpopup()\">Onboard Users</a></div>\r\n <div *ngIf=\"storeCoverage && showInactive\" class=\"mt-3\">Store <span *ngFor=\"let store of inactiveStores;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for is inactive, <a routerLink=\"/manage/stores\" [queryParams]=\"{tyoe: 'stores'}\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Onboard Stores</a></div>\r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct and complete layout information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError&&!showStore&&!showCluster&&!showUser&&!showTeam&&!showInactive\" class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"validateDetails()\">Proceed</button>\r\n <button *ngIf=\"excelError||showStore||showCluster||showUser||showTeam || showInactive\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"Reupload();\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'reupload')\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #confirmUser let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title d-flex flex-column mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\"/><path d=\"M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z\" stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\"/></svg>\r\n </div><br>\r\n <div class=\"config-heading fw-semibold w-auto\">New User found in uploaded file</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">This CSV contains a new User. Add new User in the User Management under Manage menu.</div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <!-- <button class=\"btn btn-md btn-default btn-outline\" routerLink=\"/manage/users/client\" (click)=\"closeactivepopup()\">Skip New Entries</button> -->\r\n <button class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"model.close('confirm')\">Invite Selected</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".c-card{padding:24px;background:#fff;border-radius:16px}.plain-input{border:none;outline:none;background:transparent;padding:0;margin:0;width:100%;overflow:hidden;color:var(--black, #101828);text-overflow:ellipsis;font-family:Inter;font-size:18px;font-style:normal;font-weight:500;line-height:28px}.plain-input:focus{border-radius:0!important;border:white!important;outline:none!important;box-shadow:none!important}.checklist-name{font-size:20px;font-weight:600;line-height:28px;text-align:left;color:#667085!important}.checklist-desc{font-size:14px;font-weight:400;line-height:18px;text-align:left}:host::ng-deep .date-picker .md-drppicker .btn{line-height:10px!important}:host::ng-deep .date-picker .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .date-picker .md-drppicker.drops-down-right.ltr.show-ranges.shown{top:65px!important}:host::ng-deep .date-picker .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;right:-475px!important;left:unset!important;height:400px!important}:host::ng-deep .date-picker .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .date-picker .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .date-picker .md-drppicker td.active,:host::ng-deep .date-picker .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .date-picker .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .date-picker .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .date-picker .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep .date-picker table th,:host::ng-deep .date-picker table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .date-picker .md-drppicker td.available.prev,:host::ng-deep .date-picker .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .date-picker .md-drppicker td.available.next,:host::ng-deep .date-picker .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .date-picker table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .date-picker .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .date-picker .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .date-picker .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.assignpadding{padding:0 40px}.uploadpadding{padding:0 20% 9px}.orposition{top:0;left:50%;transform:translate(-50%,-50%);text-align:center}.storetext{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px}.storeAssign{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.storeAssign a:hover{text-decoration:underline!important}.border-primary{border:1px dashed var(--Primary-500, #33B5FF)!important;background:var(--Primary-25, #F6FCFF)!important}.template-dropdown{background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.uploadtext{color:var(--gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize}.subtext{color:var(--gray-500, #667085);font-family:Inter;font-size:14px;font-weight:400;line-height:20px;align-items:center;gap:8px;align-self:stretch}.selectstore{color:var(--primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.sub{color:var(--gray-700, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.subopen{color:var(--black, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.headeralign{color:var(--gray-500, #667085);font-family:Inter;font-size:12px;font-style:normal;font-weight:500;line-height:18px}.selected-radio{width:1.5rem!important;height:1.5rem!important}.subtitle{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0em;text-align:left;color:#667085}.form-control.form-control-solid{display:flex;padding:11px 14px;align-items:center;gap:8px;align-self:stretch;border-radius:8px;border:1px solid var(--gray-500, #D0D5DD);background:var(--white, #FFF);box-shadow:0 1px 2px #1018280d}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip .initials{color:var(--Primary-600, #00A3FF);font-size:12px;font-weight:500;line-height:18px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.toggle-card{padding:16px;display:flex;align-items:center;border-radius:8px;border:1px solid #EAECF0;background:#fff}.toggle-card .header{color:#344054;font-size:16px;font-weight:500;line-height:24px}.toggle-card .desc{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.toggle-card.selected{border:1px solid #6BCAFF}.toggle-card.selected .header{color:#008edf}.toggle-card.selected .desc{color:#00a3ff}.sub-txt{color:#667085;font-size:14px;font-weight:400;line-height:20px;gap:8px}.cstm-blu-btn{padding:8px 14px;border-radius:8px;border:1px solid #EAF8FF;background:#eaf8ff;box-shadow:0 1px 2px #1018280d;color:#009bf3;font-size:14px;font-weight:600;line-height:20px;cursor:pointer;display:flex;align-items:center}.schedule-text{color:#344054;font-size:16px;font-weight:500;line-height:24px}input[type=checkbox].c-checkbox{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox].c-checkbox:checked{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox].c-checkbox:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.reminder-header{color:#101828;font-size:20px;font-weight:600;line-height:30px}.reminder-description{color:#344054;font-size:14px;font-weight:500;line-height:20px}.reminder-sub{color:#101828;font-size:16px;font-weight:500;line-height:24px}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:600;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.nav{display:flex;align-items:center;gap:16px;flex:1 0 0;align-self:stretch;--bs-nav-link-color: none}.nav-item .nav-link{color:var(--Gray-500, #667085);font-size:16px;font-weight:500}.nav-item .nav-link:hover{border-bottom:none!important}.nav-item .nav-link.active{border-radius:10px!important;border-bottom:none!important}.nav-item .bg-light-primary{background:var(--Primary-50, #EAF8FF)!important}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i5.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "component", type: i9.ChipDropdownComponent, selector: "lib-chip-dropdown", inputs: ["data", "selectedData", "placeholder"], outputs: ["selectedList"] }, { kind: "component", type: i10.MultiChipDropdownComponent, selector: "lib-multi-chip-dropdown", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label", "badgeValue", "searchKey", "assignType"], outputs: ["selected", "removed"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }] });
|
|
1512
|
-
}
|
|
1513
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskConfigureComponent, decorators: [{
|
|
1514
|
-
type: Component,
|
|
1515
|
-
args: [{ selector: 'lib-task-configure', template: "<div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"c-card d-flex justify-content-between\">\r\n <div class=\"d-flex justify-content-start align-items-center\">\r\n <div [routerLink]=\"'/manage/trax/checklist/managetask'\" class=\"btn btn-sm btn-outline me-5 px-3 py-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M15.8332 10.0003H4.1665M4.1665 10.0003L9.99984 15.8337M4.1665 10.0003L9.99984 4.16699\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></div>\r\n <div *ngIf=\"taskDetails\">\r\n <div class=\"checklist-name mb-5\">{{taskDetails.checkListName}}</div>\r\n <div class=\"checklist-desc\">{{taskDetails.checkListDescription}}</div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex align-items-center\">\r\n <button class=\"btn btn-primary py-3 me-5\" (click)=\"detassignUpdate('publish')\">Publish</button>\r\n <button class=\"btn btn-outline\" (click)=\"detassignUpdate('save')\">Save as Draft</button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <div style=\"height: 80vh; overflow-y: auto;\" class=\"c-card\">\r\n <h2 class=\"mb-5\">Schedule</h2>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M16 2V6M8 2V6M3 10H21M5 4H19C20.1046 4 21 4.89543 21 6V20C21 21.1046 20.1046 22 19 22H5C3.89543 22 3 21.1046 3 20V6C3 4.89543 3.89543 4 5 4Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">\r\n {{dueDateFormatted}}\r\n </span>\r\n </div>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M12 6V12L16 14M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">{{dueTimeFormatted}}</span>\r\n </div>\r\n <h2 class=\"mb-5\">Assign</h2>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M16 4H18C18.5304 4 19.0391 4.21071 19.4142 4.58579C19.7893 4.96086 20 5.46957 20 6V20C20 20.5304 19.7893 21.0391 19.4142 21.4142C19.0391 21.7893 18.5304 22 18 22H6C5.46957 22 4.96086 21.7893 4.58579 21.4142C4.21071 21.0391 4 20.5304 4 20V6C4 5.46957 4.21071 4.96086 4.58579 4.58579C4.96086 4.21071 5.46957 4 6 4H8M9 2H15C15.5523 2 16 2.44772 16 3V5C16 5.55228 15.5523 6 15 6H9C8.44772 6 8 5.55228 8 5V3C8 2.44772 8.44772 2 9 2Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"schedule-text\">\r\n {{coverage}}s\r\n </span>\r\n </div>\r\n <div class=\"d-flex mb-5\">\r\n <svg class=\"me-4\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M3.08995 6.88381L3.02401 6.98681C2.30358 8.25569 3.06101 9.87957 4.46464 10.0664C4.58627 10.0813 4.70112 10.0894 4.8145 10.0894C5.55255 10.0894 6.20523 9.77241 6.65953 9.27929L7.21286 8.67867L7.76432 9.28101C8.21367 9.77184 8.8652 10.0894 9.60776 10.0894C10.3471 10.0894 11.0022 9.77149 11.4512 9.28101L12.0044 8.67677L12.5576 9.28101C13.0066 9.77149 13.6617 10.0894 14.401 10.0894C15.1404 10.0894 15.7954 9.77149 16.2445 9.28101L16.7977 8.67678L17.3508 9.28101C17.7999 9.77149 18.4549 10.0894 19.1943 10.0894C19.3041 10.0894 19.4223 10.0812 19.5433 10.0665C20.9772 9.8718 21.7355 8.164 20.9155 6.88431C20.9154 6.88425 20.9154 6.8842 20.9154 6.88414L18.8056 3.59441L18.8056 3.59441L18.8046 3.59294C18.7582 3.52014 18.6649 3.46436 18.5584 3.46436H5.44307C5.3365 3.46436 5.24326 3.52014 5.19681 3.59295L5.19619 3.59391L3.08995 6.88381ZM4.81818 12.7501C4.71644 12.7501 4.616 12.747 4.5169 12.7411V16.6429V18.9644C4.5169 19.8212 5.22663 20.5358 6.11942 20.5358H17.882C18.7748 20.5358 19.4845 19.8212 19.4845 18.9644V16.6429V12.7416C19.3874 12.7471 19.2893 12.7501 19.1906 12.7501C19.0022 12.7501 18.8157 12.74 18.632 12.7203V16.6429V17.3929H17.882H6.11942H5.36942V16.6429V12.7211C5.18866 12.7402 5.00472 12.7501 4.81818 12.7501Z\"\r\n stroke=\"#101828\" stroke-width=\"1.5\" />\r\n </svg>\r\n <span class=\"schedule-text\">{{assignSingle?.length + groupAssign?.length}} {{coverage}}{{(assignSingle?.length + groupAssign?.length) > 1 ? 's':''}}</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-9\">\r\n <div style=\"height: 80vh; overflow-y: auto;\" class=\"c-card\">\r\n <div class=\"row\">\r\n <div class=\"col-6 mb-5\">\r\n <div class=\"date-picker\">\r\n <label for=\"datepick\" class=\"form-label\">Due date</label>\r\n <div style=\"position: relative;\">\r\n <svg style=\"position: absolute; top: 12px; left:12px;\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <input id=\"datepick\" class=\"fx-date-range form-control ps-14\" type=\"text\"\r\n ngxDaterangepickerMd [singleDatePicker]=\"true\" [minDate]=\"minDate\" [drops]=\"'down'\"\r\n [opens]=\"'right'\" [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\"\r\n [showCancel]=\"true\" autocomplete=\"off\" [(ngModel)]=\"scheduleDate\" [autoApply]=\"false\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n name=\"daterange\" [readonly]=\"true\" />\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label for=\"timePick\" class=\"form-label\">Due time</label>\r\n <input [formControl]=\"scheduleEndTime\" type=\"time\" class=\"form-control\" id=\"timePick\"\r\n >\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label class=\"form-label\">Approver</label>\r\n <lib-chip-dropdown [data]=\"approversList\" [selectedData]=\"approver.value\"\r\n (selectedList)=\"onApproveAdded($event)\"></lib-chip-dropdown>\r\n\r\n </div>\r\n <div class=\"col-6 mb-5\">\r\n <label for=\"priority\" class=\"form-label\">Priority</label>\r\n <select [formControl]=\"priorityType\" id=\"priority\" class=\"form-select mb-5\">\r\n <option value=\"high\">High</option>\r\n <option value=\"medium\">Medium</option>\r\n <option value=\"low\">Low</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"toggle-card\" [ngClass]=\"allowedStoreLocation.value ? 'selected' : ''\">\r\n <div class=\"form-check form-switch me-4\">\r\n <input [formControl]=\"allowedStoreLocation\" class=\"form-check-input\" type=\"checkbox\"\r\n role=\"switch\">\r\n </div>\r\n <div>\r\n <div class=\"header\">Geo fencing</div>\r\n <div class=\"desc\">By enabling, the checklist can be filled by the user only when inside the\r\n store.</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"toggle-card \" [ngClass]=\"restrictAttendance.value ? 'selected' : ''\">\r\n <div class=\"form-check form-switch me-4\">\r\n <input [formControl]=\"restrictAttendance\" class=\"form-check-input\" type=\"checkbox\"\r\n role=\"switch\">\r\n </div>\r\n <div>\r\n <div class=\"header\">Restrict attendance</div>\r\n <div class=\"desc\">By enabling, user can't be able to clockout without completing the task.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <label class=\"reminder-header me-4\" for=\"reminderToggle\">Reminder</label>\r\n <div class=\"form-check form-switch\">\r\n <input [checked]=\"reminderRepeatSchedules.controls.length\" (change)=\"enableReminder($event)\" class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"reminderToggle\">\r\n </div>\r\n </div>\r\n <div class=\"reminder-description mb-5\" >\r\n By enabling, the users will be reminded in the selected interval \r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mb-5\" >\r\n <ng-container *ngIf=\"reminderRepeatSchedules.controls.length\" >\r\n <div class=\"reminder-sub me-4\" >Notify user before</div>\r\n <ng-container *ngFor=\"let control of reminderRepeatSchedules.controls; let i = index\" >\r\n <div class=\"d-flex align-items-center position-relative w-200px me-4\" >\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1487_47636)\">\r\n <path\r\n d=\"M10.0013 5.00033V10.0003L13.3346 11.667M18.3346 10.0003C18.3346 14.6027 14.6037 18.3337 10.0013 18.3337C5.39893 18.3337 1.66797 14.6027 1.66797 10.0003C1.66797 5.39795 5.39893 1.66699 10.0013 1.66699C14.6037 1.66699 18.3346 5.39795 18.3346 10.0003Z\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1487_47636\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <select [formControl]=\"getFormControlFromArray(i)\" class=\"form-select ps-14 me-5\" >\r\n <ng-container *ngFor=\"let item of reminderRepeatScheduleOptions\" >\r\n <option [ngClass]=\"disableScheduleOption(item) ? 'd-none' : ''\" [ngValue]=\"item\" >{{item}} mins</option>\r\n </ng-container>\r\n </select>\r\n </div> \r\n </ng-container>\r\n </ng-container>\r\n\r\n \r\n <div *ngIf=\"reminderRepeatSchedules.controls.length > 0 && reminderRepeatSchedules.controls.length < 3 \" class=\"me-4\">\r\n <button (click)=\"addMoreSchedules()\" class=\"btn btn-sm btn-outline h-100\" ><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\" >\r\n <path d=\"M10.0013 4.16699V15.8337M4.16797 10.0003H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div> \r\n </div>\r\n\r\n <div class=\"reminder-sub me-4\" ><span *ngIf=\"reminderRepeatSchedules.controls?.[0]\" >Send Alerts {{reminderRepeatSchedules.at(0).value}} Mins</span><span *ngIf=\"reminderRepeatSchedules.controls?.[1]\">, {{reminderRepeatSchedules.at(1).value}} Mins </span><span *ngIf=\"reminderRepeatSchedules.controls?.[2]\">and {{reminderRepeatSchedules.at(2).value}} Mins</span> before the checklist end time</div>\r\n \r\n </div>\r\n\r\n\r\n <div class=\"col-12\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <h2>Assign</h2>\r\n </div>\r\n\r\n <div class=\"mb-5 ms-5 d-flex\">\r\n <div class=\"form-check d-flex align-items-center\">\r\n <input\r\n class=\"form-check-input selected-radio cursor-pointer me-3\" type=\"radio\" name=\"stores\" [checked]=\"storeCoverage\" (click)=\"selectRadio('store')\">\r\n <label class=\"uploadtext cursor-pointer fw-semibold\">Assign Stores and Clusters</label>\r\n </div>\r\n <div class=\"form-check ms-5 d-flex align-items-center\">\r\n <input\r\n class=\"form-check-input selected-radio cursor-pointer me-3\" type=\"radio\" name=\"users\" [checked]=\"userCoverage\" (click)=\"selectRadio('user')\">\r\n <label class=\"uploadtext cursor-pointer fw-semibold\">Assign Users and Teams</label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex ms-5 align-items-center justify-content-between\">\r\n <div class=\"d-flex overflow-auto h-45px w-75 mt-5\">\r\n <ul *ngIf=\"storeCoverage\"\r\n class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li (click)=\"selectedTab('store')\" class=\"nav-item cursor-pointer h-100\"><span\r\n [ngClass]=\"assignType ==='store' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Stores</span>\r\n </li>\r\n <li (click)=\"selectedTab('cluster')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='cluster' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Clusters</a></li>\r\n </ul>\r\n <ul *ngIf=\"userCoverage\"\r\n class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n <li (click)=\"selectedTab('user')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='user' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Users</a>\r\n </li>\r\n <li (click)=\"selectedTab('team')\" class=\"nav-item cursor-pointer h-100\"><a\r\n [ngClass]=\"assignType ==='team' ? 'active bg-light-primary text-primary' :''\"\r\n class=\"nav-link text-active-primary m-0 px-5\">Teams</a></li>\r\n </ul>\r\n </div>\r\n <div *ngIf=\"!['cluster','team'].includes(assignType)\" class=\"d-flex align-items-center\">\r\n <div *ngIf=\"storeCoverage\" (click)=\"addStoreComponent()\" class=\"btn btn-outline px-4 ng-star-inserted mt-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16602V15.8327M4.16675 9.99935H15.8334\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span>Assign Store</span>\r\n </div>\r\n <div *ngIf=\"userCoverage\" (click)=\"addStoreComponent()\" class=\"btn btn-outline px-4 ng-star-inserted mt-8\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0001 4.16602V15.8327M4.16675 9.99935H15.8334\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span>Assign User</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 ms-5\">\r\n <div class=\"table-header mt-5 d-flex align-items-center justify-content-between\">\r\n <div class=\"table-title\">Selected <span *ngIf=\"storeCoverage\">{{assignType | titlecase}}s</span></div>\r\n </div>\r\n <div class=\"w-100 mt-3 pe-5\">\r\n <lib-multi-chip-dropdown *ngIf=\"storeList && taskDetails\" [items]=\"storeList\" [multi]=\"true\" [searchField]=\"['storeName','clusterName','storeId','userName','teamName']\" [searchKey]=\"searchKey\" [idField]=\"'_id'\"\r\n (selected)=\"updateAssign($event)\" (removed)=\"removedChip($event)\" [selectedValues]=\"taskDetails.assign\"></lib-multi-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"(assignTableApiState | async) === 'loaded' && tableArray?.length\" class=\"card-body px-0 mt-0 pt-0 pb-0 mx-4 mb-5\">\r\n <div class=\" w-100\">\r\n <div class=\"table-header mt-5 d-flex align-items-center justify-content-between\">\r\n <div class=\"table-title\">Selected <span>{{assignType | titlecase}}s</span> List</div>\r\n <div class=\"d-flex align-items-center justify-content-start\">\r\n <div class=\"me-3\">\r\n <!-- <span class=\"svg-icon svg-icon-1 align-items-center position-absolute mt-3 ms-6\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\"\r\n rx=\"1\" transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n </rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span> -->\r\n <input [formControl]=\"searchInput\" type=\"text\" data-kt-subscription-table-filter=\"search\" (change)=\"searchTableData()\"\r\n class=\"form-control form-control-solid w-200px ps-5 mx-1 me-4\" autocomplete=\"off\" \r\n autocapitalize=\"none\" \r\n spellcheck=\"false\" style=\"text-transform: none\" placeholder=\"Search...\"> \r\n </div>\r\n\r\n <div *ngIf=\"!['cluster','team'].includes(assignType)\" class=\"position-relative w-100 mt-5 mb-5\">\r\n <button type=\"button\"\r\n class=\"btn py-3 btn-default w-100 btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between\">\r\n <span class=\"me-3 cursor-pointer\" (click)=\"file.click()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> <span #upload class=\"template-dropdown ms-3 bg-white\">BulkUpload </span></span>\r\n <span class=\"subtitle mx-3 me-2\"> | </span>\r\n <span class=\"cursor-pointer\" (click)=\"openDropdown($event)\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n <span><input style=\"display: none;\" type=\"file\" #file\r\n id=\"kt_account_team_size_select_1\" (change)=\"onFileUpload($event)\" /></span>\r\n </button>\r\n\r\n <div *ngIf=\"dropDown\" class=\"card template-dropdown h-40px w-100 position-absolute rounded-3 z-1 top-50px end-0\">\r\n <ul class=\"list-unstyled mb-0 w-auto cursor-pointer\" (click)=\"bulkuploadModel()\">\r\n <li class=\"px-5 fw-semibold cursor-pointer py-2\">Download Template</li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"['cluster','team'].includes(assignType)\">\r\n <button type=\"button\"\r\n class=\"btn py-3 btn-default w-100 btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between\" (click)=\"downloadTemplateV2()\">\r\n <span class=\"me-3 cursor-pointer\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M8.125 13.125H16.3562L14.7438 14.7438L15.625 15.625L18.75 12.5L15.625 9.375L14.7438 10.2562L16.3562 11.875H8.125V13.125Z\" fill=\"black\"/>\r\n <path d=\"M13.75 8.75001V6.25001C13.7505 6.16776 13.7347 6.08622 13.7036 6.01007C13.6725 5.93392 13.6267 5.86466 13.5688 5.80626L9.19375 1.43126C9.13535 1.37333 9.06609 1.32751 8.98994 1.2964C8.91379 1.2653 8.83225 1.24953 8.75 1.25001H2.5C2.16848 1.25001 1.85054 1.38171 1.61612 1.61613C1.3817 1.85055 1.25 2.16849 1.25 2.50001V17.5C1.25 17.8315 1.3817 18.1495 1.61612 18.3839C1.85054 18.6183 2.16848 18.75 2.5 18.75H12.5C12.8315 18.75 13.1495 18.6183 13.3839 18.3839C13.6183 18.1495 13.75 17.8315 13.75 17.5V16.25H12.5V17.5H2.5V2.50001H7.5V6.25001C7.5 6.58153 7.6317 6.89947 7.86612 7.13389C8.10054 7.36831 8.41848 7.50001 8.75 7.50001H12.5V8.75001H13.75ZM8.75 6.25001V2.75626L12.2438 6.25001H8.75Z\" fill=\"black\"/>\r\n </svg> <span class=\"template-dropdown bg-white ms-3\">Export </span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(assignTableApiState | async) === 'loaded' && tableArray?.length\">\r\n <div class=\"col-lg-12\" *ngIf=\"searchInput.value && !assignTableData?.length\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-12\" *ngIf=\"!searchInput.value && !assignTableData?.length\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"assignTableData?.length\">\r\n <div class=\"table-responsive mt-5 mx-4\">\r\n <table *ngIf=\"storeCoverage\" class=\"w-100 table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('storeName')\">\r\n Store Name\r\n <span\r\n *ngIf=\"sortColumn === 'storeName' && sortBy !== 1 || sortColumn !== 'storeName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'storeName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userName')\">\r\n SPOC Name\r\n <span\r\n *ngIf=\"sortColumn === 'userName' && sortBy !== 1 || sortColumn !== 'userName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userEmail')\">\r\n SPOC Email\r\n <span\r\n *ngIf=\"sortColumn === 'userEmail' && sortBy !== 1 || sortColumn !== 'userEmail' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userEmail' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"assignType ==='cluster'\" class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('clusterName')\">\r\n Cluster Name\r\n <span\r\n *ngIf=\"sortColumn === 'clusterName' && sortBy !== 1 || sortColumn !== 'clusterName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'clusterName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of assignTableData;let i=index\">\r\n <td>{{data.storeName}}\r\n </td>\r\n <td>{{data.userName ? data.userName : '--'}}</td>\r\n <td>{{data.userEmail ? data.userEmail : '--'}}</td>\r\n <td *ngIf=\"assignType ==='cluster'\">{{data.clusterName ? data.clusterName : '--'}}</td>\r\n </tbody>\r\n </table>\r\n <table *ngIf=\"userCoverage\" class=\"w-100 table bottom-border text-nowrap\"> \r\n <thead>\r\n <tr>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userName')\">\r\n User Name\r\n <span\r\n *ngIf=\"sortColumn === 'userName' && sortBy !== 1 || sortColumn !== 'userName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('userEmail')\">\r\n User Email\r\n <span\r\n *ngIf=\"sortColumn === 'userEmail' && sortBy !== 1 || sortColumn !== 'userEmail' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'userEmail' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"assignType ==='team'\" class=\"text-align-left\">\r\n <div class=\"cursor-pointer\" (click)=\"sortData('teamName')\">\r\n Teams Name\r\n <span\r\n *ngIf=\"sortColumn === 'teamName' && sortBy !== 1 || sortColumn !== 'teamName' \">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 1.33337V10.6667M6.00016 10.6667L10.6668 6.00004M6.00016 10.6667L1.3335 6.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"sortColumn === 'teamName' && sortBy !== -1\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M6.00016 10.6667L6.00016 1.33337M6.00016 1.33337L1.3335 6.00004M6.00016 1.33337L10.6668 6.00004\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of assignTableData;let i=index\">\r\n <td>{{data.userName}}</td>\r\n <td>{{data.userEmail ? data.userEmail : '--'}}</td>\r\n <td *ngIf=\"assignType ==='team'\">{{data.teamName ? data.teamName : '--'}}</td>\r\n </tbody>\r\n </table>\r\n </div>\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"(assignTableApiState | async) === 'loading' || (assignTableApiState | async) === 'initial'\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container>\r\n <div>\r\n <ng-container\r\n *ngIf=\"(assignTableApiState | async) === 'loaded' && !tableArray?.length && this.taskDetails?.assign && !['cluster','team'].includes(assignType)\">\r\n <div class=\"row mb-6\">\r\n <div class=\"col-lg-12 assignpadding mb-10 mt-10\">\r\n <div class=\"row\">\r\n <div class=\"hr w-100 border border-1 position-relative\">\r\n <div class=\"position-absolute template-dropdown orposition bg-white w-100px\">or</div>\r\n </div>\r\n <div class=\"uploadpadding mt-10\">\r\n <ul class=\"subtext list-unstyled d-flex flex-column align-items-center mx-4\">\r\n <li>Use the template to upload multiple <span *ngIf=\"storeCoverage\">stores</span> <span *ngIf=\"userCoverage\">users</span> at once.</li> \r\n <li> Download the template here - <span (click)=\"downloadTemplateV2()\" class=\"cursor-pointer\"><span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span><span class=\"text-primary\">Download Template</span></span></li>\r\n <li> Add your data to the Template File</li>\r\n </ul>\r\n </div>\r\n <div class=\"w-100 border border-2 text-center border-dashed rounded-3 border-primary p-5\" (dragover)=\"onDragOver($event)\" \r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"file.click()\">\r\n <div class=\"\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\"/>\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\" stroke-width=\"6\"/>\r\n <g clip-path=\"url(#clip0_7979_5202)\">\r\n <path d=\"M26.3335 26.3332L23.0002 22.9999M23.0002 22.9999L19.6669 26.3332M23.0002 22.9999V30.4999M29.9919 28.3249C30.8047 27.8818 31.4467 27.1806 31.8168 26.3321C32.1868 25.4835 32.2637 24.5359 32.0354 23.6388C31.807 22.7417 31.2865 21.9462 30.5558 21.3778C29.8251 20.8094 28.9259 20.5005 28.0002 20.4999H26.9502C26.698 19.5243 26.2278 18.6185 25.5752 17.8507C24.9225 17.0829 24.1042 16.4731 23.182 16.0671C22.2597 15.661 21.2573 15.4694 20.2503 15.5065C19.2433 15.5436 18.2578 15.8085 17.3679 16.2813C16.4779 16.7541 15.7068 17.4225 15.1124 18.2362C14.518 19.05 14.1158 19.9879 13.936 20.9794C13.7563 21.9709 13.8036 22.9903 14.0746 23.961C14.3455 24.9316 14.8329 25.8281 15.5002 26.5832\" stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_7979_5202\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13 13)\"/>\r\n </clipPath>\r\n </defs>\r\n </svg></div>\r\n <div class=\"storetext cursor-pointer fw-bold\"><span class=\"text-primary text-decoration-underline\">Click To Upload</span> \r\n or drag and drop\r\n </div>\r\n <div class=\"headeralign fw-400\">the data added template file for processing.</div>\r\n <input style=\"visibility: hidden;\" type=\"file\" #file\r\n id=\"kt_account_team_size_select_1\" (change)=\"onFileUpload($event)\" />\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container>\r\n <div class=\"col-lg-12\" *ngIf=\"(assignTableApiState | async) === 'loaded' && !tableArray?.length && this.taskDetails?.assign && ['cluster','team'].includes(assignType)\">\r\n <div class=\"card-body my-8 d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for the {{assignType}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #bulkupload let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div> <span class=\"config-heading fw-semibold ms-5 w-auto\">Bulk Upload</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step 1 - <a class=\"text-decoration-underline cursor-pointer\" (click)=\"downloadTemplateV2()\">Download the template here</a></div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step2 - Add your data to the Template File with existing <span *ngIf=\"storeCoverage\">store</span> <span *ngIf=\"userCoverage\">user</span> data</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">Step3 - Upload it below for processing</div>\r\n\r\n <div class=\"fw-bold storeAssign mt-10\">**Note : On upload, all the existing data will be replaced</div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"model.close()\">Cancel</button>\r\n <button class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"file1.click()\">Upload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Assign <span *nfIf=\"storeCoverage\">Stores</span> <span *ngIf=\"userCoverage\">Users</span></span></div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total <span *nfIf=\"storeCoverage\">Stores</span> <span *ngIf=\"userCoverage\">Users</span></div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div *ngIf=\"!showStore&&!showTeam&&!showCluster&&!showUser&&!showInactive\">You're about to assign {{getStoreCounts(excelData)}} <span *ngIf=\"storeCoverage\">stores</span><span *ngIf=\"userCoverage\">users</span> to the checklist. Are you sure want to proceed?</div>\r\n <div *ngIf=\"storeCoverage && showStore\" class=\"mt-3\">Store <span *ngFor=\"let store of validatedStore;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/stores\" [queryParams]=\"{tyoe: 'stores'}\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Onboard Stores</a></div>\r\n <div *ngIf=\"userCoverage && showUser\" class=\"mt-3\">User <span *ngFor=\"let store of validatedUser;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup();confirmUserpopup()\">Onboard Users</a></div>\r\n <div *ngIf=\"userCoverage && showTeam\" class=\"mt-3\">Team <span *ngFor=\"let store of validatedTeam;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/users/client\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Create Team</a></div>\r\n <div *ngIf=\"storeCoverage && showCluster\" class=\"mt-3\">user <span *ngFor=\"let store of validatedCluster;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a routerLink=\"/manage/stores\" class=\"text-decoration-underline cursor-pointer\" [queryParams]=\"{tyoe: 'cluster'}\" (click)=\"closeactivepopup()\">Create Cluster</a></div>\r\n <div *ngIf=\"storeCoverage && showUser\" class=\"mt-3\">User <span *ngFor=\"let store of validatedUser;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for isn\u2019t available, <a class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup();confirmUserpopup()\">Onboard Users</a></div>\r\n <div *ngIf=\"storeCoverage && showInactive\" class=\"mt-3\">Store <span *ngFor=\"let store of inactiveStores;let last = last\" class=\"fw-semibold config-heading\">{{store}}<span *ngIf=\"!last\">,</span></span> that I\u2019m looking for is inactive, <a routerLink=\"/manage/stores\" [queryParams]=\"{tyoe: 'stores'}\" class=\"text-decoration-underline cursor-pointer\" (click)=\"closeactivepopup()\">Onboard Stores</a></div>\r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct and complete layout information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError&&!showStore&&!showCluster&&!showUser&&!showTeam&&!showInactive\" class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"validateDetails()\">Proceed</button>\r\n <button *ngIf=\"excelError||showStore||showCluster||showUser||showTeam || showInactive\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"Reupload();\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'reupload')\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #confirmUser let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title d-flex flex-column mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\"/><path d=\"M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z\" stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\"/></svg>\r\n </div><br>\r\n <div class=\"config-heading fw-semibold w-auto\">New User found in uploaded file</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">This CSV contains a new User. Add new User in the User Management under Manage menu.</div>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <!-- <button class=\"btn btn-md btn-default btn-outline\" routerLink=\"/manage/users/client\" (click)=\"closeactivepopup()\">Skip New Entries</button> -->\r\n <button class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"model.close('confirm')\">Invite Selected</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".c-card{padding:24px;background:#fff;border-radius:16px}.plain-input{border:none;outline:none;background:transparent;padding:0;margin:0;width:100%;overflow:hidden;color:var(--black, #101828);text-overflow:ellipsis;font-family:Inter;font-size:18px;font-style:normal;font-weight:500;line-height:28px}.plain-input:focus{border-radius:0!important;border:white!important;outline:none!important;box-shadow:none!important}.checklist-name{font-size:20px;font-weight:600;line-height:28px;text-align:left;color:#667085!important}.checklist-desc{font-size:14px;font-weight:400;line-height:18px;text-align:left}:host::ng-deep .date-picker .md-drppicker .btn{line-height:10px!important}:host::ng-deep .date-picker .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .date-picker .md-drppicker.drops-down-right.ltr.show-ranges.shown{top:65px!important}:host::ng-deep .date-picker .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;right:-475px!important;left:unset!important;height:400px!important}:host::ng-deep .date-picker .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .date-picker .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .date-picker .md-drppicker td.active,:host::ng-deep .date-picker .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .date-picker .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .date-picker .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .date-picker .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep .date-picker table th,:host::ng-deep .date-picker table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .date-picker .md-drppicker td.available.prev,:host::ng-deep .date-picker .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .date-picker .md-drppicker td.available.next,:host::ng-deep .date-picker .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .date-picker table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .date-picker .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .date-picker .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .date-picker .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.assignpadding{padding:0 40px}.uploadpadding{padding:0 20% 9px}.orposition{top:0;left:50%;transform:translate(-50%,-50%);text-align:center}.storetext{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px}.storeAssign{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.storeAssign a:hover{text-decoration:underline!important}.border-primary{border:1px dashed var(--Primary-500, #33B5FF)!important;background:var(--Primary-25, #F6FCFF)!important}.template-dropdown{background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.uploadtext{color:var(--gray-700, #344054);font-family:Inter;font-size:16px;font-style:normal;font-weight:600;line-height:24px;text-transform:capitalize}.subtext{color:var(--gray-500, #667085);font-family:Inter;font-size:14px;font-weight:400;line-height:20px;align-items:center;gap:8px;align-self:stretch}.selectstore{color:var(--primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.sub{color:var(--gray-700, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.subopen{color:var(--black, #101828);font-family:Inter;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.headeralign{color:var(--gray-500, #667085);font-family:Inter;font-size:12px;font-style:normal;font-weight:500;line-height:18px}.selected-radio{width:1.5rem!important;height:1.5rem!important}.subtitle{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0em;text-align:left;color:#667085}.form-control.form-control-solid{display:flex;padding:11px 14px;align-items:center;gap:8px;align-self:stretch;border-radius:8px;border:1px solid var(--gray-500, #D0D5DD);background:var(--white, #FFF);box-shadow:0 1px 2px #1018280d}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip .initials{color:var(--Primary-600, #00A3FF);font-size:12px;font-weight:500;line-height:18px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.toggle-card{padding:16px;display:flex;align-items:center;border-radius:8px;border:1px solid #EAECF0;background:#fff}.toggle-card .header{color:#344054;font-size:16px;font-weight:500;line-height:24px}.toggle-card .desc{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.toggle-card.selected{border:1px solid #6BCAFF}.toggle-card.selected .header{color:#008edf}.toggle-card.selected .desc{color:#00a3ff}.sub-txt{color:#667085;font-size:14px;font-weight:400;line-height:20px;gap:8px}.cstm-blu-btn{padding:8px 14px;border-radius:8px;border:1px solid #EAF8FF;background:#eaf8ff;box-shadow:0 1px 2px #1018280d;color:#009bf3;font-size:14px;font-weight:600;line-height:20px;cursor:pointer;display:flex;align-items:center}.schedule-text{color:#344054;font-size:16px;font-weight:500;line-height:24px}input[type=checkbox].c-checkbox{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox].c-checkbox:checked{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox].c-checkbox:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.reminder-header{color:#101828;font-size:20px;font-weight:600;line-height:30px}.reminder-description{color:#344054;font-size:14px;font-weight:500;line-height:20px}.reminder-sub{color:#101828;font-size:16px;font-weight:500;line-height:24px}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:600;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.nav{display:flex;align-items:center;gap:16px;flex:1 0 0;align-self:stretch;--bs-nav-link-color: none}.nav-item .nav-link{color:var(--Gray-500, #667085);font-size:16px;font-weight:500}.nav-item .nav-link:hover{border-bottom:none!important}.nav-item .nav-link.active{border-radius:10px!important;border-bottom:none!important}.nav-item .bg-light-primary{background:var(--Primary-50, #EAF8FF)!important}\n"] }]
|
|
1516
|
-
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.PageInfoService }, { type: i3.TraxService }, { type: i4.NgbModal }, { type: i5.ToastService }, { type: i1.Router }, { type: i0.ChangeDetectorRef }, { type: i6.FormBuilder }], propDecorators: { fileInput: [{
|
|
1517
|
-
type: ViewChild,
|
|
1518
|
-
args: ['file']
|
|
1519
|
-
}], fileInput1: [{
|
|
1520
|
-
type: ViewChild,
|
|
1521
|
-
args: ['file1']
|
|
1522
|
-
}], bulkupload: [{
|
|
1523
|
-
type: ViewChild,
|
|
1524
|
-
args: ['bulkupload']
|
|
1525
|
-
}], afterValidation: [{
|
|
1526
|
-
type: ViewChild,
|
|
1527
|
-
args: ['afterValidation']
|
|
1528
|
-
}], confirmUser: [{
|
|
1529
|
-
type: ViewChild,
|
|
1530
|
-
args: ['confirmUser']
|
|
1531
|
-
}] } });
|
|
1532
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1jb25maWd1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYW5hbHlzZS10cmF4L3NyYy9saWIvY29tcG9uZW50cy90YXNrLWNvbmZpZ3VyZS90YXNrLWNvbmZpZ3VyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stY29uZmlndXJlL3Rhc2stY29uZmlndXJlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLFNBQVMsRUFBaUMsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9GLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztBQUtuQyxPQUFPLEVBQTBCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFIdEUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQU1sQixLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFNaEMsTUFBTSxPQUFPLHNCQUFzQjtJQWdEYjtJQUErQjtJQUN6QztJQUFrQztJQUEwQjtJQUFvQztJQUF3QjtJQUErQjtJQWhEakss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R0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1lBRXRELHFDQUFxQztZQUNyQyxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3hDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLGdCQUFnQixDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBRTVDLG9DQUFvQztZQUNwQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNyRDtJQUNILENBQUM7d0dBdGlEVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixnaEJDekJuQywycmlFQWd1QmM7OzRGRHZzQkQsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQjs0UUEwQ1gsU0FBUztzQkFBM0IsU0FBUzt1QkFBQyxNQUFNO2dCQUNHLFVBQVU7c0JBQTdCLFNBQVM7dUJBQUMsT0FBTztnQkFDTyxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ08sZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ0YsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgY3VzdG9tUGFyc2VGb3JtYXQgZnJvbSAnZGF5anMvcGx1Z2luL2N1c3RvbVBhcnNlRm9ybWF0JztcclxuaW1wb3J0IHsgVGltZVBlcmlvZCB9IGZyb20gJ25neC1kYXRlcmFuZ2VwaWNrZXItbWF0ZXJpYWwvZGF0ZXJhbmdlcGlja2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSwgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IEhlYWRlckZpbHRlciwgSVRhc2ssIFVzZXJBc3NpZ25EZXRhaWxzIH0gZnJvbSAnLi90YXNrLWNvbmZpZ3VyZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgVHJheFN0b3JlQ29tcG9uZW50IH0gZnJvbSAnLi4vdHJheC1zdG9yZS90cmF4LXN0b3JlLmNvbXBvbmVudCc7XHJcbmRheWpzLmV4dGVuZCh1dGMpO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgVHJheHBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vdHJheHBvcHVwL3RyYXhwb3B1cC5jb21wb25lbnQnO1xyXG5cclxuXHJcbmRheWpzLmV4dGVuZChjdXN0b21QYXJzZUZvcm1hdCk7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRhc2stY29uZmlndXJlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFzay1jb25maWd1cmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90YXNrLWNvbmZpZ3VyZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhc2tDb25maWd1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIGRheWpzID0gZGF5anNcclxuICBzY2hlZHVsZURhdGU6IGFueTtcclxuICBtaW5EYXRlOiBhbnkgPSB0aGlzLmRheWpzKCkuZm9ybWF0KCk7XHJcbiAgc2NoZWR1bGVFbmRUaW1lID0gbmV3IEZvcm1Db250cm9sKHRoaXMuZ2V0Q3VycmVudFRpbWUoKSlcclxuICBjdXJyZW50VGFza0lkOiBzdHJpbmdcclxuICBoZWFkZXJEYXRhOiBIZWFkZXJGaWx0ZXJcclxuICB0YXNrRGV0YWlsczogSVRhc2tcclxuICBhcHByb3ZlciA9IG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgcHJpb3JpdHlUeXBlID0gbmV3IEZvcm1Db250cm9sKCdoaWdoJylcclxuICBhbGxvd2VkU3RvcmVMb2NhdGlvbiA9IG5ldyBGb3JtQ29udHJvbChmYWxzZSlcclxuICByZXN0cmljdEF0dGVuZGFuY2UgPSBuZXcgRm9ybUNvbnRyb2woZmFsc2UpXHJcbiAgYXBwcm92ZXJzTGlzdDogeyBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfVtdXHJcbiAgYXNzaWduVGFibGVBcGlTdGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8J2luaXRpYWwnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCc+KCdsb2FkaW5nJylcclxuICBhc3NpZ25UYWJsZURhdGE6IFVzZXJBc3NpZ25EZXRhaWxzW10gfCBudWxsIHwgdW5kZWZpbmVkXHJcbiAgaXRlbXNQZXJQYWdlID0gNVxyXG4gIGN1cnJlbnRQYWdlID0gMVxyXG4gIHRvdGFsSXRlbXMgPSAwXHJcbiAgY29uZmlnRGF0YTogYW55O1xyXG4gIHN0b3JlQ292ZXJhZ2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHVzZXJDb3ZlcmFnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHJldXBsb2FkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdXNlckRhdGE6IGFueSA9IFtdO1xyXG4gIGxpc3RvZklkOiBhbnk7XHJcbiAgZXhjZWxVc2VyRGF0YTogYW55ID0gW107XHJcbiAgYXNzaWduVHlwZTogYW55O1xyXG4gIGluaXRpYWxMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBhc3NpZ25TaW5nbGU6IGFueTsgYXNzaWduR3JvdXA6IGFueTtcclxuICBzaW5nbGVBc3NpZ246IGFueTtcclxuICBncm91cEFzc2lnbjphbnk7XHJcbiAgcGFnaW5hdGlvblNpemVzID0gWzUsIDEwLCAyMCwgMzBdXHJcbiAgcGFnZVNpemUgPSA1XHJcbiAgc2VhcmNoSW5wdXQgPSBuZXcgRm9ybUNvbnRyb2woJycpXHJcbiAgc2VsZWN0QWxsSW5wdXQgPSBuZXcgRm9ybUNvbnRyb2woZmFsc2UpXHJcbiAgcmVtb3ZlZFVzZXJzID0gbmV3IFNldCgpXHJcbiAgYWRkZWQgPSBbXVxyXG4gIHJlbW92ZWQgPSBbXVxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGUnKSBmaWxlSW5wdXQhOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGUxJykgZmlsZUlucHV0MSE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYnVsa3VwbG9hZCcpIGJ1bGt1cGxvYWQ6IGFueTtcclxuICBAVmlld0NoaWxkKCdhZnRlclZhbGlkYXRpb24nKSBhZnRlclZhbGlkYXRpb246IGFueTtcclxuICBAVmlld0NoaWxkKCdjb25maXJtVXNlcicpIGNvbmZpcm1Vc2VyOiBhbnk7XHJcblxyXG4gIHJlbWluZGVyUmVwZWF0U2NoZWR1bGVzOiBGb3JtQXJyYXk7XHJcbiAgcmVtaW5kZXJSZXBlYXRTY2hlZHVsZU9wdGlvbnMgPSBbMzAsIDQ1LCA2MCwgNzUsIDkwXVxyXG4gIFxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmF4U2VydmljZTogVHJheFNlcnZpY2UsIHByaXZhdGUgZGlhbG9nOiBOZ2JNb2RhbCwgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICB0aGlzLmhlYWRlckRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIGFzIHN0cmluZylcclxuXHJcbiAgICB0aGlzLnNlYXJjaElucHV0LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkucGlwZShkZWJvdW5jZVRpbWUoMTAwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgodmFsKSA9PiB7XHJcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLnNlbGVjdEFsbElucHV0LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2YWwpID0+IHtcclxuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlRGF0YT8uZm9yRWFjaCh2YWwgPT4gdmFsLmNoZWNrRmxhZyA9IHRydWUpXHJcbiAgICAgICAgdGhpcy5yZW1vdmVkVXNlcnMuY2xlYXIoKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYXNzaWduVGFibGVEYXRhPy5mb3JFYWNoKHZhbCA9PiB7IHZhbC5jaGVja0ZsYWcgPSBmYWxzZSwgdGhpcy5vblVzZXJBc3NpZ25DaGFuZ2UodmFsLmNoZWNrRmxhZywgdmFsLmlkKSB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMgPSB0aGlzLmZiLmFycmF5KFtdKVxyXG5cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNjaGVkdWxlRGF0ZSA9IHsgc3RhcnREYXRlOiB0aGlzLmRheWpzKCkuZm9ybWF0KCdERC1NTS1ZWVlZJyksIGVuZERhdGU6IHRoaXMuZGF5anMoKS5mb3JtYXQoJ0RELU1NLVlZWVknKSB9O1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpXHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcmFtcz8udGFza0lkKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRUYXNrSWQgPSBwYXJhbXMudGFza0lkXHJcbiAgICAgICAgICB0aGlzLmdldFRhc2sodGhpcy5jdXJyZW50VGFza0lkKVxyXG4gICAgICAgICAgdGhpcy5nZXRDbGllbnRVc2VyKCk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdEluaXRpYWxUYWIoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiVGFza3NcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldERlc2NyaXB0aW9uKFwiXCIpO1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRCcmVhZGNydW1icyhbXHJcbiAgICAgIHsgdGl0bGU6IFwiVGFuZ28gVHJheFwiLCBwYXRoOiBcIi9tYW5hZ2UvdHJheC9kYXNoYm9hcmRcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogXCJUYW5nbyBUcmF4XCIsIHBhdGg6IFwiL21hbmFnZS90cmF4L2Rhc2hib2FyZFwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH1cclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGFzayhpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmdldFRhc2tjb25maWcoaWQsIHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50ISkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5jb25maWdEYXRhID0gcmVzPy5kYXRhO1xyXG4gICAgICAgICAgdGhpcy50YXNrRGV0YWlscyA9IHJlcy5kYXRhLmNoZWNrTGlzdERldGFpbHNcclxuICAgICAgICAgIHRoaXMudGFza0RldGFpbHMuYXNzaWduID0gW107XHJcbiAgICAgICAgICAvLyB0aGlzLmlkTGlzdCA9IHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmFzc2lnbmVkdXNlcnM7XHJcbiAgICAgICAgICAvLyB0aGlzLmxpc3RvZklkID0gdGhpcy5jb25maWdEYXRhLmNoZWNrTGlzdERldGFpbHMuYXNzaWduZWR1c2VycztcclxuICAgICAgICAgIHRoaXMuY292ZXJhZ2UgPSB0aGlzLmNvbmZpZ0RhdGEuY2hlY2tMaXN0RGV0YWlscy5jb3ZlcmFnZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0UmFkaW8odGhpcy5jb3ZlcmFnZSlcclxuICAgICAgICAgIGlmICh0aGlzLnRhc2tEZXRhaWxzPy5zY2hlZHVsZURhdGUpIHtcclxuICAgICAgICAgICAgaWYgKGRheWpzKHRoaXMudGFza0RldGFpbHMuc2NoZWR1bGVEYXRlKS5pc0JlZm9yZShkYXlqcygpKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubWluRGF0ZSA9IHRoaXMuZGF5anModGhpcy50YXNrRGV0YWlscy5zY2hlZHVsZURhdGUpLmZvcm1hdCgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZURhdGUgPSB7IHN0YXJ0RGF0ZTogdGhpcy5kYXlqcyh0aGlzLnRhc2tEZXRhaWxzLnNjaGVkdWxlRGF0ZSkudXRjKCkuZm9ybWF0KCdERC1NTS1ZWVlZJyksIGVuZERhdGU6IHRoaXMuZGF5anModGhpcy50YXNrRGV0YWlscy5zY2hlZHVsZURhdGUpLnV0YygpLmZvcm1hdCgnREQtTU0tWVlZWScpIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXRoaXMudGFza0RldGFpbHM/LnJlbW92ZWRVc2Vycz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsSW5wdXQuc2V0VmFsdWUodHJ1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy50YXNrRGV0YWlscz8uc2NoZWR1bGVFbmRUaW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVFbmRUaW1lLnNldFZhbHVlKGRheWpzKHRoaXMudGFza0RldGFpbHM/LnNjaGVkdWxlRW5kVGltZSwgJ2hoOm1tIEEnKS5mb3JtYXQoJ0hIOm1tJykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMudGFza0RldGFpbHM/LmFwcHJvdmVyPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5hcHByb3Zlci5zZXRWYWx1ZSh0aGlzLnRhc2tEZXRhaWxzPy5hcHByb3ZlcilcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50YXNrRGV0YWlscz8ucHJpb3JpdHlUeXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJpb3JpdHlUeXBlLnNldFZhbHVlKHRoaXMudGFza0RldGFpbHM/LnByaW9yaXR5VHlwZSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50YXNrRGV0YWlscz8uYWxsb3dlZFN0b3JlTG9jYXRpb24gPT09IHRydWUgfHwgdGhpcy50YXNrRGV0YWlscz8uYWxsb3dlZFN0b3JlTG9jYXRpb24gPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWxsb3dlZFN0b3JlTG9jYXRpb24uc2V0VmFsdWUodGhpcy50YXNrRGV0YWlscz8uYWxsb3dlZFN0b3JlTG9jYXRpb24pXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMudGFza0RldGFpbHM/LnJlc3RyaWN0QXR0ZW5kYW5jZSA9PT0gdHJ1ZSB8fCB0aGlzLnRhc2tEZXRhaWxzPy5yZXN0cmljdEF0dGVuZGFuY2UgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdHJpY3RBdHRlbmRhbmNlLnNldFZhbHVlKHRoaXMudGFza0RldGFpbHM/LnJlc3RyaWN0QXR0ZW5kYW5jZSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50YXNrRGV0YWlscz8ucmVtYWluZGVyPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5jbGVhcigpXHJcbiAgICAgICAgICAgIHRoaXMudGFza0RldGFpbHM/LnJlbWFpbmRlci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5wdXNoKHRoaXMuZmIuY29udHJvbChpdGVtKSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRUYWIodmFsdWU6YW55KSB7XHJcbiAgICB0aGlzLnRhYmxlQXJyYXkgPSBbXTtcclxuICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gW107XHJcbiAgICB0aGlzLmFzc2lnblR5cGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICB0aGlzLnNlYXJjaElucHV0LnNldFZhbHVlKCcnKTtcclxuICAgIHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmFzc2lnbiA9IFtdO1xyXG4gICAgdGhpcy5nZXRhc3NpZ25Ecm9wZG93bigpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0SW5pdGlhbFRhYigpIHtcclxuICAgIHRoaXMuc3RvcmVDb3ZlcmFnZSA/IHRoaXMuYXNzaWduVHlwZSA9ICdzdG9yZScgOiB0aGlzLmFzc2lnblR5cGUgPSAndXNlcidcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRUaW1lKCk6IHN0cmluZyB7XHJcbiAgICAvLyBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgLy8gY29uc3QgaG91cnMgPSBub3cuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyBjb25zdCBtaW51dGVzID0gbm93LmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyByZXR1cm4gYCR7aG91cnN9OiR7bWludXRlc31gO1xyXG4gICAgcmV0dXJuICcyMzo1OSc7XHJcbiAgfVxyXG5cclxuICBnZXQgZHVlRGF0ZUZvcm1hdHRlZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF5anModGhpcy5zY2hlZHVsZURhdGUuc3RhcnREYXRlLCAnREQtTU0tWVlZWScpPy5mb3JtYXQoJ0REIE1NTSBZWVlZJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgZHVlVGltZUZvcm1hdHRlZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGRheWpzKHRoaXMuc2NoZWR1bGVFbmRUaW1lLnZhbHVlLCAnSEg6bW0nKS5mb3JtYXQoJ2g6bW0gQScpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xpZW50VXNlcigpIHtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuZ2V0Q2xpZW50VXNlcih0aGlzLmhlYWRlckRhdGEuY2xpZW50KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCAmJiByZXMuZGF0YS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmFwcHJvdmVyc0xpc3QgPSByZXMuZGF0YS5tYXAoKGl0ZW06IGFueSkgPT4geyByZXR1cm4geyBuYW1lOiBpdGVtLnVzZXJOYW1lLCB2YWx1ZTogaXRlbS5lbWFpbCwgcm9sZTogaXRlbS5yb2xlIH0gfSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tEZXRhaWxzPy5hcHByb3Zlcj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBsZXQgdXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcclxuICAgICAgICAgIGlmICh1c2VySW5mbz8udXNlclR5cGUgPT0gJ3RhbmdvJyB8fCAodXNlckluZm8/LnVzZXJUeXBlID09ICdjbGllbnQnICYmIHVzZXJJbmZvPy5yb2xlID09ICd1c2VyJykpIHtcclxuICAgICAgICAgICAgbGV0IHVzZXJMaXN0ID0gdGhpcy5hcHByb3ZlcnNMaXN0LmZpbmQoKGVsZTogYW55KSA9PiBlbGUucm9sZSA9PSAnc3VwZXJhZG1pbicpO1xyXG4gICAgICAgICAgICBpZiAodXNlckxpc3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFwcHJvdmVyLnNldFZhbHVlKFt7IG5hbWU6IHVzZXJMaXN0Lm5hbWUsIHZhbHVlOiB1c2VyTGlzdC52YWx1ZSB9XSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwcm92ZXIuc2V0VmFsdWUoW3RoaXMuYXBwcm92ZXJzTGlzdC5maW5kKChlbGU6IGFueSkgPT4gZWxlLnZhbHVlID09IHVzZXJJbmZvLmVtYWlsKV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYXBwcm92ZXJzTGlzdCA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KGFjdGlvbjogJ3NhdmUnIHwgJ3B1Ymxpc2gnKSB7XHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIHNjaGVkdWxlRGF0ZTogdGhpcy5kYXlqcyh0aGlzLnNjaGVkdWxlRGF0ZS5zdGFydERhdGUsICdERC1NTS1ZWVlZJykuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIHNjaGVkdWxlRW5kVGltZTogdGhpcy5kYXlqcyh0aGlzLnNjaGVkdWxlRW5kVGltZS52YWx1ZSwgJ0hIOm1tJykuZm9ybWF0KCdoaDptbSBBJyksXHJcbiAgICAgIGFwcHJvdmVyOiB0aGlzLmFwcHJvdmVyLnZhbHVlID8/IFtdLFxyXG4gICAgICBwcmlvcml0eVR5cGU6IHRoaXMucHJpb3JpdHlUeXBlLnZhbHVlLFxyXG4gICAgICBhbGxvd2VkU3RvcmVMb2NhdGlvbjogdGhpcy5hbGxvd2VkU3RvcmVMb2NhdGlvbi52YWx1ZSxcclxuICAgICAgcmVzdHJpY3RBdHRlbmRhbmNlOiB0aGlzLnJlc3RyaWN0QXR0ZW5kYW5jZS52YWx1ZSxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICBzdWJtaXRUeXBlOiBhY3Rpb24sXHJcbiAgICAgIF9pZDogdGhpcy50YXNrRGV0YWlscz8uX2lkLFxyXG4gICAgICByZW1vdmVkVXNlcnM6IFsuLi50aGlzLnJlbW92ZWRVc2Vyc10sXHJcbiAgICAgIHJlbWFpbmRlcjogdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcz8udmFsdWUgfHwgW10sXHJcbiAgICAgIC4uLihhY3Rpb24gPT09ICdwdWJsaXNoJykgPyB7IHB1Ymxpc2g6IHRydWUgfSA6IHsgcHVibGlzaDogZmFsc2UgfSxcclxuICAgICAgYXNzaWduZWRVc2VyczogWy4uLnRoaXMuc2luZ2xlQXNzaWduLCAuLi50aGlzLmdyb3VwQXNzaWduXSxcclxuICAgICAgc3RvcmVDb3VudCA6IHRoaXMuYXNzaWduU2luZ2xlPy5sZW5ndGggKyB0aGlzLmdyb3VwQXNzaWduPy5sZW5ndGgsXHJcbiAgICAgIGNvdmVyYWdlOiB0aGlzLmNvdmVyYWdlLFxyXG4gICAgICBhZGRlZDp0aGlzLmFkZGVkLFxyXG4gICAgICByZW1vdmVkOnRoaXMucmVtb3ZlZFxyXG4gICAgfVxyXG4gICAgaWYgKGFjdGlvbiA9PT0gJ3B1Ymxpc2gnKSB7XHJcbiAgICAgIGxldCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gICAgICAgIGltYWdlc3JjOiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0QxRkFERlwiLz48cGF0aCBkPVwiTTM4IDI3LjA4MThWMjguMDAxOEMzNy45OTg4IDMwLjE1ODIgMzcuMzAwNSAzMi4yNTY1IDM2LjAwOTMgMzMuOTgzNkMzNC43MTgyIDM1LjcxMDggMzIuOTAzMyAzNi45NzQzIDMwLjgzNTQgMzcuNTg1N0MyOC43Njc0IDM4LjE5NzEgMjYuNTU3MyAzOC4xMjM3IDI0LjUzNDUgMzcuMzc2NEMyMi41MTE3IDM2LjYyOTEgMjAuNzg0NyAzNS4yNDc5IDE5LjYxMSAzMy40Mzg5QzE4LjQzNzMgMzEuNjI5OSAxNy44Nzk4IDI5LjQ4OTkgMTguMDIxNyAyNy4zMzgxQzE4LjE2MzYgMjUuMTg2NCAxOC45OTcyIDIzLjEzODEgMjAuMzk4MyAyMS40OTg5QzIxLjc5OTQgMTkuODU5NiAyMy42OTI4IDE4LjcxNzIgMjUuNzk2MiAxOC4yNDJDMjcuODk5NiAxNy43NjY3IDMwLjEwMDMgMTcuOTg0MiAzMi4wNyAxOC44NjE4TTM4IDIwLjAwMThMMjggMzAuMDExOEwyNSAyNy4wMTE4XCIgc3Ryb2tlPVwiIzAzOTg1NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRUNGREYzXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgIHRpdGxlOiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHB1Ymxpc2ggJHt0aGlzLnRhc2tEZXRhaWxzPy5jaGVja0xpc3ROYW1lfSB0YXNrP2AsXHJcbiAgICAgICAgY29udGVudDogYFB1Ymxpc2hpbmcgd2lsbCBtYWtlIHRoaXMgdGFzayBsaXZlLCBhbmQgY2hhbmdlcyB3aWxsIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5LmAsXHJcbiAgICAgICAgYnV0dG9udHlwZTogJ2NvbmZpcm0nXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUcmF4cG9wdXBDb21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcgfSk7XHJcbiAgICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kYXRhID0gcG9wdXBjb250ZW50O1xyXG4gICAgICBkaWFsb2dSZWYucmVzdWx0LnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgPT0gJ2NvbmZpcm0nKSB7XHJcbiAgICAgICAgICB0aGlzLnRyYXhTZXJ2aWNlLmNvbmZpZ1Rhc2socGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChyZXM/LmRhdGE/Lm1lc3NhZ2UgfHwgJ0NvbmZpZ3VyYXRpb24gdXBkYXRlZCBzdWNjZXNzZnVsbHknKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ21hbmFnZS90cmF4L2NoZWNrbGlzdC9tYW5hZ2V0YXNrJ10pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCAnU29tZXRoaW5nIHdlbnQgd3JvbmcnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJykge1xyXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFRyYXhwb3B1cENvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJyB9KTtcclxuICAgICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRhdGEgPSB7XHJcbiAgICAgICAgaW1hZ2VzcmM6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIj48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjRkVGMEM3XCIvPjxwYXRoIGQ9XCJNMjcuOTk5OCAyNC4wMDEyVjI4LjAwMTJNMjcuOTk5OCAzMi4wMDEySDI4LjAwOThNMjYuMjg5OCAxOC44NjEyTDE3LjgxOTggMzMuMDAxMkMxNy42NDUxIDMzLjMwMzYgMTcuNTUyNyAzMy42NDY1IDE3LjU1MTggMzMuOTk1N0MxNy41NTA4IDM0LjM0NDkgMTcuNjQxMyAzNC42ODgzIDE3LjgxNDIgMzQuOTkxN0MxNy45ODcxIDM1LjI5NTEgMTguMjM2NSAzNS41NDc5IDE4LjUzNzUgMzUuNzI1QzE4LjgzODUgMzUuOTAyMSAxOS4xODA2IDM1Ljk5NzMgMTkuNTI5OCAzNi4wMDEySDM2LjQ2OThDMzYuODE5IDM1Ljk5NzMgMzcuMTYxMSAzNS45MDIxIDM3LjQ2MjEgMzUuNzI1QzM3Ljc2MzEgMzUuNTQ3OSAzOC4wMTI0IDM1LjI5NTEgMzguMTg1NCAzNC45OTE3QzM4LjM1ODMgMzQuNjg4MyAzOC40NDg4IDM0LjM0NDkgMzguNDQ3OCAzMy45OTU3QzM4LjQ0NjggMzMuNjQ2NSAzOC4zNTQ0IDMzLjMwMzYgMzguMTc5OCAzMy4wMDEyTDI5LjcwOTggMTguODYxMkMyOS41MzE1IDE4LjU2NzMgMjkuMjgwNSAxOC4zMjQzIDI4Ljk4MSAxOC4xNTU3QzI4LjY4MTQgMTcuOTg3IDI4LjM0MzUgMTcuODk4NCAyNy45OTk4IDE3Ljg5ODRDMjcuNjU2IDE3Ljg5ODQgMjcuMzE4MSAxNy45ODcgMjcuMDE4NiAxOC4xNTU3QzI2LjcxOTEgMTguMzI0MyAyNi40NjggMTguNTY3MyAyNi4yODk4IDE4Ljg2MTJaXCIgc3Ryb2tlPVwiI0RDNjgwM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRkZGQUVCXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgIHRpdGxlOiBgVW5zYXZlZCBjaGFuZ2VzYCxcclxuICAgICAgICBjb250ZW50OiBgRG8geW91IHdhbnQgdG8gc2F2ZSBhcyBkcmFmdD9gLFxyXG4gICAgICAgIGJ1dHRvbnR5cGU6ICdkcmFmdCdcclxuICAgICAgfVxyXG4gICAgICBkaWFsb2dSZWYucmVzdWx0LnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgPT09ICdjb25maXJtJykge1xyXG4gICAgICAgICAgdGhpcy50cmF4U2VydmljZS5jb25maWdUYXNrKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QocmVzPy5kYXRhPy5tZXNzYWdlIHx8ICdDb25maWd1cmF0aW9uIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5JylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvdHJheC9jaGVja2xpc3QvbWFuYWdldGFzayddKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBkZXRhc3NpZ25VcGRhdGUoYWN0aW9uOiAnc2F2ZScgfCAncHVibGlzaCcpIHtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgXCJ0YXNrSWRcIjogdGhpcy5jdXJyZW50VGFza0lkLFxyXG4gICAgICAgIFwiYXNzaWduZWRMaXN0XCI6IHRoaXMuYXNzaWduU2luZ2xlIHx8IFtdLFxyXG4gICAgICAgIFwiYXNzaWduZWRHcm91cFwiOiB0aGlzLmFzc2lnbkdyb3VwIHx8IFtdLFxyXG4gICAgICAgIFwiY2xpZW50SWRcIjogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgICAgXCJjb3ZlcmFnZVwiOiB0aGlzLmNvdmVyYWdlXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50cmF4U2VydmljZS5hc3NpZ250YXNrVXBkYXRlKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OihyZXM6YW55KT0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMuYWRkZWQgPSByZXM/LmRhdGE/LmFkZGVkO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVkID0gcmVzPy5kYXRhPy5yZW1vdmVkO1xyXG4gICAgICAgICAgICAgdGhpcy5vblN1Ym1pdChhY3Rpb24pXHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOihlcnI6YW55KT0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG4gIG9uQXBwcm92ZUFkZGVkKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuYXBwcm92ZXIuc2V0VmFsdWUoZXZlbnQpXHJcbiAgfVxyXG5cclxuICBpZExpc3Q6IGFueSA9IFtdO1xyXG5cclxuICBnZXRJbml0aWFsRGF0YShkYXRhOiBhbnksY2hhbmdlPzogYW55KSB7XHJcbiAgICBsZXQgdGVtcElkID0gZGF0YS5tYXAoKGVsOmFueSkgPT4gZWw/LmlkKVxyXG4gICAgbGV0IHJlcyA9IHRoaXMuc3RvcmVMaXN0LmZpbHRlcigoZWw6IGFueSkgPT4gdGVtcElkLmluY2x1ZGVzKGVsPy5faWQpKTtcclxuICAgIHJlcy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQuaXNTZWxlY3RlZCA9IHRydWUpO1xyXG4gICAgdGhpcy50YXNrRGV0YWlscy5hc3NpZ24gPSByZXM7XHJcbiAgICBpZiAodGhpcy5hc3NpZ25UeXBlID09PSAnc3RvcmUnIHx8IHRoaXMuYXNzaWduVHlwZSA9PT0gJ3VzZXInKSB7XHJcbiAgICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAvLyB0aGlzLnVzZXJEZXRhaWxzKCksIFxyXG4gICAgICAvLyAodGhpcy5hc3NpZ25UeXBlID09PSAnc3RvcmUnICYmIHRoaXMuaW5pdGlhbExvYWRpbmcpID8gKHRoaXMuaW5pdGlhbExvYWRpbmcgPSBmYWxzZSkgOiB0aGlzLmdldFRhYmxlRGF0YShjaGFuZ2UgPyBjaGFuZ2UgOiAnJyk7XHJcbiAgICAgIHRoaXMuaWRMaXN0ID0gdGhpcy5zaW5nbGVBc3NpZ247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlkTGlzdCA9IHRoaXMuZ3JvdXBBc3NpZ247XHJcbiAgICAgIHRoaXMudXNlckRldGFpbHNWMigpXHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGdldFRhYmxlRGF0YShjaGFuZ2U/OiBhbnkpIHtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBpZiAodGhpcy5hc3NpZ25TaW5nbGU/Lmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy50YXNrRGV0YWlscy5hc3NpZ24ubGVuZ3RoICE9IHRoaXMuYXNzaWduU2luZ2xlLmxlbmd0aCkge1xyXG4gICAgICAgIGNvdW50Kys7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50YXNrRGV0YWlscy5hc3NpZ24uZm9yRWFjaCgoYXNzaWduOmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBmaW5kTGlzdCA9IHRoaXMuYXNzaWduU2luZ2xlLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnN0b3JlSWQgPT0gYXNzaWduLnN0b3JlSWQpO1xyXG4gICAgICAgIGlmIChmaW5kTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgIGlmIChmaW5kTGlzdC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFzc2lnbi51c2VyRW1haWwudG9Mb3dlckNhc2UoKSAhPSBmaW5kTGlzdFswXS51c2VyRW1haWwudG9Mb3dlckNhc2UoKSAmJiB0aGlzLmNvdmVyYWdlID09PSAnc3RvcmUnKSB7XHJcbiAgICAgICAgICAgICAgYXNzaWduLnVzZXJFbWFpbCA9IGZpbmRMaXN0WzBdLnVzZXJFbWFpbDtcclxuICAgICAgICAgICAgICBhc3NpZ24udXNlck5hbWUgPSBmaW5kTGlzdFswXS51c2VyTmFtZTtcclxuICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgaWYgKGNvdW50KSB7XHJcbiAgICAgICAgdGhpcy51cGxvYWQgPSBjaGFuZ2UgPyAndXBsb2FkJyA6ICdzdG9yZSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoaXMudGFibGVBcnJheSA9IHRoaXMuYXNzaWduU2luZ2xlID8gdGhpcy5hc3NpZ25TaW5nbGUgOiB0aGlzLnRhc2tEZXRhaWxzLmFzc2lnbjtcclxuICAgIFxyXG4gICAgY2hhbmdlID8gdGhpcy50YWJsZUFycmF5ID0gdGhpcy5hc3NpZ25TaW5nbGUgOiBbXTtcclxuXHJcbiAgICBpZiAodGhpcy51cGxvYWQgPT09ICdzdG9yZScpIHtcclxuICAgICAgbGV0IHRhYmxlID0gWy4uLnRoaXMudGFibGVBcnJheSwgLi4udGhpcy50YXNrRGV0YWlscy5hc3NpZ25dO1xyXG4gICAgICBcclxuICAgICAgbGV0IHVuaXF1ZVRhYmxlID0gbmV3IE1hcCgpO1xyXG4gICAgICBcclxuICAgICAgLy8gQ29udmVydCBvYmplY3RzIHRvIEpTT04gc3RyaW5ncyBmb3IgZnVsbCBjb21wYXJpc29uXHJcbiAgICAgIHRhYmxlLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGl0ZW0gPSB7XHJcbiAgICAgICAgICBzdG9yZU5hbWU6IGl0ZW0/LnN0b3JlTmFtZSxcclxuICAgICAgICAgIHN0b3JlSWQ6IGl0ZW0uc3RvcmVJZCxcclxuICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgIHVzZXJOYW1lOiBpdGVtLnVzZXJOYW1lLFxyXG4gICAgICAgICAgX2lkOml0ZW0uX2lkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgX2lkOiBpdGVtLl9pZCxcclxuICAgICAgICAgIC4uLih0aGlzLnN0b3JlQ292ZXJhZ2UpPyB7IHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwudG9Mb3dlckNhc2UoKSAsc3RvcmVOYW1lOiBpdGVtPy5zdG9yZU5hbWV9Ont9LFxyXG4gICAgICAgIH0gXHJcbiAgICAgICAgbGV0IGtleSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOyAvLyBDb252ZXJ0IGVudGlyZSBvYmplY3QgdG8gc3RyaW5nIGFzIGEga2V5XHJcbiAgICAgICAgaWYgKCF1bmlxdWVUYWJsZS5oYXMoZGF0YSkpIHtcclxuICAgICAgICAgIHVuaXF1ZVRhYmxlLnNldChrZXksIGl0ZW0pOyAvLyBTdG9yZSB0aGUgb2JqZWN0IG9ubHkgaWYgaXQncyBjb21wbGV0ZWx5IHVuaXF1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuYXNzaWduU2luZ2xlID0gQXJyYXkuZnJvbSh1bmlxdWVUYWJsZS52YWx1ZXMoKSk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLnRhYmxlQXJyYXkgPSB0aGlzLmFzc2lnblNpbmdsZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51cGxvYWQgPT09ICd1cGxvYWQnKSB7XHJcbiAgICAgIHRoaXMudGFibGVBcnJheSA9IHRoaXMuYXNzaWduU2luZ2xlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50YWJsZUFycmF5ID0gdGhpcy50YXNrRGV0YWlscy5hc3NpZ247XHJcbiAgICAgIHRoaXMuYXNzaWduU2luZ2xlID0gdGhpcy50YWJsZUFycmF5O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyB0aGlzLnRhYmxlQXJyYXk/Lmxlbmd0aCA/IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKSA6IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJyk7XHJcbiAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLnRhYmxlQXJyYXkubGVuZ3RoO1xyXG4gICAgaWYodGhpcy50b3RhbEl0ZW1zIDwgNSkge1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFt0aGlzLnRvdGFsSXRlbXNdO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNpemVzID0gWzUsMTAsMTUsMjBdO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gNTtcclxuICAgIH1cclxuICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKVxyXG4gICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICB9XHJcbiAgXHJcbiAgY292ZXJhZ2U6IGFueSA9ICdzdG9yZSc7XHJcblxyXG4gIHNlbGVjdFJhZGlvKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5jb3ZlcmFnZSA9IGRhdGE7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMucGFnZVNpemUgPSA1O1xyXG4gICAgdGhpcy5zZWFyY2hJbnB1dC5zZXRWYWx1ZSgnJyk7XHJcbiAgICB0aGlzLnRhc2tEZXRhaWxzLmFzc2lnbiA9IFtdO1xyXG4gICAgdGhpcy50YWJsZUFycmF5ID0gW107XHJcbiAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA9IFtdO1xyXG4gICAgaWYgKGRhdGEgPT09ICdzdG9yZScpIHtcclxuICAgICAgdGhpcy5zdG9yZUNvdmVyYWdlID0gdHJ1ZTtcclxuICAgICAgdGhpcy51c2VyQ292ZXJhZ2UgPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gJ3VzZXInKSB7XHJcbiAgICAgIHRoaXMudXNlckNvdmVyYWdlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zdG9yZUNvdmVyYWdlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdEluaXRpYWxUYWIoKTtcclxuICAgIGlmICh0aGlzLmNvdmVyYWdlID09PSB0aGlzLmNvbmZpZ0RhdGEuY2hlY2tMaXN0RGV0YWlscy5jb3ZlcmFnZSkge1xyXG4gICAgICB0aGlzLnNpbmdsZUFzc2lnbiA9IHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLnNpbmdsZUFzc2lnbjtcclxuICAgICAgdGhpcy5ncm91cEFzc2lnbiA9IHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmdyb3VwQXNzaWduO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFzc2lnblR5cGUgPyB0aGlzLnVzZXJEZXRhaWxzKCkgOiAnJztcclxuICAgICAgfSwgMzAwMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNpbmdsZUFzc2lnbiA9IFtdOyB0aGlzLmdyb3VwQXNzaWduID0gW107IHRoaXMuYXNzaWduU2luZ2xlID0gW10sIHRoaXMuYXNzaWduR3JvdXAgPSBbXTsgdGhpcy5hc3NpZ25UYWJsZUFwaVN0YXRlLm5leHQoJ2xvYWRpbmcnKTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0YXNzaWduRHJvcGRvd24oKTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm1Vc2VycG9wdXAoKSB7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuY29uZmlybVVzZXIsIHsgY2VudGVyZWQ6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJyB9KVxyXG4gICAgZGlhbG9nUmVmLmNsb3NlZC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXMgPT09ICdjb25maXJtJykge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGVEZXRhaWxzKCdhZGRVc2VyJylcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHN0b3JlTGlzdDogYW55ID0gW107XHJcbiAgc2VhcmNoS2V5OiBhbnkgPSBbXTtcclxuXHJcbiAgZ2V0YXNzaWduRHJvcGRvd24oY2hhbmdlPzphbnkpIHtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBcImNsaWVudElkXCI6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICBcImNvdmVyYWdlXCI6IHRoaXMuY292ZXJhZ2UsXHJcbiAgICAgIFwiYXNzaWduVHlwZVwiOiB0aGlzLmFzc2lnblR5cGVcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmdldGFzc2lnbkRyb3Bkb3duKGRhdGEpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDAgJiYgcmVzLmRhdGEuZGF0YS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IHJlcz8uZGF0YT8uZGF0YTtcclxuICAgICAgICBpZiAoZGF0YT8uY292ZXJhZ2UgPT09ICdzdG9yZScpIHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoS2V5ID0gWydzdG9yZU5hbWUnLCAnY2x1c3Rlck5hbWUnXVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YT8uY292ZXJhZ2UgPT09ICd1c2VyJykge1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hLZXkgPSBbJ3VzZXJOYW1lJywgJ3RlYW1OYW1lJ11cclxuICAgICAgICB9XHJcbiAgICAgICAgIWNoYW5nZSA/IHRoaXMuZ2V0SW5pdGlhbERhdGEoKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJyB8fCB0aGlzLmFzc2lnblR5cGUgPT09ICd1c2VyJykgPyB0aGlzLnNpbmdsZUFzc2lnbiA6IHRoaXMuZ3JvdXBBc3NpZ24sIGNoYW5nZSA/IGNoYW5nZSA6ICcnKSA6ICcnO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXNlckRldGFpbHNWMihkYXRhPzogYW55KSB7XHJcbiAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICBcInRhc2tJZFwiOiB0aGlzLmN1cnJlbnRUYXNrSWQsXHJcbiAgICAgIFwiaWRMaXN0XCI6IHRoaXMuaWRMaXN0LFxyXG4gICAgICBcImNvdmVyYWdlXCI6IHRoaXMuY292ZXJhZ2UsIC8vW1wiY2x1c3RlclwiLFwic3RvcmVcIixcInVzZXJcIixcInRlYW1zXCJdXHJcbiAgICAgIFwiY2xpZW50SWRcIjogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIFwic2VhcmNoXCI6IHRoaXMuc2VhcmNoSW5wdXQudmFsdWVcclxuICAgIH1cclxuICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJylcclxuICAgIHRoaXMudGFibGVBcnJheSA9IFtdO1xyXG4gICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSBbXTtcclxuICAgIHRoaXMudHJheFNlcnZpY2Uuc2VsZWN0dGFza0NoaXBzKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgICAgIHRoaXMudGFibGVBcnJheSA9IHJlcz8uZGF0YT8udW5pcXVlQXJyOyBcclxuICAgICAgICAgIHRoaXMuYXNzaWduR3JvdXAgPSB0aGlzLnRhYmxlQXJyYXk7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXM/LmRhdGE/LmNvdW50O1xyXG4gICAgICAgICAgaWYgKHRoaXMudG90YWxJdGVtcyA8IDUpIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbdGhpcy50b3RhbEl0ZW1zXTtcclxuICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMudG90YWxJdGVtcztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFs1LCAxMCwgMTUsIDIwXTtcclxuICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdhc3NpZ25UYWJsZURhdGE/Lmxlbmd0aCcsIHRoaXMuYXNzaWduVGFibGVEYXRhPy5sZW5ndGgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50YWJsZUFycmF5ID0gW107XHJcbiAgICAgICAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZUFwaVN0YXRlLm5leHQoJ2xvYWRlZCcpXHJcbiAgICAgICAgICAvLyB0aGlzLnNob3dJbWFnZSA9IHRydWU7XHJcbiAgICAgICAgICAvLyB0aGlzLnRhYmxlTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuc3RvcmVDb3ZlcmFnZSA/IHRoaXMuZ2V0SW5pdGlhbERhdGEocmVzPy5kYXRhPy5zdG9yZUxpc3QpIDogdGhpcy5nZXRJbml0aWFsRGF0YShyZXM/LmRhdGE/LnVzZXJMaXN0KTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudGFibGVBcnJheSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSBbXTtcclxuICAgICAgICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKVxyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyPy5tZXNzYWdlKVxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHVzZXJEZXRhaWxzKCkge1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGluZycpXHJcbiAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICBpZDogdGhpcy5jdXJyZW50VGFza0lkLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnRcclxuICAgIH1cclxuICAgIHRoaXMudHJheFNlcnZpY2UuZ2V0dGFza1VzZXJEZXRhaWxzVjEocGFyYW1zKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgaWYgKHJlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgLy8gdGhpcy5zaG93SW1hZ2UgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnZhbHVlKVxyXG4gICAgICAgIHRoaXMudGFibGVBcnJheSA9IFtdO1xyXG4gICAgICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gW107XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgICBpZiAodGhpcy5zdG9yZUNvdmVyYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlQXJyYXkgPSByZXMuZGF0YS51c2VyRGV0YWlscy5maWx0ZXIoKGVsOiBhbnkpID0+IGVsPy5jbHVzdGVyTmFtZSA9PSAnJyAmJiBlbD8uc3RvcmVJZCAhPSAnJyk7XHJcbiAgICAgICAgICB0aGlzLmFzc2lnbkdyb3VwID0gcmVzLmRhdGEudXNlckRldGFpbHMuZmlsdGVyKChlbDogYW55KSA9PiBlbD8uY2x1c3Rlck5hbWUgIT09ICcnKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNlckNvdmVyYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlQXJyYXkgPSByZXMuZGF0YS51c2VyRGV0YWlscy5maWx0ZXIoKGVsOiBhbnkpID0+IGVsPy50ZWFtTmFtZSA9PSAnJyAmJiBlbD8udXNlck5hbWUgIT0gJycpO1xyXG4gICAgICAgICAgdGhpcy5hc3NpZ25Hcm91cCA9IHJlcy5kYXRhLnVzZXJEZXRhaWxzLmZpbHRlcigoZWw6IGFueSkgPT4gZWw/LnRlYW1OYW1lICE9PSAnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXNzaWduU2luZ2xlID0gdGhpcy50YWJsZUFycmF5O1xyXG4gICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHRoaXMudGFibGVBcnJheS5sZW5ndGg7XHJcbiAgICAgICAgLy8gdGhpcy50b3RhbEl0ZW1zID0gcmVzLmRhdGEuY291bnQ7XHJcbiAgICAgICAgaWYodGhpcy50b3RhbEl0ZW1zIDwgNSkge1xyXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbdGhpcy50b3RhbEl0ZW1zXTtcclxuICAgICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnRvdGFsSXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbNSwxMCwxNSwyMF07XHJcbiAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gNTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA/IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKSA6IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJylcclxuXHJcbiAgICAgICAgLy8gdGhpcy5nZXRJbml0aWFsRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIHNvcnRDb2x1bW46IGFueTtcclxuICBzb3J0Qnk6IGFueSA9IC0xO1xyXG5cclxuICBzb3J0RGF0YSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnNvcnRDb2x1bW4gPSB2YWx1ZTtcclxuICAgIHRoaXMuc29ydEJ5ICo9IC0xO1xyXG4gICAgY29uc3Qgc29ydEJ5ID0gcGFyc2VJbnQodGhpcy5zb3J0QnksIDEwKSA9PT0gLTEgPyAtMSA6IDE7XHJcbiAgICB0aGlzLnRhYmxlQXJyYXkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgLy8gaWYgKGFbdGhpcy5zb3J0Q29sdW1uXSA9PSBudWxsIHx8IGJbdGhpcy5zb3J0Q29sdW1uXSA9PSBudWxsKSByZXR1cm4gMDtcclxuICAgICAgLy8gaWYgKHR5cGVvZiBhW3RoaXMuc29ydENvbHVtbl0gPT09ICdzdHJpbmcnICYmIHR5cGVvZiBiW3RoaXMuc29ydENvbHVtbl0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvcnRCeSAqIChhW3RoaXMuc29ydENvbHVtbl0gfHwgJycpLmxvY2FsZUNvbXBhcmUoYlt0aGlzLnNvcnRDb2x1bW5dIHx8ICcnKTtcclxuICAgICAgLy8gfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gdGhpcy50YWJsZUFycmF5LnNsaWNlKCh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSkgLSB0aGlzLnBhZ2VTaXplLCB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICBnZXRBc3NpZ25UYWJsZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJylcclxuICAgIGNvbnN0IHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICBcImNsaWVudElkXCI6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICBcImxpbWl0XCI6IHRoaXMucGFnZVNpemUsXHJcbiAgICAgIFwib2Zmc2V0XCI6IHRoaXMuY3VycmVudFBhZ2UgPiAwID8gdGhpcy5jdXJyZW50UGFnZSAtIDEgOiAwLFxyXG4gICAgICBcInNlYXJjaFwiOiB0aGlzLnNlYXJjaElucHV0LnZhbHVlLFxyXG4gICAgICBcInRhc2tJZFwiOiB0aGlzLmN1cnJlbnRUYXNrSWRcclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy50cmF4U2VydmljZS5nZXRUYXNrVXNlckRldGFpbHMocXVlcnkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5jb3VudCkge1xyXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzLmRhdGEuY291bnRcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzPy5kYXRhPy51c2Vycykge1xyXG4gICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSByZXMuZGF0YS51c2Vyc1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA9IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBwYWdlU2l6ZTtcclxuICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gW107XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQudmFsdWUpIHtcclxuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5zZWFyY2hUYWJsZS5sZW5ndGg7XHJcbiAgICAgIGlmICh0aGlzLnRvdGFsSXRlbXMgPCA1KSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbdGhpcy50b3RhbEl0ZW1zXTtcclxuICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNpemVzID0gWzUsIDEwLCAxNSwgMjBdO1xyXG4gICAgICAgIC8vIHRoaXMuc2l6ZSA9IDU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnNlYXJjaFRhYmxlLnNsaWNlKCh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSkgLSB0aGlzLnBhZ2VTaXplLCB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSk7XHJcbiAgICAgIC8vIHRoaXMuYXNzaWduVGFibGVEYXRhID8gdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZSA6IHRoaXMudGFibGVMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgLy8gdGhpcy5hc3NpZ25UYWJsZURhdGEgPyB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlIDogdGhpcy50YWJsZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKHBhZ2VPZmZzZXQ6IGFueSkge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VPZmZzZXRcclxuICAgIHRoaXMuYXNzaWduVGFibGVEYXRhID0gW107XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQudmFsdWUpIHtcclxuICAgICAgLy8gdGhpcy5zZWFyY2hUYWJsZURhdGEoKTtcclxuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5zZWFyY2hUYWJsZS5sZW5ndGg7XHJcbiAgICAgIGlmKHRoaXMudG90YWxJdGVtcyA8IDUpIHtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFt0aGlzLnRvdGFsSXRlbXNdO1xyXG4gICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnRvdGFsSXRlbXM7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbNSwxMCwxNSwyMF07XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgLy8gdGhpcy50YWJsZURhdGEgPyB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlIDogdGhpcy50YWJsZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnRhYmxlQXJyYXkuc2xpY2UoKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKSAtIHRoaXMucGFnZVNpemUsIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICAgIC8vIHRoaXMudGFibGVEYXRhID8gdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZSA6IHRoaXMudGFibGVMb2FkaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuYXNzaWduVGFibGVEYXRhID8gdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZSA6IHRoaXMudGFibGVMb2FkaW5nID0gdHJ1ZTtcclxuICAgIC8vIHRoaXMuZ2V0QXNzaWduVGFibGUoKVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoVGFibGU6IGFueTtcclxuICBzZWFyY2hUYWJsZURhdGEoKSB7XHJcbiAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA9IFtdO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIC8vIHRoaXMudGFibGVMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGxldCBzZWFyY2hGaWVsZDogYW55ID0gWydzdG9yZU5hbWUnLCAndXNlck5hbWUnLCAndXNlckVtYWlsJywgJ2NsdXN0ZXJOYW1lJywgJ3RlYW1OYW1lJ107XHJcbiAgICBpZiAoIXRoaXMuc2VhcmNoSW5wdXQudmFsdWUpIHtcclxuICAgICAgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJyB8fCB0aGlzLmFzc2lnblR5cGUgPT09ICd1c2VyJykgPyAodGhpcy5zaW5nbGVBc3NpZ24gPSB0aGlzLmlkTGlzdCx0aGlzLmdldFRhYmxlRGF0YSgpKSA6ICh0aGlzLmdyb3VwQXNzaWduID0gdGhpcy5pZExpc3QsdGhpcy51c2VyRGV0YWlsc1YyKCkpO1xyXG4gICAgfSBlbHNlIHsgIFxyXG4gICAgICBjb25zdCBzZWFyY2hEYXRhID0gdGhpcy5zZWFyY2hJbnB1dC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBzZWFyY2hUZXJtID0gc2VhcmNoRGF0YS5zcGxpdCgnLCcpLm1hcCgoZWw6IGFueSkgPT4gZWwudHJpbSgpKTtcclxuICAgICAgdGhpcy5zZWFyY2hUYWJsZSA9IHRoaXMudGFibGVBcnJheT8uZmlsdGVyKChpdGVtOiBhbnkpID0+XHJcbiAgICAgICAgc2VhcmNoRmllbGQuc29tZSgoZmllbGQ6IGFueSkgPT4gc2VhcmNoVGVybS5zb21lKCh0ZXJtOiBhbnkpID0+IGl0ZW1bZmllbGRdPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKSkpO1xyXG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLnNlYXJjaFRhYmxlLmxlbmd0aDtcclxuICAgICAgaWYgKHRoaXMudG90YWxJdGVtcyA8IDUpIHtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25TaXplcyA9IFt0aGlzLnRvdGFsSXRlbXNdO1xyXG4gICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnRvdGFsSXRlbXM7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbNSwgMTAsIDE1LCAyMF07XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hc3NpZ25UYWJsZURhdGEgPSB0aGlzLnNlYXJjaFRhYmxlLnNsaWNlKCh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSkgLSB0aGlzLnBhZ2VTaXplLCB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFzc2lnblRhYmxlRGF0YSA/IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkZWQnKSA6IHRoaXMuYXNzaWduVGFibGVBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJyk7XHJcblxyXG4gICAgLy8gbGV0IHBhcmFtcyA9IHtcclxuICAgIC8vICAgb2Zmc2V0OiAwLFxyXG4gICAgLy8gICBsaW1pdDogdGhpcy5zaXplLFxyXG4gICAgLy8gICBzZWFyY2g6IHRoaXMudGFibGVGaWx0ZXIsXHJcbiAgICAvLyAgIGlkOiB0aGlzLmNoZWNrbGlzdElkLFxyXG4gICAgLy8gICBjbGllbnRJZDp0aGlzLmNsaWVudElkXHJcbiAgICAvLyB9XHJcbiAgICAvLyBpZiAodGhpcy50YWJsZUZpbHRlci5sZW5ndGgpIHtcclxuICAgIC8vICAgdGhpcy5Tb3BTZXJ2aWNlLmdldFVzZXJEZXRhaWxzKHBhcmFtcykucGlwZSh0YWtlVW50aWwodGhpcy5kZXRhY2gpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgIC8vICAgICBpZiAocmVzID09IG51bGwpIHtcclxuICAgIC8vICAgICAgIHRoaXMuc2hvd0ltYWdlID0gdHJ1ZTtcclxuICAgIC8vICAgICAgIGlmICh0aGlzLnRhYmxlRmlsdGVyLmxlbmd0aClcclxuICAgIC8vICAgICAgICAgdGhpcy5zaG93SW1hZ2UgPSBmYWxzZTtcclxuICAgIC8vICAgICAgIHRoaXMudGFibGVEYXRhID0gW107XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAvLyAgICAgICB0aGlzLnNob3dJbWFnZSA9IGZhbHNlO1xyXG4gICAgLy8gICAgICAgdGhpcy50YWJsZURhdGEgPSByZXMuZGF0YS51c2VycztcclxuICAgIC8vICAgICAgIHRoaXMucmVjb3Jkc0NvdW50ID0gdGhpcy50YWJsZURhdGEubGVuZ3RoO1xyXG4gICAgLy8gICAgICAgdGhpcy5yZWNvcmRzVG90YWwgPSByZXMuZGF0YS5jb3VudDtcclxuICAgIC8vICAgICAgIGxldCBjb3VudCA9IDAgO1xyXG4gICAgLy8gICAgICAgaWYodGhpcy5yZWNvcmRzVG90YWwgPCA1KSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMucGFnaW5hdGlvblNpemUgPSBbdGhpcy5yZWNvcmRzVG90YWxdXHJcbiAgICAvLyAgICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMucmVjb3Jkc1RvdGFsO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMucGFnaW5hdGlvblNpemUgPSBbNSwxMCwxNSwyMF1cclxuICAgIC8vICAgICAgICAgdGhpcy5zaXplID0gNTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICAgIHRoaXMudGFibGVEYXRhLmZvckVhY2goKGl0ZW06YW55KSA9PntcclxuICAgIC8vICAgICAgICAgaWYoaXRlbS5jaGVja0ZsYWcgJiYgIXRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmFzc2lnbmVkVXNlcnMuaW5jbHVkZXMoaXRlbS5pZCkgJiYgIXRoaXMucmVtb3ZlVXNlcnMuaW5jbHVkZXMoaXRlbS5pZCkpXHJcbiAgICAvLyAgICAgICAgICAgdGhpcy5jb25maWdEYXRhLmNoZWNrTGlzdERldGFpbHMuYXNzaWduZWRVc2Vycy5wdXNoKGl0ZW0uaWQpO1xyXG4gIFxyXG4gICAgLy8gICAgICAgICBpZiAodGhpcy5jb25maWdEYXRhLmNoZWNrTGlzdERldGFpbHMuYXNzaWduZWRVc2Vycy5pbmNsdWRlcyhpdGVtLmlkKSkge1xyXG4gICAgLy8gICAgICAgICAgIGNvdW50ICs9MTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSlcclxuICAgIC8vICAgICAgIGlmIChjb3VudCA9PSB0aGlzLnJlY29yZHNDb3VudCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLnNlbGVjdEFsbCA9IHRydWU7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgICBlbHNlIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5zZWxlY3RBbGwgPSBmYWxzZVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSlcclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gICB0aGlzLnVzZXJEZXRhaWxzKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBkcm9wRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9wZW5Ecm9wZG93bihldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmRyb3BEb3duID0gIXRoaXMuZHJvcERvd247XHJcbiAgfVxyXG5cclxuICBidWxrdXBsb2FkTW9kZWwoKSB7XHJcbiAgICB0aGlzLmRyb3BEb3duID0gZmFsc2U7XHJcbiAgICB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuYnVsa3VwbG9hZCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgYmFja2Ryb3A6ICdzdGF0aWMnXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZXhjZWxFcnJvcjogYW55O1xyXG5cclxuICBhZnRlclVwbGxvYWQoZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy5leGNlbEVycm9yID0gZGF0YTtcclxuICAgIHRoaXMuZGlhbG9nLm9wZW4odGhpcy5hZnRlclZhbGlkYXRpb24sIHsgY2VudGVyZWQ6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJyB9KVxyXG4gIH1cclxuXHJcbiAgb25Vc2VyQXNzaWduQ2hhbmdlKGV2ZW50OiBib29sZWFuLCBpZDogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWV2ZW50KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZFVzZXJzLmFkZChpZClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlZFVzZXJzLmRlbGV0ZShpZClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRvd25sb2FkVGVtcGxhdGVWMigpIHtcclxuICAgIGxldCBleGNlbERhdGE6IGFueSA9IFtdO1xyXG4gICAgICBpZiAodGhpcy5zdG9yZUNvdmVyYWdlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGVBcnJheSA9PSBudWxsIHx8ICF0aGlzLnRhYmxlQXJyYXk/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgc3RvcmVOYW1lOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyTmFtZTogJycsXHJcbiAgICAgICAgICAgICAgdXNlckVtYWlsOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyUGhvbmU6ICcnLFxyXG4gICAgICAgICAgICAgIGNpdHk6JydcclxuICAgICAgICAgICAgfSkgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgc3RvcmVOYW1lOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyTmFtZTogJycsXHJcbiAgICAgICAgICAgICAgdXNlckVtYWlsOiAnJyxcclxuICAgICAgICAgICAgICBjbHVzdGVyTmFtZTogJycsXHJcbiAgICAgICAgICAgICAgdXNlclBob25lOiAnJyxcclxuICAgICAgICAgICAgICBjaXR5OicnXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlQXJyYXkgJiYgdGhpcy50YWJsZUFycmF5Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMudGFibGVBcnJheS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHN0b3JlTmFtZTogaXRlbS5zdG9yZU5hbWUsXHJcbiAgICAgICAgICAgICAgICB1c2VyTmFtZTogaXRlbS51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgICB1c2VyUGhvbmU6IGl0ZW0udXNlclBob25lLFxyXG4gICAgICAgICAgICAgICAgY2l0eTppdGVtLmNpdHlcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHN0b3JlTmFtZTogaXRlbS5zdG9yZU5hbWUsXHJcbiAgICAgICAgICAgICAgICB1c2VyTmFtZTogaXRlbS51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgICBjbHVzdGVyTmFtZTogaXRlbS5jbHVzdGVyTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogaXRlbS51c2VyUGhvbmUsXHJcbiAgICAgICAgICAgICAgICBjaXR5Oml0ZW0uY2l0eVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudXNlckNvdmVyYWdlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGVBcnJheSA9PSBudWxsIHx8ICF0aGlzLnRhYmxlQXJyYXk/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3VzZXInKSB7XHJcbiAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICB1c2VyTmFtZTogJycsXHJcbiAgICAgICAgICAgICAgdXNlckVtYWlsOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyUGhvbmU6ICcnLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXhjZWxEYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgIHVzZXJOYW1lOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyRW1haWw6ICcnLFxyXG4gICAgICAgICAgICAgIHRlYW1OYW1lOiAnJyxcclxuICAgICAgICAgICAgICB1c2VyUGhvbmU6ICcnLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy50YWJsZUFycmF5ICYmIHRoaXMudGFibGVBcnJheT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlQXJyYXkuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFzc2lnblR5cGUgPT09ICd1c2VyJykge1xyXG4gICAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBpdGVtLnVzZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgdXNlckVtYWlsOiBpdGVtLnVzZXJFbWFpbCxcclxuICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogaXRlbS51c2VyUGhvbmUsXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB1c2VyTmFtZTogaXRlbS51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgICB0ZWFtTmFtZTogaXRlbS50ZWFtTmFtZSxcclxuICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogaXRlbS51c2VyUGhvbmUsXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRBc0V4Y2VsRmlsZShleGNlbERhdGEsIGBDaGVja0xpc3RfJHt0aGlzLmFzc2lnblR5cGV9X2ApO1xyXG4gIH1cclxuXHJcbiAgZG93bmxvYWRUZW1wbGF0ZSgpIHtcclxuICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgIGxpbWl0OiAxMDAwMCxcclxuICAgICAgb2Zmc2V0OiAwLFxyXG4gICAgICB0YXNrSWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaElucHV0LnZhbHVlLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhLmNsaWVudCxcclxuICAgIH1cclxuICAgIHRoaXMudHJheFNlcnZpY2UuZ2V0VGFza1VzZXJEZXRhaWxzKHBhcmFtcykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGV4Y2VsRGF0YTogYW55ID0gW107XHJcbiAgICAgIGlmICh0aGlzLnN0b3JlQ292ZXJhZ2UpIHtcclxuICAgICAgICBpZiAocmVzID09IG51bGwpIHtcclxuICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgc3RvcmVOYW1lOiAnJyxcclxuICAgICAgICAgICAgY2x1c3Rlck5hbWU6ICcnLFxyXG4gICAgICAgICAgICB1c2VyRW1haWw6ICcnLFxyXG4gICAgICAgICAgICB1c2VyTmFtZTogJycsXHJcbiAgICAgICAgICAgIHVzZXJQaG9uZTogJycsXHJcbiAgICAgICAgICAgIGNpdHk6ICcnXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgcmVzLmRhdGEudXNlcnMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICBzdG9yZU5hbWU6IGl0ZW0uc3RvcmVOYW1lLFxyXG4gICAgICAgICAgICAgIGNsdXN0ZXJOYW1lOiBpdGVtLmNsdXN0ZXJOYW1lLFxyXG4gICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGl0ZW0udXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgdXNlclBob25lOiBpdGVtLnVzZXJQaG9uZSxcclxuICAgICAgICAgICAgICBjaXR5OiBpdGVtLmNpdHlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudXNlckNvdmVyYWdlKSB7XHJcbiAgICAgICAgaWYgKHJlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICAgIC8vIHN0b3JlTmFtZTogJycsXHJcbiAgICAgICAgICAgIHRlYW1OYW1lOiAnJyxcclxuICAgICAgICAgICAgdXNlckVtYWlsOiAnJyxcclxuICAgICAgICAgICAgdXNlck5hbWU6ICcnLFxyXG4gICAgICAgICAgICB1c2VyUGhvbmU6ICcnLFxyXG4gICAgICAgICAgICBjaXR5OicnXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgIHJlcz8uZGF0YT8udXNlcnMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGV4Y2VsRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAvLyBzdG9yZU5hbWU6IGl0ZW0uc3RvcmVOYW1lLFxyXG4gICAgICAgICAgICAgIHRlYW1OYW1lOiBpdGVtLnRlYW1OYW1lLFxyXG4gICAgICAgICAgICAgIHVzZXJFbWFpbDogaXRlbS51c2VyRW1haWwsXHJcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGl0ZW0udXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgdXNlclBob25lOiBpdGVtLnVzZXJQaG9uZSxcclxuICAgICAgICAgICAgICBjaXR5Oml0ZW0uY2l0eVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRBc0V4Y2VsRmlsZShleGNlbERhdGEsICdUYXNrX1VzZXJsaXN0XycpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBc3NpZ24oZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy51cGxvYWQgPSAnJztcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgLy8gaWYgKHRoaXMudGFza0RldGFpbHMpIHtcclxuICAgICAgdGhpcy50YXNrRGV0YWlscy5hc3NpZ24gPSBldmVudDtcclxuICAgICAgY29uc3QgYXNzaWduZWR1c2VyID0gZXZlbnQubWFwKChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtpZDogZWw/Ll9pZCx0eXBlOiBlbD8udHlwZX1cclxuICAgICAgfSlcclxuICAgICAgLy8gdGhpcy5pZExpc3QgPSBldmVudC5tYXAoKGVsOiBhbnkpID0+IHtcclxuICAgICAgLy8gICByZXR1cm4gZWw/Ll9pZFxyXG4gICAgLy8gfSlcclxuICAgIHRoaXMuaWRMaXN0ID0gYXNzaWduZWR1c2VyO1xyXG4gICAgdGhpcy5zZWFyY2hJbnB1dC5zZXRWYWx1ZSgnJyk7XHJcbiAgICAodGhpcy5hc3NpZ25UeXBlID09PSAnc3RvcmUnIHx8IHRoaXMuYXNzaWduVHlwZSA9PT0gJ3VzZXInKSA/ICh0aGlzLnNpbmdsZUFzc2lnbiA9IHRoaXMuaWRMaXN0LHRoaXMuZ2V0VGFibGVEYXRhKCkpIDogKHRoaXMuZ3JvdXBBc3NpZ24gPSB0aGlzLmlkTGlzdCx0aGlzLnVzZXJEZXRhaWxzVjIoZXZlbnQpKTtcclxuICB9XHJcbiBcclxuICByZW1vdmVkQ2hpcChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnRhYmxlQXJyYXkgPSB0aGlzLnRhYmxlQXJyYXkuZmlsdGVyKChpdGVtOmFueSkgPT4gIWV2ZW50LmluY2x1ZGVzKGl0ZW0uX2lkKSlcclxuICAgIHRoaXMudGFza0RldGFpbHMuYXNzaWduID0gdGhpcy50YXNrRGV0YWlscy5hc3NpZ24uZmlsdGVyKChpdGVtOiBhbnkpID0+ICFldmVudC5pbmNsdWRlcyhpdGVtLl9pZCkpXHJcbiAgfVxyXG5cclxuICB0YWJsZUFycmF5OiBhbnkgPSBbXTtcclxuICBleGNlbERhdGE6IGFueTtcclxuICBzaG93VXNlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dUZWFtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd1N0b3JlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd0NsdXN0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgb25GaWxlVXBsb2FkKGV2ZW50OiBhbnksIHJldXBsb2FkPzogYW55KSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVkU3RvcmUgPSBbXTtcclxuICAgICAgdGhpcy52YWxpZGF0ZWRVc2VyID0gW107XHJcbiAgICAgIHRoaXMudmFsaWRhdGVkQ2x1c3RlciA9IFtdO1xyXG4gICAgICB0aGlzLnZhbGlkYXRlZFRlYW0gPSBbXTtcclxuICAgICAgdGhpcy5uZXdVc2VyID0gW107XHJcbiAgICAgIHRoaXMuaW5hY3RpdmVTdG9yZXMgPSBbXTtcclxuICAgICAgdGhpcy5zaG93VXNlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dUZWFtID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd1N0b3JlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvd0NsdXN0ZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG93SW5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgIHRoaXMucmV1cGxvYWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy51cGxvYWQgPSAndXBsb2FkJztcclxuICAgICAgdGhpcy51c2VyRGF0YSA9IHRoaXMuZXhjZWxVc2VyRGF0YSA9IFtdO1xyXG4gICAgICBsZXQgZGF0YTogYW55O1xyXG4gICAgICBjb25zdCB0YXJnZXQ6IERhdGFUcmFuc2ZlciA9IDxEYXRhVHJhbnNmZXI+KGV2ZW50LnRhcmdldCk7XHJcbiAgICAgIGxldCBpc0V4Y2VsRmlsZSA9ICEhdGFyZ2V0LmZpbGVzWzBdLm5hbWUubWF0Y2goLygueGxzfC54bHN4KS8pO1xyXG4gICAgICBsZXQgZXJyb3I6IGFueSA9IFtdO1xyXG4gICAgICBsZXQgVmFsaWRhdGlvbkVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGlmIChpc0V4Y2VsRmlsZSkge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlcjogRmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyh0YXJnZXQuZmlsZXNbMF0pO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBic3RyOiBzdHJpbmcgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgICBjb25zdCB3YjogWExTWC5Xb3JrQm9vayA9IFhMU1gucmVhZChic3RyLCB7IHR5cGU6ICdiaW5hcnknIH0pO1xyXG4gICAgICAgICAgY29uc3Qgd3NuYW1lOiBzdHJpbmcgPSB3Yi5TaGVldE5hbWVzWzBdO1xyXG4gICAgICAgICAgY29uc3Qgd3M6IFhMU1guV29ya1NoZWV0ID0gd2IuU2hlZXRzW3dzbmFtZV07XHJcbiAgICAgICAgICBkYXRhID0gWExTWC51dGlscy5zaGVldF90b19qc29uKHdzKTtcclxuICAgICAgICAgIHRoaXMuZXhjZWxEYXRhID0gZGF0YTtcclxuICAgICAgICAgIGlmKCFkYXRhLmxlbmd0aCB8fCAoZGF0YS5zb21lKChpdGVtOiBhbnkpID0+ICdjbHVzdGVyTmFtZScgaW4gaXRlbSB8fCAndGVhbU5hbWUnIGluIGl0ZW0pKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdQbGVhc2UgVXBsb2FkIGEgVmFsaWQgZmlsZS4nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgcmVxdWlyZWRLZXlzID0gdGhpcy5zdG9yZUNvdmVyYWdlID8gWydzdG9yZU5hbWUnLCd1c2VyTmFtZScsICd1c2VyRW1haWwnXSA6IFsndXNlck5hbWUnLCAndXNlckVtYWlsJ107IC8vIE11c3QgYWx3YXlzIGJlIHByZXNlbnRcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbmFsS2V5cyA9IHRoaXMuc3RvcmVDb3ZlcmFnZSA/IFsndXNlclBob25lJywgJ2NpdHknXSA6IFsndXNlclBob25lJywgJ2NpdHknXTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgY29uc3QgaXNWYWxpZCA9IGRhdGEuc29tZSgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtKTtcclxuICAgICAgICAgICAgY29uc3QgaGFzUmVxdWlyZWRLZXlzID0gcmVxdWlyZWRLZXlzLmV2ZXJ5KGtleSA9PiBrZXlzLmluY2x1ZGVzKGtleSkpO1xyXG4gICAgICAgICAgICBjb25zdCBhbGxLZXlzQXJlQWxsb3dlZCA9IGtleXMuZXZlcnkoa2V5ID0+IFxyXG4gICAgICAgICAgICAgIHJlcXVpcmVkS2V5cy5pbmNsdWRlcyhrZXkpIHx8IG9wdGlvbmFsS2V5cy5pbmNsdWRlcyhrZXkpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybiBoYXNSZXF1aXJlZEtleXMgJiYgYWxsS2V5c0FyZUFsbG93ZWQ7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnUGxlYXNlIFVwbG9hZCBhIFZhbGlkIGZpbGUuJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICBcclxuICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigoaXRlbTphbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICgoaXRlbT8uc3RvcmVOYW1lICYmIGl0ZW0/LnN0b3JlTmFtZS50cmltKCkgIT0gJycgJiYgaXRlbT8uc3RvcmVOYW1lLnRyaW0oKSAhPSBudWxsKSB8fCAoaXRlbT8udXNlck5hbWUgJiYgaXRlbT8udXNlck5hbWUudHJpbSgpICE9ICcnICYmIGl0ZW0/LnVzZXJOYW1lLnRyaW0oKSAhPSBudWxsKSB8fCAoaXRlbT8udXNlckVtYWlsICYmIGl0ZW0/LnVzZXJFbWFpbC50cmltKCkgIT0gJycgJiYgaXRlbT8udXNlckVtYWlsLnRyaW0oKSAhPSBudWxsKSlcclxuICAgICAgICAgIH0pXHJcbiAgICBcclxuICAgICAgICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudDogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50Py51c2VyRW1haWwpIHtcclxuICAgICAgICAgICAgICBlbGVtZW50LnVzZXJFbWFpbCA9IGVsZW1lbnQ/LnVzZXJFbWFpbC5yZXBsYWNlKC9cXHMvZywnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmVDb3ZlcmFnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKChlbGVtZW50LnN0b3JlTmFtZSAmJiBlbGVtZW50LnN0b3JlTmFtZS50cmltKCkgPT0gJycpIHx8IGVsZW1lbnQuc3RvcmVOYW1lID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCBTdG9yZU5hbWUgLSBBJHtpbmRleCsyfWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQudXNlck5hbWUgJiYgZWxlbWVudC51c2VyTmFtZS50cmltKCkgPT0gJycpIHx8IGVsZW1lbnQudXNlck5hbWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIFVzZXJOYW1lIC0gQiR7aW5kZXgrMn1gKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKChlbGVtZW50LnVzZXJFbWFpbCAmJiBlbGVtZW50LnVzZXJFbWFpbC50cmltKCkgPT0gJycpIHx8IGVsZW1lbnQudXNlckVtYWlsID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCB1c2VyRW1haWwgLSBDJHtpbmRleCsyfWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudD8udXNlckVtYWlsICYmICFlbGVtZW50LnVzZXJFbWFpbC5tYXRjaCgvXlthLXpBLVowLTkuXy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsNn0kLykpIHtcclxuICAgICAgICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCB1c2VyRW1haWwgLSBDJHtpbmRleCsyfWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbHVzdGVyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbHVzdGVyTmFtZS50cmltKCkgPT0gJycgfHwgZWxlbWVudC5jbHVzdGVyTmFtZSA9PSBudWxsKSB7IGVycm9yLnB1c2goYEludmFsaWQgY2x1c3Rlck5hbWUgLSBEJHtpbmRleCArIDJ9YCkgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNlckNvdmVyYWdlICYmICFlbGVtZW50Py5zdG9yZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICgoZWxlbWVudC51c2VyTmFtZSAmJiBlbGVtZW50LnVzZXJOYW1lLnRyaW0oKSA9PSAnJykgfHwgZWxlbWVudC51c2VyTmFtZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgIGVycm9yLnB1c2goYEludmFsaWQgVXNlck5hbWUgLSBBJHtpbmRleCsyfWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQudXNlckVtYWlsICYmIGVsZW1lbnQudXNlckVtYWlsLnRyaW0oKSA9PSAnJykgfHwgZWxlbWVudC51c2VyRW1haWwgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIHVzZXJFbWFpbCAtIEIke2luZGV4KzJ9YClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Py51c2VyRW1haWwgJiYgIWVsZW1lbnQudXNlckVtYWlsLm1hdGNoKC9eW2EtekEtWjAtOS5fLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Miw2fSQvKSkge1xyXG4gICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIHVzZXJFbWFpbCAtIEIke2luZGV4KzJ9YClcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC50ZWFtTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC50ZWFtTmFtZS50cmltKCkgPT0gJycgfHwgZWxlbWVudC50ZWFtTmFtZSA9PSBudWxsKSB7IGVycm9yLnB1c2goYEludmFsaWQgdGVhbU5hbWUgLSBDJHtpbmRleCArIDJ9YCkgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1BsZWFzZSB1cGxvYWQgYSB2YWxpZCBmaWxlLicpXHJcbiAgICAgICAgICAgICAgVmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zdG9yZUNvdmVyYWdlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuYXNzaWduVHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyRGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgc3RvcmVOYW1lOiBlbGVtZW50Py5zdG9yZU5hbWU/LnRyaW0oKSxcclxuICAgICAgICAgICAgICAgICAgdXNlck5hbWU6IGVsZW1lbnQ/LnVzZXJOYW1lPy50cmltKCksXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJFbWFpbDogZWxlbWVudD8udXNlckVtYWlsPy50b0xvd2VyQ2FzZSgpPy50cmltKCksXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogZWxlbWVudD8udXNlclBob25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBjaGVja0ZsYWc6IGVsZW1lbnQ/LmNoZWNrID8gZWxlbWVudC5jaGVjayA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBjaXR5OiBlbGVtZW50Py5jaXR5LFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOidzdG9yZSdcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlckRhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIHN0b3JlTmFtZTogZWxlbWVudD8uc3RvcmVOYW1lPy50cmltKCksXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBlbGVtZW50Py51c2VyTmFtZT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB1c2VyRW1haWw6IGVsZW1lbnQ/LnVzZXJFbWFpbD8udG9Mb3dlckNhc2UoKT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICBjbHVzdGVyTmFtZTogZWxlbWVudD8uY2x1c3Rlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogZWxlbWVudD8udXNlclBob25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBjaGVja0ZsYWc6IGVsZW1lbnQ/LmNoZWNrID8gZWxlbWVudC5jaGVjayA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICBjaXR5OiBlbGVtZW50Py5jaXR5LFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOidjbHVzdGVyJ1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy51c2VyQ292ZXJhZ2UpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5hc3NpZ25UeXBlID09PSAndXNlcicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlckRhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBlbGVtZW50Py51c2VyTmFtZT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB1c2VyRW1haWw6IGVsZW1lbnQ/LnVzZXJFbWFpbD8udG9Mb3dlckNhc2UoKT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB1c2VyUGhvbmU6IGVsZW1lbnQ/LnVzZXJQaG9uZSxcclxuICAgICAgICAgICAgICAgICAgLy8gY2hlY2tGbGFnOiBlbGVtZW50Py5jaGVjayA/IGVsZW1lbnQuY2hlY2sgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgdHlwZTondXNlcidcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlckRhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBlbGVtZW50Py51c2VyTmFtZT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB1c2VyRW1haWw6IGVsZW1lbnQ/LnVzZXJFbWFpbD8udG9Mb3dlckNhc2UoKT8udHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgICB0ZWFtTmFtZTogZWxlbWVudD8udGVhbU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJQaG9uZTogZWxlbWVudD8udXNlclBob25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBjaGVja0ZsYWc6IGVsZW1lbnQ/LmNoZWNrID8gZWxlbWVudC5jaGVjayA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAndGVhbXMnXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZiAoZXJyb3IubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLmRpc21pc3NBbGwoKTtcclxuICAgICAgICAgICAgY29uc3QgcG9wdXBjb250ZW50ID0ge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlwcm9wOiBmYWxzZSxcclxuICAgICAgICAgICAgICBpbWFnZXNyYzogIGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIj48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjRkVGMEM3XCIvPjxwYXRoIGQ9XCJNMjcuOTk5OCAyNC4wMDEyVjI4LjAwMTJNMjcuOTk5OCAzMi4wMDEySDI4LjAwOThNMjYuMjg5OCAxOC44NjEyTDE3LjgxOTggMzMuMDAxMkMxNy42NDUxIDMzLjMwMzYgMTcuNTUyNyAzMy42NDY1IDE3LjU1MTggMzMuOTk1N0MxNy41NTA4IDM0LjM0NDkgMTcuNjQxMyAzNC42ODgzIDE3LjgxNDIgMzQuOTkxN0MxNy45ODcxIDM1LjI5NTEgMTguMjM2NSAzNS41NDc5IDE4LjUzNzUgMzUuNzI1QzE4LjgzODUgMzUuOTAyMSAxOS4xODA2IDM1Ljk5NzMgMTkuNTI5OCAzNi4wMDEySDM2LjQ2OThDMzYuODE5IDM1Ljk5NzMgMzcuMTYxMSAzNS45MDIxIDM3LjQ2MjEgMzUuNzI1QzM3Ljc2MzEgMzUuNTQ3OSAzOC4wMTI0IDM1LjI5NTEgMzguMTg1NCAzNC45OTE3QzM4LjM1ODMgMzQuNjg4MyAzOC40NDg4IDM0LjM0NDkgMzguNDQ3OCAzMy45OTU3QzM4LjQ0NjggMzMuNjQ2NSAzOC4zNTQ0IDMzLjMwMzYgMzguMTc5OCAzMy4wMDEyTDI5LjcwOTggMTguODYxMkMyOS41MzE1IDE4LjU2NzMgMjkuMjgwNSAxOC4zMjQzIDI4Ljk4MSAxOC4xNTU3QzI4LjY4MTQgMTcuOTg3IDI4LjM0MzUgMTcuODk4NCAyNy45OTk4IDE3Ljg5ODRDMjcuNjU2IDE3Ljg5ODQgMjcuMzE4MSAxNy45ODcgMjcuMDE4NiAxOC4xNTU3QzI2LjcxOTEgMTguMzI0MyAyNi40NjggMTguNTY3MyAyNi4yODk4IDE4Ljg2MTJaXCIgc3Ryb2tlPVwiI0RDNjgwM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRkZGQUVCXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgICAgICAgIHRpdGxlOiBgSW52YWxpZCBkZXRhaWxzIWAsXHJcbiAgICAgICAgICAgICAgY29udGVudDogYFBsZWFzZSBwcm92aWRlIGNvcnJlY3QgYW5kIGNvbXBsZXRlIHN0b3JlIGluZm9ybWF0aW9uLmAsXHJcbiAgICAgICAgICAgICAgYnV0dG9udHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgICBlcnJvcjplcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKHBvcHVwY29udGVudClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICFWYWxpZGF0aW9uRXJyb3IgPyB0aGlzLmFmdGVyVXBsbG9hZCgpIDogJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZih0aGlzLmZpbGVJbnB1dCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZih0aGlzLmZpbGVJbnB1dDEpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlSW5wdXQxLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmKHRoaXMuZmlsZUlucHV0KSB7XHJcbiAgICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuZmlsZUlucHV0MSkge1xyXG4gICAgICAgICAgdGhpcy5maWxlSW5wdXQxLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnUGxlYXNlIFVwbG9hZCBhIEV4Y2VsIGZpbGUuJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICB1cGxvYWQ6IGFueSA9ICd1cGxvYWQnO1xyXG4gIHZhbGlkYXRlZFN0b3JlOiBhbnkgPSBbXTtcclxuICB2YWxpZGF0ZWRVc2VyOiBhbnkgPSBbXTtcclxuICB2YWxpZGF0ZWRDbHVzdGVyOiBhbnkgPSBbXTtcclxuICB2YWxpZGF0ZWRUZWFtOiBhbnkgPSBbXTtcclxuICBuZXdVc2VyOiBhbnkgPSBbXTtcclxuICBpbmFjdGl2ZVN0b3JlczogYW55ID0gW107XHJcbiAgc2hvd0luYWN0aXZlOiBhbnk9IGZhbHNlIDtcclxuXHJcbiAgdmFsaWRhdGVEZXRhaWxzKGFkZFVzZXI/OmFueSkgeyAgICBcclxuICAgICAgbGV0IHBhcmFtczphbnkgPSB7XHJcbiAgICAgICAgdGFza0lkOiB0aGlzLmN1cnJlbnRUYXNrSWQsXHJcbiAgICAgICAgLy8gYXNzaWduVXNlcnM6IHRoaXMudXNlckRhdGEsXHJcbiAgICAgICAgYXNzaWduZWRVc2VyczogdGhpcy51c2VyRGF0YSxcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgICAgY292ZXJhZ2U6IHRoaXMuY292ZXJhZ2VcclxuICAgIH1cclxuICAgIGFkZFVzZXIgPyBwYXJhbXMuYWRkVXNlciA9IHRydWUgOiAnJztcclxuICAgIHRoaXMudHJheFNlcnZpY2UudGFza3ZhbGlkYXRlVXNlcnYxKHBhcmFtcykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMudXBsb2FkID09PSAnc3RvcmUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVBcnJheS51bnNoaWZ0KC4uLnJlcz8uZGF0YT8uZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnRGF0YS5jaGVja0xpc3REZXRhaWxzLmFzc2lnbiA9IHRoaXMudGFibGVBcnJheTtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnRhYmxlQXJyYXkubWFwKChlbDphbnkpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4geyBpZDogZWw/Ll9pZCwgdHlwZTogZWw/LnR5cGUgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmlkTGlzdCA9IGRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuc2luZ2xlQXNzaWduID0gdGhpcy5pZExpc3Q7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFibGVEYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYXNzaWduVHlwZSA9PT0gJ3VzZXInID8gdGhpcy5nZXRhc3NpZ25Ecm9wZG93bignY2hhbmdlJykgOiAnJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVBcnJheSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hc3NpZ25UYWJsZUFwaVN0YXRlLm5leHQoJ2xvYWRpbmcnKVxyXG4gICAgICAgICAgICB0aGlzLnRhYmxlQXJyYXkgPSByZXM/LmRhdGE/LmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuYXNzaWduU2luZ2xlID0gcmVzPy5kYXRhPy5kYXRhO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ0RhdGEuY2hlY2tMaXN0RGV0YWlscy5hc3NpZ24gPSB0aGlzLnRhYmxlQXJyYXk7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gcmVzPy5kYXRhPy5kYXRhLm1hcCgoZWw6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHsgaWQ6IGVsPy5faWQsIHR5cGU6IGVsPy50eXBlIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5pZExpc3QgPSBkYXRhO1xyXG4gICAgICAgICAgICB0aGlzLnNpbmdsZUFzc2lnbiA9IHRoaXMuaWRMaXN0O1xyXG4gICAgICAgICAgICB0aGlzLmFzc2lnblRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgICAgICAgdGhpcy5nZXRUYWJsZURhdGEoKTtcclxuICAgICAgICAgICAgdGhpcy5hc3NpZ25UeXBlID09PSAndXNlcicgPyB0aGlzLmdldGFzc2lnbkRyb3Bkb3duKCdjaGFuZ2UnKSA6ICcnOyBcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZGlhbG9nLmRpc21pc3NBbGwoKTsgXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVycj8uZXJyb3I/LmVycm9yICYmIGVycj8uZXJyb3I/LmNvZGUgPT0gNDAwKSB7XHJcbiAgICAgICAgICBsZXQgZXJyb3JEYXRhID0gZXJyPy5lcnJvcj8uZXJyb3I7XHJcbiAgICAgICAgICB0aGlzLmV4Y2VsRGF0YSA9IGVycm9yRGF0YT8uZGF0YTtcclxuICAgICAgICAgIHRoaXMudXNlckRhdGEgPSBlcnJvckRhdGE/LmRhdGE7XHJcbiAgICAgICAgICBpZiAoZXJyb3JEYXRhLmV4aXN0RW1haWw/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGBBbHJlYWR5ICR7ZXJyb3JEYXRhLmV4aXN0RW1haWwudG9TdHJpbmcoKX0gYXNzaWduZWQgdG8gYW5vdGhlciBjbGllbnRgKVxyXG4gICAgICAgICAgfWVsc2UgaWYgKGVycm9yRGF0YS5zdG9yZT8ubGVuZ3RoICYmICFlcnJvckRhdGEuZXhpc3RFbWFpbD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVkU3RvcmUgPSBlcnJvckRhdGE/LnN0b3JlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dTdG9yZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKCk7XHJcbiAgICAgICAgICB9ZWxzZSBpZiAoZXJyb3JEYXRhLnN0b3JlPy5sZW5ndGggJiYgZXJyb3JEYXRhLmV4aXN0RW1haWw/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAhZXJyb3JEYXRhPy5pbkFjdGl2ZVN0b3Jlcz8ubGVuZ3RoID8gdGhpcy5kaWFsb2cuZGlzbWlzc0FsbCgpIDogJyc7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoYEFscmVhZHkgJHtlcnJvckRhdGEuc3RvcmUudG9TdHJpbmcoKX0gYXNzaWduZWQgdG8gYW5vdGhlciBjbGllbnRgKVxyXG4gICAgICAgICAgfWVsc2UgaWYgKGVycm9yRGF0YT8uaW5BY3RpdmVTdG9yZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmluYWN0aXZlU3RvcmVzID0gZXJyb3JEYXRhPy5pbkFjdGl2ZVN0b3JlcztcclxuICAgICAgICAgICAgdGhpcy5zaG93SW5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyVXBsbG9hZCgpO1xyXG4gICAgICAgICAgfWVsc2UgaWYgKGVycm9yRGF0YT8udXNlcj8ubGVuZ3RoICYmICFlcnJvckRhdGE/LmV4aXN0RW1haWw/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlZFVzZXIgPSBlcnJvckRhdGEudXNlcjtcclxuICAgICAgICAgICAgdGhpcy5zaG93VXNlciA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwbG9hZCA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlybVVzZXJwb3B1cCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIGlmIChlcnJvckRhdGE/LnVzZXI/Lmxlbmd0aCAmJiBlcnJvckRhdGE/LmV4aXN0RW1haWw/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoYEFscmVhZHkgJHtlcnJvckRhdGE/LnVzZXIudG9TdHJpbmcoKX0gYXNzaWduZWQgdG8gYW5vdGhlciBjbGllbnRgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVycm9yRGF0YT8uZHVwbGljYXRlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLmRpc21pc3NBbGwoKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChgJHtlcnJvckRhdGE/LmR1cGxpY2F0ZXM/LnRvU3RyaW5nKCl9IC0gJHtlcnJvckRhdGE/Lm1lc3NhZ2V9YClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG4gIH0gXHJcblxyXG4gIFJldXBsb2FkKCkge1xyXG4gICAgLy8gdGhpcy5kaWFsb2cuZGlzbWlzc0FsbCgpO1xyXG4gICAgdGhpcy52YWxpZGF0ZWRTdG9yZSA9IFtdO1xyXG4gICAgdGhpcy52YWxpZGF0ZWRVc2VyID0gW107XHJcbiAgICB0aGlzLnZhbGlkYXRlZENsdXN0ZXIgPSBbXTtcclxuICAgIHRoaXMudmFsaWRhdGVkVGVhbSA9IFtdO1xyXG4gICAgdGhpcy5uZXdVc2VyID0gW107XHJcbiAgICB0aGlzLmluYWN0aXZlU3RvcmVzID0gW107XHJcbiAgICB0aGlzLnNob3dVc2VyID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dUZWFtID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dTdG9yZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q2x1c3RlciA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93SW5hY3RpdmUgPSBmYWxzZTtcclxuICAgIGlmKHRoaXMuZmlsZUlucHV0KSB7XHJcbiAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgIH1cclxuICAgIGlmKHRoaXMuZmlsZUlucHV0MSkge1xyXG4gICAgICB0aGlzLmZpbGVJbnB1dDEubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gICAgbGV0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrdF9hY2NvdW50X3RlYW1fc2l6ZV9zZWxlY3RfMicpO1xyXG4gICAgZWxlPy5jbGljaygpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIFxyXG4gIGNsb3NlYWN0aXZlcG9wdXAoKSB7XHJcbiAgICB0aGlzLmRpYWxvZy5kaXNtaXNzQWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLyBvbkZpbGVVcGxvYWQoZXZlbnQ6IGFueSkge1xyXG4gIC8vICAgLy9FbXB0eSBzaGVldCB2YWxpZGF0aW9uIC0tLWRvbmVcclxuICAvLyAgIC8vZW1wdHkgZmllbGQgdmFsaWRhdGlvbiBmb3Igc3RvcmVOYW1lLCB1c2VyTmFtZSwgdXNlckVtYWlsLCBjaXR5LiBJIFxyXG4gIC8vICAgLy8gdmFsaWRhdGUgdXNlciBlbWFpbFxyXG4gIC8vICAgLy8gRW1haWwgdW5pcXVlIGZvciBzdG9yZVxyXG4gIC8vICAgLy8gRW1haWwgdW5pcXVlIGZvciB1c2VybmFtZVxyXG4gIC8vICAgY29uc3QgdGFyZ2V0OiBEYXRhVHJhbnNmZXIgPSA8RGF0YVRyYW5zZmVyPihldmVudC50YXJnZXQpO1xyXG4gIC8vICAgLy8gbGV0IGlzRXhjZWxGaWxlID0gISF0YXJnZXQuZmlsZXNbMF0ubmFtZS5tYXRjaCgvKC54bHN8Lnhsc3gpLyk7XHJcblxyXG4gIC8vICAgY29uc3QgcmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAvLyAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcodGFyZ2V0LmZpbGVzWzBdKTtcclxuICAvLyAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IGJzdHI6IHN0cmluZyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAvLyAgICAgY29uc3Qgd2I6IFhMU1guV29ya0Jvb2sgPSBYTFNYLnJlYWQoYnN0ciwgeyB0eXBlOiAnYmluYXJ5JyB9KTtcclxuICAvLyAgICAgY29uc3Qgd3NuYW1lOiBzdHJpbmcgPSB3Yi5TaGVldE5hbWVzWzBdO1xyXG4gIC8vICAgICBjb25zdCB3czogWExTWC5Xb3JrU2hlZXQgPSB3Yi5TaGVldHNbd3NuYW1lXTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IGpzb25XaXRoUG9zaXRpb246IGFueVtdID0gW107XHJcblxyXG4gIC8vICAgICBjb25zdCByYW5nZSA9IFhMU1gudXRpbHMuZGVjb2RlX3JhbmdlKHdzWychcmVmJ10gfHwgJycpO1xyXG5cclxuICAvLyAgICAgY29uc3QgaGVhZGVyczogc3RyaW5nW10gPSBbXTtcclxuICAvLyAgICAgZm9yIChsZXQgQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xyXG4gIC8vICAgICAgIGNvbnN0IGNlbGxBZGRyZXNzID0gWExTWC51dGlscy5lbmNvZGVfY2VsbCh7IHI6IHJhbmdlLnMuciwgYzogQyB9KTtcclxuICAvLyAgICAgICBjb25zdCBoZWFkZXIgPSB3c1tjZWxsQWRkcmVzc10/LnYgfHwgYENvbHVtbiR7QyArIDF9YDtcclxuICAvLyAgICAgICBoZWFkZXJzLnB1c2goaGVhZGVyKTtcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgZm9yIChsZXQgUiA9IHJhbmdlLnMuciArIDE7IFIgPD0gcmFuZ2UuZS5yOyArK1IpIHtcclxuICAvLyAgICAgICBjb25zdCByb3dEYXRhOiBhbnkgPSB7IHJvdzogUiArIDEgfTtcclxuXHJcbiAgLy8gICAgICAgZm9yIChsZXQgQyA9IHJhbmdlLnMuYzsgQyA8PSByYW5nZS5lLmM7ICsrQykge1xyXG4gIC8vICAgICAgICAgY29uc3QgY2VsbEFkZHJlc3MgPSBYTFNYLnV0aWxzLmVuY29kZV9jZWxsKHsgcjogUiwgYzogQyB9KTtcclxuICAvLyAgICAgICAgIGNvbnN0IGNlbGwgPSB3c1tjZWxsQWRkcmVzc107XHJcbiAgLy8gICAgICAgICBjb25zdCBoZWFkZXIgPSBoZWFkZXJzW0MgLSByYW5nZS5zLmNdO1xyXG5cclxuICAvLyAgICAgICAgIHJvd0RhdGFbaGVhZGVyXSA9IGNlbGw/LnYgfHwgXCJcIjtcclxuICAvLyAgICAgICAgIHJvd0RhdGFbYGNvbHVtbl8ke2hlYWRlcn1gXSA9IFhMU1gudXRpbHMuZW5jb2RlX2NvbChDKTtcclxuICAvLyAgICAgICB9XHJcblxyXG4gIC8vICAgICAgIGpzb25XaXRoUG9zaXRpb24ucHVzaChyb3dEYXRhKTtcclxuICAvLyAgICAgfVxyXG5cclxuXHJcbiAgLy8gICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGpzb25XaXRoUG9zaXRpb24uZmlsdGVyKHJvdyA9PiB7XHJcbiAgLy8gICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJvdykuZmlsdGVyKGtleSA9PiAha2V5LnN0YXJ0c1dpdGgoJ2NvbHVtbl8nKSAmJiBrZXkgIT09ICdyb3cnKTtcclxuICAvLyAgICAgICByZXR1cm4ga2V5cy5zb21lKGtleSA9PiByb3dba2V5XS50cmltKCkgIT09IHVuZGVmaW5lZCAmJiByb3dba2V5XS50cmltKCkgIT09IG51bGwgJiYgcm93W2tleV0udHJpbSgpICE9PSBcIlwiKTtcclxuICAvLyAgICAgfSk7XHJcblxyXG5cclxuICAvLyAgICAgaWYgKCFmaWx0ZXJlZERhdGEubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoYFBsZWFzZSBlbnRlciB2YWxpZCBkZXRhaWxzYClcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgY29uc3QgZW1wdHlLZXlzOiBhbnlbXSA9IFtdXHJcbiAgLy8gICAgIGNvbnN0IGludmFsaWRFbWFpbHM6IGFueVtdID0gW11cclxuXHJcbiAgLy8gICAgIGZpbHRlcmVkRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAvLyAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoa2V5ID0+ICFrZXkuc3RhcnRzV2l0aCgnY29sdW1uXycpICYmIGtleSAhPT0gJ3JvdycpXHJcblxyXG4gIC8vICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoa2V5ID09PSAndXNlckVtYWlsJykge1xyXG4gIC8vICAgICAgICAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xyXG4gIC8vICAgICAgICAgICBjb25zdCBpc1ZhbGlkTWFpbCA9IGVtYWlsUmVnZXgudGVzdChyb3dbJ3VzZXJFbWFpbCddKTtcclxuICAvLyAgICAgICAgICAgaWYgKCFpc1ZhbGlkTWFpbCkgaW52YWxpZEVtYWlscy5wdXNoKHJvd1tgY29sdW1uXyR7a2V5fWBdICsgcm93LnJvdylcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGlmICghcm93W2tleV0gJiYgKGtleSA9PT0gJ3N0b3JlTmFtZScgfHwga2V5ID09PSAndXNlckVtYWlsJyB8fCBrZXkgPT09ICd1c2VyTmFtZScpKSBlbXB0eUtleXMucHVzaChyb3dbYGNvbHVtbl8ke2tleX1gXSArIHJvdy5yb3cpXHJcbiAgLy8gICAgICAgfSlcclxuICAvLyAgICAgfSlcclxuXHJcbiAgLy8gICAgIGlmIChlbXB0eUtleXMubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoYFBsZWFzZSBmaWxsIHRoZSBjZWxscyAke2VtcHR5S2V5cy5qb2luKCcsICcpfWApXHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIGlmIChpbnZhbGlkRW1haWxzLmxlbmd0aCkge1xyXG4gIC8vICAgICAgIHJldHVybiB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGBQbGVhc2UgZW50ZXIgdmFsaWQgZW1haWxzIGF0ICR7aW52YWxpZEVtYWlscy5qb2luKCcsICcpfWApXHJcbiAgLy8gICAgIH1cclxuXHJcblxyXG4gIC8vICAgICBjb25zdCBncm91cGVkQnlFbWFpbCA9IGZpbHRlcmVkRGF0YS5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xyXG4gIC8vICAgICAgIGlmICghYWNjW2l0ZW0udXNlckVtYWlsXSkge1xyXG4gIC8vICAgICAgICAgYWNjW2l0ZW0udXNlckVtYWlsXSA9IFtdO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBhY2NbaXRlbS51c2VyRW1haWxdLnB1c2goaXRlbS5zdG9yZU5hbWUpO1xyXG4gIC8vICAgICAgIHJldHVybiBhY2M7XHJcbiAgLy8gICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPik7XHJcblxyXG4gIC8vICAgICBjb25zdCB1bmlxdWVSZXN1bHQgPSBPYmplY3QuZW50cmllcyhncm91cGVkQnlFbWFpbCkubWFwKChbZW1haWwsIHN0b3JlTmFtZXNdKSA9PiB7XHJcbiAgLy8gICAgICAgY29uc3QgdW5pcXVlU3RvcmVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPihzdG9yZU5hbWVzIGFzIHN0cmluZyk7XHJcbiAgLy8gICAgICAgcmV0dXJuIHtcclxuICAvLyAgICAgICAgIHVzZXJFbWFpbDogZW1haWwsXHJcbiAgLy8gICAgICAgICBpc1N0b3JlTmFtZVVuaXF1ZTogdW5pcXVlU3RvcmVOYW1lcy5zaXplID09PSAoc3RvcmVOYW1lcyBhcyBBcnJheTxzdHJpbmc+KS5sZW5ndGgsXHJcbiAgLy8gICAgICAgICBzdG9yZU5hbWVzOiBBcnJheS5mcm9tKHVuaXF1ZVN0b3JlTmFtZXMpLFxyXG4gIC8vICAgICAgIH07XHJcbiAgLy8gICAgIH0pO1xyXG5cclxuICAvLyAgICAgY29uc3Qgbm90VW5pcXVlID0gdW5pcXVlUmVzdWx0LmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNTdG9yZU5hbWVVbmlxdWUpLm1hcCgoaXRlbSkgPT4gaXRlbS51c2VyRW1haWwpXHJcblxyXG4gIC8vICAgICBpZiAobm90VW5pcXVlLmxlbmd0aCkge1xyXG4gIC8vICAgICAgIHJldHVybiB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGAke25vdFVuaXF1ZS5qb2luKCcsICcpfSBzaG91bGQgYmUgdW5pcXVlIGZvciBzdG9yZSBuYW1lYClcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXHJcbiAgLy8gICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnXHJcblxyXG4gIC8vICAgICBjb25zdCBhc3NpZ25MaXN0ID0gZmlsdGVyZWREYXRhLm1hcCgoZGF0YSkgPT4ge1xyXG4gIC8vICAgICAgIHJldHVybiB7XHJcbiAgLy8gICAgICAgICBzdG9yZU5hbWU6IGRhdGEuc3RvcmVOYW1lLFxyXG4gIC8vICAgICAgICAgdXNlckVtYWlsOiBkYXRhLnVzZXJFbWFpbCxcclxuICAvLyAgICAgICAgIHVzZXJOYW1lOiBkYXRhLnVzZXJOYW1lLFxyXG4gIC8vICAgICAgICAgdXNlclBob25lOiBkYXRhPy51c2VyUGhvbmUsXHJcbiAgLy8gICAgICAgICBjaXR5OiBkYXRhPy5jaXR5XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuXHJcbiAgLy8gICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgLy8gICAgICAgaWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAvLyAgICAgICB1cGxvYWRVc2VyOiB0cnVlLFxyXG4gIC8vICAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGEuY2xpZW50LFxyXG4gIC8vICAgICAgIGFzc2lnbmVkVXNlcnM6IGFzc2lnbkxpc3RcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgdGhpcy51cGxvYWRBc3NpZ25lZXNMaXN0KHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAocmVzPy5kYXRhPy52YWxpZGF0ZSkge1xyXG4gIC8vICAgICAgICAgICB0aGlzLmdldEFzc2lnblRhYmxlKClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGlmIChyZXM/LmRhdGE/LnVzZXI/Lmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBjb25zdCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgLy8gICAgICAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gIC8vICAgICAgICAgICAgIGltYWdlc3JjOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiLz48cGF0aCBkPVwiTTI3Ljk5OTggMjQuMDAxMlYyOC4wMDEyTTI3Ljk5OTggMzIuMDAxMkgyOC4wMDk4TTI2LjI4OTggMTguODYxMkwxNy44MTk4IDMzLjAwMTJDMTcuNjQ1MSAzMy4zMDM2IDE3LjU1MjcgMzMuNjQ2NSAxNy41NTE4IDMzLjk5NTdDMTcuNTUwOCAzNC4zNDQ5IDE3LjY0MTMgMzQuNjg4MyAxNy44MTQyIDM0Ljk5MTdDMTcuOTg3MSAzNS4yOTUxIDE4LjIzNjUgMzUuNTQ3OSAxOC41Mzc1IDM1LjcyNUMxOC44Mzg1IDM1LjkwMjEgMTkuMTgwNiAzNS45OTczIDE5LjUyOTggMzYuMDAxMkgzNi40Njk4QzM2LjgxOSAzNS45OTczIDM3LjE2MTEgMzUuOTAyMSAzNy40NjIxIDM1LjcyNUMzNy43NjMxIDM1LjU0NzkgMzguMDEyNCAzNS4yOTUxIDM4LjE4NTQgMzQuOTkxN0MzOC4zNTgzIDM0LjY4ODMgMzguNDQ4OCAzNC4zNDQ5IDM4LjQ0NzggMzMuOTk1N0MzOC40NDY4IDMzLjY0NjUgMzguMzU0NCAzMy4zMDM2IDM4LjE3OTggMzMuMDAxMkwyOS43MDk4IDE4Ljg2MTJDMjkuNTMxNSAxOC41NjczIDI5LjI4MDUgMTguMzI0MyAyOC45ODEgMTguMTU1N0MyOC42ODE0IDE3Ljk4NyAyOC4zNDM1IDE3Ljg5ODQgMjcuOTk5OCAxNy44OTg0QzI3LjY1NiAxNy44OTg0IDI3LjMxODEgMTcuOTg3IDI3LjAxODYgMTguMTU1N0MyNi43MTkxIDE4LjMyNDMgMjYuNDY4IDE4LjU2NzMgMjYuMjg5OCAxOC44NjEyWlwiIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+PC9zdmc+JyxcclxuICAvLyAgICAgICAgICAgICB0aXRsZTogYEludml0ZSBuZXcgdXNlcnMgYWRkZWQgaW4gQ1NWYCxcclxuICAvLyAgICAgICAgICAgICBjb250ZW50OiBgVGhpcyBDU1YgY29udGFpbnMgbmV3IHVzZXJzLiBJbnZpdGUgdXNlcnMgYnkgc2VuZGluZyBtYWlsIHRvIHRoZW1gLFxyXG4gIC8vICAgICAgICAgICAgIGJ1dHRvbnR5cGU6ICdJbnZpdGUnLFxyXG4gIC8vICAgICAgICAgICAgIHVzZXI6IHJlcy5kYXRhLnVzZXJcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFRyYXhwb3B1cENvbXBvbmVudCwge1xyXG4gIC8vICAgICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnXHJcbiAgLy8gICAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgICAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IHBvcHVwY29udGVudDtcclxuICAvLyAgICAgICAgICAgZGlhbG9nUmVmLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuICAvLyAgICAgICAgICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgPT09ICdjb25maXJtJykge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAvLyAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAvLyAgICAgICAgICAgICAgICAgdXBsb2FkVXNlcjogdHJ1ZSxcclxuICAvLyAgICAgICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YS5jbGllbnQsXHJcbiAgLy8gICAgICAgICAgICAgICAgIGFzc2lnbmVkVXNlcnM6IGFzc2lnbkxpc3RcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkQXNzaWduZWVzTGlzdChwYXlsb2FkLCB7IGFkZFVzZXI6IHRydWUgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFzc2lnblRhYmxlKClcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgfSlcclxuICAvLyAgICAgICAgICAgICB9XHJcblxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGlmIChyZXM/LmRhdGE/LnN0b3JlPy5sZW5ndGgpIHtcclxuICAvLyAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0TWVzc2FnZXMobWVzc2FnZXM6IGFueVtdKTogc3RyaW5nIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBncm91cGVkTWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xyXG5cclxuICAvLyAgICAgICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKCh7IHN0b3JlLCBtZXNzYWdlIH0pID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIGlmICghZ3JvdXBlZE1lc3NhZ2VzW3N0b3JlXSkge1xyXG4gIC8vICAgICAgICAgICAgICAgICBncm91cGVkTWVzc2FnZXNbc3RvcmVdID0gW107XHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICBncm91cGVkTWVzc2FnZXNbc3RvcmVdLnB1c2gobWVzc2FnZSk7XHJcbiAgLy8gICAgICAgICAgICAgfSk7XHJcblxyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZE1lc3NhZ2VzID0gT2JqZWN0LmVudHJpZXMoZ3JvdXBlZE1lc3NhZ2VzKS5tYXAoKFtzdG9yZSwgbXNnc10pID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIHJldHVybiBgJHttc2dzLmpvaW4oJywgJyl9IGluICR7c3RvcmV9YDtcclxuICAvLyAgICAgICAgICAgICB9KTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZE1lc3NhZ2VzLmpvaW4oJywgJyk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChmb3JtYXRNZXNzYWdlcyhyZXM/LmRhdGE/LnN0b3JlKSlcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9LFxyXG4gIC8vICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgLy8gICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8ICdTb21ldGhpbmcgd2VudCB3cm9uZycpXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBhZGRTdG9yZUNvbXBvbmVudCgpIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVHJheFN0b3JlQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IHtcclxuICAgICAgY2hlY2tsaXN0SWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAgICAgb2JqOiB7XHJcbiAgICAgICAgY2hlY2tMaXN0SWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhLmNsaWVudCxcclxuICAgICAgfSxcclxuICAgICAgY292ZXJhZ2U6IHRoaXMuY292ZXJhZ2UsXHJcbiAgICB9O1xyXG5cclxuICAgIGRpYWxvZ1JlZi5yZXN1bHQudGhlbigocmVzKSA9PiB7XHJcbiAgICAgIGlmKHJlcykge1xyXG4gICAgICAgIHRoaXMudXNlckRhdGEgPSByZXM7XHJcbiAgICAgICAgdGhpcy51cGxvYWQgPSAnc3RvcmUnO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGVEZXRhaWxzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGRpYWxvZ1JlZi5yZXN1bHQudGhlbigocmVzKSA9PiB7XHJcbiAgICAvLyAgIGlmIChyZXMpIHtcclxuICAgIC8vICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgLy8gICAgICAgaWQ6IHRoaXMuY3VycmVudFRhc2tJZCxcclxuICAgIC8vICAgICAgIHVwbG9hZFVzZXI6IHRydWUsXHJcbiAgICAvLyAgICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhLmNsaWVudCxcclxuICAgIC8vICAgICAgIGFzc2lnbmVkVXNlcnM6IHJlc1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgdGhpcy51cGxvYWRBc3NpZ25lZXNMaXN0KHBheWxvYWQsIHsgZGVsZXRlOiBmYWxzZSB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgICAgIG5leHQ6IChyZXMxOiBhbnkpID0+IHtcclxuICAgIC8vICAgICAgICAgaWYgKHJlczEuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgaWYgKHJlczE/LmRhdGE/LnVzZXI/Lmxlbmd0aCkge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgcG9wdXBjb250ZW50ID0ge1xyXG4gICAgLy8gICAgICAgICAgICAgICBkaXNwbGF5cHJvcDogZmFsc2UsXHJcbiAgICAvLyAgICAgICAgICAgICAgIGltYWdlc3JjOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiLz48cGF0aCBkPVwiTTI3Ljk5OTggMjQuMDAxMlYyOC4wMDEyTTI3Ljk5OTggMzIuMDAxMkgyOC4wMDk4TTI2LjI4OTggMTguODYxMkwxNy44MTk4IDMzLjAwMTJDMTcuNjQ1MSAzMy4zMDM2IDE3LjU1MjcgMzMuNjQ2NSAxNy41NTE4IDMzLjk5NTdDMTcuNTUwOCAzNC4zNDQ5IDE3LjY0MTMgMzQuNjg4MyAxNy44MTQyIDM0Ljk5MTdDMTcuOTg3MSAzNS4yOTUxIDE4LjIzNjUgMzUuNTQ3OSAxOC41Mzc1IDM1LjcyNUMxOC44Mzg1IDM1LjkwMjEgMTkuMTgwNiAzNS45OTczIDE5LjUyOTggMzYuMDAxMkgzNi40Njk4QzM2LjgxOSAzNS45OTczIDM3LjE2MTEgMzUuOTAyMSAzNy40NjIxIDM1LjcyNUMzNy43NjMxIDM1LjU0NzkgMzguMDEyNCAzNS4yOTUxIDM4LjE4NTQgMzQuOTkxN0MzOC4zNTgzIDM0LjY4ODMgMzguNDQ4OCAzNC4zNDQ5IDM4LjQ0NzggMzMuOTk1N0MzOC40NDY4IDMzLjY0NjUgMzguMzU0NCAzMy4zMDM2IDM4LjE3OTggMzMuMDAxMkwyOS43MDk4IDE4Ljg2MTJDMjkuNTMxNSAxOC41NjczIDI5LjI4MDUgMTguMzI0MyAyOC45ODEgMTguMTU1N0MyOC42ODE0IDE3Ljk4NyAyOC4zNDM1IDE3Ljg5ODQgMjcuOTk5OCAxNy44OTg0QzI3LjY1NiAxNy44OTg0IDI3LjMxODEgMTcuOTg3IDI3LjAxODYgMTguMTU1N0MyNi43MTkxIDE4LjMyNDMgMjYuNDY4IDE4LjU2NzMgMjYuMjg5OCAxOC44NjEyWlwiIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+PC9zdmc+JyxcclxuICAgIC8vICAgICAgICAgICAgICAgdGl0bGU6IGBJbnZpdGUgbmV3IHVzZXJzIGFkZGVkIGluIENTVmAsXHJcbiAgICAvLyAgICAgICAgICAgICAgIGNvbnRlbnQ6IGBUaGlzIENTViBjb250YWlucyBuZXcgdXNlcnMuIEludml0ZSB1c2VycyBieSBzZW5kaW5nIG1haWwgdG8gdGhlbWAsXHJcbiAgICAvLyAgICAgICAgICAgICAgIGJ1dHRvbnR5cGU6ICdJbnZpdGUnLFxyXG4gICAgLy8gICAgICAgICAgICAgICB1c2VyOiByZXMxLmRhdGEudXNlclxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUcmF4cG9wdXBDb21wb25lbnQsIHtcclxuICAgIC8vICAgICAgICAgICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCdcclxuICAgIC8vICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICAgICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRhdGEgPSBwb3B1cGNvbnRlbnQ7XHJcbiAgICAvLyAgICAgICAgICAgICBkaWFsb2dSZWYucmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgPT09ICdjb25maXJtJykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5jdXJyZW50VGFza0lkLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgdXBsb2FkVXNlcjogdHJ1ZSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGEuY2xpZW50LFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgYXNzaWduZWRVc2VyczogcmVzXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkQXNzaWduZWVzTGlzdChwYXlsb2FkLCB7IGRlbGV0ZTogZmFsc2UsIGFkZFVzZXI6IHRydWUgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QXNzaWduVGFibGUoKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0pXHJcbiAgICAvLyAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5nZXRBc3NpZ25UYWJsZSgpXHJcbiAgICAvLyAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yKVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0pXHJcblxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0U3RvcmVDb3VudHMoZGF0YTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5zdG9yZUNvdmVyYWdlKSB7XHJcbiAgICAgIGNvbnN0IHVuaXF1ZVN0b3JlTmFtZXMgPSBuZXcgU2V0KGRhdGEubWFwKChpdGVtOmFueSkgPT4gaXRlbS5zdG9yZU5hbWUpKTtcclxuICAgICAgcmV0dXJuIHVuaXF1ZVN0b3JlTmFtZXMuc2l6ZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy51c2VyQ292ZXJhZ2UpIHtcclxuICAgICAgY29uc3QgdW5pcXVlVXNlck5hbWVzID0gbmV3IFNldChkYXRhLm1hcCgoaXRlbTphbnkpID0+IGl0ZW0udXNlck5hbWUpKTtcclxuICAgICAgcmV0dXJuIHVuaXF1ZVVzZXJOYW1lcy5zaXplO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBsb2FkQXNzaWduZWVzTGlzdChwYXlsb2FkOiBhbnksIGV4dHJhQXJncz86IGFueSkge1xyXG4gICAgY29uc3QgcmVxUGF5bG9hZCA9IHtcclxuICAgICAgLi4ucGF5bG9hZCxcclxuICAgICAgLi4uZXh0cmFBcmdzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50cmF4U2VydmljZS51cGxvYWRUYXNrQXNzaWduZWVzKHJlcVBheWxvYWQpXHJcbiAgfVxyXG5cclxuICBnZXRGb3JtQ29udHJvbEZyb21BcnJheShpbmRleDogbnVtYmVyKTogRm9ybUNvbnRyb2wge1xyXG4gICAgcmV0dXJuIHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuYXQoaW5kZXgpIGFzIEZvcm1Db250cm9sO1xyXG4gIH1cclxuXHJcbiAgYWRkTW9yZVNjaGVkdWxlcygpIHtcclxuICAgIGNvbnN0IHNjaGVkdWxlVmFsdWUgPSB0aGlzLnJlbWluZGVyUmVwZWF0U2NoZWR1bGVPcHRpb25zLmZpbHRlcigodmFsKSA9PiAhdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcz8udmFsdWUuaW5jbHVkZXModmFsKSlcclxuICAgIGlmICh0aGlzLnJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmxlbmd0aCA8IDMpIHtcclxuICAgICAgdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5wdXNoKHRoaXMuZmIuY29udHJvbChzY2hlZHVsZVZhbHVlWzBdKSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRpc2FibGVTY2hlZHVsZU9wdGlvbihvcHRpb246IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMudmFsdWUuaW5jbHVkZXMob3B0aW9uKVxyXG4gIH1cclxuXHJcbiAgZW5hYmxlUmVtaW5kZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgIHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY2xlYXIoKVxyXG4gICAgICB0aGlzLnJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLnB1c2godGhpcy5mYi5jb250cm9sKHRoaXMucmVtaW5kZXJSZXBlYXRTY2hlZHVsZU9wdGlvbnNbMF0pKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5jbGVhcigpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJyk7XHJcbiAgfVxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIC8vIEFkZCBhIHZpc3VhbCBlZmZlY3QgdG8gaW5kaWNhdGUgZHJhZyBpcyBvdmVyIHRoZSBhcmVhXHJcbiAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuYWRkKCdkcmFnLW92ZXInKTtcclxuICB9XHJcblxyXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJyk7XHJcblxyXG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXNbMF07XHJcbiAgICAgIGNvbnN0IGZpbGVJbnB1dEVsZW1lbnQgPSB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgLy8gTWFudWFsbHkgc2V0IHRoZSBmaWxlIHRvIHRoZSBpbnB1dFxyXG4gICAgICBjb25zdCBkYXRhVHJhbnNmZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XHJcbiAgICAgIGRhdGFUcmFuc2Zlci5pdGVtcy5hZGQoZmlsZSk7XHJcbiAgICAgIGZpbGVJbnB1dEVsZW1lbnQuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XHJcblxyXG4gICAgICAvLyBUcmlnZ2VyIHRoZSBjaGFuZ2UgZXZlbnQgbWFudWFsbHlcclxuICAgICAgZmlsZUlucHV0RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjLWNhcmQgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbcm91dGVyTGlua109XCInL21hbmFnZS90cmF4L2NoZWNrbGlzdC9tYW5hZ2V0YXNrJ1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZSBtZS01IHB4LTMgcHktM1wiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuODMzMiAxMC4wMDAzSDQuMTY2NU00LjE2NjUgMTAuMDAwM0w5Ljk5OTg0IDE1LjgzMzdNNC4xNjY1IDEwLjAwMDNMOS45OTk4NCA0LjE2Njk5XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGFza0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tsaXN0LW5hbWUgbWItNVwiPnt7dGFza0RldGFpbHMuY2hlY2tMaXN0TmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrbGlzdC1kZXNjXCI+e3t0YXNrRGV0YWlscy5jaGVja0xpc3REZXNjcmlwdGlvbn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHB5LTMgbWUtNVwiIChjbGljayk9XCJkZXRhc3NpZ25VcGRhdGUoJ3B1Ymxpc2gnKVwiPlB1Ymxpc2g8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiZGV0YXNzaWduVXBkYXRlKCdzYXZlJylcIj5TYXZlIGFzIERyYWZ0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiA4MHZoOyBvdmVyZmxvdy15OiBhdXRvO1wiIGNsYXNzPVwiYy1jYXJkXCI+XHJcbiAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1iLTVcIj5TY2hlZHVsZTwvaDI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm1lLTRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE2IDJWNk04IDJWNk0zIDEwSDIxTTUgNEgxOUMyMC4xMDQ2IDQgMjEgNC44OTU0MyAyMSA2VjIwQzIxIDIxLjEwNDYgMjAuMTA0NiAyMiAxOSAyMkg1QzMuODk1NDMgMjIgMyAyMS4xMDQ2IDMgMjBWNkMzIDQuODk1NDMgMy44OTU0MyA0IDUgNFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NoZWR1bGUtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ZHVlRGF0ZUZvcm1hdHRlZH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJtZS00XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiA2VjEyTDE2IDE0TTIyIDEyQzIyIDE3LjUyMjggMTcuNTIyOCAyMiAxMiAyMkM2LjQ3NzE1IDIyIDIgMTcuNTIyOCAyIDEyQzIgNi40NzcxNSA2LjQ3NzE1IDIgMTIgMkMxNy41MjI4IDIgMjIgNi40NzcxNSAyMiAxMlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NoZWR1bGUtdGV4dFwiPnt7ZHVlVGltZUZvcm1hdHRlZH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGgyIGNsYXNzPVwibWItNVwiPkFzc2lnbjwvaDI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm1lLTRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE2IDRIMThDMTguNTMwNCA0IDE5LjAzOTEgNC4yMTA3MSAxOS40MTQyIDQuNTg1NzlDMTkuNzg5MyA0Ljk2MDg2IDIwIDUuNDY5NTcgMjAgNlYyMEMyMCAyMC41MzA0IDE5Ljc4OTMgMjEuMDM5MSAxOS40MTQyIDIxLjQxNDJDMTkuMDM5MSAyMS43ODkzIDE4LjUzMDQgMjIgMTggMjJINkM1LjQ2OTU3IDIyIDQuOTYwODYgMjEuNzg5MyA0LjU4NTc5IDIxLjQxNDJDNC4yMTA3MSAyMS4wMzkxIDQgMjAuNTMwNCA0IDIwVjZDNCA1LjQ2OTU3IDQuMjEwNzEgNC45NjA4NiA0LjU4NTc5IDQuNTg1NzlDNC45NjA4NiA0LjIxMDcxIDUuNDY5NTcgNCA2IDRIOE05IDJIMTVDMTUuNTUyMyAyIDE2IDIuNDQ3NzIgMTYgM1Y1QzE2IDUuNTUyMjggMTUuNTUyMyA2IDE1IDZIOUM4LjQ0NzcyIDYgOCA1LjU1MjI4IDggNVYzQzggMi40NDc3MiA4LjQ0NzcyIDIgOSAyWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY2hlZHVsZS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tjb3ZlcmFnZX19c1xyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwibWUtNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy4wODk5NSA2Ljg4MzgxTDMuMDI0MDEgNi45ODY4MUMyLjMwMzU4IDguMjU1NjkgMy4wNjEwMSA5Ljg3OTU3IDQuNDY0NjQgMTAuMDY2NEM0LjU4NjI3IDEwLjA4MTMgNC43MDExMiAxMC4wODk0IDQuODE0NSAxMC4wODk0QzUuNTUyNTUgMTAuMDg5NCA2LjIwNTIzIDkuNzcyNDEgNi42NTk1MyA5LjI3OTI5TDcuMjEyODYgOC42Nzg2N0w3Ljc2NDMyIDkuMjgxMDFDOC4yMTM2NyA5Ljc3MTg0IDguODY1MiAxMC4wODk0IDkuNjA3NzYgMTAuMDg5NEMxMC4zNDcxIDEwLjA4OTQgMTEuMDAyMiA5Ljc3MTQ5IDExLjQ1MTIgOS4yODEwMUwxMi4wMDQ0IDguNjc2NzdMMTIuNTU3NiA5LjI4MTAxQzEzLjAwNjYgOS43NzE0OSAxMy42NjE3IDEwLjA4OTQgMTQuNDAxIDEwLjA4OTRDMTUuMTQwNCAxMC4wODk0IDE1Ljc5NTQgOS43NzE0OSAxNi4yNDQ1IDkuMjgxMDFMMTYuNzk3NyA4LjY3Njc4TDE3LjM1MDggOS4yODEwMUMxNy43OTk5IDkuNzcxNDkgMTguNDU0OSAxMC4wODk0IDE5LjE5NDMgMTAuMDg5NEMxOS4zMDQxIDEwLjA4OTQgMTkuNDIyMyAxMC4wODEyIDE5LjU0MzMgMTAuMDY2NUMyMC45NzcyIDkuODcxOCAyMS43MzU1IDguMTY0IDIwLjkxNTUgNi44ODQzMUMyMC45MTU0IDYuODg0MjUgMjAuOTE1NCA2Ljg4NDIgMjAuOTE1NCA2Ljg4NDE0TDE4LjgwNTYgMy41OTQ0MUwxOC44MDU2IDMuNTk0NDFMMTguODA0NiAzLjU5Mjk0QzE4Ljc1ODIgMy41MjAxNCAxOC42NjQ5IDMuNDY0MzYgMTguNTU4NCAzLjQ2NDM2SDUuNDQzMDdDNS4zMzY1IDMuNDY0MzYgNS4yNDMyNiAzLjUyMDE0IDUuMTk2ODEgMy41OTI5NUw1LjE5NjE5IDMuNTkzOTFMMy4wODk5NSA2Ljg4MzgxWk00LjgxODE4IDEyLjc1MDFDNC43MTY0NCAxMi43NTAxIDQuNjE2IDEyLjc0NyA0LjUxNjkgMTIuNzQxMVYxNi42NDI5VjE4Ljk2NDRDNC41MTY5IDE5LjgyMTIgNS4yMjY2MyAyMC41MzU4IDYuMTE5NDIgMjAuNTM1OEgxNy44ODJDMTguNzc0OCAyMC41MzU4IDE5LjQ4NDUgMTkuODIxMiAxOS40ODQ1IDE4Ljk2NDRWMTYuNjQyOVYxMi43NDE2QzE5LjM4NzQgMTIuNzQ3MSAxOS4yODkzIDEyLjc1MDEgMTkuMTkwNiAxMi43NTAxQzE5LjAwMjIgMTIuNzUwMSAxOC44MTU3IDEyLjc0IDE4LjYzMiAxMi43MjAzVjE2LjY0MjlWMTcuMzkyOUgxNy44ODJINi4xMTk0Mkg1LjM2OTQyVjE2LjY0MjlWMTIuNzIxMUM1LjE4ODY2IDEyLjc0MDIgNS4wMDQ3MiAxMi43NTAxIDQuODE4MTggMTIuNzUwMVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY2hlZHVsZS10ZXh0XCI+e3thc3NpZ25TaW5nbGU/Lmxlbmd0aCArIGdyb3VwQXNzaWduPy5sZW5ndGh9fSB7e2NvdmVyYWdlfX17eyhhc3NpZ25TaW5nbGU/Lmxlbmd0aCArIGdyb3VwQXNzaWduPy5sZW5ndGgpID4gMSA/ICdzJzonJ319PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDgwdmg7IG92ZXJmbG93LXk6IGF1dG87XCIgY2xhc3M9XCJjLWNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRhdGVwaWNrXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+RHVlIGRhdGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAxMnB4OyBsZWZ0OjEycHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMy4zMzMzIDEuNjY2NjNWNC45OTk5Nk02LjY2NjY3IDEuNjY2NjNWNC45OTk5Nk0yLjUgOC4zMzMyOUgxNy41TTQuMTY2NjcgMy4zMzMyOUgxNS44MzMzQzE2Ljc1MzggMy4zMzMyOSAxNy41IDQuMDc5NDggMTcuNSA0Ljk5OTk2VjE2LjY2NjZDMTcuNSAxNy41ODcxIDE2Ljc1MzggMTguMzMzMyAxNS44MzMzIDE4LjMzMzNINC4xNjY2N0MzLjI0NjE5IDE4LjMzMzMgMi41IDE3LjU4NzEgMi41IDE2LjY2NjZWNC45OTk5NkMyLjUgNC4wNzk0OCAzLjI0NjE5IDMuMzMzMjkgNC4xNjY2NyAzLjMzMzI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJkYXRlcGlja1wiIGNsYXNzPVwiZngtZGF0ZS1yYW5nZSBmb3JtLWNvbnRyb2wgcHMtMTRcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4RGF0ZXJhbmdlcGlja2VyTWQgW3NpbmdsZURhdGVQaWNrZXJdPVwidHJ1ZVwiIFttaW5EYXRlXT1cIm1pbkRhdGVcIiBbZHJvcHNdPVwiJ2Rvd24nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3BlbnNdPVwiJ3JpZ2h0J1wiIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCIgW2tlZXBDYWxlbmRhck9wZW5pbmdXaXRoUmFuZ2VdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDYW5jZWxdPVwidHJ1ZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFsobmdNb2RlbCldPVwic2NoZWR1bGVEYXRlXCIgW2F1dG9BcHBseV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0RELU1NLVlZWVknLCBmaXJzdERheTogMSwgbW9udGhOYW1lczogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ10gfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRhdGVyYW5nZVwiIFtyZWFkb25seV09XCJ0cnVlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGltZVBpY2tcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5EdWUgdGltZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbF09XCJzY2hlZHVsZUVuZFRpbWVcIiB0eXBlPVwidGltZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJ0aW1lUGlja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QXBwcm92ZXI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItY2hpcC1kcm9wZG93biBbZGF0YV09XCJhcHByb3ZlcnNMaXN0XCIgW3NlbGVjdGVkRGF0YV09XCJhcHByb3Zlci52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZExpc3QpPVwib25BcHByb3ZlQWRkZWQoJGV2ZW50KVwiPjwvbGliLWNoaXAtZHJvcGRvd24+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcmlvcml0eVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlByaW9yaXR5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IFtmb3JtQ29udHJvbF09XCJwcmlvcml0eVR5cGVcIiBpZD1cInByaW9yaXR5XCIgY2xhc3M9XCJmb3JtLXNlbGVjdCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJoaWdoXCI+SGlnaDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWVkaXVtXCI+TWVkaXVtPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJsb3dcIj5Mb3c8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtY2FyZFwiIFtuZ0NsYXNzXT1cImFsbG93ZWRTdG9yZUxvY2F0aW9uLnZhbHVlID8gJ3NlbGVjdGVkJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xdPVwiYWxsb3dlZFN0b3JlTG9jYXRpb25cIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJzd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+R2VvIGZlbmNpbmc8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjXCI+QnkgZW5hYmxpbmcsIHRoZSBjaGVja2xpc3QgY2FuIGJlIGZpbGxlZCBieSB0aGUgdXNlciBvbmx5IHdoZW4gaW5zaWRlIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWNhcmQgXCIgW25nQ2xhc3NdPVwicmVzdHJpY3RBdHRlbmRhbmNlLnZhbHVlID8gJ3NlbGVjdGVkJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xdPVwicmVzdHJpY3RBdHRlbmRhbmNlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwic3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlJlc3RyaWN0IGF0dGVuZGFuY2U8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjXCI+QnkgZW5hYmxpbmcsIHVzZXIgY2FuJ3QgYmUgYWJsZSB0byBjbG9ja291dCB3aXRob3V0IGNvbXBsZXRpbmcgdGhlIHRhc2suXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyZW1pbmRlci1oZWFkZXIgbWUtNFwiIGZvcj1cInJlbWluZGVyVG9nZ2xlXCI+UmVtaW5kZXI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cInJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmNvbnRyb2xzLmxlbmd0aFwiIChjaGFuZ2UpPVwiZW5hYmxlUmVtaW5kZXIoJGV2ZW50KVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIHJvbGU9XCJzd2l0Y2hcIiBpZD1cInJlbWluZGVyVG9nZ2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZW1pbmRlci1kZXNjcmlwdGlvbiBtYi01XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCeSBlbmFibGluZywgdGhlIHVzZXJzIHdpbGwgYmUgcmVtaW5kZWQgaW4gdGhlIHNlbGVjdGVkIGludGVydmFsICBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItNVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmNvbnRyb2xzLmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZW1pbmRlci1zdWIgbWUtNFwiID5Ob3RpZnkgdXNlciBiZWZvcmU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgcmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgdy0yMDBweCBtZS00XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNDg3XzQ3NjM2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC4wMDEzIDUuMDAwMzNWMTAuMDAwM0wxMy4zMzQ2IDExLjY2N00xOC4zMzQ2IDEwLjAwMDNDMTguMzM0NiAxNC42MDI3IDE0LjYwMzcgMTguMzMzNyAxMC4wMDEzIDE4LjMzMzdDNS4zOTg5MyAxOC4zMzM3IDEuNjY3OTcgMTQuNjAyNyAxLjY2Nzk3IDEwLjAwMDNDMS42Njc5NyA1LjM5Nzk1IDUuMzk4OTMgMS42NjY5OSAxMC4wMDEzIDEuNjY2OTlDMTQuNjAzNyAxLjY2Njk5IDE4LjMzNDYgNS4zOTc5NSAxOC4zMzQ2IDEwLjAwMDNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE0ODdfNDc2MzZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiZ2V0Rm9ybUNvbnRyb2xGcm9tQXJyYXkoaSlcIiBjbGFzcz1cImZvcm0tc2VsZWN0IHBzLTE0IG1lLTVcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHJlbWluZGVyUmVwZWF0U2NoZWR1bGVPcHRpb25zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nQ2xhc3NdPVwiZGlzYWJsZVNjaGVkdWxlT3B0aW9uKGl0ZW0pID8gJ2Qtbm9uZScgOiAnJ1wiICBbbmdWYWx1ZV09XCJpdGVtXCIgPnt7aXRlbX19IG1pbnM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY29udHJvbHMubGVuZ3RoICA+IDAgJiYgcmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY29udHJvbHMubGVuZ3RoICA8IDMgXCIgY2xhc3M9XCJtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFkZE1vcmVTY2hlZHVsZXMoKVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZSBoLTEwMFwiID48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMTMgNC4xNjY5OVYxNS44MzM3TTQuMTY3OTcgMTAuMDAwM0gxNS44MzQ2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbWluZGVyLXN1YiBtZS00XCIgPjxzcGFuICpuZ0lmPVwicmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuY29udHJvbHM/LlswXVwiID5TZW5kIEFsZXJ0cyB7e3JlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmF0KDApLnZhbHVlfX0gTWluczwvc3Bhbj48c3BhbiAqbmdJZj1cInJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmNvbnRyb2xzPy5bMV1cIj4sIHt7cmVtaW5kZXJSZXBlYXRTY2hlZHVsZXMuYXQoMSkudmFsdWV9fSBNaW5zIDwvc3Bhbj48c3BhbiAqbmdJZj1cInJlbWluZGVyUmVwZWF0U2NoZWR1bGVzLmNvbnRyb2xzPy5bMl1cIj5hbmQge3tyZW1pbmRlclJlcGVhdFNjaGVkdWxlcy5hdCgyKS52YWx1ZX19IE1pbnM8L3NwYW4+IGJlZm9yZSB0aGUgY2hlY2tsaXN0IGVuZCB0aW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkFzc2lnbjwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi01IG1zLTUgZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBzZWxlY3RlZC1yYWRpbyBjdXJzb3ItcG9pbnRlciBtZS0zXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN0b3Jlc1wiIFtjaGVja2VkXT1cInN0b3JlQ292ZXJhZ2VcIiAoY2xpY2spPVwic2VsZWN0UmFkaW8oJ3N0b3JlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInVwbG9hZHRleHQgY3Vyc29yLXBvaW50ZXIgZnctc2VtaWJvbGRcIj5Bc3NpZ24gU3RvcmVzIGFuZCBDbHVzdGVyczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtcy01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBzZWxlY3RlZC1yYWRpbyBjdXJzb3ItcG9pbnRlciBtZS0zXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInVzZXJzXCIgW2NoZWNrZWRdPVwidXNlckNvdmVyYWdlXCIgKGNsaWNrKT1cInNlbGVjdFJhZGlvKCd1c2VyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInVwbG9hZHRleHQgY3Vyc29yLXBvaW50ZXIgZnctc2VtaWJvbGRcIj5Bc3NpZ24gVXNlcnMgYW5kIFRlYW1zPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXMtNSBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBvdmVyZmxvdy1hdXRvIGgtNDVweCB3LTc1IG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInN0b3JlQ292ZXJhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2IG5hdi1zdHJldGNoIG5hdi1saW5lLXRhYnMgbmF2LWxpbmUtdGFicy0yeCBib3JkZXItdHJhbnNwYXJlbnQgZnMtNSBmdy1ib2xkZXIgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cInNlbGVjdGVkVGFiKCdzdG9yZScpXCIgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlciBoLTEwMFwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhc3NpZ25UeXBlID09PSdzdG9yZScgPyAnYWN0aXZlIGJnLWxpZ2h0LXByaW1hcnkgdGV4dC1wcmltYXJ5JyA6JydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGluayB0ZXh0LWFjdGl2ZS1wcmltYXJ5IG0tMCBweC01XCI+U3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIChjbGljayk9XCJzZWxlY3RlZFRhYignY2x1c3RlcicpXCIgY2xhc3M9XCJuYXYtaXRlbSBjdXJzb3ItcG9pbnRlciBoLTEwMFwiPjxhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhc3NpZ25UeXBlID09PSdjbHVzdGVyJyA/ICdhY3RpdmUgYmctbGlnaHQtcHJpbWFyeSB0ZXh0LXByaW1hcnknIDonJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rIHRleHQtYWN0aXZlLXByaW1hcnkgbS0wIHB4LTVcIj5DbHVzdGVyczwvYT48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInVzZXJDb3ZlcmFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYgbmF2LXN0cmV0Y2ggbmF2LWxpbmUtdGFicyBuYXYtbGluZS10YWJzLTJ4IGJvcmRlci10cmFuc3BhcmVudCBmcy01IGZ3LWJvbGRlciBmbGV4LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwic2VsZWN0ZWRUYWIoJ3VzZXInKVwiIGNsYXNzPVwibmF2LWl0ZW0gY3Vyc29yLXBvaW50ZXIgaC0xMDBcIj48YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYXNzaWduVHlwZSA9PT0ndXNlcicgPyAnYWN0aXZlIGJnLWxpZ2h0LXByaW1hcnkgdGV4dC1wcmltYXJ5JyA6JydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGluayB0ZXh0LWFjdGl2ZS1wcmltYXJ5IG0tMCBweC01XCI+VXNlcnM8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cInNlbGVjdGVkVGFiKCd0ZWFtJylcIiBjbGFzcz1cIm5hdi1pdGVtIGN1cnNvci1wb2ludGVyIGgtMTAwXCI+PGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFzc2lnblR5cGUgPT09J3RlYW0nID8gJ2FjdGl2ZSBiZy1saWdodC1wcmltYXJ5IHRleHQtcHJpbWFyeScgOicnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmsgdGV4dC1hY3RpdmUtcHJpbWFyeSBtLTAgcHgtNVwiPlRlYW1zPC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFbJ2NsdXN0ZXInLCd0ZWFtJ10uaW5jbHVkZXMoYXNzaWduVHlwZSlcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdG9yZUNvdmVyYWdlXCIgIChjbGljayk9XCJhZGRTdG9yZUNvbXBvbmVudCgpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcHgtNCBuZy1zdGFyLWluc2VydGVkIG10LThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC4wMDAxIDQuMTY2MDJWMTUuODMyN000LjE2Njc1IDkuOTk5MzVIMTUuODMzNFwiIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QXNzaWduIFN0b3JlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckNvdmVyYWdlXCIgKGNsaWNrKT1cImFkZFN0b3JlQ29tcG9uZW50KClcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBweC00IG5nLXN0YXItaW5zZXJ0ZWQgbXQtOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMDEgNC4xNjYwMlYxNS44MzI3TTQuMTY2NzUgOS45OTkzNUgxNS44MzM0XCIgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Bc3NpZ24gVXNlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIG1zLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlciBtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlNlbGVjdGVkIDxzcGFuICpuZ0lmPVwic3RvcmVDb3ZlcmFnZVwiPnt7YXNzaWduVHlwZSB8IHRpdGxlY2FzZX19czwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBtdC0zIHBlLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItbXVsdGktY2hpcC1kcm9wZG93biAqbmdJZj1cInN0b3JlTGlzdCAmJiB0YXNrRGV0YWlsc1wiIFtpdGVtc109XCJzdG9yZUxpc3RcIiBbbXVsdGldPVwidHJ1ZVwiIFtzZWFyY2hGaWVsZF09XCJbJ3N0b3JlTmFtZScsJ2NsdXN0ZXJOYW1lJywnc3RvcmVJZCcsJ3VzZXJOYW1lJywndGVhbU5hbWUnXVwiIFtzZWFyY2hLZXldPVwic2VhcmNoS2V5XCIgW2lkRmllbGRdPVwiJ19pZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJ1cGRhdGVBc3NpZ24oJGV2ZW50KVwiIChyZW1vdmVkKT1cInJlbW92ZWRDaGlwKCRldmVudClcIiBbc2VsZWN0ZWRWYWx1ZXNdPVwidGFza0RldGFpbHMuYXNzaWduXCI+PC9saWItbXVsdGktY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoYXNzaWduVGFibGVBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRlZCcgJiYgdGFibGVBcnJheT8ubGVuZ3RoXCIgY2xhc3M9XCJjYXJkLWJvZHkgcHgtMCBtdC0wIHB0LTAgcGItMCBteC00IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlciBtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5TZWxlY3RlZCA8c3Bhbj57e2Fzc2lnblR5cGUgfCB0aXRsZWNhc2V9fXM8L3NwYW4+IExpc3Q8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xIGFsaWduLWl0ZW1zLWNlbnRlciBwb3NpdGlvbi1hYnNvbHV0ZSBtdC0zIG1zLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4PVwiMVwiIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbF09XCJzZWFyY2hJbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgZGF0YS1rdC1zdWJzY3JpcHRpb24tdGFibGUtZmlsdGVyPVwic2VhcmNoXCIgKGNoYW5nZSk9XCJzZWFyY2hUYWJsZURhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNvbGlkIHctMjAwcHggcHMtNSBteC0xIG1lLTRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cIm5vbmVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIiBzdHlsZT1cInRleHQtdHJhbnNmb3JtOiBub25lXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIj4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFbJ2NsdXN0ZXInLCd0ZWFtJ10uaW5jbHVkZXMoYXNzaWduVHlwZSlcIiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIHctMTAwIG10LTUgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBweS0zIGJ0bi1kZWZhdWx0IHctMTAwIGJ0bi1vdXRsaW5lIGJ0bi1vdXRsaW5lLWRlZmF1bHQgcm91bmRlZC0zIHRleHQtbm93cmFwIGJvcmRlci12YWwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImZpbGUuY2xpY2soKVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPiA8c3BhbiAjdXBsb2FkIGNsYXNzPVwidGVtcGxhdGUtZHJvcGRvd24gbXMtMyBiZy13aGl0ZVwiPkJ1bGtVcGxvYWQgPC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1YnRpdGxlIG14LTMgbWUtMlwiPiB8IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9wZW5Ecm9wZG93bigkZXZlbnQpXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiA5TDEyIDE1TDE4IDlcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgdHlwZT1cImZpbGVcIiAjZmlsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJrdF9hY2NvdW50X3RlYW1fc2l6ZV9zZWxlY3RfMVwiIChjaGFuZ2UpPVwib25GaWxlVXBsb2FkKCRldmVudClcIiAvPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkcm9wRG93blwiIGNsYXNzPVwiY2FyZCB0ZW1wbGF0ZS1kcm9wZG93biBoLTQwcHggdy0xMDAgcG9zaXRpb24tYWJzb2x1dGUgcm91bmRlZC0zIHotMSB0b3AtNTBweCBlbmQtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgbWItMCB3LWF1dG8gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYnVsa3VwbG9hZE1vZGVsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicHgtNSBmdy1zZW1pYm9sZCBjdXJzb3ItcG9pbnRlciBweS0yXCI+RG93bmxvYWQgVGVtcGxhdGU8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJbJ2NsdXN0ZXInLCd0ZWFtJ10uaW5jbHVkZXMoYXNzaWduVHlwZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gcHktMyBidG4tZGVmYXVsdCB3LTEwMCBidG4tb3V0bGluZSBidG4tb3V0bGluZS1kZWZhdWx0IHJvdW5kZWQtMyB0ZXh0LW5vd3JhcCBib3JkZXItdmFsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiIChjbGljayk9XCJkb3dubG9hZFRlbXBsYXRlVjIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMyBjdXJzb3ItcG9pbnRlclwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTI1IDEzLjEyNUgxNi4zNTYyTDE0Ljc0MzggMTQuNzQzOEwxNS42MjUgMTUuNjI1TDE4Ljc1IDEyLjVMMTUuNjI1IDkuMzc1TDE0Ljc0MzggMTAuMjU2MkwxNi4zNTYyIDExLjg3NUg4LjEyNVYxMy4xMjVaXCIgZmlsbD1cImJsYWNrXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjc1IDguNzUwMDFWNi4yNTAwMUMxMy43NTA1IDYuMTY3NzYgMTMuNzM0NyA2LjA4NjIyIDEzLjcwMzYgNi4wMTAwN0MxMy42NzI1IDUuOTMzOTIgMTMuNjI2NyA1Ljg2NDY2IDEzLjU2ODggNS44MDYyNkw5LjE5Mzc1IDEuNDMxMjZDOS4xMzUzNSAxLjM3MzMzIDkuMDY2MDkgMS4zMjc1MSA4Ljk4OTk0IDEuMjk2NEM4LjkxMzc5IDEuMjY1MyA4LjgzMjI1IDEuMjQ5NTMgOC43NSAxLjI1MDAxSDIuNUMyLjE2ODQ4IDEuMjUwMDEgMS44NTA1NCAxLjM4MTcxIDEuNjE2MTIgMS42MTYxM0MxLjM4MTcgMS44NTA1NSAxLjI1IDIuMTY4NDkgMS4yNSAyLjUwMDAxVjE3LjVDMS4yNSAxNy44MzE1IDEuMzgxNyAxOC4xNDk1IDEuNjE2MTIgMTguMzgzOUMxLjg1MDU0IDE4LjYxODMgMi4xNjg0OCAxOC43NSAyLjUgMTguNzVIMTIuNUMxMi44MzE1IDE4Ljc1IDEzLjE0OTUgMTguNjE4MyAxMy4zODM5IDE4LjM4MzlDMTMuNjE4MyAxOC4xNDk1IDEzLjc1IDE3LjgzMTUgMTMuNzUgMTcuNVYxNi4yNUgxMi41VjE3LjVIMi41VjIuNTAwMDFINy41VjYuMjUwMDFDNy41IDYuNTgxNTMgNy42MzE3IDYuODk5NDcgNy44NjYxMiA3LjEzMzg5QzguMTAwNTQgNy4zNjgzMSA4LjQxODQ4IDcuNTAwMDEgOC43NSA3LjUwMDAxSDEyLjVWOC43NTAwMUgxMy43NVpNOC43NSA2LjI1MDAxVjIuNzU2MjZMMTIuMjQzOCA2LjI1MDAxSDguNzVaXCIgZmlsbD1cImJsYWNrXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gPHNwYW4gY2xhc3M9XCJ0ZW1wbGF0ZS1kcm9wZG93biBiZy13aGl0ZSBtcy0zXCI+RXhwb3J0IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoYXNzaWduVGFibGVBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRlZCcgJiYgdGFibGVBcnJheT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTJcIiAqbmdJZj1cInNlYXJjaElucHV0LnZhbHVlICYmICFhc3NpZ25UYWJsZURhdGE/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBteS04IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViXCI+VGhlcmUgaXMgbm8gcmVzdWx0IGZvciB0aGUge3thc3NpZ25UeXBlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTJcIiAqbmdJZj1cIiFzZWFyY2hJbnB1dC52YWx1ZSAmJiAhYXNzaWduVGFibGVEYXRhPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBteS04IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViXCI+VGhlcmUgaXMgbm8gcmVzdWx0IGZvciB0aGUge3thc3NpZ25UeXBlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFzc2lnblRhYmxlRGF0YT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZSBtdC01IG14LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgKm5nSWY9XCJzdG9yZUNvdmVyYWdlXCIgY2xhc3M9XCJ3LTEwMCB0YWJsZSBib3R0b20tYm9yZGVyIHRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWFsaWduLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCdzdG9yZU5hbWUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmUgTmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICdzdG9yZU5hbWUnICYmIHNvcnRCeSAhPT0gMSB8fCBzb3J0Q29sdW1uICE9PSAnc3RvcmVOYW1lJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3N0b3JlTmFtZScgJiYgc29ydEJ5ICE9PSAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEwLjY2NjdMNi4wMDAxNiAxLjMzMzM3TTYuMDAwMTYgMS4zMzMzN0wxLjMzMzUgNi4wMDAwNE02LjAwMDE2IDEuMzMzMzdMMTAuNjY2OCA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1hbGlnbi1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgndXNlck5hbWUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BPQyBOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJOYW1lJyAmJiBzb3J0QnkgIT09IDEgfHwgc29ydENvbHVtbiAhPT0gJ3VzZXJOYW1lJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJOYW1lJyAmJiBzb3J0QnkgIT09IC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuMDAwMTYgMTAuNjY2N0w2LjAwMDE2IDEuMzMzMzdNNi4wMDAxNiAxLjMzMzM3TDEuMzMzNSA2LjAwMDA0TTYuMDAwMTYgMS4zMzMzN0wxMC42NjY4IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWFsaWduLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCd1c2VyRW1haWwnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BPQyBFbWFpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICd1c2VyRW1haWwnICYmIHNvcnRCeSAhPT0gMSB8fCBzb3J0Q29sdW1uICE9PSAndXNlckVtYWlsJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJFbWFpbCcgJiYgc29ydEJ5ICE9PSAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEwLjY2NjdMNi4wMDAxNiAxLjMzMzM3TTYuMDAwMTYgMS4zMzMzN0wxLjMzMzUgNi4wMDAwNE02LjAwMDE2IDEuMzMzMzdMMTAuNjY2OCA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiYXNzaWduVHlwZSA9PT0nY2x1c3RlcidcIiBjbGFzcz1cInRleHQtYWxpZ24tbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ2NsdXN0ZXJOYW1lJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXIgTmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICdjbHVzdGVyTmFtZScgJiYgc29ydEJ5ICE9PSAxIHx8IHNvcnRDb2x1bW4gIT09ICdjbHVzdGVyTmFtZScgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuMDAwMTYgMS4zMzMzN1YxMC42NjY3TTYuMDAwMTYgMTAuNjY2N0wxMC42NjY4IDYuMDAwMDRNNi4wMDAxNiAxMC42NjY3TDEuMzMzNSA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICdjbHVzdGVyTmFtZScgJiYgc29ydEJ5ICE9PSAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEwLjY2NjdMNi4wMDAxNiAxLjMzMzM3TTYuMDAwMTYgMS4zMzMzN0wxLjMzMzUgNi4wMDAwNE02LjAwMDE2IDEuMzMzMzdMMTAuNjY2OCA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGRhdGEgb2YgYXNzaWduVGFibGVEYXRhO2xldCBpPWluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGF0YS5zdG9yZU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGF0YS51c2VyTmFtZSA/IGRhdGEudXNlck5hbWUgOiAnLS0nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RhdGEudXNlckVtYWlsID8gZGF0YS51c2VyRW1haWwgOiAnLS0nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFzc2lnblR5cGUgPT09J2NsdXN0ZXInXCI+e3tkYXRhLmNsdXN0ZXJOYW1lID8gZGF0YS5jbHVzdGVyTmFtZSA6ICctLSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgKm5nSWY9XCJ1c2VyQ292ZXJhZ2VcIiBjbGFzcz1cInctMTAwIHRhYmxlIGJvdHRvbS1ib3JkZXIgdGV4dC1ub3dyYXBcIj4gIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1hbGlnbi1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgndXNlck5hbWUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJOYW1lJyAmJiBzb3J0QnkgIT09IDEgfHwgc29ydENvbHVtbiAhPT0gJ3VzZXJOYW1lJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJOYW1lJyAmJiBzb3J0QnkgIT09IC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuMDAwMTYgMTAuNjY2N0w2LjAwMDE2IDEuMzMzMzdNNi4wMDAxNiAxLjMzMzM3TDEuMzMzNSA2LjAwMDA0TTYuMDAwMTYgMS4zMzMzN0wxMC42NjY4IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWFsaWduLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCd1c2VyRW1haWwnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBFbWFpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRDb2x1bW4gPT09ICd1c2VyRW1haWwnICYmIHNvcnRCeSAhPT0gMSB8fCBzb3J0Q29sdW1uICE9PSAndXNlckVtYWlsJyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxLjMzMzM3VjEwLjY2NjdNNi4wMDAxNiAxMC42NjY3TDEwLjY2NjggNi4wMDAwNE02LjAwMDE2IDEwLjY2NjdMMS4zMzM1IDYuMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic29ydENvbHVtbiA9PT0gJ3VzZXJFbWFpbCcgJiYgc29ydEJ5ICE9PSAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEwLjY2NjdMNi4wMDAxNiAxLjMzMzM3TTYuMDAwMTYgMS4zMzMzN0wxLjMzMzUgNi4wMDAwNE02LjAwMDE2IDEuMzMzMzdMMTAuNjY2OCA2LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiYXNzaWduVHlwZSA9PT0ndGVhbSdcIiBjbGFzcz1cInRleHQtYWxpZ24tbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3RlYW1OYW1lJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW1zIE5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzb3J0Q29sdW1uID09PSAndGVhbU5hbWUnICYmIHNvcnRCeSAhPT0gMSB8fCBzb3J0Q29sdW1uICE9PSAndGVhbU5hbWUnIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjAwMDE2IDEuMzMzMzdWMTAuNjY2N002LjAwMDE2IDEwLjY2NjdMMTAuNjY2OCA2LjAwMDA0TTYuMDAwMTYgMTAuNjY2N0wxLjMzMzUgNi4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzb3J0Q29sdW1uID09PSAndGVhbU5hbWUnICYmIHNvcnRCeSAhPT0gLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi4wMDAxNiAxMC42NjY3TDYuMDAwMTYgMS4zMzMzN002LjAwMDE2IDEuMzMzMzdMMS4zMzM1IDYuMDAwMDRNNi4wMDAxNiAxLjMzMzM3TDEwLjY2NjggNi4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXRhIG9mIGFzc2lnblRhYmxlRGF0YTtsZXQgaT1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RhdGEudXNlck5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGF0YS51c2VyRW1haWwgPyBkYXRhLnVzZXJFbWFpbCA6ICctLSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiYXNzaWduVHlwZSA9PT0ndGVhbSdcIj57e2RhdGEudGVhbU5hbWUgPyBkYXRhLnRlYW1OYW1lIDogJy0tJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihhc3NpZ25UYWJsZUFwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGluZycgfHwgKGFzc2lnblRhYmxlQXBpU3RhdGUgfCBhc3luYykgPT09ICdpbml0aWFsJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGFzc2lnblRhYmxlQXBpU3RhdGUgfCBhc3luYykgPT09ICdsb2FkZWQnICYmICF0YWJsZUFycmF5Py5sZW5ndGggJiYgdGhpcy50YXNrRGV0YWlscz8uYXNzaWduICYmICFbJ2NsdXN0ZXInLCd0ZWFtJ10uaW5jbHVkZXMoYXNzaWduVHlwZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBhc3NpZ25wYWRkaW5nIG1iLTEwIG10LTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhyIHctMTAwIGJvcmRlciBib3JkZXItMSBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgdGVtcGxhdGUtZHJvcGRvd24gb3Jwb3NpdGlvbiBiZy13aGl0ZSB3LTEwMHB4XCI+b3I8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkcGFkZGluZyBtdC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJzdWJ0ZXh0IGxpc3QtdW5zdHlsZWQgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBteC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+VXNlIHRoZSB0ZW1wbGF0ZSB0byB1cGxvYWQgbXVsdGlwbGUgPHNwYW4gKm5nSWY9XCJzdG9yZUNvdmVyYWdlXCI+c3RvcmVzPC9zcGFuPiA8c3BhbiAqbmdJZj1cInVzZXJDb3ZlcmFnZVwiPnVzZXJzPC9zcGFuPiBhdCBvbmNlLjwvbGk+ICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4gRG93bmxvYWQgdGhlIHRlbXBsYXRlIGhlcmUgLSA8c3BhbiAoY2xpY2spPVwiZG93bmxvYWRUZW1wbGF0ZVYyKClcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+PHNwYW4gY2xhc3M9XCJtZS0zXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTUuODMzMzMgOC4zMzMzM0wxMCAxMi41TTEwIDEyLjVMMTQuMTY2NyA4LjMzMzMzTTEwIDEyLjVWMi41XCIgc3Ryb2tlPVwiIzAwOUJGM1wiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPjxzcGFuIGNsYXNzPVwidGV4dC1wcmltYXJ5XCI+RG93bmxvYWQgVGVtcGxhdGU8L3NwYW4+PC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+IEFkZCB5b3VyIGRhdGEgdG8gdGhlIFRlbXBsYXRlIEZpbGU8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBib3JkZXIgYm9yZGVyLTIgdGV4dC1jZW50ZXIgYm9yZGVyLWRhc2hlZCByb3VuZGVkLTMgYm9yZGVyLXByaW1hcnkgcC01XCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWxlLmNsaWNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQ2XCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQ2IDQ2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjNcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgZmlsbD1cIiNGMkY0RjdcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIzXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIHN0cm9rZT1cIiNGOUZBRkJcIiBzdHJva2Utd2lkdGg9XCI2XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF83OTc5XzUyMDIpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI2LjMzMzUgMjYuMzMzMkwyMy4wMDAyIDIyLjk5OTlNMjMuMDAwMiAyMi45OTk5TDE5LjY2NjkgMjYuMzMzMk0yMy4wMDAyIDIyLjk5OTlWMzAuNDk5OU0yOS45OTE5IDI4LjMyNDlDMzAuODA0NyAyNy44ODE4IDMxLjQ0NjcgMjcuMTgwNiAzMS44MTY4IDI2LjMzMjFDMzIuMTg2OCAyNS40ODM1IDMyLjI2MzcgMjQuNTM1OSAzMi4wMzU0IDIzLjYzODhDMzEuODA3IDIyLjc0MTcgMzEuMjg2NSAyMS45NDYyIDMwLjU1NTggMjEuMzc3OEMyOS44MjUxIDIwLjgwOTQgMjguOTI1OSAyMC41MDA1IDI4LjAwMDIgMjAuNDk5OUgyNi45NTAyQzI2LjY5OCAxOS41MjQzIDI2LjIyNzggMTguNjE4NSAyNS41NzUyIDE3Ljg1MDdDMjQuOTIyNSAxNy4wODI5IDI0LjEwNDIgMTYuNDczMSAyMy4xODIgMTYuMDY3MUMyMi4yNTk3IDE1LjY2MSAyMS4yNTczIDE1LjQ2OTQgMjAuMjUwMyAxNS41MDY1QzE5LjI0MzMgMTUuNTQzNiAxOC4yNTc4IDE1LjgwODUgMTcuMzY3OSAxNi4yODEzQzE2LjQ3NzkgMTYuNzU0MSAxNS43MDY4IDE3LjQyMjUgMTUuMTEyNCAxOC4yMzYyQzE0LjUxOCAxOS4wNSAxNC4xMTU4IDE5Ljk4NzkgMTMuOTM2IDIwLjk3OTRDMTMuNzU2MyAyMS45NzA5IDEzLjgwMzYgMjIuOTkwMyAxNC4wNzQ2IDIzLjk2MUMxNC4zNDU1IDI0LjkzMTYgMTQuODMyOSAyNS44MjgxIDE1LjUwMDIgMjYuNTgzMlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF83OTc5XzUyMDJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMyAxMylcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmV0ZXh0IGN1cnNvci1wb2ludGVyIGZ3LWJvbGRcIj48c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeSB0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lXCI+Q2xpY2sgVG8gVXBsb2FkPC9zcGFuPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkcmFnIGFuZCBkcm9wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJhbGlnbiBmdy00MDBcIj50aGUgZGF0YSBhZGRlZCB0ZW1wbGF0ZSBmaWxlIGZvciBwcm9jZXNzaW5nLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiIHR5cGU9XCJmaWxlXCIgI2ZpbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwia3RfYWNjb3VudF90ZWFtX3NpemVfc2VsZWN0XzFcIiAoY2hhbmdlKT1cIm9uRmlsZVVwbG9hZCgkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyXCIgKm5nSWY9XCIoYXNzaWduVGFibGVBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRlZCcgJiYgIXRhYmxlQXJyYXk/Lmxlbmd0aCAmJiB0aGlzLnRhc2tEZXRhaWxzPy5hc3NpZ24gJiYgWydjbHVzdGVyJywndGVhbSddLmluY2x1ZGVzKGFzc2lnblR5cGUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgbXktOCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXN1YlwiPlRoZXJlIGlzIG5vIHJlc3VsdCBmb3IgdGhlIHt7YXNzaWduVHlwZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2J1bGt1cGxvYWQgbGV0LW1vZGVsPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgbXQtNVwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGUgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLWxpZ2h0LXByaW1hcnkgcm91bmRlZC01IHctNDBweCBoLTQwcHggZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gPHNwYW4gY2xhc3M9XCJjb25maWctaGVhZGluZyBmdy1zZW1pYm9sZCBtcy01IHctYXV0b1wiPkJ1bGsgVXBsb2FkPC9zcGFuPlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwdC0wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlQXNzaWduIG10LTNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDBcIj5TdGVwIDEgLSA8YSBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi11bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZG93bmxvYWRUZW1wbGF0ZVYyKClcIj5Eb3dubG9hZCB0aGUgdGVtcGxhdGUgaGVyZTwvYT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZUFzc2lnbiBtdC0zXCIgc3R5bGU9XCJmb250LXdlaWdodDogNDAwXCI+U3RlcDIgLSBBZGQgeW91ciBkYXRhIHRvIHRoZSBUZW1wbGF0ZSBGaWxlIHdpdGggZXhpc3RpbmcgPHNwYW4gKm5nSWY9XCJzdG9yZUNvdmVyYWdlXCI+c3RvcmU8L3NwYW4+IDxzcGFuICpuZ0lmPVwidXNlckNvdmVyYWdlXCI+dXNlcjwvc3Bhbj4gZGF0YTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlQXNzaWduIG10LTNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDBcIj5TdGVwMyAtIFVwbG9hZCBpdCBiZWxvdyBmb3IgcHJvY2Vzc2luZzwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1ib2xkIHN0b3JlQXNzaWduIG10LTEwXCI+KipOb3RlIDogT24gdXBsb2FkLCBhbGwgdGhlIGV4aXN0aW5nIGRhdGEgd2lsbCBiZSByZXBsYWNlZDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTAgdGV4dC1lbmQgcHQtMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBidG4tZGVmYXVsdCBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RlbC5jbG9zZSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW1kIHB5LTMgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJmaWxlMS5jbGljaygpXCI+VXBsb2FkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIiAjZmlsZTEgdHlwZT1cImZpbGVcIiBpZD1cImt0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF8yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVVwbG9hZCgkZXZlbnQpXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNhZnRlclZhbGlkYXRpb24gbGV0LW1vZGVsPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgbXQtMFwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGUgbXQtM1wiPjxzcGFuIGNsYXNzPVwiY29uZmlnLWhlYWRpbmcgZnctc2VtaWJvbGQgdy1hdXRvXCI+QXNzaWduIDxzcGFuICpuZklmPVwic3RvcmVDb3ZlcmFnZVwiPlN0b3Jlczwvc3Bhbj4gPHNwYW4gKm5nSWY9XCJ1c2VyQ292ZXJhZ2VcIj5Vc2Vyczwvc3Bhbj48L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwdC0wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTgwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPlRvdGFsIDxzcGFuICpuZklmPVwic3RvcmVDb3ZlcmFnZVwiPlN0b3Jlczwvc3Bhbj4gPHNwYW4gKm5nSWY9XCJ1c2VyQ292ZXJhZ2VcIj5Vc2Vyczwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY2FyZCByb3VuZGVkLTMgcC0zIGZsZXgtY29sdW1uIGgtODBweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmcgdy0xMDBcIj57e2V4Y2VsRGF0YT8ubGVuZ3RofX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIHN1YnRpdGxlIG10LTFcIj5Sb3dzIHByb2Nlc3NlZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTgwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJleGNlbEVycm9yID8gJ2Vycm9yLWhlYWRpbmcnOicnXCIgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7ZXhjZWxFcnJvcj8uZXJyb3I/Lmxlbmd0aCB8fCAwfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJleGNlbEVycm9yID8gJ2V4Y2VsLWVycm9yJzonJ1wiIGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPkVycm9yPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWV4Y2VsRXJyb3JcIiBjbGFzcz1cInRhYmxlLWhlYWRlciBtdC01XCIgc3R5bGU9XCJmb250LXdlaWdodDogNDAwO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzaG93U3RvcmUmJiFzaG93VGVhbSYmIXNob3dDbHVzdGVyJiYhc2hvd1VzZXImJiFzaG93SW5hY3RpdmVcIj5Zb3UncmUgYWJvdXQgdG8gYXNzaWduIHt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKX19IDxzcGFuICpuZ0lmPVwic3RvcmVDb3ZlcmFnZVwiPnN0b3Jlczwvc3Bhbj48c3BhbiAqbmdJZj1cInVzZXJDb3ZlcmFnZVwiPnVzZXJzPC9zcGFuPiB0byB0aGUgY2hlY2tsaXN0LiBBcmUgeW91IHN1cmUgd2FudCB0byBwcm9jZWVkPzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b3JlQ292ZXJhZ2UgJiYgc2hvd1N0b3JlXCIgY2xhc3M9XCJtdC0zXCI+U3RvcmUgPHNwYW4gKm5nRm9yPVwibGV0IHN0b3JlIG9mIHZhbGlkYXRlZFN0b3JlO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXNu4oCZdCAgYXZhaWxhYmxlLCA8YSAgcm91dGVyTGluaz1cIi9tYW5hZ2Uvc3RvcmVzXCIgW3F1ZXJ5UGFyYW1zXT1cInt0eW9lOiAnc3RvcmVzJ31cIiBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi11bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiY2xvc2VhY3RpdmVwb3B1cCgpXCI+T25ib2FyZCBTdG9yZXM8L2E+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckNvdmVyYWdlICYmIHNob3dVc2VyXCIgY2xhc3M9XCJtdC0zXCI+VXNlciA8c3BhbiAqbmdGb3I9XCJsZXQgc3RvcmUgb2YgdmFsaWRhdGVkVXNlcjtsZXQgbGFzdCA9IGxhc3RcIiBjbGFzcz1cImZ3LXNlbWlib2xkIGNvbmZpZy1oZWFkaW5nXCI+e3tzdG9yZX19PHNwYW4gKm5nSWY9XCIhbGFzdFwiPiw8L3NwYW4+PC9zcGFuPiB0aGF0IEnigJltIGxvb2tpbmcgZm9yIGlzbuKAmXQgIGF2YWlsYWJsZSwgPGEgIGNsYXNzPVwidGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJjbG9zZWFjdGl2ZXBvcHVwKCk7Y29uZmlybVVzZXJwb3B1cCgpXCI+T25ib2FyZCBVc2VyczwvYT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VyQ292ZXJhZ2UgJiYgc2hvd1RlYW1cIiBjbGFzcz1cIm10LTNcIj5UZWFtIDxzcGFuICpuZ0Zvcj1cImxldCBzdG9yZSBvZiB2YWxpZGF0ZWRUZWFtO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXNu4oCZdCAgYXZhaWxhYmxlLCA8YSAgcm91dGVyTGluaz1cIi9tYW5hZ2UvdXNlcnMvY2xpZW50XCIgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNsb3NlYWN0aXZlcG9wdXAoKVwiPkNyZWF0ZSBUZWFtPC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b3JlQ292ZXJhZ2UgJiYgc2hvd0NsdXN0ZXJcIiBjbGFzcz1cIm10LTNcIj51c2VyIDxzcGFuICpuZ0Zvcj1cImxldCBzdG9yZSBvZiB2YWxpZGF0ZWRDbHVzdGVyO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXNu4oCZdCAgYXZhaWxhYmxlLCA8YSAgcm91dGVyTGluaz1cIi9tYW5hZ2Uvc3RvcmVzXCIgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyXCIgW3F1ZXJ5UGFyYW1zXT1cInt0eW9lOiAnY2x1c3Rlcid9XCIgKGNsaWNrKT1cImNsb3NlYWN0aXZlcG9wdXAoKVwiPkNyZWF0ZSBDbHVzdGVyPC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b3JlQ292ZXJhZ2UgJiYgc2hvd1VzZXJcIiBjbGFzcz1cIm10LTNcIj5Vc2VyIDxzcGFuICpuZ0Zvcj1cImxldCBzdG9yZSBvZiB2YWxpZGF0ZWRVc2VyO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXNu4oCZdCAgYXZhaWxhYmxlLCA8YSAgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNsb3NlYWN0aXZlcG9wdXAoKTtjb25maXJtVXNlcnBvcHVwKClcIj5PbmJvYXJkIFVzZXJzPC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b3JlQ292ZXJhZ2UgJiYgc2hvd0luYWN0aXZlXCIgY2xhc3M9XCJtdC0zXCI+U3RvcmUgPHNwYW4gKm5nRm9yPVwibGV0IHN0b3JlIG9mIGluYWN0aXZlU3RvcmVzO2xldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmdcIj57e3N0b3JlfX08c3BhbiAqbmdJZj1cIiFsYXN0XCI+LDwvc3Bhbj48L3NwYW4+IHRoYXQgSeKAmW0gbG9va2luZyBmb3IgaXMgaW5hY3RpdmUsIDxhICByb3V0ZXJMaW5rPVwiL21hbmFnZS9zdG9yZXNcIiBbcXVlcnlQYXJhbXNdPVwie3R5b2U6ICdzdG9yZXMnfVwiIGNsYXNzPVwidGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJjbG9zZWFjdGl2ZXBvcHVwKClcIj5PbmJvYXJkIFN0b3JlczwvYT48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJleGNlbEVycm9yXCIgY2xhc3M9XCJmbGV4LWNvbHVtbiBtdC01XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWhlYWRpbmcgZnctYm9sZFwiPkludmFsaWQgRGV0YWlscyAhPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGl0bGUgbXQtNVwiPlBsZWFzZSBwcm92aWRlIGNvcnJlY3QgYW5kIGNvbXBsZXRlIGxheW91dCBpbmZvcm1hdGlvbi48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTUgdy0xMDAgcm91bmRlZC0zIGJvcmRlci1lcnJvciBtdC01IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgZXhjZWxFcnJvcj8uZXJyb3I7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiIFtuZ0NsYXNzXT1cIiFsYXN0ID8gJ21iLTInIDogJydcIiBjbGFzcz1cInRleHQtZXJyb3JcIj57e2kgKyAxfX0pIHt7ZXJyb3J9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTAgdGV4dC1lbmQgcHQtMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBidG4tZGVmYXVsdCBidG4tb3V0bGluZVwiIChjbGljayk9XCJjbG9zZWFjdGl2ZXBvcHVwKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFleGNlbEVycm9yJiYhc2hvd1N0b3JlJiYhc2hvd0NsdXN0ZXImJiFzaG93VXNlciYmIXNob3dUZWFtJiYhc2hvd0luYWN0aXZlXCIgY2xhc3M9XCJidG4gYnRuLW1kIHB5LTQgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJ2YWxpZGF0ZURldGFpbHMoKVwiPlByb2NlZWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImV4Y2VsRXJyb3J8fHNob3dTdG9yZXx8c2hvd0NsdXN0ZXJ8fHNob3dVc2VyfHxzaG93VGVhbSB8fCBzaG93SW5hY3RpdmVcIiBjbGFzcz1cImJ0biBweS0zIGJ0bi1tZCBidG4tZGVmYXVsdCBtcy0zIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwiUmV1cGxvYWQoKTtcIj5SZXVwbG9hZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCIgI2ZpbGUxIHR5cGU9XCJmaWxlXCIgaWQ9XCJrdF9hY2NvdW50X3RlYW1fc2l6ZV9zZWxlY3RfMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVVcGxvYWQoJGV2ZW50LCdyZXVwbG9hZCcpXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNjb25maXJtVXNlciBsZXQtbW9kZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBtdC01XCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBkLWZsZXggZmxleC1jb2x1bW4gbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLWxpZ2h0LXByaW1hcnkgcm91bmRlZC01IHctNDBweCBoLTQwcHggZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiLz48cGF0aCBkPVwiTTI3Ljk5OTggMjQuMDAxMlYyOC4wMDEyTTI3Ljk5OTggMzIuMDAxMkgyOC4wMDk4TTI2LjI4OTggMTguODYxMkwxNy44MTk4IDMzLjAwMTJDMTcuNjQ1MSAzMy4zMDM2IDE3LjU1MjcgMzMuNjQ2NSAxNy41NTE4IDMzLjk5NTdDMTcuNTUwOCAzNC4zNDQ5IDE3LjY0MTMgMzQuNjg4MyAxNy44MTQyIDM0Ljk5MTdDMTcuOTg3MSAzNS4yOTUxIDE4LjIzNjUgMzUuNTQ3OSAxOC41Mzc1IDM1LjcyNUMxOC44Mzg1IDM1LjkwMjEgMTkuMTgwNiAzNS45OTczIDE5LjUyOTggMzYuMDAxMkgzNi40Njk4QzM2LjgxOSAzNS45OTczIDM3LjE2MTEgMzUuOTAyMSAzNy40NjIxIDM1LjcyNUMzNy43NjMxIDM1LjU0NzkgMzguMDEyNCAzNS4yOTUxIDM4LjE4NTQgMzQuOTkxN0MzOC4zNTgzIDM0LjY4ODMgMzguNDQ4OCAzNC4zNDQ5IDM4LjQ0NzggMzMuOTk1N0MzOC40NDY4IDMzLjY0NjUgMzguMzU0NCAzMy4zMDM2IDM4LjE3OTggMzMuMDAxMkwyOS43MDk4IDE4Ljg2MTJDMjkuNTMxNSAxOC41NjczIDI5LjI4MDUgMTguMzI0MyAyOC45ODEgMTguMTU1N0MyOC42ODE0IDE3Ljk4NyAyOC4zNDM1IDE3Ljg5ODQgMjcuOTk5OCAxNy44OTg0QzI3LjY1NiAxNy44OTg0IDI3LjMxODEgMTcuOTg3IDI3LjAxODYgMTguMTU1N0MyNi43MTkxIDE4LjMyNDMgMjYuNDY4IDE4LjU2NzMgMjYuMjg5OCAxOC44NjEyWlwiIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj48YnI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWhlYWRpbmcgZnctc2VtaWJvbGQgdy1hdXRvXCI+TmV3IFVzZXIgZm91bmQgaW4gdXBsb2FkZWQgZmlsZTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB0LTBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmVBc3NpZ24gbXQtM1wiIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDQwMFwiPlRoaXMgQ1NWIGNvbnRhaW5zIGEgbmV3IFVzZXIuIEFkZCBuZXcgVXNlciBpbiB0aGUgVXNlciBNYW5hZ2VtZW50IHVuZGVyIE1hbmFnZSBtZW51LjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTAgdGV4dC1lbmQgcHQtMFwiPlxyXG4gICAgICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW1kIGJ0bi1kZWZhdWx0IGJ0bi1vdXRsaW5lXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdXNlcnMvY2xpZW50XCIgKGNsaWNrKT1cImNsb3NlYWN0aXZlcG9wdXAoKVwiPlNraXAgTmV3IEVudHJpZXM8L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW1kIHB5LTQgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJtb2RlbC5jbG9zZSgnY29uZmlybScpXCI+SW52aXRlIFNlbGVjdGVkPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|